HCNP Routing&Switching之组播技术-IGMP-Snooping
前文我们了解了组播协议IGMP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15700550.html;今天我们来聊一聊二层交换机处理组播报文所面临的问题,以及IGMP-Snooping相关话题;
我们知道二层交换机在单播通信中的工作原理就是根据构建mac地址表来转发数据,如果二层交换机收到一个未知的单播或广播报文,那么它会泛洪出去;对于组播信息它会如何处理呢?其实二层交换机收到组播报文,默认情况下,它会把组播报文当作广播处理,即 收到组播报文,它会泛洪出去;这样一来对于接入同一二层交换机的组播客户端,在没有加入对应组播组的情况下也会照常收到组播源发送的组播报文;很显然,这无形是对那些不需要接收对应组播报文的客户端的带宽造成浪费,拥堵;为了解决这样的问题;igmp-snooping出现了;igmp-snooping的主要作用是嗅探组播信息,从而根据组播信息建立起组播mac地址表,从而实现隔离那些未加入对应组播组的客户端流量;简单讲就是,有了igmp snooping,在同一二层交换机收到对应组播报文,它不会全局泛洪,而是根据对应的组播mac表来转发数据,从而规避了全局泛洪所带来的困扰;如下如所示
提示:如上图所示,在客户端B加入G2组,在对于非g2组的客户端A和C来说,它们也能正常收到G2组播源发送的组播信息(原因是二层交换机把组播报文当作广播处理了);这就是二层组播数据转发时,说面临的问题;它会造成网络资源的浪费,以及一些安全隐患的存在;
IGMP Snooping工作原理
提示:首先在二层交换机上运行igmp snooping ;在路由器发送查询给交换机,对应交换机会收到查询,此时二层交换机会在内核建立一个组播mac表,把对应收到查询把文接口和对应组播mac地址做关联;然后把查询泛洪出去;对应组播接收者收到路由器的查询,然后把报告报文发送给交换机,此时交换机会把接受报告的端口和对应组播mac做关联;这样一来就建立起组播mac地址表项;后续二层交换机就根据这个组播mac表项来转发数据;
提示:我们把收到查询报文的接口叫做路由器端口(上游接口);把收到报告的接口叫做成员端口(下游接口);对于路由端口和成员端口的生成有两种方式,第一种就是动态生成,即通过igmp的普遍查询或pim 的hello包动态生成路由接口;通过收到IGMP report报文的接口自动生成成员端口;这种方式是动态生成路由接口或成员接口;第二种方式就是手动配置路由接口或成员接口,这种方式成为静态路由端口或成员端口;路由端口主要作用是接受组播数据的上游接口,而成员端口主要作用是发送组播数据给下游接口;
提示:igmp snooping的工作原理总结为路由器发送查询,组播成员发送报告,从而交换机构建起组播mac表项;从而实现规避二层交换机收到组播报文泛洪;
提示:路由器周期性发送普遍查询报文,该报文会被交换机收到,此时交换机会泛洪该报文,从而交换机上的所有的端口都会收到查询报文,此时交换机就会建立起一张二层组播转发表,该表的内容是对应组播mac和对应的端口;并把1口标记为路由接口(收到查询报文);如果clientB 希望加入组播组,此时clientB会发送一条IGMP成员报告,对应报告中就会有目的mac地址,交换机从3口收到对应报告以后,通过igmp snooping处理以后,它会把3口加入到对应组播mac对应的端口里,并把3口标记为成员端口(收到报告的端口);同样的道理clientc加入对应组播组,它也会发送一条主动报告给交换机,交换机收到对应报告以后,它会把4口加入到对应组播组对应的端口里;这样一来就形成了一个二层组播转发表;所以对于启用IGMP snooping的交换机来说,有了这个表项,对应组播组的数据就会现在只对应的端口上首发,而不会发送给其他端口;
IGMP和IGMP-Snooping配置
实验拓扑如下
分析:首先我们需要配置好个设备的ip地址和组播地址,然后在路由器上配置上pim;这里需要说明一点,所有组播都是基于单播实现的,所以我们需要先把单播搞通,然后再配置组播igmp和igmp-snooping;这个实验在ensp模拟器上二层交换机开启igmp-snooping时会有bug,导致组播客户端发送的报告路由器收不到,路由器发送的查询,组播客户端收不到,所以路由器面向二层交换机的接口会认为没有客户端(因为查询发出去没有人报告给它);所以我们还需要在路由器面向交换机的接口配置静态组播组信息;
配置客户端地址
验证pc1和pc2互通
提示:可以看到pc1和pc2是可以正常通信的;
配置路由器各接口ip地址
sys sys r1 int g0/0/0 ip add 1.0.0.100 24 int g0/0/1 ip add 2.0.0.100 24
验证路由器各接口是否正常up
配置组播源服务器ip地址
配置组播源
验证:客户端到组播源服务器的单播是否能够正常通讯?
ok,到此该实验的单播网络已经搞通,接下来是在路由器上配置igmp 和pim
在路由器上全局开启组播路由功能
提示:只有在组播路由器上开启了组播路由功能以后,后续的igmp和pim才能够正常开启;
在路由器面向二层交换机接口开启pim以及igmp
在路由器面向组播源接口开启pim以及igmp
验证路由器组播组信息
提示:如果pc客户端不加入对应组播组在路由器上是看不到对应组播组信息的;此时如果不考虑igmp-snooping 那么组播源的数据就能正常发送给组播客户端;
验证:在pc1所在链路上抓包
提示:可以看到组播源发送数据,对应pc1所在链路也会收到数据;但二层交换机它对于组播的处理和处理广播的方式一样都是泛洪,所以pc2即使没有加入组播组,对应链路上也会收到组播数据;
在二层交换机上开启igmp-snooping
提示:在交换机上开启了igmp-snooping以后,由于模拟器bug原因会导致路由器发送到查询客户端收不到,当然客户端也无法正常报告给路由器,所以时间一旦超时,在路由器上的组播组信息就会被删除,即路由器不会向交换机转发组播数据;
在路由器上面向交换机的接口上添加静态组播组信息
提示:可以看到之前路由器上的组播组信息已被删除,原因是在交换机上开启igmp-snooping以后隔断了路由器和客户端查询和报告;手动在路由器上面向交换机的接口下配置静态组播组信息是让组播数据一直会从对应接口发送出去;
在交换机上查看路由接口
提示:可以看到交换机通过igmp-snooping已经分析出eth0/0/1口是路由器接口;这个和我们的拓扑很吻合;
在交换机上查看成员接口
提示:现在提示我们没有成员接口;原因是交换机没有收到报告,所以它认为没有成员;
在pc1上点击加入对应组播组,看看对应成员接口是否在交换机上看到?
提示:可以看到交换机收到pc1发送的报告以后,对应就把连接pc1端口加入到对应组播组的成员端口中;正常情况下此时组播数据只会向pc1所在端口转发,但是由于bug的原因,此时数据还是会泛洪;即pc2所在端口虽然没有加入组播组,但还是可以收到组播数据;这个是模拟器bug;到此igmp-snooping的配置就完成了;