Traceroute 是工程师工具箱里使用频率最高的网络诊断工具之一,但同时也是被误读最严重的工具之一。本文从协议原理出发,整理 8 个最常见的解读误区,每条都附验证方法和正确思路。读完你应该能区分"工具显示的现象"和"网络真实状态",避免对运营商或上下游团队做出错误的故障定位。
适合人群:后端、运维、SRE、网络工程师,以及所有用 traceroute / tracert 排障过的人。
一、先理解原理:traceroute 到底在做什么
误区分析之前先讲清楚机制。Traceroute 的核心利用了 IP 协议头里的 TTL(Time To Live) 字段:
- 客户端发出一个 TTL=1 的探测包
- 第一跳路由器收到包,TTL 减 1 变 0,丢弃该包并向源端返回一个
ICMP Time Exceeded报文 - 客户端记录下中间路由器的 IP 和往返时间
- 客户端再发一个 TTL=2 的包,到达第二跳后被丢弃,返回 ICMP
- 依次递增 TTL,直到包到达目标主机
- 目标主机返回与探测协议对应的响应(ICMP Echo Reply / ICMP Port Unreachable / TCP RST),traceroute 据此判定路径终结
关键认知三点:
- traceroute 看到的"那一跳",本质是该跳路由器的 ICMP 响应能力,不是业务流量经过它的实际表现
- 每跳显示的延迟是探测包到达后 ICMP 报文返回客户端的 RTT(往返时间),不是单程延迟
- 不同平台、不同参数下,探测包的协议(ICMP/UDP/TCP)和目标端口完全不同,可能命中不同的转发路径
理解这三点,下面 8 个误区就能从根上解释清楚。
二、8 个常见误区
误区 1:traceroute 看到的路径就是业务流量走的路径
不同系统的 traceroute 默认探测协议不同:
| 系统 | 默认协议 | 默认目标端口 |
|---|---|---|
| Linux traceroute | UDP | 33434+ 递增 |
| macOS traceroute | UDP | 33434+ 递增 |
| Windows tracert | ICMP 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 输出可以直接对比
跨平台脚本里直接 traceroute 和 tracert 互换是常见踩坑点:
| 项目 | Linux traceroute | Windows tracert |
|---|---|---|
| 默认协议 | UDP | ICMP |
| 默认最大跳数 | 30 | 30 |
| 默认每跳探测数 | 3 | 3 |
| 默认超时 | 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 的本职是看路径,不是测连通性。判断"通不通"应该用:
- 测 ICMP 连通性 → Ping / Ping IPv6
- 测 TCP 端口连通性 → TCPing / TCPing IPv6
- 测应用层 → HTTP 探测 / HTTP IPv6 探测
工具用对场景,结论才靠谱。
误区 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 这个站做出来的初衷——单机命令行工具看到的只是单点视角,从北京电信看到的路径和从广州移动看到的可能完全不是一回事。直接用我们的多节点 Traceroute、Ping、TCPing、DNS 解析 工具就能直接看到不同地区的对比结果,不用自己搭多节点环境。
三、排障 SOP
把上面 8 条串成实战流程:
- 首选 mtr 替代单次 traceroute:持续探测能避免控制报文响应慢导致的误判
mtr -rwc 30 -T -P 443 target - 遇到 * * * 时,看最终目的地是否可达:最终能到则中间星号忽略;最终不可达则定位最后一个能响应的跳
- 遇到单跳延迟突增时,看下一跳是否恢复:下一跳正常说明是 ICMP 响应慢的假象;下一跳持续高延迟才是真问题
- 跨运营商、跨境问题必须多节点对比:单点视角信息量不足,区域差异看不出来——这种场景直接用 BiuPing 多节点 Traceroute 比命令行高效得多
- 测连通性用 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 提供了完整的网络诊断工具集,全部支持多节点对比:
- 综合 Ping - 多节点 ICMP/TCP 综合探测
- Traceroute / Traceroute IPv6 - 多节点路径追踪
- TCPing / TCPing IPv6 - 业务端口连通性测试
- Ping IPv6 - 纯 IPv6 链路测试
- DNS 查询 - 多地 DNS 解析对比
- HTTP 探测 / HTTP IPv6 探测 - 应用层连通性测试
- IP 信誉查询 - IP 黑名单 / 风险检测
- 我的 IP - 当前网络出口信息
欢迎收藏本文,下次 traceroute 出现奇怪结果时翻出来对照排查。