Traceroute程式

Dororo.Lai發表於2018-06-20

    Traceroute程式是一個能更深入探索TCP/IP協議的方便可用的工具。主要用途是讓我們看到IP資料包從一臺主機傳到另一臺主機所經過的路由,還可以讓我們使用IP源路由選項。


    首先我先介紹個與Traceroute程式有同樣功能的方法:IP記錄路由選項;

    IP記錄路由選項(RR):在ip資料包結構中,同樣記錄資料傳輸過程中所經過的路由ip地址;但是

        1)並不是所有的路由器都支援記錄路由選項,因此該選項在某些路徑上不能使用(Traceroute程式不需要中間路由器具備任何特殊的或可選的功能)。

        2)記錄路由一般是單向的選項。傳送端設定了該選項,那麼接收端不得不從收到的IP首部中提取出所有的資訊,然後全部返回給傳送端。如果把接收到的RR清單返回,但是這樣使得記錄下來的IP地址翻了一番(一來一回),這樣做會受到一些限制。

        3)IP首部中留給選項的空間有限,不能存放當前大多數的路徑。在IP首部選項欄位中最多隻能存放9個IP地址。在原先的ARPANET中這是足夠的,但是對現在來說是遠遠不夠的。


所以一般我們都是採用Traceroute程式;


    Tr aceroute程式使用ICMP報文和IP首部中的TTL欄位(生存週期)。每個處理資料包的路由器都需要把TTL的值減1或減去資料包在路由器中停留的秒數。由於大多數的路由器轉發資料包的時延都小於1秒鐘,因此TTL最終成為一個跳站的計數器,所經過的每個路由器都將其值減1。當路由器收到一份IP資料包,如果其TTL欄位是0或1,則路由器不轉發該資料包(接收到這種資料包的目的主機可以將它交給應用程式,這是因為不需要轉發該資料包。但是在通常情況下,系統不應該接收TTL欄位為0的資料包)。相反,路由器將該資料包丟棄,並給信源機發一份ICMP“超時”資訊。Traceroute程式的關鍵在於包含這份ICMP資訊的IP報文的信源地址是該路由器的IP地址。


最終我們來看一下Traceroute程式的操作過程;

1)它傳送一份TTL欄位為1的IP資料包給目的主機。處理這份資料包的第一個路由器將TTL值減1,丟棄該資料包,併發回一份超時ICMP報文。這樣就得到了該路徑中的第一個路由器的地址。

2)然後Traceroute程式傳送一份TTL值為2的資料包,這樣我們就可以得到第二個路由器的地址。

3)繼續這個過程直至該資料包到達目的主機。

*)但是目的主機哪怕接收到TTL值為1的IP資料包,也不會丟棄該資料包併產生一份超時ICMP報文,這是因為資料包已經到達其最終目的地。那麼我們該如何判斷是否已經到達目的主機了呢?

4)Traceroute程式傳送一份UDP資料包給目的主機,但它選擇一個不可能的值作為UDP埠號(大於30 000),使目的主機的任何一個應用程式都不可能使用該埠。因為,當該資料包到達時,將使目的主機的UDP模組產生一份“埠不可達”錯誤的ICMP報文。這樣,Traceroute程式所要做的就是區分接收到的ICMP報文是超時還是埠不可達,以判斷什麼時候結束。


Traceroute程式必須可以為傳送的資料包設定TTL欄位。並非所有與TCP/IP介面的程式都支援這項功能,同時並非所有的實現都支援這項能力,但目前大部分系統都支援這項功能,並可以執行Traceroute程式。這個程式介面通常要求使用者具有超級使用者許可權,這意味著它可能需要特殊的許可權以在你的主機上執行該程式。


該文章大部分段落取材於《TCP/IP詳解 卷1:協議》

相關文章