《TCP/IP詳解 卷一:協議》讀書筆記--Traceroute程序

8.2、Traceroute程序的操作

它發送一份TTL字段位1的IP數據報給目的主機。處理這份數據報的第一個路由器將TTL值減1,丟棄該數據報,併發回一份超時ICMP報文。這樣就得到了改路徑中第一個路由器的地址。然後Traceroute程序發送一份TTL值爲2的數據報,這樣我們就可以得到第二個路由器的地址。繼續這個過程直至該數據報到達目的主機。但是目的主機哪怕接受到TTL值爲1的IP數據報,也不會丟棄該數據報併產生一份超時ICMP報文,這是因爲數據報已經到達其最終目的地。

Traceroute程序發送一份UDP數據報給目的主機,但它選擇一個不可能的值作爲UDP端口號(大於 30000),使目的主機的任何一個應用程序都不可能使用該端口。因此,當該數據報達到時,將使目的主機的UDP模塊產生一份“端口不可達”錯誤的ICMP報文。


8.3、局域網輸出

例子:

       svr4 % traceroute slip

       traceroute to slip (140.252.13.63), 30 hops max, 40 byte packets

       1     bsdi   (140.252.13.35)    20ms   10ms   10ms

       2     slip    (140.252.13.65)    120ms  120ms 120ms

輸出的第一個無標號行給出了目的主機名和IP地址,指出traceroute程序最大的TTL字段值爲30。40字節的數據報包含20字節IP首部、8字節的UDP首部和12字節的用戶數據。

輸出的後面兩行以TTL開始,接下來是主機或路由器以及其IP地址。對於每個TTL值,發送3份數據報。沒接收到一份ICMP報文,就計算並打印往返時間。如果在5秒鐘內仍未收到3份數據報的任意一份的響應,則打印一個星號,併發送下一份數據報。

我們不可能看到路由器傳送一個TTL值爲0的數據報,除非發出該數據報的改路由器以及崩潰。

有兩種不同的ICMP“超時”報文,它們的ICMP報文中的code字段不同。

我們所討論的ICMP報文是在TTL值等於0時產生的,其code字段位0。

主機在組裝分片可能發生超時,這時,它將發送一份“組裝報文超時”的ICMP報文。這種差錯報文將code字段置1。


關於traceroute程序有一些必須指出的事項。

首先,並不能保證現在的路由也是將來所要採用的路由,甚至兩份連續的IP數據報都可能採用不同的路由。

第二,不能保證ICMP報文的路由與traceroute程序發送的UDP數據報採用同一路由。

第三,返回的ICMP報文中的信源IP地址是UDP數據報到達的路由器接口的IP地址。

最後,在廣域網情況下,如果traceroute程序輸出是可讀的域名形式,而不是IP地址形式,那麼會更好理解一些。


8.4、IP源站選路選項

通常IP路由是動態的,即每個路由都有判斷數據報下面giant轉發到哪個路由器。

源站選項的思想是有發送者指定路由。它們可以採用以下兩種形式:

  • 嚴格的源路由選擇。發送端指明IP數據報所必須採用的確切路由。如果一個路由器發現源路由所指定的下一個路由器不在其直接連接的網絡上,那麼它就返回一個“源站路由失敗”的ICMP差錯報文。
  • 寬鬆的源站選路。發送端指明一個數據報經過的IP地址清單,但是數據報在清單上指明的任意兩個地址之間可以通過其他路由器。

這個格式與記錄路由選項格式基本一致。不同之處是,對於源站選路,我們必須在發送IP數據報前填充IP地址清單;而對於記錄路由選項,我們需要爲IP地址清單分配並清空一些空間,並讓路由器填充該清單中的各項。同時,對於源站選路,只要爲所需要的IP地址數分配空間並進行初始化,通常其數量小於9。而對於記錄路由選項來說,必須儘可能地分配空間,以達到9個地址。

對於寬鬆的源站選路來說,code字段的值是0x83;而對於嚴格的源站選路,其值爲0x89。

其運行過程:

  • 發送主機從應用程序接收源站路由清單,將第一個表項去掉(它是數據報的最終目的地址),將所有剩餘的項左移1個位置,並將原來的目的地址作爲清單的最後一項。指針仍然指向清單的第1項(即,指針的值爲4)。
  • 每個處理數據報的路由器檢查其是否Wie數據報的最終地址。如果不是,則正常轉發數據報(在這種情況下,必須字母寬鬆源站選路,否則不能接受到數據報)。
  • 如果該路由器是最終目的,且指針不大於路徑的長度,那麼(1)有ptr所指定的清單中的下一個地址就是數據報的最終目的地址;(2)由外出接口相對應的IP地址取代剛纔使用的源地址;(3)指針加4


習題:

1、當IP將接收到的TTL字段減1,發現它爲0時,將會發生什麼結果?

答:如果一個輸入數據報的TTL爲0,做減一操作然後測試會將把TTL設置爲255,並且讓數據報繼續傳輸。儘管一個路由器永遠不會收到一個TTL爲0的數據報,但這種情況確實會發生。

2、traceroute程序如何計算RTT的?將這種計算RTT的方法與ping相比較。

答:我們注意到traceroute在UDP數據報的數據部分存儲了12個字節,其中包含了數據報發生的時間。然而,從圖中可以看出ICMP只返回了出錯的IP數據報的頭8個字節,實際上這是8個字節的UDP首部。因此,ICMP的差錯報文沒有返回traceroute存儲的時間值。traceroute保存了它發送分組的時間,當收到一個ICMP應答時,取出當時的時間,把兩個值相減就可以得出RTT。

回憶一下第7章中,ping在輸出的ICMP回顯請求中存儲了時間,這個值被服務器回顯了回來。這樣即使分組返回時失序,ping也能打印出正確的RTT。



發佈了449 篇原創文章 · 獲贊 285 · 訪問量 83萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章