翼度科技»论坛 云主机 LINUX 查看内容

linux 4.19 ip重组

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
IP重组

ip重组这部分 4.19内核与3.10内核有些差别,4.9.134以后内核中不使用低水位和工作队列了,同时使用了rhashtable 替代了 hash bucket的概念,在3.10内核中使用1024个hash bucket, 每个bucket中最多存放128个分片队列,在4.19内核中所有的分片队列都保存在可动态调整的rhashtable 中,同时不再使用低水位和工作队列对ip 分片进行回收
4.19内核中,在内存中会分配一个reassembly buffer用于IP分片的重组。同时,也定义了一系列的参数用于控制IP分片处理过程:
net.ipv4.ipfrag_high_thresh: 用于IP分片重组的最大内存用量(默认为4194304 ,即4Mb)。
net.ipv4.ipfrag_time: IP分片在内存中的保留时间(默认30,单位:秒)。
对应上述网络协议栈的内核参数,内核层定义了结构体netns_frags,包含分片重组功能需要的全局控制信息,其定义如下:
  1. struct netns_frags {
  2. struct percpu_counter   mem ____cacheline_aligned_in_smp;
  3.         /* sysctls */
  4.         int                     timeout;
  5.         int                     high_thresh;
  6.         int                     low_thresh;
  7. int                        max_dist;
  8. struct inet_frags        *f;
  9.         struct rhashtable       rhashtable ____cacheline_aligned_in_smp;
  10. atomic_long_t                mem ____cacheline_aligned_in_smp;
  11. };
复制代码
其中rhashtable为分片队列(inet_frag_queue)所在的hash表,IP分片包在内核中根据IP报头的4个字段计算得到一个hash值(key值),每个hash值对应一个分片队列,在实现分片包重组功能时,IP层需要先缓存收到的所有分片包,等待同一个IP报文的所有分片包都到达后,把它们重组成一个大包再提交给L4(TCP/UDP... ...)协议。
当收到新的ip分片包时,将查找是否存在同一数据包的分片队列。首先检查当前内存中所有待重组分片包占用的内存(frag_mem_limit)是否高于高水位(net.ipv4.ipfrag_high_thresh),如果高于则丢弃分片包;否则接着对接收到的分片包与rhashtable表中缓存的分片队列进行匹配(即从rhashtable表查找分片队列)将属于同一数据包的分片包放在同一个分片队列中,如果一个数据包的所有分片包都接收完成,那么将进入数据包的重构流程;如果匹配失败,说明该分片属于一个新的数据包,那么进入分片队列新建流程。分片队列的接收查找函数inet_frag_find定义如下:
  1. struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, void *key)
  2. {
  3.     struct inet_frag_queue *fq = NULL, *prev;
  4.      //①高水位判断
  5.     if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh)
  6.         return NULL;
  7.     rcu_read_lock();
  8.     prev = rhashtable_lookup(&nf->rhashtable, key, nf->f->rhash_params); //② 查找rhashtable中的分片队列
  9.     if (!prev)
  10.         fq = inet_frag_create(nf, key, &prev); //③ 创建新分片队列
  11.     if (prev && !IS_ERR(prev)) {
  12.         fq = prev;
  13.         if (!refcount_inc_not_zero(&fq->refcnt))
  14.             fq = NULL;
  15.     }   
  16.     rcu_read_unlock();
  17.     return fq;
  18. }
复制代码
在分片队列的新建流程中,将从slab中分配一段空间,相应增加分片包占用的内存,同时设置定时器(超时时常为30秒)用来检查重组结果,如果定时器超时未重组成功,该分片包也将丢弃。分片包的新建函数inet_frag_alloc定义如下:
  1. static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
  2.                                                struct inet_frags *f,
  3.                                                void *arg)
  4. {
  5.         struct inet_frag_queue *q;
  6.       
  7.         q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
  8.         if (!q)
  9.                 return NULL;
  10.        ... ...
  11.        add_frag_mem_limit(nf, f->qsize);          //①增加分片报文占用内存
  12.        setup_timer(&q->timer,                     //②设置超时定时器
  13. f->frag_expire, (unsigned long)q);        
  14.         ... ...
  15.         return q;
  16. }
  17. int ip_defrag(struct net *net, struct sk_buff *skb, u32 user)
  18. {
  19.         ... ...
  20.         qp = ip_find(net, ip_hdr(skb), user, vif); //①查找分片队列
  21.         if (qp) {
  22. ... ...
  23.                 ret = ip_frag_queue(qp, skb); //②分片队列入队操作
  24.     ... ...
  25.                 return ret;
  26.         }
  27.         kfree_skb(skb);
  28.         return -ENOMEM;
  29. }
复制代码
如果一个数据包的所有分片包都已接收,则需将所有分片包整合获得原始数据包,并将整合后的数据包提交给高层协议。同时,处理与分片包相关的数据结构,譬如更新当前分片包占用的内存(frag_mem_limit),停止与分片包相关的定时器等。数据包的重构函数ip_frag_reasm定义如下:
  1. static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb,
  2.              struct sk_buff *prev_tail, struct net_device *dev)
  3. {
  4.      ... ...
  5.      ipq_kill(qp);                   //①减少分片包引用计数
  6.      ... ...
  7.      sub_frag_mem_limit(qp->q.net,   //②减少分片包占用内存
  8. head->truesize);
  9.      ... ...
  10. }
复制代码
所以,一个分片包的接收通常经历了查找分片、缓存、重组、释放等阶段,下图是分片包的接收流程。

图1  4.19分片包接收流程
根据分析,内核中待重组的分片包占用内存量由高水位(net.ipv4.ipfrag_high_thresh)阈值和分片保留时间(net.ipv4.ipfrag_time)来控制,如果待重组分片包内存占用高于高水位(high_thresh),那么新收到的数据包分片将会直接丢弃, 如果分片包超过最大保留时间(ipfrag_time),那么已经收到的数据包也会被丢弃。
附3.10 ip重组



来源:https://www.cnblogs.com/forwards/p/18279336
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具