ping
ping 用于测试与目标主机的连通性和往返时延。它发的是 ICMP Echo Request,等对方回 Echo Reply。
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 ms64 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 3005msrtt 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. 基本测试
ping -c 4 example.comping -c 4 -n 8.8.8.8脚本里一定要给
-c或-w,否则会一直跑下去
2. 分清是网络的问题还是 DNS 的问题
ping -c 2 8.8.8.8 # 直接打 IPping -c 2 example.com # 打域名前者通、后者不通,问题在 DNS,不在网络 两个都不通才是网络层的事
3. 盯一段时间的线路质量
ping -i 0.5 -w 300 10.0.0.5看的是丢包率和 mdev,不是某一次的 time 时延高但稳定,通常只是距离远;时延忽高忽低才说明线路有问题
4. 探测路径 MTU
ping -c 1 -M do -s 1472 10.0.0.51472 + 28 字节头部 = 1500,能通说明整条路径的 MTU 至少是 1500 回
Frag needed就把-s调小再试,二分几次就能找到实际值
5. ping 通不等于服务可用
ping -c 1 10.0.0.5 # 通nc -zv 10.0.0.5 3306 # 端口却连不上服务没起、只监听了 127.0.0.1、防火墙拦了端口,都是 ping 看不出来的 查监听地址用
ss -tlnp