个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将在IGMPv2协议报文的基础上进行介绍,以详细介绍主机-路由器IGMP组播协议。IGMPv1和IGMPv3则只进行比对介绍。

关于IGMPv2相关内容,可参考1997年发布的RFC2236。
关于路由器组播路由协议相关内容,可参考博客组播PIM-原理介绍+报文分析+配置示例。
组播是一种介于单播和广播报文的报文传播方式。这里不做过多介绍,直接进入相关内容介绍。
IGMP主要用于IPv4网络的主机和路由器间的组播协议,这里主要介绍IGMPv2。IPv6网络主要使用MLD协议。
第2和第3.1章节基本描述了IGMPv2的相关内容,可直接阅读相关内容。
IGMP
传统分类网络进行地址分配时,将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
前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==预留永久组播地址
//通常为协议所使用,例如OSPFv2使用224.0.0.5和224.0.0.6
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。
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.129.0.1、226.129.0.1、…、239.129.0.1具有相同的组播MAC。
此外还有协议规定组播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等
点击此处回到目录
IGMP协议主要用于主机和组播路由器进行组播报文协商。
查询者Querier:发送通用组和特定组查询报文的组播路由器。并维护相应的(*,G)表项。
1@一个局域网中可能出现多个组播路由器,此时需要选举查询者路由器。
2@(S,G)用于表示组播相关内容:
S=组播源,也即组播服务器的地址。G=组播组,组播服务器提供组播服务的组播地址。(*,G)表示任意组播源。
3@IGMPv1和IGMPv2主要使用ASM模型(*,G),IGMPv3主要是为了实现SSM模型(S,G)。

查询间隔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。
启动查询数Startup Query Count:查询者在首次启动时每间隔启动查询间隔发出的通用组查询报文数。默认=健壮系数。
最后成员查询间隔Last Member Query Interval:响应特定组查询报文的最大响应时间。默认=1s。
最后成员查询间隔数Last Member Query Count:查询者认为组成员中无成员而发出的特定组查询报文的间隔。默认=健壮系数,也即为2。
最后成员查询间隔Last Member Query Interval和最后成员查询间隔数Last Member Query Count
用于组播路由器在主机离组后向该组内确认是否还有成员存在。
也即每1s发送一次特定组查询,没有响应再发送1次。
2次都没有主机响应则认为该组中不在存在成员,删除(S,G)表项。
非响应报告间隔Unsolicited Report Interval:主机初始加组时主动发送组成员关系报告的间隔。默认=10s。
IGMPv1路由器生存超时时间Version 1 Router Present Timeout:主机在收到IGMPv1查询报文后,继续等待IGMPv1查询报文的最大时间。超过此时间,则认为系统应发送IGMPv2查询报文。默认=400s。

以上概念IGMPv2和IGMPv3通用。
首先报文从数据链路层对报文进行介绍
数据链路层: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所有路由器组播组,只有路由器对该地址进行监听;
普通组播源组播组 == 主机所监听,也即主机所需获得的相应组播源地址。
有一个需要注意的是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完全可以进行兼容。
那么协议如何分别报文时IGMPv1还是IGMPv2?
Answer: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。
由于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的查询报文时,自己成为查询者。
点击此处回到目录
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的运行逻辑,可不看第三章剩余内容。
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@清除定时器:定时器相关功能完成,将定时器清除。
如下图描述了主机状态切换:
RFC2236的第7章描述了路由器所具有的状态机。在此进行介绍:
路由器存在三种角色:查询者和非查询者。
并定义三个事件用于触发路由器角色的切换:
1@查询定时器触发:查询定时器为查询间隔,默认60s。计数完成时放查询报文。
2@收到具有更小IP的查询报文:查询者路由器收到了SIP比自身接口地址更小的查询报文。此时查询者向非查询者角色过渡。
3@其他查询者生存定时器触发:非查询者监控网络中存在查询者的定时器。取值其他查询者生存间隔Other Querier Present Interval,也即为125s。
基于以上三个事件,路由进行相应三个动作进行程序处理:
1@启动通用组查询定时器:取查询报文间隔,默认60s。
2@启动其他查询者生存定时器:非定时器用于监控网络中查询者的存活。
3@发送通用组查询报文:向网络中所有设备224.0.0.1发送通用组查询报文。
相应的处理动作如下:
IGMPv2还定义了对不同报文的处理动作:
由于IGMPv2可以兼容IGMPv1,涉及程序处理较为复杂。暂不相关处理流程做介绍,感兴趣者可阅读相关资料。
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使用。
点击此处回到目录


IGMP-Snooping也即IGMP探测功能主要用于解决2层网络的组播包泛洪问题。开启了IGMP-snooping功能的交换机可以仅将组播报文发送至特定端口。
这里新出现了2个概念:
成员端口:从交换机的该端口可以通向主机。交换机将组播报文发送至改端口;
路由器端口:从交换机的该端口可以路由器。交换机接受从该端口发来的组播报文的接口。
IGMP-snooping原理:
交换机通过自己接收到的成员关系报告报文和查询报文,确定相应的成员端口和路由器端口。在本地维护相应的2层表项。
1@收到查询报文:
向VLAN内除接收接口外的其他所有路由器接口转发,并且如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器。
如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。
动态路由器端口老化时间180s。

2@收到成员关系报告报文:
向VLAN内所有路由器端口转发。从报文中解析出主机要加入的组播组地址。
如果不存在该组对应的转发表项,则创建转发表项,将该接口作为动态成员端口添加到出接口列表中,并启动老化定时器。
如果已存在该组对应的转发表项,但出接口列表中未包含该接口,则将该接口作为动态成员端口添加到出接口列表,并启动老化定时器。
如果已存在该组所对应的转发表项,且出接口列表中已包含该动态成员端口,则重置其老化定时器。
从原理上看交换机只记录特定端口列表,并且成员关系报文只发往路由器端口。
此时成员关系报告抑制功能消失。
3@收到离组报文:
如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,将其直接丢弃。
如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内所有路由器端口转发。
此时组播路由器会发送查询报文,成员端口
如果收到了主机响应IGMP特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器。
如果没有收到主机响应IGMP特定组/源组查询的报告报文,则表示接口下已没有该组成员,则在老化时间超时后,将接口从该组的转发表项出接口列表中删除。
此时交换机也可以代理进行IGMP查询
此外IGMP的路由端口可静态配置:


成员端口也可静态加组:这种情况适用于哑终端加组场景。

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

或者
点击此处回到目录
IGMPv3主要适用于SSM模型,该模型可以使主机只对特定组播组进行选择。因此IGMPv2实际上建立的是(*,G)表项,接收所有组播。IGMPv3则是(S,G)接收特定的组播源。主机也可加入多个组播组。
因此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。
主机行为:
IGMPv3的一大改进在于,主机可以主动进行组播选择也即源过滤行为。
1@:当主机选择include模式时,表示只接收自己所选择的组播源及该组播源发出的组播报文;
2@:当主机选择exclude模式时,表示不接受自己所选择的组播源及该组播源发出的组播报文,接收其他。
3@:过滤模式改变记录则表示主机更改了加入模式,目前没有应用。
4@:源列表改变记录则表示在原有基础上进行组播信息的添加。包括新加入组播源组播组或新退出组播源组播组。
组播路由器行为:
路由器根据接收到的成员关系报告报文,在本地维护相应的表项。
并在收到exclude等模式成员关系报告时,发送特定源和特定组查询报文。
点击此处回到目录
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的默认参数,因此配置简单。可以点击此处查看相关参数的更改。
\查看接口下IGMP信息
\查看主机加组情况
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-