IGMP Snooping简介
IGMP Snooping (Internet Group Management Protocol
Snooping)是一种IPv4二层组播协议,通过侦听三层组播设备和用户主机之间发送的组播协议报文来维护组播报文的出接口信息,从而管理和控制组播数据报文在数据链路层的转发。
目的:
在很多情况下,组播报文要不可避免地经过一些二层交换设备,尤其是在局域网环境里。
由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC表项的,因此组播报文就会在所有接口进行广播,和它在同一广播域内的组播成员和非组播成员都能收到组播报文。这样不但浪费了网络带宽,而且影响了网络信息安全。
IGMP Snooping有效地解决了这个问题。配置IGMP Snooping后,二层组播设备可以侦听和分析组播用户和上游路由器之间的IGMP报文,根据这些信息建立二层组播转发表项,控制组播数据报文转发。这样就防止了组播数据在二层网络中的广播。
IGMP Snooping原理描述
基本原理:
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报告报文后,动态成员端口的老化定时器 = 健壮系数 x 普遍组查询间隔 + 最大响应时间。
当收到IGMP离开报文时:
IGMP工作阶段:
成员离开组播组
有两个阶段:运行IGMPv2或IGMPv3的成员发送IGMP离开报文,以通知IGMP查询器自己离开了某个组播组。
IGMP查询器收到IGMP离开报文后,从中解析出组播组地址,并通过接收接口向该组播组发送IGMP特定组查询报文/IGMP特定源组查询报文。
处理方式:
- 判断离开的组是否存在对应的转发表项,以及转发表项出接口列表是否包含报文的接收接口:
如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,将其直接丢弃。
如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内所有路由器端口转发。
对于IGMP离开报文的接收接口(假定为动态成员端口),二层组播设备在其老化时间内:如果从该接口收到了主机响应IGMP特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器。
如果没有从该接口收到主机响应IGMP特定组/源组查询的报告报文,则表示接口下已没有该组成员,则在老化时间超时后,将接口从该组的转发表项出接口列表中删除。
此外,当二层组播设备收到PIM Hello报文时,向VLAN内除接收接口外的其他所有接口转发,并对接收接口做如下处理:
- 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。
- 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器。
如果配置了静态路由器端口,二层组播设备收到IGMP报告和离开报文也会向静态路由器端口转发。如果配置了静态成员端口,则转发表项中会添加该接口为出接口。
当二层组播设备上建立了二层组播转发表项以后,二层组播设备接收到组播数据报文时,依据报文所属VLAN和报文的目的地址(即组播组地址)查找转发表项是否存在对应的“出接口信息”。如果存在,则将报文发送到相应的组播组成员端口和路由器端口;如果不存在,则丢弃该报文或将报文在VLAN内广播。
IGMP Snooping配置命令
1 | igmp-snooping enable |
参考资料:华为HedEx文档