tracerouteLinux系统称为tracepathWindows系统称为tracert,是一种电脑网络工具。它可显示封包在IP网络经过的路由器IP位址

Linux系统上的traceroute命令

原理

程式是利用增加存活时间(TTL)值来实现其功能的。每当封包经过一个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消封包,并传送一个ICMP TTL封包给原封包的发出者。

程式发出的首3个封包TTL值是1,之后3个是2,如此类推,它便得到一连串封包路径。注意IP不保证每个封包走的路径都一样。

实现

主叫方首先发出 TTL=1 的数据包,第一个路由器将 TTL 减1得0后就不再继续转发此数据包,而是返回一个 ICMP 逾时报文,主叫方从逾时报文中即可提取出数据包所经过的第一个闸道器位址。然后又发出一个 TTL=2 的 ICMP 数据包,可获得第二个闸道器位址,依次递增 TTL 便获取了沿途所有闸道器位址。

需要注意的是,并不是所有闸道器都会如实返回 ICMP 超时报文。出于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种 ICMP 报文,其馀路由器或交换机也可被管理员主动修改配置变为不返回 ICMP 报文。因此 Traceroute 程式不一定能拿全所有的沿途闸道器位址。所以,当某个 TTL 值的数据包得不到响应时,并不能停止这一追踪过程,程式仍然会把 TTL 递增而发出下一个数据包。一直达到预设或用参数指定的追踪限制(maximum_hops)才结束追踪。

依据上述原理,利用了 UDP 数据包的 Traceroute 程式在数据包到达真正的目的主机时,就可能因为该主机没有提供 UDP 服务而简单将数据包抛弃,并不返回任何信息。为了解决这个问题,Traceroute 故意使用了一个大于 30000 的端口号,因 UDP 协定规定端口号必须小于 30000[来源请求] ,所以目标主机收到数据包后唯一能做的事就是返回一个“端口不可达”的 ICMP 报文,于是主叫方就将端口不可达报文当作跟踪结束的标志。

除了使用 UDP 外,也有使用TCP代替的实现方法。

例子

自北美西海岸到tools.wmflabs.org(位于弗吉尼亚州阿什本)的traceroute:

$ traceroute tools.wmflabs.org
traceroute to tools.wmflabs.org (185.15.56.11), 30 hops max, 60 byte packets
 1  _gateway (192.168.0.1)  344.557 ms  344.503 ms  344.487 ms
[... early hops omitted for privacy]
 5  sea-b2-link.telia.net (213.248.66.92)  308.709 ms  309.344 ms  308.181 ms
 6  chi-b21-link.telia.net (62.115.117.49)  653.177 ms  138.452 ms  151.218 ms
 7  * * nyk-bb2-link.telia.net (62.115.137.58)  158.432 ms
 8  ash-bb3-link.telia.net (62.115.141.244)  159.748 ms  159.100 ms *
 9  ash-b1-link.telia.net (62.115.143.121)  161.286 ms ash-b1-link.telia.net (62.115.143.79)  161.425 ms ash-b1-link.telia.net (62.115.143.121)  148.632 ms
10  wikimedia-ic-308845-ash-b1.c.telia.net (80.239.132.226)  148.194 ms  172.348 ms  171.331 ms
11  toolforge.org (185.15.56.11)  170.768 ms  204.919 ms  204.886 ms

其中,一些反向DNS中包含短语“ash”,说明信息正在通过Ashburn。

历史

根据traceroute的man page:1987年,Steve Deering建议Van Jacobson写一个这样的程式。C. Philip Wood、Tim Seaver和Ken Adelman为这个程式提供一些意见或改动。

Windows NT系统有结合ping和traceroute的pathping工具。

外部链接