转自:http://blog.smallmuou.xyz/%E7%BD%91%E7%BB%9C/2017/08/17/%E7%90%86%E8%A7%A3MTU%E5%92%8CMSS.html
1. 问题
遇到个奇怪的问题「无法上传文件至七牛服务器」,依次排除了七牛服务、本地网络,最终定位到只要数据发送超过 1440 Byte,连路就断了,实际测了下是对方电信出口的限制,具体原因不得而知,解决方法,就是把路由的 MTU 设小,使得数据小于 1440 Byte。籍此,对 MTU 进行了深入学习。
2. 概念
MTU(Maximum Transmission Unit) - 一种通信协议的某一层上面所能通过的最大数据包大小.
以太网为 1500,这也是为何路由器或 PC 上默认都是 1500,因此数据包一旦超过此大小,就会进行分包,这也就有了 IP 分片的过程,这里就引入了一个问题,IP 包是不可靠的,如果 IP 分片,如何保证 TCP 可靠?
于是这里引入了 MSS,
MSS(Maximum Segment Size) - 传输控制协议的一个参数,以字节数定义一个计算机或通信设备所能接受的分段的最大数据量。注意这是不包含 IP 头及 TCP 或 UDP 头的,例如,对于
TCP,MSS = 1500 - 20(IP 头)- 20(TCP 头)
TCP 通过 MSS 提前进行分段,从而保证数据不会超过 MTU,来保证 IP 不需要再进行分片。
3. 获取网络 MTU
如何检测网络各个节点 MTU 值呢?答案是我们可以通过 ping 的不分片发送进行检测。注意,1500 是去除了以太网头以后的包大小!对于 ping,传递的是 ICMP 包,由以太网头 + IP 头+ ICMP 头 + 数据组成,只要 IP 头 + ICMP 头 + 数据不超过 1500 即可。也就是说,MTU = 1500 - 20(IP 头)- 8(ICMP 头)= 1472。下面是基于 1472 进行实际测试。
Windows
ping -f -l 1472 baidu.com
Linux
ping -M do -c 2 -s 1472 baidu.com
Mac
sudo ping -D -s 1472 baidu.com
4 其它
在 PPPOE 下,最大 MTU 是 1492,因为外加 PPPOE 头部(6 字节)+ PPP头部(2 字节)
可以 ping 各个路由来查看相应 MTU,当然如果越近路由 MTU 较小,则无法检测远端路由.