一图说明MTU
和MSS
- MTU - 最大传输单元 (maximum transmission unit)
不同类型的网络大多数对在其中传输的数据帧(
Frame
)的携带的数据大小都有一个限制,这个限制值就是MTU
。以太网(Ethernet
)设备的MTU
一般是1500字节。注意:MTU
是每个网络接口
自己设置的,上图可以看到我们和服务器之间的两个路由器的四个网络接口的MTU
= 1500。当然路由器可以自己设置更大的
MTU
, 表明自己可以支持更大的数据帧(Frame
)如果IP层有一个数据报要传,而且数据报的大小比链路层的
MTU
还大,那么IP层就需要分片(fragmentation
),把IP数据报分成若干片,这样每一片都小于MTU
。 - 路径MTU
为了避免两台主机间整个通信过程中出现IP分片
,两台通信主机路径中的最小MTU
就非常重要。这个最小MTU
被称为路径MTU
。上图中的路径MTU
= 1500。 - IP分片
任何时候IP层接收到一份要发送的IP数据报(Datagram
)时,他要判断向本地哪个网络接口
发送数据,并查询该接口的MTU
。如果IP数据报的大小比MTU
大,则需要进行分片
。分片这一过程可以发送端主机上,也可以发生在中间路由器上
。分片后,只有到达目的地才进行重装,重装由目的端的
IP层
来完成,注意这个分片的过程对上面的传输层(TCP和UDP)
是透明的。为什么在整个通信过程,要避免IP分片:因为只要丢失一片数据就要重传整个IP数据报。
IP层没有超时重传的机制
,一般由传输层的TCP复制超时重传。
举个例子,我们发送了一个大小=4500字节的IP数据报,接口的MTU
=1500,这时候就要进行IP分片,4500/1500=3, 我们要分成3个数据帧来传输。如果目的端成功接收到3个数据帧,目的端的网络层就会将分片重装为一个IP数据报,然后交给传输层TCP处理,这样是不会有问题的。但是如果其中一个数据帧丢失了,IP层就无法重装好一个完整的IP数据报交给传输层。TCP在超时后,发送端就会重复这个TCP报文段,对应的是整个大小=4500字节的IP数据报,是没有办法只重传丢失的分片。所以,我们要避免分片。 - MSS - 最长报文大小 (Maximum Segment Size)
TCP为了避免IP分片,在通信双方三次握手
过程中,在SYN
包的TCP option
设置了MSS
, 指明了发送SYN
包的本端所能接收的payload
最大是多少。一般情况下,
MSS
=路径MTU
- 20(IP Header
) - 20(TCP Header
),如果IP Header
含有选项字段,那MSS
就要继续减去选项字段的大小。使用
wireshark
监听打开百度首页的TCP连接。
告诉百度不要发送TCP payload
大于1460字节的数据报。
百度告诉我们不要发送TCP payload
大于1452字节的数据报。双方经过协商后,应该使用较小的
MSS
,也就是1452。
参考资料
- TCP/IP详解卷1:协议
- How TCP Works - MTU vs MSS