萬盛學電腦網

 萬盛學電腦網 >> 電腦常見故障 >> 不能上網 >> 使用IP選項實現Traceroute程序

使用IP選項實現Traceroute程序

使用IP選項實現Traceroute程序

1. 現今的Traceroute

 現在的 traceroute 的實現是這樣的:主機先發出一個TTL(Time To Live,生存時間)為1的數據包。接著數據包經過第一跳之後到達一個路由器,此時路由器將發回一個ICMP錯誤消息[1],以說明這個數據包不能繼續向前傳送,因為其TTL已經過期了。然後 traceroute 程序又發出一個TTL為2的數據包,這個數據包經過兩(電腦沒聲音)次跳躍後其TTL過期。這個過程不斷重復,直到數據包到達目的主機。此過程的目的就是要記錄下所有發出 ICMP超時消息的消息源,據此就可以確定出數據包到達目的主機的路徑了。

  這個算法的優點是所有的路由器都能夠發出TTL超時消息,因而不需要特殊的代碼以支持此算法。而其缺點在於:發出的數據包的數目(2n個,其中n是數據包跳躍次數)(譯注:可能包含了路由器發送的超時消息),花費在用連續的數據包記錄較近路由的時間,以及路徑在這個檢測過程中可能會發生改變這個事實。同時,這個算法並不能跟蹤檢測數據包返回時的路徑,而這個路徑很可能與外出路徑不同。

2. 將來的Traceroute

  這個被提議的 traceroute 實現將使用一種不同的算法來達到相同的目的,即得到到達目的主機的路徑。由於新的 traceroute 實現采用了一種專用的ICMP消息,所以用戶還可以得到一些以前(使用老的 traceroute )得不到的額外信息。

2.1 基本算法

  這裡(電腦自動關機),我們將定義一種新的IP選項——Traceroute選項。若此選項存在在一個ICMP應答(或任何其他)數據包中,在下文中稱之為“外出數據包”(Outbound Packet),則會使路由器給這個外出數據包的源端發出一個新定義的ICMP Traceroute消息。這樣,通過n+1個數據包(而不是2n個),這個外出數據包所經過的路徑就可以被其發送端記錄下來。路徑的改變並不影響這個算法的有效性,同時,該算法還允許對外出數據的應答,下文稱之為“返回數據包”(Return Packet),進行跟蹤,只要外出數據包的目的主機在發送應答數據時保留原來的 IP Traceroute選項就可以了。

  這個方法的不足之處在於必須把 traceroute 功能加到路由器中去。而好處是這種機制能夠很容易的加入到新版本的IP協議中去。

2.2 IP Traceroute選項格式

(譯注:為方便對比,我將英文和中文的格式都列了出來,下同)

F(復制到分片標志,copy to fragments):
   0(不復制到分片)
C(類別,class):
   2(調試 & 測量)
數字(Number):
   18(F+C+Number = 82)
ID標識號(ID Number):
   這是由外出數據包發送者指定的任意一個數值,其目的在於可以讓程序識別與自身發出數據包對應的ICMP Traceroute消息。這個數值與IP頭部的標識號沒有關系。
源IP地址(Originator IP Address):
   發送外出數據包的主機地址。這是必須的,因為路由器要根據這個地址發送返回數據包。含有源站選路(Source Route)選項的外出數據包同樣需要這個字段。
外出跳躍計數(Outbound Hop Count,簡稱OHC):
   外出數據包已經通過的路由器數目。外出數據包的目的主機不增加這個字段的值。
返回跳躍計數(Return Hop Count,簡稱RHC):
   返回數據包已經通過的路由器數目。返回數據包的目的主機不增加這個字段的值。

2.3 ICMP Traceroute消息格式

類型(Type):
   30
代碼(Code):
   0 - 外出數據包轉發成功
   1 - 前面已沒有路由器,數據包被拋棄
校驗和(Checksum):
   對首部中每個16位字進行二進制反碼求和的結果。在計算校驗和之前,應當先把此字段填零,然後填入計算結果。
ID標識號(ID Number):
   與引起此消息的數據包中的IP Traceroute選項部分的相應字段相同。這同樣不與IP首部的ID標識號有任何關系。
外出跳躍計數(Outbound Hop Count):
   與引起此消息的數據包中的IP Traceroute選項部分的相應字段相同。
