用 Python 标准库写一个离线 PCAP 流量统计小工具
【摘要】 拿到一段 PCAP,第一步往往不是立刻上 Wireshark 逐包看,而是先回答三个问题:谁在跟谁说话、用的什么协议、量有多大。这个小工具 pcap-stat 就是为这一步准备的:只用 Python 标准库,读 PCAP、做包头级统计,不联网、不依赖 libpcap / DPDK。
用 Python 标准库写一个离线 PCAP 流量统计小工具
拿到一段 PCAP,第一步往往不是立刻上 Wireshark 逐包看,而是先回答三个问题:
谁在跟谁说话、用的什么协议、量有多大。这个小工具 pcap-stat 就是为这一步
准备的:只用 Python 标准库,读 PCAP、做包头级统计,不联网、不依赖
libpcap / DPDK。
它统计什么
- 总包数、捕获字节、线长字节、起止时间与时长、平均 pps / bps
- 按协议统计包数与字节:TCP / UDP / ICMP / ICMPv6 / 其他 IP 协议
- Top 源 IP(包数与字节)、Top 目的端口
- 非 IP 包与截断包计数
用法很简单:
python3 pcap_stat.py capture.pcap
python3 pcap_stat.py capture.pcap --json
python3 pcap_stat.py capture.pcap --top 5
--json 输出方便接后续脚本,做阈值告警或日报。
解析链路是怎么走的
PCAP 全局头先判定大小端,再逐包读包记录头,接着是:
Ethernet 头(含可选的单层 VLAN 标签)→ IPv4 / IPv6 头 → TCP / UDP 端口。
关键点只有两个:一是魔数决定大小端,写错就全错;二是 IP 头长度
(IPv4 的 IHL、IPv6 的固定 40 字节)决定传输层从哪里开始。把这两步
写对,剩下的就是 Counter 累计。
一个可复现的自测
工具自带一个最小自测:现场构造 3 个已知包(2 个 TCP、1 个 UDP),
断言协议、源 IP、目的端口计数。测试通过,说明解析与计数路径可用,
而不是“跑起来没报错就当对了”。
python3 test_pcap_stat.py
有意为之的边界
- 不解析应用层载荷,不做 DPI、不还原会话内容
- 不做实时抓包,不开网卡混杂模式,不需要特权
- 不支持 pcapng;Ethernet 以外链路类型会明确报错,而不是静默算错
这个边界很重要:离线统计工具的价值在于“快且可信”,一旦开始猜格式、
猜载荷,统计结果就不可信了。
什么时候用它
- 拿到 PCAP 先看协议构成和 Top Talker,再决定是否值得上 Wireshark /
DPDK 做进一步分析 - 教学与脚本化巡检:把 JSON 输出接给后续处理脚本
完整代码与 README 见配套作品:pcap-stat,Python 标准库实现,可直接运行。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)