traceroute
是一个网络诊断工具,用于跟踪和显示数据包从源主机到目标主机所经过的每一跳(路由器)的路径。它能够帮助用户识别网络路径中的瓶颈和故障点。traceroute
的工作原理主要基于 ICMP(Internet Control Message Protocol)或 UDP(User Datagram Protocol)和 IP 包的生存时间(TTL,Time To Live)字段。以下是详细的工作原理:
工作原理
-
初始化:
traceroute
工具在运行时,用户指定目标主机的IP地址或域名。- 工具初始化一些参数,例如最大跳数、每个跳数的探测包数量等。
-
TTL 字段的作用:
- IP 包的 TTL 字段用于限制包在网络中的生存时间。每经过一个路由器,TTL 值减1。当 TTL 值减到0时,路由器丢弃该包并发送一个 ICMP “超时”(Time Exceeded)消息回源主机。
-
发送探测包:
traceroute
首先发送一个TTL值为1的探测包(ICMP或UDP包)到目标主机。- 路由器R1收到TTL值为1的包,将TTL减为0,丢弃该包,并向源主机发送一个ICMP超时消息。
-
接收 ICMP 超时消息:
- 源主机收到来自R1的ICMP超时消息,可以知道R1是到目标主机的第一跳。
traceroute
记录R1的IP地址和往返时间(RTT)。
-
增加 TTL 并重复:
traceroute
接着发送TTL值为2的探测包。R1将包转发给下一跳路由器R2。- R2收到TTL值为1的包,将TTL减为0,丢弃该包,并向源主机发送ICMP超时消息。
- 源主机记录R2的IP地址和往返时间。
-
逐步增加 TTL:
- 这个过程重复进行,每次TTL值增加1,直到包达到目标主机或达到预设的最大跳数。
- 当探测包到达目标主机时,目标主机通常会发送一个ICMP "目的不可达"消息,表示包已到达。
-
路径追踪完成:
traceroute
显示从源主机到目标主机路径上的所有路由器的IP地址和各跳的RTT。
UDP 和 ICMP 的使用
-
Linux 中的 traceroute:
- 默认情况下使用UDP包。目标端口从高值(通常是33434)开始递增。
- 当目标主机收到UDP包时,如果端口不可达,它将发送一个ICMP "端口不可达"消息。
-
Windows 中的 tracert:
- 使用ICMP回显请求(ICMP Echo Request)。每个ICMP回显请求的TTL值逐步增加。
- 目标主机会回复一个ICMP回显应答(ICMP Echo Reply)消息。
示例
运行 traceroute
的示例输出:
traceroute to www.example.com (93.184.216.34), 30 hops max, 60 byte packets
1 192.168.0.1 (192.168.0.1) 1.123 ms 1.089 ms 1.057 ms
2 10.0.0.1 (10.0.0.1) 2.345 ms 2.300 ms 2.265 ms
3 203.0.113.1 (203.0.113.1) 4.567 ms 4.523 ms 4.485 ms
4 198.51.100.1 (198.51.100.1) 10.789 ms 10.754 ms 10.710 ms
5 93.184.216.34 (93.184.216.34) 20.001 ms 19.967 ms 19.923 ms
- 第一跳:本地路由器,IP地址192.168.0.1,往返时间约1毫秒。
- 第二跳:第一个中间路由器,IP地址10.0.0.1,往返时间约2.3毫秒。
- 第三跳:第二个中间路由器,IP地址203.0.113.1,往返时间约4.5毫秒。
- 第四跳:第三个中间路由器,IP地址198.51.100.1,往返时间约10.7毫秒。
- 第五跳:目标主机,IP地址93.184.216.34,往返时间约20毫秒。
总结
traceroute
通过逐步增加探测包的TTL值来确定数据包从源主机到目标主机路径上的每个中间路由器。利用ICMP超时消息或ICMP端口不可达消息,它能够显示每一跳的IP地址和往返时间,帮助用户识别网络路径中的问题和瓶颈。