ping 命令详解与参数实测(Ubuntu 22.04)

ping 连通性探测全参数实测:-c 统计段逐行解读、-i 间隔与非 root 小间隔的 ping_group_range/cap_net_raw 机制、-s 报文大小、-W 单包超时与 -w 总时限、-q/-v/-D/-n 输出控制、-I 接口源地址绑定、-f 泛洪风险、-6 IPv6、解析失败 rc=2 与 100% 丢包 rc=1 的错误形态、TTL 判读与三级体检组合用法

Linux命令Linux系统UbuntuUbuntu 22.04命令行网络工具2026/10/16

ping 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 ping 的每一个常用参数——-c 次数限定与统计段逐行解读、-i 发包间隔(含非 root 用户小间隔实测)、-s 报文大小、-W 单包等待超时、-w 总时限、-q 安静模式、-v 详细模式、-I 接口/源地址绑定、-D 时间戳、-n 禁用域名解析、-f 泛洪模式、-a 声音提示、-6 IPv6,以及「名称解析失败 rc=2」「目标不在线 100% loss rc=1」两类典型错误形态与 TTL 判读方法,全部命令与回显已在 Ubuntu 22.04(iputils-ping 20211215)实测通过。

一、环境信息

本节列出本文所有实测所依赖的环境与测试目标,便于读者按同规格复现。

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • ping 版本:iputils-ping 20211215(ping -V 实测输出 ping from iputils 20211215)
  • 软件包:iputils-ping 3:20211215-1ubuntu0.1(Ubuntu 22.04 官方仓库默认版本,apt-cache policy 实测)
  • 网络环境:回环接口 lo(127.0.0.1、::1)、网卡 eth0(IP 172.17.0.2/16)、默认网关 172.17.0.1、可直达公网(实测可 ping 通 223.5.5.5 与 www.baidu.com)
  • 演示目录:/root/demo/ping/(ping 是纯网络探测命令,不产生本地文件,该目录仅作工作目录)
  • 测试目标清单:
目标用途
127.0.0.1回环地址,验证本机协议栈
::1IPv6 回环地址,配合 -6 验证
172.17.0.1局域网网关,代表「局域网可达」
172.17.0.99同网段不存在的 IP,代表「目标不在线」
no-such-host.invalid不存在的域名,代表「名称解析失败」
223.5.5.5 / www.baidu.com公网 IP / 公网域名,代表「外网可达」

💡 技术拓展:做网络诊断时,ping 只是「连通性」工具,遇到「ping 不通但服务正常」或「能 ping 通但很慢」时需要更立体的工具,常见对比如下:

工具原理/特点适用场景
pingICMP Echo 往返,看通不通与 RTT快速判断主机可达性与延迟
traceroute利用 TTL 逐跳递减画出路径定位断点在路径的哪一跳
mtrping + traceroute 实时融合,按跳统计丢包率判断链路质量劣化发生在哪一跳(Ubuntu 22.04 需 apt install mtr-tiny 安装,本文不展开)
curl应用层 HTTP 请求确认端口与 Web 服务本身是否可用

本文聚焦 ping 本身;路径分析建议按「ping 定性 → mtr 定位跳点 → curl 验服务」的顺序组合使用。

二、命令概览

2.1 语法与测试数据准备

ping 通过 ICMP(Internet Control Message Protocol)Echo Request / Echo Reply 报文探测目标主机可达性,语法为 ping [options] <destination>。它有两个与普通命令不同的关键行为:不指定次数时会一直发报文,直到收到 SIGINT(Ctrl-C)才打印统计段;退出码有明确语义——0 表示全部应答正常,1 表示部分或全部丢包,2 表示名称解析失败等参数/目标错误,脚本里可以直接用退出码做判断。

准备演示目录(ping 不落盘任何文件,目录仅作执行时的工作目录):

