IGMP
IGMP(因特网组管理协议)组成员可以将加组消息发送给组播网络,让组播网络感知到组成员的位置和所加入的组播组。
感知组播组成员
连接PC的网络设备需要感知终端用户要加入的组播组、是否已在组内、是否需要接收组流量等。
- 手工静态感知:组播路由器连接组播组成员的接口上静态配置组成员加组信息。
需要管理员手工配置,不够灵活、配置量大,但相对稳定。
一般应用场景:
- 接收者不支持IGMP协议但希望接收某个组播业务。
- 终端接收业务需求比较单一且固定不变。
[AR1-GigabitEthernet0/0/0]igmp static-group ? IP_ADDR<X.X.X.X> Group address 要加入的组播组地址
- 动态感知:通过IGMP协议通知组播网络,组播网络根据IGMP消息感知组播组成员所在接口以及组成员加组信息。
通过IGMP协议,终端自动发送协议报文,网络设备根据报文携带的内容判断主机要加入的组播组。
::: tip 组播路由器与组成员间交互报文后会生成IGMP路由表项与IGMP组表项。 :::[AR1]multicast routing-enable 全局使能组播路由能力
IGMPv1和IGMPv2在ASM模型中进行使用,IGMPv3在SSM模型中进行使用。 ::: tip ASM:任意源组播模型。 主机只对DIP做选择,不对SIP做选择。
SSM:指定源组播模型。 主机对DIP和SIP同时做选择。使用SIP和GROUP一起标识区分不同组播业务。 :::
IGMPv1
IGMPv1工作机制:
[AR1]multicast routing-enable 全局使能组播路由能力(IGMP和PIM协议需要)
[AR1-GigabitEthernet0/0/0]igmp enable
[AR1-GigabitEthernet0/0/0]igmp version 1
- 查询机制: 运行了IGMP的路由器会间隔60s发送一个普遍组查询报文,用来判断接口下是否有成员在,有则维持流量发送,没有就关闭组。 普遍组查询报文的源IP为接口IP地址,目的IP为224.0.0.1(代表链路上的所有节点)。 普遍组查询报文可以查询接口所在链路上是否还存在某些组播组的接收者。
- 报告机制
- 当终端主动加入组播组时,终端设备会直接发送成员报告报文。 成员报告报文源IP为自身网卡IP,目的IP为自身加组的组地址(报文内携带要加入组地址)。
主机发送数据包,携带要加入的组播组信息:
- 终端收到普遍组查询报文后也会发送成员报告报文。 ::: warning 普遍组查询只是用来判断接口下是否有成员在使用该组播组,不关心组内成员数量,即只需要收到一个成员报告报文就会维持该组流量发送。 ::: ::: tip 查询报告机制(即主机进行最大响应时间算法): 同一组内的主机会在10s(最大响应时间)内取出随机值进行倒计时计算,先倒计时为0的发送成员报告报文(目标IP为组播组IP)。
同组成员抑制:同一组内的其他主机收到该成员报告报文后停止随机值倒计时,不发送成员报告报文。 如果路由器收到了成员报告报文,则认为接口下还存在组成员的接收者,需要继续向接口发放组播流量。 :::
- 查询器选举机制
当一台主机所在的广播网络中存在多台路由器时,下发普遍组查询报文的路由器称为查询器。 ::: warning IGMPv1不存在查询器选举机制,需要借助PIM协议选举的DR充当IGMPv1的查询器。 ::: PIM的DR选举: PIM路由器的接口会发送pim-hello报文,报文内携带DR的优先级值。 (DR的优先级值默认为1,越大越优先;优先级值相同,则比较接口IP地址,越大越优先)
如果非查询器在105s内没有收到查询器的查询报文,则认为查询器失效,重新选举新的DR(查询器)。
IGMP的查询器可以随时进行抢占。
[AR1]display igmp routing-table 路由器收到成员加组后,查看组成员加入的组播组内容
[AR1]display igmp group 查询报文是否存在组成员的回复
::: warning
[AR1]display pim routing-table 查看PIM协议产生的组播路由表项
该表项会兼容igmp routing-table,即pim routing-table存在时,不会存在igmp routing-table
由于IGMPv1需要有PIM支持查询器功能,所以在IGMPv1下,使用pim routing-table来查询组播路由表项 :::
- 离组机制 IGMPv1没有离组机制,主机离组时采用静默的方式离组。 即路由器需要等待130s(两个普遍组查询报文的周期120s + 最大响应时间10s),如果没有收到成员报告报文,则删除对应组的表项,后续的组播流量不再向该接口发送。
IGMPv2
IGMPv2组成员加组机制与IGMPv1基本相同,增加了离组机制和查询器选举机制。
IGMPv2工作机制:
- 离组机制
- 其他厂商设备,最后报告者离组发送离组报文。
- 华为设备,组成员离组即发送离组报文。**每一轮普遍组查询,回复报告报文的成员称为Last reporter。** 该成员离组后会发送离组报文;其他成员离组不需要发送离组报文。
::: tip**离组报文:SIP是本身网卡地址,DIP是离组的组地址。** **查询器收到了离组报文,就会进行特定组查询机制。**
其他厂商设备上,Last reporte离组后,路由器再发送一个普遍组查询报文,剩余成员设备再通过查询报告机制选出一个Last reporte回复成员报告报文。 (每轮查询Last reporte可能都会改变) :::
- 特定组查询机制 路由器收到离组报文后,发送特定组查询报文,检测被离组的组内是否还存在其他组成员。 特定组查询报文SIP:接口IP地址。 特定组查询报文DIP:成员离组的组地址。 默认每隔1s发送一次,连续发送2次,2s没有收到该组的报告报文,则认为该组不存在组成员,删除该表项。 ::: tip
特定组查询检查特定组内是否有成员存在,普遍组查询检查所有组内是否有成员存在,如下 ::: 3. 查询器选举机制 选择接口IP地址小的成为查询器。 如果非查询器在125s内没有收到查询器的查询报文,则认为查询器失效,重新进行查询器的选举。 ::: tip PIM的DR优先级相同时选择接口IP大的,IGMP的查询器选择接口IP小的,将多台设备充分利用起来,避免发生一台设备压力过大,其他设备空置。 ::: ::: warning 查询器和非查询器需要设置相同的查询报文通告周期时间值,保证查询器的唯一(查询器接口会对应PIM接口)。 :::
- 成员报告机制
- IGMPv2的普遍组查询报告和IGMPv1相比没有区别,但IGMPv2的最大响应时间可以进行手工配置:
- 特定组查询报告
IGMPv2中收到特定组查询报文的主机会启动最大响应时间计算(1s内)。 最先倒计时为0的,发送成员报告报文。
普遍组查询报告最大响应时间: [AR1-GigabitEthernet0/0/0]igmp max-response-time <1s-25s> 默认10s 特定组查询报告最大响应时间: [AR1-GigabitEthernet0/0/0]igmp lastmember-queryinterval <1s-5s> 默认1s
::: warning IGMPv2兼容IGMPv1,只能向下兼容(v2的报文格式包含v1)。 :::
IGMPv3
IGMPv3的大部分功能和IGMPv2类似,如下:
查询器选举机制相同(IP地址小的做查询器)。
使用普遍组查询报文查询组成员加组信息。
使用特定组查询报文查询特定组播组成员存活情况。
IGMPv3工作机制
IGMPv3新增机制 :
- 特定源组查询报文 特定源组查询报文是在原有特定组查询报文包含目的组播组地址的基础上添加组播源的地址。 ::: tip IGMPv3的查询报文包括普遍组查询报文、特定组查询报文、特定源组查询报文。
组播源地址是发送组播数据的设备的地址。 ::: 2. 不存在成员抑制机制 IGMPv3中,同组内不同源的设备收到查询报文后都会回复成员报告报文。 ::: warning 成员报告抑制机制不能针对同组不同源的终端。 可能存在同一个组内设备接收流量有多个组播源的情况,即组播地址相等,源地址不同。同一组播组中,一个组播源下的某台设备离组,该组其他组播源下终端设备还需要继续接收流量,如果存在成员抑制(成员抑制的条件是同一组播地址),会导致接收不同组播源的组成员也相互抑制,最终只有发送成员报告报文的设备会收到流量。 ::: 3. 成员报告报文(存在改动) 1.模式报告
mode_IS_include:表示接收来自特定的组播流量(包括某部分)
mode_IS_exclude:表示不接收来自特定的组播流量(排除某部分)
2.过滤模式改变报告(必须先存在模式报告)
change_to_include_mode:
将模式报告的 exclude 切换为 include,表示之前不接收特定的组播流量,现在要接收了
change_to_exclude_mode:
将模式报告的 include 切换为 exclude,表示之前接收特定的组播流量,现在不接收了
如果上述模式变为exclude后,exclude模式包含了原来include模式的所有流量,则表示主机离组
3.源列表改变报告(同组不同源的基础上)
1.allow_new_source:在现有的源地址列表中,添加新的源地址
1.原模式为include:表示向列表中添加想要接收的组播源的流量
2.原模式为exclude:表示向列表中添加不想要接收的组播源的流量
2.block_old_source:在现有的源地址列表中,排除存在的源地址
1.原模式为include:表示在列表中指定源地址进行删除,表示不接收组播源的流量
2.原模式为exclude:表示在列表中指定源地址进行删除,表示接收组播源的流量
- 没有离组报文 通过成员报告报文实现离组。
::: tip IGMPv3兼容IGMPv2(存在特定组查询报文) IGMPv3兼容IGMPv1(存在普遍组查询报文)
IGMP版本只能从高向低进行兼容,低版本收到高版本的报文会直接丢弃。 :::
IGMP v1和v2不能携带组播源信息,从而不能用于SSM模型,但是可以通过使用ssm mapping技术解决(目前终端用户仍大量使用IGMPv2)。 终端将数据发送到第一跳路由器后,设备会根据组地址进行映射,将(,G) 转变为(S,G)(表示任意组播源)。
[AR-igmp]ssm-mapping + 要映射的组地址(ASM)
[AR-igmp]ssm-mapping 237.1.1.1 32 100.100.100.100 ASM没有源地址的概念,由ssm-mapping指定匹配的源地址100.100.100.100
终端设备通过IGMPv2发送(*,237.1.1.1)到第一跳路由器后,路由器通过如上命令设置的映射信息修改为(100.100.100.100,237.1.1.1),即使得IGMPv2支持源地址。 应用场景包括某条线路负载较大时,将流量通过备份链路设备转发等。
IGMP三个版本的比较:
IGMP Snooping
如果使用交换机在二层做接入,会导致不同组的设备收到其他组的流量(交换机对组播流量的处理是广播泛洪)。 IGMP Snooping作用:
- 进行IGMP监听,解决了组播报文在二层交换机泛洪转发的问题。
- 建立IGMP监听表项,构建MAC组播表项。
- 交换机根据MAC表项进行数据转发,不再使用泛洪方式。
如上,终端和路由器交互IGMP协议报文时,IGMP Snooping在二层交换机上分析报文信息,将接口和源组信息绑定,创建维护二层组播转发表,指导组播数据在数据链路层的按需转发。
IGMP Snooping端口角色
- 路由器端口:交换机连接组播路由器的二层端口。 (路由器视角)收到普遍组查询报文或者PIM hello报文的端口或手工配置的静态路由器端口。
- 成员端口:交换机连接组播成员的端口。 (成员视角)收到了成员报告报文或者手工配置的静态成员端口。
交换机全局和VLAN下开启IGMP Snooping功能:
[SW]igmp-snooping enable
[SW-vlan1]igmp-snooping enable 交换机所有接口默认属于vlan1,即所有接口都使能igmp-snooping
交换机接口下手工指定静态路由器端口:
[SW-GigabitEthernet0/0/1]igmp-snooping static-router-port vlan 1
交换机接口下手工指定静态成员端口:
[SW-GigabitEthernet0/0/2]l2-multicast static-group group-address 239.1.1.1 vlan 1 l2即二层
查看IGMP-Snooping成员端口和对应组播表项: 查看IGMP-Snooping路由器端口(需要路由器开启组播等配置): 有流量下发时,查看(vlan10的)二层组播转发表:
vlan:用户存在的vlan
组播地址:成员加入的组播组地址
路由器端口:可以存在多个(查询器发送查询报文,开启pim后可以存在多个查询器发送pim hello)
成员端口:可以存在多个
IGMP Snooping交换机转发表项处理:
- 路由器端口:
普遍组查询报文周期发送。
交换机收到普遍组查询报文后,向vlan内除接收该报文的端口之外的其他所有端口进行泛洪转发:
1. 如果路由器端口列表中不存在包含接收该查询报文的接口,则创建接口加入列表中,并启动老化定时器 2. 如果路由器端口列表中存在包含接收该查询报文的接口,则重置接口的老化定时器
收到IGMP普遍组查询报文时,路由器端口默认老化时间为180s(3个普遍组查询报文的周期)
- 成员端口:
成员收到普遍组查询报文或成员主动加入时,会发送成员报告报文。
交换机收到了成员报告报文,向VLAN内所有的路由器端口进行转发,还会从报文中解析对应组播组地址:
1.如果不存在该组播组对应的表项(加入新组播组),则创建转发表项,并将该端口作为成员端口加入成员端口列表,启动老化定时器 2.如果存在组播表项,但是端口列表中未包含该成员端口,则添加该端口作为成员端口加入成员端口列表,启动老化定时器 3.如果存在组播表项,且端口列表中存在该成员端口,则重置端口老化定时器
动态成员端口的老化时间为130s。
::: tip IGMP Snooping不存在成员抑制机制。 由于成员端口的存在,每一个成员拥有独立的转发端口,如果成员抑制机制存在,其他成员端口长时间没有收到成员发送的报告报文,端口超时老化后,下发的组播流量就不会从这些端口转发,这些端口下的成员就无法收到组播流量。 ::: ::: warning IGMP v1和v2有成员抑制机制,IGMP v3没有成员抑制机制。 IGMP v2启用IGMP Snooping后,引入老化定时器,消除了成员抑制机制。 :::
IGMP Snooping离组报文的处理
运行IGMPv2或IGMPv3的成员发送IGMP离开报文,通知IGMP查询器自己离开了某个组播组。IGMP查询器收到IGMP离开报文后解析出组播组地址,并通过接收端口向该组播组发送IGMP特定组查询报文/IGMP特定源组查询报文。
判断离组报文的组播组地址,是否存在组播表项:
1.如果不存在,则认为是错误报文或攻击报文,直接丢弃 2.如果存在组播表项,再判断表项内是否存在收到离组报文的成员端口: 1.如果没有,则认为是错误报文或攻击报文,直接丢弃 2.如果有,则将报文上送VLAN内所有路由器端口
组播路由器收到离组报文后,会发送特定组查询报文,交换机收到特定组查询报文后,根据组播地址判断发送至哪些端口:
1.如果从发送特定组查询报文的成员端口收到了成员报告报文,则认为接口下存在该组成员,刷新成员端口的老化时间 2.如果从发送特定组查询报文的成员端口没有收到成员报告报文,则认为接口下不存在该组成员,等待成员端口老化超时后,将接口从该组的转发表项出接口列表中删除 3.交换机收到离组报文,则对应的表项老化时间和成员端口老化时间设置为2s
IGMP proxy:IGMP代理
交换机连接大量的终端,会发送大量重复无用报文。 如多台设备同时加入一个组播组,交换机接收成员发送的报告后,不需要把所有的报告报文都发送给查询器,只需要发送(第)一个成员报告报文,查询器就会下发流量。 如组成员离组发送离组报文,交换机接收后,如果组内还有组成员,就不会将离组报文发送给查询器,只有当组内的最后一个成员离组,交换机才会向查询器发送离组报文,告知停止下发流量。 ::: tip 交换机的路由器接口作为IGMP接口,对下呈现为IGMP查询器,发送查询报文,处理成员关系报告报文,形成IGMP表项,并将成员关系报告从主机接口发送给上游的IGMP查询器。再有新用户加入该组播组时,IGMP Proxy设备不会向IGMP查询器反馈成员关系报告报文,减少了成员关系报告报文数量。
组成员离开时,IGMP Proxy向接收离组报文的接口发送特定组查询报文,确定该接口下是否还有该组播组的其他组成员,确定已经没有组成员后关闭该接口,然后查询该组播组是否有其他接口,确定没有其他接口后再发送离组报文给上游IGMP查询器。 :::
IGMP Proxy定义如下两类接口: 主机接口:IGMP Proxy设备上配置IGMP Proxy功能的接口,一般用来连接IGMP查询器。 路由器接口:IGMP Proxy设备上配置IGMP功能的接口,一般用来连接组成员。 ::: warning IGMP proxy的两类接口和IGMP Snooping两类接口相反。 :::
[S1]multicast routing-enable
[S1]vlan 1
[S1-vlan1]igmp-snooping proxy
<HUAWEI> system-view
[HUAWEI] multicast routing-enable
[HUAWEI] interface vlanif 100
[HUAWEI-Vlanif100] igmp proxy
::: warning IGMP Proxy特性和以下特性冲奕: PIM:接口上配置pim sm或pim dm后,就不能配igmp proxy;同样配置igmp proxy后就不能配置pim sm或pim dm。 IGMP:接口上配igmp enable后,就不配置igmp proxy;同样配置igmp proxy后就不能在此接口上配置igmp enable。 静态加入: 接口上配置静态加入组播组后就不能配置igmp proxy,同样配置igmp proxy后就不能在此接口上配置静态加入组播组。 同一设备中,如果已经配置多个(2个及以上)IGMP Proxy接口,则此设备其他接口不能再配置IGMP Proxy back口。 :::