輸出的第1個無標號行給出了目的主機名和其I P地址,指出t r a c e r o u t e程序最大的T T L字段值為3 0。4 0字節的數據報包含2 0字節I P首部、8字節的U D P首部和1 2字節的用戶數據(1 2字節的用戶數據包含每發一個數據報就加1的序列號,送出T T L的副本以及發送數據報的時間)。 輸出的后面兩行以T T L開始,接下來是主機或路由器名以及其I P地址。對于每個T T L值,發送3份數據報。每接收到一份I C M P報文,就計算并打印出往返時間。假如在5秒種內仍未收到3 份數據報的任意一份的響應,則打印一個星號,并發送下一份數據報。在上述輸出結果中,T T L字段為1的前3份數據報的I C M P報文分別在20 ms、10 ms和10 ms收到。T T L字段為2的3份數據報的I C M P報文則在120 ms后收到。由于T T L字段為2到達最終目的主機,因此程序就此停止。 往返時間是由發送主機的t r a c e r o u t e程序計算的。它是指從t r a c e r o u t e程序到該路由器的總往返時間。假如我們對每段路徑的時間感愛好,可以用T T L字段為N + 1所打印出來的時間減去T T L字段為N的時間。 圖8 - 1給出了t c p d u m p的運行輸出結果。正如我們所預想的那樣,第1個發往b s d i的探測數據報的往返時間是20 ms 、而后面兩個數據報往返時間是10 ms 的原因是發生了一次A R P交換。t c p d u m p結果證實了確實是這種情況。
圖8-1 從svr4到slip的traceroute程序示例的tcpdump輸出結果
目的主機U D P端口號最開始設置為3 3 4 3 5,且每發送一個數據報加1。可以通過命令行選項來改變開始的端口號。U D P數據報包含1 2個字節的用戶數據,我們在前面t r a c e r o u t e程序輸出的4 0字節數據報中已經對其進行了描述。 后面t c p d u m p打印出了T T L字段為1的I P數據報的注釋[ttl 1]。當T T L值為0或1時,t c p d u m p打印出這條信息,以提示我們數據報中有些不太平常之處。在這里可以預見到T T L 值為1;而在其他一些應用程序中,它可以警告我們數據報可能無法到達其最終目的主機。我們不可能看到路由器傳送一個T T L值為0的數據報,除非發出該數據報的該路由器已經崩潰。 因為b s d i路由器將T T L值減到0,因此我們預計它將發回“傳送超時”的I C M P報文。即使這份被丟棄的I P報文發送往s l i p,路由器也會發回I C M P報文。有兩種不同的I C M P“超時”報文,它們的I C M P報文中c o d e字段不同。圖8 - 2給出了這種I C M P差錯報文的格式。
圖8-2 ICMP超時報文
我們所討論的I C M P報文是在T T L值等于0時產生的,其c o d e字段為0。主機在組裝分片時可能發生超時,這時,它將發送一份“組裝報文超時”的I C M P報文。這種差錯報文將c o d e字段置1。圖8 - 1的第9 ~ 1 4行對應于T T L為2的3份數據報。這3份報文到達最終目的主機,并產生一份I C M P端口不可達報文。計算出S L I P鏈路的往返時間是很有意義的,就象我們在7 . 2節中所舉的P i n g例子,將鏈路值設置為1 2 0 0 b / s一樣。發送出的U D P數據報共4 2個字節,包括1 2字節的數據、8字節U D P首部、2 0字節的I P首部以及(至少)2字節的S L I P幀。但是與P i n g不一樣的是,返回的數據報大小是變化的。從圖6 - 9可以看出,返回的I C M P報文包含發生差錯的數據報的I P首部以及緊隨該I P首部的8字節數據(在t r a c e r o u t e程序中,即U D P首部)。這樣,總共就是2 0 + 8 + 20 + 8 + 2,即5 8字節。在數據速率為960 b/s的情況下,預計的RT T 就是(42 + 58/960), 即104 ms。這個值與s v r 4上所估算出來的110 ms 是吻合的。 圖8 - 1中的源端口號(4 2 8 0 4)看起來有些大。t r a c e r o u t e程序將其發送的U D P數據報的源端口號設置為U n i x進程號與3 2 7 6 8 之間的邏輯或值。對于在同一臺主機上多次運行t r a c e r o u t e程序的情況,每個進程都查看I C M P返回的U D P首部的源端口號,并且只處理那些對自己發送應答的報文。 關于t r a c e r o u t e程序,還有一些必須指出的事項。首先,并不能保證現在的路由也是將來所要采用的路由,甚至兩份連續的I P數據報都可能采用不同的路由。假如在運行程序時,路由發生改變,就會觀察到這種變化,這是因為對于一個給定的T T L,假如其路由發生變化,t r a c e r o u t e程序將打印出新的I P地址。 第二,不能保證I C M P報文的路由與t r a c e r o u t e程序發送的U D P數據報采用同一路由。這表明所打印出來的往返時間可能并不能真正體現數據報發出和返回的時間差(假如U D P數據報從信源到路由器的時間是1秒,而I C M P報文用另一條路由返回信源用了3秒時間,則打印出來的往返時間是4秒)。 第三,返回的I C M P報文中的信源I P地址是U D P數據報到達的路由器接口的I P地址。這與I P記錄路由選項不同,記錄的I P地址指的是發送接口地址。由于每個定義的路由器都有2個或更多的接口,因此,從A主機到B主機上運行t r a c e r o u t e程序和從B主機到A主機上運行t r a c e r o u t e程序所得到的結果可能是不同的。事實上,假如我們從s l i p主機到s v r 4上運行t r a c e r o u t e程序,其輸出結果變成了:
這次打印出來的b s d i主機的I P地址是1 4 0 . 2 5 2 . 1 3 . 6 6,對應于S L I P接口;而上次的地址是1 4 0 . 2 5 2 . 1 3 . 3 5,是以太網接口地址。由于t r a c e r o u t e程序同時也打印出與I P地址相關的主機名,因而主機名也可能變化(在我們的例子中,b s d i上的兩個接口都采用相同的名字)。 考慮圖8 - 3的情況。它給出了兩個局域網通過一個路由器相連的情況。兩個路由器通過一個點對點的鏈路相連。假如我們在左邊L A N的一個主機上運行t r a c e r o u t e程序,那么它將發現路由器的I P地址為i f 1和i f 3。但在另一種情況下,就會發現打印出來的I P地址為i f 4和i f 2。i f 2和i f 3有著同樣的網絡號,而另兩個接口則有著不同的網絡號。
圖8-3 t r a c e r o u t e 程序打印出的接口標識
最后,在廣域網情況下,假如t r a c e r o u t e程序的輸出是可讀的域名形式,而不是I P地址形式,那么會更好理解一些。但是由于t r a c e r o u t e程序接收到I C M P報文時,它所獲得的唯一信息就是I P地址,因此,在給定I P地址的情況下,它做一個“反向域名查看”工作來獲得域名。這就需要路由器或主機的治理員正確配置其反向域名查看功能(并非所有的情況下都是如此)。我們將在后面描述如何使用D N S將一個I P地址轉換成域名。