現在已經做好運行Traceroute程序并觀察其輸出的準備了。我們將使用從svr4到slip,經路由器bsdi的簡單互聯網(見內封面)。bsdi和slip之間是9600 b/s的SLIP鏈路。

輸出的第1個無標號行給出了目的主機名和其IP地址,指出traceroute程序最大的TTL字段值為30。40字節的數據報包含20字節IP首部、8字節的UDP首部和12字節的用戶數據(12字節的用戶數據包含每發一個數據報就加1的序列號,送出TTL的副本以及發送數據報的時間)。
輸出的后面兩行以TTL開始,接下來是主機或路由器名以及其IP地址。對于每個TTL值,發送3份數據報。每接收到一份ICMP報文,就計算并打印出往返時間。如果在5秒種內仍未收到3份數據報的任意一份的響應,則打印一個星號,并發送下一份數據報。在上述輸出結果中,TTL字段為1的前3份數據報的ICMP報文分別在20 ms、10 ms和10 ms收到。TTL字段為2的3份數據報的ICMP報文則在120 ms后收到。由于TTL字段為2到達最終目的主機,因此程序就此停止。
往返時間是由發送主機的traceroute程序計算的。它是指從traceroute程序到該路由器的總往返時間。如果我們對每段路徑的時間感興趣,可以用TTL字段為N + 1所打印出來的時間減去TTL字段為N的時間。
圖8-1給出了tcpdump的運行輸出結果。正如我們所預想的那樣,第1個發往bsdi的探測數據報的往返時間是20 ms、而后面兩個數據報往返時間是10 ms的原因是發生了一次ARP交換。tcpdump結果證實了確實是這種情況。

目的主機UDP端口號最開始設置為33435,且每發送一個數據報加1。可以通過命令行選項來改變開始的端口號。UDP數據報包含12個字節的用戶數據,我們在前面traceroute程序輸出的40字節數據報中已經對其進行了描述。
后面tcpdump打印出了TTL字段為1的IP數據報的注釋[ttl 1]。當TTL值為0或1時,tcpdump打印出這條信息,以提示我們數據報中有些不太尋常之處。在這里可以預見到TTL值為1;而在其他一些應用程序中,它可以警告我們數據報可能無法到達其最終目的主機。我們不可能看到路由器傳送一個TTL值為0的數據報,除非發出該數據報的該路由器已經崩潰。
因為bsdi路由器將TTL值減到0,因此我們預計它將發回“傳送超時”的ICMP報文。即使這份被丟棄的IP報文發送往slip,路由器也會發回ICMP報文。
有兩種不同的ICMP“超時”報文(見6.2節的圖6-3),它們的ICMP報文中code字段不同。
圖8-2給出了這種ICMP差錯報文的格式。

我們所討論的ICMP報文是在TTL值等于0時產生的,其code字段為0。主機在組裝分片時可能發生超時,這時,它將發送一份“組裝報文超時”的ICMP報文(我們將在11.5節討論分片和組裝)。這種差錯報文將code字段置1。
圖8-1的第9 ~ 14行對應于TTL為2的3份數據報。這3份報文到達最終目的主機,并產生一份ICMP端口不可達報文。
計算出SLIP鏈路的往返時間是很有意義的,就象我們在7.2節中所舉的Ping例子,將鏈路值設置為1200 b/s一樣。發送出的UDP數據報共42個字節,包括12字節的數據、8字節UDP首部、20字節的IP首部以及(至少)2字節的SLIP幀(2.4節)。但是與Ping不一樣的是,返回的數據報大小是變化的。從圖6-9可以看出,返回的ICMP報文包含發生差錯的數據報的IP首部以及緊隨該IP首部的8字節數據(在traceroute程序中,即UDP首部)。這樣,總共就是20+8+20+8+2,即58字節。在數據速率為960 b/s的情況下,預計的RTT就是(42 + 58/960),即104 ms。這個值與svr4上所估算出來的110 ms是吻合的。
圖8-1中的源端口號(42804)看起來有些大。traceroute程序將其發送的UDP數據報的源端口號設置為Unix進程號與32768之間的邏輯或值。對于在同一臺主機上多次運行traceroute程序的情況,每個進程都查看ICMP返回的UDP首部的源端口號,并且只處理那些對自己發送應答的報文。
關于traceroute程序,還有一些必須指出的事項。首先,并不能保證現在的路由也是將來所要采用的路由,甚至兩份連續的IP數據報都可能采用不同的路由。如果在運行程序時,路由發生改變,就會觀察到這種變化,這是因為對于一個給定的TTL,如果其路由發生變化,traceroute程序將打印出新的IP地址。
第二,不能保證ICMP報文的路由與traceroute程序發送的UDP數據報采用同一路由。
這表明所打印出來的往返時間可能并不能真正體現數據報發出和返回的時間差(如果UDP數據報從信源到路由器的時間是1秒,而ICMP報文用另一條路由返回信源用了3秒時間,則打印出來的往返時間是4秒)。
第三,返回的ICMP報文中的信源IP地址是UDP數據報到達的路由器接口的IP地址。這與I P記錄路由選項(7.3節)不同,記錄的IP地址指的是發送接口地址。由于每個定義的路由器都有2個或更多的接口,因此,從A主機到B主機上運行traceroute程序和從B主機到A主機上運行traceroute程序所得到的結果可能是不同的。事實上,如果我們從slip主機到
svr4上運行traceroute程序,其輸出結果變成了:

這次打印出來的bsdi主機的IP地址是140.252.13.66,對應于SLIP接口;而上次的地址是140.252.13.35,是以太網接口地址。由于tracerout e程序同時也打印出與IP地址相關的主機名,因而主機名也可能變化(在我們的例子中, bsdi上的兩個接口都采用相同的名字)。
考慮圖8-3的情況。它給出了兩個局域網通過一個路由器相連的情況。兩個路由器通過一個點對點的鏈路相連。如果我們在左邊LAN的一個主機上運行traceroute程序,那么它將發現路由器的IP地址為if1和if3。但在另一種情況下,就會發現打印出來的IP地址為if4和if2。
if2和if3有著同樣的網絡號,而另兩個接口則有著不同的網絡號。

最后,在廣域網情況下,如果traceroute程序的輸出是可讀的域名形式,而不是IP地址形式,那么會更好理解一些。但是由于traceroute程序接收到ICMP報文時,它所獲得的唯一信息就是IP地址,因此,在給定IP地址的情況下,它做一個“反向域名查看”工作來獲得域名。這就需要路由器或主機的管理員正確配置其反向域名查看功能(并非所有的情況下
都是如此)。我們將在14.5節描述如何使用DNS將一個IP地址轉換成域名。
- 第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 小結