traceroute命令详解:从原理到实战,一步步定位网络故障
2026/9/17 10:39:50 网站建设 项目流程

我干网络运维这些年,遇到最多的求助就是“网是不是断了”“微信怎么连不上”“网页又打不开了”。这种问题你光靠猜,能把人逼疯。ping一下能知道通不通,但通不代表快,快不代表路径对,路径对也不代表问题不在你这一侧。真正要判断网络是否正常连接、路径到底可达不可达,traceroute这个命令才是关键工具。它能把数据包从你电脑到目标服务器之间经过的每一跳都摸出来,哪一段延迟高、哪一段丢包、在哪一根线上卡住了,一目了然。这篇东西就围绕traceroute命令展开,从原理到实操,从参数到案例,把我实际排障中踩过的坑、积累的经验一次讲透。

1. 断网排查的第一现场:traceroute到底能解决什么问题

1.1 网络故障最让人头疼的事

网络故障分很多种:完全断网、间歇性卡顿、某个应用连不上、某个网站打不开、微信提示“网络连接已断开”但浏览器又能上网。这些场景背后的原因千差万别,可能是物理链路问题、IP配置问题、DNS解析问题、防火墙拦截、运营商线路故障、目标服务器宕机,甚至是你电脑上某个软件把网络给改了。

我见过太多人一遇到网络问题就开始重启路由器、重装网卡驱动、甚至重装系统,折腾半天问题还在。原因很简单——你没有定位到故障发生的具体位置。就像家里水管漏水,你不先找到漏水点就整个墙面刨开,成本高不说,还可能把没坏的地方也弄坏了。

traceroute的价值就在这里:它沿着数据包发送的路径,一段一段地探测,把整条链路上的每个节点都列出来,告诉你数据走到了哪里、卡在了哪里。有了这个信息,你就知道该找谁解决问题——是自己电脑的问题、局域网的问题、运营商的问题,还是目标服务器的问题。

1.2 traceroute和ping的定位差别

很多人知道ping,也习惯用ping来测网络。ping用的是ICMP Echo请求,目标主机收到后会回复Echo Reply,能告诉你“通”还是“不通”,以及往返延迟是多少。但ping有一个天然的盲区:它只告诉你起点和终点之间的整体情况,中间任何一个环节出了什么问题,你是看不到的。

举个例子,从你家访问某个网站,中间经过电信的骨干网、联通的对等互联、目标服务器的机房出口,总共要经过十五六个路由器。如果其中第11个路由器出了故障,导致丢包30%,你ping出来的结果是丢包严重、延迟偏高,但你不知道是第11个路由器的问题。你可能会去怪网站服务器、怪自己的宽带、怪路由器,实际上问题出在中间某个交换节点。

traceroute的思路完全不同。它会向路径上的每一个路由器分别发送探测包,让每个节点都回一次话,这样你就能看到:第1跳是什么、第2跳是什么……每一跳的延迟多少、丢包多少。故障发生在哪一个节点,一目了然。这就是它和ping最本质的区别——一个只给结论,一个给出完整的过程。

所以我的习惯是:先用ping快速判断“通不通”,再用traceroute精准定位“问题在哪”,两者配合,基本能解决90%以上的网络连通性问题。

2. 探秘原理:TTL、ICMP与三次“接力赛跑”

2.1 TTL机制:一封会自动退信的探测信

traceroute的原理说穿了并不复杂,核心是利用IP协议里的TTL(Time To Live)字段。TTL这个字段的原始设计是为了防止数据包在网络中无限循环,每经过一个路由器,TTL值就减1,减到0时,路由器会丢弃这个数据包,并给发送方回一个ICMP超时消息。

网络上的路由器就像一站一站的接力赛选手,数据包从起点出发,每到一个路由器就相当于跑过一站。TTL值可以理解成“剩余可跑站数”。如果数据包的TTL太大,它就会一直跑下去,直到到达目的地;如果TTL被设成了0,路由器会直接把它扔掉,同时回信告诉发送方“这封信在我这里被退回了,因为它已经跑过了太多站”。

traceroute正是利用这个机制做文章的。它先发一个TTL=1的探测包,这个包到第一个路由器时TTL减为0,第一个路由器就给它回一个“超时”消息,这样发送方就知道了第一跳的IP地址。接着发TTL=2的包,第二个路由器回消息,于是知道了第二跳。如此类推,直到探测包到达目标主机的端口,目标主机回一个“端口不可达”的消息,说明路径已经走完。

