在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)</