1、为什么要进行IP分片?
常见的以太网的MTU(Maxitum Transmission Unit)值为1500,如果需要转发的报文长度超出其接口的MTU值,则在转发该报文时,需要先将报文进行分片,分为适合该链路传输类型的报文,由接收方完成报文的重组。另外需要注意,不同链路的MTU值可能不同。
2、报文的分片和重组
该部分内容主要从一个网友那里参考过来http://www.vants.org/?post=106,感谢作者易隐者(如有侵权,请联系我,然后我删除)。
先来看一下分片的过程,为了简单起见,就用《TCPIP详解卷一》第11章《UDP:用户数据报协议》中关于IP分片的案例,应用进程将1473字节应用字段交给UDP处理,UDP加上8字节的UDP报头之后,交给IP层处理,IP层在转发之前,发现该报文长度超出转发接口的MTU,因此需要分片,分为两个IP分组,如下图所示:
从上图可以看出原始的IP报文经过分片后,只有第一个分片报文是带有四层信息的,后续报文均不带四层信息,为做直观展示,找了一个实际环境下抓取的分片报文,如下图所示:
这是分片的第一个报文,我们可以看到该报文IP层封装的上层协议为ICMP协议,这是一个ping报文(上层协议信息),我们再来看一下后续分片报文的解码:
这是分片后续报文,我们能看到封装的是ICMP协议,但是封装的上层协议的具体信息就无法看到了。
IP数据报被分片之后,所有分片报文的IP报头中的源IP、目的IP、IP标识、上层协议等信息都是一样的(TTL不一定是一样的,因为不同的分片报文可能会经过不同的路由路径达到目的端),不同的地方在于分片标志位和分片偏移量,而接收方正是根据接收到的分片报文的源IP、目的IP、 IP标识、分片标志位、分片偏移量来对接收到的分片报文进行重组。
接收方根据报文的源IP、目的IP、IP标识将接收到的分片报文归为不同原始IP数据报的分片分组;分片标志中的MF位(More Fragment)标识了是否是最后一个分片报文,如果是最后一个分片报文,则根据分片偏移量计算出各个分片报文在原始IP数据报中的位置,重组为分片前的原始IP报文。如果不是最后一个分片报文,则等待最后一个分片报文达到后完成重组。
3、操作系统异常分片报文
下面我们来看看被某同学,把linux系统IP Fragment功能无意中阉掉的分片报文(猜测可能是IP Fragment相关的某个宏没有打开导致):
根据IP分片原理,另个分片的Reassembled IPv4 in frame值大小,明显不对。
分片错误,导致SIP程序不能正确处理完整的SIP信息,导致SIP呼叫失败。
4、分片带来的问题,可以接着参考网友易隐者 的IP分片文章,http://www.vants.org/?post=106