網路層:轉送與 IP

IP 分段(IP fragmentation)

IP 分段是把過大的資料報切成更小的片段,好讓它能通過 MTU 較小的鏈路,再在另一端拼回來的做法。想像你要寄一份長文件,一個信封裝不下:你把它分成編號的頁、各自裝進信封寄出,收件人再依序把它們釘回去。IP 對位元組做的就是這件事,而且只有最終目的端會重組——中間的路由器從不把它拼回來。

在 IPv4 中,有三個標頭欄位讓它運作:識別碼欄位給同一個原始資料報的每個片段標上相同的 ID;片段位移說明這一片在原始資料報中的位置(以 8 位元組為單位計算);而「還有更多片段」旗標,在除了最後一片以外的每一片上都是 1,告訴接收端繼續等待。目的端蒐集所有共用同一 ID 的片段,依位移排序,看到最後一片(更多片段 = 0),便重建原始資料報。只要有一個片段遺失,整個資料報就被丟棄——IP 層沒有針對單一片段的重送。

分段越來越被避免,因為它脆弱又低效:它讓開銷倍增、任何一片掉了就賠掉整個資料報,而且是已知的攻擊媒介(重疊或極小的片段)。IPv6 做了乾淨的切割:路由器完全不准做分段;若封包太大,路由器把它丟棄、回送一個 ICMPv6「封包太大」,而只有來源主機可以做分段(透過一個延伸標頭)或縮小。所以在現代實務中,正確答案通常是路徑 MTU 探索,而非分段。

一個 4000 位元組的酬載要越過 1500 位元組 MTU 的鏈路,變成三個片段,全部共用識別碼 0xABCD:位移 0(more=1)、位移 185(= 1480/8,more=1)、位移 370(more=0)。目的端依位移重排並重組;任何一個遺失,整整 4000 位元組就全沒了。

相同 ID、依位移排序、最後一片打上旗標——重組只發生在目的端。

遺失一個片段就毀掉整個資料報,而且只有目的端會重組。IPv6 完全禁止路由器分段,所以在 IPv6 上,來源必須把封包大小定對,或使用路徑 MTU 探索。

又稱
fragmentation and reassemblyIP 分段IP 分片