dpi源码分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(ipoque_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;