写在前面
恩,18年做了半年的组播,算入门吧!最近有个igmp snooping(下面简称igsp)的bug,是个机缘接触一下igsp!
使用需求简述
很多情况下,组播报文要不可避免的经过一些二层交换设备,尤其是在局域网环境里。如下图:
上图中switch会将组播报文当做广播在vlan内进行flood,这是因为组播报文的目的地址为组播地址,在二层设备上学习不到这一类的MAC表项,这样不但浪费网络带宽,而且影响网络信息安全。配置igsp后,二层组播设备可以侦听和分析组播用户和上游路由器之间的IGMP报文,根据这些信息建立二层组播转发表项,控制组播数据报文的转发。
IGSP基本原理
IGSP是二层组播的基本功能,可以实现组播数据在链路层的转发和控制。当主机和上游三层设备之间传递IGMP协议报文通过二层组播设备时,IGSP分析报文携带的信息,根据这些信息建立和维护组播转发表,从而指导组播数据在数据链路层按需转发。
IGSP相关概念
如上图所示,三层设备router从组播源接收数据并向下游转发,在二层组播涉笔Switch A和Switch B上分别运行IGSP,Host A,B,C为组播成员。下面说下IGSP中的几个重要概念。
路由器端口(Router Port)
如Switch A和Switch B上蓝色圆圈表示的接口。
路由器端口指二层组播设备上 朝向 组播路由器的接口。二层组播设备从该接口接受IGMP和PIM协议报文以及组播数据报文。
由协议生成的路由器端口叫做动态路由器端口,手动配置的路由器端口叫做静态路由器端口。
收到源地址不为0.0.0.0的IGMP普遍组查询报文或PIM Hello报文的接口都被视为动态路由器端口(呃,ENOS中IGSP貌似没有处理PIM报文的地方)。成员端口(Member port)
如Switch A,B上黄色方框表示的接口。又被称为组播成员端口,表示二层组播设备上朝向组播成员一侧的端口,二层组播设备往此接口发送组播数据报文。
由协议生成的成员端口叫做动态成员端口,手动配置的成员端口叫做静态成员端口。
收到IGMP report报文的接口,二层组播设备会将其标识为动态成员端口。
路由器端口,成员端口,组播地址和vlan编号是二层组播转发表项的基本信息。
如果使用了组播vlan功能,入vlan为组播vlan,出vlan为主机所在的用户vlan。否则入vlan和出vlan均为主机所在的vlan。
哈,后面在ENOS中添加组播vlan功能,这里先了解一下了!
IGSP工作机制
这里说明IGSP对不同协议报文的处理。
IGMP普遍组查询报文
IGMP querier定期向本地网段内的所有主机与路由器(目的地址为224.0.0.1)发送IGMP普遍组查询报文,以查询该网段有哪些组播组成员。处理方式:- 向VLAN内除接收接口意外的其它所有接口转发,并对接收接口做如下处理:
- 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器
- 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器
- 向VLAN内除接收接口意外的其它所有接口转发,并对接收接口做如下处理:
IGMP成员报告报文
两种情况:- 成员收到IGMP普遍组查询报文后,回应IGMP报告报文
- 成员主动向IGMP查询器发送IGMP报告报文以声明加入该组播组
处理方式:
向vlan内所有的路由器端口转发。(注意,其它主机不会收到IGMP成员报告报文,需要在二层组播设备上使能report suppres抑制report和leave报文。)从报文中解析出主机要加入的组播组地址,并对接收接口做如下处理:- 如果不存在该组对应的转发表项,则创建转发表,将该接口作为成员端口添加到出接口列表中,并启动老化定时器。
- 如果已存在该组对应的转发表,且出接口列表中已包含该动态成员端口,则重置其老化定时器。
IGMP成员离开报文
两个阶段:- 运行IGMPv2或IGMPv3的成员发送IGMP leave报文,通知IGMP查询器自己离开某个组播组
- IGMP查询器向该组播组发送特定组查询报文
处理方式:
判断离开的组是否存在对应的转发表象,以及转发表象出接口列表是否包含报文的接收接口: - 如果不存在该组对应的转发表象,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,直接丢弃。
- 如果存在对应的转发表项并且表项包含该接口,向vlan内的所有路由器端口转发。
对于IGMP离开报文的接收接口,二层组播设备在其老化时间内:
* 如果从该接口收到了主机响应IGMP特定组查询报文的报告报文,表示接口下还有该组成员,重置老化时间。
* 如果没有收到,则在老化超时后,将接口从该组的转发表项出接口列表中删除。