个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。

因此本文将在IGMPv2协议报文的基础上进行介绍,以详细介绍主机-路由器IGMP组播协议。IGMPv1和IGMPv3则只进行比对介绍。
在这里插入图片描述

其他相关资料可参考

组播是一种介于单播和广播报文的报文传播方式。这里不做过多介绍,直接进入相关内容介绍。
IGMP主要用于IPv4网络的主机和路由器间的组播协议,这里主要介绍IGMPv2。IPv6网络主要使用MLD协议。

第2和第3.1章节基本描述了IGMPv2的相关内容,可直接阅读相关内容。

目录

1.组播基础内容

1.1.组播IP

传统网络进行地址分配时,将IPv4网络分为5类

A类:1.0.0.0 - 126.0.0.0
B类:128.0.0.0 - 191.254.0.0
C类:192.0.0.0 - 223.255.255.0
D类:224.0.0.0 - 239.255.255.255

2进制的前4个bit固定为1110:
Note:224(十进制)=1110 0000(2进制);239(十进制)=1110 1111(2进制)

E类:240.0.0.0-239.255.255.255,保留地址

其中 D 类地址称为组播 IP。虽然目前 CIDR(Classless Inter-Domain Routing,无类域间路由) 和 VLSM(Variable Length Subnet Mask,可变长子网掩码) 的出现淡化了 IP 分类,但组播 IP 范围并未发生变化。

其中组播IP又可进行如下划分
224.0.0.0-224.0.0.255:预留永久组播地址,通常为协议所使用。

224.0.1.0-231.255.255.255 和 233.0.0.0-238.255.255.255:ASM(Any Source Multicast) 模型使用。

232.0.0.0-232.255.255.255:SSM(Source-Specific Multicast) 模型使用。

239.0.0.0-239.255.255.255:本地管理组地址,也即私网组播IP。

需要说明的是,上述仅是 IPv4 组播地址的一个大致分类。其中还包含了保留组播地址、网络间控制组播地址等。感兴趣者可查阅相关资料。

常用协议组播地址

组播地址 使用者
224.0.0.1 所有主机及路由器监听地址
224.0.0.2 所有路由器监听地址
224.0.0.4 DVMRP协议使用
224.0.0.5
224.0.0.6
OSPFv2协议使用
224.0.0.9 RIPv2协议使用
224.0.0.12 DHCP协议特定场景使用
224.0.0.13 PIM协议使用
224.0.0.14 RSVP协议特定场景使用
224.0.0.18 VRRPv2协议使用
224.0.0.22 IGMPv3协议使用
224.0.0.251 mDNS协议使用
224.0.0.252 Link-local Multicast Name Resolution协议使用

关于其他 IPv4 组播地址的使用,感兴趣者可查阅 IANA 发布的《IPv4 Multicast Address Space Registry》等相关资料。

1.2.组播MAC

通常的 MAC 地址为 48bits,6 字节。
1@:第一个字节的最后 1 个 bit = 1,表明该MAC为组播MAC,否则为单播MAC。
2@:MAC 地址的前三个字节 24bits 称为 OUI (Organizationally unique identifier,厂商标识),需要向 IEEE 购买分配。后 24bits,由厂家自行分配。
3@:组播 MAC 由于没有明确的目的主机,因此规定 组播MAC由组播IP映射 而来。

映射规则如下
1@:IPv4 Multicast MAC 的高 24 bit = 01‑00‑5E,已分配给 IANA 规划使用。
2@:IPv4 Multicast MAC 的后 23 bit 由组播 IPv4 的后 23bit 直接映射而来。也即实际取值为 01‑00‑5E‑00‑00‑00 至 01‑00‑5E‑7F‑FF‑FF。
3@:IPv4 Multicast MAC 的第 25 位 bit 固定为0。
4@:组播 IPv4 实际上有 32 - 4 = 28bits (固定前缀 1110),因此存在 5bits 数据无法进行对应。
所以实际上每 2^5 = 32 个组播 IPv4 对应一个组播 MAC。在这里插入图片描述而且由于错配的 bit 位是高 bit 位的 IP,所以通常对应同一个组播 MAC 的 32 个 IP 是不连续的。需要进行 2 进制转换。
例如:224.1.0.1、224.129.0.1、225.1.0.1、225.129.0.1、226.1.0.1、226.129.0.1、…、239.1.0.1、239.129.0.1 具有相同的组播 MAC = 01-00-5e-01-00-01。
关于 IANA 分配使用的其他 MAC 情况,可查看《IANA OUI Ethernet Numbers》等相关资料。
自动换行
IPv6 的组播 IP 和组播 MAC,情况稍有变化
IPv6 组播 MAC 地址的高16位为 0x3333,低 32 位为 IPv6 组播地址的低 32 位。常用的 IPv6 组播地址为 ff00::/8。感兴趣者可查阅 IANA 发布的《IPv6 Multicast Address Space Registry》等相关资料。

