Traceroute 排障 8 个常见误区:从协议层重新理解一个老工具

分类:测速指南 发布时间:2026-04-29

Traceroute 是工程师工具箱里使用频率最高的网络诊断工具之一,但同时也是被误读最严重的工具之一。本文从协议原理出发,整理 8 个最常见的解读误区,每条都附验证方法和正确思路。读完你应该能区分"工具显示的现象"和"网络真实状态",避免对运营商或上下游团队做出错误的故障定位。

适合人群:后端、运维、SRE、网络工程师,以及所有用 traceroute / tracert 排障过的人。

一、先理解原理:traceroute 到底在做什么

误区分析之前先讲清楚机制。Traceroute 的核心利用了 IP 协议头里的 TTL(Time To Live) 字段:

  1. 客户端发出一个 TTL=1 的探测包
  2. 第一跳路由器收到包,TTL 减 1 变 0,丢弃该包并向源端返回一个 ICMP Time Exceeded 报文
  3. 客户端记录下中间路由器的 IP 和往返时间
  4. 客户端再发一个 TTL=2 的包,到达第二跳后被丢弃,返回 ICMP
  5. 依次递增 TTL,直到包到达目标主机
  6. 目标主机返回与探测协议对应的响应(ICMP Echo Reply / ICMP Port Unreachable / TCP RST),traceroute 据此判定路径终结

关键认知三点:

  • traceroute 看到的"那一跳",本质是该跳路由器的 ICMP 响应能力,不是业务流量经过它的实际表现
  • 每跳显示的延迟是探测包到达后 ICMP 报文返回客户端的 RTT(往返时间),不是单程延迟
  • 不同平台、不同参数下,探测包的协议(ICMP/UDP/TCP)和目标端口完全不同,可能命中不同的转发路径

理解这三点,下面 8 个误区就能从根上解释清楚。

二、8 个常见误区

误区 1:traceroute 看到的路径就是业务流量走的路径

不同系统的 traceroute 默认探测协议不同:

系统默认协议默认目标端口
Linux tracerouteUDP33434+ 递增
macOS tracerouteUDP33434+ 递增
Windows tracertICMP Echo无端口

而你的业务流量大概率是 TCP(HTTP/HTTPS 是 TCP,RPC 是 TCP,数据库连接也是 TCP)。骨干网、CDN、防火墙、ECMP(等价多路径路由)会对不同协议、不同源/目的端口做不同的路由决策。

结果就是 traceroute 看到的路径,可能不是 TCP 流量真实走的路径。

验证方法是用 TCP 模式重测一遍:

# Linux:用 -T 强制 TCP,-p 指定目标端口
traceroute -T -p 443 www.example.com

# macOS 同上
sudo traceroute -T -p 443 www.example.com

# 没有 -T 的旧版系统装 tcptraceroute
sudo apt install tcptraceroute
sudo tcptraceroute www.example.com 443

对比 ICMP 模式和 TCP 模式的输出。在跨运营商、跨境的链路上,两者经常不一致。TCP 模式的结果才反映业务流量的真实路径。

如果不方便在本地装命令行工具,可以直接用 BiuPing 的在线版:在线 Traceroute IPv4在线 Traceroute IPv6,支持多节点同时测,下面误区 8 会展开讲为什么多节点很重要。

误区 2:中间跳显示星号等于链路断了

这是最常见的误判。

 6  202.97.x.x   12.345 ms   13.456 ms   11.234 ms
 7  * * *
 8  * * *
 9  219.158.x.x  45.123 ms   43.876 ms   46.234 ms
10  目标 IP       48.234 ms   47.891 ms   49.123 ms

很多人看到第 7、8 跳全是 *,结论是"那两跳坏了"。实际上几乎从来不是。

真实原因:骨干路由器对 ICMP 控制报文(包括 traceroute 依赖的 ICMP Time Exceeded)有 rate limiting 策略——CPU 一忙就主动丢弃这些控制报文,优先保业务流量转发。这是路由器厂商的默认设计,不是故障。

另外有些路由器/防火墙策略上完全过滤 ICMP TTL Exceeded 响应(比如某些云厂商内部骨干),但业务流量正常通过

