首页 » 操作系统 » 一次由于MTU设置不当导致的网络访问超时

一次由于MTU设置不当导致的网络访问超时

 

现象

Server A 调用本机的接口,能正常返回。调用Server B的接口,总是超时。被调用接口是能正常执行的,而且有执行日志记录。
Server C 调用Server B的接口也能正常返回。

分析

根据以上,基本可以排除是Server B接口服务的问题导致超时。很有可能 Server A 与 Server B之间的网络有问题。抓包分析如下:

Server A 调用 Server B接口时,抓包情况如下:

可见,在调用Server B的接口时,重试很严重。见上图的黑色行。

当 MTU 值或者 MSS 值设置不合适时,会导致这样的问题出现。
首先,查看当前 MTU 的值是多少:
linux 下查看方式如下:

$cat /sys/class/net/eth0/mtu
$9001

再看这个 MTU 值设置多少合适。使用 ping 命令检测。

$ping -c 3 -s 2900 -M do 172.18.1.158

-s 参数说明包的大小。Specifies the number of data bytes to be sent.
后面的 IP 可以设置为 任何一个可以 ping 通的 IP。
当返回值如下时,表示包的大小设置的过大,可以调小:

$ping -c 3 -s 2900 -M do 172.18.1.158
PING 172.18.1.158 (172.18.1.158) 2900(2928) bytes of data.

--- 172.18.1.158 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 12000ms

当出现如下的结果时,说明包大小设置的正常了。

$ping -c 3 -s 2000 -M do 172.18.1.158
PING 172.18.1.158 (172.18.1.158) 2000(2028) bytes of data.
2008 bytes from 172.18.1.158: icmp_seq=1 ttl=64 time=0.285 ms
2008 bytes from 172.18.1.158: icmp_seq=2 ttl=64 time=0.275 ms
2008 bytes from 172.18.1.158: icmp_seq=3 ttl=64 time=0.305 ms

--- 172.18.1.158 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.275/0.288/0.305/0.018 ms

解决

经过上面的 ping 测试,我们可以知道 原先的 MTU 值为 9001,设置的过大。应该改成 2000.
有多种修改的方式,下面就介绍一种。

$echo "2000" > /sys/class/net/eth0/mtu

设置完成后,再次抓包,情况如下:

可见重传消失了。

扩展

MTU && MSS

MTU: Maxitum Transmission Unit 最大传输单元
MSS: 就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时 候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方 提供的MSS值得最小值确定为这次连接的最大MSS值。

wireshark 中的 CP segment of a reassembled PDU

数据超出了TCP的最大MSS时,主机会通过发送多个数据包来传送 这些数据(注意:这些包并未被分片)。对wireshark来说这些对相应同一个查询命令的数据包被标记了“TCP segment of a reassembled PDU”

问题,wireshark如何识别多个数据包是对同一个查询数据包的响应? wireshark是根据sequence number来识别,这些数据包ACK number是相同的,当然number的数值与查询数据包中的next sequence number也是一样的。

通过 ifconfig 命令查看和设置 MTU

查看

$ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:BA:E3:40:E8:14  
          inet addr:172.18.1.26  Bcast:172.18.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:2000  Metric:1
          RX packets:45165265 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44281887 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6981358240 (6.5 GiB)  TX bytes:12402618853 (11.5 GiB)
          Interrupt:143 

设置

$ifconfig eth0 mtu 2000 up

扩展阅读

Wireshark抓包常见问题解析

抓包文件下载

抓包数据下载

原文链接:一次由于MTU设置不当导致的网络访问超时,转载请注明来源!

3