前言
我们前面学习了IP组播的基础,其中谈到组播的框架,其中有组播数据的生成,组播数据的传输,组播数据的接收,这章内容我们来学习组播数据时如何被接收的,即路由器如何确认下属网络中有组播组成员。这就需要我们的IGMP协议了, IGMP(Internet Group Management Protocol)因特网组管理协议,是TCP/IP协议族中负责IP组播成员管理的协议,它用来在接收者和与其直接相邻的组播路由器之间建立、维护组播组成员关系。
IGMP的工作原理
如上所示,组播数据传到用户侧路由器时会由用户侧路由器来进行查询组播组成员,我们将该路由器称为查询器,当一个网络中有多个用户侧路由器时我们会从中选取连接用户侧接口IP地址最小的路由器作为查询器,其他的路由器作为非查询器。查询器用来发送IGMP查询报文,而非查询器只能接受处理IGMP加入报文,不处理IGMP离开报文。
在IGMP中报文分为了如下三种
IGMP查询报文(IGMP Query) | 当路由器了解与该接口连接的网段上存在哪些组播组的接收者时,向主机发送的报文称之为IGMP Query报文。只有查询器负责发送IGMP Query报文。 |
---|---|
IGMP加入报文(IGMP Report) | 当主机想要加入组播组时,向上游发送的报文称之为IGMP Report报文。 |
IGMP离开报文(IGMP Leave) | 当主机想要离开组播组时,向上游发送的报文称之为IGMP Leave报文。 |
其中IGMP查询报文又分为三种
普遍组查询 | 不针对指定的组播源和组播组。 |
---|---|
特定组查询 | 针对指定的组播组。 |
特定源组查询 | 针对指定的组播源和组播组。 |
IGMP的版本
到目前为止,IGMP有三个版本,如下表所示:
IGMP版本 | 支持的模型 |
---|---|
IGMPv1 | ASM(Any-Source Multicast)、需要通过SSM-Mapping技术来支持SSM(Source-Specific Multicast)。 |
IGMPv2 | ASM、需要通过SSM-Mapping技术来支持SSM。 |
IGMPv3 | ASM、SSM。 |
其中IGMPv2和IGMPv3支持IGMP离开报文,IGMPv1不支持。协议规定IGMPv1不支持查询器选举,IGMPv1查询器由上层协议(如PIM)指定。当前仅支持同网段上同版本的组播设备之间进行查询器选举。为了保证正常工作,需要在同网段所有组播设备上配置相同版本的IGMP。
IGMPv1的工作机制
IGMPv1报文
版本 | 包含IGMP版本标识,因此设置为1。 |
---|---|
类型 | 普遍组查询 (0x11),成员关系报告 (0x12)。 |
组地址 | 普遍组查询报文中,组地址为0;成员关系报告报文中,组地址为成员想要加入的组播组的地址。 |
IGMPv1普遍组查询与响应
IGMPv1的工作机制如上图所示,IGMPv1只支持普遍组查询,RTA周期性向224.0.0.1地址(表示同一网段内的所有主机和路由器)发送IGMP查询报文,默认时间为60s一次,主机A和C想要加入G1组,主机B想加入G2组,因此所有主机都在收到IGMP查询报文时都会在本地启动一个随机定时器,范围为0-10s,假定主机A最快,主机A定时器归零后会像该网段发送IGMP加入报文,期望加入G1组,主机C收到后停止计时器,主机B在定时器归零后向网段发送IGMP加入报文,期望加入G2组。RTA在收到IGMP加入报文后,将组信息记录,后续收到该组播源发来的数据就转发进网段中。网段中如果有相同组的成员,其中一个成员发送IGMP加入报文后,另外组成员收到后就不再发送,以此减少网段内IGMP报文数量。
IGMPv1组成员加入
当有新的组播成员加入,就直接发送IGMP加入报文,不用等待查询器发起查询,如上图主机D想要加入G3组,直接发送IGMP加入报文到该网段,RTA收到后同样记录下G3组信息,在下次收到G3组播源数据后转发进该网段。
IGMPv1组成员离开
IGMPv1没有离开报文,因此IGMPv1采用的是静默离开,当G1组成员不再想接受组播源数据时就不会发送IGMP加入报文,RTA发起查询时无G1成员相应,则在2个默认查询时间+10s后将G1组成员记录删除,后续接收到G1组播源数据就不再转发进网段中。
IGMPv2的工作机制
IGMPv2报文格式
类型 | 普遍组查询 (0x11),成员关系报告 (0x12),特定组查询报文(0x11),成员离开报文(0x17) |
---|---|
最大响应时间 | 表示主机响应查询返回报告的最大时间。对于普遍组查询,最大响应时间默认为10秒。对于特定组查询,最大响应时间默认为1秒。 |
组地址 | 普遍组查询报文中,组地址设置为0。特定组查询报文中,组地址为需要查询的组地址。在成员报告或离开组的消息中,组地址为需要报告或离开的组地址。 |
IGMPv2对IGMPv1的改进:组成员离开
IGMPv2新增了组成员离开报文,如上图所示主机B想离开G2组播组,因此发送离开报文到224.0.0.2(网段内所有路由器),RTA作为查询器接收到离开报文后会发送针对G2的特定组查询报文,同时启动组成员关系定时器Timer-Membership=发送间隔x发送次数。缺省每隔1秒发送一次,一共发送两次,发送间隔和发送次数可以配置。如果网段内不存在其他组G2的成员,则路由器不会收到组G2的成员报告报文。在Timer-Membership超时后,删除组播转发表项中对应的下游接口。路由器将不再向该网段转发G2的组播数据。如果网段内还有G2的其他成员,则这些成员在收到特定组查询报文后,会在最大响应时间内发送G2的成员报告报文。路由器继续向该网段转发G2的组播数据。
IGMPv2对IGMPv1的改进:查询器的选举
IGMPv2对比IGMPv1新增了查询器选举功能,IGMPv1的查询器普遍由上层PIM协议进行选择。如上图所示RTA,RTB在使能IGMP协议后都认为自己是网段内的查询器,并向网段内发送普遍组查询报文,当RTB收到RTA的普遍组查询报文后,发现RTA的ip地址比自己小,则从查询器转为非查询器,并启动其他查询器存在定时器,记录RTA为当前网段的查询器,如果期间有其他IP地址跟下的路由器发来普遍组查询则RTB刷新其他查询器存在定时器,并将该路由器记录为查询器,因此没经过一个普遍组查询时间60s后都会进行一次查询器的选举。如果RTB在非查询器状态,而其他查询器存在定时器超时,则由非查询器转为查询器。
IGMPv3的工作机制
IGMPv3报文格式
查询报文格式
字段 | 长度 | 描述 |
---|---|---|
Type | 8比特 | 成员关系查询 Type = 0x11。 |
Max Resp Code | 8比特 | 设备接收到查询消息后发出响应报文的最大延迟时间,超过该时间没有发出响应报文,则查询设备认为此次查询超时,单位是1/10秒。 |
Checksum | 16比特 | IGMP消息的校验和。传送报文时,必须计算校验和并填入该字段中;接收报文时,必须在处理报文之前检验校验和,以判断IGMP消息在传输过程中是否发生了错误。 |
Group Address | 32比特 | 对于普遍组查询消息,该字段置0。对于特定组查询消息、特定组/源查询消息,该字段为设置为欲查询的组播组的地址。 |
Resv | 4比特 | 保留字段,发送报文时置0;接收到报文时,对该字段不做任何处理。 |
S | 1比特 | 该比特位置1时,所有收到此查询消息的其他路由器不启动定时器刷新过程,但是此查询消息并不抑制查询器选举过程和路由器的主机侧处理过程。 |
QRV | 3比特 | 查询者的健壮变量,如果不为0,QRV中包含中一个被查询者使用的[健壮变量]的值,如果查询者的健壮变量的值超过7,即QRV字段的最大值,那么QRV被设成0。路由器取最近收到的查询中的QRV值作为它们自己的健壮性变量的值,除非最近收到的QRV是0,在这种情况下,接收者使用缺省的健壮性变量值,或者是一个静态配置的值。 |
QQIC | 8比特 | 查询器的查询间隔,单位是秒。非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值。 |
Number of Sources (N) | 16比特 | 消息中包含的组播源的数量。对于普遍组查询报文和特定组查询报文,该字段为0;对于特定组/源地址查询报文,该字段非0。此参数的大小受到所在网络MTU大小的限制。 |
Source Address [i] | 32比特 | 组播源地址,其数量受到Number of Sources字段值大小的限制。 |
成员报告报文格式
成员报告消息是主机向组播路由器发送的报告消息,用报告加入某组播组并只接收由指定组播源发往该组的数据。
封装该消息的IP报文头的目的地址字段为224.0.0.22,本地网段上的所有IGMPv3路由器都能识别并接收。
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查询器。
在IGMPv3中一个成员报告报文可以携带多个组播组信息,而之前的版本一个成员报告只能携带一个组播组。这样在IGMPv3中报文数量大大减少。
IGMP各版本间的差异
机制 | IGMPv1 | IGMPv2 | IGMPv3 |
---|---|---|---|
查询器选举 | 依靠其他协议 | 自己选举 | 自己选举 |
成员离开方式 | 静默离开 | 主动发送离开报文 | 主动发送离开报文 |
特定组查询 | 不支持 | 支持 | 支持 |
指定源、组 | 不支持 | 不支持 | 支持 |
IGMP Snooping
IGMP是第三层网络层上的协议,因此IGMP报文被封装在IP报文内,而二层设备正常情况下不会处理过问三层数据,因此二层设备并不知道IGMP与用户之间的数据传播过程,而且通过对数据链路层数据帧的源MAC地址的学习也学不到组播MAC地址(数据帧的源MAC地址不会是组播MAC地址),一旦二层设备收到一个目的地址是组播地址的数据查看MAC地址表发现没有该条目,就会进行广播,这样不但会造成带宽的极大浪费,而且影响网络安全。
IGMP Snooping(Internet Group Management Protocol Snooping,互联网组管理协议窥探)是二层组播的基本功能,可以实现组播数据在二层设备上转发和控制。当主机和上游三层设备之间传递的IGMP协议报文通过运行IGMP Snooping的二层设备时,二层设备分析报文携带的信息,根据这些信息建立和维护二层组播转发表,然后通过转发表转发数据。
RTA作为查询器,周期性的发送普遍组查询,该报文被扩散到交换机的所有端口,包括与交换机CPU相连的内部接口0。交换机CPU收到查询报文后,判断1号接口为连接路由器的接口。
Client B希望加入组播组224.1.2.3,因此以组播方式发送一个IGMP成员报告报文,报告中具有目的MAC地址0x0100.5e01.0203。该报文将被发往路由器的接口以及交换机CPU相连的内部接口0;当CPU收到Client B的IGMP报告时,CPU利用IGMP报告中的信息将该接口加入二层组播转发表中,此时表项包括Client B的接口号,连接路由器的接口号和连接交换机内部CPU的接口号。
形成此转发表项的结果是使后面任何目的地址为0x0100.5e01.0203的组播帧都被控制在端口0、1和3,而且不向交换机其他端口扩散。
Client C加入组224.1.2.3并主动发一个IGMP报告,交换机CPU收到此报告,它在转发表项上为MAC地址0x0100.5e01.0203增加一个端口(端口4)。