速讀原著-TCP/IP(Traceroute程式)
- 2020 年 3 月 6 日
- 筆記
第8章 Traceroute程式
8.1 引言
由Van Jacobson編寫的Tr a c e r o u t e程式是一個能更深入探索 T C P / I P協議的方便可用的工具。儘管不能保證從源端發往目的端的兩份連續的 I P數據報具有相同的路由,但是大多數情況下是這樣的。Tr a c e r o u t e程式可以讓我們看到I P數據報從一台主機傳到另一台主機所經過的路由。
Tr a c e r o u t e程式還可以讓我們使用I P源路由選項。使用手冊上說:「程式由Steve Deering提議,由Van Jacobson實現,並由許多其他人根據C. Philip Wood, Tim Seaver 及Ken Adelman等人提出的令人信服的建議或補充意見進行調試。」
8.2 Traceroute程式的操作
在7 . 3節中,我們描述了 I P記錄路由選項( R R)。為什麼不使用這個選項而另外開發一個新的應用程式?有三個方面的原因。首先,原先並不是所有的路由器都支援記錄路由選項,因此該選項在某些路徑上不能使用( Tr a c e r o u t e程式不需要中間路由器具備任何特殊的或可選的功能)。
其次,記錄路由一般是單向的選項。發送端設置了該選項,那麼接收端不得不從收到的 I P首部中提取出所有的資訊,然後全部返回給發送端。在 7 . 3節中,我們看到大多數P i n g伺服器的實現(內核中的I C M P回顯應答功能)把接收到的 R R清單返回,但是這樣使得記錄下來的 I P地址翻了一番(一來一回)。這樣做會受到一些限制,這一點我們在下一段討論( Tr a c e r o u t e程式只需要目的端運行一個U D P模組—其他不需要任何特殊的伺服器應用程式)。最後一個原因也是最主要的原因是, I P首部中留給選項的空間有限,不能存放當前大多數的路徑。在I P首部選項欄位中最多只能存放 9個I P地址。在原先的A R PA N E T中這是足夠的,但是對現在來說是遠遠不夠的。
Tr a c e r o u t e程式使用I C M P報文和I P首部中的T T L欄位(生存周期)。T T L欄位是由發送端初始設置一個 8 bit欄位。推薦的初始值由分配數字 R F C指定,當前值為 6 4。較老版本的系統經常初始化為 1 5或3 2。我們從第7章中的一些p i n g程式例子中可以看出,發送 I C M P回顯應答時經常把T T L設為最大值2 5 5。
每個處理數據報的路由器都需要把 T T L的值減1或減去數據報在路由器中停留的秒數。由於大多數的路由器轉發數據報的時延都小於 1秒鐘,因此T T L最終成為一個跳站的計數器,所經過的每個路由器都將其值減 1。
RFC 1009 [Braden and Postel 1987]指出,如果路由器轉發數據報的時延超過1秒,那麼它將把T T L值減去所消耗的時間(秒數)。但很少有路由器這麼實現。新的路由器需求文檔RFC [Almquist 1993]為此指定它為可選擇功能,允許把T T L看成一個跳站計數器。
T T L欄位的目的是防止數據報在選路時無休止地在網路中流動。例如,當路由器癱瘓或者兩個路由器之間的連接丟失時,選路協議有時會去檢測丟失的路由並一直進行下去。在這段時間內,數據報可能在循環迴路被終止。 T T L欄位就是在這些循環傳遞的數據報上加上一個生存上限。
當路由器收到一份I P數據報,如果其T T L欄位是0或1,則路由器不轉發該數據報(接收到這種數據報的目的主機可以將它交給應用程式,這是因為不需要轉發該數據報。但是在通常情況下,系統不應該接收 T T L欄位為0的數據報)。相反,路由器將該數據報丟棄,並給信源機發一份I C M P「超時」資訊。Tr a c e r o u t e程式的關鍵在於包含這份 I C M P資訊的I P報文的信源地址是該路由器的I P地址。
我們現在可以猜想一下Tr a c e r o u t e程式的操作過程。它發送一份 T T L欄位為1的I P數據報給目的主機。處理這份數據報的第一個路由器將 T T L值減1,丟棄該數據報,並發回一份超時I C M P報文。這樣就得到了該路徑中的第一個路由器的地址。然後 Tr a c e r o u t e程式發送一份T T L值為2的數據報,這樣我們就可以得到第二個路由器的地址。繼續這個過程直至該數據報到達目的主機。但是目的主機哪怕接收到 T T L值為1的I P數據報,也不會丟棄該數據報併產生一份超時I C M P報文,這是因為數據報已經到達其最終目的地。那麼我們該如何判斷是否已經到達目的主機了呢?
Tr a c e r o u t e程式發送一份U D P數據報給目的主機,但它選擇一個不可能的值作為 U D P埠號(大於30 000),使目的主機的任何一個應用程式都不可能使用該埠。因為,當該數據報到達時,將使目的主機的 U D P模組產生一份「埠不可達」錯誤(見 6 . 5節)的I C M P報文。這樣,Tr a c e r o u t e程式所要做的就是區分接收到的 I C M P報文是超時還是埠不可達,以判斷什麼時候結束。
Tr a c e r o u t e程式必須可以為發送的數據報設置T T L欄位。並非所有與T C P / I P介面的程式都支援這項功能,同時並非所有的實現都支援這項能力,但目前大部分系統都支援這項功能,並可以運行Tr a c e r o u t e程式。這個程式介面通常要求用戶具有超級用戶許可權,這意味著它可能需要特殊的許可權以在你的主機上運行該程式。