1. nDPI协议识别总体分为如下部分
- 结构初始化 ndpi_workflow_init
- 协议模块加载 ndpi_init_protocol_defaults
- 协议识别算法注册 ndpi_set_protocol_detection_bitmask2
- 进行流量分类,进行协议识别 ndpi_detection_process_packet
- 针对未能识别的协议进行协议猜测 ndpi_guess_protocol_id
- 产生协议识别结果,记录在结构体 ndpi_flow_struct
上述每一部分都需要进行详细走读,有了这个框架流程后,便可粗略清楚每个部分干了哪些事。其中,协议记载,以及协议识别算法注册部分,均采用了模块化方法,可很方便地进行新增或卸载协议。
2. 关键结构体走读
该结构体贯穿整个流程中,从初始化,到产生识别结果,至为关键。该数据结构的组织,决定了一些关键流程及算法,称为nDPI的核心不为过。
--->src/include/ndpi_typedefs.h
struct ndpi_flow_struct {
......
};
进行流量分类,进行协议识别 ndpi_detection_process_packet的调用函数程如下:
1. processing_thread
2. runPcapLoop
3. pcap_process_packet
4. ndpi_workflow_process_packet
-------------------------------->check ①datalink ②ip 协议
5. packet_processing
-------------------------------->check ①tcp ②udp 协议
6. ndpi_detection_process_packet
-------------------------------->匹配出最终协议
3. 识别方法
进行业务识别,靠单纯的DPI,是难以识别出具体应用的,比如,QQ、微信、微博、Facebook等。采用什么手段进行识别呢?很容易想到,特定的应用往往具有特定的IP地址,域名,url等。事实上,基于这些信息进行应用识别,具有较高的准确率。nDPI的总体思路,可总结为:报文解析DPI识别协议类别 + 内容特征识别具体应用。
正则表达式识别库(hyperscan)文件 ndpi_content_match.c.inc
Hyperscan参考
$ git log
commit 22e431ca67ee27c623309cf073e277b0f65a8272
Author: Luca <deri@ntop.org>
Date: Tue Mar 12 18:01:14 2019 +0100
Sporify fix