libpcap是unix/linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户级数据包捕获API接口,为底层网络测试提供了一个可移植的框架。
1. 工作原理
一个捕获机制包含3个主要部分,分别是面向底层的包捕获引擎、面向中间层的数据包过滤器、面向应用层的用户级接口。
linux操作系统对于数据包的处理流程是从底到上得方式,依次经历网络接口卡、网卡驱动层、数据链路层、IP层、传输层、最后达到应用程序。
而捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包通过linux内核做过滤/缓冲等处理,最后直接传递与上层应用程序进行交互。
libpcap也是基于这种原理,libpcap的捕获机制并不影响linux操作系统中网络协议栈低数据包的处理。
对应用程序而言,libpcap包捕获机制只是提供了一个统一的API接口,用户只需要按照相关的变成流程,简单的调用若干函数就可捕获感兴趣的数据包。
具体来说,libpcap库主要由3部分组成,网络分接头、数据包过滤器和用户API。
1. 网络分接头
网络分接头Network Tap 是一种链路层旁路机制,负责采集网卡数据包
2. 数据包过滤器
数据包过滤器Packet Fillter是针对数据包的一种过滤机制,在libpcap中采用BPF(BSD Packet Filetr) 算法对数据包执行过滤操作,这种算法的基本思想是基于规则匹配,对于符合条件的数据包进行放行。
3. 用户API
用户API是libpcap面向上层应用程序提供的编程接口,用户通过相关的函数实现数据包的捕获或发送。
libpcap的工作流程可描述为: 当一个数据包到达网卡时,libpcap利用创建的套接字从链路层驱动程序中获得 该数据包的拷贝,即旁路机制,同时通过Tap函数将数据包发给BPF过滤器。
BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,若匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤匹配,所有数据包都将放入内核缓冲区,并传递给用户缓冲区。
2. 抓包流程
编程流程
1. 网络设备查找
网络设备查找的目的是发现可用的网卡,他的实现是 pcap_lookupdev() ,如果当前有多个网卡,它会返回一个网络设备名指针列表。
2. 打开网络设备
利用第一步的返回值,用户可以决定libpcap使用哪个网卡,当然打开这个网络设备的函数是 pcap_open_live() 它返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的任何操作都要基于这个描述字。
3. 获得网络参数
利用 pcap_lokkupnet()函数,可以获得指定网络设备的IP地址和子网掩码,当然这个步骤并不是必须得,但为了显示的完整性,有时还是需要标记这些参数。
4. 编译过滤策略
libpcap 的一个功能是提供数据包过滤,即只采集符合规则的数据包,此项功能由函数pcap_compile() 实现,这个函数的功能时将用户指定的过滤策略编译到过滤程序中。
5. 设置过滤器
这是上个步骤的继续,pacp_setfilter() 函数用于设置第4步配置好的过滤器,当然要注明一点,步骤4和5不是必须得,如果不采用过滤,意味着程序会抓取所有的网络数据包。
6. 利用回调函数捕获数据包。
libpcap提供的一种回调的机制是获得数据包,可以采用pcap_loop() 和 pcap_dispatch() 函数来抓取数据包,当然也可以利用pcap_next() 和 pacp_next_ex()函数完成同样的工作。
若数据包捕获到后,应用程序可以采用相应的方式进行数据包解析,分析其中感兴趣的信息,当然分析工作往往是整个程序的关键。
7. 关闭网络设备
当应用程序工作完毕时,可以调用pcap_close()函数关闭网络设备,释放资源
设备查找
、
设备打开
参数读取
规则编译
过滤器设置
数据包到来
数据包分析
关闭设备
阅读(2086) | 评论(0) | 转发(0) |