IGMP Snooping工作机制示例
如下图所示,R1是最后一跳组播路由器,其连接交换机SW的接口已经激活了IGMPv2,SW是一台以太网二层交换机,该交换机已经部署了IGMP Snooping,SW的所有接口都加入了VLAN 10。初始时SW的二层组播转发表是空的,因此即使其收到R1转发的组播流量,它也不会将流量转发到任何接口。
(1)IGMP查询器处理流程:
- R1的接口激活IGMP后,开始周期性地发送IGMPv2 membership query报文。
(2)SW处理流程:
- SW将在其GE0/0/20接口收到R1发送的IGMP常规查询报文,由于此时SW的IGMP Snooping路由器接口列表为空,因此它将GE0/0/20添加到该列表中,也就是将这个接口指定为动态路由器接口,同时为路由器接口启动一个老化计时器(缺省为180秒)。此后如果SW再次在该接口上收到IGMP常规查询报文,则刷新这个计时器。
- 然后,SW将该IGMP常规查询报文从VLAN10中除了GE0/0/20接口之外的所有接口泛洪出去,如下图所示。
(3)组播接收者处理流程:
- PC1 、PC2及PC3都将收到SW泛洪的IGMP常规查询报文。
- 由于PC3并非任何组播组的成员,因此它只是简单地丢弃该报文,不会做任何回应;而PC1、PC2是组播织239.1.1.66的成员,因此它们各自发送IGMPv2 membership report报文。(当PC1及PC2首次加入组播组239.1.1.66时,它们可以主动发送IGMPv2 membership report,而无需等待IGMP常规查询。)
(4)SW处理流程:
- SW将在自己的GE0/0/1、GE0/0/2接口上收到IGMPv2 membership report报文,
- 由于激活了IGMP Snooping,因此SW将解析其所收到的IGMP成员关系报告报文,它意识到GE0/0/1及GE0/0/2接口所连接的用户需要加入组播组239.1.1.66,于是它在自己的二层组播转发表中创建239.1.1.66表项,将GE0/0/1及GE0/0/2接口指定为该表项的动态成员接口,并分别为这两个接口启动老化计时器。此后SW如果再次在这两个接口上收到IGMP成员关系报告报文,则刷新该计时器。
- 最后,SW将其收到的IGMP成员关系报告报文从路由器接口GE0/0/20转发出去,如下图所示。
引入问题
为了避免了网段中出现多余的IGMP成员关系报告,存在IGMP成员关系报告的抑制机制。
当IGMP查询器向一个网段发送IGMP常规查询报文时,如果所有的组成员都使用IGMP成员关系报告报文进行回复,显然是多余的。为了避免这种情况,当组成员收到IGMP常规查询报文后,会启动一个时间随机的报告延迟计时器,当该计时器超时后,组成员才会发送IGMP成员关系报告,而同网段中其他同组的成员如果收到这个IGMP成员关系报告并且其报告延迟计时器尚未超时,则会抑制自己的成员关系报告。
需要注意的是,这个机制在IGMPSnooping环境中可能引发一些问题:
- 如上图所示,在本例中如果PC1率先使用IGMP成员关系报告回应R1的查询,
- 由于IGMP成员关系报告报文本质上是一个组播报文,因此SW若将这个报文泛洪到VLAN 10中的所有接口,那么PC2也将会收到该报文,
- 如果此时PC2的报告延迟计时器尚未超时,那么它将抑制自己的IGMP成员关系报告,这样一来,SW的GE0/0/2接口将无法收到IGMP成员关系报告并导致老化计时器超时,SW会将该接口从成员接口列表中删除,因此当其收到发往239.1.1.66的组播流量时,也就不会再向GE0/0/2接口转发,而PC2也就无法接收到组播流量了。
解决方法
运行了IGMP Snooping的交换机收到IGMP成员关系报告报文后,会将该报文从所有路由器接口转发出去,但是不会将该报文从成员接口转发出去,这就保证一个组播组内的成员不会收到其他成员发送的IGMP成员关系报告,这就解决了上面提到的问题。
(5)R1收到SW转发上来的IGMP成员关系报告报文后,它将维护相关组播表项(IGMP组表项、IGMP路由表项、组播路由表项),并在收到发往239.1.1.66的组播流量后向SW进行转发。
(6)SW在自己的GE0/0/20接口收到发往239.1.1.66的组播流量后,将首先查询自己的二层组播转发表项,并发现存在匹配的表项,而且该表项中存在GE0/0/1及GE0/0/2这两个成员接口,因此它将组播流量从这两个接口转发出去,而不是该组播组成员的PC3则不会收到这些组播流量。
组成员离组过程
(7)假如现在PC1要离开组播组 239.1.1.66,它向网络中发送一个IGMP离组报文。
(8)SW将在其GE0/0/1接口上收到这个报文。SW查询自己的二层组播转发表后发现,该接口是组播组239.1.1.66的成员接口,因此它将这个报文从所有的路由器接口(也就是GE0/0/20接口)转发出去,如下图所示。
(8)R1收到PC1发送的IGMP离组报文后,立即发送IGMPv2特定组查询报文。
(9)SW将在其GE0/0/20接口上收到这个IGMP特定组查询报文,它将这个报文从除了GE0/0/20接口之外的、VLAN10中的所有接口转发出去。
(10)PC2收到这个IGMP特定组查询报文后,发现查询器所查询的正是自己所在的组播组,于是它立即回应IGMP成员关系报告报文。
(11)SW将在其GE0/0/2接口上收到这个IGMP成员关系报告报文,它查询自己的二层组播转发表项后发现,接口GE0/0/2已经是组播组239.1.1.66的成员接口,因此它刷新该接口的老化计时器,然后将IGMP成员关系报告从路由器接口GE0/0/20转发出去。
(12)R1收到PC2发送的IGMP成员关系报告后,意识到网段中还存在239.1.1.66的组成员,因此维护相关表项(IGMP组表项、IGMP路由表项、组播路由表项),也可以继续向该网段转发239.1.1.66的组播流量。
(13)由于PC1已经离开了组播组239.1.1.66,因此它不再发送IGMP成员关系报告报文。一段时间后,成员接口GE0/0/1的老化计时器将会超时,于是SW将其从组播组239.1.1.66的成员接口列表中删除,此后,SW不再向GE0/0/1接口转发该组播组的流量。