一图说明MTUMSS

GuFEPe.jpg

  1. MTU - 最大传输单元 (maximum transmission unit)

    Gnx3ee.jpg

    不同类型的网络大多数对在其中传输的数据帧(Frame)的携带的数据大小都有一个限制,这个限制值就是MTU。以太网(Ethernet)设备的MTU一般是1500字节。注意:MTU是每个网络接口自己设置的,上图可以看到我们和服务器之间的两个路由器的四个网络接口的MTU = 1500。

    Gu98jP.jpg

    当然路由器可以自己设置更大的MTU, 表明自己可以支持更大的数据帧(Frame)

    如果IP层有一个数据报要传,而且数据报的大小比链路层的MTU还大,那么IP层就需要分片(fragmentation),把IP数据报分成若干片,这样每一片都小于MTU

  2. 路径MTU
    为了避免两台主机间整个通信过程中出现IP分片,两台通信主机路径中的最小MTU就非常重要。这个最小MTU被称为路径MTU。上图中的路径MTU = 1500。
  3. IP分片
    任何时候IP层接收到一份要发送的IP数据报(Datagram)时,他要判断向本地哪个网络接口发送数据,并查询该接口的MTU。如果IP数据报的大小比MTU大,则需要进行分片。分片这一过程可以发送端主机上,也可以发生在中间路由器上

    分片后,只有到达目的地才进行重装,重装由目的端的IP层来完成,注意这个分片的过程对上面的传输层(TCP和UDP)是透明的。

    GuEla6.jpg

    为什么在整个通信过程,要避免IP分片:因为只要丢失一片数据就要重传整个IP数据报。IP层没有超时重传的机制,一般由传输层的TCP复制超时重传。
    举个例子,我们发送了一个大小=4500字节的IP数据报,接口的MTU=1500,这时候就要进行IP分片,4500/1500=3, 我们要分成3个数据帧来传输。如果目的端成功接收到3个数据帧,目的端的网络层就会将分片重装为一个IP数据报,然后交给传输层TCP处理,这样是不会有问题的。但是如果其中一个数据帧丢失了,IP层就无法重装好一个完整的IP数据报交给传输层。TCP在超时后,发送端就会重复这个TCP报文段,对应的是整个大小=4500字节的IP数据报,是没有办法只重传丢失的分片。所以,我们要避免分片。

  4. MSS - 最长报文大小 (Maximum Segment Size)
    TCP为了避免IP分片,在通信双方三次握手过程中,在SYN包的TCP option设置了MSS, 指明了发送SYN包的本端所能接收的payload最大是多少。

    一般情况下,MSS = 路径MTU - 20(IP Header) - 20(TCP Header),如果IP Header含有选项字段,那MSS就要继续减去选项字段的大小。

    GuMvGt.jpg

    GuQKLF.jpg

    使用wireshark监听打开百度首页的TCP连接。

    Gu1xR1.jpg
    告诉百度不要发送TCP payload大于1460字节的数据报。
    Gu1vGR.jpg
    百度告诉我们不要发送TCP payload大于1452字节的数据报。

    双方经过协商后,应该使用较小的MSS,也就是1452。

参考资料

  1. TCP/IP详解卷1:协议
  2. How TCP Works - MTU vs MSS
Last modification:March 30th, 2020 at 09:59 pm
如果觉得我的文章对你有用,请尽情赞赏 🐶