在IP網絡通信中,當數據包超過MTU限制時,路由器會將其拆分為多個分片。這些分片到達目標主機后,內核必須高效、安全地重組原始數據包。Linux內核的net/ipv4/inet_fragment.c
實現了一套精妙的分片管理框架,完美平衡了性能和安全性需求。本文將深入剖析其設計哲學與關鍵技術。
一、分片管理的核心框架
1.1 智能數據結構設計
內核采用三層結構管理分片:
struct inet_frag_queue { // 分片隊列struct rb_root rb_fragments; // 紅黑樹存儲分片struct sk_buff *last_run_head; // 連續分片序列頭struct timer_list timer; // 超時定時器 };struct ipfrag_skb_cb { // 分片元數據(SKB->cb)struct sk_buff *next_frag; // 同序列下一分片int frag_run_len; // 序列總長度 };struct netns_frags { // 網絡命名空間資源struct rhashtable rhashtable; // 分片隊列哈希表atomic_t mem; // 內存計數器 };
-
紅黑樹組織:按分片偏移量排序,插入/查找復雜度O(log N)
-
連續分片序列(run)</