litemao-IGMP Snooping
IGMP Snooping简介
一、概述
IGMP Snooping(Internet Group Management Protocol Snooping),即互联网组管理协议侦听,是一种针对IPv4的二层组播协议。它通过监听三层组播设备与用户主机之间交互的组播协议报文,来维护组播报文的出接口信息,进而管理和控制组播数据报文在数据链路层的转发过程。
二、目的
在众多网络场景中,尤其是局域网环境,组播报文往往需要经过二层交换设备。然而,由于组播报文的目的地址是组播组地址,二层设备无法学习到此类MAC表项,导致组播报文会在所有接口进行广播。这不仅造成了网络带宽的浪费,还可能引发网络信息安全问题,因为同一广播域内的组播成员和非组播成员都能接收到组播报文。IGMP Snooping的出现,有效解决了这一问题。一旦配置了IGMP Snooping,二层组播设备就能监听并分析组播用户与上游路由器之间的IGMP报文,据此建立二层组播转发表项,从而精准控制组播数据报文的转发,避免了组播数据在二层网络中的无谓广播。
三、原理描述
(一)基本原理
IGMP Snooping是二层组播的核心功能之一,它能够实现组播数据在数据链路层的转发与控制。当主机与上游三层设备之间传递的IGMP协议报文经过二层组播设备时,IGMP Snooping会对报文携带的信息进行分析,并根据这些信息构建和维护二层组播转发表,以此指导组播数据在数据链路层按需转发。
例如,当组播数据从三层组播设备Router转发下来后,处于接入边缘的二层组播设备Switch负责将这些组播数据转发给用户主机,让用户能够收看所点播的节目。如果Switch没有启用IGMP Snooping,那么组播数据就会在二层被广播;而当Switch启用IGMP Snooping后,组播数据就不会在二层广播,而是会被Switch精准地发送给指定的接收者。
启用IGMP Snooping功能后,Switch会持续监听主机和上游三层设备之间交互的IGMP报文,通过分析报文中的信息(如报文类型、组播组地址、接收报文的接口等),建立和维护二层组播转发表,从而确保组播数据在数据链路层能够按需转发。
(二)基本概念
以一个典型的网络场景为例,三层设备Router从组播源接收数据并向下游转发,在二层组播设备SwitchA和SwitchB上分别运行IGMP Snooping,HostA、HostB和HostC为接收者主机(即组播组成员)。
在IGMP Snooping中,存在以下几种端口角色及其作用和生成方式:
- 路由器端口(Router Port):如SwitchA和SwitchB上蓝色圆圈表示的接口。它是二层组播设备上朝向三层组播设备(DR或IGMP查询器)一侧的接口,二层组播设备通过此接口接收组播数据报文。由协议生成的路由器端口被称为动态路由器端口。当接口收到源地址不为0.0.0.0的IGMP普遍组查询报文或PIM Hello报文(三层组播设备的PIM接口向外发送的用于发现并维持邻居关系的报文)时,该接口就会被视为动态路由器端口。而手工配置的路由器端口则被称为静态路由器端口。
- 成员端口(Member Port):如SwitchA和SwitchB上黄色方框表示的接口。它也被称为组播组成员端口,表示二层组播设备上朝向组播组成员一侧的端口,二层组播设备会向此接口发送组播数据报文。由协议生成的成员端口被称为动态成员端口。当接口收到IGMP Report报文时,二层组播设备会将其标识为动态成员端口。同样地,手工配置的成员端口则被称为静态成员端口。
路由器端口和成员端口在二层组播转发表项中扮演着重要角色,它们是出接口的关键信息。其中,路由器端口相当于上游接口,成员端口相当于下游接口。通过协议报文学习到的端口对应的为动态表项;而手工配置的端口对应的为静态表项。除了出接口外,每条表项还包含组播组地址和VLAN编号等信息。
(三)工作机制
当二层组播设备启用了IGMP Snooping后,它会根据收到的不同IGMP协议报文进行相应的处理,并在此过程中建立起二层组播转发表项。
- 收到IGMP普遍组查询报文时:
- IGMP工作阶段:IGMP查询器会定期向本地网段内的所有主机与路由器(目的地址为224.0.0.1)发送IGMP普遍组查询报文,目的是查询该网段中有哪些组播组的成员。
- 处理方式:二层组播设备会将该查询报文向VLAN内除接收接口外的其他所有接口转发,并对接收接口进行以下操作:如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器;如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。通常情况下,收到IGMP普遍组查询报文时,动态路由器端口的老化定时器缺省值为180秒,但可以通过命令行进行配置。
- 收到IGMP报告报文时:
- IGMP工作阶段:存在两种情况,一是成员收到IGMP普遍组查询报文后,会回应IGMP报告报文;二是成员主动向IGMP查询器发送IGMP报告报文,以此声明自己加入该组播组。
- 处理方式:二层组播设备会将该报告报文向VLAN内所有路由器端口转发。同时,从报文中解析出主机要加入的组播组地址,并对接收接口进行以下操作:如果不存在该组对应的转发表项,则创建转发表项,将该接口作为动态成员端口添加到出接口列表中,并启动老化定时器;如果已存在该组对应的转发表项,但出接口列表中未包含该接口,则将该接口作为动态成员端口添加到出接口列表,并启动老化定时器;如果已存在该组对应的转发表项,且出接口列表中已包含该动态成员端口,则重置其老化定时器。收到IGMP报告报文后,动态成员端口的老化定时器计算公式为:健壮系数×普遍组查询间隔+最大响应时间。
- 收到IGMP离开报文时:
- IGMP工作阶段:分为两个阶段,一是运行IGMPv2或IGMPv3的成员发送IGMP离开报文,以通知IGMP查询器自己离开了某个组播组;二是IGMP查询器收到IGMP离开报文后,从中解析出组播组地址,并通过接收接口向该组播组发送IGMP特定组查询报文/IGMP特定源组查询报文。
- 处理方式:二层组播设备首先会判断离开的组是否存在对应的转发表项,以及转发表项出接口列表是否包含报文的接收接口。如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,而是将其直接丢弃;如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内所有路由器端口转发。对于IGMP离开报文的接收接口(假定为动态成员端口),二层组播设备在其老化时间内,如果从该接口收到了主机响应IGMP特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器;如果没有从该接口收到主机响应IGMP特定组/源组查询的报告报文,则表示接口下已没有该组成员,在老化时间超时后,将接口从该组的转发表项出接口列表中删除。
- 收到PIM Hello报文时:二层组播设备会将该报文向VLAN内除接收接口外的其他所有接口转发,并对接收接口进行以下处理:如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器;如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器。此外,如果配置了静态路由器端口,二层组播设备收到IGMP报告和离开报文也会向静态路由器端口转发;如果配置了静态成员端口,则转发表项中会添加该接口为出接口。
当二层组播设备成功建立了二层组播转发表项后,每当它接收到组播数据报文时,就会依据报文所属的VLAN以及报文的目的地址(即组播组地址)来查找转发表项,查看是否存在对应的“出接口信息”。如果存在,就将报文发送到相应的组播组成员端口和路由器端口;如果不存在,则丢弃该报文或将报文在VLAN内广播。