(转)Libcap库学习::(二)工作原理

Libpcap工作原理介绍

Libpcap是Unix/Linux平台下的网络数据包捕获数据库。它是一个独立于系统的用户级数据包捕获API接口,为底层网络监测提供了一个可以移植的框架。


一个包捕获机制包含三个主要部分,分别是面向底层的包捕获引擎面向中间层的数据包过滤器面向应用层的用户接口

Linux操作系统对于数据包的处理流程是从底到上的方式,依次经历网络接口卡、网卡驱动层、数据链路层、IP层、传输层,最后到达应用程序。

Libpcap也是基于这种原理,Libpcap的捕获机制并不影响Linux操作系统中网络协议栈对数据包的处理。

对应用程序而言,Libpcap包捕获机制只是提供了一个统一的API接口,用户只需要按照相关的编程流程,简单地调用若干函数就可以捕获到感兴趣的数据包。

具体来说,Libpcap库主要由三个部分组成,网络分接头、数据包过滤器和用户API。

1)网络分接头

网络分接头(Network Tap)是一种链路层旁路机制,负责采集网卡数据包。

(2)数据包过滤器

数据包过滤器(Packet Filter)是针对数据包的一种过滤机制,在Libpcap中采用BPF(BSD Packet Filter)算法对数据包执行过滤操作,这种算法的基本思想就是基于规则匹配,对符合条件的数据包进行放行。

(3)用户API

用户API是Libpcap面向上层应用程序提供的编程接口,用户通过调用相关的函数实现数据包的捕获或者发送。

具体来说,Libpcap的工作原理可以描述为,当一个数据包到达网卡时,Libpcap利用创建的套接字从链路层驱动程序中获得该数据包的拷贝,即旁路机制,同时通过Tap函数将数据包发给BPF过滤器。

BPF过滤器根据用户已经定义好的过滤过则对数据包进行逐一匹配,若匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有的数据包都将放入内核缓冲区,并传递给用户缓冲区。

工作流程如下图所示:

 

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/84112902