Skip to main content

ping

1. 工具概述​

  • 工具类型: CLI命令行
  • 系统平台: Windows、Linux、macOS 都自带
  • 核心功能: ping 向目标地址发送 ICMP Echo 请求,用有没有回包、往返要多久、丢了多少,判断到目标的连通性和线路质量。

Windows 上它是系统组件;Linux、macOS 上命令同名,默认行为和参数含义并不相同。下文以 Windows 为主,Linux 的差异单独列出。

2. 功能描述​

  1. 判断本机到目标 IP/域名是否通
  2. 测量往返延迟(RTT)
  3. 统计这一轮探测的丢包率
  4. 从回包的TTL粗看对端大概是哪一类系统
  5. 通过域名解析对应的IP地址

注意:ping 只证明有人愿意回 ICMP。很多服务器、防火墙直接丢掉 Echo 请求,此时超时不代表网站、SSH 或业务一定挂了。它也看不到中间经过哪些路由,那是 tracert 的事。

3. 实现原理​

ping 不改路由,只发一种探测包:

  1. 本机发出 ICMP Echo Request(请求回显)。
  2. 目标主机收到后,回一个 ICMP Echo Reply(回显应答)。请求和应答靠标识符、序号配对。
  3. 从发出到收到应答的时间就是 time / RTT。这个时间包含去程和回程,不是单程延迟。
  4. 默认 Windows 发 4 个包后停止;Linux、macOS 会一直发,直到 Ctrl + C。

输出里的 TTL 是回包剩下的跳数,不是本机发出去的那个请求包。请求包的 TTL 只决定它能不能走到对端,不会打印出来。对端是 Linux 服务器时,回包通常从 64 起跳,沿回程每过一台路由器减 1。所以看到 TTL=52,只能说明回程大约走了 12 跳,不能拿它和 tracert 的去程跳数对齐——往返路径经常不对称。 常见的两种失败不要混:

  • Request timed out(Linux 上则是统计里的 100% packet loss,中间没有任何应答行):等待窗口内既没有回显应答,也没有路由器的差错报文。
  • Destination host unreachable:本机或沿途设备明确回答「到不了」。局域网里常见原因是网关找不到该主机的 MAC;公网上则是某台路由器回了目的不可达。

4. 工具用法​

4.1. 基础格式​

Windows 打开 CMD 或 PowerShell:

ping 目标地址

示例:

ping www.baidu.com

Pinging www.a.shifen.com [180.101.49.44] with 32 bytes of data:
Reply from 180.101.49.44: bytes=32 time=9ms TTL=52
Reply from 180.101.49.44: bytes=32 time=8ms TTL=52
Reply from 180.101.49.44: bytes=32 time=10ms TTL=52
Reply from 180.101.49.44: bytes=32 time=10ms TTL=52

Ping statistics for 180.101.49.44:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 8ms, Maximum = 10ms, Average = 9ms
<!-- 本地到 www.baidu.com 的链路是否可达 -->
ping www.baidu.com
<!-- 本地到 223.5.5.5 的链路是否可达 -->
ping 223.5.5.5
<!-- 本地回环,可以查看本机默认TTL值 -->
ping 127.0.0.1

默认发 4 个包,每个载荷 32 字节,单个应答最多等 4000 毫秒。

4.2. 常用参数(Windows)​

ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-w timeout] [-4] [-6] target_name
参数作用
-t一直 ping,直到 Ctrl + C。停下来时会补打丢包和延迟统计
-n发送个数,默认 4。例如 ping -n 20 www.baidu.com
-w单次等待应答的超时(毫秒),默认 4000
-l载荷长度(字节),默认 32。加大后可顺便观察大包是否被丢
-f设置禁止分片(仅 IPv4)。包长超过路径 MTU 时会被拒,而不是悄悄拆包
-i指定请求包的 TTL。输出里看到的仍是回包 TTL
-a把 IP 反查成主机名,会慢一些
-4强制 IPv4
-6强制 IPv6

高频命令:

ping -n 20 -w 1000 www.baidu.com
ping -t 223.5.5.5
ping -f -l 1472 www.baidu.com

第三条用来估路径 MTU。1472 字节载荷 + 8 字节 ICMP 头 + 20 字节 IPv4 头 = 1500,正好是以太网常见 MTU。能通,说明这一档过得去;若返回 Packet needs to be fragmented but DF set,把 -l 调小再试。

4.3. Linux / macOS 参数对照​

同名参数含义经常是反的,不能把 Windows 命令原样贴过来:

