理解MTU和MSS
遇到个奇怪的问题「无法上传文件至七牛服务器」,依次排除了七牛服务、本地网络,最终定位到只要数据发送超过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较小,则无法检测远端路由.