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工具。

外部連結