raceroute,現代Linux系統稱為tracepath,Windows系統稱為tracert,是一種電腦網路工具。它可顯示封包在IP網路經過的路由器的IP位址。 目錄 [隱藏] 1 原理 2 實現 3 例子 4 歷史 5 外部連結 原理[編輯] 程式是利用增加存活時間(TTL)值來實現其功能的。每當封包經過一個路由器,其存活時間就會減1。當其存活時間是0時,主機便取消封包,並傳送一個ICMP TTL封包給原封包的發出者。 程式發出的首3個封包TTL值是1,之後3個是2,如此類推,它便得到一連串封包路徑。注意IP不保證每個封包走的路徑都一樣。 實現[編輯] 主叫方首先發出 TTL=1 的 UDP 資料包,第一個路由器將 TTL 減1得0後就不再繼續轉發此資料包,而是返回一個 ICMP 逾時報文,主叫方從逾時報文中即可提取出資料包所經過的第一個閘道器位址。然後又發出一個 TTL=2 的 UDP 資料包,可獲得第二個閘道器位址,依次遞增 TTL 便獲取了沿途所有閘道器位址。 需要注意的是,並不是所有閘道器都會如實返回 ICMP 超時報文。出於安全性考慮,大多數防火墻以及啓用了防火墻功能的路由器預設配置為不返回各種 ICMP 報文,其餘路由器或交換機也可被管理員主動修改配置變為不返回 ICMP 報文。因此 Traceroute 程式不一定能拿全所有的沿途閘道器位址。所以,當某個 TTL 值的資料包得不到響應時,並不能停止這一追蹤過程,程式仍然會把 TTL 遞增而發出下一個資料包。一直達到預設或用參數指定的追蹤限制(maximum_hops)才結束追蹤。 依據上述原理,利用了 UDP 資料包的 Traceroute 程式在資料包到達真正的目的主機時,就可能因為該主機沒有提供 UDP 服務而簡單將資料包拋棄,並不返回任何資訊。爲了解決這個問題,Traceroute 故意使用了一個大於 30000 的埠號,因 UDP 協定規定埠號必須小於 30000 ,所以目標主機收到資料包後唯一能做的事就是返回一個「埠不可達」的 ICMP 報文,於是主叫方就將埠不可達報文當作跟蹤結束的標誌。

arrow
arrow
    全站熱搜

    tckitkit 發表在 痞客邦 留言(0) 人氣()