我有一个程序每隔50ms发送一个IPv6组播数据包(到ff12 :: 2:0:8afb:382b:c053:85f%en1)。 我已经运行在一个非常简单的单机局域网上(Mac mini <-wifi-> Linksys wifi路由器<-cat5-> DSL modem < – > Internet)。 在我的testing中,没有计算机join到这个多播组(即没有人正在监听这些数据包)
我的问题是,当这个程序运行时,Mac的WiFi性能下降超过50%。 大概问题是,所有这些组播数据包都耗尽了我的WiFi带宽,造成了拥塞……但我不明白为什么这些数据包正在被传输。 这是我的理解,多播使用生成树algorithm,以确保组播数据包只被路由到实际上有兴趣接收它们的主机。 如果这是真的,并且考虑到我的局域网上没有其他计算机join到这个多播地址中,我的Mac不应该意识到这一点,除非其他主机join多播组,否则不会实际发出任何数据包? 或者,生成树的剔除只能在交换机上实现,而不是由主机自己实现?
多播是一件棘手的事情。 路由器是仲裁多播数据包的路由器,智能交换机有时可以确保数据包不会到达不应该到达的地方。 但是,如果在多媒体播放器和客户端站点之间没有路由器(并且没有我正在阅读的权利),那么多播的行为将与该子网上的广播完全相同。
要添加到@ sysadmin1138的答案(这个评论是太长的评论框)…
值得注意的是,802.11在两个方面增加了这种痛苦:BSS内部中继和低多播速率。
在802.11上,如果原始发送者不在预期接收者的无线电范围内,则必须通过AP无线地重传相同AP上的无线到无线帧。 这个过程被称为“BSS内部中继”,解决了所谓的“隐藏节点问题”,即两个无线节点都可以在AP的范围内,但不在彼此的范围内(隐藏)。 因此,来自AP的一个无线客户端并可能需要去AP的另一个无线客户端(注意:这包括所有多播和广播)的每个帧在相同的信道上传输两次。 作为BSS内部中继的一部分,首先到达 AP(这被称为到分配系统或“ToDS”),然后再从 AP(“FromDS”)。
旅程中的“ToDS”段是客户端可以与AP成功通信的最高数据速率。 所以如果这是一个现代的3×3 N客户端和使用短保护间隔的40MHz通道的AP,这可能是450mbps。
不幸的是,对于旅程的“FromDS”这一段,帧必须以足够低的数据速率发送,以便该AP的所有客户可靠地接收它们。 这是因为组播在802.11层不是Ack,因为它会引起Ack风暴来响应每个组播。
一些AP可以让你明确地设置多播速率。 其他人可以定义你的“基本”或“需要”的速率设置,然后APselect基本速率之外的多播速率。 还有一些只是让你设置你的B / G / N(或A / N)兼容模式,并有基于此的预定义的基本速率设置和多播速率。 许多AP默认为完全兼容模式,一直回到802.11和802.11Mbps数据速率(在802.11b增加5.5和11Mbps之前)。 这意味着您的多播速率可能低至1mbps。
因此,在最糟糕的情况下,您的组播可能会吞吐451 倍的通道时长,因为相同大小的无线到有线(或有线到无线)单播帧会占用。
还要注意的是,在某些devise中,BSS内的中继是通过AP的802.11网卡中的微码来实现的,所以在这些架构上,这些帧在中继之前不会通过AP的主处理器。 所以即使AP是一个“智能”交换机,可能会违反分层模型,并且执行三层IGMP侦听来修剪组播树,但在无线卡已经完成BSS之前,也不会有机会这样做中继在框架上。
当本地路由器(不是交换机)完全支持时,组播默认为广播行为。 因此它倾向于传播到局域网段内的所有已知节点。
SoHo路由器不完全或正确地支持MultiCast。 许多依靠上游路由器,并期望在局域网级别的客户端。 您可以尝试调整您的路由器设置,但是如果您的多播组没有用户,为什么不closures它的源?