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 的操作很简单:

  1. 源端向目的地发送 ICMP Echo Request 数据包
  2. 目的地收到数据包后发回 ICMP Echo Reply
  3. 源端测量往返时间 (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 不通,可以尝试用 curltelnet 连接特定端口,或使用 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 多年后仍然被全世界的网络工程师每天使用。简单、可靠、通用,这或许就是优秀软件的理想形态。

相关术语

IP 地址 互联网上设备的标识符,作为 ping 的目标指定。 延迟 ping 测量的 RTT (往返时间) 背后的基本概念。取决于物理距离和网络设备处理时间。 防火墙 可配置为阻止 ICMP,从而阻止 ping 响应。出于安全原因被广泛采用。 DNS 在 ping 中指定主机名时,首先通过 DNS 解析为 IP 地址。DNS 延迟包含在 RTT 中。 ISP ping 数据包经过的第一个网络。ISP 质量直接影响 ping 结果。