跳转到内容

ping

ping 用于测试与目标主机的连通性和往返时延。它发的是 ICMP Echo Request,等对方回 Echo Reply。

Terminal window
ping [选项] 目标

目标可以是域名或 IP Linux 上默认一直发到 Ctrl-C,中断时打印统计汇总

ICMP 是网络层协议,不经过 TCP 或 UDP,压根没有端口这个概念。由此推出两条实际结论:

  • ping 通,只说明网络层可达。具体某个服务能不能连要看端口:ss -tln 看本机监听,nc -zv 主机 端口 测对端,见 ss
  • ping 不通,说明不了主机是死是活。大量主机和防火墙默认丢弃 ICMP,这是常规安全策略

也就是说,这条命令的两个结果分量并不对等:通了能确认一部分,不通几乎什么都确认不了。

一次典型输出:

PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=12.3 ms
64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=11.9 ms
--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 11.8/12.4/13.1/0.5 ms
字段 含义
icmp_seq 序号,跳号就是丢包
ttl 剩余跳数,能粗略反推中间经过了几个路由
time 单次往返时延(RTT)
packet loss 丢包率,判断线路质量比看时延更靠谱
mdev 时延的平均偏差,也就是抖动
选项 说明
-c <次数> 发够指定个数就停,脚本里必加
-i <秒> 发包间隔,默认 1 秒,小于 0.2 秒需要 root
-w <秒> 总时限,到点就停
-W <秒> 单个回应的等待超时
-s <字节> 数据部分大小,默认 56,加上 28 字节头部即为实际包长
-n 不做反向域名解析,输出更快也更干净
-4 / -6 强制走 IPv4 / IPv6
-M do 禁止分片,配合 -s 探测路径 MTU
-f 洪泛模式,需要 root,只对自己的设备用

1. 基本测试

Terminal window
ping -c 4 example.com
ping -c 4 -n 8.8.8.8

脚本里一定要给 -c 或 -w,否则会一直跑下去

2. 分清是网络的问题还是 DNS 的问题

Terminal window
ping -c 2 8.8.8.8 # 直接打 IP
ping -c 2 example.com # 打域名

前者通、后者不通,问题在 DNS,不在网络 两个都不通才是网络层的事

3. 盯一段时间的线路质量

Terminal window
ping -i 0.5 -w 300 10.0.0.5

看的是丢包率和 mdev,不是某一次的 time 时延高但稳定,通常只是距离远;时延忽高忽低才说明线路有问题

4. 探测路径 MTU

Terminal window
ping -c 1 -M do -s 1472 10.0.0.5

1472 + 28 字节头部 = 1500,能通说明整条路径的 MTU 至少是 1500 回 Frag needed 就把 -s 调小再试,二分几次就能找到实际值

5. ping 通不等于服务可用

Terminal window
ping -c 1 10.0.0.5 # 通
nc -zv 10.0.0.5 3306 # 端口却连不上

服务没起、只监听了 127.0.0.1、防火墙拦了端口,都是 ping 看不出来的 查监听地址用 ss -tlnp