IGMP(Internet Group Management Protocol,互联网组管理协议)是负责IPv4组播成员管理的协议,用来在组播接收者和与其直接相邻的组播路由器之间建立和维护组播组成员关系。

IP组播通信的特点是报文从一个源发出,被转发到一组特定的接收者。发送者不关注接收者的位置信息,只是将数据发送到约定的目的组播地址。要使组播报文最终能够到达接收者,需要某种机制使连接接收者网段的组播路由器能够了解到该网段存在哪些组播接收者,同时保证接收者可以加入相应的组播组中。

IGMP就是用来在接收者主机和与其所在网段直接相邻的组播路由器之间建立、维护组播组成员关系的协议。IGMP在组播网络中的部署位置如图1所示。

图1 IGMP在组播网络中的部署位置

IGMP有三个版本:IGMPv1、IGMPv2和IGMPv3。下面分别对IGMP的三个版本进行介绍

IGMPv1工作原理

IGMPv1报文

IGMPv1包括两种类型的报文:

  • 普遍组查询报文(General Query):查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。

  • 成员报告报文(Report):主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。

IGMPv1工作机制

IGMPv1协议主要基于查询和响应机制完成组播组管理。当一个网段内有多个组播路由器时,由于它们都可以接收到主机发送的成员报告报文,因此只需要选取其中一台组播路由器发送查询报文就足够了,该组播路由器称为IGMP查询器(Querier)。在IGMPv1中,由组播路由协议PIM选举出唯一的组播信息转发者(Assert Winner或DR)作为IGMPv1的查询器,负责该网段的组成员关系查询。

下面以图2所示组网为例,介绍IGMPv1的工作机制。组播网络中RouterA和RouterB连接主机网段,RouterA为IGMP查询器,在主机网段上有HostA、HostB、HostC三个接收者。HostA和HostB想要接收发往组播组G1的数据,HostC想要接收发往组播组G2的数据。

图2 组播网络示意图

IGMPv1的工作机制可以分为普遍组查询和响应机制、新组成员加入机制和组成员离开机制三个方面。

普遍组查询和响应机制

通过普遍组查询和响应,IGMP查询器可以了解到该网段内哪些组播组存在成员。

图3 IGMP查询和响应示意图

如图3所示,普遍组查询和响应过程如下:

  1. IGMP查询器周期性(默认60秒)向子网内所有主机(224.0.0.1)发送普遍组查询报文;收到该查询报文的组成员启动定时器。

    HostA和HostB是组播组G1的成员,则在本地启动定时器Timer-G1。缺省情况下,定时器的范围为0~10秒之间的随机值。

  2. 第一个定时器超时的组成员发送针对该组的报告报文。

    假设HostA上的Timer-G1首先超时,HostA向该网段发送目的地址为G1的报告报文。也想加入组G1的HostB收到此报告报文,则停止定时器Timer-G1,不再发送针对G1的报告报文。这样报告报文被抑制,可以减少网段上的流量。

  3. IGMP查询器接收到HostA的报告报文后,了解到本网段内存在组播组G1的成员,则由组播路由协议生成(*,G1)组播转发表项,“*”代表任意组播源。网络中一旦有组播组G1的数据到达路由器,将向该网段转发。

新组成员加入机制

图4 新组成员加入示意图

如图4所示,主机HostC加入组播组G2的过程如下:

  1. 主机HostC不等待普遍组查询报文的到来,主动发送针对G2的报告报文以声明加入。

  2. IGMP查询器接收到HostC的报告报文后,了解到本网段内出现了组播组G2的成员,则生成组播转发项(*,G2)。网络中一旦有G2的数据到达路由器,将向该网段转发。

组成员离开机制

IGMPv1没有专门定义离开组的报文。主机离开组播组后,便不会再对普遍组查询报文做出回应。

  • 假设HostA想要退出组播组G1

HostA收到IGMP查询器周期性发送的普遍组查询报文时,不再发送针对G1的报告报文。由于网段内还存在G1组成员HostB,HostB会向IGMP查询器发送针对G1的报告报文,因此IGMP查询器感知不到HostA的离开。

  • 假设HostC想要退出组播组G2

HostC收到IGMP查询器周期性发送的普遍组查询报文时,不再发送针对G2的报告报文。由于网段内不存在组G2的其他成员,IGMP查询器不会收到G2组成员的报告报文,则在一定时间(缺省值为130秒)后,删除G2所对应的组播转发表项。

IGMPv2的变化

IGMPv2的工作机制与IGMPv1基本相同,最大的不同之处在于IGMPv2增加了离开组机制。成员主机离开组播组时,会主动发送成员离开报文通知IGMP查询器;IGMP查询器收到成员离开报文后,会连续发送特定组查询报文,询问该组播组是否还存在组成员,从而及时更新组成员关系,减少网络中冗余的组播流量。