4@:此外还有协议规定组播 MAC。
例如,某些协议组播 MAC 以 01-80-C2 开头:01-80-C2-00-00-00 用于 STP BPDU,01-80-C2-00-00-14 和 01-80-C2-00-00-15 用于集成 ISIS 等。

点击此处回到目录

2.IGMPv2基础介绍-RFC2236

IGMP协议主要用于主机和组播路由器进行组播状态协商,是一种局域网内组播路由协议。

2.1.IGMPv2概念

关于IGMPv2相关概念,可参考1997年发布的《RFC2236:Internet Group Management Protocol, Version 2》

查询者Querier:发送通用组和特定组查询报文的组播路由器。需维护相应的 (*,G) 表项。

1@:一个局域网中可能出现多个组播路由器,此时需要选举查询者路由器。
2@:S = 组播源,也即组播服务器的地址。G = 组播组,组播服务器提供组播服务的组播地址。
(S,G) 用于表示特定组播源产生组播流,(*,G) 用于表示任意组播源产生组播流。
3@:IGMPv1 和 IGMPv2 主要使用 ASM 模型(*,G),IGMPv3 主要是为了实现 SSM 模型(S,G)。

健壮系数Robustness Variable:允许结果偏移预期的范围。默认=2。

在这里插入图片描述igmp robust-count用于设置健壮系数。

查询间隔Query Interval:查询者发送通用组查询的间隔。默认应取125s。

在这里插入图片描述igmp timer query 。路由器定期在局域网中确认有主机加入组播组以及组播组内成员的存在。
华为默认取=60s。

查询响应间隔Query Response Interval:终端对通用组查询报文的响应间隔。取值 (0,最大响应时间Max Response Time] 的一个随机数。最大响应时间 Max Response Time 默认 100(单位0.1s)

在这里插入图片描述//igmp max-response-time 用于设置IGMP组播路由器允许接受查询响应的间隔,也即允许接受成员关系报告报文的最晚时间。

路由器允许主机对查询报文进行相应的时间。
主机实际上在本地生成一个(0,最大响应时间Max Response Time]的随机定时器。
在定时器内进行IGMP响应后或受抑制后清除该定时器。
如果主机未进行响应则认为该局域网内组播终端设备已全部离组。    

组关系报告间隔Group Membership Interval:组播路由器确定网络上不再有组成员之前必须经过的时间量。取值=健壮系数*查询间隔+查询响应间隔。

IGMPv2 查询者保存的离组定时器。如果主机在定时器超时时间内都没有进行回应,IGMPv2 查询者认为主机离组。适用于路由器没有正常接收主机的离组报文请求的情形。
华为默认取=2*60+10=130s。

其他查询者生存间隔Other Querier Present Interval:其他查询者发现网络中不存在查询者的等待时间。取值=健壮系数*查询间隔+查询响应间隔/2。

在这里插入图片描述igmp timer other-querier-present设置其他IGMP查询器的存活时间。
华为默认=125s。
自动换行
在IGMP网络中,查询者和非查询者都维护相同的主机加组表项。此外,协议定义的查询者生存间隔比组关系报告间隔短,可以防止非查询者升级为查询者时主机表项的清除。

启动查询间隔Startup Query Interval:查询者在首次启动时发送通用查询前的等待间隔。默认=查询间隔/4,

因此华为默认取60/4=15s。

启动查询数Startup Query Count:查询者仅在首次启动时每间隔启动查询间隔发出的通用组查询报文数。默认=健壮系数=2。

最后成员查询间隔Last Member Query Interval:收到成员离组后,发送特定组查询报文的最大响应间隔时间。默认=1s。

在这里插入图片描述igmp lastmember-queryinterval查询器在收到主机发送的IGMP离开报文时,发送IGMP特定组\源组查询报文的时间间隔。

最后成员查询间隔数Last Member Query Count:查询者认为组成员中无成员而发出的特定组查询报文的间隔。默认=健壮系数=2。

