数据链路的不同,导致链路上的MTU(最大传输单元)也不尽相同,比如对于IP来说最大的MTU是65535字节,但是这个65535字节的MTU仅仅对于IP上一层的TCP,UDP来说可以看做这么大。

对于以太网传输IP报文,由于以太网的最大MTU是1500字节,假如传输4342字节的IP数据包,就无法在一个帧中完成发送,这时就需要用到IP分片(IP Fragmentation)。

Tips:分片以8个字节的倍数为单位进行

 

分片之后的IP数据包在传输的过程中如果遇到了需要检查IP上层的TCP、UDP或者其他应用层信息时(防火墙,NAT,端应用),还需要将分片重组,以方便提取IP上层的信息,检查之后又会按照原分片进行拆分。

 

分片机制也有一定的不足,中途路由器还做分片处理使得路由器的处理负担加重,不利于链路上的高速传输,还有,TCP的一个小分片丢失会导致整个数据包重传。

 

路径MTU发现技术

PMTUD——Path MTU Discovery ,所谓路径MTU(PMTU)是指从发送端主机到接收端主机之间不需要分片的最大MTU的大小,可以避免在中途的路由器上进行分片处理。

PMTUD的工作原理:

1.在发送端主机发送IP数据包时将首部的分片禁止标志位置为1

2.数据包传输途中路由器遇到需要分片的大包也不分片,而是直接丢弃

3.通过ICMP的不可达消息将链路MTU返回给主机

4.主机下一次发送根据返回的MTU进行分片处理再发送

5.如果路上又遇到下一台路由器需要分片,则又直接丢弃,返回带MTU的ICMP

6.主机再次根据这个MTU进行分片,不断循环,直到最后一次设置的MTU整个路径都不用分片

7.对于UDP来说,分片指UDP传过来的UDP首部和UDP数据在IP层被分片,对于IP,不区分UDP的首部和数据,所有分片到达目标主机后先被重组,再传给UDP层

8.对于TCP来说,分片指TCP超时时自动按照比例缩减MSS的大小,重传数据包,TCP将数据分成IP层不会再被细分的粒度后传给IP层,IP层不再做分片处理,所有分片到达目标主机后,照原样传给TCP层,而不用先被重组

 

IPv4首部中部分字段

总长度-Total Length

表示IP首部和数据部分加起来的总字节数,该字段长16比特,所以IP包最大长度 2^16=65535字节

标识-Identification

用于分片重组,长16比特,同一组分片的标识值相同(即使标识相同,源目的地址或者协议不同也视为不同分片),不同分片的标识值不同

标志-Flags

长3比特,比特0,未用;比特1,表示dont fragment,0-可以分片,1-不能分片;比特2,表示是否为最后一个包,0-最后一个分片包,1-分片中段的包