我建立了一個測試網絡,其中 2 台 Linux PC 作為路由器,2 台 Linux PC 作為普通客戶端。 2 個路由器相互連接,每個客戶端連接到一個路由器。在從客戶端到其中一台路由器的路徑上,MTU 為 1500,但在兩台路由器之間為 1200 而且我只使用 IPv6。
如果我現在嘗試發送大於 1200 位元組的資料包,我預計會從路由器收到 ICMPv6「資料包太大」錯誤,然後客戶端應該會對資料包進行分段並嘗試重新發送它。然而這並沒有發生。如果我查看wireshark,我可以看到用戶端收到ICMPv6錯誤,但用戶端不會嘗試將套件重新傳送為片段。
這種行為的原因可能是什麼?
答案1
IPv6 不支援分段。
使用 IPv4,路由器在從一個連結轉送到具有較小 MTU 的另一個連結時可能會分段封包(除非DF已設定)。
對於 IPv6,端點需要使用路徑 MTU 發現實際上自己找出來,然後在他們之間使用這個 MTU...
編輯在 @Patrick Mevzek 非常讚賞的評論之後:
……或訴諸於使用 1280 位元組的 IPv6 保證 MTU(無論是否在主機上對封包進行分段)。