前言
任何一台主机都有必要对IP分片进行相应的处理。
分片往往出现在网络上遇到比较大的报文无法一下子发送出去才会进行处理。
正文
比如说在前一个FDDI链路中的报文大小为4352字节,小于其MTU所以能够安全传送。如果经过一个路由器后,跳到以太网链路,由于以太链路的MTU为1500字节,所以显然报文无法传输。因此,路由器会将其分片成三个报文段进行分别顺序发送。这里分片的任务交给了路由器,而经过分片之后的IP数据报在重组的时候,只能在目标主机上进行。
显然,随着网络的流量的提升,一旦出现较多的分片 情况的话,路由器的负担便会加重。也会降低网络的传输效率。同时也是出于网络安全的考虑。
因此,引入路径MTU发现(Path MTU Discovery )
使用了路径MTU发现技术后,使得路由器可以提前得知下一个链路的MTU大小。
在传送过来的报文中,由于首先在发送端主机发送IP数据报的时候将其首部的分片禁止标志位设置为1,根据这个标志位,在遇到下一个路由器的时候就不会进行分片处理,而是直接弃包。同时路由器通过一个ICMP的不可达消息将数据链路的MTU发送给主机。主机接收到这个值后在下一次发送报文的时候,IP层进行分片。
IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。
注意:
1)对于UDP,由于UDP是不可重发的。UDP一般数据包大小会限制在512字节。
Internet大多数网络接口MTU>512,即使DNS报文 + UDP+ IP= 512+8+20=540,这个大小几乎可以在Internet上畅通无阻,而无需IP分片。
为何IP分片不好?
一个UDP报文如果因为size > MTU,则会被IP层分成两片或者多片,但是只有一片有端口号,由于其它分片没有端口号,能否通过防火墙则完全看防火墙的脸色,所以对于能否通信成功是一个未知数。
如果防火墙网开一面,不检查端口号,分片可以全部通行,到目的地再组装到一起,IP层提交给UDP/DNS,一点问题没有。但是防火墙的安全功能大打折扣,如何阻止非法的外来攻击包?
如果防火墙严格检查端口号,则没有端口号的分片则统统丢弃,造成通信障碍。
所以选择一个合适的UDP size至关重要,避免分片。
2)而对于TCP而言,由于是可重发的,所以第一次弃包(发送失败)的时候,主机接收到路由器返回来的MTU值。根据TCP重发处理,数据包会被重新发送,在IP层进行分片。
MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。
MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20 Byte)得到。
分片:若一IP数据报大小超过相应链路的MTU的时候,IPV4和IPV6都执行分片(fragmentation),各片段到达目的地前通常不会被重组(re-assembling)。IPV4主机对其产生的数据报执行分片,IPV4路由器对其转发的数据也执行分片。然而IPV6只在数据产生的主机执行分片;IPV6路由器对其转发的数据不执行分片。
例如:一个以太网上的主机和一个令牌环网上的主机间建立连接,其中以太网上主机通告的MSS为1460,令牌环网上主机通告的MSS为4096。观察分组,在两个方向上都找不到大于1460字节的数据,为什么?
令牌环网上发送到以太网的数据大小不大于1460字节的原因是因为以太网上主要通告的MSS值就为1460个字节,所以令牌环网上发送出去的数据的长度不能够大于MSS值;令牌环网上主机通告的MSS值为4096,也即是说以太网能够发送到令牌环网上的TCP净荷值为4096,但是以太网的MTU值又是由硬件所决定的,最大只支持1500(包括IP头至少20B和TCP头至少20B),为避免分片,因此以太网发送到令牌环网的数据的净荷也为1500-20-20=1460B,所以两个方向的净数据长度不会大于1460字节。