首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

IP 分片與重組深度解析:MTU、標誌位、偏移量與 LwIP 實現

     編輯:關於C語言

IP 分片與重組深度解析:MTU、標誌位、偏移量與 LwIP 實現

當 IP 數據報超過鏈路層 MTU (如乙太網 1500 Bytes) 時,必須在網路層進行分片傳輸,目的端重組。理解分片機制對網路除錯、效能調優、安全防護 (如 Teardrop 攻擊) 至關重要。

核心參數

  • MTU:最大傳輸單元。乙太網 1500B (含 IP 頭 20B + TCP 20B → TCP MSS 1460B)。
  • IP 頭部關鍵欄位 (共 3 位標誌 + 13 位偏移):
    • Bit 0:保留 (必為 0)。
    • Bit 1 (DF, Don't Fragment):1=禁止分片,用於 PMTU 發現。
    • Bit 2 (MF, More Fragments):1=還有後續分片,0=最後一片。
    • Fragment Offset (13 bits):以 8 Bytes 為單位 的偏移量,最大支援 8192 Bytes 原始封包。
    • Identification (16 bits):同一原始封包所有分片共享,用於重組辨識。

分片與重組流程

  1. 發送端:大封包 → 多個分片,各自獨立 IP 頭,MF/Offset 設定,ID 相同。
  2. 傳輸中:分片可能亂序、重複、丟失、再分片。
  3. 接收端:按 ID + 來源/目的 IP + 協議 分組,按 Offset 排序重組。
  4. 超時:IP_REASS_MAXAGE (預設 15s) 未收齊 → 丟棄所有分片。

LwIP 實現關鍵配置

宏定義作用建議值
IP_REASS_MAX_PBUFS最大分片 pbuf 數量 (限制記憶體)視 RAM 而定,如 10-20
IP_REASS_MAXAGE重組超時 (秒)15 (RFC 791)
IP_REASS_FREE_OLDEST超限時釋放最老分片騰位1 (啟用)
PBUF_POOL_SIZEpbuf 池大小 (需容納分片)足夠大,防 UDP 分片耗盡

協議差異:TCP vs UDP

  • TCP:MSS 協商 (通常 1460B),發送端主動分段,**不產生 IP 分片**。
  • UDP:無分段機制,大數據報直接交 IP 層分片。極易丟包導致重組失敗 (無重傳),應用層需自行控制大小或啟用分片重組優化。

BSD 經典重組資料結構

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 頭
    // 數據緊隨其後
};

安全考量

  • Teardrop 攻擊:偽造 Offset 重疊/間隙,導致重組緩衝區溢出或死循環。
  • 分片洪水:佔用重組緩衝區,拒絕服務。
  • 防護:嚴格校驗 Offset 邊界、限制並發重組數、超時快速回收。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved