Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解

IGMP Snooping配置在二层组播设备上,通过对上游三层设备和下游用户之间的IGMP报文进行分析,建立和维护二层组播转发表,实现组播数据报文在数据链路层的按需分发。

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

在很多情况下,组播报文要不可避免地经过一些二层交换设备,尤其是在局域网环境里。

Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解_第1张图片


图1 IGMP Snooping组网图

如上图1所示,在组播用户和三层组播设备Router之间,组播报文要经过二层交换机Switch。

当Router将组播报文转发至Switch以后,Switch负责将组播报文转发给组播用户。由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC表项的,因此组播报文就会在所有接口进行广播,和它在同一广播域内的组播成员和非组播成员都能收到组播报文。

这样不但浪费了网络带宽,而且影响了网络信息安全。

配置IGMP Snooping后,二层组播设备可以侦听和分析组播用户和上游路由器之间的IGMP报文,根据这些信息建立二层组播转发表项,控制组播数据报文转发。

这样就防止了组播数据在二层网络中的广播。

    1、IGMP Snooping基本原理

IGMP Snooping是二层组播的基本功能,可以实现组播数据在数据链路层的转发和控制。当主机和上游三层设备之间传递的IGMP协议报文通过二层组播设备时,IGMP Snooping分析报文携带的信息,根据这些信息建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发。

Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解_第2张图片

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

如上图1所示,当组播数据从三层组播设备Router转发下来以后,处于接入边缘的二层组播设备Switch负责将组播数据转发给用户主机,使用户收看所点播的节目。

当Switch没有运行IGMP Snooping时,组播数据在二层被广播;当Switch运行了IGMP Snooping后,组播数据不会在二层广播,而是会被Switch发送给指定的接收者。

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

 

    2、IGMP Snooping基本概念

Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解_第3张图片

图2 IGMP Snooping相关端口

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

结合上图2,介绍IGMP Snooping中相关端口的概念。

2.1、路由器端口(Router Port)

如SwitchA和SwitchB上蓝色圆圈表示的接口。

路由器端口都是指二层组播设备上朝向组播路由器的接口,而不是指路由器上的接口。        

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

由协议生成的路由器端口叫做动态路由器端口。

收到源地址不为0.0.0.0的IGMP普遍组查询报文或PIM Hello报文(三层组播设备的PIM接口向外发送的用于发现并维持邻居关系的报文)的接口都将被视为动态路由器端口。

手工配置的路由器端口叫做静态路由器端口。


2.2、成员端口(Member Port)

如SwitchA和SwitchB上黄色方框表示的接口。       

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

由协议生成的成员端口叫做动态成员端口。收到IGMP Report报文的接口,二层组播设备会将其标识为动态成员端口。

手工配置的成员端口叫做静态成员端口。

路由器端口和成员端口,是二层组播转发表项中的一个重要信息:出接口。其中路由器端口相当于上游接口,成员端口相当于下游接口。通过协议报文学习到的端口,对应的为动态表项;而手工配置的端口,对应的为静态表项。

除了出接口外,每条表项还包括组播组地址和VLAN编号。

组播组地址,可以为组播IP地址,也可以为组播IP地址映射后的组播MAC地址。按照IP地址转发的模式可以避免MAC地址转发模式中的地址重复问题。

VLAN编号,指定了二层广播域范围。如果使用了组播VLAN功能,入VLAN编号为组播VLAN的编号,出VLAN编号为主机所在的用户VLAN编号。否则入VLAN编号和出VLAN编号均为主机所在VLAN的编号。

 3、IGMP Snooping工作机制

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

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

3.1、IGMP普遍组查询报文

IGMP查询器定期向本地网段内的所有主机与路由器(目的地址为224.0.0.1)发送IGMP普遍组查询报文,以查询该网段有哪些组播组的成员。

处理方式:

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

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

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

收到IGMP普遍组查询报文时,动态路由器端口的老化定时器缺省为180秒,可以通过命令行配置。

 

3.2、IGMP成员报告报文

有两种情况:

成员收到IGMP普遍组查询报文后,回应IGMP报告报文。

成员主动向IGMP查询器发送IGMP报告报文以声明加入该组播组。

处理方式:

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

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

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

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

收到IGMP报告报文后,动态成员端口的老化定时器 = 健壮系数 x 普遍组查询间隔 + 最大响应时间。

 

3.3、IGMP成员离开报文

有两个阶段:

运行IGMPv2或IGMPv3的成员发送IGMP离开报文,以通知IGMP查询器自己离开了某个组播组。

IGMP查询器收到IGMP离开报文后,从中解析出组播组地址,并通过接收接口向该组播组发送IGMP特定组查询报文/IGMP特定源组查询报文。

处理方式:

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

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

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

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

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

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

收到IGMP离开报文后,动态成员端口的老化定时器 = 健壮系数 x 特定组查询间隔。

 

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

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

此外,当二层组播设备收到PIM Hello报文时,向VLAN内除接收接口外的其他所有接口转发,并对接收接口做如下处理:

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

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

收到PIM Hello报文时,动态路由器端口的老化时间为Hello报文中Holdtime字段的值。

如果配置了静态路由器端口,二层组播设备收到IGMP报告和离开报文也会向静态路由器端口转发。如果配置了静态成员端口,则转发表项中会添加该接口为出接口。

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


       4、IGMP Snooping SSM Mapping

SSM(Source-Specific Multicast)称为指定源组播,SSM相比ASM(Any-Source Multicast,任意源组播)组播技术,可节省组播地址并有更好的安全性,但只有IGMPv3支持SSM。

