PIM-SSM
概述
在ASM中,同一时间只允许一个组播源向某个特定的组播组发送组播流量。这个限制将直接造成组播IP地址紧缺
SSM(Source-Specific Multicast,特定源组播),组播接收者通过IGMP成员关系报告加组时,除了指定期望加入的组播组地址,还能够指定组播源的地址,使用IGMP3实现;使得最后一跳路由器在初始时就知晓啦组播源的地址,并且直接朝着源的方向构建SPT的分支,于是组播流量就能够沿着构建好的SPT直接到达接收者,而不用经过RP,实际上该场景完全不需要用到RP。另外,SSM也缓解了组播IP地址紧缺的问题,在SSM中,在同一时间内,不同的组播源可以向同一个组播IP地址发送数据,因此,每个组播应用无需独占一个组播IP地址。IANA规定,232.0.0.0/8这个组播地址段专门用于SSM,SSM在PIM-SM的基础上实现,最后一跳路由器根据组播组地址来选择PIM-SM或PIM-SSM工作模式,缺省情况下,针对232.0.0.0/8地址范围的组播组不执行RPT加入过程
PIM-SSM的对比ASM存在的优势
- 由于组播接收者在宣告自己加入组播组的时候,同时还指定了组播源的地址,因此最后一跳路由器在最开始的时候便知晓了组播源的地址,它可以直接朝着源的方向建立SPT的分支,而不用朝着RP的方向建立RPT的分支,然后等待组播流量到达之后再进行SPT切换,效率得到了提升
- 由于组播接收者明确了其感兴趣的组播源,因此如果存在其他组播源向该组播组发送流量,那么这些流量将不会被转发给组播接收者
- 多个不同的组播应用,可以使用相同的组播组地址。因此有了组播源的加入,组播网络可以在目的IP地址相同的组播流量中,根据源IP区分不同的应用。极大的缓解了组播IPv4地址短缺的问题
PIM-SSM的工作机制