正确判断标准:

  • 最终目的地有正常响应 → 中间任意跳的星号都可以忽略
  • 最终目的地也是星号 → 才需要看最后一个能响应的跳来定位故障域

遇到这种 case 想确认业务流量是否真的能到,用 在线 TCPing 直接测业务端口,TCP 握手成功就说明业务流量正常,中间星号是限速假象。

误区 3:每跳延迟是"到那个节点的延迟"

更准确的表述:每跳延迟是探测包到达该跳后,ICMP Time Exceeded 报文返回客户端的 RTT(往返时间)

这个区别为什么重要?因为网络是非对称路由的——去程和回程可以走完全不同的路径。

如果回程路径绕远了,第 N 跳显示的延迟就被回程拖累,而你看 traceroute 还以为是去程的问题。

验证方法:如果有目标服务器的访问权限,做一次反向 traceroute——你这边 traceroute 目标,目标服务器上 traceroute 你,对比两边的路径。严重不对称(跳数差异明显或区域不同)意味着回程可能是延迟瓶颈。

实战意义:游戏延迟、海外加速场景里,非对称路由是大坑。明明你以为问题在去程的某一跳,实际是回程的某个节点慢,怎么排都排不出来。

误区 4:某一跳延迟突然飙高就是那一跳故障

 5  10.0.0.1       8 ms    9 ms    7 ms
 6  10.0.1.1       12 ms   11 ms   13 ms
 7  10.0.2.1       250 ms  248 ms  255 ms      ← 看起来这里炸了
 8  10.0.3.1       15 ms   14 ms   16 ms
 9  目标            18 ms   17 ms   19 ms

第 7 跳延迟从 12ms 飙到 250ms,看起来"那个路由器出大事了"。

实际不一定。第 7 跳的 250ms 是该路由器响应 TTL Exceeded 报文的速度——即控制平面的响应能力,不是数据平面的转发能力。

很多路由器对 ICMP 控制报文响应优先级很低(CPU 忙时),导致 traceroute 显示该跳延迟很高,但业务流量经过它毫无问题

判断标准就一句话:看下一跳延迟是否恢复

  • 第 8 跳延迟回到 15ms → 第 7 跳只是控制报文响应慢,业务流量正常
  • 第 8 跳之后延迟持续 250ms+ → 第 7 跳之后的链路真的有问题

这种情况推荐用 mtr 替代单次 traceroute——mtr 持续打多个包统计平均值和丢包率,能把"瞬时控制报文响应慢"和"持续高延迟"区分开。

误区 5:traceroute 和 tracert 输出可以直接对比

跨平台脚本里直接 traceroutetracert 互换是常见踩坑点:

项目Linux tracerouteWindows tracert
默认协议UDPICMP
默认最大跳数3030
默认每跳探测数33
默认超时5 秒4 秒
反向 DNS默认开启(-n 关闭)默认开启(-d 关闭)

直接 parse 输出会出问题。曾见过自动化脚本因为 Windows 多一行表头,导致跳数计数偏 1。

跨平台正解是强制指定协议和参数:

# Linux/macOS:强制 ICMP,对齐 Windows 默认
traceroute -I -n target

# Windows:禁用反向 DNS,输出更干净
tracert -d target

误区 6:30 跳没到目标就是网络不通

默认 traceroute 最多 30 跳。30 跳没到目标,输出停止——很多人以为"网络断了"。

实际原因可能只是:

  • 默认 max-hops 是 30,跨大洲或绕路严重的链路确实可能不够
  • 防火墙、Anycast 节点策略导致最后几跳全是星号,但实际数据包能到

解决方法:

# Linux:-m 设置最大跳数
traceroute -m 64 target

# Windows:-h 设置最大跳数
tracert -h 64 target

更重要的是:traceroute 的本职是看路径,不是测连通性。判断"通不通"应该用:

工具用对场景,结论才靠谱。

误区 7:MPLS 隧道里的跳会"隐身"

跨运营商或跨境的 traceroute 输出,可能发现某段跳数明显少于物理跳数。