IGMPv2报文

与IGMPv1相比,IGMPv2的变化如下:

  • 除了普遍组查询报文和成员报告报文之外,IGMPv2新增了两种报文:

  1. 成员离开报文(Leave):成员离开组播组时主动向查询器发送的报文,用于宣告自己离开了某个组播组。

  2. 特定组查询报文(Group-Specific Query):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员。

  • IGMPv2对普遍组查询报文格式也做了改进,添加了最大响应时间(Max Response Time)字段。此字段取值可以通过命令配置,用于控制成员对于查询报文的响应速度。

IGMPv2工作机制

在工作机制上,与IGMPv1相比,IGMPv2增加了查询器选举和离开组机制。

下面以图5所示,介绍IGMPv2的工作机制。组播网络中RouterA和RouterB连接主机网段,在主机网段上有HostA、HostB、HostC三个接收者。假设HostA和HostB想要接收发往组播组G1的数据,HostC想要接收发往组播组G2的数据。

图5 组播网络示意图

查询器选举机制

IGMPv2使用独立的查询器选举机制,当共享网段上存在多个组播路由器时,IP地址最小的路由器成为查询器。

图6 查询器选举示意图

如图6所示,在IGMPv2中,查询器的选举过程如下:

  1.  最初,所有运行IGMPv2的组播路由器(RouterA和RouterB)都认为自己是查询器,向本网段内的所有主机和组播路由器发送普遍组查询报文。

    RouterA和RouterB在收到对方发送的普遍组查询报文后,将报文的源IP地址与自己的接口地址作比较。通过比较,IP地址最小的组播路由器将成为查询器,其他组播路由器成为非查询器(Non-Querier)。如图6所示,RouterA的接口地址小于RouterB,则RouterA当选为查询器,RouterB为非查询器。

  2. 此后,将由IGMP查询器(RouterA)向本网段内的所有主机和其他组播路由器发送普遍组查询报文,而非查询器(RouterB)则不再发送普遍组查询报文。

    非查询器(RouterB)上都会启动一个定时器,在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。

离开组机制

图7离开组示意图

如图7所示,在IGMPv2中,主机HostA离开组播组G1的过程如下:

  1. HostA向本地网段内的所有组播路由器(目的地址为224.0.0.2)发送针对组G1的离开报文。

  2. 查询器收到离开报文,会发送针对组G1的特定组查询报文。发送间隔和发送次数可以通过命令配置,缺省情况下每隔1秒发送一次,共发送两次。同时查询器启动组成员关系定时器(Timer-Membership=发送间隔x发送次数)。

  3. 该网段内还存在组G1的其他成员(如图7所示的HostB),这些成员(HostB)在收到查询器发送的特定组查询报文后,会立即发送针对组G1的报告报文。查询器收到针对组G1的报告报文后将继续维护该组成员关系。

如果该网段内不存在组G1的其他成员,查询器将不会收到针对组G1的报告报文。在Timer-Membership超时后,查询器将删除(*,G1)对应的IGMP组表项。当有组G1的组播数据到达查询器时,查询器将不会向下游转发。

IGMPv3的变化

IGMPv3主要是为了配合SSM(Source-Specific Multicast)模型发展起来的,提供了在报文中携带组播源信息的能力。

IGMPv3报文

与IGMPv2相比,IGMPv3报文的变化如下:

  • IGMPv3报文包含两大类:查询报文和成员报告报文。IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。

  • 查询报文中不仅包含普遍组查询报文和特定组查询报文,还新增了特定源组查询报文(Group-and-Source-Specific Query)。该报文由查询器向共享网段内特定组播组成员发送,用于查询该组成员是否愿意接收特定源发送的数据。

  • 成员报告报文不仅包含主机想要加入的组播组,而且包含主机想要接收来自哪些组播源的数据。

  • 在IGMPv3中一个成员报告报文可以携带多个组播组信息,而之前的版本一个成员报告只能携带一个组播组。这样在IGMPv3中报文数量大大减少。

IGMPv3工作机制

在工作机制上,与IGMPv2相比,IGMPv3增加了主机对组播源的选择能力。

特定源组加入

IGMPv3的成员报告报文的目的地址为224.0.0.22(表示同一网段所有使能IGMPv3的路由器)。通过在报告报文中携带组记录,主机在加入组播组的同时,能够明确要求接收或不接收特定组播源发出的组播数据。如图8所示,网络中存在S1和S2两个组播源,均向组播组G发送组播数据,Host仅希望接收从组播源S1发往组播组G的信息。

图8 特定源组的组播数据流路径

