IP分片与重组机制详解

4星 · 超过85%的资源 需积分: 50 93 下载量 23 浏览量 更新于2024-07-28 1 收藏 99KB DOC 举报
"IP分片与重组的分析与整理" 本文档主要探讨了IP分片与重组的概念、原理以及在Linux系统下的实现细节。IP分片是由于网络中路径最大传输单元(MTU)限制,导致大尺寸的IP数据包需要被分割成多个小片段以便通过不同的网络节点进行传输。重组则是接收端将这些分片重新组合成原始数据包的过程。 **1. IP分片原理** 1.1 **再次分片** 在数据包经过网关时,可能会发生再次分片。对于原已分片的数据包,网关会将所有非末片的分片的MF(More Fragments)标志设为1,最后一个分片的MF设为0。而对非末片的分片进行再次分片时,所有新产生的子分片的MF标志都会设为1,因为它们都不是完整数据包的最后部分。 1.2 **IP分片中的选项处理** 在分片过程中,需要复制IP头部、选项及数据。部分选项应仅存在于第一个分片中,而其他选项必须存在于所有分片中,这需要按照协议标准来执行。 **2. 数据包重组** 1.2.1 **数据结构设计** 重组高效的关键在于设计能够快速定位分片、插入新分片、判断数据包完整性以及处理超时的数据结构。这通常涉及链表或哈希表等数据结构,以支持快速查找和操作。 1.2.2 **互斥操作** 为了保证数据包重组过程的正确性和一致性,重组程序使用互斥信号量来防止并发访问冲突。 1.2.3 **链表插入** 在链表中添加数据包片可能涉及到线性查找,这可能导致效率较低,因此可能需要优化的插入算法,如二分查找或哈希映射,以提高性能。 1.2.4 **溢出时的丢弃** 当重组超时,数据包片未完全到达时,系统需要有机制来清除这些未完成的分片,防止资源浪费。 **3. Linux下的实现** 2.1 **IP分片** 在Linux中,IP分片由`ip_fragment`函数实现,对于非UDP流量。对于UDP,分片处理方式可能不同,文档中提到后续会继续介绍。 2.2 **IP重组** IP重组主要由`ip_defrag`函数执行,该函数处理从网络接收到的IP分片并尝试重组它们。其关键数据结构包括`ipfrag`(已不再使用)、`ipq`、`FRAG_CB`、`ipfrag_skb_cb`和`inet_skb_parm`,以及相关的处理函数如`ip_evictor`、`ip_find`、`ip_frag_create`、`ip_frag_intern`、`ip_frag_queue`和`ip_frag_reasm`。 在Linux中,IP重组过程涉及到复杂的内存管理和时间管理,以确保正确、高效地重组数据包,并防止内存泄漏和资源耗尽。重组过程还包括检查是否所有的分片都已经到达,以便构建完整的IP数据包,并在必要时清理未完成的分片链表。