$ mkdir -p /root/demo/ping && cd /root/demo/ping && ls -la
total 8
drwxr-xr-x  2 root root 4096 Oct 15 19:52 .
drwxr-xr-x 46 root root 4096 Oct 15 19:52 ..

同时确认本机网络要素(接口与网关),后文 -I 参数实测要用:

$ ip -brief addr
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0@if12        UP             172.17.0.2/16
$ ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2

2.2 --help 全量输出

ping --help 的完整回显如下(iputils 20211215 版本,逐行照抄)。注意这一代 iputils 对「长选项」支持有限,直接传 --help 会先报 ping: invalid option -- '-' 再打印用法,这是实测行为,不是故障:

$ ping --help
ping: invalid option -- '-'

Usage
  ping [options] <destination>

Options:
  <destination>      dns name or ip address
  -a                 use audible ping
  -A                 use adaptive ping
  -B                 sticky source address
  -c <count>         stop after <count> replies
  -D                 print timestamps
  -d                 use SO_DEBUG socket option
  -f                 flood ping
  -h                 print help and exit
  -I <interface>     either interface name or address
  -i <interval>      seconds between sending each packet
  -L                 suppress loopback of multicast packets
  -l <preload>       send <preload> number of packages while waiting replies
  -m <mark>          tag the packets going out
  -M <pmtud opt>     define mtu discovery, can be one of <do|dont|want>
  -n                 no dns name resolution
  -O                 report outstanding replies
  -p <pattern>       contents of padding byte
  -q                 quiet output
  -Q <tclass>        use quality of service <tclass> bits
  -s <size>          use <size> as number of data bytes to be sent
  -S <size>          use <size> as SO_SNDBUF socket option value
  -t <ttl>           define time to live
  -U                 print user-to-user latency
  -v                 verbose output
  -V                 print version and exit
  -w <deadline>      reply wait <deadline> in seconds
  -W <timeout>       time to wait for response

IPv4 options:
  -4                 use IPv4
  -b                 allow pinging broadcast
  -R                 record route
  -T <timestamp>     define timestamp, can be one of <tsonly|tsandaddr|tsprespec>

IPv6 options:
  -6                 use IPv6
  -F <flowlabel>     define flow label, default is random
  -N <nodeinfo opt>  use icmp6 node info query, try <help> as argument

For more details see ping(8).

💡 说明:日常最常用的选项就是 -c、-i、-s、-W、-w、-I、-q、-D、-n 这一批,下文逐项实测;-l(preload)、-p(填充字节)、-Q(QoS 位)、-R(记录路由)等多用于专项排查,本文不展开。

2.3 版本信息

确认版本是复现本文回显的前提。ping -V 只有一行;包级别信息用 apt-cache policy 查看:

$ ping -V
ping from iputils 20211215
$ apt-cache policy iputils-ping | head -3
iputils-ping:
  Installed: 3:20211215-1ubuntu0.1
  Candidate: 3:20211215-1ubuntu0.1

💡 说明:iputils-ping 从 20211215 起随 Ubuntu 22.04 发布,若系统未预装(最小化安装的系统常见),执行 apt install iputils-ping 即可,无需额外配置。

三、参数逐项实测

3.1 基础连通测试:-c 限定次数与统计段逐行解读

ping 不带 -c 会一直发包,脚本与非交互场景无法手工 Ctrl-C,因此所有自动化用法都应以 -c 限定次数。以回环地址发 4 个探测包为例,完整回显分三段——首行声明、逐包应答、统计段:

$ ping -c 4 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.020 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.018 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.017 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3095ms
rtt min/avg/max/mdev = 0.017/0.031/0.069/0.021 ms