如图,AR1、AR2、AR3、AR4是PIM-SM组播路由器,他们通过OSPF获知了到达全网各个网段的路由。其中AR4在自己连接终端PC的接口G2/0/0上激活了IGMPv3
- PC1希望接收组播源10.1.1.1发往组播组232.1.1.1的流量,PC1向网络中发送一个IGMPv3成员关系报告报文,在该报文中,包含一个组记录,该组记录的类型为Mode_Is_Include,组地址为232.1.1.1,而组播源为10.1.1.1
- 最后一跳路由器AR4收到这个IGMPv3报文后,意识到其接口G2/0/0直连的网络中出现了组播组232.1.1.1的接收者,并且该接收者指定的组播源为10.1.1.1.由于组地址232.1.1.1是SSM地址,因此AR4采用PIM-SSM模式进行后续工作。AR4在自己的单播路由表中查询到达组播源10.1.1.1的路由,记录下路由的出接口,然后立即在其PIM路由表中创建(10.1.1.1,232.1.1.1)表项,将到达10.1.1.1的路由的出接口G0/0/0作为上游接口,将收到IGMPv3成员关系报告报文的接口G2/0/0添加到下游接口列表。随后,AR4将在自己与组播源之间建立一段SPT的分支。它从上游接口G0/0/0发送一个(10.1.1.1,232.1.1.1)的PIM加入报文
- AR2收到下游PIM邻居AR4发送的(10.1.1.1,232.1.1.1)PIM加入报文后,在其PIM路由表中创建(10.1.1.1,232.1.1.1)表项,将接收加入报文的接口G2/0/0添加到该表项的下游列表列表中,将到达组播源10.1.1.1的接口作为上游接口。然后AR2从上游接口G0/0/0向上游邻居AR1发送(10.1.1.1,232.1.1.1)PIM加入报文
- 第一跳路由器AR1收到AR2发送的(10.1.1.1,232.1.1.1)PIM加入报文后,如果已经存在(10.1.1.1,232.1.1.1)表项,则将收到加入报文的接口G0/0/1添加到该表项的下游接口列表中。当10.1.1.1开始向232.1.1.1发送组播流量时,组播流量便能够沿着已经建立好的SPT流向PC1
js
//AR1
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
ip address 10.1.1.254 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.1.12.1 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface NULL0
#
ospf 1
area 0.0.0.0
#
//AR2
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
ip address 10.1.12.2 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.1.23.2 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet2/0/0
ip address 10.1.24.2 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
ospf 1
area 0.0.0.0
#
//AR3
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
ip address 10.1.23.3 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.1.34.3 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface NULL0
#
ospf 1
area 0.0.0.0
#
//AR4
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
ip address 10.1.24.4 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.1.34.4 255.255.255.0
pim sm
ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet2/0/0
ip address 192.168.1.254 255.255.255.0
pim sm
igmp enable
igmp version 3
ospf enable 1 area 0.0.0.0
#
ospf 1
area 0.0.0.0
#
IGMP Snooping(Internet Group Management Protocol Snooping)
主要用于在交换机上优化组播流量的转发行为。缺省时,交换机只是简单地转发网络中的IGMP报文,不会对这些报文的内容感兴趣。此外,当交换机在某个VLAN内收到组播流量时,它会将这些流量在相同VLAN内所有接口上进行泛洪
当交换机部署了IGMP Snooping之后,它将会侦听组成员与IGMP查询器之间交互的IGMP报文,并解析IGMP报文中的相关信息,然后结合这些信息与接口、VLAN-ID等建立二层组播转发表项。这些转发表项奖用于指导组播流量转发,确保流量只被转发到正确的接口上
概念
名称 | 描述 |
---|---|
路由器接口(Router Port) | 指的是运行了IGMP Snooping的交换机朝向上游组播路由器的接口。可以通过动态的方式自动发现,也可以通过手工配置的方式静态指定。对于动态而言,IGMP Snooping交换机会将其收到IGMP常规查询报文或者PIM Hello报文的接口视为动态路由器接口。交换机将在路由器接口上收到上游组播路由器转发的组播流量 |
成员接口(Member Port) | 是IGMP Snooping交换机朝向组播组成员的接口。可通过动态的方式自动发现,也可通过手工配置的方式静态指定。对于动态而言,IGMP Snooping交换机会将其收到IGMP成员关系报告的接口视为动态成员接口 |
二层组播转发表(Layer 2 Multicast Forwarding Table) | 运行IGMP Snooping的交换机会侦听IGMP查询器与组成员之间交互的IGMP报文,并维护二层组播转发表,该表格中的表项将用于指导交换机转发组播流量。在二层组播表项中包含组播组地址、借口信息(路由器接口、成员接口)以及VLAN-ID等信息。在交换机上使用display l2-multicast forwarding-table命令查看二层组播转发表 |
IGMP Snooping的工作机制

