IP分片与重组的分析与整理.doc

原理 1.1 为一个数据包片再次分片 为数据包分片和位数据包片再次分片之间的细微差别就在于网关处理MF比特的不同。但一个网关为原来为分片的数据包分片时,除了末尾的数据包片,它 将其余所有分片上的MF比特都置为一,最后一片为0。然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子分片中的MF比特全部设置为1, 因为所有这些子分片都不可能是整个数据包的末尾的数据包片。 对于分片,需要拷贝IP首部和选项,以及数据。而选项的拷贝要注意:根据协议标准,某些选项只应当出现在的一个数据包片中,而其他一些则必须出现在所有的数据包中。 1.2 数据包重组 1.2.1 数据结构 为了使数据包的重组效率更高,用于保存数据包的数据结构必须能够做到: l 为构成某一个特定数据包的一组数据包片快速定位; l 在一组数据包片中快速插入新的数据包片; l 有效地判断一个完整的数据包是否已经全部抵达; l 具有数据包片超时机制,并且,如果在重组完成之前定时器溢出,则删除数据包片。 1.2.2 互斥操作 重组程序代码使用了一个互斥信号量。 1.2.3 在链表中加入一个数据包片 线性查找??? ### IP分片与重组的分析与整理 #### 1. 原理 ##### 1.1 为一个数据包片再次分片 在互联网通信过程中,数据包可能需要通过不同最大传输单元(MTU)的网络进行传输。当一个数据包过大无法直接通过某个网络时,就需要对其进行分片处理,以便于在网络间顺利传输。这里涉及到两种情况:一是对原始数据包进行分片,二是对已分片的数据包进一步分片。 - **原始数据包分片**:当一个数据包首次经过网关时,如果它超过了该网关支持的最大传输单元(MTU),则会被分成多个较小的数据包片。此时,除了最后一个数据包片外,其它所有分片的“更多分片”(MF,More Fragment)标志都会被设置为1,表示还有后续分片。最后一个分片的MF标志则设为0。 - **对已分片的数据包再次分片**:如果某个非末尾的数据包片(即MF标志为1的分片)到达了一个MTU更小的网络,那么这个数据包片将被再次分片。新生成的所有子分片的MF标志都会被设置为1,因为它们都不是原始数据包的最终分片。 在分片过程中还需要注意的是,需要复制每个数据包片的IP头部和数据部分。对于IP头部中的选项字段,根据协议标准,有些选项应该仅出现在一个数据包片中,而有些选项则必须出现在所有数据包片中。 ##### 1.2 数据包重组 当接收端收到多个分片后,需要将其重组为原始数据包。为此,接收端需要高效地管理数据包片,这涉及到数据结构的设计、互斥操作的实现以及数据包片的链表管理等方面。 ###### 1.2.1 数据结构 为了提高数据包重组的效率,数据结构设计需满足以下需求: - 快速定位构成特定数据包的所有数据包片; - 在数据包片集合中快速插入新接收到的数据包片; - 准确判断是否已接收到完整的数据包; - 实现数据包片超时机制,若重组过程中定时器溢出,则删除相应的数据包片。 为了达到上述目标,通常会采用一种能够支持快速查找、插入和删除操作的数据结构,例如哈希表或树状结构等。 ###### 1.2.2 互斥操作 由于多个进程或线程可能同时尝试修改数据包重组相关的数据结构,因此需要使用互斥信号量(mutex)或其他同步机制来确保数据一致性。互斥信号量可以避免并发访问时的数据竞争问题。 ###### 1.2.3 在链表中加入一个数据包片 在将新接收到的数据包片加入到重组链表时,需要确定合适的位置并执行插入操作。这里提到的“线性查找”可能是指一种简单但效率较低的方法,即从头遍历链表直到找到正确位置。在实际应用中,考虑到性能需求,可能会使用更高效的查找算法或数据结构。 #### 2. Linux下的实现 Linux操作系统在内核层面对IP分片与重组进行了详细的支持和优化。下面详细介绍其主要实现方式。 ##### 2.1 IP分片 在Linux内核中,IP分片主要通过`ip_fragment`函数实现。此函数会将过大的数据包拆分成符合MTU限制的小片段。 ###### 2.1.1 ip_fragment(非UDP使用) `ip_fragment`函数主要用于非UDP协议的数据包分片。它接受两个参数:一个是待分片的`sk_buff`结构体指针,另一个是输出函数指针,用于发送分片后的数据包。 典型的调用场景包括: - 从转发来的数据包:调用`ip_sendàip_fragment(skb,ip_finish_output)`。 - 从TCP来的数据包:调用`ip_queue_xmit2àip_fragment(skb,skb->dst->output)`。 该函数的核心逻辑在于根据MTU限制将原始数据包拆分成多个较小的数据包片,并对每个分片设置适当的MF标志。 ##### 2.2 IP重组 Linux内核中的IP重组主要由`ip_defrag`函数负责。该函数用于接收端的数据包重组过程,它依赖于一系列关键数据结构。 ###### 2.2.1.2 关键数据结构(2.4系列) - **ipfrag (不再使用)**:早期版本中使用的数据结构,现已不再使用。 - **ipq**:用于管理待重组的数据包队列。 - **FRAG_CB**:与分片数据包相关的控制块。 - **ipfrag_skb_cb**:扩展的`sk_buff`控制块,用于存储分片相关信息。 - **inet_skb_parm**:与`sk_buff`相关的参数结构体。 这些数据结构共同支持了数据包的高效重组,通过维护分片状态、管理数据包片链表等方式实现了IP分片的完整重组。 ##### 2.2.1.3 函数说明 `ip_defrag`函数及其相关函数提供了完整的数据包重组流程,其中包括: - **ip_evictor**:用于管理数据包片的超时机制,当数据包片超过指定时间未被重组时,将触发超时处理逻辑。 - **ip_find**:用于快速查找特定标识符的数据包片。 - **ip_frag_create**:创建新的数据包分片。 - **ip_frag_intern**:内部函数,用于处理分片数据包。 - **ip_frag_queue(hash,iph)**:将数据包分片添加到对应的队列中。 - **ip_frag_reasm**:实现数据包重组的主要函数。 通过以上介绍可以看出,Linux内核对IP分片与重组功能的支持非常全面且细致,涉及了从分片到重组的整个过程。这些机制确保了即使在网络环境中数据包需要跨越不同MTU的网络时,也能够实现数据包的无损传输。
































- spitefire_19992013-07-05整理得很零碎,看起来很吃力。
- meics1232014-04-08谢谢,方便移植就好了
- 天空之境7192013-05-06很好 很详细
- liu10476515602014-10-23总的说还行
- 侯奇2013-05-25谢谢,计算机网络作业用到了,各种找资料

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 地铁车站大跨度深基坑支护技术的研究与应用.doc
- 通信设备工程验收规范.doc
- 内审检查表(QR-8.2-05).docx
- 海岛度假村岩土工程勘察.doc
- 造价员入门--桩与地基基础工程.ppt
- 基于JSP在线音乐网的方案设计书与实现大学本科方案设计书.doc
- 5G时代背景下教师网络研修的创新探究.docx
- 数据库系统概论期末试题及复习资料重点知识.doc
- 第4章ANSYS边坡工程应用实例分析.doc
- OAuth2学习DotNetOpenAuth部分源码研究分析.doc
- 《建筑工程计价》模拟试卷答案-杭州.doc
- 如何使用PHOTOSHOP处理图片让宝贝图片更清晰.doc
- 某广场钢筋工技术交底.doc
- 电子工程自动化控制智能技术研究.docx
- VB超市管理系统毕业设计论文.doc
- 5幕墙技术保证措施.doc


