速讀原著-TCP/IP(用Traceroute確定路徑MTU)
- 2020 年 3 月 9 日
- 筆記
第11章 UDP:用戶數據報協議
11.7 用Traceroute確定路徑MTU
儘管大多數的系統不支援路徑 M T U發現功能,但可以很容易地修改 t r a c e r o u t e程式(第8章),用它來確定路徑 M T U。要做的是發送分組,並設置「不分片」標誌比特。發送的第一個分組的長度正好與出口 M T U相等,每次收到I C M P「不能分片」差錯時(在上一節討論的)就減小分組的長度。如果路由器發送的 I C M P差錯報文是新格式,包含出口的 M T U,那麼就用該M T U值來發送,否則就用下一個最小的 M T U值來發送。正如 RFC 1191 [Mogul and Deering 1990]聲明的那樣,M T U值的個數是有限的,因此在我們的程式中有一些由近似值構成的表,取下一個最小M T U值來發送。
首先,我們嘗試判斷從主機 s u n到主機s l i p的路徑M T U,知道S L I P鏈路的M T U為2 9 6。

在這個例子中,路由器 b s d i沒有在I C M P差錯報文中返回出口 M T U,因此我們選擇另一個M T U近似值。T T L為2的第1行輸出列印的主機名為 b s d i,但這是因為它是返回 I C M P差錯報文的路由器。T T L為2的最後一行正是我們所要找的。
在b s d i上修改I C M P程式碼使它返回出口M T U值並不困難,如果那樣做並再次運行該程式,得到如下輸出結果:

這時,在找到正確的 M T U值之前,我們不用逐個嘗試 8個不同的M T U值——路由器返回了正確的M T U值。
全球互聯網 作為一個實驗,我們多次運行修改以後的 t r a c e r o u t e程式,目的端為世界各地的主機。可以到達1 5個國家(包括南極洲),使用了多個跨大西洋和跨太平洋的鏈路。但是,在這樣做之前,作者所在子網與路由器 n e t b之間的撥號S L I P鏈路M T U(見圖11 – 1 2)增加到1 5 0 0,與乙太網相同。
在1 8次運行當中,只有其中 2次發現的路徑 M T U小於1 5 0 0。其中一個跨大西洋的鏈路M T U值為5 7 2(其近似值甚至在 RFC 11 9 1中也沒有被列出),而路由器返回的是新格式的I C M P差錯報文。另外一條鏈路,在日本的兩個路由器之間,不能處理 1 5 0 0位元組的數據幀,並且路由器沒有返回新格式的 I C M P差錯報文。把M T U值設成1 0 0 6則可以正常工作。從這個實驗可以得出結論,現在許多但不是所有的廣域網都可以處理大於 5 1 2位元組的分組。利用路徑M T U發現機制,應用程式就可以充分利用更大的 M T U來發送報文。