15:libpcap——全世界抓包工具共同的老父亲

发布时间:2026/10/6 23:37:34

15:libpcap——全世界抓包工具共同的老父亲 大家好我是毛衣哥。tcpdump 和 Wireshark 是两拨人写的但它们底层居然用同一个库。这个库就是 libpcap——全世界抓包工具的老父亲。tcpdump 和 Wireshark 是完全不同的两个项目由完全不同的人开发。但它们的抓包语法——比如tcp port 80——完全一样。答案在 libpcap 里。几乎所有你叫得上名字的抓包工具底层都依赖同一个 C 库libpcap。libpcap 的历史1994 年Steven McCanne对就是 BPF 论文的那个 McCanne和 Van Jacobson 在 BPF 的基础上开发了一个用户态库叫libpcap。它的目标“让所有抓包工具不需要重复实现跟 BPF 交互的底层细节。”在 libpcap 出现之前每个抓包程序都要自己写代码跟 BPF 设备打交道——打开/dev/bpf*设置 ioctl编译过滤表达式读取数据包。全是重复代码。libpcap 把这些重复操作封装成一组 API。从此你只需要几行代码就能写一个抓包程序。三个核心函数libpcap 的完整使用流程可以被归纳为三步第一步pcap_open_live()——打开网络设备pcap_t*handlepcap_open_live(en0,65535,1,1000,errbuf);en0网络接口名65535snaplen每个包最多抓取多少字节1promisc1 开启混杂模式1000to_ms超时时间毫秒背后做了什么Linux 上创建AF_PACKETsocketmacOS 上打开/dev/bpf0设置混杂模式 ioctl分配缓冲区。第二步pcap_compile()pcap_setfilter()——编译并加载 BPF 过滤器structbpf_programfcode;pcap_compile(handle,fcode,tcp port 80,1,0);pcap_setfilter(handle,fcode);pcap_compile()把人类可读的表达式编译成 BPF 字节码pcap_setfilter()通过系统调用把这个字节码送入内核。第三步pcap_loop()——循环读取数据包pcap_loop(handle,-1,callback,NULL);进入一个无限循环从 BPF 环形缓冲区读取一批数据包对每个包调用callback()函数。pcap 文件格式——通用语言libpcap 定义了 pcap 文件的二进制格式。任何遵守这个格式的工具都可以互相读取Global Header24 字节 Magic Number0xa1b2c3d4 大端序标记 Version Major / Minor Snaplen / Link Type Packet Header16 字节← 每个包一个 Timestamp秒 微秒 Captured Len / Original Len Packet DataN 字节这个格式为什么重要它是跨平台、跨工具的。Linux 上 tcpdump 抓的包可以用 macOS 上的 Wireshark 打开。libpcap 的跨平台差异平台底层机制特点LinuxAF_PACKET socket PACKET_MMAP支持零拷贝性能最好macOS/BSD/dev/bpf* 设备BPF 设备有限通常只有 4-8 个WindowsNPcap / WinPcap需要额外安装驱动性能弱于前两者macOS 的 BPF 设备陷阱/dev/bpf0到/dev/bpf7一共 8 个每个同一时间只能被一个程序使用。同时开两个 tcpdump 可能会报 “Device busy”。下期预告tcpdump 的十八般武艺——-X、-A、-e、-G、-C、-W——这些参数背后都对应着什么样的内核级操作DumpAny 怎么做libpcap 是 tcpdump/Wireshark 的底层DumpAny 不走这条路——我们做应用层代理而不是网络层抓包。但 DumpAny 的架构设计借鉴了 libpcap 的分层思想协议解析器parser和数据展示view是分离的。这意味着添加一个新协议时只需要写解析器展示和存储层完全复用。tcpdumplibpcapWiresharknmapSnortBPF / eBPF环形缓冲区内核网卡驱动┌──────────────────────────────┐ │ Global Header (24 bytes) │ │ Magic Number: 0xa1b2c3d4 │ │ Version: 2.4 │ │ Snaplen: 262144 │ │ Link Type: 1 (Ethernet) │ ├──────────────────────────────┤ │ Packet Header #1 (16 bytes) │ ← 每个包一个 │ Timestamp: 1689123456.123456│ │ Captured Len: 1420 │ │ Original Len: 1500 │ ├──────────────────────────────┤ │ Packet Data #1 (N bytes) │ ├──────────────────────────────┤ │ Packet Header #2 (16 bytes) │ │ Packet Data #2 (N bytes) │ └──────────────────────────────┘ 聊几句libpcap 是谁、哪年开发的—— Steven McCanne 和 Van Jacobson1994 年。pcap 文件格式的 Magic Number—— 0xa1b2c3d4在 24 字节 Global Header 里。libpcap 三个核心函数—— pcap_open_live 开设备、pcap_compile/pcap_setfilter 编译加载过滤器、pcap_loop 循环读包回调。macOS 的 BPF 设备有什么坑—— /dev/bpf0~bpf7 只有 8 个每个同时只能一个程序用开两个 tcpdump 可能报 Device busy。libpcap 这层 DumpAny 也封装好了你直接用就行不用自己调。官网 dumpany.cn开源免费。
延伸阅读

更多相关文章

2026/9/27 10:12:42

谷歌云盘批量下载全攻略:从官方工具到Rclone实战

1. 项目概述与核心痛点谷歌云盘(Google Drive)作为全球最主流的云存储服务之一,几乎成了我们日常工作流中不可或缺的一环。无论是团队协作共享的设计稿、客户发来的大体积视频素材,还是个人备份的珍贵照片集,它都扮演着…

2026/9/27 2:37:38

4G DTU和4G工业路由器的区别在哪里?从这四个方面看

4G DTU和4G工业路由器都是工业物联网领域常用的无线数据传输设备,两者都能通过4G网络实现远程通信,但在工作原理、数据传输方式、安全防护以及使用场景上存在明显差异。搞清楚这些区别,才能在项目选型时少走弯路。1、工作原理不同4G DTU的全称…

2026/10/7 20:26:59

VMware虚拟机连接PLC全攻略:有线/无线桥接设置与网络排查

做自动化调试这些年,碰到最多的问题之一,就是同事抱着笔记本跑到现场,打开VMware虚拟机里的博途,在线扫描半天,设备列表空空如也。很多人第一反应是PLC挂了,其实绝大多数情况下,是虚拟机的网络方…

2026/10/7 20:26:59

AI Agent技能体系实战:从设计到GKE部署的完整指南

1. 从“skills”这个标题说起:它到底在解决什么问题第一次看到“skills”这个标题,很多人会以为是某个招聘网站上的技能标签,或者是一份简历里的能力清单。但结合热搜词里反复出现的 Agent Skills、Google Cloud、GKE、Genkit、codex skills、…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