Suricata6.0流表管理源码注释一:流表管理简介

本文介绍了Suricata6.0的流管理,涉及流的初始化、新建、老化、回收以及空闲流数量的动态维护。流管理使用独立线程,包括老化和回收线程。在新建流时,从全局flow池或内存中分配,并存储在哈希数组中。流老化根据状态设置超时,不足时进入紧急模式,空闲流数量动态调整以优化性能。
摘要由CSDN通过智能技术生成

目录

1. 流管理内容简介... 1

2. 流的新建... 1

3. 流的老化... 2

4. 流空闲数量的动态维护... 2

5. 流存储关键数据结构... 2

6. 流管理主要函数... 3

  1. 流管理内容简介

流管理包括流表的初始化,流的新建、查找、更新、检查老化、流的回收、空闲流数量的动态维护等,流管理使用独立的线程,包括老化线程和回收线程两种线程,每种管理线程都可以启动多个,默认各启动一个线程。

        老化线程:main-》SuricataMain-》RunModeDispatch-》FlowManagerThreadSpawn

        回收线程:main-》SuricataMain-》RunModeDispatch-》FlowRecyclerThreadSpawn

  1. 流的新建

当一个网络数据包到达时,经过收包,解码产生了packet结构体指针p,这时进入下一个模块第一个工作就是为这个p查找其所属流flow,这个工作从函数FlowHandlePacket开始,不同的suricata版本对这个函数的调用位置不一样,但都是在解码后进行调用,从4.0开始在FlowWorker函数中调用,3.0及以前的版本都在解码模块的解码函数中调用比如在DecodeUDP,DecodeTCP等函数中调用。

FlowHandlePacket函数做了大部分流查找分配及状态设置更新的工作,有一部分更新状态的工作放在另外一个函数FlowUpdate,在如果没有找到则分配一个flow,如果找到则更新流状态

流的flow存放在全局flow哈希数组中:FlowBucket *flow_hash,所以操作bucket时需要对其上锁,每个bucket存放若干哈希值相同的flow结构体,哈希值就是五元组哈希后与数组大小的模,解码后为一个包获取flow时,先从全局变量flow_hash[hash%hash_size]数组里进行查找,存在则把flow放到链表头并进行状态更新操作,不存在则需要从空闲的flow池子里分配一个flow结构体。

分配flow两个方式,一个是从预先分配的全局flow池子里获取,如果没有可用的flow,则在配置的内存空间范围内直接从内存上分配flow,这个池子就称为空闲flow池子,它是个根据配置文件预先分配一定数量flow的内存池,需要的时候从里边取,不需要了则归还进去,取到flow后,设置相关成员数据,然后放入全局变量flow_hash中,该flow后续的packet都可以匹配到该flow结构体。

不同版本的全局flow池子有所区别,比如4.0和之前的版本都是FlowQueue flow_spare_q(带锁的flow链表)这样的全局变量(5.0左右版本没看过),直接用锁子从这个全局变量获取可用的flow结构体。

6.0版本也是用的全局变量,只不过flow不是组织成一个链表,而是先根据配置文件配置的flow个数进行预分配,把这些flow每100个f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种菜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值