用 Python 标准库写一个离线 PCAP 流量统计小工具

举报
yd_284094306 发表于 2026/10/28 12:54:04 2026/10/28
【摘要】 拿到一段 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。