ping是什么意思?ping不通却不耽误上网,我拿32个字节实测四台服务器才搞明白

排查网络故障,十个人有九个第一步敲 ping。可这命令到底在干什么,为什么有的服务器永远 ping 不通、网却好端端的?我前几天手痒,用 python 手搓了 32 个字节的包发出去,把 223.5.5.5、119.29.29.29、自家网站、114.114.114.114 挨个 ping 了一遍,才把这事儿彻底弄明白。
ping是喊山,不是打电话
ping 这个词是从潜艇声呐来的:发一声「乒」,听回声算距离。网络上的 ping 一模一样——你的电脑发一个小包过去,对方原样抄送回来,一来一回的时间就是你俩之间的网络快慢。它俩之间不需要建立任何连接,发完就完,谁也不欠谁。
它走的是 ICMP 协议,不属于 TCP 和 UDP 任何一家的门。所以严格说 ping 不占端口、没有握手,就是个最原始的「你活着吗」「我活着」的对暗号。Windows 默认每次发 32 字节,Linux 默认 56 字节,四个一组,这就是为什么你看到的回复里永远写着「字节=32」。
我手搓的那段代码说白了就三步:拼一个「回显请求」的包发出去,蹲在门口等「回显应答」,掐表。发到 223.5.5.5(阿里公共DNS)的结果是这样的:
来自 223.5.5.5 的回复: 字节=32 时间=13ms TTL=113来自 223.5.5.5 的回复: 字节=32 时间=12ms TTL=113
十三毫秒,四发四收。一行回复里其实塞了三四个信息,下面挨个拆。
回复里那串数,每个都在说话
「时间」最好懂,就是往返耗时。1ms 以内是屋里的事,几毫秒到几十毫秒是省内,上百毫秒基本出了省或出了海,具体分档我在这篇游戏延迟里画过尺子。我家 ping 路由器网关常年 1ms,ping 223.5.5.5 大概 10ms 上下,这俩数健康,家里到运营商这段就是通的。
真正藏信息的是 TTL。它是「寿命」的意思——包每路过一台路由器,这个数就减 1,减到 0 路由器就把包扔了,不许一个包在网上永远流浪。所以你收到的 TTL,等于「出发时的初始值」减去「路上一共过了几台路由器」。
初始值看对方的操作系统:Windows 出厂 128,Linux 和 macOS 出厂 64,不少网络设备是 255。我那轮实测正好凑齐三种:223.5.5.5 回 TTL=113,113 是 128 减 15,说明对面是台 Windows 机器、中间过了 15 跳;119.29.29.29(腾讯DNS)回 51,64 减 51 是 13 跳;自家网站回 46,走了 18 跳。同一次 ping 里 TTL 应该稳定不变,要是忽大忽小,说明包每次走了不同的路——路由器按路由表挑路,路堵了会换道,这不是错觉。
顺带说一句,看到 TTL=57 或 63 这种贴近 64 的,别猜是几跳,人家可能就在同城;TTL 掉到 30 上下,路就相当远了。这个数还能反过来用:有回服务器换机房,我就是靠 ping 出来的 TTL 从 49 变成 117,确认流量已经切到新机房——跳数少了大半,位置肯定换了。
「时间」和包大小还能搭着用。平时那 32 字节是小石子,ping 大包才是扔砖头——把包撑到 1472 字节再发,路上哪段线路接得虚、哪根水晶头压得松,大包一过就露馅。为什么偏偏是 1472?因为 1500 的车厢装完 20 字节 IP 头加 8 字节 ICMP 头,剩下的载荷正好这么大,这数我在MTU 那篇里算过账。小包通大包丢,九成是线的问题不是网的问题。
ping得通,网页却打不开
这是最常见的一笔糊涂账。ICMP 只是探活,相当于敲门问「有人吗」;网页要跑通是一整条流水线:先把域名翻译成 IP,再跟对方建 TCP 连接,再传数据,任何一环坏了网页都开不了,而这其中的任何一环,ping 都不检查。
最典型的分法是拿 IP 和域名分开 ping。ping 223.5.5.5 通、ping www.baidu.com 不通,路是好的,是 DNS 解析这步坏了,改 DNS 就能好,这病我在这篇里写过怎么查。反过来 ping 域名通、网页还是转圈,那问题在 TCP 那层或者对方网站本身,跟路由器关系不大。
再往屋里缩小范围:ping 网关通,只代表你到路由器这一小段是活的,光猫、宽带、欠费一概没查。我家那次媳妇喊没网,我 ping 网关 1ms 挺好,接着 ping 外网全超时——顺着往外捋,是光猫那头的线松了。三段式挨个 ping 的定位法,我在WiFi 丢包那篇里展开写过,拿网关当分界线,一测一个准。
ping不通,网却好好的
这是我这轮实测最痛快的一个发现。114.114.114.114,老牌公共DNS,我四发四超时,一个回包都没有。按「ping不通就是断网」的逻辑,这服务器早该倒闭了?可我紧接着往它的 53 端口发了个域名查询,39 毫秒就收到 61 字节的应答,解析得又快又好。
原因很简单:它的防火墙把 ICMP 扔了。很多服务器和路由器默认丢弃外来的 ping,因为洪水 ping 是最廉价的攻击手段——几台机器发海量 ICMP 就能把小水管堵死,不回话反而是自保。路由器后台那些「防DoS攻击」「WAN口禁ping」的开关,管的就是这个,我在防火墙那篇里测过开关的影响。
所以 ping 不通的正确读法是「对方没搭理你」,不是「路断了」。可能是对方不让 ping,可能是中间某台路由器把 ICMP 丢了,也可能真断了——三种情况光靠 ping 分不出来,得靠下一招。不光服务器,家里光猫有的也不回外网方向来的 ping,报障时师傅让你 ping 的那个测试地址,跟它不是一回事。
tracert就是拿TTL当探针,一跳一跳问
既然包每过一台路由器 TTL 减 1、减到 0 会被扔,那反过来用:故意发一个 TTL=1 的包,第一台路由器减完就归零,它只能扔,但扔之前会礼貌地回你一条「超时」报文,报文里带着它自己的 IP。TTL=2 就能钓出第二台,TTL=3 钓第三台,挨个加下去,回家的路就一跳一跳亮起来了。tracert 这个命令干的就是这事,原理跟我手搓的一模一样。
我在一台内网是 172 段的公司电脑上跑了一段,前几跳长这样:第一跳 172.18.0.1 半毫秒,公司的网关;第二跳 192.168.5.1,楼里的上层交换;第三跳出来个 100.64 开头的地址——这是运营商大院的门牌,走 CGNAT 的宽带都这样,我在查公网IP那篇里写过怎么认它;第四跳 118.121.3.181,5 毫秒,已经出到城域网了。
第五跳和第六跳是两个星号,超时。别慌,这太常见了——中间路由器忙着转发没空搭理探针,或者干脆配置成不回这类报文,都不影响正经流量通过。星号只说明「这一跳不回话」,路通不通,要看后面有没有跳数重新亮起来、终点有没有应答。我那轮跑到后面跳数接着亮,终点 223.5.5.5 正常应答,路一点事没有。
四个症状对号入座,五步走完
把上面这些拼起来,就是一张速查表:
| 症状 | 毛病在哪 | 先干什么 |
| ping 127.0.0.1 都不通 | 自己电脑的系统 | 网卡驱动或协议栈坏了,重启再查驱动 |
| ping 网关超时 | 屋里这一段 | 看线、看WiFi,IP 没拿到 169.254 就查 DHCP |
| ping 网关通、ping 223.5.5.5 超时 | 出口那一段 | 看光猫灯、查欠费,往光猫注册方向排查 |
| ping IP 通、ping 域名超时 | DNS | 换 223.5.5.5 再试,九成是解析的锅 |
顺序也简单:先 ping 127.0.0.1 确认自己没病,再 ping 网关确认屋里没病,然后 ping 223.5.5.5 确认出得了门,接着 ping 个域名确认翻译没病,四步哪步断了就往哪段查。还糊涂就 tracert 一下,看路断在第几跳——断在前三跳是家里和运营商的事,断在十跳开外,基本可以放心跟自己家里那台路由器脱开干系了。
ping 这命令小是小,四十多年没变过样,靠的就是够简单。下次再见到「请求超时」,先想想 114 那台服务器——人家不回话,日子过得好着呢。

发表评论