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的核心不为过。

  1. --->src/include/ndpi_typedefs.h
  2. struct ndpi_flow_struct {
  3. ......
  4. };

进行流量分类,进行协议识别 ndpi_detection_process_packet的调用函数程如下:

  1. 1. processing_thread
  2. 2. runPcapLoop
  3. 3. pcap_process_packet
  4. 4. ndpi_workflow_process_packet
  5. -------------------------------->check datalink ip 协议
  6. 5. packet_processing
  7. -------------------------------->check tcp udp 协议
  8. 6. ndpi_detection_process_packet
  9. -------------------------------->匹配出最终协议

3. 识别方法

进行业务识别,靠单纯的DPI,是难以识别出具体应用的,比如,QQ、微信、微博、Facebook等。采用什么手段进行识别呢?很容易想到,特定的应用往往具有特定的IP地址,域名,url等。事实上,基于这些信息进行应用识别,具有较高的准确率。nDPI的总体思路,可总结为:报文解析DPI识别协议类别 + 内容特征识别具体应用。

正则表达式识别库(hyperscan)文件 ndpi_content_match.c.inc

Hyperscan参考

  1. $ git log
  2. commit 22e431ca67ee27c623309cf073e277b0f65a8272
  3. Author: Luca <deri@ntop.org>
  4. Date: Tue Mar 12 18:01:14 2019 +0100
  5. Sporify fix

4. 参考文献