Q在 Linux 里怎么指定 ping 的报文大小?我想测试网络在较大 ICMP 包下的表现,应该用什么命令来设置 ping 的大小?
A用 -s 指定数据长度
可以用 ping -s 来设置 ICMP 数据部分的大小,例如 ping -s 1472 8.8.8.8。需要注意,-s 设置的是数据区大小,不包含 IP 和 ICMP 头部,所以实际发送的总包长会更大。若要观察不同大小下的连通性,可以逐步调整这个值。
Qping 大包时提示需要分片,应该怎么排查?我在 Linux 上发大一点的 ping 包时,看到分片相关提示,想知道该怎么定位问题。
A关注 MTU 和禁止分片参数
这类情况通常和链路 MTU 有关。可以配合 ping -M do -s 1472 目标地址 来强制不分片发送,如果包太大,系统会直接报错,便于判断路径上的 MTU 限制。若命令失败,可以逐步减小 -s 的值,找出可正常通过的最大大小。
Q怎么测试一条链路能承受的最大 MTU?我需要确认服务器到目标主机之间,哪种包大小可以稳定通过,应该怎么测?
A用递增或递减方式找临界值
可以结合 ping -M do 和 -s 做测试,从较大的值开始逐步缩小,直到命令能够稳定返回。常见做法是通过多次调整数据长度,找到不发生分片且能成功回复的最大值,这个值能帮助你推算链路 MTU 是否正常。
Q大包 ping 不通,但小包正常,可能是什么原因?小的 ICMP 包可以通,大一点就超时,这种现象常见的原因有哪些?
A优先检查 MTU、丢包和策略限制
这种现象常见于 MTU 不匹配、路径中间设备限制分片、ACL 或防火墙丢弃 ICMP、链路质量不稳定等情况。可以先确认本机网卡 MTU、路径 MTU 和目标主机是否允许 ICMP,再用不同大小的 ping 做对比,定位问题出现在哪一段链路。