原因是 MPLS 标签交换。很多骨干运营商内部用 MPLS 做流量工程,MPLS 隧道入口路由器(LER)给包打上标签,隧道内的中间路由器(LSR)只看标签不看 IP,默认不递减 IP TTL。中间那几跳在 traceroute 输出里完全消失。

新版 traceroute 支持显示 MPLS 标签:

traceroute -e target

# 输出示例
# 5  202.97.10.1  10ms   <MPLS:L=12345,E=0,S=1,T=1>

看到 MPLS 标签就知道流量在隧道里。隧道内"少看到"几跳是协议层面的预期行为,不是工具问题。

补充:不同运营商 MPLS 配置策略不同。比如电信 163 大多透传 TTL(隧道内跳数会消失),移动 CMI 在某些段上不透传(隧道内跳数能看见)。这也是为什么同一目标在不同运营商出口看到的跳数会不一样。

误区 8:单点 traceroute 测 CDN/Anycast 服务的结果是稳定的

测 CDN 或大型云服务时(cloudflare.com、baidu.com、google.com 这类),每次 traceroute 结果可能都不一样。这是 Anycast 架构的预期行为。

原因是 Anycast + ECMP:

  • 同一个 IP 在全球多个机房同时通告 BGP 路由,请求自动走到最近的节点
  • BGP 路由微小波动会让你命中不同的 Anycast 节点
  • 同一探测的多个包(每跳默认 3 个)可能因为 ECMP(基于五元组哈希)走不同物理路径
  • 中间跳的 IP 和延迟都会变化

单次 traceroute 的结果只是那一刻的快照,无法基于此对 CDN 服务做持续性结论。

更重要的是多地探测——你单点测再多次,也只是你这一条出口线路的视角。CDN 在不同地区命中的 PoP 节点完全不同,不同运营商的 BGP 选路也完全不同。要评估 CDN 服务在全国的真实质量,必须多节点对比。

这也是 BiuPing 这个站做出来的初衷——单机命令行工具看到的只是单点视角,从北京电信看到的路径和从广州移动看到的可能完全不是一回事。直接用我们的多节点 TraceroutePingTCPingDNS 解析 工具就能直接看到不同地区的对比结果,不用自己搭多节点环境。

三、排障 SOP

把上面 8 条串成实战流程:

  1. 首选 mtr 替代单次 traceroute:持续探测能避免控制报文响应慢导致的误判
    mtr -rwc 30 -T -P 443 target
  2. 遇到 * * * 时,看最终目的地是否可达:最终能到则中间星号忽略;最终不可达则定位最后一个能响应的跳
  3. 遇到单跳延迟突增时,看下一跳是否恢复:下一跳正常说明是 ICMP 响应慢的假象;下一跳持续高延迟才是真问题
  4. 跨运营商、跨境问题必须多节点对比:单点视角信息量不足,区域差异看不出来——这种场景直接用 BiuPing 多节点 Traceroute 比命令行高效得多
  5. 测连通性用 ping/tcping/curl,测路径用 traceroute/mtr:工具用对场景

四、常用命令速查

收藏一下,排障时直接复制:

# === Linux/macOS ===
# ICMP 模式(行为接近 Windows tracert)
traceroute -I -n target

# TCP 模式(最接近业务流量)
traceroute -T -p 443 -n target

# 显示 MPLS 标签
traceroute -e target

# 加大最大跳数
traceroute -m 64 target

# mtr 持续探测(推荐)
mtr -rwc 30 -T -P 443 target

# === Windows ===
# 默认 ICMP 模式
tracert target

# 禁用反向 DNS
tracert -d target

# 加大最大跳数
tracert -h 64 target

五、写在最后

Traceroute 是个老工具,文档里几行参数说明掩盖了它和现代网络架构(CDN、Anycast、MPLS、ECMP)之间复杂的相互作用。理解它的工作原理远比记住命令参数重要——只有从协议层理解了它"在做什么"和"看不到什么",才能正确解读它的输出。

如果不想本地装命令行工具,BiuPing 提供了完整的网络诊断工具集,全部支持多节点对比:

欢迎收藏本文,下次 traceroute 出现奇怪结果时翻出来对照排查。

← 返回测速指南列表 返回首页