跳转到内容

Traceroute

本页使用了标题或全文手工转换
维基百科,自由的百科全书


Linux系统上的traceroute命令

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

原理

程序是利用增加存活时间(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工具。

外部链接