dpi源码分析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenDPI

OpenDPI简介

•OpenDPI是一种根据网络协议将网络流量分类的软件库。为达到这样的功能,它使用的是DPI技术,即深度包检测。

OpenDPI是从PACE衍生过来的。PACE(Protocoland Application Classification Engine)是ipoque的一个流量分类引擎,它提供了成熟的DPI技术和带宽管理方案。

OpenDPI_demo源代码分析

[cpp]view plaincopy

1.int main(int argc, char **argv)

2.{

3. parseOptions(argc, argv);

4.

5. setupDetection();

6.

7. openPcapFile();

8. runPcapLoop();

9. closePcapFile();

10.

11. printResults();

12.

13. terminateDetection();

14.

15.return 0;

16.}

这是主函数里的内容,下面我们看看工作流程

[plain]view plaincopy

1.setupDetection初始化配置

2.pcap_packet_callback 提取包

3.packet_processing 处理包

4.printResults 显示结果

parseOptions(argc, argv)

•这个函数主要负责检查参数是否正确

[cpp]view plaincopy

1.// check parameters

2.if (_pcap_file == NULL || strcmp(_pcap_file, "") == 0) {

3. printf("ERROR: no pcap file path provided; use option -f with the path t

o a valid pcap file\n");

4. exit(-1);

5.}

如果没有文件路径将显示一个错误提示

setupDetection()

•初始化ipoque_struct结构

[cpp]view plaincopy

1.// init global detection structure

2.ipoque_struct = ipoque_init_detection_module(detection_tick_resolution, mall

oc_wrapper, debug_printf);

3.if (ipoque_struct == NULL) {

4. printf("ERROR: global structure initialization failed\n");

5. exit(-1);

6.}

设置要检测的协议

[cpp]view plaincopy

1.// enable all protocols

2.IPOQUE_BITMASK_SET_ALL(all);

3.ipoque_set_protocol_detection_bitmask2(ipoque_struct, &all);

下面具体看看

[cpp]view plaincopy

1.

 ipoque_set_protocol_detection_bitmask2(ipoqu

e_struct, &all);

2.

3.

1.void ipoque_set_protocol_detection_bitmask2(struct ipoque_detection_module_s

truct

2. *ipoque_struct, const IPOQUE_PRO

TOCOL_BITMASK * dbm)

传入了核心数据结构ipoque_struct以及协议标志位dbm

接着将回调次数初始化为0以确保安全

[cpp]view plaincopy

1./* set this here to zero to be interrupt safe */

2.ipoque_struct->callback_buffer_size = 0;

然后就是大量与协议有关的预处理

[cpp]view plaincopy

1.#ifdef IPOQUE_PROTOCOL_HTTP

2.#ifdef IPOQUE_PROTOCOL_MPEG

3.if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOC

OL_MPEG) != 0)

4.goto hack_do_http_detection;

5.#endif

6.#ifdef IPOQUE_PROTOCOL_FLASH

7.if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOC

OL_FLASH) != 0)

8.goto hack_do_http_detection;

9.#endif

10.

11....

如MPEG需检测则转到对http的检测,因之前以将协议标志位都设为1,所以必会转到hack_to_http_detection

下面我们就要看看hack_to_http_detection里面做了什么

[cpp]view plaincopy

1. hack_do_http_detection:

2.

3.ipoque_struct->callback_buffer[a].func = ipoque_search_http_tcp;

4.ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITM

ASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD;

相关文档
最新文档