用生活里的例子类比:就像你给一个远方朋友寄信,但你故意在信封上写“如果送信人经过第1个邮局就退回来”——结果第1个邮局把信退给你,还盖了个邮局的章,你就知道了第1个邮局是谁。再写“经过第2个邮局就退回来”,第2个邮局又把信退给你……直到某一天,退信不再是“邮局超时”,而是你朋友亲手签收的“查无此人”回执,那说明信已经送到了朋友那一带。

2.2 路径上每个节点如何“自报家门”

整个过程涉及三种ICMP消息类型:

  • 路由器返回的超时消息(Time Exceeded),说明探测包的生命周期在这个节点耗尽
  • 目标主机返回的端口不可达消息(Port Unreachable),说明已经到达目的地
  • 中间节点可能返回的网络不可达、主机不可达等消息,说明路径上存在路由黑洞

每次traceroute默认发出3个探测包(Linux下用-q参数可以调整,Windows下固定是3个),目的就是把每个节点的情况测得更准确一些——网络是动态的,一个包两次结果可能不同,3次取平均值能减少误差。

关于返回消息,不同平台处理方式不同。Linux的traceroute默认使用UDP协议发送探测包,目标端口从33434开始递增,每跳加1。Windows的tracert默认使用ICMP Echo请求。这两种方式各有优劣:UDP方式不容易被目标主机的防火墙当作攻击流量处理,但可能被中间设备的防火墙拦截;ICMP方式更通用,但有些主机会限制ICMP请求频率。

2.3 三种探测方式与选型考量

实际使用中,traceroute支持多种探测协议,常用的有三种:

  • UDP模式(默认):Linux和macOS的traceroute默认采用。它向目标的某个高端口发UDP包,中间路由器回超时消息,最终目标回端口不可达消息。这种模式的好处是目标很好识别——一旦收到端口不可达,就说明已经到了目的地。
  • ICMP模式(-I参数):类似ping的机制,发送ICMP Echo请求。Windows的tracert默认就是这个模式。它对防火墙的穿透性更好一些,适合跨运营商、跨地域的路径探测。
  • TCP模式(-T参数):发送TCP SYN包,目标回SYN-ACK或RST。这种模式最接近实际应用的连接方式,适合探测特定服务端口是否可达,比如排查某网站80端口或443端口的连通性。

选型上有讲究:如果只是日常排障,用默认UDP模式就够了;如果中间网络设备对UDP探测包做了限制,出现大量星星(超时无响应),可以考虑换ICMP模式或TCP模式试试。我遇到过一些运营商的骨干节点只响应ICMP不响应UDP,换-I参数之后路径马上就清楚了。

3. 各系统实操指南:从命令到输出逐行读懂

3.1 Linux下的traceroute与常用参数

Linux下的traceroute命令功能最全,但很多精简版系统默认不装,需要手动安装。Debian/Ubuntu系列用apt install traceroute,CentOS/RHEL系列用yum install traceroute

基本命令格式是:

traceroute www.example.com

常用参数我整理成一张表,方便对照:

参数作用说明
-n不解析域名,直接显示IP排障时强烈建议加上,省去DNS解析时间,结果更准确
-m 最大跳数设置最大TTL值默认30,如果目标比较远可能需要调大
-q 数量每跳发送的探测包数默认3个,测丢包时可以改为5或10
-w 秒数等待响应的时间默认5秒,内网环境可以缩短
-I使用ICMP Echo探测推荐用于穿透防火墙
-T使用TCP SYN探测适合测具体端口
-p 端口指定目标端口默认33434起,UDP模式时每跳加1

实际我常用的命令是:

traceroute -n -T -p 443 -m 30 www.example.com

这条命令用TCP方式探测到目标443端口的路径,能直接反映访问HTTPS服务时的真实网络状况,比默认UDP模式更有参考价值。因为中间防火墙可能放行TCP 443流量但拦截UDP高端口,用这个参数能避开干扰。

3.2 Windows下的tracert与差异说明

Windows自带的命令叫tracert,用法比Linux版简单得多,参数也更少。基本格式:

tracert -d www.example.com

-d参数等同于Linux的-n,不解析域名直接显示IP,这是我最常用的一条。其他参数如-h设置最大跳数(默认30)、-w设置超时时间(默认4000毫秒)、-4强制使用IPv4等。

Windows版tracert有几个特点需要注意:

  • 默认使用ICMP Echo请求,发送频率默认受系统限制,不会像Linux那样快速连续发
  • 最多显示30跳,不可调大,对绝大多数场景够用
  • 不支持TCP模式,要测TCP只能借助第三方工具
  • 输出格式是“跳数 + RTT1/RTT2/RTT3 + 主机名(IP)”,每跳固定3个时间值

