遇到个奇怪的问题「无法上传文件至七牛服务器」,依次排除了七牛服务、本地网络,最终定位到只要数据发送超过1440Byte,连路就断了,实际测了下是对方电信出口的限制,具体原因不得而知,解决方法,就是把路由的MTU设小,使得数据小于1440Byte。籍此,对MTU进行了深入学习。

概念

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不需要再进行分片。

获取网络 MTU

如何检测网络各个节点MTU值呢,可以通过ping的不分片发送,需要注意的是1500是除了以太网头的包大小,对于ping,传递的是ICMP包,由以太网头+IP头+ICMP头+数据组成,只要IP头+ICMP头+数据不超过1500即可

window

ping -f -l 1472 www.baidu.com 

PS:1472 + 20(IP头)+8(ICMP头)= 1500

linux

ping -M do -c 2 -s 1472 www.baidu.com

Mac

ping -D -s 1472 www.baidu.com

在PPPOE下,最大MTU是1492,因为外加PPPOE头部(6字节)+PPP头部(2字节)

可以 ping 各个路由来查看相应MTU,当然如果越近路由MTU较小,则无法检测远端路由.