统计段逐行解读(这是 ping 输出里信息密度最高的部分):

  • PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.:默认 ICMP 数据部分 56 字节,加 8 字节 ICMP 头与 20 字节 IP 头共 84 字节;
  • 4 packets transmitted, 4 received, 0% packet loss, time 3095ms:发 4 收 4、丢包率 0%,time 3095ms 是从第一个包发出到最后一个包统计结束的墙钟时间(默认间隔 1 秒,4 个包约 3 秒);
  • rtt min/avg/max/mdev = 0.017/0.031/0.069/0.021 ms:往返时延(round-trip time)的最小/平均/最大/标准差(mdev)。mdev 越小说明链路越稳定;平均 RTT 是核心指标,最大值反映抖动尖峰。

💡 要点:判断链路质量不能只看 0% packet loss,要同时看 avg 与 mdev——0% 丢包但 mdev 很大,说明链路抖动明显,对实时业务(语音/视频)影响比偶发丢包更大。

3.2 -i 发包间隔(含非 root 用户实测)

-i 指定相邻两个报文的发送间隔(秒,支持小数)。默认 1 秒;改成 0.2 秒后 5 个包的总时间从约 4 秒缩短到 0.829 秒:

$ ping -i 0.2 -c 5 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.009 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.020 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.099 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.017 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.027 ms

--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 829ms
rtt min/avg/max/mdev = 0.009/0.034/0.099/0.032 ms

很多老资料说「非 root 用户 -i 小于 0.2 会报错 cannot flood; minimal interval allowed for user is 200ms」,在 Ubuntu 22.04 实测并非如此——用 nobody 用户跑 -i 0.1 成功完成(普通 ping 与小间隔各测一次):

$ cd /tmp && su -s /bin/bash nobody -c 'ping -c 2 127.0.0.1'; echo rc=$?
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.021 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1016ms
rtt min/avg/max/mdev = 0.014/0.017/0.021/0.003 ms
rc=0
$ cd /tmp && su -s /bin/bash nobody -c 'ping -i 0.1 -c 2 127.0.0.1'; echo rc=$?
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.013 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.021 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 106ms
rtt min/avg/max/mdev = 0.013/0.017/0.021/0.004 ms
rc=0

root 下 -i 0.1 自然更没有问题:

$ ping -i 0.1 -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.008 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.017 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 206ms
rtt min/avg/max/mdev = 0.008/0.013/0.017/0.004 ms

非 root 小间隔可行的机制,实测由两条内核/文件能力配置共同决定:

$ sysctl net.ipv4.ping_group_range
net.ipv4.ping_group_range = 0   2147483647
$ getcap /usr/bin/ping
/usr/bin/ping cap_net_raw=ep

💡 要点:ping_group_range = 0 2147483647 表示所有用户组都能使用内核的 ICMP Datagram Socket(无 200ms 限制),且 ping 二进制带 cap_net_raw=ep 能力位,即使没有它普通用户也能发 ICMP。把 ping_group_range 收紧为默认值 1 0(禁用)后,普通用户才可能碰到「200ms 最小间隔」的报错;遇到报错时先查这两个配置,而不是盲目 sudo。

3.3 -s 指定报文大小

-s 设置 ICMP 数据部分字节数(默认 56)。大数据包常用于验证链路 MTU 与分片行为,-s 1024 时报文总长为 1024+28=1052 字节:

$ ping -s 1024 -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 1024(1052) bytes of data.
1032 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.047 ms
1032 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.020 ms
1032 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.019 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2046ms
rtt min/avg/max/mdev = 0.019/0.028/0.047/0.013 ms

💡 要点:应答行显示 1032 bytes 是「回显的全部 ICMP 报文」大小(1024 数据 + 8 字节 ICMP 头),首行括号里的 1052 再加 20 字节 IP 头才是线路上实际占用的字节数。典型的 MTU 探测组合是 -M do -s 1472(1500 减去 28 字节头),本文环境无 MTU 受限链路,仅给出思路。

3.4 -W 单包等待超时

-W 指定等待单个应答的最长时间(秒,iputils 默认约 10 秒)。对不在线的目标配合 -W 1 可快速得出「100% 丢包」结论,而不用每包干等 10 秒:

$ ping -W 1 -c 2 172.17.0.99; echo rc=$?
PING 172.17.0.99 (172.17.0.99) 56(84) bytes of data.

--- 172.17.0.99 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1023ms

rc=1

💡 要点:目标不在线时逐包应答行完全缺失,统计段直接给 100% packet loss,退出码为 1——这是与「解析失败 rc=2」最大的区别(见 3.14)。-W 只管「等一个应答等多久」,不限制总时长;要限制总时长用 -w。

3.5 -w 总时限

-w 给整轮 ping 设定总截止时间(秒),到点立即结束并输出统计段,即使 -c 的次数还没发完。实测 -w 2(配合 -i 0.2 提高发包密度)在 2 秒整停止,只发出了 10 个包:

$ ping -i 0.2 -w 2 -c 100 127.0.0.1; echo rc=$?
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.010 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.019 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.053 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.020 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.019 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.020 ms
64 bytes from 127.0.0.1: icmp_seq=10 ttl=64 time=0.022 ms

--- 127.0.0.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 1871ms
rtt min/avg/max/mdev = 0.010/0.022/0.053/0.010 ms
rc=0

-w 也可以单独使用(不带 -c),到点自动结束,实测退出码为 0:

$ ping -w 2 127.0.0.1 >/dev/null; echo rc=$?
rc=0

💡 要点:-W 与 -w 一个管「单包等待」一个管「总时长」,监控巡检脚本推荐组合 -w 2 -c 4——无论目标是否在线,命令都会在有限时间内结束,不会挂住脚本。注意若 -w 到期时仍有包在途,不同版本对退出码的处理可能不同,判断存活请以统计段的丢包率为准,不要只依赖退出码。

3.6 -q 安静模式(只出统计)

-q 抑制逐包应答行,只保留首行与统计段,适合把输出直接写入日志或做长时观察:

$ ping -q -c 5 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4100ms
rtt min/avg/max/mdev = 0.019/0.028/0.045/0.010 ms

💡 要点:-q 与 -c/-w 是脚本场景的黄金组合——输出仅 4 行,丢包率与 RTT 统计一个不少。

3.7 -v 详细模式

-v 打开详细输出。对常规成功场景,回显与默认模式几乎一致(差异体现在异常报文的解读上,比如收到的非 Echo 报文会打印明细):

$ ping -v -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.007 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.020 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1023ms
rtt min/avg/max/mdev = 0.007/0.013/0.020/0.006 ms

对不在线的目标,-v 的回显同样与默认一致(诊断信息主要体现在统计段):

$ ping -v -W 1 -c 2 172.17.0.99; echo rc=$?
PING 172.17.0.99 (172.17.0.99) 56(84) bytes of data.

--- 172.17.0.99 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1003ms

rc=1

💡 要点:不要指望 -v 让正常输出「更详细」;它的价值在于网络异常(收到 Destination Unreachable、TTL exceeded 等非应答报文)时打印更多上下文。日常排障建议先默认模式,看不懂报错时再加 -v。

3.8 -I 绑定网卡接口或源地址

-I 后面可以跟接口名或本机 IP 地址。多网卡服务器排查「到底走哪条链路」时必用。绑定接口 eth0 ping 网关,首行会显式标注来源接口:

$ ping -I eth0 -c 2 172.17.0.1
PING 172.17.0.1 (172.17.0.1) from 172.17.0.2 eth0: 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.043 ms

--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1008ms
rtt min/avg/max/mdev = 0.043/0.044/0.045/0.001 ms

绑定源 IP 的形态(首行 from 127.0.0.1 标注源地址):

$ ping -I 127.0.0.1 -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.018 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1022ms
rtt min/avg/max/mdev = 0.016/0.017/0.018/0.001 ms

-I 与错误目标组合,可以验证「强制走指定接口」的失败形态,退出码仍为 1:

$ ping -I eth0 -W 1 -c 2 172.17.0.99; echo rc=$?
PING 172.17.0.99 (172.17.0.99) from 172.17.0.2 eth0: 56(84) bytes of data.

--- 172.17.0.99 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1022ms

rc=1

💡 要点:多网卡机器上「ping 网关 A 网段的地址通、ping B 网段不通」时,用 -I 分别绑定两块网卡即可快速定位是路由问题还是链路问题。-I 指定的源地址必须属于本机,否则直接报错。

3.9 -D 打印时间戳

-D 在每个应答行前加上 UNIX 时间戳(秒.微秒),方便事后与业务日志对齐分析:

$ ping -D -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
[1792093962.666301] 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.009 ms
[1792093963.710935] 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.015 ms
[1792093964.734918] 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2069ms
rtt min/avg/max/mdev = 0.009/0.016/0.025/0.006 ms

💡 要点:[1792093962.666301] 是 UNIX 时间戳,可 date -d @1792093962.666301 转成可读时间;两个相邻时间戳的差值就是实际发包间隔(此处约 1 秒,与默认一致),排查「ping 是否被调度延迟」时非常有用。

3.10 -n 禁用域名解析

-n 让 ping 不做 DNS 解析(不反查 IP 对应的主机名、也不解析主机名),输出更干净、更快。对公网 IP 实测,应答行直接显示 IP:

$ ping -n -c 2 223.5.5.5 | head -2
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=127 time=20.5 ms

💡 要点:当 DNS 故障时,不带 -n 的 ping 会先卡在解析阶段;-n 可以把「网络不通」和「DNS 坏了」两类问题一刀切开——ping -n <IP> 通而 ping <域名> 不通,问题就在 DNS。

3.11 -f 泛洪模式(慎用)

-f(flood ping)以极限速率发包、每收到一个应答回显一个点,用于压测链路吞吐与丢包。以下实测仅发 100 个包并配合 -q 只看统计,全程 0.003 秒间隔:

$ ping -f -q -c 100 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.001/0.001/0.044/0.004 ms, ipg/ewma 0.003/0.001 ms

统计行末尾的 ipg/ewma 是泛洪模式特有的:ipg 是平均包间隔(inter-packet gap),ewma 是指数加权移动平均 RTT。

⚠️ 注意:-f 会对目标链路造成真实压力,只允许在自己的测试环境使用,对生产设备、运营商网关、公有云目标禁用;部分企业网络也会在防火墙直接丢弃高频 ICMP。非 root 用户在泛洪模式下会触发 200ms 最小间隔限制。

3.12 -a 声音提示

-a 让 ping 在收到应答时响铃(终端铃),适合「盯着屏幕干别的、听声音判断网络是否中断」。回显与默认模式一致(声音由终端呈现,不影响文本):

$ ping -a -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.008 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.019 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1022ms
rtt min/avg/max/mdev = 0.008/0.013/0.019/0.005 ms

💡 要点:-a 在 SSH 终端上需要终端模拟器开启「铃声/通知」支持,纯文本日志里看不到任何差异;脚本场景请忽略此参数。

3.13 -6 强制 IPv6

-6 走 IPv6 协议栈,对回环地址 ::1 实测:

$ ping -6 -c 2 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.026 ms

--- ::1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1032ms
rtt min/avg/max/mdev = 0.026/0.047/0.069/0.021 ms

💡 要点:目标写成 IPv6 地址时 ping 会自动走 IPv6,-6 的意义是「强制校验协议栈」——比如排查 IPv4/IPv6 双栈解析异常时,用 ping -6 <域名> 与 ping -4 <域名> 对比两条路径。

3.14 典型故障一:名称解析失败(rc=2)

ping 一个不存在的域名,直接在解析阶段失败,连首行声明都不输出,退出码为 2:

$ ping -c 2 no-such-host.invalid; echo rc=$?
ping: no-such-host.invalid: Name or service not known
rc=2