最后成员查询间隔Last Member Query Interval和最后成员查询间隔数Last Member Query Count
用于组播路由器在主机离组后向该组内确认是否还有成员存在。
也即默认每1s发送一次特定组查询,连续发送2次。
2次都没有主机响应则认为该组中不在存在成员,删除(S,G)表项。

非响应报告间隔Unsolicited Report Interval:主机初始加组时主动发送组成员关系报告的间隔。默认=10s。

IGMPv1路由器生存超时时间Version 1 Router Present Timeout:《RFC2236-Internet Group Management Protocol, Version 2的8.11.Version 1 Router Present Timeout》认为主机在收到IGMPv1查询报文后,继续等待IGMPv1查询报文的最大时间。超过此时间,则认为系统应发送IGMPv2查询报文。默认=400s。

以上概念IGMPv2和IGMPv3通用。
在这里插入图片描述//系统对IGMP协议提供的默认参数。

2.2.IGMPv2报文格式

首先报文从数据链路层对报文进行介绍
数据链路层:SMAC使用设备接口MAC,DMAC使用组播MAC (由组播IP映射而来)。
网络层:SIP使用设备接口IP,DIP根据报文类型进行区分。总的来说有3种:

224.0.0.1 == all-systems multicast group所有系统组播组,所有设备都对该地址进行监听;

224.0.0.2 == all-routers multicast group所有路由器组播组,只有路由器对该地址进行监听;

普通组播源组播组 == 主机所监听,也即主机所需获得的相应组播源地址。

此外,有一个需要注意的是IGMP报文中IP头部的TTL必须设置为1,这样的一个好处是只在局域网内进行泛洪减少泛洪并且一定程度上防止远端攻击。
IGMP虽然还是网络层协议 (IP协议号=2),但是只在局域网内运行。这是由TTL所决定的。

IGMPv1通用报文格式如下:
在这里插入图片描述

IGMPv2通用报文格式如下:
在这里插入图片描述
IGMPv3报文格式如下:
在这里插入图片描述从报文字段可以看出IGMPv1和IGMPv2几乎是完全相同的,只要稍加区分便可互通。而IGMPv3报文字段也基本涵盖IGMPv2的相关字段。
因此,IGMP 协议之间可以相互兼容。

IGMPv1
Version字段,4bits == 0x01
Type字段,4bits == 0x01时表示Host Membership Query 主机成员查询,0x02时表示Host Membership Report 主机成员报告

IGMPv2
对v1的Version和Type进行合并为Version字段,共8bits。
0x11时表示Membership Query IGMP 查询消息,通用组查询或特定组查询;
0x12时表示 Version 1 Membership Report IGMPv1 成员报告消息;
0x16时表示Version 2 Membership Report IGMPv2 成员报告消息;
0x17时表示Leave Group 离组报文消息。

Note:0x11=0001 0001(2进制),0x12=0001 0010(2进制),0x16=0001 0110(2进制),0x17=0001 0111(2进制)。因此但就报文2进制来看IGMPv2的0x11通用组查询报文和0x12和IGMPv1完全可以进行兼容。
Q:那么协议如何分别报文时IGMPv1还是IGMPv2?
A:IGMPv1的unused字段必须取0,而IGMPv2的相应位置字段必须不为0。当为0时表示为IGMPv1。
从报文字段可以看出 IGMP 报文并不携带许多关键信息,因此对 IGMP 相关处理还是依赖设备自身的程序设置。

自动换行
1@IGMPv2的通用组查询报文示例
在这里插入图片描述IP:SIP为自己接口IP,DIP为组播IP=224.0.0.1。
IGMPv2的Max Resp Time:表示主机进行响应时的最大时间。主机对通用组报文查询时随机取值为(0,Max Resp Time]。
IGMPv2的CheckSum:用于对IGMP报文进行校验。
IGMPv2的Multicast Add:组播组地址,在不同报文场景下具有不同含义。
通用组查询为0.0.0.0。

自动换行
2@IGMPv2的离组报文示例
在这里插入图片描述IP:SIP为自己接口IP,DIP为组播IP=224.0.0.2。

 224.0.0.2为所有路由器组地址,这里用于通知所有路由器主机已离组。。

Type=0x17:标识自己为离组报文。
IGMPv2的Max Resp Time:此时必须置0。
IGMPv2的Multicast Add:表示自己所要退出组播组的组播地址。

