路徑MTU
當在同一個網絡上的兩台主機互相通信時,該網絡的MTU是非常重要的。當時如果兩台主機之間的通信要通過多個網絡,那么每個網絡的鏈路層就可能有不同的MTU。重要的不是兩台主機所在網絡的MTU,而是兩台通信主機路徑中的最小MTU,稱為路徑MTU;
兩台主機之間的路徑MTU不一定是個常數,它取決於當時所選的路由,而選路不一定是對稱的(從A到B的路由可能與從B到A的路由不同),因此路徑MTU在兩個方向上不一定是一致的;
路徑MTU發現
路徑MTU發現通過在IP首部中設置”不要分片(DF)”標志,來發現當前路徑上的路由器是否需要對正在發送的IP數據報進行分片。當設置了DF標志位,而其長度又超過了MTU,那么路由器將返回一個ICMP差錯;
TCP路徑MTU發現按照以下方式進行:在連接建立時,TCP使用輸出接口或者對端聲明的MSS中的最小值MTU作為起始的報文段大小。路徑MTU發現不允許TCP超過對端聲明的MSS。如果對端沒有指定MSS,則默認536;
一旦選定了起始報文段的大小,在該連接上的所有被TCP發送的IP數據報都將被設置DF標志。如果某個中間路由器需要對一個設置了DF標志的數據報進行分片,它就丟棄這個數據報,並產生一個CIMP”不能分片”差錯;
如果收到這個ICMP差錯,TCP就減少段大小並進行重傳。如果路由器產生的是一個較新的該類ICMP差錯,則報文段大小被設置為下一跳的MTU減去IP和TCP首部長度。如果是一個較舊的該類ICMP差錯,則必須嘗試下一個可能的最小MTU。當由這個ICMP差錯引起的重傳發生時,擁塞窗口需要不斷變化,但要啟動慢啟動;
由於路由可以動態變化,因此在最后一次減少路徑MTU的一段時間以后,可以嘗試使用一個較大的值(直到等於對端聲明的MSS或者輸出接口MTU的最小值);
在對非本地目的地,默認的MSS通常為536字節,路徑MTU發現可以避免在通過MTU小於576的中間鏈路進行分片。對於本地目的主機,也可以避免在中間鏈路的MTU小於端點網絡的情況下進行分片。但為了能使路徑MTU更加有用和充分利用MTU大於576的廣域網,一個實現必須停止使用為非本地目的制定的536的MTU默認值。MSS的一個較好的選擇是輸出接口的MTU(當然要減去IP和TCP首部大小);
文章來源:<TCP/IP詳解>