IGMP基础
IGMP的作用
IGMP(Internet Group Management Protocol,因特网组管理协议),用于让组播网络感知到组成员的位置和所加组播组。
当一个报文从组播源发出时,组播源是不关注接收者的位置信息的,组播数据转发需要依靠组播网络才能将数据发送至组播成员,此时组播网络就要依靠IGMP来感知组播组成员。
有两种方法来感知,一种是手工静态配置,在组播路由器上静态指定连接组播成员的接口,静态配置组成员加组信息。 另一种就是IGMP协议通知组播网络,组播网络根据IGMP消息感知组播成员所在接口,以及组成员加组信息。
IGMP概述
IGMP是TCP/IP协议族中负责 IPv4组播 成员管理的协议,用来在接收者主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。
组播路由器与组成员之间交互报文后会生成IGMP路由表项和IGMP组表项,二者将帮助设备生成组播路由表项
IGMP组表项和IGMP路由表项
IGMP组表项是由用户主机发送的IGMP加入报文触发创建的,用于维护组加入信息并通知组播路由协议(例如PIM协议)创建相应的(* ,G)表项。
IGMP路由表项是用来扩展组播路由表项的出接口
在最后一跳组播路由器上,IGMP组表项和IGMP路由表项和组播协议路由表(PIM表)汇总生成组播路由表项。
IGMP工作原理
IGMP共有三个版本,分别是 IGMPv1、v2和v3。
IGMPv1
IGMPv1主要基于查询和响应机制完成组播组管理
查询和响应机制由两种报文实现:
普遍组查询报文(General Query,以下简称查询报文):查询器向共享网络上所有主机和路由器发送查询报文,用于查询哪些组播组存在成员。
成员关系报告报文(Report,以下简称报告报文):主机向查询器发送的报文,用于申请加入某个组播组或应答查询报文。
IGMP是组播报文,因此在一个多路访问网络中只需要一个组播路由器发送查询报文即可,该组播路由器称为IGMP查询器(Querier)
报文格式
IGMPv1查询报文和报告报文均为组播报文,查询报文的目的IP地址为224.0.0.1
,报告报文的目的地址为加入的组播组IP地址
,同时报告报文中的Group Address
也会指明加入的组播组地址。
加组过程
IGMP查询器使用224.0.0.1
作为目的地址,向同一网段内的所有主机和路由器周期性(缺省为60s)发送查询报文,收到该查询报文的组成员在本地启动定时器(缺省情况下定时器范围为0-10s),第一个定时器超时的组成员发送针对该组的报告报文。
IGMP查询器收到组播成员的报告报文后,生成IGMP组表项和(* ,G1)以及IGMP路由表项,” * ”代表任意组播源,和IGMP路由表项。网络中一旦有组播组G1的数据到达路由器,将向该网段进行转发。
- 报告报文抑制机制 在上图中,如果组成员1上的定时器先超时,则组成员1发送报告报文,此时也想加入组G1的组成员2收到此报告报文,则停止本地定时器,不会发送针对G1的报告报文,这样抑制了报告报文,减少网段上的流量。
离组过程
IGMPv1没有专门定义离开组消息,当组播组成员离开组播组时,将不会再对查询报文做出回应。 当网段中不存在特定组的组成员,查询器不会受到特定组成员的报告报文,则在一定时间(缺省值为130s)后,删除特定组对应的组播转发表项。
IGMPv2
IGMPv1的机制上存在一些缺陷:
- IGMPv1离组使用超时机制,组成员只能静默离组,在未超时的时间内,组播流量依然会被组播路由器转发。
- IGMPv1的查询路由器需要依靠PIM协议,选举不够灵活。
IGMPv2改善了缺陷:
- 增加了离开组机制
- 增加了查询器选举机制
- 与v1兼容
v2可以与v1兼容
报文格式
IGMPv2新增了两种报文:
成员离开报文(Leave):成员离开组播组时主动向查询器发送的报文,用于宣告自己离开了某个组播组。成员离开报文的目的地址为
224.0.0.2
特定组查询报文(Group-Specific Query):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播是否存在成员。特定组查询报文的目的地址为所查询组播组的组地址。
IGMPv2对普遍组查询报文做了改进,添加了最大响应时间(Max Response Time)字段,用于控制成员对于查询报文的响应速度,可以通过命令配置。
- Type(报文类型):
- 0x11:表示查询报文,包括普遍组和特定组查询报文
- 0x12:IGMPv1报告报文
- 0x16:IGMPv2报告报文
- 0x17:成员离开报文
- Max Response Time(主机响应查询返回报告的最大时间):
- 普遍组:最大响应时间默认为10s
- 特定组:最大响应时间默认为1s
- Group Address:
- 普遍组查询报文中,组地址为0
- 特定组查询报文中,组地址为要查询的组地址
- 成员关系报告或离开组的信息中,组地址为需要报告或离开的组地址。
查询器选举机制
IP地址最小的路由器称为查询器,非查询器上都会启动一个定时器,在该定时器超时前,如果收到了来自查询报文,则重置定时器,否则认为原查询器失效,发起新的查询器选举过程。
离组机制
组播组成员向本地网段内的所有组播路由器(目的地址为224.0.0.2)发送针对组G1的离开报文
查询器收到离开报文,会发送针对组G1的特定查询报文。发送间隔和发送次数可以通过命令配置,缺省情况下每隔1s发送一次,共发送两次。同时查询器启动组成员关系定时器(Timer-Membership=发送间隔×发送次数)
如果该网段内还存在组的其他成员,这些成员在收到特定组查询报文后,会立即发送针对组G1的报告报文后将继续维护该组成员关系。
如果该网段内不存在G1的其他成员,查询器将不会收到针对G1的报告报文,在Timer-Membership超时后,查询器将删除(* ,G1)对应的IGMP组表项。
IGMPv3
IGMPv1和v2中无法携带组播源的信息,无法配合SSM(组播范围地址232.0.0.0-232.255.255.255)模型(可使用[SSM Mapping](#SSM Mapping) 功能解决),IGMPv3主要为了配合SSM模型,提供了在报文中携带组播源信息的能力,即主机可以对组播源进行选择。
相比于IGMPv2,IGMPv3具有以下特性:
- IGMPv3新增了特定源组查询报文
- IGMPv3报告报文中不仅包含主机想要加入的组播组,还包含主机想要接收来自哪些组播源的数据
- 由于同个组播组的不同成员可能希望接收来不同源的组播,因此IGMPv3不需要成员关系报告报文抑制机制
- IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。
报文格式
IGMPv3的查询报文有三类,其中普遍组查询报文和特定组查询报文作用和IGMPv1、v2一致,新增特定源组查询报文。
报文字段:
- Tpye、Max Response Code和Group Address和IGMPv2报文的内容含义一样。注意的是查询报文的Type字段取值为
0x11
。 - Number of Sources:报文中含的组播源的数量。对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段为0.此参数大小收到所在网络的MTU大小的限制。
- Souce Address:组播源地址,其数量收到Number of Sources字段值大小的限制。
IGMP的成员关系报告报文有两种模式:
INCLUDE:希望接收来自特定组播源的组播流量
EXCLUDE:希望过滤来自特定组播源的组播流量
IGMPv3成员关系报告报文的目的地址为224.0.0.22
,同时一个报告报文可以携带多个组播组信息,而之前版本只能携带一个组播组。
报文字段:
Type(报文类型):取值0x22
Number of Gruop Records:报文中包含的组记录数量
Group Record:组记录
- Record Type:组记录的类型,分为三类
当前状态报告。用于对查询报文进行响应,通告自己目前的状态,共两种:一种是MODE_IS_INCLUDE,表示接收源地址列表包含的源发往该组的组播数据。如果指定源地址列表为空,则该报文无效;另一种是MODE_IS_EXCLUDE,表示不接收源地址列表包含的源发往该组的组播数据。
过滤模式改变报告。当组和源的关系在INCLUDE和EXCLUDE之间切换时,会通告过滤模式发生变化,共两种:一种是CHANGE_TO_INCLUDE_MODE,表示过滤模式由EXCLUDE转换到INCLUDE,接收源地址列表包含的新组播发往该组播组的数据。如果指定源地址列表为空,主机将离开组播组;另一种是CHANGE_TO_EXCLUDE_MODE,表示过滤模式由INCLUDE转换到EXCLUDE,拒绝源地址列表包含的新组播发往该组的组播数据。
源列表改变报告。当本地的IP Multicast Listen调用造成本地的接口层关于某一特定多播IP地址的源列表发生改变,并且该改变不跟过滤模式的改变产生冲突时,由系统发出。该记录包含在一个报告中,而该报告是从发生改变的那个接口上发出来的,共两种:一种是ALLOW_NEW_SOURCE,表示源地址列表包含系统希望接收发往该组播组的新的源地址,如果是对INCLUDE表的改变,则这些源地址将会加入到列表,如果对EXCLUDE表,则删除这些源地址;另一种是BLOCK_OLD_SOURCE,表示源地址列表中含有系统不希望再接收的发往该组播组的源地址,如果是对INCLUDE表的改变,则会删除这些地址,如果是对EXCLUDE表的改变,则会添加这些地址到源地址列表中。
- Record Type:组记录的类型,分为三类
加组流程
离组流程
改变源组关系的成员关系报告报文很多,例如(G1,EXCLUDE,S1)或(G1,CHANGE_TO_EXCLUDE_MODE,S1)
各版本对比
机制 | IGMPv1 | IGMPv2 | IGMPv3 |
---|---|---|---|
查询器选举 | 依靠组播路由协议 | 自己选举 | 自己选举 |
成员离开方式 | 静默离开 | 主动离开 | 主动离开 |
特定组查询 | 不支持 | 支持 | 支持 |
指定源 | 不支持 | 不支持 | 支持 |
IGMP Snooping
当组播数据从最后一跳路由器发往组播组成员时,往往会经过交换机。由于组播数据的目的MAC地址是组播MAC地址,默认情况下交换机是学习不到这一类MAC表项的,因此将泛洪此类数据帧,有可能导致不同组的组播流量会被别组的成员接收。
IGMP Snooping功能可以控制组播流量在以太网的泛洪范围。
IGMP Snooping 可以实现组播数据在数据链路层的转发和控制。 当主机和上游三层设备之间传递的IGMP协议报文通告二层组播设备时,IGMP Snooping分析报文携带的信息,根据这些信息建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发。
IGMP Snooping禁止广播功能与未知组播报文丢弃功能的区别就在于:前者将未知的组播数据报文向路由器端口转发,而后者则会直接丢弃未知组播数据报文。
工作原理
二层组播转发表中存在两种接口:
路由器端口(Route Port):二层组播设备上朝向三层组播设备(DR或IGMP查询器)一侧的接口,二层组播设备从此接口接收组播数据报文
生成过程:
- 由协议生成的路由器端口叫做动态路由器端口。收到源地址不为0.0.0.0的IGMP普遍组查询报文或PIM Hello报文(三层组播设备的PIM接口向外发送用于发现并维持邻居关系的报文)的接口都将被视为动态路由器端口
- 手工配置的叫静态路由器端口
成员端口(Member Port):表示二层组播设备上朝向组播组成员一侧的端口,二层组播设备往此接口发送组播数据报文。
生成过程:
- 由协议生成的成员端口叫做动态成员端口。收到IGMP Report报文的接口,二层组播设备会将其标识为动态成员端口。
- 手工配置的为静态成员端口
路由器端口和成员端口形成后会分别启动老化计时器(默认均为180s),当分别收到普遍组查询报文和关系报告报文后分别刷新。
IGMP不再使用成员关系报告报文抑制机制:
IGMP Snooping需要监听IGMP报文才能决定端口角色,进而指导转发,所有组成员都需要发送IGMP组成员关系报告报文
当IGMP Snooping设备收到成员关系报告后,只将成员关系报告报文从路由器接口发送出去,从而避免其余组成员收到成员关系报文。
IGMP Snooping设备通过监听IGMP离开报文,IGMP成员关系报文决定特定端口是否还需要发送特定组播。
收到IGMP离开报文后,成员端口的老化计时器=健壮系数(默认为2)×特定组查询间隔(默认为1s)
IGMP SSM Mapping
在IGMPv1和IGMPv2中无法指定组播源,因此无法使用SSM模式的组播网络。
IGMP SSM Mapping 通过静态的将组播源与组播组进行绑定,使得IGMPv1与IGMPv2的组成员也能接入SSM组播网络。
工作原理
在IGMP查询器上静态配置SSM地址的映射规则,将IGMPv1或v2的报告报文中的组信息映射为源组信息。
当查询器收到报告报文时,首先检查该报文中所携带的组播组地址G,然后根据检查结果的不同分别进行处理:
如果G在ASM范围内,只提供ASM服务
如果G在SSM组地址范围内(缺省情况下为232.0.0.0-232.255.255.255):
- 如果路由器上没有G对应的SSM Mapping规则,则无法提供SSM服务,丢弃该报文
- 如果路由器上有G对应的SSM Mapping规则,则依据规则将报告报文中所包含的(* ,G)信息映射为(G,INCLUDE,(S1,S2…))信息,提供SSM服务
IGMP SSM Mapping不处理IGMPv3的报告报文,因此为了兼容各个版本,需要在与组播路由器相连的接口上运行IGMPv3
IGMP Proxy
一台IGMP查询器可能出现需要管理大量组成员的情况,大量组成员频繁加入/离开组播组时,会产生大量的IGMP报告/离开报文,给查询器带来较大的处理压力
通过IGMP Proxy功能减少查询器接收报告/离开报文的数量,减轻查询器压力。一般情况下部署在IGMP查询器和成员主机之间的三层设备上。
工作原理
和IGMP Snooping一样,IGMP Proxy也定义了两种接口:主机接口和路由器接口,但不同的是,朝向是相反的。主机接口面向的是IGMP查询器,而路由器接口面向的是组成员
加组机制
路由器接口作为IGMP接口,对下呈现为IGMP查询器,发送查询报文,处理成员关系报告报文,形成IGMP表项,并将成员关系报告从主机接口发送给上游的IGMP查询器
当新用户加入同一个组播组时,IGMP Proxy设备不会再向IGMP查询器反馈成员关系报告报文,因此减少了成员关系报告报文。
IGMP代理设备收到某组播组的报告报文后,会在IGMP组表项中查找该组播组:
- 如果没有找到相应的组播组,IGMP代理设备会向接入设备发送针对该组播组的报告报文,并在组播转发表中添加该组播组;
- 如果找到相应的组播组,IGMP代理设备就不需要向接入设备发送报告报文
离组机制
当组成员离开时,IGMP Proxy通过IGMP离组机制确定是否有特定组播组的组成员,当确定已经没有组成员后才发送离开报文给上游IGMP查询器。
IGMP代理设备收到某组播组G1的离开报文后,会向接收到该离开报文的接口发送一个特定组查询报文,检查该接口下是否还存在组播组G1的其他成员:
- 如果有其他成员,IGMP代理设备会继续向该接口转发组播数据。
- 如果没有其他成员,在组播转发表中将该接口删除,然后判断组播组G1是否还有其他接口。
- 如果没有,IGMP代理设备再会向接入设备发送针对该组播组的离开报文;
- 如果有,IGMP代理设备不向接入设备发送针对该组播组的离开报文;