自动换行
3@IGMPv2的特定组查询报文示例在这里插入图片描述IP:SIP为自己接口IP,DIP为组播IP。该组播IP取主机请求离组的组播组IP。
Type=0x11:标识自己为查询报文。

 从报文标识上通用组查询和特定组查询Type字段一致。只是Multicast Addres是否填充。

IGMPv2的Max Resp Time:此时置1表示的是最后成员查询间隔Last Member Query Interval
IGMPv2的Multicast Add:表示自己所要退出组播组的组播地址。

自动换行
4@IGMPv2的响应报文示例
在这里插入图片描述IP:SIP为主机接口IP,DIP为组播IP。该组播IP取主机加入组播组的组播组IP。
Type=0x16:标识自己为IGMPv2的响应报文。

 从报文标识上通用组查询和特定组查询Type字段一致。只是Multicast Addres是否填充。

IGMPv2的Max Resp Time:此时置0。
IGMPv2的Multicast Add:表示自己主机加入组播组的组播组IP。

2.3.IGMP协议特性

由于 IGMP 报文中并没有包含许多信息,因此设备在处理相关 IGMP 报文时有一些特性。

1@IGMPv2的主机抑制
1@:IGMPv2 的主机对路由器的查询报文进行响应时,在本地启动的一个随机数定时器。

 取值范围为(0,最大响应时间]。
 最大响应时间由组播查询者定义,并在IGMPv2报文中通告。

2@:主机在定时器为 0 时发送相应的查询者响应报文。目的地址为加入组播组的 IP。同时其他主机也监听来自该组播组地址的数据。
3@:当其他主机监听到自己所加入组的查询者响应报文时,如果本地计时器未清零则清除本地的定时器并不在发送 IGMP 响应报文。

 发送该响应报文的主机称为最后组播组成员。
 注意!因为启动的是随机数,所以最后组播组成员并不一定总是组播组的最后一个成员。

2@IGMPv2的主机离组和特定组查询
IGMPv2 主机在离组时,通常发送 IGMPv2 离组报文。但是如果主机记录了最后组播组成员,则该主机在离组时认为自己所加入的组播组中存在其他成员。因此不发送IGMPv2 离组报文。
同样的组播路由器如果也可以记录最后组播组成员,则在接收(组播组中的)非最后组播组成员的离组报文时不发送针对该组播组的特定组查询报文。

也即主机/路由器记录了上一次通用组查询的主机响应者信息后,在后续离组和特定组查询可省略部分特性。
这一功能属于附加功能,未强制要求遵守。

3@IGMP的查询者选举
从报文来看IGMP并不包含相应的查询者信息,因此在组播路由器上对查询者的选举做如下定义:
1@:IGMPv1 的查询者借用组播路由协议 PIM 的 DR 角色承担。
2@:IGMPv2 的查询者取决于发送 IGMPv2 查询报文的IP。当有多个组播路由器时,选择发送接收者的较小一个。由于 IGMP 协议报文也不包含相关的协商信息,因此默认情况下相互抢占。

其他竞争失败的非查询者在本地启动一个其他查询者生存间隔 Other Querier Present Interval 定时器。取值=健壮系数*查询间隔+查询响应间隔/2。因此华为默认=125s。
如果在该时间内没有监听到来自 224.0.0.1 的查询报文或者监听到查询 SIP 大于自己的查询报文时,升级成为查询者。

点击此处回到目录

3.IGMPv2原理

IGMPv2 协议报文比较简单,其处理流程也不复杂。在此先对其简单介绍。
路由器
1@启动时:IGMPv2 路由器在启动时认为自己是查询者,主动发送查询者报文。
在启动查询间隔 Startup Query Interval (默认15s) 内没有监听到其他查询者,则确认自己为查询者并再次发送查询者报文。此后以查询间隔 (默认60s) 发送查询者报文。
2@正常运行:以查询间隔 (默认60s) 发送查询者报文。如果监听到其他更小IP路由器发送的查询者报文,降级为非查询者。

静默降级,查询者抢占。
非查询者启动一个定时器125s,监听查询者的活动状态。
定时器为0还未监听到查询者,则主动升级为查询者。

3@监听主机:主机发送离组报文时,发送特定组查询报文。询问该组内是否存在其他主机。如果组关系报告间隔 Group Membership Interval (默认130s) 内没有响应,删除该组播组表项。

