|
打开终端,统何敲下 ping 8.8.8.8,地址回车。统何屏幕上开始一行行跳出响应,地址每行末尾的统何 time= 后面跟着一个毫秒数。这就是地址 Linux 下最直接的连通性测试——没有图形界面那些花哨的按钮,一条命令,统何数据包发出去,地址对面回不回应,统何立刻见分晓。地址 但很多人第一次用的统何时候会卡住:ping 一个域名,比如 ping www.baidu.com,地址终端里显示的统何却是一个 IP 地址,然后才跟着正常的地址响应行。这不是统何错误。ping 在后台调用 DNS 解析,把域名翻译成 IP,再往那个地址发包。如果 DNS 配置有问题,你会看到 ping: www.baidu.com: Name or service not known,这时候问题不在网络层,而在解析环节。 不带参数就是最常用的方式 默认情况下,ping 会一直发下去,直到你按 Ctrl+C 手动停掉。停下来的时候会给出统计摘要——发了多少个包、收回来多少个、丢包率、最小/平均/最大往返时间。我习惯先让它跑个五六秒,看丢包率是不是零,再看延迟稳不稳定。偶尔一两个包丢了不用太紧张,尤其是走无线的时候;但如果丢包率超过百分之几,或者延迟忽高忽低跳得厉害,那就得查查中间链路了。 有个细节:ping 默认每隔一秒发一个包。你看到的第一行响应不一定对应第一个发出的包,因为终端输出有缓冲,而且第一个包的 RTT 往往比后续略高——ARP 解析、路由查找这些开销都算在里面了。 控制发包数量和频率 不想让它一直跑,加 -c 参数指定次数: ping -c 4 192.168.1.1 发四个包就停。这在脚本里特别有用,比如写个健康检查,判断某台机器是否可达,四个包足够说明问题,又不会拖太久。要是嫌默认一秒的间隔太长,用 -i 改间隔,比如 -i 0.2 就是每 200 毫秒发一个。普通用户权限下间隔不能低于 0.2 秒,想更快就得 sudo——这是内核层面的限制,防止有人拿 ping 当洪水攻击工具使。 还有个参数我用得不少:-W,设置等待响应的超时时间,单位是秒。ping -c 2 -W 1 10.0.0.1 意思是最多等一秒,没回应就认为这个包丢了。默认超时通常够用,但在一些延迟很高的跨境链路上,适当放宽 -W 能避免误判。 指定源接口和包大小 机器上有多张网卡的时候,ping 默认走哪张?答案是路由表说了算。但你可以强制指定: ping -I eth1 10.10.0.1 这样数据包就从 eth1 出去。调试多网卡环境下的策略路由时,这个参数能帮你快速验证某条路径通不通。-I 后面也可以跟源 IP 地址,效果类似。 包大小用 -s 控制。默认是 56 字节的数据,加上 ICMP 头部 8 字节和 IP 头部 20 字节,总共 84 字节的帧在跑。有人想测试 MTU 问题,会把 -s 设成 1472,加上 28 字节的头部刚好 1500,这是以太网的标准 MTU。如果 1472 能通而 1473 不通,说明路径上某个环节的 MTU 就是 1500,没跑了。 IPv6 怎么办 直接 ping 一个 IPv6 地址,很多发行版会提示你改用 ping6。不过现在较新的系统里,ping 本身已经能识别地址族了——你给它一个 fe80::1 或者 2001:db8::1,它自己会切到 IPv6 模式。如果不行,那就老老实实用 ping6,参数基本一致。 IPv6 的链路本地地址有个坑:必须指定出口接口,比如 ping6 fe80::1%eth0,那个百分号后面的 eth0 不能省。少了它,内核不知道往哪个接口发,直接报错。 别忽略那些错误信息 Destination Host Unreachable 和 Request timeout 是两码事。前者通常意味着本地路由表里没有到达目标的路由,或者 ARP 解析失败了——包根本没发出去。后者是包发出去了,但没收到回应,可能被防火墙拦了,也可能对面确实不在线。看到 Network is unreachable 就更直接了,路由表里连默认网关都没有。 我碰到过一次诡异的情况:ping 外网 IP 通,ping 域名不通。查了半天发现 /etc/resolv.conf 被某个网络管理工具覆盖成了空的。所以 ping 不通的时候,先分清楚是网络层的问题还是解析层的问题,能省不少排查时间。 ping 这个工具简单到几乎不需要看手册,但真要把它的输出读明白,把参数用对地方,还是得在具体场景里摸爬滚打几回。下次网络出问题,别急着开浏览器,先敲一行 ping,答案往往就在那几行输出里。 |