💡 要点:Name or service not known + rc=2 说明报文还没出网就结束了,问题在 DNS/hosts 解析层,与目标主机是否在线无关。脚本判断时可据此区分「解析坏了(rc=2)」和「网络不通(rc=1)」。

3.15 典型故障二:目标不在线(100% loss,rc=1)

同网段不在线 IP 的失败形态与 3.4 相同——完整首行、零应答、统计段 100% 丢包、rc=1:

$ ping -W 1 -c 2 172.17.0.99; echo rc=$?
PING 172.17.0.99 (172.17.0.99) 56(84) bytes of data.

--- 172.17.0.99 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1023ms

rc=1

💡 要点:100% packet loss 的常见原因按概率排序:目标主机关机/宕机 → 防火墙丢弃 ICMP(ping 不通但服务可能正常)→ 路由不可达。ping 只能证明「ICMP 层不通」,不能证明服务不可用,最终以应用层探测(如 curl)为准。

3.16 公网连通与 TTL 判读

对公网 IP(阿里公共 DNS 223.5.5.5)实测,重点看 TTL 与 RTT 的量级变化:

$ ping -c 3 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=127 time=20.4 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=127 time=20.0 ms
64 bytes from 223.5.5.5: icmp_seq=3 ttl=127 time=20.4 ms

--- 223.5.5.5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 20.045/20.256/20.370/0.149 ms

对公网域名实测,可观察 CNAME 解析过程(www.baidu.com → www.a.shifen.com):

$ ping -c 2 www.baidu.com
PING www.a.shifen.com (110.242.69.21) 56(84) bytes of data.
64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=1 ttl=127 time=26.2 ms
64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=2 ttl=127 time=26.0 ms

--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 26.044/26.128/26.212/0.084 ms

TTL(Time To Live)判读方法:TTL 是 IP 包的「剩余转发跳数」,每经过一个三层设备减 1,减到 0 即丢弃。常见操作系统初始值为 64(Linux/Unix)与 128(Windows/部分网络设备)。因此:

  • 回环、局域网回显 ttl=64:Linux 默认初始 64,一跳未减(同网段直连);
  • 公网回显 ttl=127:可反推对端初始 TTL=128、途中只减了 1(或经 NAT/负载均衡设备转发);同理,看到 ttl=52 可推断初始 64、经过了 12 跳;
  • 若 TTL 值异常接近初始值但 RTT 很大,说明物理路径远但逻辑跳数少(常见于专线/NAT 集中转发)。

💡 要点:TTL 判读只能「反推初始值 + 估算跳数」,不能精确等于路径长度;要精确看每一跳,请用 mtr/traceroute(见第一章技术拓展表)。

四、实战示例

4.1 脚本中判断目标存活(退出码法)

利用退出码 0/1/2 的语义做分支,是最可靠的存活判断写法。实测网关存活时的分支行为:

$ ping -c 1 172.17.0.1 >/dev/null && echo gateway-alive; echo rc=$?
gateway-alive
rc=0

要点:ping -c 1 只发一个包、成败立即返回,配合 -W 1 兜底「等待上限」,是巡检脚本探测单目标的标准姿势。

4.2 三级连通性体检:回环 → 网关 → 公网

网络排障按「由近及远」逐级收缩范围,一次定位问题层级:

$ ping -q -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1016ms
rtt min/avg/max/mdev = 0.014/0.017/0.021/0.003 ms

$ ping -q -c 2 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.

--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.039/0.056/0.084/0.019 ms

$ ping -q -c 2 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.

--- 223.5.5.5 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 20.045/20.256/20.370/0.149 ms

解读规则:回环失败 → 本机协议栈异常;网关失败 → 内网链路/交换问题;公网 IP 失败 → 出口路由/运营商问题;公网 IP 通而域名不通 → DNS 问题(配合 3.10 的 -n 与 3.14 的 rc=2 交叉验证)。

