1. 程式人生 > >traceroute使用和底層實現

traceroute使用和底層實現

traceroute:https://blog.csdn.net/microtong/article/details/3220450

traceroute原始碼剖析:https://blog.csdn.net/ooooo12345re/article/details/51603353

traceroute原始碼:https://sourceforge.net/projects/traceroute/files/

traceroute命令:http://www.cnblogs.com/peida/archive/2013/03/07/2947326.html

TraceRoute程式的實現主要涉及IP頭部生存時間(time to live, TTL)欄位的使用。

    設定TTL欄位的目的是為了防止資料報由於選路錯誤或其他軟硬體原因從而導致在網路中無休止的流動,TTL欄位指定了資料報的生存時間。TTL的初始值由源主機設定,當一份資料報經過路由器時,處理該資料報的路由器都需要把TTL值減去資料報在路由器中停留的秒數。但事實上大多數路由器只是簡單地將TTL值減1,因此TTL欄位最終被實現為一個跳站計數器。當TTL欄位的值被減為0時,路由器就不會轉發該資料報,而是將其丟棄,併產生一份ICMP超時差錯報文發往源主機以通知錯誤的發生。TraceRoute程式的關鍵就在於返回的這份ICMP超時差錯報文的源地址就是途經路由器的IP地址。由此,通過依次遞增TTL欄位的值,就可以得到一份資料報在其傳輸路徑上所經過的路由資訊。

    TraceRoute程式在具體實現時,是令其向目的主機發送一個ICMP回顯請求(Echo request)訊息,並重復遞增IP頭部TTL欄位的值。剛開始的時候TTL等於1,這樣當該資料報抵達途中的第一個路由器時,TTL的值就被減為0,導致發生超時錯誤,因此該路由器生成一份ICMP超時差錯報文返回給源主機。隨後,主機將資料報的TTL值遞增1,以便IP報文能傳遞到下一個路由器,下一個路由器將會生成ICMP超時超時差錯報文返回給源主機。不斷重複這個過程,直到資料報到達最終的目的主機,此時目的主機將返回ICMP回顯應答(Echo replay)訊息。這樣,源主機只需對返回的每一份ICMP報文進行解析處理,就可以掌握資料報從源主機到達目的主機途中所經過的路由資訊。
(先淺淺的記一下,以後有時間再啃一下原始碼,當務之急是春招)