當 IP 數據報超過鏈路層 MTU (如乙太網 1500 Bytes) 時,必須在網路層進行分片傳輸,目的端重組。理解分片機制對網路除錯、效能調優、安全防護 (如 Teardrop 攻擊) 至關重要。
1=禁止分片,用於 PMTU 發現。1=還有後續分片,0=最後一片。8192 Bytes 原始封包。ID + 來源/目的 IP + 協議 分組,按 Offset 排序重組。IP_REASS_MAXAGE (預設 15s) 未收齊 → 丟棄所有分片。| 宏定義 | 作用 | 建議值 |
|---|---|---|
| IP_REASS_MAX_PBUFS | 最大分片 pbuf 數量 (限制記憶體) | 視 RAM 而定,如 10-20 |
| IP_REASS_MAXAGE | 重組超時 (秒) | 15 (RFC 791) |
| IP_REASS_FREE_OLDEST | 超限時釋放最老分片騰位 | 1 (啟用) |
| PBUF_POOL_SIZE | pbuf 池大小 (需容納分片) | 足夠大,防 UDP 分片耗盡 |
struct ipq { // 重組隊列頭
struct ipq *next, *prev;
u_char ip_p; // 協議
u_short ip_id; // Identification
struct ipasfrag *frags; // 分片鏈表
struct ip src, dst;
int ttl; // 剩餘生存時間
};
struct ipasfrag { // 單個分片
struct ipasfrag *next, *prev;
struct ip ip; // 完整 IP 頭
// 數據緊隨其後
};