主机
1@启动时:主动发送成员报告。
2@运行时:对查询者发送的通用组查询报文,启动定时器。
定时器为0,发送成员关系报告。
定时器非0前收到其他主机发送的同一个组播组成员关系报告,则删除定时器。
3@离组时:主机离组发送离组报文通知到所有IGMPv2路由器。此时查询者进行相应特定组查询。

附加功能:
如果主机记录了同一个组播组的 last report,则离组时不发生离组报文。
如果路由器记录了同一个组播组的 last report,则忽略非 last report 发送的离组报文。
last report==最后组播组成员。不一定为组播组的最后一个成员,而是主机定时器首先为0的成员。

以上描述基本表达了 IGMPv2 的运行逻辑,可不看第三章剩余内容。

3.1.主机状态机

《RFC2236的第6章-Host State Diagram》描述了主机所具有的状态机。RFC定义了设备的不同状态机,暗含于IGMPv2的程序运行中。在此进行介绍:
主机存在三种状态
非成员Non-Member、延迟成员Delaying Member和静默成员Idle Member。
非成员Non-Member:主机未加入组播组的状态。
延迟成员Delaying Member:主机加入组播组的状态,但启动了成员报告定时器。
静默成员Idle Member:主机加入组播组的状态,并无需回应查询者的查询报文。

主机状态切换
为了实现主机状态的切换,RFC2236定义了5种重要事件。
1@加组:主机未收到查询报文但主动发出IGMP报告报文(unsolicited Report)。该事件只能在非成员状态发生。
2@离组:主机主动发出离组报文。该事件只在离组状态发生。
3@收到查询事件:主机收到通用组查询报文或特定组查询报文。
4@收到报告事件:主机收到其他主机发送的报告报文。
5@定时器触发:主机收到查询报文后启动的定时器到计时为0状态。

针对以上情况程序可能有7种动作:
1@发送报告:针对查询报文,发送报告
2@发送离组:IGMPv2主机离组,且自己flag置位时发送离组报告。
3@置位set flag:主机为组成员中最后成员。
4@不置位clear flag:主机不在是组成员中最后成员。
5@启动定时器:主机第一次加组或主机对查询报文进行响应发送报告的定时器。
6@重置定时器:定时器已启动但定时器剩余时间大于查询者通告的最大响应时间
7@清除定时器:定时器相关功能完成,将定时器清除。

如下图描述了主机状态切换在这里插入图片描述感兴趣者可查阅 IGMP 状态机的详细切换过程。

3.2.路由器状态机

《RFC2236的第7章》描述了路由器所具有的状态机。在此进行介绍:
路由器存在两种角色:查询者和非查询者。
并定义三个事件用于触发路由器角色的切换:
1@查询定时器触发:查询定时器为查询间隔,默认60s。计数完成时放查询报文。
2@收到具有更小IP的查询报文:查询者路由器收到了 SIP 比自身接口地址更小的查询报文。此时查询者向非查询者角色过渡。
3@其他查询者生存定时器触发:非查询者监控网络中存在查询者的定时器。取值其他查询者生存间隔 Other Querier Present Interval,默认125s。

基于以上三个事件,路由进行相应三个动作进行程序处理:
1@启动通用组查询定时器:取查询报文间隔,默认60s。
2@启动其他查询者生存定时器:非查询者用于监控网络中查询者的存活。
3@发送通用组查询报文:向网络中所有设备224.0.0.1发送通用组查询报文。

相应的处理动作如下
在这里插入图片描述IGMPv2还定义了对不同报文的处理动作
由于IGMPv2可以兼容IGMPv1,涉及程序处理较为复杂。暂不相关处理流程做介绍,感兴趣者可阅读相关资料。

3.3.IGMPv1和IGMPv2的兼容性

RFC2236 对 IGMP 的设计使其可以兼容 IGMPv1,接下来对其进行简单介绍。实际的程序执行动作,感兴趣者可阅读相关资料。
IGMPv2主机运行于IGMPv1路由器网络
IGMPv1路由器:发送Max Response Time = 0的查询报文。(实际上IGMPv1的查询报文无该字段,仅有unused)。而IGMPv2主机强制认为该查询报文的Max Response Time为10s。
并且IGMPv1路由器程序会在接口定义一个变量。该变量描述了
IGMPv2主机:当查询者为IGMPv1路由器时,主机抑制离组报文的发送。

IGMPv1路由器和IGMPv2路由器混合组网
路由器默认使用IGMPv2协议,但查询者必须使用IGMPv1进行通信。此时发送Max Response Time = 0的查询报文,并忽略离组报文。

