BPF过滤器

2019-10-15 11:28:53 浏览数 (2)

(1)BPF本质上来说是一个设备驱动(devicedriver),能够被应用程序用来读取网络上通过这个网络适配器的包。但是BPF又是一个特殊的驱动,因为它并没有直接控制网络适配器,而是网络适配器真正的设备驱动调用BPF来传递数据。

(2)BPF正常情况下被用作诊断工具去检查与本机相连的网络的流通状况。一个BPF设备能够配置一个filter,根据这个filter的特征,来忽略或者接收到来的包。

(3)BPF拥有两个组件: the network tap 和 the packet filter 。thenetwork tap 收集来自网络设备驱动的包的一个拷贝,并把它传递给监听程序。the packetfilter 决定是否接收这个包并且把它拷贝给监听程序

(4)BPF为每一个要求服务的抓包程序关联一个filter和两个buffer。BPF分配buffer 且通常情况下它的额度是4KB the store buffer 被使用来接收来自适配器的数据; the hold buffer被使用来拷贝包到应用程序

(5)通常情况下, 当一个包到达网络接口时, 数据链路设备驱动将把它发送到系统协议栈。但是当BPF在这个接口上面监听时,网络设备驱动将首先调用 BPF的network tap函数。这个tap函数将包送入每一个监听程序的filter。而用户定义的filter决定:是否接收这个包;每一个包有多少字节将会被保存。如果filter接收这个包, 那么tap 将会从数据链路层驱动的缓存中拷贝这个数目的字节数到与这个filter关联的store buffer中(store buffer在内核中定义)。同时,网络接口的设备驱动将会重新获得控制权,且正常的协议处理将会进行。

(6)监听进程执行read系统调用去从BPF(hold buffer)接收包,并将阻塞于此。当hold buffer 满的时候(或者当超时发生时),BPF将会拷贝这些数据到进程内存空间,且唤醒这个进程。监听程序能够一次接收多个包。

0 人点赞