在7.3節中,我們描述了IP記錄路由選項(RR)。為什么不使用這個選項而另外開發一個新的應用程序?有三個方面的原因。首先,原先并不是所有的路由器都支持記錄路由選項,因此該選項在某些路徑上不能使用(Traceroute程序不需要中間路由器具備任何特殊的或可選的功能)。
其次,記錄路由一般是單向的選項。發送端設置了該選項,那么接收端不得不從收到的IP首部中提取出所有的信息,然后全部返回給發送端。在7.3節中,我們看到大多數Ping服務器的實現(內核中的ICMP回顯應答功能)把接收到的RR清單返回,但是這樣使得記錄下來的IP地址翻了一番(一來一回)。這樣做會受到一些限制,這一點我們在下一段討論(Traceroute程序只需要目的端運行一個UDP模塊—其他不需要任何特殊的服務器應用程序)。
最后一個原因也是最主要的原因是,IP首部中留給選項的空間有限,不能存放當前大多數的路徑。在IP首部選項字段中最多只能存放9個IP地址。在原先的ARPANET中這是足夠的,但是對現在來說是遠遠不夠的。
Traceroute程序使用ICMP報文和IP首部中的TTL字段(生存周期)。TTL字段是由發送端初始設置一個8 bit字段。推薦的初始值由分配數字RFC指定,當前值為64。較老版本的系統經常初始化為15或32。我們從第7章中的一些ping程序例子中可以看出,發送ICMP回顯應答時經常把TTL設為最大值255。
每個處理數據報的路由器都需要把TTL的值減1或減去數據報在路由器中停留的秒數。由于大多數的路由器轉發數據報的時延都小于1秒鐘,因此TTL最終成為一個跳站的計數器,所經過的每個路由器都將其值減1。
RFC 1009 [Braden and Postel 1987]指出,如果路由器轉發數據報的時延超過1秒,那么它將把TTL值減去所消耗的時間(秒數)。但很少有路由器這么實現。新的路由器需求文檔RFC [Almquist 1993]為此指定它為可選擇功能,允許把TTL看成一個跳站計數器。
TTL字段的目的是防止數據報在選路時無休止地在網絡中流動。例如,當路由器癱瘓或者兩個路由器之間的連接丟失時,選路協議有時會去檢測丟失的路由并一直進行下去。在這段時間內,數據報可能在循環回路被終止。TTL字段就是在這些循環傳遞的數據報上加上一個生存上限。
當路由器收到一份IP數據報,如果其TTL字段是0或1,則路由器不轉發該數據報(接收到這種數據報的目的主機可以將它交給應用程序,這是因為不需要轉發該數據報。但是在通常情況下,系統不應該接收TTL字段為0的數據報)。相反,路由器將該數據報丟棄,并給信源機發一份ICMP“超時”信息。Traceroute程序的關鍵在于包含這份ICMP信息的IP報文的信源地址是該路由器的IP地址。
我們現在可以猜想一下Traceroute程序的操作過程。它發送一份TTL字段為1的IP數據報給目的主機。處理這份數據報的第一個路由器將TTL值減1,丟棄該數據報,并發回一份超時ICMP報文。這樣就得到了該路徑中的第一個路由器的地址。然后Traceroute程序發送一份TTL值為2的數據報,這樣我們就可以得到第二個路由器的地址。繼續這個過程直至該數據報到達目的主機。但是目的主機哪怕接收到TTL值為1的IP數據報,也不會丟棄該數據報并產生一份超時ICMP報文,這是因為數據報已經到達其最終目的地。那么我們該如何判斷是否已經到達目的主機了呢?
Traceroute程序發送一份UDP數據報給目的主機,但它選擇一個不可能的值作為UDP端口號(大于30000),使目的主機的任何一個應用程序都不可能使用該端口。因為,當該數據報到達時,將使目的主機的UDP模塊產生一份“端口不可達”錯誤(見6.5節)的ICMP報文。
這樣,Traceroute程序所要做的就是區分接收到的ICMP報文是超時還是端口不可達,以判斷什么時候結束。
Traceroute程序必須可以為發送的數據報設置TTL字段。并非所有與TCP/IP接口的程序都支持這項功能,同時并非所有的實現都支持這項能力,但目前大部分系統都支持這項功能,并可以運行Traceroute程序。這個程序界面通常要求用戶具有超級用戶權限,這意味著它可能需要特殊的權限以在你的主機上運行該程序。
- 第1章 概述
- 1.1 引言
- 1.2 分層
- 1.3 TCP/IP的分層
- 1.4 互聯網的地址
- 1.5 域名系統
- 1.6 封裝
- 1.7 分用
- 1.8 客戶-服務器模型
- 1.9 端口號
- 1.10 標準化過程
- 1.11 RFC
- 1.12 標準的簡單服務
- 1.13 互聯網
- 1.14 實現
- 1.15 應用編程接口
- 1.16 測試網絡
- 1.17 小結
- 第2章 鏈路層
- 2.1 引言
- 2.2 以太網和IEEE 802封裝
- 2.3 尾部封裝
- 2.4 SLIP:串行線路IP
- 2.5 壓縮的SLIP
- 2.6 PPP:點對點協議
- 2.7 環回接口
- 2.8 最大傳輸單元MTU
- 2.9 路徑MTU
- 2.10 串行線路吞吐量計算
- 2.11 小結
- 第3章 IP:網際協議
- 3.1 引言
- 3.2 IP首部
- 3.3 IP路由選擇
- 3.4 子網尋址
- 3.5 子網掩碼
- 3.6 特殊情況的IP地址
- 3.7 一個子網的例子
- 3.8 ifconfig命令
- 3.9 netstat命令
- 3.10 IP的未來
- 3.11 小結
- 第4章 ARP:地址解析協議
- 4.1 引言
- 4.2 一個例子
- 4.3 ARP高速緩存
- 4.4 ARP的分組格式
- 4.5 ARP舉例
- 4.5.1 一般的例子
- 4.5.2 對不存在主機的ARP請求
- 4.5.3 ARP高速緩存超時設置
- 4.6 ARP代理
- 4.7 免費ARP
- 4.8 arp命令
- 4.9 小結
- 第5章 RARP:逆地址解析協議
- 5.1 引言
- 5.2 RARP的分組格式
- 5.3 RARP舉例
- 5.4 RARP服務器的設計
- 5.4.1 作為用戶進程的RARP服務器
- 5.4.2 每個網絡有多個RARP服務器
- 5.5 小結
- 第6章 ICMP:Internet控制報文協議
- 6.1 引言
- 6.2 ICMP報文的類型
- 6.3 ICMP地址掩碼請求與應答
- 6.4 ICMP時間戳請求與應答
- 6.4.1 舉例
- 6.4.2 另一種方法
- 6.5 ICMP端口不可達差錯
- 6.6 ICMP報文的4.4BSD處理
- 6.7 小結
- 第7章 Ping程序
- 7.1 引言
- 7.2 Ping程序
- 7.2.1 LAN輸出
- 7.2.2 WAN輸出
- 7.2.3 線路SLIP鏈接
- 7.2.4 撥號SLIP鏈路
- 7.3 IP記錄路由選項
- 7.3.1 通常的例子
- 7.3.2 異常的輸出
- 7.4 IP時間戳選項
- 7.5 小結
- 第8章 Traceroute程序
- 8.1 引言
- 8.2 Traceroute程序的操作
- 8.3 局域網輸出
- 8.4 廣域網輸出
- 8.5 IP源站選路選項
- 8.5.1 寬松的源站選路的traceroute程序示例
- 8.5.2 嚴格的源站選路的traceroute程序示例
- 8.5.3 寬松的源站選路traceroute程序的往返路由
- 8.6 小結
- 第9章 IP選路
- 9.1 引言
- 9.2 選路的原理
- 9.2.1 簡單路由表
- 9.2.2 初始化路由表
- 9.2.3 較復雜的路由表
- 9.2.4 沒有到達目的地的路由
- 9.3 ICMP主機與網絡不可達差錯
- 9.4 轉發或不轉發
- 9.5 ICMP重定向差錯
- 9.5.1 一個例子
- 9.5.2 更多的細節
- 9.6 ICMP路由器發現報文
- 9.6.1 路由器操作
- 9.6.2 主機操作
- 9.6.3 實現
- 9.7 小結