图解TCP/IP:路径MTU发现
数据链路不同,MTU则相异
每个数据链路的最大传输单元(MTU)都不尽相同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的MTU也就不同。鉴于IP属于数据链路上一层,它必须不受限于不同数据链路的MTU大小。
# 各种数据链路及其MTU
IP的最大MTU | IP over ATM | FDDI | 以太网 | PPP(Default) | IEEE802.3 Ethernet
65535 9180 4352 1500 1500 1492
IP报文的分片与重组
任何一台主机都有必要对IP分片
(IP Fragmentation)进行相应的处理,经过分片之后的IP数据在被重组的时候只能由目标主机进行。路由器虽然做分片但不会进行重组。
发送主机:设置一个唯一数字作为IP首部的标识码发送
路由器:路由器负责进行分片
接收主机:参考IP首部的识别码进行重组,传给上层
IP首部中的"片偏移"字段表示分片之后在用户数据中的相对位置和该分片之后是否还有后续其他分片。
根据这个字段可以判断一个IP数据报是否分片以及当前分片为整个数据报的起始、中段还是末尾。
路径MTU发现
分片机制也有它的不足:
-
路由器的处理负荷加重
-
随着人们对网络安全的要求提高路由器需要做的其他处理也越来越多
-
在分片处理中一旦某个分片丢失则会造成整个IP数据报作废
为了应对以上问题,产生了一种新的技术路径MTU发现
(Path MTU Discovery)。所谓路径MTU是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送。进行路径MTU发现就可以避免在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。
# 路径MTU发现的机制(UDP的情况下)
发送时IP首部的分片标志位设置为不分片。路由器丢包。
由ICMP通知下一次MTU的大小。
UDP中没有重发处理。应用在发送下一个消息时会被分片。
具体来说,就是指UDP层传过来的"UDP首部+UDP数据"在IP层被分片。对于IP,它并不区分UDP首部和应用的数据。
所有的分片到达目标主机后被重组,再传给UDP层。
路径MTU发现的工作原理如下:
-
在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。
-
通过一个ICMP的不可达消息将数据链路上的MTU的值给发送主机。
-
下一次,从发送给同一个目标主机的IP数据报获得ICMP所通知的MTU值以后,将它设置为当前的MTU。发送主机根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适的MTU值。那么,当MTU的值比较多时,最少可以缓存约10分钟。在这10分钟内使用刚刚求得的MTU,但过了这10分钟以后则重新根据链路上的MTU做一次路径MTU发现。
# 路径MTU发现的机制(TCP的情况下)
发送时IP首部的分片标志位设置为不分片。路由器丢包。
由ICMP通知下一次MTU的大小。
根据TCP的重发处理,数据报会被重新发送。TCP负责将数据分成IP层不会再被分片的粒度以后传给IP层。IP层不再做分片处理。
不需要重组。数据被原样发送给接收端主机的TCP层。
(最近更新:2019年09月18日)