个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将在IGMPv2协议报文的基础上进行介绍,以详细介绍主机-路由器IGMP组播协议。IGMPv1和IGMPv3则只进行比对介绍。
- 关于IGMPv2相关内容,可参考1997年发布的RFC2236。
- 关于路由器组播路由协议相关内容,可参考博客 – 组播PIM-原理介绍+报文分析+配置示例。
- 关于域间组播路由协议相关内容,可参考博客 – 组播MSDP-原理介绍+报文分析+配置示例–RFC3618。
- 关于IPv4 组播地址空间分类,可参考IANA的IPv4 Multicast Address Space Registry。
组播是一种介于单播和广播报文的报文传播方式。这里不做过多介绍,直接进入相关内容介绍。
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无类域间路由和VLSM可变长子网掩码的出现淡化了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。
常用协议组播地址:
组播地址 使用者 224.0.0.1 所有主机及路由器监听地址 224.0.0.2 所有路由器监听地址 224.0.0.4 DVMRP协议使用 224.0.0.5
224.0.0.6OSPFv2协议使用 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协议使用
1.2.组播MAC
MAC地址为48bits,6字节。
1@第1个字节的最后1个bit=1,表明该MAC为组播MAC。否则表明为单播MAC。
2@并且MAC地址的前3个字节24bits称为OUI厂商标识,需要向IEEE购买分配。后24bits,由厂家自行分配。
3@组播MAC由于没有明确的目的主机,因此规定组播MAC由组播IP映射而来。映射规则如下:
组播MAC的高24bit=0x01005e;
组播MAC的第25位bit固定为0;
组播MAC的剩余后23bit由组播IP的后23bit直接对应而来。
组播IP实际上有32-4=28bits,因此存在5bits数据无法进行对应
因此实际上每2^5=32个组播IP对应一个组播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。
自动换行
对于IPv6的MIP和MMAC,情况稍有变化:
IPv6组播MAC地址的高16位为0x3333,低32位为IPv6组播地址的低32位。
常用的IPv6组播地址为ff00::/8。感兴趣者可查阅相关资料。
此外还有协议规定组播MAC:
01-80-c2为IANA规定的协议组播MAC。
例如01-80-c2-00-00-00用于BPDU组播MAC,集成ISIS使用01-80-c2-00-00-14和01-80-c2-00-00-15等
点击此处回到目录
2.IGMPv2基础介绍
IGMP协议主要用于主机和组播路由器进行组播状态协商。
2.1.IGMPv2概念
查询者Querier:发送通用组和特定组查询报文的组播路由器。并维护相应的(*,G)表项。
1@一个局域网中可能出现多个组播路由器,此时需要选举查询者路由器。
2@(S,G)用于表示组播相关内容:
S=组播源,也即组播服务器的地址。G=组播组,组播服务器提供组播服务的组播地址。(*,G)表示任意组播源。
3@IGMPv1和IGMPv2主要使用ASM模型(*,G),IGMPv3主要是为了实现SSM模型(S,G)。
健壮系数Robustness Variable:允许结果偏移预期的范围。默认=2。
查询间隔Query Interval:查询者发送通用组查询的间隔。默认=60s。路由器定期在局域网中确认有主机加入组播组以及组播组内成员的存在。
查询响应间隔Query Response Interval:对通用组查询报文的响应间隔。取值=(0,最大响应时间Max Response Time]。最大响应时间Max Response Time默认=100(单位0.1s)
路由器允许主机对查询报文进行相应的时间。
主机实际上在本地生成一个(0,最大响应时间Max Response Time]的随机定时器。
在定时器内进行IGMP响应后或受抑制后清除该定时器。
如果主机未进行响应则认为该局域网设备已全部离组。
组关系报告间隔Group Membership Interval:组播路由器确定网络上不再有组成员之前必须经过的时间量。取值=健壮系数*查询间隔+查询响应间隔。因此默认=130s。
IGMPv2为主机定义的离组时间。如果主机在130s内都没有进行回应,认为主机离组。
适用于路由器没有正常接收主机的离组报文情形。
其他查询者生存间隔Other Querier Present Interval:其他查询者发现网络中不存在查询者的等待时间。取值=健壮系数*查询间隔+查询响应间隔/2。因此默认=125s。
在IGMP网络中,查询者和非查询者都维护相同主机加组的表项。
因此其他查询者生存间隔125s应当比组关系报告间隔130s短,
以防止非查询者升级为查询者时主机表项清除。
启动查询间隔Startup Query Interval:查询者在首次启动时发送通用查询前的等待间隔。默认=查询间隔/4,也即15s。
启动查询数Startup Query Count:查询者在首次启动时每间隔启动查询间隔发出的通用组查询报文数。默认=健壮系数。
最后成员查询间隔Last Member Query Interval:收到成员离组后,发送特定组查询报文的最大响应间隔时间。默认=1s。
最后成员查询间隔数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的8.11章节定义的主机在收到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的unsed字段必须取0,而IGMPv2的相应位置字段必须不为0。当为0时表示为IGMPv1。
从报文字段可以看出IGMP报文并不携带许多关键信息,因此对IGMP相关处理还是依赖设备自身的程序设置。
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。
IGMPv2的离组报文例子
IP:SIP为自己接口IP,DIP为组播IP=224.0.0.2。
224.0.0.2为所有路由器组地址,这里用于通知所有路由器主机已离组。。
Type=0x17:标识自己为离组报文。
IGMPv2的Max Resp Time:此时必须置0。
IGMPv2的Multicast Add:表示自己所要退出组播组的组播地址。
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:表示自己所要退出组播组的组播地址。
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报文时有一些特性。
IGMPv2的主机抑制
IGMPv2的主机对路由器的查询报文进行响应时,在本地启动的一个随机数定时器。
取值范围为(0,最大响应时间]。
最大响应时间由组播查询者定义,并在IGMPv2报文中通告。
在定时器为0时发送相应的响应报文。目的地址为加入组播组的IP。同时其他主机也监听来自该组播组地址的数据。
当其他主机监听到自己所加入组的响应报文时,如果本地计时器未清零则清除本地的定时器并不在发送IGMP响应报文。
发送该响应报文的主机称为最后组播组成员。
注意!因为启动的是随机数,该成员并不一定总是组播组的最后一个成员。
IGMPv2的主机离组和特定组查询
IGMPv2主机在离组时,通常发送IGMPv2离组报文。但是如果主机记录了最后组播组成员,则该主机在离组时认为自己所加入的组播组中存在其他成员。因此不发送IGMPv2离组报文。
同样的组播路由器如果也记录了最后组播组成员,则在接收(组播组中的)非最后组播组成员的离组报文时不发送(该组播组的)特定组查询报文。
也即主机/路由器记录了上一次通用组查询的主机响应者信息后,在后续离组和特定组查询可省略部分特性。
这一功能属于附加功能,未强制要求遵守。
IGMP的查询者选举
从报文来看IGMP并不包含相应的查询者信息,因此在组播路由器上对查询者的选举做如下定义:
1@IGMPv1的查询者借用组播路由协议PIM的DR角色承担。
2@IGMPv2/的查询者选举使用发送IGMPv2查询报文的IP。当有多个组播路由器时,选择发送接收者的较小一个。由于报文也不包含相关的协商信息,因此也支持抢占。
其他非查询者在本地启动一个其他查询者生存间隔Other Querier Present Interval定时器。取值=健壮系数*查询间隔+查询响应间隔/2。因此默认=125s。
如果在该时间内没有监听到来自224.0.0.1的查询报文时,自己成为查询者。
点击此处回到目录
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章描述了主机所具有的状态机。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@清除定时器:定时器相关功能完成,将定时器清除。
如下图描述了主机状态切换:
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功能。//接口下使能VLAN的IGMP Snooping学习功能,默认接口的转发表项动态学习功能处于使能状态。
IGMP-Snooping也即IGMP探测功能主要用于解决2层网络的组播包泛洪问题。开启了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)特定组播组。
或者
点击此处回到目录
4.IGMPv3
IGMPv3主要适用于SSM模型,该模型可以使主机只对特定组播组进行选择。因此IGMPv2实际上建立的是(*,G)表项,接收所有组播。IGMPv3则是(S,G)接收特定的组播源。主机也可加入多个组播组。
因此IGMPv3的重点在于如何对组播源进行过滤。
4.1.IGMPv3报文格式
IGMPv3协议可适用于SSM组播模型。
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:发送组播报文的源地址。用于实现对源地址进行过滤。
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的成员报告消息:
Number of Group Record:Group Record数量,16bits。
Group Record:主机向组播路由器发送的报告消息,变长。
从报文上可以看出IGMPv3不在有明确的离组报文的定义。
并加入了健壮系数和查询间隔。虽然增加了这两个字段,但实际上也不用于协商只是通知非查询者以该参数进行表项维护。
有一个需要注意的是IGMPv3成员关系报告的DIP发生改变,为224.0.0.22。该地址只有路由器进行监听,主机不关心其他成员的加组状态。
–组成员关系抑制功能消失。
离组报文由成员关系报告的include和exclude概念所替代。
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没有通常意义上的离组报文,但是可以通过主机的成员关系报告来告知路由器自己离开响应的组播组。
IGMPv3报文示例:
查询报文:成员关系报告报文:
IGMPv3同样可以兼容IGMPv1和IGMPv2。
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的默认参数,因此配置简单。可以点击此处查看相关参数的更改。文章来源:https://www.toymoban.com/news/detail-414405.html
5.2.状态查看
//查看接口下IGMP信息
//查看主机加组情况文章来源地址https://www.toymoban.com/news/detail-414405.html
到了这里,关于组播IGMP-原理介绍+报文分析+配置示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!