4.3 大包验证链路 MTU

用 -s 逐档加大报文,探测链路能承载的最大不分片报文,定位「小包通、大包断」的 MTU 问题:

$ ping -c 2 -s 1024 172.17.0.1 | head -4
PING 172.17.0.1 (172.17.0.1) 1024(1052) bytes of data.
1032 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.084 ms
1032 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.045 ms

要点:公网标准以太网 MTU 1500,对应 -s 上限 1472;若 1472 通 1473 断,说明链路 MTU 就是 1500(超出部分必须分片)。VPN/PPPoE 场景常见 MTU 1492(对应 -s 1464)。

4.4 带时间戳的持续观察

-D 给每个应答行打上 UNIX 时间戳,适合把 ping 挂到后台长时间观察,输出直接进日志:

$ ping -D -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
[1792093962.666301] 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.009 ms
[1792093963.710935] 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.015 ms
[1792093964.734918] 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms

要点:时间戳列可以直接和监控告警、应用日志的时间轴对齐,是「网络抖动归因」的第一手证据;实战中把输出重定向到文件长期采集即可(如 ping -D -c 1000 172.17.0.1 > /var/log/ping-watch.log)。

五、注意事项与常见问题

Q1:为什么手工 Ctrl-C 能看到统计段,脚本里用 timeout 停止就看不到? Ctrl-C 发送的是 SIGINT,ping 捕获后会打印统计段再退出;而 timeout 默认发送 SIGTERM,实测 ping 直接退出、不打印统计段,timeout 自身返回 124:

$ timeout 2 ping 127.0.0.1; echo rc=$?
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.023 ms
rc=124

结论:非交互场景一律用 -c 或 -w 控制结束,不要依赖信号。

Q2:非 root 用户能用 ping 吗?-i 0.1 会报 200ms 限制吗? Ubuntu 22.04 实测都能用(见 3.2):系统默认 net.ipv4.ping_group_range = 0 2147483647 放开了 ICMP Datagram Socket 权限,且 /usr/bin/ping 带 cap_net_raw=ep 能力位。若在其他环境遇到 ping: socket: Operation not permitted 或 cannot flood; minimal interval allowed for user is 200ms,先检查这两项配置,而不是急着加 sudo。

Q3:ttl=64 和 ttl=127 到底怎么看? 见 3.16 的判读方法:用「常见初始值 64/128」减去回显 TTL 得到大致跳数;跳数明显偏小而 RTT 偏大时,通常意味着路径上有 NAT/LB 设备转发。

Q4:ping 不通是不是服务就挂了? 不一定。大量生产环境会禁用 ICMP(防火墙 DROP Echo Request/Reply),此时 ping 100% 丢包但 HTTP/SSH 等服务完全正常。ping 通也不是服务可用的证明。正确姿势:ping 定性网络层,curl -I http://<host>:<port> 或 timeout 3 bash -c '</dev/tcp/<host>/<port>' 验证传输层/应用层。

Q5:-f 泛洪有什么风险? -f 以最快速率灌包(实测 100 个包平均间隔仅 0.003 秒,见 3.11),对低带宽链路、嵌入式设备、生产网关可能造成真实业务影响甚至触发安全策略封禁。仅限自有测试环境短时使用,务必限定 -c 次数。

Q6:退出码 1 和 2 怎么区分使用? rc=2 = 目标名都没解析出来(DNS/hosts 问题,报文未出网);rc=1 = 报文发出去了但没收到(或未全部收到)应答。两类问题处理路径完全不同:前者查解析,后者查路由/防火墙/对端状态。

Q7:ping 输出里的 56(84) bytes 是什么? 56 是 ICMP 数据部分字节数(-s 的默认值),括号里的 84 是加上 8 字节 ICMP 头与 20 字节 IPv4 头后的线路上总长度;-s 1024 时对应 1024(1052),见 3.3。

六、参考链接