网络工程技能训练报告
哈 尔 滨 理 工 大 学
技 能 训 练 报 告
题
院
班
姓
成
目:
IP 分片重组技术
系: 计算机科学与技术学院 网络工程系
网络 14-4
陈明园 1404020405
级:
名:
绩:
2017 年 12 月
第 1 页 共 22 页
网络工程技能训练报告
目录
IP 分片重组技术........................................................................................................... 1
一、实训目的................................................................................................................ 1
二、实训任务................................................................................................................ 1
三、实训内容................................................................................................................ 1
3.1 IP 分片重组简要概述.................................................................................... 1
3.2 原理.................................................................................................................. 2
3.2.1 为一个数据包片再分片...................................................................... 2
3.2.2 数据包重组.......................................................................................... 3
3.2.3 IP 分片的方式..................................................................................... 3
3.2.4 重组原理.............................................................................................. 4
3.2.5 怎样校验分片到达包.......................................................................... 4
3.3 IP 分组的设计与实现.................................................................................... 4
3.4 Linux 的实现.................................................................................................. 6
3.4.1 IP 分片................................................................................................. 6
3.4.2 IP 重组............................................................................................... 10
四、 结论.................................................................................................................... 20
第 2 页 共 22 页
网络工程技能训练报告
IP 分片重组技术
一、实训目的
互联网协议使网络互相通信。设计要迎合不同物理性质的网络; 它是
立于链路层使用的基础传输技术。具有不同硬件的网络通常会发生变化,
不仅在传输速度,而且在最大传输单元(MTU)。当一个网络要的数据报
发送到具有较小 MTU 的一个网络,它可能片段的数据报。在 IPv4 中,这
个功能被放置在因特网层,并且在 IPv4 路由器,这因此只需要这个层作
为最高的一个在其设计中实现的处理。IP 分片重组是一门很重要的技术,
在互联网上使用很多,掌握这门技术对于我们来说是很有必要的,通过这
次实训,我相信我将对 IP 分片重组技术的概念、原理及方法都有全新的
认识和了解,并且对自己所学的知识进行巩固与实践。
二、实训任务
了解 IP 分片重组的原理及在 Linux 环境下实现 IP 分片与重组。
三、实训内容
3.1 IP 分片重组简要概述
每一种包交换网络技术对在一个物理帧所能传输的数据量都有一个
上 限 , 一 般 称 这 个 上 限 为 这 种 物 理 网 络 的 最 大 传 输 单 元 , 即
MTU(maximumtransferunit)。不同的物理网络有不同的〗最大传输单元。
互联网上的 IP 数据报要通过许多具有不同 MTU 的物理网络。因此,在从一
个具有较大 MTU 的网络转发到一个具有较小 MTU 的网络时,路由器需要把
大的 IP 数据报分割成小的 IP 数据报分片,以便能装载到具有较小 MTU 的
网络物理帧中,此过程称为 IP 数据报的分片。目的主机不断累积到达的数
据报分片,在所有的数据报分片到达后,将它们重新组合生成完整的数据
报,此过程称为 IP 数据报的分片重组。 IP 分片重组是 TCP/IP 协议栈中
IP 层需要实现的不可缺少的功能之一。IP 数据报中与 IP 分片相关的字段
如下(参照 TCP/IP 协议中 IP 数据报格式):
(1)16 位报文标识:数据报的唯一标识。同一数据报的不同分段中都
设置相同的报文标识。
(2)16 位报文总长度:对于每一个数据报的分片,都要重新计算其报
文长度。
(3)13 位分片偏移量:每一个分片都要设置该 字段值,用来指明其在
第 3 页 共 22 页
网络工程技能训练报告
原始数据报中的位置,用 8 个字节的倍数来表示。
(4)1 位分片标志:如果没有分片,则该标志设定为 0;如果数据报进行
了分片,则除了最后一个分片将该字段设置为 0 外,其余各分片都应该设
为 1。每个数据报分片在网络中进行独立传输,因此,在经过中间路由节点
时,可能会选择不同的路由抵达目的主机,这样,抵达目的主机的各个 IP
数据报分片的顺序与其发送顺序极有可能不同。所以,目的主机的 IP 协议
必须根据数据报中的相关字段(标识、长度、偏移量等)将这些分片数据重
组为原始的数据报,然后提交到上层协议。在重组过程中,各个数据报分片
必须具有相同的标识、相同的用户协议值以及相同的源和目的 IP 地址,
并且在一定时间内必须全部到齐。IP 协议将满足上述条件的数据报分段
按照偏移量顺序排队,且只保留第一个分片的报头,删除其他的分片报头,
组装成一个完整的原始 IP 数据报,并重新计算报文长度,填入相应的报文
字段中。最后,按照组装完毕的报文中的用户协议值提交给上层协议。
3.2 原理
3.2.1 为一个数据包片再分片
为数据包分片和位数据包片再次分片之间的细微差别就在于网关处
理 MF 比特的不同。但一个网关为原来为分片的数据包分片时,除了末尾
的 数据包片,它 将其余所有分片上的 MF 比特都置为一,最后一片为 0。
然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子
分片中的 MF 比特全部设置为 1, 因为所有这些子分片都不可能是整个数
据包的末尾的数据包片。
对于分片,需要拷贝 IP 首部和选项,以及数据。而选项的拷贝要注
意:根据协议标准,某些选项只应当出现在的一个数据包片中,而其他一
些则必须出现在所有的数据包中。
数据包重组数据结构为了使数据包的重组效率更高,用于保存数据
包的数据结构必须能够做到:为构成某一个特定数据包的一组数据包片快
速定位;在一组数据包片中快速插入新的数据包片;
有效地判断一个完整的数据包是否已经全部抵达,具有数据包片
超时机制(ip_expire),并且,如果在重组完成之前定时器溢出,则删
除数据包片。
3.2.2 数据包重组
为了使数据包的重组效率更高,用于保存数据包的数据结构必须能够
做到:
1.构成某一个特定数据包的一组数据包片快速定位;
2.在一组数据包片中快速插入新的数据包片;
3.有效地判断一个完整的数据包是否已经全部抵达;
4.具有数据包片超时机制,并且,如果在重组完成之前定时器溢出,则
删除数据包片。
3.2.3 IP 分片的方式
标识(identification):占 16 位,它是一个计数器,用来产生数据
第 4 页 共 22 页
网络工程技能训练报告
报的标识,一个 IP 地址在每发送一个 IP 报文时标志位是上一个报文标志位
加一,来自同一个 IP 报文的分片具有相同的 ID
标志(flag): 占 3 位,目前只有前两位有意义。标志字段的最低位是
MF (More Fragment)。MF1 表示后面“还有分片”,MF0 表示最后一个分片,
标志字段中间的一位是 DF (Don't Fragment),只有当 DF0 时才允许分片。
片偏移(12 位)指出:较长的分组在分片后某片在原分组中的相对位置。
片偏移以 8 个字节为偏移单位。
如图 1 对于长度超过 1500 字节的 IP 报文。IP 层会将其分片即分成若
干个长度不超过 1500 的 IP 报文(分片)传送。从源报文的 UDP 头部开始将
源报文数据段按 1480 字节为单位依次分片直到最后凑不够 1480 字节时为最
后一片。每一分片的段偏移为该片第一个八个字节在源 IP 报文数据段中以
八字节为单位的偏移。这些分片中只有第一个分片具有原报文的 UDP 头部其
余报文的 IP 数据字段为原报文的用户数据。所有分片 IP 头部与源 IP 报文
一样。
图 1.MTU 为 1420
3.2.4 重组原理
重组算法很多除了协议栈外也有其他改进算法。所有算法的核心问题是可
靠重组及消耗内存尽可能小。基于对协议的理解,我们提出了自己的重组算法。
如果一个包的段偏移为 0 而 frag 字
1 怎样确定一个包是否为一个分片?
段不为 1 则该报文必定不是一个分片。 2 对于接收到无序分片怎样确定哪些
来自同一个包的分片具有相同的源 ip 及 id 号。3 接
分片来自同一个包?
收端怎样确定来自同一包的所有分片都已到达?
当收到标志位为 0 的分
片时,说明这是最后一个分片。根据最后一个分片的段偏移可知在源报文中最
后一分片以前含有的数据长度,再加上最后一分片的数据长度即为原 IP 报文
数据部分长度。如果接收到的所有分片的数据长度等于源 IP 报文数据部分长
度这说明所有分片均已到达,此时即可按段偏移量重新组包。
第 5 页 共 22 页
3.2.5 怎样校验分片到达包
网络工程技能训练报告
除第一个分片外其余分片无 UDP 头部,因而对每个分片校验不方便,可
以再重组所有分片后构建 UDP 伪头部校验。
3.3 IP 分组的设计与实现
为了能够高效率的完成 IP 分片重组,用于保存数据报分片的数据结构必
须能做到:为构成某个特定数据报的一组数据报分片快速定位;在一组数据
报分片中快速插入新的数据报分片;有效地判断一个完整的的数据报是否已
全部到达;具有数据报分片超时机制,并且,如果在重组完成之前定时器溢出,
则删除数据报片。采用一种叫做伸展树的数据结构来满足高效 IP 分片重组
对数据结构的要求。伸展树(SplayTree)是由 1999 年图灵奖得主普林斯顿大
学计算机系教授罗伯特・塔扬发明的,是一种二叉排序树,但比其他任何平衡
树更简单,空间管理更有效,更加快速,更加灵活。伸展树能在 O(logn)内完成
插入、查找和删除操作,这是一个非常重要的性能保证,保证了 IP 分片重组
的高效性。由于需要进行 IP 分片重组的网络数据中可能有多个被分片的 IP
包,而每一个 IP 包又有多个分片,因此使用两级伸展树存储所有分片,第一
级伸展树存储的是 IP 包的信息,称为“IP 包伸展树”,其节点称为“IP 包节
点”;第二级伸展树存储的是 IP 分片的信息,称为“frag 伸展树”,其节点称
为“frag 节点”;如图 2 所示:
图 2.IP 分片两组伸展树结构
伸展树作为一种 BST,树节点之间也有比较关系,IP 包节点之间的比较是在
(源 IP 地址、目的 IP 地址、IP 标识号(ipid)、protocol 协议类型)四元组进行
的;frag 节点之间的比较是对 IP 的偏移量字段进行比较。通过比较,可以迅
速地在伸展树上找到需要插入、删除或者进行计算的结点。下面给出实 现
IP 分片重组的算法:
1) 首先按照(源 IP 地址、目的 IP 地址、IP 标识号、protocol 协议类型)
四元组建立 IP 包伸展树,并以该四员组作为该树的比较查找函数。
2) 每来一个 IP 包,首先检测其是否为 IP 分片, 若未分片,不做处理。分
第 6 页 共 22 页
网络工程技能训练报告
片识别规则是:如果 IP 数 据报的“分片偏移量”和 MF 标志同时为零,则说
明该 IP 数据报未经过分片处理;否则,就是一个 IP 分片。
3) 根据该 IP 包的四元组对应值查找 IP 包伸展树,看是否已建立该 IP 分
片的 IP 包节点。如果不存在 IP 包节点,则新建 IP 包节点,插入到 IP 包伸展
树,再以该 IP 包节点作为根节点,初始化分片树,将此 IP 分片插入到该 IP 分
片树。对于 IP 包的第一个分片,要为其新建一个 IP 包节点,并为该 IP 包节
点新建一棵 frag 伸展树(该树为空)。然后将这第一个分片插入到该 IP 包节
点的伸展树中,并将该 IP 包节点再插入到 IP 包伸展树中。
4) 如果存在 IP 包节点,则以 IP 分片的 OFFSET 值在 IP 分片包伸展树
内查找,如果找到,则说明分片重复,丢弃该分片,否则插入该分片到树的相
应位置。
5) 如果 IP 包节点的第一个分片和最后一个分片都已经到达,可以认为
大部分 IP 分片都已到达,对所有分片进行完整性检查。因为完整性检查需要
对对该IP 包节点下的 FRAG 伸展树进行前序遍历,做这个判断的好处是可以
减少前序遍历的次数。 第一个分片特点是 IP 分片偏移量=0 并且 MF=1 最
后一个分片特点是 IP 分片偏移量>0 并且 MF=0。
6) 通过对 FRAG 伸展树进行前序遍历,判断所 有的 IP 分片是否全部到
达并且是否合法。遍历到分片 Pi 时,由 Pi-1 的偏移量和 Pi-1 的数据长度,可
以得到合法的下一个偏移量 NextOffset。一般的,PiOffset=NextOffset,说明
Pi 在位置上与 Pi-1 紧 密相邻;但是,如果 PiOffsetNextOffset,说明 Pi 在位置上与 Pi-1 有空
隙 , 分 片 不 完 整 , 进 行 出 错 处 理 。 如 果 所 有 分 片 都 满 足 :
PiOffset=Pi-1Offset,+Pi-1Fragsize 则可认为 IP 分片已经到齐,可以重组 IP
包。
3.4 Linux 的实现
3.4.1 IP 分片
如何提高分片处理的效率。
1.ip_fragment(非 UDP 使用)
ip_sendà ip_fragment(skb, ip_finish_output);一般从转发来
ip_queue_xmit2à ip_fragment(skb, skb->dst->output)一般从 TCP 来。
/*
* This IP datagram is too large to be sent in one piece. Break it up into
* smaller pieces (each of size equal to IP header plus
* a block of the data of the original IP data part) that will yet fit in a
* single device frame, and queue such a frame for sending.
*
* Yes this is inefficient, feel free to submit a quicker one.
*/
第 7 页 共 22 页
网络工程技能训练报告
int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
{
struct iphdr *iph;
unsigned char *raw;
unsigned char *ptr;
struct net_device *dev;
struct sk_buff *skb2;
unsigned int mtu, hlen, left, len;
int offset;
int not_last_frag;
struct rtable *rt = (struct rtable*)skb->dst;
int err = 0;
dev = rt->u.dst.dev;出口路由设备
/*
* Point into the IP datagram header.
*/
raw = skb->nh.raw;
iph = (struct iphdr*)raw;取 IP 头
/*
* Setup starting values.
*/
hlen = iph->ihl * 4;
left = ntohs(iph->tot_len) - hlen; /* Space per frame */IP 包总长度减去 IP 头长
度――需要分片的数据长度
mtu = rt->u.dst.pmtu - hlen; /* Size of data space */MTU 减去 IP 头长度――除
去 IP 头的分片长度
ptr = raw + hlen; /* Where to start from */取数据区指针
/*
* Fragment the datagram.
*/
offset = (ntohs(iph->frag_off) & IP_OFFSET) << 3;取出偏移位(13 位),并乘
8 算出总字节数――算出该包的偏移字节数
not_last_frag = iph->frag_off & htons(IP_MF);取出 MF 位(第 14 位)
/*
* Keep copying data until we run out.
*/
第 8 页 共 22 页