libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的
libpcap可以实现以下功能:
- 数据包捕获:捕获流经网卡的原始数据包
- 自定义数据包发送:任何构造格式的原始数据包
- 流量采集与统计:网络采集的中流量信息
- 规则过滤:提供自带规则过滤功能,按需要选择过滤规则
libpcap工作原理
libpcap主要由两部份组成:网络分接口(Network Tap)和数据过滤器(Packet Filter)。
网络分接口从网络设备驱动程序中收集数据拷贝(旁路机制),过滤器决定是否接收该数据包。Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。如果没有定义规则,则把全部数据交给上层应用程序。
如图所示一个数据包的捕捉分为三个主要部分:
- 面向底层包捕获、
- 面向中间层的数据包过滤
- 面向应用层的用户接口
libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用链路层PF_PACKET原始套接字从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