gpt4 book ai didi

c - 使用 PF_PACKET 类型的套接字时,PACKET_ADD_MEMBERSHIP 的作用是什么?

转载 作者:太空狗 更新时间:2023-10-29 11:08:33 26 4
gpt4 key购买 nike

当使用协议(protocol)类型为ETH_P_IPPF_PACKET 类型的套接字时,man packet文档讨论了多播的套接字选项。套接字选项是 PACKET_ADD_MEMBERSHIP

假设您在 PF_PACKET 套接字上正确使用 PACKET_ADD_MEMBERSHIP 套接字选项,那么此套接字选项有哪些功能、优点和用例?

现在我收到所有传入的 IP 数据包,所以我查看每个数据包以查看它是否具有正确的 IP dst-address 和 UDP dst-port,然后我跳过所有其他数据包。 使用 PACKET_ADD_MEMBERSHIP 套接字选项是否意味着我不需要执行自己的过滤器,因为内核或驱动程序会为我过滤?


我深入研究了 linux-kernel 源代码并稍微追踪了代码。我发现您通过 setsockopt() 传入的 ethernet-mac-address 已添加到 ethernet-mac-addresses 列表中。然后将列表发送到网络设备硬件以执行某些操作...但我找不到任何权威文档告诉我接下来会发生什么。

我有根据的猜测是硬件使用 ethernet-mac-address 列表来过滤第 2 层以太网协议(protocol)(即硬件只接受目标以太网地址与列表中的地址相匹配的数据包) .如果有一些好的文档,我会很欢迎。

(我更熟悉 TCP/UDP 套接字,所以这看起来非常类似于 AF_INET type of socketIP_ADD_MEMBERSHIP 套接字选项...所以我期待生成 IGMP 报告从路由器开始多播流量...但我通过实验发现,当您使用此套接字选项时,不会生成任何 IGMP 报告。)

最佳答案

你的猜测是正确的。 PACKET_ADD_MEMBERSHIP 应该将地址添加到 NIC 的硬件过滤器。正如您所猜测的那样,它旨在允许您接收多个不同地址的多播,而不会产生完全混杂模式的负载(*)。

(* 使用现代全双工以太网,通常不会有大量流量进入 NIC,它无论如何也不想接收,除非它处于虚拟化环境中。)

请注意,还有一个单独的 PACKET_MR_UNICAST,它没有出现在 packet(7) 手册页中,但工作方式类似。对于要过滤的地址类型,我会使用适当的地址(单播与多播),因为可以想象(尽管不太可能)驱动程序会拒绝将单播地址放入多播过滤表。

话虽如此,您仍然需要保留软件过滤作为备份。有一些较旧的驱动程序根本不实现 MAC 过滤(特别是对于多个单播地址)。如果该功能不可用,核心内核或驱动程序会通过简单地打开混杂模式来处理此问题。

至于与IP_ADD_MEMBERSHIP的关系,IP_ADD_MEMBERSHIP代码会自动构造合适的多播MAC地址,并添加到接口(interface)中。请参阅 ip_mc_filter_add。

关于c - 使用 PF_PACKET 类型的套接字时,PACKET_ADD_MEMBERSHIP 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com