想做的事WindowsLinux(iputils)
只发若干个-n 4(默认就是 4)-c 4(不加会一直发)
一直发-t默认就是一直发,Ctrl + C 结束
设置请求包 TTL-i 128-t 64
发送间隔固定约 1 秒-i 0.2(单位秒)
单包超时-w 1000(毫秒)-W 1(秒)
载荷长度-l 1472-s 1472
禁止分片-f-M do

因此在 Linux 上:

  • ping -t www.baidu.com 不会持续发送。-t 要跟一个 TTL 数字。
  • ping -i 128 目标 是每 128 秒发一个包,不是把 TTL 设为 128。
ping -c 4 www.baidu.com
ping -c 20 -W 1 www.baidu.com
ping -M do -s 1472 -c 3 www.baidu.com

macOS 的 ping 接近 Linux,个别参数的时间单位以本机 man ping 为准。

4.4. 示例解读​

# 示例1:Windows 默认参数
PS C:\Users\Lenovo> ping www.baidu.com

Pinging www.a.shifen.com [180.101.51.73] with 32 bytes of data: # 域名 CNAME 到 www.a.shifen.com,本次解析 IP 为 180.101.51.73,载荷 32 字节
Reply from 180.101.51.73: bytes=32 time=12ms TTL=52 # 第 1 个应答:往返 12ms;TTL=52 是回包剩余值(对端从 64 出发,回程被减过)
Reply from 180.101.51.73: bytes=32 time=11ms TTL=52
Reply from 180.101.51.73: bytes=32 time=10ms TTL=52
Reply from 180.101.51.73: bytes=32 time=11ms TTL=52

Ping statistics for 180.101.51.73:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), # 4 发 4 收,这轮没有丢包
Approximate round trip times in milli-seconds:
Minimum = 10ms, Maximum = 12ms, Average = 11ms # 最小 / 最大 / 平均 RTT,抖动很小
# 示例2:同一目标在 WSL 的 Ubuntu 里。-c 4 对齐 Windows 的默认次数
$ ping -c 4 www.baidu.com

PING www.a.shifen.com (180.101.49.44) 56(84) bytes of data. # 56 字节载荷;括号里的 84 = 20 字节 IP 头 + 8 字节 ICMP 头 + 56
64 bytes from 180.101.49.44: icmp_seq=1 ttl=51 time=9.31 ms # icmp_seq 是序号;ttl=51 比上面 Windows 的 52 少 1
64 bytes from 180.101.49.44: icmp_seq=2 ttl=51 time=9.89 ms # WSL2 默认 NAT,回包进虚拟网卡时多减一跳,不是对端初始 TTL 变了
64 bytes from 180.101.49.44: icmp_seq=3 ttl=51 time=33.0 ms # 这一包明显偏慢,看统计里的 max,不要只看平均值
64 bytes from 180.101.49.44: icmp_seq=4 ttl=51 time=10.6 ms

--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 9.306/15.693/32.988/9.995 ms # mdev 是 RTT 的波动。平均值被第 3 包拉高,线路并不如 9ms 那么稳

Linux 默认打印的是 64 bytes,因为 56 字节载荷加上 8 字节 ICMP 头;Windows 默认打印 bytes=32,两边的「包有多大」不是同一个数。

4.5. 排障思路​

按这个顺序缩小范围,不要一上来就 ping 域名:

  1. ping 127.0.0.1 失败:本机 TCP/IP 协议栈异常,还没到网卡和运营商。
  2. 回环通、网关不通:问题在本机地址、网线、Wi-Fi 或光猫。网关一般是本网段的 .1。
  3. 网关通、ping 223.5.5.5 这类公网 IP 不通:出网或运营商这一段有问题。用 IP 是为了绕开 DNS。
  4. 公网 IP 通、域名不通:多半是 DNS。Ping request could not find host(Linux 上是 Name or service not known)就是名字没解析出来,不是链路丢包。
  5. 域名也通,但延迟突然升高或出现丢包:再用 tracert 看是从哪一跳开始变差。
  6. ping 超时,浏览器却打得开:对端或中间设备禁了 ICMP,业务本身可能是好的。

丢包要看次数。默认 4 个包里掉 1 个就是 25%,样本太小;确认抖动和丢包时用 -n 20 或 -c 20 以上。

5. 与 tracert 的区别​

  • ping:只测到目标这一端。能看通不通、往返延迟和丢包率,中间路由器不出现。
  • tracert:TTL 从 1 往上加,逐跳列出路径,用来找是哪一跳开始超时或延迟突增。每一跳默认只有 3 个探测,丢包比例没有 ping 打几十个包看得稳。