ping 命令是测试网络是否连通最常用的命令,而无论是 Windows 还是 Linux,ping 命令都可以指定包长度,这对于验证网络设备的 MTU 非常有帮助。

先来看看在不同的操作系统下如何指定 ping 包长度及其各自的含义。

Windows

Windows 的 ping 命令通过 -l 参数指定包长度:> ping 192.168.1.1 -l 1000

使用 Wireshark 抓包看看:b5d76a3af168e94a32f9d114f502d040.png

可以看到 Length 为 1042 字节,比指定的包长度多了 42 字节。注意到 ICMP data 的长度正好是 1000 字节,加上 ICMP header 8 字节,IP header 20 字节,Ethernet header 14 字节,正好是 1042 字节。

也就是说,ping 命令指定的是 ICMP payload 的长度(不包括 ICMP header)。ping 命令作为 ICMP 协议的具体实现,这样的设定也符合逻辑。

当不使用 -l 参数时,默认的包长(ICMP payload)是 32 字节。

GNU/Linux

Linux 的 ping 命令通过 -s 参数指定包长度:$ ping 192.168.1.1 -s 1000

同样使用 Wireshark 抓包看看:74c06fcd757040ee9200db74241cf356.png

可以看到,Length 同样是 1042 字节,但 ICMP data 只有 992 字节,这是因为在 ICMP data 之前还有 8 个字节用于填入时间戳,也属于 ICMP payload 的一部分,只是 Wireshark 解析时分开显示而已。

当不使用 -s 参数时,默认的包长(ICMP payload)是 56 字节。

MTUIn computer networking, the maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be communicated in a single network layer transaction.

也就是说,MTU 是 Maximum Transmission Unit(最大传输单元)的缩写,指的是「网络层」单次传输的最大字节数。

常见的 MTU 设置为 1500。而以太网帧长度的允许范围是 64—1518 字节(不考虑 jumbo 帧),指的是以太网线路上可传输的整个以太网帧的长度,扣除 14 字节以太网帧头、4 字节帧校验和之后,最大值正好是 1500 字节。

ping 与 MTU

假如要使用 ping 命令验证网络设备的 MTU,应该如何指定 ping 命令的包长度参数呢?由于 MTU 是整个 IP 包的最大长度,那么 ICMP 包的最大 payload 就是 MTU - 20 (IP header) - 8 (ICMP header),因此能 ping 通且不分片的最大参数值是 MTU - 28。

假如 MTU 为 1500,那么 ping 命令的长度参数最大可指定为 1472:3be55ba5093b69c94f8d7e93ee05ea47.png

大于 1472 的值将导致分片:f89e91d9344b7a15b15340156d890a0c.png

小结Windows 和 Linux 下的 ping 命令分别使用 -l 和 -s 指定包长度。

ping 命令指定的包长度是 ICMP payload 的长度(不包括 ICMP header),加上 42 字节后为以太网帧的总长度。

MTU 指的是网络层协议的包长度。

ping 命令中指定的能 ping 通且不分片的最大长度是 MTU - 28。

以上。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