本文目录导读:

traceroute(在 Windows 系统中是 tracert)通过一种逐跳探测的方式,利用 IP 包头的 TTL(生存时间) 字段和 ICMP(互联网控制消息协议) 或 UDP(用户数据报协议) 的超时机制,一步步“套出”每一跳路由器的地址。
它的核心原理可以概括为:通过故意制造错误,迫使中间路由器回报自己的身份。
下面详细拆解它的工作过程:
核心机制:TTL(生存时间)
- 每个 IP 数据包都有一个 TTL 字段(通常初始值为 64 或 128)。
- 每经过一个路由器(一跳),TTL 值减 1。
- 当 TTL 减为 0 时,路由器会丢弃该数据包,并向发送方(你的电脑)发送一个 ICMP Time Exceeded(超时) 错误消息。
- 这个 ICMP 错误消息的源 IP 地址,就是丢弃数据包的那个路由器的 IP 地址。
详细步骤(以 Unix/Linux 的 UDP traceroute 为例)
假设你想追踪到目标 8.8.8 的路由。
-
第一跳:
- 你发送一个 TTL=1 的 UDP 数据包(或 ICMP 请求包)到
8.8.8的一个大端口(如 33434)。 - 数据包到达第一跳路由器(你的网关),TTL 变成 0。
- 路由器发现 TTL 耗尽,丢弃该包,并向你的 IP 回复一个 ICMP 超时消息。
- 你收到这个回复,从中提取出第一跳路由器的 IP 地址(
168.1.1或0.0.1)。 - 结果:
1 192.168.1.1
- 你发送一个 TTL=1 的 UDP 数据包(或 ICMP 请求包)到
-
第二跳:
- 你发送一个 TTL=2 的 UDP 数据包到
8.8.8。 - 第一跳路由器(192.168.1.1)看到 TTL=2,合法,减为 1,转发给下一跳。
- 第二跳路由器收到后,TTL 从 1 变成 0,丢弃,回复 ICMP 超时消息。
- 你收到回复,得到第二跳路由器的 IP。
- 结果:
2 10.0.0.2
- 你发送一个 TTL=2 的 UDP 数据包到
-
重复步骤: 依次发送 TTL=3、4、5... 的数据包,直到发生以下两种情况之一:
- 到达目标主机: 当 TTL 足够大,数据包最终到达目标
8.8.8,目标主机收到 UDP 包后,发现端口(如 33434)未监听,会回复一个 ICMP Port Unreachable(端口不可达) 错误。traceroute收到这个错误,就知道已经到达终点,停止探测。 - 达到最大跳数: 通常默认最多 30 跳,超过则停止。
- 到达目标主机: 当 TTL 足够大,数据包最终到达目标
三种不同的实现方式
不同系统为了兼容防火墙或策略,使用了不同的探测协议:
| 实现方式 | 使用协议 | 发送数据包 | 期望的回复 | 常见系统 |
|---|---|---|---|---|
| UDP 模式 | UDP + ICMP | 发送 UDP 包到目标的高位端口(如 33434+) | 中间跳:ICMP Time Exceeded 终点:ICMP Port Unreachable |
Linux、macOS (默认) |
| ICMP 模式 | ICMP | 发送 ICMP Echo Request(Ping 包) | 中间跳:ICMP Time Exceeded 终点:ICMP Echo Reply |
Windows (tracert)、部分 Linux/Unix 选项 |
| TCP 模式 | TCP | 发送 TCP SYN 包(如 HTTP 端口 80) | 中间跳:ICMP Time Exceeded 终点:TCP SYN-ACK (或 RST) |
tcptraceroute 工具或 nmap |
- 为什么 Windows 用 ICMP 而 Linux 默认用 UDP?
这主要是历史原因和设计哲学不同,ICMP 模式更简单,但容易被防火墙屏蔽,UDP 模式利用高位端口,有时能穿透某些只拦截 ICMP 的防火墙,但目标主机的高位端口如果被占用,可能会返回不同的结果。
输出结果解读
traceroute 的典型输出如下:
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 * * * # 第一跳无响应(可能被防火墙阻止)
2 10.0.0.1 (10.0.0.1) 2.123 ms 2.034 ms 1.998 ms # 第二跳:IP + 往返时间(3次探测)
3 172.16.1.1 (172.16.1.1) 5.234 ms 5.145 ms 5.111 ms
...
6 8.8.8.8 (8.8.8.8) 15.345 ms 15.221 ms 15.198 ms # 到达目标
- * `**: 表示该跳没有收到 ICMP 回复,常见原因:
- 路由器配置了不回复 ICMP 超时消息(安全策略)。
- 防火墙屏蔽了 ICMP 包。
- 网络拥塞导致丢包。
- 往返时间(RTT): 显示三次探测的耗时,如果时间突然变大,说明该跳可能存在性能瓶颈或物理距离较远。
局限性
- 路径不对称:
traceroute只显示了从你到目标的路径,回程路径可能完全不同(中间路由器不同),但你无法直接看到回程路径。 - 负载均衡: 现代网络常用多路径负载均衡,由于
traceroute每跳发送不同的包,这些包可能走不同的路径,导致输出结果出现混乱的 IP 地址和时间。 - 防火墙屏蔽: 很多核心路由器或目标主机会直接丢弃 ICMP 超时消息或 UDP 包,导致出现 而无法探知路由。
- IP 地址变化: 同一个路由器可能有多个接口,不同方向的流量可能显示不同 IP。
traceroute 通过逐步增加 TTL 的方式,让每一跳路由器“不得不”回复一个 ICMP 错误消息(因为它丢弃了数据包),从而暴露自己的位置,你最终看到的,就是这条数据包路径上所有愿意“开口”的路由器的名单。
标签: Traceroute原理 路由路径探测