如果成员主机上运行IGMPv3,可以在成员报告报文中直接指定组播源地址。但是某些情况下,用户主机只能运行IGMPv1或IGMPv2,为了使其也能够使用SSM服务,组播设备需要提供IGMP Snooping SSM Mapping功能。

IGMP Snooping SSM Mapping就是IPv4组播网络中的二层SSM Mapping。

IGMP Snooping SSM Mapping通过在二层设备上静态配置SSM地址的映射规则,将IGMPv1和IGMPv2报告报文中的(*,G)信息转化为对应的(S,G)信息,以提供SSM组播服务。

S表示组播源,G表示组播组,*表示任意组播源。缺省情况下,SSM组地址范围为232.0.0.0~232.255.255.255。可以通过配置SSM组策略,改变SSM组地址范围。

Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解_第4张图片

图1 IGMP Snooping SSM Mapping组网图

如上图1所示,三个接收者运行不同版本的IGMP,HostB和HostC无法升级到IGMPv3,如果要为该网段中的所有主机提供SSM服务,可以在二层设备Switch上使用IGMP Snooping SSM Mapping功能。

假如在Switch上配置如下映射关系。

组播组地址

映射的组播源地址

232.1.1.0/24

10.10.1.1

232.1.2.0/24

10.10.2.2

232.1.3.0/24

10.10.3.3

在经过映射后,Switch收到HostB和HostC的成员报告报文时,首先判断报文携带的组地址是否在SSM范围内,发现在SSM范围内,则根据配置的映射规则生成如下所示的组播表项。

IGMPv1/IGMPv2报告报文中的组地址

生成的组播表项

232.1.1.1 (来自HostC)

(10.10.1.1,232.1.1.1)

232.1.2.2 (来自HostB)

(10.10.2.2,232.1.2.2)

如果报告报文携带的组地址在SSM范围内,但是Switch上没有对应的SSM Mapping规则,则无法提供SSM服务,丢弃该报文。

如果报告报文携带的组地址不在SSM范围内,则只提供ASM服务。

在实际组网中如果存在上游IGMP查询器,则二层SSM Mapping功能需要与IGMP查询器的三层SSM Mapping功能配合使用(配置相应的映射规则),才能实现组播数据的正常转发。

 

    5、IGMP Snooping Proxy

为了减少用户主机所在网段内的IGMP协议报文数量,可以在二层设备上部署IGMP Snooping Proxy功能,使其能够代理上游三层设备向下游主机发送IGMP查询报文,同时代理下游主机来向上游三层设备发送成员关系报告报文。

配置了IGMP Snooping Proxy功能的设备称为IGMP Snooping代理,在其上游设备看来,它就相当于一台主机;在其下游设备看来,它相当于一台查询器。

Linux 网络协议栈开发基础篇(十一)—— 组播IGMP Snooping理论知识详解_第5张图片

图1 IGMP Snooping Proxy组网图

如上图1所示,当Switch上运行IGMP Snooping时,Switch对上游Router的查询报文和下游主机的报告/离开报文都是原封不动地转发。当网络中存在大量用户主机时,冗余的IGMP报文给上游设备带来处理压力。

当Switch上配置IGMP Snooping Proxy时,Switch可以终结上游的IGMP查询报文,并且自己构造查询报文向下游主机发送;终结下游主机的IGMP报告/离开报文,并自己构造统一的报告/离开报文向上游发送。

部署IGMP Snooping Proxy后,三层设备会感知到下面只有一个用户,二层设备直接跟下游用户和三层设备进行对话,而不再是一个完全透明的转发角色。

IGMP Snooping Proxy有效减少IGMP协议在网络中的交互程度,节约带宽;有效屏蔽来自下游主机的大量协议报文,并接管了对主机的查询器功能,分担上游三层设备的性能负荷。

运行IGMP Snooping Proxy的设备会参与二层组播转发表的建立和维护,依据转发表向有需要的用户主机发送组播数据。

IGMP Snooping代理设备对IGMP报文的处理方式如下:

1、IGMP普遍组查询报文

向本VLAN内除接收接口以外的所有接口发送IGMP普遍组查询报文;同时根据本地维护的组成员关系生成报告报文,向所有路由器端口发送。

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

若该组对应的转发表项中还有成员端口,则向所有路由器端口回复该组的报告报文。

3、IGMP报告报文

若不存在该组对应的转发表项,则创建转发表项,将接收接口作为动态成员端口添加到出接口列表中,并启动其老化定时器,然后向所有路由器端口发送该组的报告报文;

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

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

4、IGMP离开报文

向接收接口发送针对该组的特定组查询报文。只有当删除某组播组对应转发表项中的最后一个成员端口时,才会向所有路由器端口发送该组的离开报文。

 

在交换机上部署IGMP Snooping功能时需注意:

IGMP Snooping作为一个二层组播特性,本章中涉及到接口的配置,都是在二层物理接口(包括Eth-Trunk接口)下进行配置。

交换机支持在WLAN-ESS接口配置IGMP Snooping成员端口动态学习功能。

交换机配置了IGMP Snooping功能后,如果收到的IGMPv1或IGMPv2 Report为SSM组地址(默认地址范围为232.0.0.0/8)的请求,不会生成二层组播转发表项。

在环网中配置了IGMP Snooping功能时,如果需要将某设备的下行口配置为静态路由器端口,则需要将环网中所有设备的下行口都配置为静态路由器端口,否则在二层网络拓扑发生变化时会导致组播流量不能正常转发。建议不要将设备的下行口配置为静态路由器端口。

你可能感兴趣的:(Linux网络协议栈开发)