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。
以上。