IGMPv1主机和IGMPv2主机混合组网
IGMPv2主机:可被IGMPv1主机的成员关系报告抑制。
IGMPv2路由器:收到IGMPv1的成员关系报告时,启动一个IGMPv1主机生存超时定时器。该定时器用于记录网络中存在IGMPv1主机。

>.< 好像没啥用…>.<

IGMPv2忽略IGMPv1主机网络的离组报文,不发送特定组查询报文。

简单来说就是统一降为IGMPv1使用。

点击此处回到目录

3.4.IGMP-Snooping和静态加组功能

在这里插入图片描述//igmp-snooping enable 使能 IGMP-Snooping 功能。
在这里插入图片描述//igmp-snooping learning vlan 用于在接口下使能 VLAN 的 IGMP Snooping 学习功能,默认接口的转发表项动态学习功能处于使能状态。

自动换行在这里插入图片描述//igmp static-group 也可用于成员端口静态加组,这种情况适用于哑终端加组场景。

IGMP-Snooping,也即 IGMP 探测功能,主要用于解决二层网络的组播包泛洪问题。开启了 IGMP-snooping 功能的交换机可以将组播报文仅发送至特定端口。
这里新出现了2个概念

路由器端口:从交换机的该端口可以路由器。交换机接受从该端口发来的组播报文的接口;
(组播组)成员端口:从交换机的该端口可以通向主机。交换机将组播报文发送至该端口。

Q:设备如何判定端口类型
A:收到源地址不为0.0.0.0的IGMP普遍组查询报文或PIM Hello报文被视为动态路由器端口;收到IGMP Report报文的接口,被视为动态成员端口。
在这里插入图片描述//使能动态学习路由器端口。默认已使能。
也可进行静态配置
在这里插入图片描述//配置静态路由器端口。缺省情况下,端口为动态路由器端口。
在这里插入图片描述//禁止VLAN内收到的Report和Leave报文向配置有静态组的上游路由器接口转发。

IGMP-snooping原理
交换机通过自己接收到的成员关系报告报文和查询报文,确定相应的成员端口和路由器端口。在本地维护相应的2层表项。

1@收到查询报文
向VLAN内除接收接口外的其他所有接口转发。并且如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器,如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。

在这里插入图片描述//修改动态路由器端口老化时间,默认180s。
成员端口老化时间与先前的组关系报告间隔一致=健壮系数*查询间隔+查询响应间隔。因此默认=130s。

2@收到成员关系报告报文
向VLAN内所有路由器端口转发。从报文中解析出主机要加入的组播组地址。
如果不存在该组对应的转发表项,则创建转发表项,将该接口作为动态成员端口添加到出接口列表中,并启动老化定时器。
如果已存在该组对应的转发表项,但出接口列表中未包含该接口,则将该接口作为动态成员端口添加到出接口列表,并启动老化定时器。
如果已存在该组所对应的转发表项,且出接口列表中已包含该动态成员端口,则重置其老化定时器。

交换机在启动了IGMP Snooping后,会为相应的成员端口创建相应的表项维护相应的定时器。如果交换机仍然将其他组成员的成员关系报告报文在局域网内泛洪,很可能导致IGMP Snooping表项中其他成员端口信息老化删除。
为了避免这一情况发生,交换机应当仅将成员关系报告报文发送给路由器端口。因此,实际意义上的主机成员关系报告抑制机制在IGMP Snooping场景下是失效的。非IGMP Snooping场景下不存在该表项,交换机动作是将组播包在除组播入接口外的其他接口泛洪。

3@收到离组报文
如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,将其直接丢弃。
如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内所有路由器端口转发。

此时组播路由器会发送查询报文,成员端口
如果收到了主机响应IGMP特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器。
如果没有收到主机响应IGMP特定组/源组查询的报告报文,则表示接口下已没有该组成员,则在老化时间超时后,将接口从该组的转发表项出接口列表中删除。

需要注意的是
@收到离组报文的成员端口老化时间=健壮系数*查询间隔。
@启用了IGMP-Snooping之后,查询者发送的特定组查询报文向该特定组转发。

交换机也可以进行IGMP-Snooping代理
主要用于在2层设备之间启用IGMP的相关功能,以降低3层组播的性能压力。代替上游设备发送IGMP Query消息,报文上送功能可以代替上游设备接收并且终结下游用户IGMP Report/Leave消息。
除非组播组无组成员,否则不向路由器转发离组报文。

