首先,介绍一些背景知识:我的理解是,IGMP(以及它的 IPv6 同类 MLD)的目的是通过确保多播数据包仅传输到真正对这些数据包感兴趣的目的地来避免浪费带宽。此逻辑是对较旧/较简单的交换机行为的改进,该行为是无论如何都将传入的多播数据包广播到所有其他端口,并让连接的设备自行决定是否丢弃它们不感兴趣的多播数据包。
IGMP 和 MLD 通过让交换机维护一个表来实现这一点,该表跟踪哪些连接设备当前加入了哪些多播组,并且当多播数据包进入时,交换机仅将其转发到加入数据包目标地址指示的组的端口。到目前为止一切顺利。
但据我的同事说,有一个奇怪的特殊情况:如果不设备已经加入了特定的多播组,那么交换机必须转发任何传入的多播数据包到所有端口(嗯,从技术上讲是所有连接了 IGMP 路由器的端口,但他说这其实是同一件事,因为大多数交换机不知道哪些端口连接了 IGMP 路由器,因此会回退到所有端口进行泛洪)。
这对我来说似乎非常违反直觉——为什么一个算法全部目的是为了避免多播泛洪,故意向所有端口泛洪,在这种情况下没有人是否有兴趣接收多播数据?这样做是否是为了确保与损坏的多播实现的向后兼容性,这些实现期望接收它们从未请求的多播数据包?如果不是,这样做的动机是什么?这似乎大大降低了算法的实用性。
作为参考,我的同事指出的指导方针位于RFC 4541:
3) An unregistered packet is defined as an IPv4 multicast packet with
a destination address which does not match any of the groups
announced in earlier IGMP Membership Reports.
If a switch receives an unregistered packet, it must forward that
packet on all ports to which an IGMP router is attached. A switch
may default to forwarding unregistered packets on all ports.
Switches that do not forward unregistered packets to all ports
must include a configuration option to force the flooding of
unregistered packets on specified ports.
我认为以下段落可能解释了动机,但我不明白:
In an environment where IGMPv3 hosts are mixed with snooping
switches that do not yet support IGMPv3, the switch's failure to
flood unregistered streams could prevent v3 hosts from receiving
their traffic. Alternatively, in environments where the snooping
switch supports all of the IGMP versions that are present,
flooding unregistered streams may cause IGMP hosts to be
overwhelmed by multicast traffic, even to the point of not
receiving Queries and failing to issue new membership reports for
their own groups.
即,为什么无法泛洪未注册的流会导致 v3 主机无法接收其流量?(v3 主机不知道加入他们想要接收流量的任何组吗?)并且在另一种情况下,由于泛洪而导致的流量损失不是和由于非泛洪而导致的流量损失一样严重吗?
答案1
该问题描述于会议报告即在 RFC4541 中引用为 [IETF56]:
问题 - 路由器 <-> IGMPv2 侦听交换机 <-> 支持 IGMPv3 的主机
路由器发送 IGMPv3 查询,告知主机使用 IGMPv3 主机发送 IGMPv3 报告
然后会发生什么?
Switch 会执行以下 3 项之一:
- 不转发报告
- 转发报告但不转发数据
- 转发报告和数据但不转发查询,然后数据超时
结果 - 将路由器或主机(以最后一个为准)升级到 IGMPv3 时,多播中断。
泛洪未注册流可以解决情况 1 中的问题(当旧交换机不转发 IGMPv3 报告时),并且对情况 2 和 3(当 IGMPv3 报告将通过旧交换机时)不会产生影响。
至于哪个问题(流量丢失或过度泛洪)更严重,这在很大程度上取决于具体情况。在某些情况下,泛洪可能更严重,因为与流量丢失不同,它在测试期间可能不会立即被注意到,而当稍后流量增加到足以使泛洪成为问题时,损坏的配置可能会被广泛部署,需要大量工作来修复它。
答案2
首先,介绍一些背景知识:我的理解是,IGMP(以及它的 IPv6 同类 MLD)的目的是通过确保多播数据包仅传输到真正对这些数据包感兴趣的目的地来避免浪费带宽。此逻辑是对较旧/较简单的交换机行为的改进,该行为是无论如何都将传入的多播数据包广播到所有其他端口,并让连接的设备自行决定是否丢弃它们不感兴趣的多播数据包。
不是。IGMP/MLD 的目的是让路由器知道任何本地连接的主机加入了哪个多播组(它们甚至不关心哪个,因为当时需要共享媒体)。然后,路由器将此信息提供给多播路由算法,该算法将在路由器之间交换此信息以构建多播路由表。这样,连接到路由器 A 的机器 X 可以向组 G 发送多播流量,而连接到另一个路由器 B 的机器 Y 如果已加入 G,则会接收该流量。
IGMP 是在交换机出现之前发明的,它期望主机和路由器之间的媒体是共享的。IGMP 甚至针对共享媒体进行了优化,因为它提供了优化,以防许多主机对同一组感兴趣,方法是只让一个主机发送一次成员报告(因为所有主机都会从该多播组接收流量)。
对我来说这似乎非常违反直觉——为什么一个算法的全部目的是避免多播泛洪,而在没有人有兴趣接收多播数据的情况下,它却故意向所有端口泛洪?
IGMP/MLD 路由器始终对任何多播数据感兴趣。毕竟,转发这些数据是它们的职责。如果主机向组 X 发送多播数据,则路由器必须将数据包转发到至少有一台主机加入组 X 的所有其他路由器。交换机完全不知道这种情况,因此,如果它不将未知流量从主机转发到路由器,它就会中断多播路由。
至于为什么要启用将未注册的数据包转发到所有端口,这样做可能有技术原因,但就我个人而言,我认为与集线器相比,交换机是一种优化。我希望它们在默认配置下优化而不破坏事物。如果交换机收到非法或意外的数据包,我希望它无论如何都转发它,因为该数据包可能是出于某种原因而发送的。我最不希望看到的是我的交换机丢弃数据包。
答案3
Router <-> IGMPv2 snooping switch <-> IGMPv3 capable host
我认为标准解释如下,
Igmpv3 未注册数据包发送到侦听交换机(IGMPv2),它不应该识别 Igmp 数据包,然后交换机修剪 Igmp 数据包,然后 Igmpv3 多播数据包不会流向 Igmpv3 主机。