一、什么是 Traceroute?
Traceroute(路由追踪)是一种网络诊断工具,用于探测本机到目标 IP 地址之间,数据包经过的路由节点,以及各节点的往返时间(RTT)。
它可以帮助网络管理员分析:
-
数据包经过了哪些路由器;
-
网络延迟主要出现在哪一段;
-
网络在哪个位置可能出现丢包或中断;
-
不同网络协议、端口是否受到防火墙限制;
-
到达目标服务器的网络路径是否正常。
需要注意,Traceroute 是一种网络诊断工具,而不是一种独立的网络协议。它通过发送不同类型的 IP 探测报文,并利用沿途设备返回的 ICMP 消息来推断路径。
二、Traceroute 的基本工作原理
Traceroute 的核心机制是 IP 数据包中的 TTL(Time To Live,生存时间)字段。
TTL 是 IPv4 报文头中的一个字段。每经过一个三层路由转发节点,TTL 通常减 1。当 TTL 减少到 0 时,路由器通常会丢弃该数据包,并向发送方返回 ICMP Time Exceeded(超时)消息。
Traceroute 正是利用这一机制逐跳探测网络路径。
2.1 TTL 逐步递增
假设本机要访问目标服务器 8.8.8.8,Traceroute 会依次发送 TTL 不同的探测包:
| 探测次数 | 发送的 TTL | 预期结果 |
|---|---|---|
| 第一次 | 1 | 第一台路由器返回超时消息 |
| 第二次 | 2 | 第二台路由器返回超时消息 |
| 第三次 | 3 | 第三台路由器返回超时消息 |
| 第四次 | 4 | 第四台路由器返回超时消息 |
| …… | …… | …… |
| 第 N 次 | N | 继续探测后续节点,直到目标响应或达到最大 TTL |
通过不断增加 TTL,Traceroute 就可以逐步获得沿途路由节点的信息。
2.2 Traceroute 的典型过程
假设网络路径如下:
本机
|
| TTL=1
v
路由器 A ---- 返回 ICMP Time Exceeded
|
| TTL=2
v
路由器 B ---- 返回 ICMP Time Exceeded
|
| TTL=3
v
路由器 C ---- 返回 ICMP Time Exceeded
|
| TTL=4
v
目标服务器 ---- 返回目标响应
Traceroute 会记录每次探测的响应 IP 地址和往返时间。
2.3 为什么 Traceroute 会显示星号?
例如:
traceroute to 8.8.8.8, 30 hops max
1 192.168.1.1 1.2 ms
2 10.10.10.1 3.5 ms
3 * * *
4 219.158.3.10 25.6 ms
5 * * *
6 8.8.8.8 35.2 ms
其中:
-
192.168.1.1:第一跳正常返回响应。 -
10.10.10.1:第二跳正常返回响应。 -
* * *:没有收到对应探测包的有效响应。 -
219.158.3.10:第四跳正常返回响应。 -
8.8.8.8:最终目标响应。
星号不等于网络中断。
某些路由器可能正常转发数据包,但出于安全策略、控制平面保护或 ICMP 限速等原因,不响应 TTL 超时探测。
因此,即使中间出现大量星号,最终目标仍然可能正常访问。
三、Traceroute 的主要测试方式
不同操作系统、不同 Traceroute 实现支持的探测方式有所不同。
在常见 Linux traceroute 软件包中,主要有以下几种方式。
3.1 UDP Traceroute(默认方式)
UDP 是传统 Traceroute 最常见的探测方式。
Linux 中直接执行:
traceroute 8.8.8.8
通常就是使用 UDP 方式。
其工作原理:
-
向目标发送 UDP 数据包。
-
初始 TTL 设置为 1。
-
沿途路由器发现 TTL 归零,返回 ICMP Time Exceeded。
-
Traceroute 逐步增加 TTL,继续探测。
-
当探测包到达目标时,目标通常返回 ICMP Destination Unreachable(Port Unreachable),表示目标端口不可达,Traceroute 据此判断已经到达终点。
传统 Linux Traceroute 通常从 UDP 33434 端口开始,并逐步改变目的端口。
测试命令:
traceroute -n 8.8.8.8
特点:
-
传统、常见,适合基础路由诊断。
-
不需要目标开放某个特定业务端口。
-
可能被防火墙过滤。
-
目标端口没有应用监听时,通常依靠 Port Unreachable 判断抵达目标。
3.2 ICMP Traceroute
ICMP Traceroute 使用 ICMP Echo Request 报文进行探测,与常见的 Ping 使用相同类型的请求报文。
Linux 命令:
traceroute -I 8.8.8.8
其工作原理:
-
发送 ICMP Echo Request,TTL 从 1 开始。
-
中间路由器在 TTL 耗尽时返回 ICMP Time Exceeded。
-
TTL 逐步递增。
-
最终目标返回 ICMP Echo Reply,表示到达目标。
特点:
-
与 Ping 的探测报文类型相同。
-
适合排查 ICMP 流量路径。
-
可以用于观察 ICMP Echo 是否受到过滤。
-
部分路由器可能不响应 ICMP 探测,导致路径显示不完整。
需要特别注意:Ping 成功,不代表 ICMP Traceroute 一定能够显示完整路径。Ping 只需要最终目标回应,而 Traceroute 还需要中间路由器返回 TTL 超时消息。
3.3 TCP Traceroute
TCP Traceroute 使用 TCP 报文进行路由探测。
Linux 命令:
traceroute -T -p 443 8.8.8.8
其中:
-
-T:使用 TCP 方式。 -
-p 443:指定目标 TCP 端口为 443。
TCP Traceroute 通常使用 TCP SYN 探测报文,通过类似半开连接的方式进行探测。
其工作原理:
-
向目标 TCP 端口发送 SYN 报文。
-
设置 TTL=1。
-
中间路由器在 TTL 耗尽时返回 ICMP Time Exceeded。
-
逐步增加 TTL,继续探测。
-
当探测包到达目标时,目标可能返回 SYN-ACK 或 RST,Traceroute 根据目标响应判断抵达终点。
特点:
-
可以指定目标业务端口。
-
适合排查 TCP 流量是否受到防火墙限制。
-
可用于测试 HTTP、HTTPS、SSH 等服务对应的网络路径。
-
目标端口关闭时,也可能收到 RST 响应,从而确认目标可达。
-
不同网络设备可能对 TCP SYN 探测采取不同处理策略。
例如,访问某个服务器的 443 端口正常,但默认 UDP Traceroute 无法显示完整路径,可以尝试:
traceroute -T -p 443 目标IP
这也是实际网络故障排查中非常有价值的一种方法。
3.4 固定端口 UDP Traceroute
默认 UDP Traceroute 通常使用逐渐变化的目的端口。
Linux traceroute 还支持固定目的端口的 UDP 探测:
traceroute -U -p 53 8.8.8.8
其中:
-
-U:使用固定目的端口的 UDP 方式。 -
-p 53:指定目标 UDP 端口为 53。
与默认 UDP 方式相比,固定端口 UDP 可以模拟访问特定 UDP 服务的流量。
例如:
-
UDP 53:DNS 服务。
-
UDP 123:NTP 服务。
-
UDP 161:SNMP 服务。
但需要注意,端口只是探测报文的目的端口,并不意味着目标服务一定会接受该报文。部分应用可能会收到探测数据并作出异常响应。
3.5 DCCP Traceroute
DCCP(Datagram Congestion Control Protocol)是一种支持拥塞控制的数据报传输协议。
Linux traceroute 软件包支持使用 DCCP Request 报文进行路由探测:
traceroute -D 8.8.8.8
特点:
-
使用 DCCP 协议报文进行探测。
-
采用类似 TCP 半开连接的探测方式。
-
需要网络路径和目标支持相应协议,实际适用范围有限。
-
日常网络排障中使用较少。
3.6 UDPLite Traceroute
UDPLite 是一种与 UDP 类似的数据报协议,区别在于它允许对报文部分内容进行校验。
Linux 命令:
traceroute -UL 8.8.8.8
特点:
-
使用 UDPLite 报文进行探测。
-
需要沿途网络设备支持相应协议。
-
实际部署和使用较少。
四、不同 Traceroute 方式对比
| 测试方式 | Linux 参数 | 探测协议 | 主要用途 |
|---|---|---|---|
| 默认 Traceroute | 默认 | UDP | 常规路由追踪 |
| ICMP Traceroute | -I | ICMP | 排查 ICMP 路径 |
| TCP Traceroute | -T | TCP | 排查 TCP 业务路径 |
| 固定端口 UDP | -U | UDP | 指定 UDP 端口探测 |
| DCCP Traceroute | -D | DCCP | 特殊协议路径测试 |
| UDPLite Traceroute | -UL | UDPLite | 特殊协议路径测试 |
实际工作中,最常用的是 UDP、ICMP 和 TCP 三种方式。
五、Traceroute 常用参数详解
以下以 Linux traceroute 软件包为例。
| 参数 | 含义 | 示例 |
|---|---|---|
-n | 不进行 DNS 反向解析,直接显示 IP | traceroute -n 8.8.8.8 |
-m | 设置最大 TTL,也就是最大探测跳数 | -m 60 |
-q | 设置每一跳的探测次数 | -q 1 |
-w | 设置等待响应的时间,单位为秒 | -w 2 |
-I | 使用 ICMP 探测 | -I |
-T | 使用 TCP 探测 | -T |
-U | 使用固定端口 UDP 探测 | -U |
-p | 设置目标端口(具体含义与探测方法有关) | -p 443 |
-f | 设置起始 TTL | -f 5 |
-i | 指定探测使用的网络接口 | -i eth0 |
-s | 指定探测源 IP 地址 | -s 192.168.1.10 |
-t | 设置 IP 服务类型字段(TOS/DSCP 相关) | -t 16 |
5.1 修改最大探测跳数
默认情况下,Linux Traceroute 的最大 TTL 通常为 30。
如果希望追踪更远的路径:
traceroute -m 60 47.104.38.82
这里的 60 表示最多探测到 TTL=60,并不代表一定能够收到 60 台路由器的响应。
5.2 减少每一跳的探测次数
默认情况下,每一跳可能发送多个探测包。
如果只想快速观察路径:
traceroute -q 1 47.104.38.82
每一跳只发送一个探测包。
5.3 增加等待时间
如果网络延迟较高,可以增加等待时间:
traceroute -w 5 47.104.38.82
表示每个探测包等待约 5 秒。
5.4 组合参数进行快速追踪
traceroute -n -m 60 -q 1 -w 2 47.104.38.82
这条命令适合日常快速排查:
-
不进行 DNS 解析;
-
最大探测 60 跳;
-
每跳发送一个探测包;
-
每次等待 2 秒。
六、如何判断 Traceroute 的结果?
6.1 正常到达目标
1 192.168.1.1 1.2 ms
2 10.10.10.1 3.5 ms
3 219.158.3.10 25.6 ms
4 8.8.8.8 35.2 ms
表示探测包成功获得了各跳响应,并到达目标。
6.2 中间节点出现星号
1 192.168.1.1 1.2 ms
2 10.10.10.1 3.5 ms
3 * * *
4 219.158.3.10 25.6 ms
5 8.8.8.8 35.2 ms
表示第三跳没有返回有效响应,但第四跳和最终目标仍然能够响应。
不能据此认定第三跳发生了丢包或网络中断。
6.3 后续全部出现星号
1 192.168.1.1 1.2 ms
2 10.10.10.1 3.5 ms
3 219.158.3.10 25.6 ms
4 * * *
5 * * *
6 * * *
可能原因包括:
-
后续路由器不响应 ICMP TTL 超时消息;
-
防火墙过滤了探测报文或返回报文;
-
网络设备对 ICMP 进行了限速;
-
目标服务器不响应当前类型的探测报文。
需要结合 Ping、TCP 连接测试及其他探测方式判断。
6.4 出现不同的错误代码
Linux Traceroute 可能显示一些特殊标记:
| 标记 | 含义 |
|---|---|
!N | Network Unreachable,网络不可达 |
!H | Host Unreachable,主机不可达 |
!P | Protocol Unreachable,协议不可达 |
!X | Communication Administratively Prohibited,管理策略禁止通信 |
!F | Fragmentation Needed,需要分片或路径 MTU 相关问题 |
!T | Precedence cutoff,优先级相关的不可达响应 |
这些标记能够为网络故障定位提供更多线索。
七、为什么 Ping 成功,Traceroute 却失败?
这是网络排障中经常遇到的问题。
例如:
ping 47.104.38.82
返回:
64 bytes from 47.104.38.82: icmp_seq=1 ttl=91 time=16.0 ms
说明目标能够响应 ICMP Echo Request。
但执行:
traceroute 47.104.38.82
却可能出现:
1 10.10.10.3
2 *
3 221.15.169.41
4 *
5 *
6 *
这并不矛盾。
原因在于:
-
Ping 主要依赖最终目标返回 ICMP Echo Reply。
-
Traceroute 需要沿途路由器返回 ICMP Time Exceeded。
-
中间设备可以正常转发业务流量,却不回应 TTL 超时探测。
-
不同协议可能受到不同的过滤策略。
因此,不能只根据 Traceroute 是否完整来判断目标网络是否可达。
八、TCP Traceroute 的实际应用案例
假设目标服务器为:
47.104.38.82
分别执行三种测试:
第一种:默认 UDP Traceroute
traceroute -n -m 60 -q 1 -w 2 47.104.38.82
可能只显示前几跳,后续全部为星号。
第二种:ICMP Traceroute
traceroute -I -n -m 60 -q 1 -w 2 47.104.38.82
也可能只能显示前几跳。
第三种:TCP 443 Traceroute
traceroute -T -n -p 443 -m 60 -q 1 -w 2 47.104.38.82
如果目标服务器的 TCP 443 端口允许访问,则可能进一步追踪到目标。
这个案例说明:
不同协议的探测结果可能存在明显差异。
当默认 Traceroute 无法获得完整路径时,可以尝试 TCP Traceroute,并选择实际业务使用的目标端口。
九、Traceroute 的扩展工具
除了传统 Traceroute,还有一些常用的网络诊断工具。
9.1 MTR
MTR(My Traceroute)将 Traceroute 与 Ping 结合起来,可以持续探测各个路由节点,并统计丢包率、延迟、最小延迟、最大延迟和平均延迟等数据。
安装:
apt install mtr-tiny
常用命令:
mtr 8.8.8.8
TCP 模式:
mtr -T -P 443 8.8.8.8
生成报告:
mtr -rwzc 100 8.8.8.8
其中:
-
-r:报告模式; -
-w:宽格式输出; -
-z:显示 AS 信息(取决于版本和相关数据支持); -
-c 100:执行 100 次探测。
MTR 适合持续观察网络质量,尤其适合分析间歇性延迟和丢包。
需要注意:中间节点显示丢包,不一定代表它转发的业务流量也发生了同等比例的丢包。应结合后续节点和最终目标的结果判断。
9.2 Tracepath
Tracepath 是 Linux 下的路径探测工具,除了追踪路由,还可以帮助发现路径 MTU(Path MTU)。
命令:
tracepath 8.8.8.8
特点:
-
可以探测网络路径;
-
可以发现路径 MTU 信息;
-
通常不需要 root 权限;
-
适合排查分片、MTU 不匹配等问题。
9.3 Paris Traceroute
传统 Traceroute 在发送不同探测包时,可能改变 UDP 端口等报文头字段。
在使用 ECMP(等价多路径路由)的网络中,设备可能根据报文头字段进行哈希选路,导致不同探测包经过不同路径。
Paris Traceroute 通过控制探测报文的相关字段,尽量避免这种情况对路径测量造成的干扰。
它适合研究:
-
ECMP 多路径路由;
-
传统 Traceroute 结果不稳定;
-
同一目标出现多组不同路由节点;
-
网络路径测量与分析。
十、Traceroute 使用中的注意事项
10.1 Traceroute 看到的不是完整的网络拓扑
Traceroute 只能显示能够通过探测响应观察到的节点。
不响应 ICMP 的设备可能仍然正常转发数据包,因此无法保证每台路由器都显示出来。
10.2 路径可能不止一条
现代网络通常采用 ECMP 等负载均衡机制。
同一个源地址访问同一个目标地址,不同探测流量可能经过不同的路径。
因此,多次执行 Traceroute,结果可能有所不同。
10.3 往返延迟不等于单向延迟
Traceroute 显示的时间通常是从本机发送探测包,到收到路由器返回响应的往返时间(RTT)。
返回路径可能与去程路径不同。
所以不能简单地把每一跳的 RTT 相减,就认定某一段链路的单向延迟。
10.4 NAT 地址不一定显示在 Traceroute 中
网络中可能存在 NAT 或运营商 CGNAT。
NAT 负责转换源地址和端口,而 Traceroute 显示的是收到的 TTL 超时响应源地址。
公网出口 IP 不一定就是 Traceroute 中某一跳显示的地址。
10.5 IPv6 使用 Hop Limit
IPv6 不使用 IPv4 的 TTL 字段,而是使用 Hop Limit 字段。
Linux 下可以使用:
traceroute -6 目标IPv6地址
其逐跳探测原理与 IPv4 类似。
十一、实际网络排障建议
遇到目标无法访问或 Traceroute 不完整时,建议按照以下顺序排查:
| 步骤 | 测试内容 | 命令 |
|---|---|---|
| 1 | 测试目标是否响应 Ping | ping 目标IP |
| 2 | 默认 UDP 路由追踪 | traceroute -n 目标IP |
| 3 | ICMP 路由追踪 | traceroute -I -n 目标IP |
| 4 | TCP 443 路由追踪 | traceroute -T -n -p 443 目标IP |
| 5 | TCP 端口连通性 | nc -vz 目标IP 443 |
| 6 | 持续观察网络质量 | mtr -rw 目标IP |
| 7 | 路径 MTU 检测 | tracepath 目标IP |
如果目标提供 HTTP/HTTPS 服务,还可以进一步使用:
curl -I --connect-timeout 5 https://目标IP
通过不同层次的测试,区分网络层可达性、传输层端口连通性以及应用层服务是否正常。
十二、总结
Traceroute 是网络故障排查中非常重要的工具,但它的结果需要结合探测协议、网络设备策略和目标服务状态进行分析。
日常排障最值得掌握的是三种方式:
-
UDP Traceroute:传统路由追踪,适合基础路径分析。
-
ICMP Traceroute:适合观察 ICMP 探测路径。
-
TCP Traceroute:适合排查实际 TCP 业务端口的网络路径,尤其适用于 UDP 或 ICMP 探测受到限制的情况。
当一种探测方式无法获得完整路径时,不要直接判断网络中断。应尝试更换探测协议,并结合 Ping、TCP 端口检测、MTR 等工具综合分析。
真正有效的网络诊断,不是单纯追求 Traceroute 显示多少跳,而是通过多种测试手段,准确判断数据包能否到达目标,以及故障可能发生在哪个网络层次。
345



被折叠的 条评论
为什么被折叠?



