不要碎片位 PING 工具

网络工程 ipv4 linux 国际会议
2021-07-18 07:14:53

实际上我的机器wwan0 MTU 是 1500

ashokkrishna@ashokkrishna-Lenovo-B560:~$ ping -s 1490 example.com
PING example.com (93.184.216.119) 1490(1518) bytes of data.
1498 bytes from 93.184.216.119: icmp_seq=1 ttl=51 time=1119 ms
1498 bytes from 93.184.216.119: icmp_seq=2 ttl=51 time=1130 ms
1498 bytes from 93.184.216.119: icmp_seq=3 ttl=51 time=1260 ms
^C
--- example.com ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3178ms
rtt min/avg/max/mdev = 1119.258/1170.102/1260.574/64.137 ms, pipe 2

但是当我 ping 喜欢

ashokkrishna@ashokkrishna-Lenovo-B560:~$ ping -M do -s 1490 example.com
PING example.com (93.184.216.119) 1490(1518) bytes of data.
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
^C
--- example.com ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1999ms

这是什么区别?
我的目的是要知道 example.com 服务器的 MTU 大小?我怎么能找到呢?

2个回答

运行“ping -M do -s 1490 example.com”表示ICMP数据大小为1490字节,不允许分片。对于这个大小的ICMP数据,ICMP大小(即头+数据)为1498字节。添加IP头,帧大小变为1518字节。帧大小不能超过接口的 MTU 大小。从错误消息来看,接口的 MTU 为 1500 字节。因此,帧中有额外的 18 个字节。如果没有分片,则无法发送此消息。由于不允许分片,ping 失败,提示消息太长。

您不需要远程服务器的 MTU 大小。在网络中,只需要下一跳的 MTU 大小(除非目的地是下一跳)。阅读https://en.wikipedia.org/wiki/IP_fragmentation 有帮助。

当您指定“-s 1490”时,您将 ICMP 数据包的大小设置为 1490 字节。然后您系统的 IP 堆栈添加 ICMP 和 IP 标头,它们等于 28 个字节。所以在这种情况下,当指定 1490 字节的大小时,实际上您的系统尝试发送大小为 1490 + 28 = 1518 字节的 IP 数据包。我假设您的 PC 在接口上具有 MTU 1500,并且由于您已经禁止您的系统进行分段,它会向您报告数据包太大而无法通过具有较低 MTU 的接口发送。

关于您尝试检查服务器的 MTU 大小。由于上述问题,您将无法发送大于 1500 字节的 IP 数据包,因此如果服务器具有更高的 MTU,您将无法从这台 PC 上发现这一点。