(以下內容摘自《TCP/IP詳解 卷1:協議》)
MTU及路徑MTU
以太網和802.3對數據幀的長度都有一個限制,其最大值分別是1500(46~1500)和1492字節。鏈路層的這個特性稱作MTU,最大傳輸單元。不同類型的網絡大多數都有一個上限。(注:MTU是鏈路層的特性,由鏈路層物理性質決定,和上層無關。)
如果兩臺主機之間的通信要通過多個網絡,那麼每個網絡的鏈路層就可能有不同的MTU。兩臺通信主機路徑中的最小MTU。它被稱作路徑MTU。兩臺主機之間的路徑MTU不一定是個常數,它取決於當時所選擇的路由。而選路不一定是對稱的(從A到B的路由可能與從B到A的路由不同),因此路徑MTU在兩個方向上不一定是一致的。
路徑MTU的發現機制
當路由器收到一份需要分片的數據報,而在IP首部又設置了不可分片(DF)的標誌位時,則會產生ICMP不可達差錯。(注:產生ICMP不可達差錯可能有3種情況,TTL爲0,端口不可達,以及IP需要分片但又設置了不允許標誌。)
這種情況下的ICMP不可達差錯報文可以提供下一站的MTU。如果路由器沒有提供這種新的ICMP差錯報文格式,那麼下一站的MTU就設爲0。
儘管大多數的系統不支持路徑MTU發現功能,但可以很容易地修改traceroute程序,用它來確定路徑MTU。要做的是發送分組,並設置“不可分片”標誌比特。發送的第一個分組的長度正好與出口MTU相等,每次收到ICMP“不能分片”差錯時就減小分組的長度。如果路由器發送的ICMP差錯報文是新格式,包含出口的MTU,那麼就用該MTU值來發送,否則就用下一個最小的MTU值來發送。正如RFC1191[Mogul and Deering 1990]聲明的那樣,MTU值的個數是有限的,因此在我們的程序中有一些由近似值構成的表,取下一個最小MTU值來發送。