ndpi工作流程

这里以ndpi的例程ndpiReader.c为例,讲述一下ndpi从抓包到最终分析出具体协议的流程。简单来讲ndpi是从下层开始逐层向上对数据包进行分析的。
先上一发自己画的流程图
这张图是我在最开始看ndpi源码的时候做的流程图,还不是非常的清楚和正确,就连函数的调用关系也只是按先后顺序画的,现在看起来真是有点low,不过也大致说明了一些问题,也就懒得修改了。我会在接下来的文章中说明。这里如果大家想真正了解其工作流程的话,最好自己通过gdb工具进行调试,进入example文件夹,运行gdb -tui ndpiReader命令,在test文件夹下找到.pcap文件或者自己上网抓个包都行,然后在gdb命令行中设置断点,运行 r -i *.pcap即可进入调试模式~~可以百度一下gdb调试相关知识。
NDPI工作流程

第一步是程序的初始化,调用setupDetection()函数,这里所做的工作也比较多,打算新写一篇文章来专门讲述此函数作用。
接下来会开启线程调用libpcap库函数对通过电脑网卡的数据包进行抓取,或者读取传入的.pcap文件(具体的 如何运行等简单操作可以参考官方给出的文档,在doc文件夹下)
接下来对每一个数据包(这里需要明确两个概念,数据包(packet)和数据流(flow),一个数据流中可能会有很多个数据包,就像我们申请一个网页请求,由于页面信息很大,所以会分成很多个数据包来传输,但这些数据包同属于一个数据流),首先对其数据链路层和IP层进行拆包分析pcap_packet_callback()函数,判断是否为基于IP协议等,并获得其源目的IP、协议类型等。
在接下来调用packet_processing()函数,进行传输层分析。在进行传输层分析时调用了get_ndpi_flow()函数,该函数返回ndpi_flow这个结构体(这里需要注意ndpi_flow和ndpi_flow_struct两个结构体的区别)。在get_ndpi_flow()函数中获取传输层的信息如源目的端口等信息。然后根据(源目的IP、源目的端口、协议类型(tcp\udp))这五个元素计算出idx。

idx = (vlan_id + lower_ip + upper_ip + iph->protocol + lower_port + upper_port) % NUM_ROOTS;
  ret = ndpi_tfind(&flow, &ndpi_thread_info[thread_id].ndpi_flows_root[idx], node_cm
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值