ping 包长度及 MTU

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

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

Windows

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

> ping 192.168.1.1 -l 1000

使用 Wireshark 抓包看看:

可以看到 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 抓包看看:

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

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

MTU

维基百科对 MTU 的定义

In 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:

大于 1472 的值将导致分片:

小结

  • Windows 和 Linux 下的 ping 命令分别使用 -l 和 -s 指定包长度。
  • ping 命令指定的包长度是 ICMP payload 的长度(不包括 ICMP header),加上 42 字节后为以太网帧的总长度。
  • MTU 指的是网络层协议的包长度。
  • ping 命令中指定的能 ping 通且不分片的最大长度是 MTU - 28。

以上。

comments powered by Disqus