tracert每一跳是什么意思?满屏星号不是断网,我拿自家宽带跟踪了一遍

前阵子家里宽带抽了回风:微信能发,网页慢得像在拨号。我第一反应是掏出ping去测,数字是有了,10毫秒上下,可它只告诉我终点通不通,中间这段路到底卡在哪,ping一个字没提。后来我想起还有条命令叫tracert,敲下去蹦出来十几行,一串IP加一串时间,中间还夹着好几个星号。第一次看这输出的人,十个有九个以为自己网断了一半。
那天我把这十几行翻来覆去研究了一晚上,又在单位的电脑上跑了几遍对照,才算把这屏输出真正读懂。结论先撂这儿:星号不等于断网,每一跳的顺序里藏着「锅在谁家」的答案。
先说清楚tracert在干什么:拿TTL当鱼饵,一跳一跳钓
这事得从包里那个叫TTL的数字说起。每个IP包出发时都带着一个存活次数,我家电脑发的包默认是64,每经过一台路由器就被减掉1,减到0这台路由器就必须把包扔掉,同时给发件人回一张「到我这超时了」的条子。ping那篇里我用它数过跳数,223.5.5.5回给我的包里TTL剩113,128减113,说明路上走了15跳。
tracert的算盘就打在这张回执条子上。它先发一个TTL等于1的包,第一台路由器把TTL减成0,扔包、回条子,条子上带着自己的IP——第一跳就这么钓上来了。接着发TTL等于2的包,让第二台路由器自报家门,然后是3、4、5,一路加到30跳封顶。每跳它默认连发三个包,所以Windows上每一行会看到三个时间,三个时间里有星有数也是常态,等下细说。
所以那一屏输出的本质,是一路上每台路由器被迫交出来的「到此一游」签名。谁回了话你就能看见谁,谁没回话就是个星号。路由器怎么查表决定把包扔给下一台谁,这套动作我在路由表那篇里拆过,tracert等于逼着它们把这条路径一段一段亮出来。
我跟踪的这一遍:从屋里到阿里DNS,十三行逐个读
下面这遍是我在单位电脑上跑的,目标223.5.5.5,阿里家的DNS服务器。挑它当目标是因为它稳,全天候在线,跟测网速挑平路一个道理。第一遍用的是UDP探法,输出抄在下面,家庭宽带的结构和这一模一样,只是前两跳的地址换成你家的。
tracert 223.5.5.5
第1跳是172.18.0.1,0毫秒。这是局端内网的网关,家里的版本就是你家路由器的内网地址,我家是192.168.31.1,你家的多半是192.168.1.1。这一行值钱的地方在于:它有数字、时间小于1毫秒,说明你到路由器这段是活的,网关这一关先排除了。反过来要是第1跳就全是星号,先别想运营商的事,回头查网线、WiFi和路由器死没死。
第2跳还是个192.168开头的内网地址,单位网络多了一层汇聚,家里跑的话这一跳往往直接就跳到运营商了。第3跳100.64.0.1,4.9毫秒——这个数字我专门写过,100.64到100.127这一段是运营商的大院门,多家共用一个公网出口的标志,双重NAT那篇里它就是主角。看到它意味着包已经出了你家、进了运营商的地盘。
第4、5、6跳是118.121、171.208、139.206这些公网IP,它们是电信城域网和省干网里的路由器,从市内一路往省中心走。到这里都是正常的长相:有IP、有时间、时间整体缓慢往上抬。
第7跳开始,星号,一直到第13跳,一片白。当时我心里也咯噔了一下:后面全灭了?
满屏星号先别慌:路由器回话是情分,不回是本分
关键的反转来了。同一时刻我再拿ping去敲223.5.5.5,通了,10.2毫秒,回包里TTL剩50。64减50,包实际上走完了14跳,好好的。也就是说,第7跳往后的那几台路由器,流量明明从它们身上过去了,它们只是没搭理tracert的探子。
这不算Bug,是路由器的权利。回「超时」条子这件事对路由器来说是副业,它的主业是转发包。不少运营商会把副业的额度掐得很死,一分钟只肯回几张,超了就装聋;有的干脆把ICMP这类控制消息整体限速,还有的出于防扫描的考虑,对探测包一律不回形踪。工程规矩里本来就有「错误消息要限速」这一条,路由器照办了,你看到的星号就是它省下来的额度。
我手上还有一组更硬的对照。tracert有两种探法:Windows默认发ICMP包,Linux的traceroute默认发UDP包。同一个目标,我两样都跑了。UDP版从第7跳起全星号;ICMP版呢,第5跳星号、第6跳139.206.135.154有数、第7跳星号、第8跳118.112.16.210又有数——星号和数字穿插着来。同一台路由器,对一种探子回话、对另一种装死,这正好说明星号反映的是「它想不想理你」,不是「路通不通」。两种探法结果对不上这个事,TCP和UDP那篇里讲的协议差异是底子。
所以判断星号要看位置:中间跳星号、后面的跳又有数字,路是通的,别理它。真正要警惕的是另一种形态,等下说。
每一跳的时间也别全信:它们是路由器顺手抄的,精度有限
跳数表里的毫秒数,新手容易当网速读,我自己就误读过错怪运营商一回。UDP那遍的第4跳显示23.6毫秒,可ICMP那遍同一个位置的跳只有3.7毫秒,差出六倍。哪次是真的?答案是都别全信。那三个时间测的是「探子到那一跳再回来的时长」,而回条子这件事在路由器里是低优先级的活,它手头忙的时候先给你压一压,压出来的时间就虚高。此外来回可能不走同一条路,去程探子走A线,回执走B线,时间自然对不齐。
还有个小反直觉:正常跳数表的时间也不是一路严格递增的。我那遍第5跳33.1毫秒,第6跳反而降到30.6毫秒。物理上光跑得再远时间也不会倒流,出现这种回落的真因是上一跳的条子被路由器压了,下一跳没压,看起来就像时间倒着走。所以读时间的正确姿势是看两头:前两跳该是1毫秒以内,终点那行如果是几毫秒到几十毫秒,这路就是健康的,中间的起伏当波动看。想认真比延迟,ping值分档那篇的长ping比跳数表靠谱得多。
真正的断路长什么样:从某一跳起全灭,终点也够不着
把上面的规则反过来,就是真故障的签名。判断断点记一句话:最后那个有数字的跳,锅就在它附近。
比如跑到第3跳100.64有数,第4跳起一路星号到底,ping终点也不通——你家里和光猫这侧是活的,包进了运营商大院就再没出来,断点在第3跳之后,报修时把「tracert第4跳起全超时」念给10000号听,比说「网好卡」管用十倍。要是第1跳就全星号,那根本轮不到运营商,家里断网那套排查从网线和路由器开始过一遍。
还有一种容易误判的:中间断星号,但最后一行有数字有IP,那是走到了。还有一种更刁的,全程星号可网页偏偏打得开——终点服务器把ICMP整体禁了(很多大站为了防攻击都这么干),探子被拦但正经服务好好的。这时候换UDP探法试试,或者干脆拿浏览器当裁判,判断有没有网那套探针逻辑手机和网站各有一套,别被一种探法的一屏星号带进沟里。
Windows上三个参数值得记,外加一张对号表
tracert后面能挂参数,常用的就三个。-d最值钱:默认它会把每个IP反查成域名再显示,一跳一查能把你等疯,挂上-d只显示IP,速度快一大截,排查时永远带上它。-w 1000把每次等待回执的超时从默认4000毫秒压到1000毫秒,遇到爱装死的路由器,默认值能让整屏跑上好几分钟。-h管最大跳数,默认30,家用宽带到不了这个数,基本用不上。顺带一提,跟同事对照结果时注意系统差异:Windows发ICMP、Linux发UDP,同一跳两边显示不一样太正常了,我上面那组对照就是现成的例子。
把整屏输出的读法收成一张表,下次网慢直接对号:
| 输出长相 | 说明什么 | 下一步 |
| 第1跳有数,时间1毫秒内 | 到路由器这段活的 | 屋里没问题,往运营商方向看 |
| 第1跳就全星号 | 本机到网关断了 | 查网线、WiFi、路由器死活 |
| 100.64那一跳出现 | 已进运营商大院 | 属正常,接着往后看就行 |
| 中间星号,后面还有数 | 路由器懒得回话 | 不用处理,路是通的 |
| 某跳起全星号到终点,ping也不通 | 真断点在最后有数那跳附近 | 带跳数报修 |
| 全程星号但网页能开 | 终点禁了ICMP探子 | 换UDP探法或拿浏览器验证 |
顺序上给个收尾:网慢先ping终点拿基准,再tracert -d看路径,星号只在「从某跳起全灭加终点不通」时才算数。排查这件事一层一层来效率最高,从网线查到网页那五个关口的顺序我专门排过,tracert在第三关口上,是判断「出没出小区」最好用的一根探针。
