什么是MTU?
网络层发送数据包是有最大长度的,网络层从传输层接收到要发送的数据包时,它要判断向本地哪个接口发送数据,并查询该接口获得其最大传输单元MTU(MaximumTransmissionUnit),网络层把MTU值与要发送的IP数据包长度进行比较,如果IP数据包的长度比MTU值大,那么IP数据包就需要进行分片,分片后的数据包长度小于等于MTU(包括IP层头部,大小单位:byte)
MTU不一致经常引起的故障现象:
1、在网络中,由于不同厂商,甚至同一厂商不同型号的设备,对MTU的定义和MTU分片机制不尽相同,常出现MTU引起的网络问题,常表现为游戏卡、部分网站或链接打不开,Email无法发送附件,部分网页或对话框无法打开等。遇到此类问题时,建议先检查是否接口MTU不匹配导致。
此外,OSPF、IS-IS、L2VPN、VPLS等协议邻居关系无法建立,也可能是链路两端MTU值不一致导致。
2、速率无法达到预期
解决方法:
调整机器MTU
如何测试MTU?
Linux主机中: 执行ping x.x.x.x -s 1422 -M do //x.x.x.x是目标地址
-s指明icmp报文的数据部分大小(不包含icmp 8字节头部)
-M do 表示不允许分片。多试几次,找到临界点。以mtu为1450为例,1450 = 20字节IP头 + 8字节icmp头 + 1422数据,则-s指定为1422可以正常通过
Windows主机中: 执行ping x.x.x.x -l 1472 -f //x.x.x.x是目标地址
-l指明icmp报文的数据部分大小(不包含icmp 8字节头部)
-f表示不允许分片。
traceroute --mtu www.baidu.com
traceroute to www.baidu.com (14.215.177.39), 30 hops max, 65000 byte packets
1 192.168.109.1 (192.168.109.1) 3.063 ms F=1500 2.908 ms *
2 192.168.98.36 (192.168.98.36) 1.686 ms 1.422 ms *
3 113.98.59.57 (113.98.59.57) 7.075 ms 7.544 ms 5.851 ms
参考:
ping -s 1400 -M do www.baidu.com
PING www.a.shifen.com (153.3.238.102) 1400(1428) bytes of data. //1400+28字节报文头
ping: local error: Message too long, mtu=1418
ping: local error: Message too long, mtu=1418
ping: local error: Message too long, mtu=1418
^C
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2052ms
为什么mtu值是探测出来的值加上28?
因为ping使用icmp协议,你指定的探测值是数据包数据净荷的长度,还需要加上20字节的ip头部,和8字节的icmp封装。
其他解决方法
-j TCPMSS --set-mss mut-vaue
用法:iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -jTCPMSS --set-mss 128
这条规则的目的是设置MSS为128,人工设置为定值
最新评论