BPF

维基百科,自由的百科全书
跳转至: 导航搜索

柏克萊封包過濾器(Berkeley Packet Filter,縮寫 BPF),是类Unix系统上数据链路层的一种原始接口,提供原始链路层封包的收发,除此之外,如果网卡驱动支持洪泛模式,那么它可以让网卡处于此种模式,这样可以收到网络上的所有包,不管他们的目的地是不是所在主机

另外,BPF支持「过滤」封包,这样BPF会只把「感兴趣」的封包到上层软件,可以避免从操作系统内核向用户态复制其他封包,降低抓包的CPU的负担以及所需的缓冲区空间,从而减少丢包率。BPF的过滤功能是以BPF虚拟机机器语言解释器的形式实现的,这种语言的程序可以抓取封包数据,对封包中的数据采取算术操作,并将结果与常量或封包中的数据或结果中的测试位比较,根据比较的结果决定接受还是拒绝封包。在一些平台上,包括FreeBSD和WinPcap,即时编译技术用于把虚拟机指令转换为原始码,以进一步减少开销。

在其他操作系统上,此虚拟机语言的内核态解释器也被用于原始数据链路机制,例如Tru64 Unix系统,以及Linux中的套接字解释器,和WinPcap封包抓取机制。

用户态解释器由pcap API的libpcap/WinPcap实现提供,因此,在对此过滤机制没有内核态支持的系统上抓取封包时,封包可以在内核态过滤,使用pcap API的代码可以工作于此两种模式;在使用用户态过滤的系统上,所有分包由内核态复制到用户态,包括将被过滤出去的封包。这种解释器也可以用于包含由pcap抓取的封包的文件。

BPF有时也只表示过滤机制,而不是整个接口。

BSD 内核实现例程如 bpf_mtap()bpf_tap(),以BPF_MTAP()BPF_TAP()宏定义的形式进行包裹由网卡驱动(以及伪驱动pseudo-drivers) 向BPF机制发送进出的封包。

2007年,Robert Watson与Christian Peron为FreeBSD操作系统中BPF的实现加入了zero-copy buffer extension,使得驱动程序中断处理器中的内核封包抓取能直接向用户内存写,以避免BPF设备收到的所有封包数据的两次复制需要,一份副本存在于用户进程的接收路径中,这保证了不同BPF设备调用者的独立性,同时使得只把封包头部放入BPF缓冲区,而不是复制整个封包数据。

外部链接[编辑]