IP分片实例分析
IP分片实例分析
引言
最近公司要研发一款用于链路通信加密的设备,使用祖冲之算法对OSI七层中的数据链路层数据进行流式加密,在设计技术方案时,发现一个问题,就是广域网上传输的数据包都是有最大长度限制的,对TCP数据包是MSS(最大分段长度), 对UDP数据包是MTU(最大传输单元),而对于我们的项目,TCP的分段不用特殊处理,而IP分片需要在加密设备端主动分片,并且满足IP的包格式。UDP不会分段,就由IP分片;TCP会分段,就不用IP分片。
IP分片
下面我们就具体说说IP分片,当UDP包长度大于MTU(1500)时,进行IP分片,即一个IP包分成多个:
1.在IP包头部分,分片后的包和原始包对比,FLAGS 和 FRAGMENT OFFSET两个字段的内容要发生变化----详见下面 IP报文格式 和 IP分片实例分析;
2.分片后的数据包中,只有第一包是带UDP包首部,其余包只有IP包首部,到了终端后在进行重组。
IP报文格式
上面是IP的报文格式,接下来我们先说明各个字段的意义。然后,用Etheral软件转包分析IP的报文格式。
1.版本:ip报文中,版本占了4位,用来表示该协议采用的是那一个版本的ip,相同版本的ip才能进行通信。一般此处的值为4,表示ipv4。
2.头长度:该字段用四位表示,表示整个ip包头的长度,其中数的单位是4字节。即二进制数0000-1111(十进制数0-15),其中一个最小长度为0字节,最大长度为60字节。一般来说此处的值为0101,表示头长度为20字节。
3.Tos服务字段:该字段用8位表示。该字段一般情况下不使用。
4..总长度:该字段表示整个ip报文的长度,单位是1字节。能表示的最大字节为2^16-1=65535字节。不过由于链路层的MTU限制。超过1480字节后就会被分片(以太帧MTU为1500的情况下,除去20字节的包头)
5.标识:该字段是ip软件实现的时候自动产生的,该字段的目的不是为了接受方的按序接受而设置的,而是在ip分片以后,用来标识同一片分片的。方便ip分片的重组。
6.标志:该字段是与ip分片有关的。其中有三位,但只有两位是有效的,分别为MF,DF,MF。MF标识后面是否还有分片,为1时,表示后面还有分片。DF标识是否能分片,为0表示可以分片。
7.片偏移:该字段是与ip分片后,相应的ip片在总的ip片的位置。该字段的单位是8字节。比如,一个长度为4000字节的ip报文,到达路由器。这是超过了链路层的MTU,需要进行分片,4000字节中,20字节为包头,3980字节为数据,需要分成3个ip片(链路层MTU为1500),那么第一个分片的片偏移就是0,表示该分片在3980的第0位开始,第1479位结束。第二个ip片的片偏移为185(1480/8),表示该分片开始的位置在原来ip的第1480位,结束在2959。第三片的片偏移为370(2960/8),表示开始的时候是2960位,结束的时候在3979位。
8.TTL:该片表示生存周期,该值占8位。ip分片每经过一个路由器该值减一,它的出现是为了防止路由环路,浪费带宽的问题。比如,该ip在R1路由器发送到R2路由器。R2路由器又发给R1路由器。防止这种循环。window系统默认为128.
9.协议:该值标识上层的协议。占8位。其中1,标识ICMP、2标识IGMP、6标识TCP、17标识UDP、89标识OSPF。
10校验和:该值是对整个数据包的包头进行的校验。占16位。
11.源地址和目的地址。标识发送ip片的源和目的ip,32位
12.接下来是可选的部分,一般一些特殊的要求会加在这个部分。
13:数据
IP分片实例分析
下面是我在实际测试中的抓包截图和分析,抓包工具用的IPtool,对其进行了过滤设置,所以只会看到分片后的几个包:
1. 上图分为三块,最上面的是0--3共四个数据包,是分片后的数据包,可以看到包类型,包长度,以及源地址,目的地址,源端口,目的端口(端口号为什么是杂乱无章的哪?????文中有答案,仔细阅读哦);
2. 上图左下区域为 报文解析,大家可以对照 IP报文格式 进行学习,注意上图是IP分片的第0包,所以FRAGMENT OFFSET 值为0,那么第1包是185,第2包是370,第3包是555,FLAGS字段 最后一包和其他包的值不一致,可以与下面的截图进行对比;
3.上图右下区域为报文完整内容。
附件:四个分片的完整截图
重要的事情强调三遍:
分片后的数据包中,只有第一包是带UDP包首部,其他包的都是数据;FRAGMENT OFFSET 该字段的单位是8字节.
分片后的数据包中,只有第一包是带UDP包首部,其他包的都是数据;FRAGMENT OFFSET 该字段的单位是8字节.
分片后的数据包中,只有第一包是带UDP包首部,其他包的都是数据;FRAGMENT OFFSET 该字段的单位是8字节.