数据链路层不同,MTU(最大传输单元)就不同。但是IP协议是网络层的协议,它需要将数据链路层进行抽象。使得所有的数据链路对于上层的表现是一致的。
任何一台主机必要对IP分片进行相应的处理。因为,较大的报文无法一下子发送出去,需要进行分片分次发送。是否有必要进行分片是由路由器决定的,只要路由器认为有必要分片,就会进行分片。路由器只管分片,不管重组。重组是需要在目标主机上完成的。分片以8字节的倍数进行。IP首部的“片偏移”字段表示之后每个分片在用户数据中的相对位置和该分片之后是否还有其它后续分片。
分片机制并不完美,随着互联网的快速发展。分片机制带给路由器的负担越来越重。并且分片带来了如果丢失其中一个分片,那么整个报文就会作废。但是如果让上层协议封装的数据流变得更小,会导致网路利用率下降。为了解决上述问题,路径MTU发现。
路径MTU发现是指从发送端主机到接收端主机所经过的所有数据链路中最小的MTU。按照路径MTU分片以后,就无需再中途的路由器上进行分片处理了。路径MTU的实现依赖于路由器所搭载的操作系统。
在上层协议是UDP协议的情形下,首先在发送端主机发送IP包的时候设置分片禁止标志。途中的路由器即使遇到了包的大小超过了数据链路的MTU,也不去分片,直接将包丢弃。随后,通过ICMP的不可达消息返回一个MTU的值给发送主机。下一次,根据这个ICMP所通知的MTU去进行分片处理,接着发送出去,如果分片仍旧在传输过程中大于某一数据链路的MTU,仍将分片丢弃,ICMP继续返回一个当前MTU,如此一直进行下去,直到找到一个合适的MTU。
在上层协议是TCP协议的情形下。由于TCP协议是面向有连接的(两台主机之间要维护这个连接)。TCP协议会根据路径MTU的大小来计算出最大段长度MSS。一旦TCP连接采用了路径MTU发现,那么在IP层就不会在进行分片处理。因为,MSS最大就是路径MTU。