什么是 Ping?一文读懂网络诊断工具 Ping 的工作原理

Ping 是什么、如何基于 ICMP 工作、RTT 和丢包怎么算,以及国内网络环境下 Ping 不通的原因与排查方法,本文一次讲清。

Dig Trace 团队Dig Trace 团队· 网络工程团队3 分钟阅读
什么是 Ping?一文读懂网络诊断工具 Ping 的工作原理

Ping 是最常用的网络诊断工具,用来测试目标主机是否可达,并测量数据包往返一次所需的时间(RTT)和丢包率。几乎所有操作系统都内置了这个命令,网络出问题时,它往往是工程师敲下的第一条指令。

很多人以为 Ping 是一种协议,其实它是一个用户态程序,底层依赖 ICMP(互联网控制报文协议)。ICMP 是 IP 协议的配套协议,工作在网络层,专门负责传递错误报告和诊断信息。Ping 的名字来自声呐术语:发出一声脉冲,靠回声判断目标的位置和距离。1983 年诞生于 BSD UNIX 的这个工具,如今已是每个 TCP/IP 协议栈的标准组成部分。

Ping 是如何工作的?

当你在终端输入 ping example.com,系统会构造一个 ICMP Echo Request(类型 8)报文,里面包含进程标识符、递增的序列号、时间戳和一小段数据,计算校验和后封装进 IP 数据包发送出去。整个过程不经过传输层,没有端口的概念,所以非常轻量。

目标主机的内核收到报文后,会自动构造一个 Echo Reply(类型 0),交换源和目的地址后原路返回。源主机收到回应后,用「当前时间减去发送时间」算出 RTT,并根据报文中的标识符和序列号把每个回复和请求一一配对。如果超时收不到回复,就显示「请求超时」。

测试结束后,Ping 会输出统计结果:发送了多少个包、收到多少、丢包率多少,以及 RTT 的最小值、平均值、最大值。这些数字不仅说明主机是否在线,还反映了路径是否稳定。

怎么使用 Ping?

Linux 和 macOS 上最简单的用法是直接跟一个域名或 IP:

# 向 baidu.com 发送数据包,默认每秒一次,持续发送
ping baidu.com

典型输出大致是这样:

PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from baidu.com (110.242.68.66): icmp_seq=1 ttl=52 time=23.4 ms
64 bytes from baidu.com (110.242.68.66): icmp_seq=2 ttl=52 time=22.8 ms
64 bytes from baidu.com (110.242.68.66): icmp_seq=3 ttl=52 time=23.1 ms

--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms

Windows 默认只发 4 个 32 字节的包,而 Linux 持续发送 64 字节的包。常用参数可以控制行为,比如 -c 指定包数量,-s 指定包大小,-i 指定间隔:

# 只发 5 个包,每个 1000 字节,用于测试大包传输
ping -c 5 -s 1000 baidu.com

如果想不打开终端直接测试,也可以使用 Dig Trace 的在线 Ping 工具,从多个节点发起测试。

Ping、Traceroute 和端口检测有什么区别?

Ping 回答的是一个二元问题:目标可达吗?多快?但它不显示数据包走了哪条路。要看路径,需要用 Traceroute,它通过递增 TTL 字段让每一跳路由器返回 ICMP Time Exceeded 报文,从而逐跳绘制出完整路线。实践中管理员通常把两者结合:先 Ping 确认端到端状态,再用 Traceroute 定位故障出在哪一段。

还有一种「TCP Ping」,即通过向特定端口发起连接来测量延迟。它和真正的 Ping 不一样:测试的是某个应用端口是否可达,而不是底层的 IP 连通性。

为什么 Ping 不通,但网络其实是通的?

这是国内网络环境里最常见的误区。出于安全考虑,运营商骨干、云平台安全组和企业网关经常默认拦截 ICMP Echo Request。结果是 TCP 端口能访问,Ping 却显示超时。Ping 不通并不等于服务挂了。

遇到 Ping 不通的情况,先别下结论。用 telnetnccurl 验证一下业务端口,可能服务一切正常。

# 用 TCP 方式验证 443 端口是否可达
curl -sv --connect-timeout 5 https://example.com
# 或者用 nc 测试端口
nc -zv example.com 443

反过来,禁用 Ping 可以让主机在扫描中更隐蔽,但会带来副作用。路径 MTU 发现(PMTUD)等机制依赖某些 ICMP 报文,一刀切地封禁 ICMP 可能引发莫名其妙的传输问题。更好的做法是按 ICMP 类型精细控制,而不是全部禁掉。防火墙这块可以进一步阅读防火墙的工作原理

Ping 之外,值得了解的细节

IPv4 和 IPv6 下的 Ping 原理完全相同,区别在于 IPv6 用 hop limit 替代了 TTL,命令通常是 ping6ping -6。企业级网络设备还支持 icmp-reply fast 这类快速回复功能,把回应报文的处理交给转发平面,降低测量误差。

Linux 内核甚至可以用一个参数直接开关 Echo 响应:

# 临时禁用本机对所有 Echo Request 的响应
sysctl -w net.ipv4.icmp_echo_ignore_all=1

# 重新启用
sysctl -w net.ipv4.icmp_echo_ignore_all=0

想了解 IP 地址本身的结构和分配方式,或参考维基百科对 Ping 的介绍华为官方的 Ping 基本原理文档

在网络排错的工具箱里,Ping 是起点而不是终点。先用它判断连通性和延迟,再用 Traceroute 追路径,用 TCP 工具验证端口,三层递进才能快速定位问题。理解了 Ping,后面的网络诊断技能都会顺理成章。