如果Host和组播路由器之间运行的是IGMPv1或IGMPv2,Host加入组播组G时无法对组播源进行选择,无论其是否需要,都会同时接收到来自组播源S1和S2的数据。如果采用IGMPv3,成员主机可以选择仅接收S1组播数据。

  • 方法一:Host发送IGMPv3报告(G,INCLUDE,(S1)),仅接收源S1向组播组G发送的数据。

  • 方法二:Host发送IGMPv3报告(G,EXCLUDE,(S2)),不接收指定源S2向组播组G发送的数据,从而仅有来自S1的组播数据才能传递到Host。

特定源组查询

当接收到组成员发送的改变组播组与源列表的对应关系的报告时(比如CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE),IGMP查询器会发送特定源组查询报文。如果组成员希望接收其中任意一个源的组播数据,将反馈报告报文。IGMP查询器根据反馈的组成员报告更新该组对应的源列表。

三个版本的比较

IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组成员离开的机制,IGMPv3中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。IGMP三个版本的比较如表1所示。

表1 IGMP三个版本的比较

项目

IGMPv1

IGMPv2

IGMPv3

查询器选举方式

依靠组播路由协议PIM选举

同网段组播路由器之间竞争选举

同网段组播路由器之间竞争选举

普遍组查询报文

支持

支持

支持

成员报告报文

支持

支持

支持

特定组查询报文

不支持

支持

支持

成员离开报文

不支持

支持

没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达

特定源组查询报文

不支持

不支持

支持

指定组播源

不支持

不支持

支持

可识别报文协议版本

IGMPv1

IGMPv1、IGMPv2

IGMPv1、IGMPv2、IGMPv3

ASM模型

支持

支持

支持

SSM模型

需要IGMP SSM Mapping技术支持

需要IGMP SSM Mapping技术支持

支持

三个版本在演进过程中对协议报文的处理是向后兼容的,因此尽管各个版本的协议报文格式不同,但是运行IGMP高版本的路由器可以识别低版本的IGMP报文。当组播设备收到低版本的主机的IGMP加入报文后会自动降低组播组的兼容版本到该主机对应的版本,并工作在该版本上。

IGMP Snooping

IGMP Snooping 是一种IPv4二层组播协议,通过侦听三层组播设备和用户主机之间发送的组播协议报文来维护组播报文的出接口信息,从而管理和控制组播数据报文在数据链路层的转发。

如图9所示,当组播数据从三层组播设备Router转发下来以后,处于接入边缘的二层组播设备Switch负责将组播数据转发给用户主机,使用户收看所点播的节目。由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC表项的,因此组播报文就会在所有接口进行广播,和它在同一广播域内的组播成员和非组播成员都能收到组播报文。这样不但浪费了网络带宽,而且影响了网络信息安全。

图9 二层组播设备运行IGMP Snooping前后对比

使能IGMP Snooping功能后,Switch会侦听主机和上游三层设备之间交互的IGMP报文,通过分析报文中携带的信息(报文类型、组播组地址、接收报文的接口等),建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发。所以当Switch运行了IGMP Snooping后,组播数据不会在二层广播,而是会被Switch发送给指定的接收者。

端口角色

如图10所示,三层设备Router从组播源接收数据并向下游转发,在二层组播设备SwitchA和SwitchB上分别运行IGMP Snooping,HostA、HostB和HostC为接收者主机(即组播组成员)。

图10 IGMP Snooping相关端口

相关端口角色如下表所示:

表2 IGMP Snooping中的端口角色

端口角色

作用

路由器端口
(Router Port)

二层组播设备上朝向三层组播设备(DR或IGMP查询器)一侧的接口,二层组播设备从此接口接收组播数据报文。

成员端口
(Member Port)

又称组播组成员端口,表示二层组播设备上朝向组播组成员一侧的端口,二层组播设备往此接口发送组播数据报文。

报文处理方式

二层组播设备运行了IGMP Snooping后,收到不同的IGMP协议报文会进行不同的处理,并在此过程中建立起二层组播转发表项。

表3 IGMP Snooping对不同报文的处理方式

二层组播设备收到的报文类型

处理方式

IGMP普遍组查询报文

向VLAN内除接收接口外的其他所有接口转发,并对接收接口做如下处理:

  • 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器。

  • 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。

IGMP报告报文

向VLAN内所有路由器端口转发。从报文中解析出主机要加入的组播组地址,并对接收接口做如下处理:

  • 如果不存在该组对应的转发表项,则创建转发表项,将该接口作为动态成员端口添加到出接口列表中,并启动老化定时器。

  • 如果已存在该组对应的转发表项,但出接口列表中未包含该接口,则将该接口作为动态成员端口添加到出接口列表,并启动老化定时器。

  • 如果已存在该组所对应的转发表项,且出接口列表中已包含该动态成员端口,则重置其老化定时器。

IGMP离开报文

