Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 原始套接字/BPF-过滤完成一次还是多次? 上下文_C_Linux_Sockets_Networking_Bpf - Fatal编程技术网

C 原始套接字/BPF-过滤完成一次还是多次? 上下文

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_

研究Linux Debian 64位上的Berkeley数据包过滤器,以过滤打开的套接字接收的数据包

我使用
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将在每个套接字中进行过滤(每个数据包将被分析+过滤的次数与系统上有打开的套接字的次数相同,因为每个应用程序都会看到数据包进入混杂模式。这是没有效率的)

我不确定


谢谢

bpf程序将位于内核中。它将处理发送到setsockopt调用中标识的特定套接字的数据。如果一个特定的包通过了过滤器,它将被传递,否则它将被过滤掉

我想强调的是,使用不同套接字对API进行的两次并行调用不会影响另一次调用,应该可以正常工作

关于内核中的内部实现,我不确定


tx

Negro-但这个问题表明了对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编辑了我的答案以澄清意图。德克萨斯州