返回跳躍計數(Return Hop Count):
   與引起此消息的數據包中的IP Traceroute選項部分的相應字段相同。
輸出連接速度(Output Link Speed):
   發送“外出/返回數據包”所在連接的速度,以“字節(8位)/秒”計。選擇“字節/秒”而不是“位/秒”是考慮到如下事實:網絡速度不久即將突破4.3GB/s,同時有些機器處理大於32位字段的效率很低。如果這個值不能確定,那麼該字段應該置為零。
輸出連接MTU(Output Link MTU):
   發送“外出/返回數據包”所在連接的MTU,以“字節”計。MTU所針對的只是數據包中的數據部分,包括IP首部,但不包括鏈路層所加的首部及尾部封裝。如果這個值不能確定,那麼該字段應該置為零。

3. 協議

  帶有IP Traceroute選項的外出數據包通常不應該使用特殊的服務類型(Type Of Service,簡稱TOS)或優先級(Precedence),除非想要跟蹤具有特殊服務類型或優先級的數據包路徑。

  外出數據包的TTL值應該設置成“數字分配”[2]一文中所指定的默認值。

3.1 跳躍(Hop)計數

  跳躍計數提供了有關外出/返回數據包到目的主機所經路徑長度的信息。這些計數也提供了判斷ICMP Traceroute消息丟失與否的一種方法。舉個例子來說,如果一個OHC為6的消息緊跟在一個OHC為4的消息後面,那麼我們可以得出結論,那個OHC為5的消息丟失了。這也說明了僅計算 Traceroute消息的數目不能有效判斷路徑長度的原因。

  外出數據包的源端應當把數據包中的OHC設成0,而把RHC設成0xFFFF。0xFFFF這個特殊數值用來表示這是一個外出數據包而不是返回數據包,返回數據包的RHC為0。

  另外要注意的很重要的一點是,這個跳躍計數與與IP的TTL沒有任何關聯。跳躍計數的步增應該僅在一個ICMP Traceroute消息發出時進行。

3.2 目的主機操作

  若一主機接收到一個帶有IP Traceroute選項的外出數據包,那麼在被要求應答的時候(如ICMP Echo服務的請求/應答),返回數據包也應當帶有此選項。在返回數據包中必須填入如下內容:ID標識號、OHC和源IP地址。而RHC字段應當被設為0。

  外出數據包的目的主機不應該再增加跳躍計數或者發送任何的ICMP Traceroute消息。

3.3 路由器操作

  當路由器轉發一個含有IP Traceroute選項的數據包時,它應當給源IP地址字段所指出的主機發送一份ICMP Traceroute消息。如果接收到的數據包中的RHC字段為0xFFFF,那麼這個數據包就是外出數據包,因此路由器應當將OHC字段的值加一;否則路由器應將RHC字段加一。而發回的Traceroute消息應該反映出增加後的跳躍計數。輸出連接速度應當設置成發送“外出/返回數據包”所在連接的速度,以“字節(8位)/秒” 計(如一個以太網速度為1,250,000),該字段也可以設成零以表示速度不能確定。輸出連接MTU應當設置成發送“外出/返回數據包”所在連接的 MTU,該字段同樣可以為零以表示MTU不能確定。

  當Traceroute選項存在時,外出/返回數據包的轉發過程應該像它不存在一樣。也就是說,到達目的主機的路徑與是否存在Traceroute選項無關。

  ICMP Traceroute消息應該與外出/返回數據包具有相同的TOS和優先級。TTL值應該設置成“數字分配”[2]一文中所指定的默認值。

  ICMP Traceroute消息不應該再具有IP Traceroute選項。

  如果外出數據包不能被轉發,那麼返回的ICMP Traceroute消息的代碼字段應當設為1。但是如果返回數據包由於沒有可用的路由器而不能被轉發,那麼就不需要發回一個Traceroute消息,因為這個消息就算發了也將不能被轉發。

4. 參考文獻

[1] Postel, J., "Internet Control Message Protocol", STD 5, RFC 792,
USC/Information Sciences Institute, September 1981.
[2] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, RFC 1340,
USC/Information Sciences Institute, July 1992.

5. 安全性考慮
   安全性方面的相關內容不在本文中討論。

使用IP選項實現Traceroute程序
copyright © 萬盛學電腦網 all rights reserved