ping - 诞生于潜艇声呐的命令
排查网络故障时你运行的第一个命令:ping。它的名字来源于潜艇声呐 (声学测深仪) 发出的"ping"声。就像声呐发出声波并通过计时反射波的返回来测量距离一样,ping 发送数据包并通过计时响应来测量网络可达性和延迟。
ping 的诞生 - Mike Muuss 1983 年的通宵之作
ping 由美国陆军弹道研究实验室 (BRL) 的工程师 Mike Muuss 于 1983 年 12 月编写。在调查一次网络故障时,Muuss 意识到"没有简单的工具来检查数据包是否到达目的地",于是在一个晚上实现了 ping。
正如 Muuss 后来回忆的,这个名字的灵感来自潜艇声呐。"发送数据包并等待反射"的操作类似于声呐,所以他直觉地将其命名为"ping"。有些资料声称它代表"Packet InterNet Groper",但 Muuss 否认了这一说法,称其为逆向缩写 (事后构造的缩写)。
ICMP - ping 背后的协议
ping 使用 ICMP (Internet Control Message Protocol) 的 Echo Request 和 Echo Reply 消息。与 TCP 或 UDP 不同,ICMP 不是为数据传输设计的,而是用于网络控制和诊断。
ping 的操作很简单:
- 源端向目的地发送 ICMP Echo Request 数据包
- 目的地收到数据包后发回 ICMP Echo Reply
- 源端测量往返时间 (RTT)
这个 RTT 就是你在 IP 确认上可以观察到的网络延迟的基本指标。从东京到美国西海岸的 ping 通常约 100-120 毫秒,到欧洲约 200-250 毫秒。这些延迟大部分是光在海底光缆中传播的物理时间。
ping 能告诉你什么和不能告诉你什么
能告诉你的
- 可达性:目标主机在网络上是否可达
- RTT (往返延迟):数据包往返的时间。让你感受网络"距离"
- 丢包率:发送的数据包中没有收到响应的百分比。网络质量指标
- TTL (生存时间):可以估算数据包经过了多少路由器。用初始值 (通常为 64 或 128) 减去响应 TTL 即可得到跳数
不能告诉你的
- 带宽:ping 只发送微小的数据包 (通常 64 字节),无法测量实际连接速度
- 服务状态:即使 ping 得到响应,Web 服务器或应用程序也可能没有正常运行
- 精确路由:ping 无法显示数据包经过了哪些路由器 (那是
traceroute的工作)
没有响应不一定意味着故障
当 ping 没有得到响应时,目标不一定是宕机了。许多服务器和防火墙出于安全原因故意阻止 ICMP Echo Request。
- Windows 防火墙:默认配置为阻止 ICMP Echo Request
- 云提供商:AWS 安全组除非明确允许,否则阻止 ICMP
- DDoS 防护:许多网络对 ICMP 进行速率限制或阻止,以防止使用大量 ICMP 数据包的 Ping Flood 攻击
如果 ping 不通,可以尝试用 curl 或 telnet 连接特定端口,或使用 traceroute 查看能到达多远。
ping 衍生的命令
- traceroute / tracert:显示到目的地路径上每个路由器的 IP 地址和延迟。发送 TTL 递增的 ICMP 并记录每一跳的响应
- mtr (My Traceroute):结合了 ping 和 traceroute。持续实时显示每一跳的延迟和丢包率
- fping:可以同时向多个主机发送 ping。用于大规模网络监控
- hping:高级版本,可以使用 TCP、UDP 和 ICMP 等任何协议发送数据包。也用于防火墙测试和端口扫描
Mike Muuss 的后来
ping 的创造者 Mike Muuss 也是 BRL-CAD (开源 3D CAD 系统) 的开发者。遗憾的是,他于 2000 年 11 月在一场交通事故中去世,年仅 42 岁。
他在一个晚上写出的工具,40 多年后仍然被全世界的网络工程师每天使用。简单、可靠、通用,这或许就是优秀软件的理想形态。