封裝 與 拆裝 一文,
提及了 區段 (Segment)、資料包 (Datagram)、訊框 (Frame)、封包 (Packet) 的概念。
應用層的資料,經由逐層的 封裝 (Encapsulation),
最後成為 資料鏈結層 (Data-Link Layer) 的 訊框 (Frame) 並傳送。


- 傳輸需耗損大量的 緩衝區 (buffer) 大小
- 傳輸媒介可能被某一傳送端獨佔,造成堵塞
- …
因此,資料鏈結層 (Data-Link) 規範了 訊框 (Frame) 的大小上限,
也就是 — — 最大傳輸單元 (Maximum Transmission Unit, MTU),
MTU 不是越大越好:較大 frame 可降低表頭比例,但也會增加序列化延遲、遺失時的重傳成本與小 MTU 路徑的不相容風險;實務上必須配合鏈路與 Path MTU。
最大傳輸單元 (MTU)
不同的 資料鏈結層,有不同的 MTU。
如:
乙太網路 (Ethernet) 的 1500 個位元組,
使用 PPPoE 的乙太網路介面常因封裝額外開銷而設為 1492 個位元組,
光纖分散式數據介面 (FDDI) 的 4352 個位元組…。
以乙太網路 (Ethernet) 為例:

一個 乙太網路 訊框 (Frame),最大的長度為 1518 位元組 (octet),
去掉表頭 與 尾端資訊後,酬載的最大資料長度則為 1500 octet,
且資料最小長度需為 46 octet,不足的話就用 填充位元 (padding) 填滿至 46 為止。
使用指令:
netstat -i
可顯示系統網路介面資訊 (含 MTU)

IP 分段
(IP Fragmentation)
IPv4 的 Total Length 上限為 65535 位元組;一般 IPv6 封包的 Payload Length 上限為 65535 位元組,連同固定 40 位元組表頭可達 65575 位元組。只有 IPv6 定義了可超過此範圍的 jumbogram,且它不是一般網際網路傳輸的常態。
遠遠超出了許多資料鏈結層的 訊框大小!
IP 分段 (IP Fragmentation) 即是其中一種解法:

IP 會將封包切割成多個較小的 (小於 MTU) 片段 (fragment),使其能透過資料鏈結層傳輸 ,
目的端接收完所有片段後,再將片段 (fragment) 進行重組。
IPv4 的分段 (fragmentation) 可能由來源主機或中途路由器進行;
且被分段的封包 — — 片段 (fragment) 可能經由不同路由方式,
只要最終達到相同的目的地即可。
IPv6 路由器不會分段:來源端若需要分段,必須先得知路徑 MTU,並使用 Fragment extension header。
將 IPv4 資料包 (IP Datagram) 分段的主機或路由器,
會複製必要欄位到各個片段中,
並更改 旗標、片段偏移量、(封包)總長度,與重新計算各片段的 IPv4 header checksum。
(此處是 IPv4 header checksum,和 TCP checksum 是不同欄位;TCP checksum 會由端點對重組後的 TCP 區段驗證。)
最後,目的端接收完所有片段後,再將片段 (fragment) 進行重組:
將在未來討論 IP 協定進一步說明。
Path MTU Discovery
如果 IP Fragmentation 任一片段遺失、毀損呢?
答案是: 目的端將無法重組這個封包。
更重要的是:
網路層的 IP 並不會處理重送
這對有重送機制的傳輸層 (Ex: TCP),降低了傳輸效率 (無法只重送一個 片段);
對沒有重送機制的傳輸層 (Ex: UDP),增加了資料的遺失率。
Path MTU Discovery 讓端點找出路徑 MTU,據此選擇較小的封包,盡量避免 IPv4 分段,並滿足 IPv6 不由路由器分段的要求:
找出 來源 與 目的端路徑中,
所有資料鏈結層裡的 最小 MTU。
(通常,為乙太網路的 1500 octet)
許多可靠的傳輸層 (如: TCP),會以此值做為參考,
調整 最大區段長度 (Maximum Segment Size, MSS)。
最簡單的算法:
IPv4(無選項): MSS = MTU - 20 octet (IPv4 表頭) - 20 octet (TCP 表頭) IPv6(無延伸表頭): MSS = MTU - 40 octet (IPv6 表頭) - 20 octet (TCP 表頭)
或 其他動態調整演算法,
常見的 MSS 有 1460、1400、1380…。
而沒有此機制的傳輸層 (如: UDP),則是選擇適當的 資料包 (Datagram) 大小,
使資料報能落在已知的 Path MTU 內;576 octet 是 IPv4 的最低重組能力,不是現代 UDP 的通用安全大小。IPv6 的最低鏈路 MTU 為 1280 octet,應由協定與實際路徑需求決定資料報大小。
在〈最大傳輸單元 (Maximum Transmission Unit, MTU)〉中有 2 則留言
文章中有兩個fragment拼成frament
感謝指正!已修正 😁