在这里插入图片描述//需要注意的是上游设备上配置静态组播组,否则加组报文无法触发形成相关表项。
在这里插入图片描述//禁止向此接口发送IGMP查询报文,避免IGMP查询器重新选举。因为IGMP Snooping Proxy功能或者IGMP Snooping Querier功能,设备会定时以广播的方式向VLAN/VSI/BD内所有接口发送IGMP查询报文。

IGMP-Snooping,IGMP Proxy和IGMP-Snooping Proxy的区别:都用在大2层组播环境下。
IGMP-Snooping:主要在于嗅探,也即交换机解析相应的IGMP报文信息建立相应的2层表项。通过嗅探建立的二层表项,交换机可以控制组播流的2层转发从而避免将组播流发送到无组成员的成员端口下
IGMP Proxy:主要在于代理,也即交换机对终端表现为组播路由器而对组播路由器表现为主机。代理设备不透传IGMP协议报文,而是分别“伪造”相应的IGMP信息对上对下发送IGMP消息
IGMP-Snooping Proxy:实现功能相同伪造相应的报文。IGMP Snooping Proxy用于2层交换机上实现相应功能,IGMP Proxy可用于3层交换机/路由器上实现相应功能。也即IGMP Proxy可以跨网段进行代理

在这里插入图片描述//开启IGMP的代理功能。
Cisco有私有CGMP协议也可以实现类似的功能。

3.5.IGMP SSM Mapping功能

主要是为IGMPv1和IGMPv2主机兼容SSM模型使用,将其原有的 (*,G)任意源组播组 更改为 (S,G)特定组播组

在这里插入图片描述igmp-snooping ssm-mapping enable。
在这里插入图片描述igmp-snooping ssm-mapping 或者
在这里插入图片描述ssm-mapping。

点击此处回到目录

4.IGMPv3-RFC3376

IGMPv3 协议主要定义于2002年发布的《RFC3376:Internet Group Management Protocol, Version 3》,此处仅作简单说明不对具体内容进行解析。感兴趣者可查阅原文。

IGMPv3 主要适用于 SSM 模型,该模型可以使主机只对特定组播组进行选择。因此IGMPv2 实际上建立的是 (*,G) 表项,接收所有组播源发送的组播组流量。IGMPv3 运行指定接收特定 (S,G) 的组播流量。主机也可加入多个组播组。
因此IGMPv3的重点在于如何对组播源进行过滤。

4.1.IGMPv3报文格式

IGMPv3查询报文格式和成员报告格式
在这里插入图片描述
Type:IGMPv3类型,8bits。取
0x11== 表示查询报文;
0x22== 表示成员报告报文;
Group Address:欲查询的组播组的地址,32bits。
S:仅对路由器生效,1bit。取1时标识所有收到此查询消息的其他路由器不启动定时器刷新过程。
QRV:健壮变量,3bits。如果发送者本地配置超过7则置0。而接收者收到QRV=0的查询报文时,取本地配置值。
QQIC:Querier’s Query Interval Code查询者的查询间隔,8bits。
Number of Source:发送组播报文的源地址数量,16bits。实际值受MTU影响。
Source Address:发送组播报文的源地址。用于实现对源地址进行过滤。

RFC3376 的 4.1.1 章节对 Max Resp Time定义了新的算法:

  • If Max Resp Code < 128, Max Resp Time = Max Resp Code;
  • If Max Resp Code >= 128,Max Resp Time 代表一个浮点值。其中 1 字节的 Max Resp Code 被拆分为如下字段:在这里插入图片描述此时有位运算公式,Max Resp Time = (mant | 0x10) << (exp + 3)。
    举例:当此字段取值为 0x89 = 1000 1001,经位运算后应为1100 1000,也即为200 (20s)。

IGMPv3的查询报文实际上可分为三种
1@通用组查询:Group Address和Number of Sources都置0。
DIP=224.0.0.1
2@特定组查询:Group Address携带所感兴趣的组播IP,Number of Sources置0。
DIP=感兴趣的组播地址
3@特定组和源查询:Group Address携带所感兴趣的组播IP,Source Address携带所感兴趣的组播源。
DIP=感兴趣的组播地址

在这里插入图片描述IGMPv3通用组查询报文报文示例。

自动换行
IGMPv3的成员报告消息
在这里插入图片描述
Number of Group Record:Group Record数量,16bits。
Group Record:主机向组播路由器发送的报告消息,可变长。

