Suricata Flow管理
suricata 使用Flow结构维护会话信息,代码中维护了Flow哈希表(流表),Flow空闲队列,Flow回收队列三个结构,用于存储不同状态的Flow。
参与维护Flow结构的线程
- FlowManager
- 从流表中摘除超时的流放入回收队列
- 检查空闲队列长度是否为预设值,若过长则释放一部分,若过短则申请一部分
- FlowRecyler
- 从回收队列中摘除Flow,调用注册流输出模块的回掉,清空Flow信息,插入回收队列
- FlowWorker
- 对于新到达的包,在流表中查找其对应Flow结构,若存在则直接引用
- 若流表中不存在对应此包的Flow结构,则按如下优先级获取一个新的Flow结构
- 从空闲队列中取出一个Flow结构
- 重新申请一个Flow结构
- 从流表中去除一个当前未被引用的Flow结构,清空其内容并重新插入流表
各线程处理流程如下图: