在上一篇文章中,我们讲解了IP组播技术基础,然后就解决了组播技术中的三个疑问中的第一个问题。
三个疑问:
1. 组播源如何将组播数据发送到网关路由器(目的IP是多少?、目的MAC是多少?)
2. 路由器收到组播数据如何发送给相应的接收者(如何判断谁想要接收数据,谁不想要接收数据)
3. 路由器之间如何根据接受者的分布情况对组播数据进行数据的转发、复制。
本篇文章我们来解决第二个问题。
那么IGMP(Internet Group Management Protocol)因特网组管理协议,就 是TCP/IP协议族中负责IP组播成员管理的协议,它用来在接收者和与其直接相邻的组播路由器之间建立、维护组播组成员关系。
在组播通信过程中,发送者将组播数据发送到特定的组播地址。但是在接收端,我们又有两个问题需要解决:
1. 接受者如何告知直连相邻的路由器我想加入哪一个组
2. 路由器需要了解哪些组播组存在接受者
组播源不关注接收者的位置信息,但是对于连接组成员的路由器而言,其需要收集和维护组成员的信息。组播既不指定明确的接收者,也不是将数据发送给网络上的所有主机。如果主机想接收发往某一组播地址的数据,它需要加入这个组,成为该组播组的成员。
当然我们可以用手工配置的方式来解决这些问题,但是手工配置有以下缺点:
1. 实时性差(手工配置需要花费大量时间)
2. 灵活性差(新加入组、退出组都需要手动配置)
3. 工作量大、容易出错
那么有没有一种协议,能够使主机和路由器之间快速交流,并解决以上问题呢?
当然是有的,那就是:IGMP协议。IGMP协议作用于主机和组播路由器之间。
在主机侧:通过ICMP协议向路由器通告组成员关系
路由器侧:通过IGMP协议维护组成员关系
接下来我们来了解IGMP三个版本的工作机制以及差异。
如下图所示,IGMPv1协议在工作时,路由器将会周期性的(60s)向子网内所有主机发送成员关系查询信息(普遍组查询报文),此时在该网段的所有主机都会接受到此报文,收到此报文之后,各个主机都都会启动定时器(定时器随机选择0~10s的定时时间)。
假设Client A、Client C想要加入G1组,A和C定时器分别被随机到3s、9s,于是Client A首先结束计时。当定时器倒计时结束,A就会发送成员关系报告报文,表示希望加入到G1组播组。这个报文也会被网段上的其他设备接收到,当Client C接收到此报文并查看之后, 发现自身与Client A所在组相同,于是便不再发送成员关系报告报文(响应抑制机制);当Client B接收并查看了报文,发现A想要加入的组与自身不同,于是等到定时器计时结束,便发送自己的成员关系报告报文。
RTA接收到成员报告报文后,了解到本网段内存在组播组G1和G2的成员,一旦RTA收到G1和G2的组播数据,将向该网段转发。
GMPv1支持两种类型的报文:
普遍组查询报文(General Query):
路由器周期性地向224.0.0.1地址(表示同一网段内所有主机和路由器)发送通用查询报文,默认查询周期为60秒,发送周期可以通过命令配置。
成员关系报告报文(Membership Report):
用于主机加入某个组播组。
响应抑制机制:
可以减少网段上的协议流量
新成员假如,则主动申请加组。
假如有新接入主机想要加入组播组,为了快速接收组播数据,不等待路由器发送普遍组查询报文,而是立即发送想要加入组的成员报告报文。RTA收到成员报告报文后,了解到本网段内出现了组播组G3的成员。一旦有G3的组播数据到达RTA,将向该网段转发。
静默离开,不大任何招呼就走了。
如下图,当Client离开组播组时,将不会再对普遍组查询报文做出回应。假设所有Client退出组播组,Client将不再对普遍组查询报文进行响应。由于网段上不存在组播组的其他成员,RTA不会收到任何成员报告报文,则在一定时间(130秒=60*2+10,即组成员关系超时时间=IGMP普遍查询消息发送间隔 × 健壮系数 + 最大查询响应时间)(即两次发送普遍查询报文时间+10s最大定时器时间)后,删除对应的组播转发项。
多台路由器同时连接到同一接收端网络时,只需要有一台路由器进行IGMP的查询。
但是IGMPv1无查询路由器选举机制,其依赖于组播路由协议在末端网络中选举一个查询器。
由于不同的组播路由协议采用不同的选举机制,所以在IGMPv1中,同一末端网络中可能会存在多台查询器。
IGMPv2于IGMPv1工作原理非常相似,但是针对了v1的两个问题进行了改进,现如今网络中用的比较多的就是ICMPv2协议。
如图,在IGMPv2中,Client B离开组播组G2的过程如下:
Client B向本地网段内的所有组播路由器发送针对组G2的离开报文。
查询器收到离开报文,会发送针对G2的特定组查询报文,**同时启动组成员关系定时器Timer-Membership=发送间隔x发送次数(2s)。缺省每隔1秒发送一次,一共发送两次,发送间隔和发送次数可以配置。**相比于v1的130S大大缩短。
如果网段内不存在其他组G2的成员,则路由器不会收到组G2的成员报告报文。在Timer-Membership超时后,删除组播转发表项中对应的下游接口。路由器将不再向该网段转发G2的组播数据。如果网段内还有G2的其他成员,则这些成员在收到特定组查询报文后,会在最大响应时间内发送G2的成员报告报文。路由器继续向该网段转发G2的组播数据。
相对于IGMPv1,IGMPv2使用独立的查询器选举机制。
所有IGMPv2路由器在初始状态时都认为自己是查询器,向本地网段内的所有主机和路由器发送普遍组查询报文。其他路由器在收到该报文后,将报文的源IP地址与自己的接口地址作比较。IP地址最小的路由器将成为查询器,其他路由器成为非查询器。
所有非查询器上都会启动一个定时器。如果在该定时器超时前收到了来自查询器的查询报文,则重置该定时器;否则就认为原查询器失效并发起新的查询器选举。
注意:
工作 | 查询器 | 非查询器 |
---|---|---|
发送查普遍查询报文 | 是 | 否 |
处理成员关系报告报文 | 是 | 是 |
发送特定查询报文 | 是 | 否 |
处理离开报文 | 是 | 否 |
版本:包含IGMP版本标识,因此设置为1。
类型:普遍组查询 (0x11),成员关系报告 (0x12)。(两种报文)
组地址:普遍组查询报文中,组地址为0(0.0.0.0);成员关系报告报文中,组地址为成员想要加入的组播组的地址。
IGMPv2报文:IGMPv2报文与IGMPv1报文略有不同,它取消了版本字段,增加了最大响应时间字段。
类型:相比于IGMPv1,IGMPv2新增了两种报文:
特定组查询报文(0x11):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员。
成员离开报文(0x17):成员离开组播组时主动向路由器发送的报文,用于宣告自己离开了某个组播组。
最大响应时间:表示主机响应查询返回报告的最大时间。
对于普遍组查询,最大响应时间默认为10秒。
对于特定组查询,最大响应时间默认为1秒。
组地址:
普遍组查询报文中,组地址设置为0。
特定组查询报文中,组地址为需要查询的组地址。
在成员报告或离开组的消息中,组地址为需要报告或离开的组地址。
SSM模型
在使用IGMPv1、IGMPv2协议的客户端无法对组播源进行选择,无论其是否需要,都会同时收到组播源Source A和B的数据。
为了满足SSM模型的新需求,IGMPv3出现了。
IGMPv3报文包含两大类:查询报文和成员报告报文。IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。
查询报文中不仅包含普遍组查询报文和特定组查询报文,还新增了特定源组查询报文(Group-and-Source-Specific Query)。该报文由查询器向共享网段内特定组播组成员发送,用于查询该组成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
成员报告报文不仅包含主机想要加入的组播组,而且包含主机想要接收来自哪些组播源的数据。
IGMPv3增加了针对组播源的过滤模式(INCLUDE/EXCLUDE):
将组播组与源列表之间的对应关系简单的表示为(G,INCLUDE,(S1、S2…)),表示只接收来自指定组播源S1、S2……发往组G的数据;
或(G,EXCLUDE,(S1、S2…)),表示接收除了组播源S1、S2……之外的组播源发给组G的数据。当组播组与组播源列表的对应关系发生了变化,
IGMPv3报告报文会将该关系变化存放于组记录(Group Record)字段,发送给IGMP查询器。
p在IGMPv3中一个成员报告报文可以携带多个组播组信息,而之前的版本一个成员报告只能携带一个组播组。这样虽然现在每个主机都需要发送报文(抑制机制被取消,因为主机之间虽然可能是同一组,但是需求可能不同),但是在IGMPv3中报文数量还是大大减少。
机制 | IGMPv1 | IGMPv2 | IGMPv3 |
---|---|---|---|
查询器选举 | 依靠其他协议 | 自己选举 | 自己选举 |
成员离开方式 | 静默离开 | 主动发送离开报文 | 主动发送离开报文 |
特定组查询 | 不支持 | 支持 | 支持 |
指定源、组 | 不支持 | 不支持 | 支持 |
主机加入组播组需要向上游设备发送IGMP成员报告,这样上游设备才可以将组播报文发送给主机。由于IGMP报文是封装在IP报文内,属于三层协议报文,而二层设备不处理报文的三层信息,所以主机加组的过程二层设备并不知道,而且通过对数据链路层数据帧的源MAC地址的学习也学不到组播MAC地址(数据帧的源MAC地址不会是组播MAC地址)。
这样当二层设备在接收到一个目的MAC地址为组播MAC地址的数据帧时,在MAC地址表中就不会找到对应的表项。那么这时候,它就会采用广播方式发送组播报文,这样不是该组播成员课也会接收到该组播数据。
造成问题:
1. 网络资源浪费
2. 存在安全隐患
IGMP Snooping配置在我们的交换机上。
IGMP Snooping可以实现组播数据帧在数据链路层的转发和控制。
使能IGMP Snooping功能后,二层设备会侦听主机和路由器之间交互的IGMP报文。通过分析报文中携带的信息(报文类型、组播组地址、接收报文的接口等),建立和维护二层组播转发表,从而指导组播数据帧在数据链路层按需转发。
IGMP Snooping建立和维护二层组播转发表的过程:
IGMP配置主要在路由器端,接收端主机只需下载相关组播软件即可。
路由器配置:
[AR1]multicast routing-enable //开启组播
[AR1]int g0/0/0
[AR1-GigabitEthernet0/0/0]ip ad 192.168.1.254 24 //配置网关地址
[AR1-GigabitEthernet0/0/0]igmp enable //开启IGMP协议
[AR1-GigabitEthernet0/0/0]igmp version 2 //选择版本2
查询:
AR1]dis igmp interface //查询接口IGMP信息
Interface information of VPN-Instance: public net
GigabitEthernet0/0/0(192.168.1.254):
IGMP is enabled //IMGP开启
Current IGMP version is 2 //版本2
IGMP state: up //状态开启
IGMP group policy: none //没有组(因为这里只是单纯配置IGMP,整体组播配置在IP组播系列最后一文)
IGMP limit: -
Value of query interval for IGMP (negotiated): -
Value of query interval for IGMP (configured): 60 s //查询间隔值(普遍组查询报文发送周期)
Value of other querier timeout for IGMP: 0 s //其他查询器超时值
Value of maximum query response time for IGMP: 10 s //最大相应时间10s
Querier for IGMP: 192.168.1.254 (this router) //谁是查询器(本路由器)
同样我们还可以通过命令[AR1]dis igmp group
查询组信息。