我有一个程序,每 50 毫秒发送一次 IPv6 多播数据包(发送至 ff12::2:0:8afb:382b:c053:85f%en1)。我在一个非常简单的单机 LAN(Mac mini <-wifi-> Linksys wifi 路由器 <-cat5-> DSL 调制解调器 <-> 互联网)上运行它。在我的测试中,没有计算机加入此多播组(即没有人在监听这些数据包)
我的问题是,当运行该程序时,Mac 的 WiFi 性能下降了 50% 以上。大概问题是所有这些多播数据包都占用了我的大量 WiFi 带宽并导致拥塞……但我不明白为什么要传输这些数据包。据我了解,多播使用生成树算法来确保多播数据包仅路由到真正有兴趣接收它们的主机。如果这是真的,并且假设我的 LAN 上没有其他计算机加入此多播地址,我的 Mac 是否应该意识到这一点,并且除非/直到其他主机加入多播组,否则实际上不会发送任何数据包?或者生成树剔除仅在交换机上实现,而不是由主机本身实现?
答案1
多播是一件棘手的事情。路由器是仲裁多播数据包的,智能交换机有时可以确保数据包不会到达它们不应该去的地方。但是,如果多播器和您的客户端站之间没有路由器(如果我没看错的话,确实没有),那么多播的行为将与该子网上的广播完全一样。
答案2
添加到@sysadmin1138 的答案(该评论对于评论框来说太长了)...
值得注意的是,802.11 通过两种方式增加了这种痛苦:BSS 内中继和低多播速率。
在 802.11 上,如果原始发送者不在预期接收者的无线电范围内,则同一 AP 上的无线到无线帧必须由 AP 以无线方式重新传输。此过程称为“BSS 内中继”,解决了所谓的“隐藏节点问题”——两个无线节点可能都在 AP 的范围内,但不在彼此的范围内(彼此隐藏)。因此,来自 AP 的一个无线客户端并可能需要发送到 AP 的另一个无线客户端的每个帧(注意:这包括所有多播和广播)都会通过同一信道传输两次。第一次到AP(这被称为分发系统,或“ToDS”),然后再次从AP(“FromDS”),作为 BSS 内中继的一部分。
旅程的“ToDS”部分是客户端可以成功与 AP 通信的最高数据速率。因此,如果这是使用 40MHz 信道和短保护间隔的现代 3x3 N 客户端和 AP,则这可能是 450mbps。
不幸的是,对于旅程的“FromDS”部分,帧必须以足够低的数据速率发送,以便该 AP 的所有客户端都能可靠地接收它们。这是因为多播不会在 802.11 层进行确认,因为这会导致对每个多播的响应都产生确认风暴。
一些 AP 允许您明确设置多播速率。其他 AP 允许您定义“基本”或“必需”速率集,然后 AP 从基本速率中选择多播速率。还有一些 AP 只允许您设置 b/g/n(或 a/n)兼容模式,并在此基础上预定义基本速率集和多播速率。许多 AP 默认为完全兼容模式,一直到 802.11-1997 DSSS 数据速率 1 和 2 mbps(802.11b 添加 5.5 和 11mbps 之前)。这意味着您的多播速率可能低至 1mbps。
因此,在最坏的情况下,你的多播可能会吞噬 451次与无线到有线(或有线到无线)单播帧相同大小的信道占用时间。
还要注意,在某些设计中,BSS 内中继由 AP 的 802.11 NIC 中的微代码执行,因此在这些架构中,这些帧在中继之前不会经过 AP 的主机处理器。因此,即使 AP 是一个“智能”交换机,可以违反分层模型并执行第 3 层 IGMP 侦听以修剪多播树,在无线电卡已经对帧进行 BSS 内中继之前,它也没有机会这样做。
答案3
当本地路由器(而非交换机)不完全支持多播时,多播默认为广播行为。因此,它会传播到 LAN 段内的所有已知节点。
SoHo 路由器并不以完全或正确支持多播而闻名。许多路由器依赖于上游路由器,并且只期望 LAN 级别的客户端。您可以尝试调整路由器设置,但如果您的多播组没有订阅者,为什么不在源头关闭它呢?