BPF(BSD Packet Filter)
是一种抓取并过滤网络数据包(capture and filter packet
)的内核结构(kernel architecture
)。BPF
包含2
个重要的组成部分:网络分流器(network tap
)和包过滤器(packet filter
)。网络分流器负责从网络驱动拷贝数据包,而包过滤器则过滤掉不符合条件的数据包,只把符合需求的数据包上报给应用程序。下图摘自UNP
:
当数据包到达网卡时,正常情况下,数据链路层的驱动程序会把包转给协议栈。但当有BPF
监听网卡时,驱动程序会首先把包发给BPF
。BPF
会把包发给不同程序的包过滤器,再由过滤器决定哪些包并且包里的哪些内容应该保存下来。对于符合条件的数据包,BPF
会把数据拷贝到和包过滤器对应的缓存(buffer
)。然后驱动程序继续执行。
在用tcpdump
命令过滤数据包时:
tcpdump -p -ni eth0 -d "ip and udp"
实际就用到了BPF
。