traceroute - 绘制数据包的旅程
如果说 ping 检查的是"能否到达目的地",那么 traceroute 可视化的是"经过哪条路径到达目的地"。当你访问 IP 确认时,你的数据包会经过数十个网络设备,从家用路由器经过 ISP、IX (互联网交换点)、海底光缆到数据中心。traceroute 显示沿途每一跳 (中继点) 的 IP 地址和延迟。
TTL 技巧 - 巧妙的机制
traceroute 巧妙地利用了 IP 数据包中的 TTL (Time To Live,生存时间) 字段。
TTL 是一个计数器,每经过一个路由器就减 1。当 TTL 减到 0 时,该路由器丢弃数据包并向发送方返回 ICMP Time Exceeded 消息。这个机制原本是为了防止数据包在网络上无限循环。
traceroute 反其道而行之:
- 发送 TTL=1 的数据包 → 在第一个路由器 TTL 减为 0,返回 ICMP Time Exceeded → 第 1 跳的 IP 地址和延迟被揭示
- 发送 TTL=2 的数据包 → 在第二个路由器 TTL 减为 0 → 第 2 跳被揭示
- 依次将 TTL 增加到 3、4、5……重复直到到达目的地
"每次将 TTL 加 1"这个简单的想法,使网络路由可视化成为可能。
traceroute 与 tracert - Unix 和 Windows 的差异
在 Unix/Linux/macOS 上命令是 traceroute,在 Windows 上是 tracert。除了名称不同,默认行为也有差异。
- Unix traceroute:默认使用 UDP 数据包。向目标端口 33434 开始发送,每次递增。到达目的地时返回 ICMP Port Unreachable
- Windows tracert:默认使用 ICMP Echo Request。由于使用与 ping 相同的协议,更容易被阻止 ICMP 的防火墙影响
Unix traceroute 可以用 -I 选项切换到 ICMP 模式,用 -T 切换到 TCP 模式。在防火墙阻止 UDP 或 ICMP 的环境中,TCP 模式 (端口 80 或 443) 很有效。
解读 traceroute 输出
典型的 traceroute 输出如下:
1 192.168.1.1 1.2 ms 0.9 ms 1.1 ms2 10.0.0.1 5.3 ms 4.8 ms 5.1 ms3 203.0.113.1 12.4 ms 11.9 ms 12.2 ms4 * * *5 198.51.100.1 85.3 ms 84.7 ms 85.1 ms6 93.184.216.34 90.2 ms 89.8 ms 90.5 ms
- 第 1 跳:你的家用路由器。延迟约 1 毫秒,本地网络通信
- 第 2-3 跳:ISP 网络内的路由器。延迟逐渐增加
- 第 4 跳 "* * *":该路由器被配置为不返回 ICMP Time Exceeded。数据包正在通过,但没有响应。这不是故障
- 第 5 跳:延迟急剧跳升 (12 ms → 85 ms)。这很可能表示穿越了海底光缆
- 第 6 跳:目标服务器
每一跳进行三次测量,因为网络延迟会波动,多次测量可以提高可靠性。
通过 traceroute 看到的"互联网地理"
traceroute 的结果可以揭示数据包的物理路径。
- 延迟突然飙升:穿越洲际海底光缆的跳数会出现数十毫秒的延迟增加。东京到洛杉矶通常增加约 50-60 毫秒,东京到伦敦约 100-120 毫秒
- 主机名中的城市名:许多 ISP 和运营商在路由器主机名中包含城市名。
tky(东京)、lax(洛杉矶)、ams(阿姆斯特丹) 等缩写揭示了数据包的地理路径 - AS 号:
traceroute -a(Linux) 显示每一跳的 AS (自治系统) 号。AS 号揭示了数据包正在穿越哪个组织的网络
traceroute 的局限性和注意事项
- 非对称路由:去程和回程数据包可能走不同的路径。traceroute 只显示去程路由
- MPLS 隧道:当 ISP 使用 MPLS (多协议标签交换) 时,隧道内的跳数可能不可见
- 负载均衡器:多次对同一目标运行 traceroute 可能显示不同路由,因为负载均衡器将数据包分配到不同路径
- 速率限制:当路由器对 ICMP Time Exceeded 响应进行速率限制时,显示的延迟可能高于实际值
总结
traceroute 是一个利用简单的 TTL 机制来可视化数据包路由的优秀工具。试着对你在 IP 确认上看到的 IP 地址运行 traceroute,你会看到数据包经过了哪些 ISP、城市和海底光缆。亲眼看到互联网"地图"的体验,将加深你对网络的理解。