Windows下如果tracert中途卡住不动,最常见的几个原因:一是中间某个节点不响应ICMP(显示超时但继续等待),二是路径上存在丢包导致某个探测包丢了,三是对端主机本身屏蔽了ICMP。遇到卡住不要死等,按Ctrl+C中断,结合输出结果分析。

3.3 macOS下的traceroute与补充工具

macOS和Linux同宗,自带traceroute命令,默认也是UDP模式。基本用法和Linux几乎一致,常用参数也都有,不同的是macOS版不支持-z之类的某些高级参数,但对于日常排障完全够用。

traceroute -n www.example.com

macOS还有一个图形化工具Network Utility里自带Traceroute标签页,适合不太习惯命令行的人用,但功能相对有限,我还是推荐在终端里跑命令。

另外macOS下排障经常配合pathping的替代品mtr使用,这个工具后面会提到,它是traceroute的增强版,能持续监控整条路径的丢包率,做长期观测非常好用。

3.4 输出字段的完整解读

无论哪个平台,traceroute的输出结构基本一致。拿一次实际排障为例:

$ traceroute -n www.example.com traceroute to www.example.com (93.184.216.34), 30 hops max, 60 byte packets 1 192.168.1.1 0.372 ms 0.334 ms 0.358 ms 2 100.64.0.1 8.512 ms 8.441 ms 8.525 ms 3 218.30.19.33 9.063 ms 9.084 ms 9.044 ms 4 61.148.3.77 10.232 ms 10.184 ms 10.203 ms 5 202.97.42.5 12.114 ms 12.087 ms 12.096 ms 6 * * * 7 93.184.216.34 88.903 ms 88.872 ms 88.914 ms

逐行解读:

第一行是探测目标信息,显示目标域名、解析出的IP、最大跳数和探测包大小。

后面的每一行代表一跳。最左边是跳数序号,从1开始递增。中间三个以ms为单位的时间值是该跳3次探测的往返延迟。右边是这一跳的IP地址或主机名(加了-n参数只显示IP)。

判断要点:在同一个网络环境下,延迟从第1跳到最后一跳大致是逐步增加的,但因为运营商骨干网的路由策略不同,偶尔后面一跳比前面一跳延迟更低也正常,那是数据包走了不同的物理线路。真正要关注的是异常跳变——比如某跳延迟从10ms突然飙到200ms,然后后面一直居高不下,那基本可以断定问题出在这一跳附近。

4. 实战:三个真实故障场景的traceroute排障记录

4.1 场景一:电脑微信提示“网络连接已断开”

排障第1步,先确认本机网络状态。打开系统设置,确认没有误开飞行模式,无线网卡或有线网卡处于已连接状态,拿到了有效的IP地址。这一步看起来基础,但“网络连接显示飞行模式怎么办”这类问题我处理过很多次,不少用户是误触了键盘上的飞行模式快捷键,系统层面把网卡禁用了,这时候你跑什么命令都没用。

确认本机网络正常之后,先ping一下网关:

ping 192.168.1.1

如果网关正常,再ping一下微信的服务器IP。微信的服务器域名是short.weixin.qq.com,实际解析出来的IP可能有很多个,不同地区不同。因为微信用的腾讯云的服务器,分布在全国多个节点,需要先解析出IP再测。

nslookup short.weixin.qq.com traceroute -n -T -p 443 <解析出的IP>

用TCP模式探测443端口,是因为微信客户端登录走的是HTTPS协议。如果traceroute显示路径能完整走通、目标端口响应正常,说明网络本身没问题,问题可能出在微信客户端本身——比如缓存异常、登录状态过期,退出重登或者重启电脑一般能解决。

如果traceroute显示路径中某一段出现大量丢包或延迟异常,比如运营商骨干网节点持续超时,那就是线路问题,需要反馈给运营商处理。这种问题往往是区域性的,不是你电脑能找到原因的。

4.2 场景二:访问某网站超时,其他网站正常

这类故障很典型:浏览器访问某网站一直转圈,但访问百度、淘宝都正常。很多人第一反应是网站挂了,但实际情况可能五花八门。

第一步先ping一下目标网站域名,能ping通说明DNS解析正常、网络可达;ping不通看返回的是什么——域名解析失败(DNS问题)、请求超时(网络不通或主机屏蔽ICMP)、Destination Host Unreachable(路由不可达)。

