一图说明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

