网络入侵检测系统之 Suricata(五)--Worker Model 线程调度详解详解
Worker Mode 线程调度
我们 NIDS 系统雏形版本目前采用的 single 模式,即 Start One thread with each thread doing all the work,这里的实现可以类比 suricata PCAP_FILE_DEV 模式,读取 pcap 文件并将其封装在 Packet 结构中,各个模块都靠 packet 结构传递,然后依次进行解码,重组,检测,解析,输出日志。
我们后续只需要将读取 pcap 的代码修改一下,对接 dpdk 的报文收发队列即可。
suricata 会根据命令行参数 ./suricata -r http.pcap --runmode single,得到当前激活的运行模式为 RUNMODE_PCAP_file, "single"
RunModeDispatch(),初始化运行模式,通过 RUNMODE_PCAP_file, "single"可以得到对应 RunMode 中的 RunModeFunc,进入当前运行模式的初始化函数 RunModeFilePcapSingle()
从配置树中得到"pcap-file.file",pcap 文件路径,然后会设置一些参数,包括线程是否绑核,检测线程较 CPU 核数的比率
single worker 模式下无需创建队列,只设置了上一级和下一级队列的处理函数(handler->TmqhInputPacketpool+TmqhOutputPacketpool),以及功能模块插槽(slots->TmThreadsSlotPktAcqLoop)
线程创建完毕后会注册到线程池中统一管理,并标识该线程 local id
线程启动,依次执行线程插槽中各个模块的初始化函数,并为 flowworker 模块额外分配一个 flow queue 和 packet queue,分配完毕后,依次执行线程处理函数 PktAcqLoop 或 Fuc
ReceivePcapFile TMmodule
从 packetpool 中获取一个空的报文描述符,然后读取一个目录或单个文件,然后填充报文描述符
DecodePcapFile TMmodule
解码报文,分片重组,解码 ip 层,mac 层,tcp/udp 等,填充报文描述符
FlowWorker TMmodule
StreamTCP:跟踪维护 tcp 流,重组 tcp 报文
检测引擎匹配
日志输出
流程图
版权声明: 本文为 InfoQ 作者【于顾而言】的原创文章。
原文链接:【http://xie.infoq.cn/article/ff4961e1f5bd159cd7634c481】。文章转载请联系作者。
评论