第二步用traceroute看路径在哪一跳卡住:

traceroute -n -T -p 443 www.example.com

我遇到过一种典型情况:traceroute显示前面每一跳都正常,但最后一跳始终显示星号,目标IP不出来。这时候不要急着判断网站不可达,因为很多网站服务器的防火墙会屏蔽一切ICMP消息和UDP高端口探测,但对正常的TCP 443连接是放行的。换TCP模式试一次,如果TCP模式下能看到目标主机的响应,说明路径没问题,纯粹是对方防火墙敏感。

另一种情况是路径走到某个运营商的对等互联节点时开始大量丢包,后面几跳跟着丢。这种多半是跨运营商互联带宽拥塞——比如你的宽带是A运营商,目标网站服务器放在B运营商机房,两家运营商之间的互联出口带宽不够用,高峰时段就会出现明显拥塞。这种问题你换DNS、换路由器都没用,可能换个时间访问就正常了,或者用加速服务绕开那段拥堵链路。

4.3 场景三:办公室网络卡顿与链路瓶颈分析

办公室网络频繁卡顿,表现为视频会议卡成PPT、大文件传输龟速,但Office文档办公基本不受影响。

这种场景最值得做一次完整的链路体检。先找到办公室的出口路由器IP和运营商接入设备IP,然后选几个目标点分别跑traceroute——一个选公司总部的服务器、一个选阿里云或腾讯云的公共DNS(如223.5.5.5)、一个选常见的视频会议服务。三组数据对比就能看出问题在哪。

如果三组数据都显示同一个节点丢包严重,说明瓶颈在公共路径上,大概率是运营商接入段或者骨干网某段有问题,需要联系运营商处理。如果只有到某个目标点时丢包严重,到其他目标都正常,说明不是链路的问题,而是对端服务或对端机房的网络策略有局限。

这里补充一个经验:公司网络卡顿,先看内网再看出链路。我自己用traceroute排查时发现过好几次问题其实出在内部——比如公司防火墙的会话表满了、核心交换机某个端口有CRC错误、无线AP的某个接入点带宽被大量占满。这些内部问题靠traceroute到公网看不出来,因为路径上前面几跳都是正常的,从内网到公网出口这一段整体没有异常。要判断内网是否有问题,先把目标设为网关和出口路由器的内网接口IP,分别看延迟和丢包,如果内网段本身就有丢包,先解决内网的问题再往公网查。

5. 常见问题排查与避坑经验清单

5.1 满屏星号是不是就代表断网

不是。traceroute输出中某一跳或连续几跳显示星号,只能说明这些节点没有响应你的探测包,原因可能是:

  • 这些路由器配置了策略,不响应TTL超时消息(很多核心路由器为了降低负载会关闭这类响应)
  • 防火墙拦截了UDP或ICMP探测包
  • 设备只处理转发,不处理控制面报文
  • 探测包被限速或丢弃(某些运营商会限制ICMP报文的速率)

实际排障中,我经常看到从某跳开始连续五六跳都是星号,但最后一跳正常返回了——这说明数据仍然能到达目标,中间那些不响应的节点只是在“装死”。遇到这种情况,换用TCP模式(-T参数)再跑一次,或者用mtr连续观察一段时间,基本能还原真实路径。

判断网络是否真的断了,要看最终结果——如果最后一跳(目标)都没有响应,且路径前段存在持续的完全丢包,才说明路径确实不通。单看中间某几跳的星号就断定断网,太武断了。

5.2 第一跳就超时的排查顺序

第一跳通常是你的网关(家用路由器或公司出口网关),如果连第一跳都超时,问题大概率出在你本机或者网关设备上。

排查顺序按下面的思路来:

  1. 检查本机IP地址是否正常获取:Windows下ipconfig,Linux/macOS下ip addrifconfig。如果IP是169.254.x.x(Windows自动私有地址)或根本没有IP,说明DHCP没有正常分配地址,问题在本机或网关的DHCP服务上。
  2. 检查网关设备是否正常工作:看指示灯、管理界面是否可登录、其他设备是否正常。多台设备同时断网,基本可以确定是网关的问题;只有你一台断网,先查网线和无线网卡。
  3. 检查网卡驱动和物理链路:网线插口是否松动、无线信号是否稳定、网卡是否被系统禁用(设备管理器或系统设置里查看)。
  4. 尝试ping本机回环地址127.0.0.1和本机IP,排除网卡本身的故障。
  5. 如果以上都正常但第一跳还是超时,检查电脑防火墙或安全软件是否拦截了ICMP出站流量。