对于 IGMPv3 协议需要注意
1@:IGMPv3成员关系报告的DIP发生改变,为224.0.0.22。该地址只有路由器进行监听,主机不关心其他成员的加组状态。这也意味者 IGMPv2 支持的组成员关系抑制功能消失
2@IGMPv3不在有明确的离组报文的定义。其离组效果由IGMPv3的成员报告消息中Group Record字段包含的include和exclude信息所替代。例如,IGMPv3主机可以通过发出的成员报告消息中Group Record字段来声明自己加入特定组播组。那么这实际上也意味这自己离开了其他组播组。
3@:IGMPv3 协议报文新增了健壮系数和查询间隔。虽然增加了这两个字段,但实际上也不用于协商只是通知非查询者以该参数进行表项维护。

自动换行
IGMPv3成员报告报文的Group Record
一个组播组,多个发送该组播报文的源地址。
IGMPv3定义了丰富的主机状态,较为复杂。
在这里插入图片描述
Record Type:Group Record 消息的类型,8bits。并有如下分类
MODE_IS_INCLUDE=1:接收源地址列表包含的源发往该组的组播数据。源地址列表为空,本字段无意义。
MODE_IS_EXCLUDE=2:不接收源地址列表包含的源发往该组的组播数据。

Record Type=1和2时表示当前状态记录Current-State Record。用于响应接口上收到的查询。

CHANGE_TO_INCLUDE_MODE=3:过滤模式由 EXCLUDE 转换到 INCLUDE,接收源地址列表包含的新组播源发往该组播组的数据。如果指定源地址列表为空,主机离开组播组。
CHANGE_TO_EXCLUDE_MODE=4:过滤模式由 INCLUDE 转换到 EXCLUDE,拒绝源地址列表中新组播源发往该组的组播数据。

Record Type=3和4时表示过滤模式改变记录Filter-Mode-Change Record。IP组播监听者(通常指主机)的组播地址的过滤模式发生变化时发送。

ALLOW_NEW_SOURCES=5:在现有的模式上添加组播源。include时表示请求多加入组播源;exclude时加入剔除组播源列表,也即实际表示退出组播源。
BLOCK_OLD_SOURCES=6:退出组播源。include模式将组播源退出;exclude模式则表示加入剔除列表,也即实际表示退出组播源。

Record Type=5和6时表示源列表改变记录Source-List-Change Record。IP组播监听者的加组状态改变与查询者的接口状态条目的不一致时发送。

Aux Data Len:辅助数据长度。含有在组记录中的辅助数据的实际长度,8bits。
Number of Sources:发送组播报文的源地址数量,16bits。
Multicast Address:欲加入 的组播组的地址,32bits。
Source Address:发送组播报文的源地址。用于实现对源地址进行过滤。

在这里插入图片描述IGMPv3成员关系报告报文示例。

4.2.IGMPv3原理

主机行为
IGMPv3的一大改进在于,主机可以主动进行组播选择也即源过滤行为。
1@:当主机选择include模式时,表示只接收自己所选择的组播源及该组播源发出的组播报文;
2@:当主机选择exclude模式时,表示不接受自己所选择的组播源及该组播源发出的组播报文,接收其他。
3@:过滤模式改变记录则表示主机更改了加入模式,目前没有应用。
4@:源列表改变记录则表示在原有基础上进行组播信息的添加。包括新加入组播源组播组或新退出组播源组播组。

组播路由器行为
路由器根据接收到的成员关系报告报文,在本地维护相应的表项。
并在收到exclude等模式成员关系报告时,发送特定源和特定组查询报文。

点击此处回到目录

5.IGMPv2实例

5.1.IGMPv2实例

IGMP的配置较为简单,这里以下图为实例进行说明。
在这里插入图片描述

AR1:
multicast routing-enable
#
interface GigabitEthernet0/0/0
 ip address 10.2.2.1 255.255.255.0 
 pim dm
#
interface GigabitEthernet0/0/1
 ip address 192.168.1.100 255.255.255.0 
 pim dm
 igmp enable
#

这里选择的是 IGMP 的默认参数,因此配置简单。可以点击此处查看相关参数的更改。

5.2.状态查看

在这里插入图片描述display igmp interface 用于查看接口下使能的IGMP参数信息。

自动换行
在这里插入图片描述display igmp group用于查看主机加组情况。

更新

点击此处回到目录

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