TCP/IP协议中,传输层如何获知网络层最大传输单元MTU的长度?

Posted 车小胖谈网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP协议中,传输层如何获知网络层最大传输单元MTU的长度?相关的知识,希望对你有一定的参考价值。

传输层协议TCPUDP获得本地接口的MTU还是很简单的,只要通过简单的函数调用即可。可是,得到本地的MTU值并不能保证本地发出的IP报文,在通往目的地的路径上不被分片。

 

根据木桶理论,一个木桶能装多少水,不是由最高的木板来决定的,而是由最低的木板来决定的。同理,在通向目的地的路径上,决定传输最大单元尺寸是最小的路由器的MTU,而不是最大的MTU

 

尽管获知通信双方之间路径最小MTU有一定难度,但是TCP协议还是决定用自己的方法来找到它。

 

TCP使用MSS option 在握手连接时,双方互相交换各自的MSS,然后双方约定使用两个MSS中的小者,但这种方法并不有效。

 

比如客户端MTU = 1500, 服务器端MTU = 1500,双方的MSS = 1460,双方就协商使用1460 byte 来传输TCP segment

 

问题来了,客户端通向ISP的光纤路由器是PPPoE拨号,将会在正常的IP报文头添加8 bytePPPoE头,相当于变相挤占了IP报文8 byte的空间,留给IP报文的MTU = 1500 -8 =1492,那么客户端与服务器的1500 byte IP报文最终会被分片。

 

如何探测路径中的最小的MTU

只要让IP报文设置DF= 1即可,这样一旦需要分片而无法分片,会发送错误消息通知源。源主机就会获悉最小的MTU的数值,源主机的IP层会记录一条特殊的主机路由,这条主机路由通向唯一的目的地,并标注其最小MTU,这样以后和该目的地主机的通信将使用该最小MTU

 

同时,源主机IP层会通过消息通知的方式,通知TCP关于路径中最小MTU,这样该TCP session会相应地减小自己的最大传输单元。

 

这种方法固然好,但是由于某些路由器可能禁止了ICMP错误通知功能,动态路径MTU检测,往往造成通信障碍。

 

Windows 10 统一使用 MTU = 1300的方法,可能是一个较好的方法,可以避免99%+以上网络场景的分片。

以上是关于TCP/IP协议中,传输层如何获知网络层最大传输单元MTU的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现TCP和UDP传输

TCP/IP Socket 的理解

TCP/IP协议 简介

tcp/ip协议包含哪几层?

计算机网络学习

TCP/IPHttpSocket的区别