如图,AR1是最后一跳组播路由器,其连接交换机SW的接口已经激活了IGMP。LSW1已经部署了IGMP Snooping,LSW1的所有接口都加入了VLAN10。初始时LSW1的二层组播转发表是空的,因此即使其收到AR1转发的组播流量,也不会将流量转发到任何接口
- AR1的接口激活IGMP后,开始周期性发送IGMP常规查询报文
- LSW1将在其G0/0/1接口收到AR1发送的IGMP常规查询报文,由于此时LSW的IGMP Snooping路由器接口列表为空,因此LSW1将G0/0/1添加到该列表中,也就是将这个接口指定为动态路由器接口,同时为路由器接口启动一个老化计时器(缺省180秒)。此后如果LSW1再次在该接口上收到IGMP常规查询报文,则刷新这个计时器。然后,LSW1将该IGMP常规查询报文从VLAN10中、除了G0/0/1接口之外的所有接口泛洪出去
- PC1、PC2和PC3都将收到LSW1泛洪的IGMP常规查询报文。由于PC3并非任何组播组的成员,因此PC3只是简单丢弃该报文,不会做任何回应。而PC1和PC2是组播组239.1.1.66的成员,因此它们各自发送IGMP成员关系报告报文(注意:PC1和PC2首次加入组播组239.1.1.66时,它们可以主动发送IGMP成员关系报告,而无需等待IGMP常规查询)
- 接下来LSW1将在自己的E0/0/1和E0/0/2接口上收到IGMP成员关系报告报文,由于激活了IGMP Snooping,因此LSW1将解析所收到的IGMP成员关系报告报文,LSW1意识到E0/0/1和E0/0/2接口所连接的用户需要加入组播组239.1.1.66,于是它在自己的二层组播转发表中创建239.1.1.66表项,将E0/0/1和E0/0/2接口指定为该表项的动态成员接口,并分别为这两个接口启动老化计时器。然后,LSW1将其收到的IGMP成员关系报告报文从路由器接口G0/0/1转发出去
- 此处有一个细节,IGMP成员关系报告的抑制机制会避免网段中出现多余的IGMP成员关系报告。当IGMP查询器向一个网段发送IGMP常规查询报文时,如果所有的组成员都使用IGMP成员关系报告报文进行回复,显然是多余的。为了避免这种情况,当组成员收到IGMP常规查询报文后,会启动一个时间随机的报告延迟计时器,当该计时器超时后,组成员才会发送IGMP成员关系报告,而同网段中其他同组的成员如果收到这个IGMP成员关系报告并且其报告延迟计时器还未超时,则会抑制自己的成员关系报告。需要注意的是,这个机制在IGMP成员Snooping环境中可能引发一些问题,在本例中如果PC1率先使用IGMP成员关系报告回应AR1的查询,由于IGMP成员关系报告本质上是一个组播报文,因此LSW1若将这个报文泛洪到VLAN10中的所有接口,那么PC2也将会收到该报文,而如果此时PC2的报告延迟计时器尚未超时,那么PC2将抑制自己的IGMP成员关系报告,这样以来,LSW1的E0/0/2接口将无法收到IGMP成员关系报告并导致老化计时器超时,LSW1会将该接口E0/0/2从成员接口列表中删除,因此当其收到发往239.1.1.66的组播流量时,也就不会再向E0/0/2接口转发,而PC2也就无法收到组播流量了
- IGMP Snooping考虑到了这个场景。运行了IGMP Snooping的交换机收到IGMP成员关系报告报文后,会将该报文从所有路由器接口转发出去,但是不会将该报文从成员接口转发出去,这就保证一个组播组内的成员不会收到其他成员发送的IGMP成员关系报告,这就解决了因为抑制机制出现的问题
- AR1收到LSW1转发上来的IGMP成员关系报告报文后,将维护相关组播表项,并在收到发往239.1.1.66的组播流量后向LSW1进行转发。而LSW1在自己的G0/0/1接口收到发往239.1.1.66的组播流量后,将首先查询自己的二层组播转发表项,并发现存在匹配的表项接口为E0/0/1和E0/0/2这两个成员接口,因此LSW1会将组播流量从这两个接口转发出去,非239.1.1.66的组播组成员PC3则不会收到这些组播流量
- 现在,PC1要离开组播组239.1.1.66,PC1向网络中发送一个IGMP离组报文。LSW1将在其E0/0/1接口上收到这个报文,LSW1查询自己的二层组播转发表后发现,该接口是组播组239.1.1.66的成员接口,因此LSW1将这个报文从所有的路由器接口G0/0/1转发出去
- AR1收到PC1发送的IGMP离组报文后,立即发送IGMP特定组查询报文
- LSW1将在其G0/0/1接口上收到这个IGMP特定组查询报文,将这个报文从除了G0/0/1接口之外的、VLAN10中的所有接口转发出去
- PC2收到这个IGMP特定组查询报文后,发现查询器所查询的正是自己所在的组播组,于是PC2立即回应IGMP成员关系报告报文
- LSW1将在其E0/0/2接口上收到这个IGMP成员关系报告报文,它查询自己的二层组播转发表项后发现,接口E0/0/2已经是组播组239.1.1.66的成员接口,因此它刷新该接口的老化计时器,然后将IGMP成员关系报告报文从路由器接口G0/0/1转发出去
- AR1收到PC2发送的IGMP成员关系报告报文后,意识到网段还存在239.1.1.66的组成员,因此继续向该网段转发239.1.1.66组播流量
- 由于PC1已经离开了组播组239.1.1.66,因此它不再发送IGMP成员关系报告报文。一段时间后,成员接口E0/0/1的老化计时器将会超时,于是LSW1将其从组播组239.1.1.66的成员接口列表中删除,此后,LSW1不再向E0/0/1接口转发该组播组的流量
IGMP Snooping代理(IGMP Snooping Proxy)
AR1的G0/0/0接口作为该网段的IGMP查询器周期性向下游发送IGMP常规查询报文,大家已经知道LSW1(已经激活了IGMP Snooping)收到该报文后会向相同的VLAN中所有的接口进行转发。组成员收到IGMP常规查询报文后,会立即发送IGMP成员关系报告报文,而LSW1只是简单地将这些IGMP成员关系报告报文原封不动地从自己的路由器接口转发出去。如此一来,AR1将收到大量的IGMP成员关系报告,然而实际上对于AR1而言只需知道自己的直连接口上存在组播组的成员即可,换句话说,只需要收到一份IGMP成员关系报告即可,多余的报告只是徒增AR1的处理负担,是没有意义的
IGMP Snooping代理主要有两个功能:
- 代替上游IGMP查询器,自己生成IGMP查询报文并向下游的组成员进行查询
- 代替下游组成员,自己生成IGMP成员关系报告报文或IGMP离组报文并发送给上游组播路由器
- 当LSW1在其接口上收到AR1发送的IGMP常规查询报文时,LSW1将该报文从相同VLAN中泛洪出去。如果此时LSW1的二层组播转发表项中,存在239.1.1.66组播组的成员接口,这意味着LSW1连接着该组播组的至少一个成员,于是LSW1自己生成一个IGMP成员关系报告报文并从路由器接口G0/0/1发送出去。AR1收到该报文后将刷新自己的相关转发表项
- 当LSW1收到下游的组成员发送的IGMP成员关系报告报文时,如果LSW1的二层组播转发表中已经存在相关转发表项,并且收到该报文的接口已经是该表项的成员接口,那么LSW1只是刷新成员接口的老化计时器,而不会向路由器接口转发这些IGMP报文。如果LSW1存在相关转发表项但是收到该报文的接口并非该表项的成员接口,那么LSW1只将该接口添加到成员接口列表中,并且不会向路由器接口转发这些IGMP报文。如果LSW1的二层组播转发表并不存在相关转发表项,则创建对应的转发表项,然后将收到该报文的接口添加到成员接口列表中,并向路由器接口转发该IGMP成员关系报告报文
- 当LSW1在成员接口上收到IGMP离组报文时,LSW1将代理IGMP查询器(AR1)立即从该成员接口发送IGMP特定组查询报文,如果一定时间后,依然没有在该接口上收到IGMP成员关系报告报文,则LSW1确定该接口下不再存在该组播组的成员,于是将该接口从相应表项的成员接口列表中删除。如果这个操作完成之后,该组播组依然存在其他成员接口,那么LSW1将不会从路由器接口发送IGMP离组报文,而如果此时该组播组已经没有其他成员接口了,那么LSW1将立即从路由器接口发送IGMP离组报文
js
//配置完后AR1并没有看到IGMP表,还得再看看,先记录配置
//LSW1配置
#
vlan batch 10
#
igmp-snooping enable
#
vlan 10
igmp-snooping enable
igmp-snooping proxy
#
interface Ethernet0/0/1
port link-type access
port default vlan 10
#
interface Ethernet0/0/2
port link-type access
port default vlan 10
#
interface GigabitEthernet0/0/1
port link-type access
port default vlan 10
#
//AR1配置
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
ip address 192.168.1.254 255.255.255.0
igmp enable
#