判断离开的组是否存在对应的转发表项,以及转发表项出接口列表是否包含报文的接收接口:

  • 如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,将其直接丢弃。

  •  如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内所有路由器端口转发。

对于IGMP离开报文的接收接口(假定为动态成员端口),二层组播设备在其老化时间内: 

  • 如果从该接口收到了主机响应IGMP特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器。

  • 如果没有从该接口收到主机响应IGMP特定组/源组查询的报告报文,则表示接口下已没有该组成员,则在老化时间超时后,将接口从该组的转发表项出接口列表中删除。

IGMP特定组查询报文/IGMP特定源组查询报文

向有特定组成员的接口转发。

当二层组播设备收到PIM Hello报文

向VLAN内除接收接口外的其他所有接口转发,并对接收接口做如下处理:

  • 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。

  • 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器。

当二层组播设备上建立了二层组播转发表项以后,二层组播设备接收到组播数据报文时,依据报文所属VLAN和报文的目的地址(即组播组地址)查找转发表项是否存在对应的“出接口信息”。如果存在,则将报文发送到相应的组播组成员端口和路由器端口;如果不存在,则丢弃该报文或将报文在VLAN内广播。

配置示例

如图11所示,网络中的不同用户群组成N1和N2两个末梢网络。PIM网络中的SwitchA连接用户网段N1,SwitchB和SwitchC连接用户网段N2。该PIM网络中传播视频信息使用的组播组地址为225.1.1.1~225.1.1.5。

N1中的HostA和N2中的HostC都希望通过组播方式接收视频信息。接收者HostA只购买了组播组225.1.1.1对应的节目,HostC则购买了所有组播组对应的节目。因此,需要在交换机上进行相关配置,使得HostA只能接收组播组225.1.1.1的视频信息,而HostC则没有限制。

图11 配置IGMP的基本功能组网图

配置思路

通过在交换机上配置IGMP的基本功能以及限制SwitchA与N1网段相连接口加入的组播组范围,可以实现此需求。

  1. 为了保证组播源的数据可以正确的转发到用户网段,需要配置网络中的单播路由协议,实现网络层互通。单播路由正常是组播路由协议正常工作的基础。

  2. 为了实现用户通过组播方式接收视频信息,需要在各交换机上配置基本组播功能,实现组播数据在网络中的转发。

  3. 为了使HostA只接收组播组225.1.1.1的视频信息,需要对HostA能接收的组播数据进行限制。可以通过在SwitchA与N1网段相连的接口上配置组播过滤策略,实现对组播数据的过滤。

操作步骤

1.配置各交换机接口的IP地址和单播路由协议。配置过程略。

2.使能IP组播路由功能

# 在SwitchA上使能IP组播路由功能,

[SwitchA] multicast routing-enable

SwitchB、SwitchC和SwitchD的配置与SwitchA类似。

3.在所有接口上使能PIM-SM功能。

# 在所有接口上使能PIM-SM功能。

[SwitchA] interface vlanif 10

[SwitchA-Vlanif10] pim sm

[SwitchA-Vlanif10] quit

[SwitchA] interface vlanif 11

[SwitchA-Vlanif11] pim sm

[SwitchA-Vlanif11] quit

SwitchB、SwitchC和SwitchD的配置与SwitchA类似。

4.配置静态RP。

# 在SwitchA上,配置SwitchD的VLANIF40为静态RP。

[SwitchA] pim

[SwitchA-pim] static-rp 192.168.4.1

[SwitchA-pim] quit

SwitchB、SwitchC和SwitchD的配置与SwitchA类似

5.在SwitchA、SwitchB、SwitchC成员端接口上使能IGMP功能。

# 在SwitchA的VLANIF10接口上使能IGMP功能。

[SwitchA] interface vlanif 10

[SwitchA-Vlanif10] igmp enable

[SwitchA-Vlanif10] quit

SwitchB和SwitchC的配置与SwitchA类似。

6.配置SwitchA的VLANIF10接口只能加入组播组225.1.1.1。

# 创建ACL,配置其规则为允许组播组225.1.1.1的报文通过

[SwitchA] acl number 2001

[SwitchA-acl-basic-2001] rule permit source 225.1.1.1 0

[SwitchA-acl-basic-2001] quit

#在SwitchA的VLANIF10接口上应用该策略。

[SwitchA] interface vlanif 10

[SwitchA-Vlanif10] igmp group-policy 2001

[SwitchA-Vlanif10] quit

7.使能IGMP Snooping功能。

# 使能全局的IGMP Snooping功能。

[Switch] igmp-snooping enable

# 使能VLAN10的IGMP Snooping功能。

[Switch] vlan 10

[Switch-vlan10] igmp-snooping enable

[Switch-vlan10] quit

SwitchB和SwitchC的配置与SwitchA类似。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