C 原始套接字/BPF-过滤完成一次还是多次? 上下文
研究Linux Debian 64位上的Berkeley数据包过滤器,以过滤打开的套接字接收的数据包 我使用C 原始套接字/BPF-过滤完成一次还是多次? 上下文,c,linux,sockets,networking,bpf,C,Linux,Sockets,Networking,Bpf,研究Linux Debian 64位上的Berkeley数据包过滤器,以过滤打开的套接字接收的数据包 我使用AF_数据包,因此我甚至可以管理数据包的第2层 到目前为止,它工作得很好。但我必须过滤每个套接字上的每个数据包,这是没有效率的。因此我使用BPF 问题 因为我让我的应用程序自己设置过滤器 setsockopt(sd, SOL_PACKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) < 0 ) setsockopt(sd,SOL_
AF_数据包
,因此我甚至可以管理数据包的第2层
到目前为止,它工作得很好。但我必须过滤每个套接字上的每个数据包,这是没有效率的。因此我使用BPF
问题
因为我让我的应用程序自己设置过滤器
setsockopt(sd, SOL_PACKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) < 0 )
setsockopt(sd,SOL_数据包,SO_ATTACH_FILTER,&FILTER,sizeof(FILTER))<0)
我想知道:
如果内核将过滤数据包并将其定向到正确的套接字(在内核级别,系统上每个数据包过滤一次)
- 或
谢谢bpf程序将位于内核中。它将处理发送到setsockopt调用中标识的特定套接字的数据。如果一个特定的包通过了过滤器,它将被传递,否则它将被过滤掉 我想强调的是,使用不同套接字对API进行的两次并行调用不会影响另一次调用,应该可以正常工作 关于内核中的内部实现,我不确定
txNegro-但这个问题表明了对AF_数据包套接字与混杂模式的根本误解,我想概述一下,在LINUX的AF_数据包套接字上使用BPF过滤器是以一种高效的方式实现的(对于通常的用例) 关于问题的一般问题: 使用AF_数据包套接字并不意味着NIC被切换到 混杂模式-它只是将所有帧转发到 主机到用户空间(因此仍然应用基于L2地址的过滤器-与处于混杂模式的NIC相反,该NIC愉快地忽略了不匹配的目标MAC)。这应该会让您的问题变得轻松,因为即使存在AF_数据包套接字,也会应用通常的帧/数据包分发过程 关于效率: 只有AF_数据包套接字才能看到指向主机的所有帧。连接到插座的过滤器按插座进行评估。内核中没有一个中心点来处理所有过滤器并将帧分配到它的方向。通常,AF_数据包套接字用于在用户空间中实现协议(处理程序)。因此,那些实现AF_数据包的老谋深算的人认为,大多数指向AF_数据包套接字的帧将被过滤/丢弃,因为用户只希望处理非常特定的帧子集 过滤器应用于套接字缓冲区(skb-保存帧及其相关控制/状态数据的容器),该缓冲区由参与帧处理的所有实体共享。仅当筛选器与此缓冲区的克隆匹配时,才会创建并将其移交给用户。在AF_数据包套接字的上下文中,甚至还有一个在顶部负责处理skb的接口,该接口表示:
* This function makes lazy skb cloning in hope that most of packets
* are discarded by BPF.
有关AF_数据包套接字上的数据包筛选器的更多信息,请参阅。@Skynet:谢谢您的编辑;)没问题,bro@Larry编辑了我的答案以澄清意图。德克萨斯州