(ntopng调用)nDPI工作流程

这篇算是一点点小补充加小概论吧,都是自己遇到的坎。 而且网上资料也是蛮全的。
言归正传:

在ndpi_set_protocol_detection_bitmask2中会对所有深度解析的协议初始化,这里面调用的就是init_XXXX_dissector(XXXX代表协议名称,例如http)。所谓初始化则是对每个协议的默认深度解析函数做入口对照,就像是门牌号一样,向一个数组里填充函数指针。

在接下来的调用中,会按照协议掩码做判断,是否检测为所需检测协议,这点在包处理过程初出会做判断,不过在ntopng中,我并没有看到对掩码的处理。但掩码的作用,还是为了过滤已知协议的,毕竟如果不添加此机制,在判断过程中,会将所有协议执行一遍。

最初在看ntopng调用nDPI过程我误以为,ntopng会捕获包并调用ndpi做解析,事实上,确实做了解析,但问题的关键是,ntopng在捕获后,就做了解析处理,这里我没有下ntopng的源码,函数名称就不列出了,流程也其实差不太多。随后,ntopng调用了ndpi_detection_process_packet,目的是做深度解析。这时我突然明白了nDPI说明文档的一句话:remember that nDPI is just a library. nDPI仅仅是个库,当时饶了好大一个弯子突然觉得自己好傻。

如果没有ntopng,nDPI则会使用libpcap抓包或者直接解析一个.pcap文件做解析,过程中会创建树来保存流信息。当初看代码的时候,我一直纳闷,这ntopng直接用ndpi做深度解析,那就放弃树了?要知道这是一个蛮好的设计,可以减少很大的没用的工作,增加效率。其实ntopng内部也创建了那棵树,用来做同流判断。

最后,补充一点,添加协议的时候,切记,在src/include/ndpi_protocol_ids.h添加id
一定要注意这句话:IMPORTANT:NDPI_LAST_IMPLEMENTED_PROTOCOL MUST BE THE LAST ELEMENT. NDPI_LAST_IMPLEMENTED_PROTOCOL这个宏必须是最后一个协议。当时我并没有理会它,结果是,报错,找不到协议。

你可能感兴趣的:((ntopng调用)nDPI工作流程)