正常情况下第一跳的延迟应该是个位数毫秒,如果第一跳延迟就很高(比如超过50ms),多半是无线信号不好,或者网关设备处理能力不足。

5.3 最后一跳超时别急着认为目标不可达

目标服务器不响应traceroute探测是非常普遍的现象。大多数服务器会屏蔽ICMP消息、关闭UDP高端口,目的就是减少被扫描和探测的风险。这跟服务器本身是否在正常提供服务没有必然关系——网站能打开,但最后一跳就是星号,这种情况太常见了。

判断目标是否可达,最可靠的方法是测试实际业务端口。比如排查一个网站,就用浏览器直接访问看能不能打开;排查一个数据库,就用客户端去连数据库端口;排查微信服务器,就看微信客户端能不能登录。

如果业务本身正常,最后一跳不响应不用管它;如果业务异常,traceroute的重点应该放在最后一跳之前的链路上——是不是靠近目标那一侧的网络出了问题,最后一跳的通路是否被防火墙拦截了。TCP模式的traceroute(-T参数指定业务端口)在这种情况下有决定性作用,它能模拟真实业务流量走过整条链路,看到目标端口到底通还是不通。

5.4 中间节点高延迟和丢包的正确解读

看到中间某跳丢包率高,很多人就开始慌了。这里有个关键经验:中间节点的丢包率,不能只看单次traceroute的结果。

原因在于traceroute发送的探测包数量很少(默认每跳3个),从统计角度看样本量太小。某些路由器会优先转发业务数据,对ICMP/UDP探测包做限速处理,导致探测请求被丢弃,但真实的业务流量并没有受到影响。这就是为什么我强烈推荐使用mtr(My TraceRoute)工具——它能持续发送探测包,统计每分钟/每秒的丢包率和延迟抖动,样本量足够大,结论才有参考价值。

mtr的安装和使用很简单:

mtr -n -c 100 www.example.com

-c 100表示发送100个探测包后停止,输出结果中包含每跳的丢包率(Loss%)、发送/接收包数、延迟最小/最大/平均值。

判断路径质量的正确姿势:如果某跳丢包率持续偏高(超过5%甚至超过20%),且后续所有跳的丢包率也跟着高,那说明问题确实在这一段;如果某跳本身丢包率高,但后续跳丢包率恢复了正常,那多半是设备对探测消息处理策略的问题,而不是链路质量真的差。

5.5 别忘了先检查本机网络状态再上手命令

这个话题说起来基础,但确实是最常被忽略的环节。遇到网络故障,先花十秒钟确认本机状态,能省去后面大量的无用操作:

  • 网络适配器是否启用:Windows下看网络和共享中心,Linux下看nmcli device status,macOS下看系统设置
  • 是否误开了飞行模式:很多笔记本有快捷键或组合键,误触后无线网卡直接被禁用
  • 是否连上了正确的网络:检查你连的是不是自己的WiFi或有线网络,别连到了隔壁的热点上
  • IP地址是否为有效地址:确认不是169.254.x.x或0.0.0.0
  • DNS是否正常:nslookup www.baidu.com看能不能解析出IP

我见过一位同事排查了半小时网络问题,最后发现自己的网线根本没插牢。也见过用户跑traceroute命令发现第一跳就是192.168.137.1(Windows移动热点虚拟网卡),原来电脑连的是手机热点而不是公司网络。这些低级错误,在动手排查之前花几秒钟确认一下,能省下大量时间。

实际排障中,我整理了一套固定的排查流程,分享出来供参考:

阶段操作目的
1检查本机网络适配器、飞行模式、IP地址排除本机基础问题
2ping 127.0.0.1验证本机协议栈
3ping 网关IP验证局域网连通性
4nslookup 目标域名验证DNS解析
5ping 目标IP验证公网连通性
6traceroute -n 目标IP定位出问题的节点
7mtr -n -c 100 目标IP深入分析丢包和延迟

这个流程从近到远、从简单到复杂,逐步缩小问题范围,是我这几年排障下来最高效的一套打法。遇到任何网络故障,照着这个顺序走一遍,很少有没有头绪的时候。

最后再说一个traceroute的实际使用体会:这个命令最能发挥价值的时候,恰恰是你面对一个看似“没有头绪”的网络问题时。它能帮你在最短时间内把问题范围从“整个网络”缩小到“某一个节点上”,剩下的工作在绝大多数情况下就是拿着这个结果去找对应的人、处理对应的事。排障的思路和工具同样重要,traceroute就是连接这两者的那座桥。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询