速讀原著-TCP/IP(局域網輸出)

第8章 Traceroute程序

8.3 局域網輸出

現在已經做好運行 Tr a c e r o u t e程序並觀察其輸出的準備了。我們將使用從 s v r 4到s l i p,經路由器b s d i的簡單互聯網(見內封面)。b s d i和s l i p之間是9600 b/s的S L I P鏈路。

輸出的第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結果證實了確實是這種情況。

目的主機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「超時」報文(見6 . 2節的圖6 – 3),它們的I C M P報文中c o d e字段不同。圖8 – 2給出了這種I C M P差錯報文的格式。

我們所討論的I C M P報文是在T T L值等於0時產生的,其c o d e字段為0。主機在組裝分片時可能發生超時,這時,它將發送一份「組裝報文超時」的 I C M P報文(我們將在11 . 5節討論分片和組裝)。這種差錯報文將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幀(2 . 4節)。但是與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記錄路由選項( 7 . 3節)不同,記錄的 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有着同樣的網絡號,而另兩個接口則有着不同的網絡號。

最後,在廣域網情況下,如果 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地址的情況下,它做一個「反向域名查看」工作來獲得域名。這就需要路由器或主機的管理員正確配置其反向域名查看功能(並非所有的情況下都是如此)。我們將在1 4 . 5節描述如何使用D N S將一個I P地址轉換成域名。