traceroute 工具用于跟踪数据报的传输路径:当数据报从一台计算机传向另一台计算机时,会经过多重的网关,traceroute 命令能够找到数据报传输路径上的所有路由器。通过 traceroute 工具跟踪到的传输路径只是这两台计算机之间众多通路中的一条,所以不能肯定火假设数据报会永远只走这一条通路。
traceroute 过程
1. 将传递到目的 IP 地址的 ICMP Echo Request 消息的 TTL 值设置为 1,该数据报经过第一个路由器时,其 TTL 值减去 1,此时新产生的 TTL 值为 0。
2. 由于 TTL 值被置为 0,路由器判断此时不应该尝试继续转发数据报,而是直接抛弃该数据报。由于数据报的生存周期(TTL 值)已经到期,这个路由器会发送一个 ICMP 时间超时,即 TTL 值过期信息返回到客户端计算机。
3. 此时,发出 traceroute 命令的客户端计算机将显示该路由器的名称,之后可以再发送一个 ICMP Echo 消息并把 TTL 值设置为 2。
4. 第一个路由器仍然对这个 TTL 值减 1,然后,如果可能的话,将这个数据报转发到传输路径上的下一跳。当数据报抵达第二个路由器,TTL 值会再被减去 1,变成 0。
5. 第二个路由器会像第一个路由一样,抛弃掉这个数据报,并像第一个路由器那样返回一个 ICMP 超时消息。
6. 该过程会一直持续,traceroute 命令不停递增 TTL 值,而传输路径上的路由器不断递减该值,直到数据报最终抵达预期的目的地。
7. 当目的计算机接收到 ICMP Echo Request 消息时,会回传一个 ICMP Echo Reply 消息。
命令格式
traceroute [options] [host]
命令参数
-4
使用 IPv4。
-6
使用 IPv6。
-I
使用 ICMP ECHO 探测。
-T
使用 TCP SYN 探测。
-U
使用 UDP 数据报探测,这是默认的探测方式。
-d
启用 Socket 级的调试功能(如果 Linux 内核支持的话)。
-F
设置 Don’t Fragment 位,不允许 IP 封包分段。
-f first_ttl
设置第一个检测数据包的存活数值 TTL 的大小,默认值为 1。
--help
打印帮助信息
-m max_ttl
指定探测时的最大跳数,即 TTL 的最大值,默认值为 30。
-n
显示信息时不会尝试将 IP 地址映射成主机名称。
-p port
设置目的端口号。对于 ICMP 追踪,则是指定 ICMP 的序列值。
-q nqueries
设置每一跳的探测包数量,默认值为 3 。
-r
绕过正常的路由表,直接发送到网络直连的主机。
-t tos
当使用 IPv4 时,设置 Type of Service 值;使用 IPv6 时,则设置 Traffic Control 值。
-V
打印版本信息
-w waittime
设置等待测试响应的秒数,默认值为 5.0。
实例
a) 显示本机至 example.com 数据包的传输路径。
[huey@huey-K42JE ~]$ traceroute example.com traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets 1 10.1.228.254 (10.1.228.254) 1.545 ms 1.470 ms 1.381 ms 2 192.168.100.2 (192.168.100.2) 0.818 ms 0.691 ms 0.601 ms 3 * * * 4 * * * 5 * * * ... 28 * * * 29 * * * 30 * * *
记录序号从 1 开始,每行记录表示一跳,每一跳表示一个网关。除了主机名称与其 IP 地址外,每行记录还有 3 个时间,即默认的 -q 值。这些时间值表示数据报抵达路由器的往返时间。以 * * * 表示的记录,是因为在默认的等待时间 5.0 秒内没有接收到 ICMP 响应。这可能是因为防火墙把 ICMP 返回信息过滤掉。