怎么样快速解析好几个 G 的 pcap 文件

247 天前
ChristopherY  ChristopherY
目前知道的 Python 库有 scapy ,dpkt 等

scapy 能解析出来的字段比较多,但是速度很慢,大概每秒 1000 个包左右。

dpkt 比较快,每秒可以达到几十万个包。但是解析出来的字段比较少,需要自己手动解字段。



请问各位大佬,有没有相关的工具或者优化方法能快速解析 pcap 文件?
2846 次点击
所在节点   程序员  程序员
31 条回复
patrickyoung
patrickyoung
247 天前
tshark 或者 zed datalake
patrickyoung
patrickyoung
247 天前
还有 packetbeat
ChristopherY
ChristopherY
247 天前
@patrickyoung 最主要的还是想 Python 自己写函数去分析某个 pcap 文件,比如根据 src 、dst 、协议类型、mpdu id 或者 length 来筛选,然后进一步分析 pcap 文件。tshark 读取速度好像也一般,有没有最佳实践
Rehtt
Rehtt
247 天前
有没有可能因为解析的字段比较少所以速度就快
keakon
keakon
247 天前
不要用 Python 干这种事啊,换成 C 、Go 之类的去做,轻松快几个数量级。
ChristopherY
ChristopherY
246 天前
@keakon 确实,想追求速度还得是 c 或 go
ChristopherY
ChristopherY
246 天前
@Rehtt 是这样的,所以追求速度还是得用别的语言了
qazwsxkevin
qazwsxkevin
246 天前
不知道要研究这份东西多久,如果经常发生,周期长,复盘次数多,不如写个脚本导入 mysql 吧,
记得以前看文档,pcap 有工具可以转 json ,然后想办法再进 mysql 试试,
在数据库表里里 fliter 东西,出结果范围快得不要不要的...
要不就如 5 楼所说,c++撸一个
QuinceyWu
QuinceyWu
246 天前
我最近也在做类似的事情:使用 scapy 实时解析 udp 的报文,udp 报文会分片,所以我起了一个线程和队列去做接收和解析的逻辑
lysShub
lysShub
246 天前
解析出来的字段是啥意思? pcap 里面存的不就是原始的 eth 数据包吗,好像还附带有 ts ,if 几个信息
ChristopherY
ChristopherY
246 天前
@lysShub 就是根据帧的格式,把原始数据解析成对应的字段信息。
ChristopherY
ChristopherY
246 天前
@qazwsxkevin 我也见过用数据库先建索引的,这种貌似是反复读取最好的方法了。不过对于 wifi7 这种协议,可能需要自己手动写解析函数了?
leonshaw
leonshaw
246 天前
自己写,只处理需要的协议和字段。wifi7 是物理层,跟抓包没关系。
kuanat
kuanat
246 天前
https://github.com/google/gopacket

我之前在 go 经验的帖子里写过,这个库配合一些手动内存管理的技巧,在 10Gbps 网络上做实时处理没什么问题。

如果是 pcap 离线文件,直接按照示例写就好了。
kuanat
kuanat
246 天前
还有楼上说得不对,网络包是一层一层嵌套的,必须从外向内解析。

当然理论上可以通过某层协议的标志从二进制的某个偏移开始解析,无视下层协议,但是这样做会损失很多信息,也不保证解析结果正确,与最初的目的不符。

gopacket 这个库是可以自己写未知协议扩展的,比如原版里面没有 pppoe/ppp 的支持,我在自己的项目里加上了,可能也就二三十行代码。就是写清楚字节流多少偏移对应该协议的某个字段。如果是那种非定长编码的格式,需要先解析头部的长度信息,再解析对应的字段。
lysShub
lysShub
246 天前
@ChristopherY 只要不解应用层的,还是挺简单的,go 可以用 gvisor.dev/gvisor/pkg/tcpip/header
chengzishuai1
chengzishuai1
246 天前
gopacket 呢?
ChristopherY
246 天前
@kuanat 如果用 go 可以的话,那用 c 经典的库 libpcap 是不是也可以的,这方面有没有造好的轮子
ChristopherY
246 天前
@chengzishuai1 go 的库之前倒没试过,主要是用 c 和 Python 。看起来用 go 比较方便
xgdgsc
246 天前
cpp 或者 julia

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1049906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX