基于针对组播IGMP协议,来自自己早些年的笔记中的分享,还存在许多的不止,比如后续的SSM 也需要去重新补充,而且话术可能有点存在啰嗦或者不简洁明了的情况,难免会存在些许错误,后续本人将重新攥写本文。
1.2和1.3章节都是用来讲述组播组地址的,组播组地址是扁平化地址,没有所谓的掩码,但如果有,那么就是/32位的。组播D类地址范围是224.0.0.0~239.255.255.255,一个组播组就是一个IP地址,这并不代表某个具体的主机PC,而是表示接受一些系列系统的集和,主机加入某个组播组,则表明他会接受目的为该组播IP地址的报文。
PS. 如果说传统的ABC类地址是链路或者PC地址,那么组播D类地址就算是一个小房间一般,它并不能被PC或链路所使用(链路中采用这个地址来作为互联地址),它就像是小房间,你想要接受这个房间的数据,那么就加入这个房间中,不想要接受了,退出房间就好了。在房间里的时候,有人问,目的地址是XXX(你所在这个房间),那么你会接受这类报文。
组播IP地址:224.0.0.0~239.255.255.255
永久组地址:224.0.0.0~224.0.0.255
永久组地址保持不变,成员数量任意,为0不取消。
临时组地址:
临时分配的IP地址,组成员数量为0,就取消。
域间组播地址:概念还不确定。待填写
224.0.0.1 网络中的所有设备
224.0.0.2 网络中的路由设备
IPv4组播MAC地址,前24位地址0100 5E,第25位恒为0,后23位于IP地址后23位,一一对应。
v6组播MAC地址,将组播地址的后32位提取,然后在前面添加3333。
ASM模型和SSM模型我特定独立一个章节赘述。
IGMPv1,v2支持ASM模型 ;v3支持SSM模型
并不是根据IP地址来记录,而是根据最近回应Report的设备来记录,新到的设备会顶替旧的
当接收者收到特定组查询后谁先响应的接收者就为last reporte 发送或回应了查询器发来的Query,将会成为Last Reporter
IGMP是运行在组播接收者和与PC直连的组播路由器间的协议,PIM是路由器于路由器之间的协议。Internet Group Managerment Protocol 。通过交互IGMP报文,让最后一跳路由器知道自己身后是否存在组成员;不存在就不发送,存在就延伸树形结构并将组播发送给组播组成员。
v1中中定义了基本的组成员查询和报告过程;支持ASM模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
字段 | 说明 |
---|---|
Version | 版本号,为1 |
Type | 报文类型。0x11:普遍组查询消息,0x12成员报告消息 |
Reserved | 在IGMPv1中,该字段在发送时被设为0,并在接收时被忽略。 |
Checksum | 校验和,该字段在进行校验计算时设为0。当传送报文的时候,必须计算该校验字并插入到该字段中去。当接收包的时候,该校验字必须在处理该包之前进行检验。 |
Group Address | 组地址 |
普遍组查询信息General-Query (0x11)
查询器周期性发送,缺省60秒(范围60~120),目的地址为224.0.0.1,TTL为1,老化时间180秒。本地网络上的所有主机和路由器都能识别和接收,Group字段全为0,表示不指定组播组。路由器给主机发送Query报文,主机发送应答Report后,会在本地形成IGMP Group查询表,老化时间超时,将删除对应表项。
查询器:依赖于PIM DM的DR,靠着DR的选举来决定谁是查询器,IGMPv1中并没有查询器机制,无法选举
报告消息Report(0x12)
由PC接收方主机发送,发送的组播组地址为,PC所加入的组播组地址。用于加入某个组播组或者应答查询的相应报文。
Report的组播组地址就是他想要加入的,例如想要Join 239.1.1.1 那么DIP就是这个了
1、主动通告情况
主动通告情况就是,PC接收端,在电脑上主动的去浏览爱奇艺等视频网站,此时,就会主动向路由器发送report,告诉路由器,我现在想要接收发往组播组地址X.X.X.X的组播组的应用。
2、针对查询包的应答情况
PC收到路由器所发送的Query报文后,想要发送Report应答,来告知路由器,我的存在。
但此时就有一个问题存在,一个组播组中的数量是不可估量的,那么大家PC,每个人都需要回应,同样的Report嘛?
IGMP report supress优化机制:一台PC收到了路由器发送 的Query,不会立即回应Report,而是开启一个抑制计时器,范围1~10s的整数秒,在计时器过期后,将会回应Report,当同一组的其它成员侦听到该报文后,不再发送针对相同组播组的报告,即报告被抑制。
注:IGMPv1缺少选举查询器机制,依靠于PIM路由器选举出的DR来作为查询者,查询者存在VRRP等冗余情况时,优先比较PIM DR优先级,相同时比较IP地址,大者成为DR。
该值是定义可能发生的网络丢包而设置的查询报文重传次数,健壮系数会影响组成员关系的超时时间,默认值为2.
默认超时时间为 IGMP普遍组查询报文间隔 x 健壮系数 + 最大查询相应时间。即130秒
interface g0/0/0
igmp robust-count X 可通过命令调节健壮系数
分为两种情况,一种是主机主动发送给组播查询器,用于主动申请加入某个组播组的报文;另一个是收到IGMP普遍组查询报文后,被动相应请求
假设为两种情况,一种是新成员设备接入进网络,没有在网段内侦听到想要接收组的组播数据。一种是侦听到了
没侦听到:没侦听到想要接收的组播组数据,则不再等待
因为普遍组查询是60秒周期性发送,新来的主机没有侦听到对应组的组播数据,将不等待普遍查询报文的到来,立即发送针对对应组播组G3的报告报文。路由器收到报告报文后,将会生成组播转发项(*,G3)
三个普遍组报文查询周期内 没有收到成员发送的响应报文,则认为没有组成员存在
注:IGMP理论为3个查询周期内,华为实现为130秒,即IGMP普遍组查询报文间隔 x 健壮系数 + 最大查询相应时间。
退出组播组的主机将不再反馈Report消息。主机A退出组播组224.0.1.1
当General-Query消息到来时,主机A不再启动定时器Timer-X,不再发送针对该组的Report消息。然后等待3个hello周期,180秒,路由器将删除对应表项。
RFC中是3倍的HELLO周期,华为中是两倍+最大响应时间,那么就是120+10
dis igmp group
Interface group report information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.12.254):
Total 1 IGMP Group reported
Group Address Last Reporter Uptime Expires
239.1.1.1 10.1.12.1 00:30:18 00:01:52
Last Reporter只会也仅会记录一个
**说明:**组239.1.1.1还剩余1min52秒过期,初始时间是130秒,只要当前网段还存在接收者,该过程时间不会小于70秒(因为每经过60秒,查询者都会发送普遍查询报文,收到IGMP相应后,计时器被刷新复位。而如果主机突然下线,在该计时器过期的130秒,路由器还是会一直向G0/0/0接口转发该组的组播组数据。
组成员关系维护
查询器周期性(缺省60s)发送普遍组查询报文Query
,主机应答即可。
新组成员加入
普遍组查询和响应过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1、查询器发送Query查询报文,向网段内查找有意向接收组播组流量的成员,目的地址是224.0.0.1(网段内的所有主机和路由器都会识别接收)普遍组查询报文是周期性 缺省60秒发送一次
2、主机都接收到该查询报文,将会开启对应组的定时器G1-Timer,定时器的范围是0~10的整数秒随机值,倒计时结束后的主机将会向对应组(这里意向接收的组播组是G1)回应Report,同时一直侦听该组的其他主机(即hostB)侦听到已经有Report报文回应,则停止计时器G1-Timer,不在发送针对G1-Timer的报告报文。这样报告报文只需要一个人回应即可,需要注意的是,回应这个Report的主机,将会在路由器的表项中被记录成Last Router,在IGMPv2中,只有Last Router离组才会发送离组报文,普通成员离组将会是静默离组。
3、查询器收到报告报文后,了解到本网段内存在组播组G1和G2的成员,则由组播路由协议生成(*,G1)和( *,G2)组播转发项,这个具体说明 请看上文, * 表示任意组播源。网络中一旦有组播组G1,2的数据到达路由器,将向该网段内转发。
Tips:查询器发送的Query报文 DIP为224.0.0.1,回应的主机的DIP将会是其对应的组IP,例如想要接收为239.1.1.1 那么DIP就是这个了
IGMP的作用是路由器了解到它身后是否存在组播组成员,并做好记录,通过PIM向上游设备获悉对应组播数据
v2报文相比于v1,最大的改变莫过于增加了离组报文.
在IGMPv1的基础上添加了指定组查询、组成员快速离开的机制和最大响应时间等机制;只支持ASM模型
IGMPv2可以同时管理v1和v2的主机,且V2兼容v1的成员报告消息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
字段 | 说明 |
---|---|
Type | 0x11:IGMP查询消息(包括普遍和指定);0x12:IGMPv1成员报告消息;0x16 IGMPv2成员报告消息;0x17:离组消息 |
Max Response Time | 最大响应时间,最大10秒,相应间隔0.1(小数秒) |
Checksum | 校验和,IP报文的整个有效负载长度,16位校验和 |
Group Address | 组地址,在加入报文或离组报文中,该地址为成员主机要加入/离开的组播组地址 |
报文保留了v1的两个报文,新增加了v2的Report和离组信息。
查询报文又分为了常规和特定组,常规查询就是目的地址全0,特定组就是DIP是 要查询的组地址
V2报文在V1的基础之上增加了指定组查询以及最大响应时间
成员查询报文(0x11)
普遍组查询General-Query
查询者每60s发送一次查询报文,初次成为查询者时,前两次报文间隔15s,其他间隔60s
指定组查询Group-Specific Query
指定组查询报文用于查询某个组播组中是否还存在成员。仅当一个组的Last Reporter离组时,才会触发 指定组查询并且会发送两次查询,间隔为1秒(时间可调控),此特定组查询的最大响应时间为1s
注:如果是存在IGMP Snooping的情况,成员主机都认为自身是Last Reporter,离组时都会发送。(存疑)
最大响应时间
成员主机在收到查询报文后,必须在最大响应时间内做出报文回应。在普遍组报文中,为10s,指定组查询中,为1s
成员关系查询Query (0x11)
由查询器周期性发送,缺省60秒(范围60~120),目的地址为224.0.0.1,TTL为1,老化时间180秒。本地网络上的所有主机和路由器都能识别和接收,Group字段全为0,表示不指定组播组。路由器给主机发送Query报文,主机发送应答Report后,会在本地形成IGMP Group查询表,老化时间超时,将删除对应表项。
同V1一样
该组有成员离组时,查询该组是否还有剩余成员存在
IGMPv1成员Report查询(0x12)
由PC接收方主机发送,发送的组播组地址为想要加入的组播组地址,用于加入某个组播组或者应答查询的相应报文。
V2成员关系通告报文Report(0x16)
成员报告报文是主机向查询路由器发送的报告报文,用于加入某个组播组或者应答查询的相应报文。
离组报文Leave Group Message(0x17)
主机主动离开组播组时,向路由器告知自己离开了某个组播组,DIP为224.0.0.2,本地网段上的路由器都能接收。
离组过程:
Last Reporter在关闭组直播应用后,
主机(强调描述,是Last Reporter)在关闭组播组应用时,会通过224.0.0.2的DIP,给路由器发送离组报文,路由器收到后,会立即发送 特定组查询报文,并将最大响应时间修改为1s,发送两次(思科为1次,2s),路由器在发送的2次1秒报文内,收到了主机回应的Report,会保留组播查询表项,路由器在2s内没有收到Report报文,则会立即删除对应的IGMP表项。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
路由器启动后发送常规组查询信息,收到该信息的路由器比较源接口IP地址和接收口的IP地址,低IP地址路由器成为查询器。
当有多个最后一跳路由器时,路由器之间会互相发送Query报文进行查询者选举(224.0.0.1),比较路由器的接口地址,地址小的路由器回被选举为查询者,查询者周期性60s/次的发送Query,邻居路由器超过120s没有收到Query报文,则由接口地址第二小的路由器成为查询者(IGMPv2拥有自己独立的查询器选举机制,不再依附于PIM所选举出来的DR,则与PIM选举的DR无关)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
v1的成员主机不会发送离组报文
v2主机与v1路由器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
主机开v2,路由器开v1,路由器收到离组报文,根本无法始别,就会当成无效的IGMP消息类型,并忽略他。
v2中只有Last Reporter离开才会发送离组信息,普通组成员并不会
什么是Last Reporter
PC如何知道自己是否是Last Reporter呢?PC自己会做回复,他有没有回复PC肯定清楚的
记得去看ASM和SSM区别。(我感觉v2够用了)
增加功能:成员可以指定接收或拒绝来自某个组播流的报文,实现对SSM模型支持
Query消息字段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFLMLt8z-1680307457376)(./Images/IGMPv3Query.png)]
由于支持了SSM(可以指定接收源了)所以下面多了好几个Source Address,报文也大了很多。
Type,MAX Res ,Checksum,Group Address。和v2相同,Type就只有0x11
1、保留(Resv):保留字段。发送时以0填充,接收时不做处理。
2、标志位S(禁止路由器处理):该bit位置1时,所有收到此查询消息的其他路由器不启动定时器刷新过程,但是此查询消息并不抑制查询器选举过程和路由器的主机侧处理过程。[侧处理就是,在路由器上执行普通的主机端查询的处理(当路由器作为组成员地时候)]
3、查询者的健壮变量(QRV):如果该字段非0,则表示查询者的健壮系数(或健壮值)。如果查询器的健壮值>7,则该字段将置0。路由器接收到查询消息时,发现该字段非0,则将自己的健壮值调整为该字段的值。
4、QQIC:查询器的查询间隔,单位秒。非查询器收到查询报文时,如果发现QQIC值非0,则将自己的查询间隔参数,调整为该字段的值。
5、源数量Number Of Sources:表明了该查询中存在多少个源地址,在普通组和指定组查询中,该值=0,在指定多个源查询中,这个值非0。且此参数大小受所在网络MTU大小限制。
6、源地址Source Address:x个组播源地址,其数量受N o S字段值大小限制。
Report字段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OK03Bc31-1680307457377)(./Images/IGMPv3Report.png)]
1、Type,报文类型,值为0x22。
2、Number ……,消息中包含的组记录数量。
3、Group Record,组记录。
Group Record
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LSgUk9z9-1680307457377)(./Images/IGMPv3Group_Record.png)]
Group Record消息字段说明:
1、Record Type,Group Record消息类型
2、Number of 、本记录中包含的源地址数量。
3、Multicast Add 组地址。
4、Source Address 组播源地址。
IGMPv3中有了如下改进:
1、增加了组播组成员的控制能力,v3不仅可以指定要加入哪个组,还能明确要求从那个指定组播源接收信息(因为支持了SSM)。
2、响应消息包含多组记录:IGMPv3响应消息包含的组地址为224.0.0.22,可以携带1个或多个组记录,可以包含组播组地址、数量不等的组地址信息。
3、取消了Report的抑制机制,增加了特定源查询报文;取消了离组报文,需要结合第三方协议配合离组(居然取消了Report抑制机制,不过这个机制很浪费时间,离组取消了的话,更趋向于分工合作)
IGMP运行有多个源,这样PC如果是,一个人打开了斗鱼和虎牙,那么在V1和V2中,要有两个表项,两个不同的组,然后都是双份的,但V3中,可以一个包立面,就直接表明了这个。
SSM(Source-Specific Multicast)指定源组播,要求路由器能够了解成员主机加入组播组时指定的组播源。SSM Maping的作用是为了让那些在主机上无法使用IGMPv3,但是想要指定源组播的主机所使用的,为了使其也能够使用SSM服务,路由器上就采用SSM Maping。
工作机制
通过在路由器上静态配置SSM地址的映射规则,将IGMPv1及v2报告报文中的 (*,G) 转换为对应的(S,G)信息,以提供组播服务。
Tips:缺省情况下,SSM地址范围232.0.0.0~232.255.255.255
配置了SSM Maping规则后,当路由器收到来自成员主机的v1,v2报告Report报文时,首先检查报文中所携带的组播组地址G,
1、检查组播组地址G,如果G在ASM地址范围内,则只提供ASM服务
2、如果在SSM地址范围内,则看路由器中是否存在SSM Maping规则
3、如果路由器中没有对应该G的SSM Maping规则,则无法提供SSM服务,丢弃。
有对应该G的SSM Maping规则,则依据规则将报告报文中的(*.G) 信息映射为(S,G)信息,提供SSM服务
Tips:SSM Maping不处理IGMPv3的Report报告报文,为了保证同一网段运行任意IGMP版本的主机都能提供SSM服务,路由器接口需要运行v3版本
如果一个组播组地址能够匹配到多条映射,那么都会形成对应表项。有几条规则,就生成几条表项
IGMP Snooping是用于二层设备中,因为组播IP地址和MAC地址,他无法一一对应,这样会造成224.1.1.1和223.1.1.1虽然地址不同,但是二层的MAC地址相同的,交换机可不看你IP的啊,他拆包看MAC地址就可以了,这样会导致出现不必要的麻烦,所以让交换机启用查看三层报头这个,是很有必要的,那么就是IGMP Snooping。
互连网组管理协议 嗅探IGMP Snooping:运行在二层设备上的组播约束机制,用于管理和控制组播组成员;运行IGMP Snooping的二层设备就有始别所有IGMP报文的能力,通过对收到的IGMP报文进行分析,为端口和组播IP地址建立了起映射关系表项,并根据其转发。
思科Sw默认开启IGMP Snooping功能。
版本:CGMP(初始版本,思科私有),IGMP Snooping、IGMP Snooping Proxy(代理)
report的源地址叫做USA,Unicast Source Address
目的地址叫GDA, Group Destination Address
IGMP Snooping能够让交换机记录组播IP地址所对应的成员信息。
IGMP 嗅探,强行让二层设备完成三层设备才能干的功能。让交换机能够识别IGMP报文,通过识别IGMP报文的载荷来确定,咱们那个接口连接了接收者。交换机启用即可。
当交换机启用了嗅探,收到路由器发送过来的Query报文,由于启用了嗅探,这个时候是能够知道这是一个Query报文的,交换机会把这个接口记录下来,记录成路由器接口 Host Prot(应该叫Router Port,个人觉得)交换机收到了路由器接口发送的查询报文之后,交换机将进行正常泛洪。当通过接口收到report呢,交换机也能够识别他是Report报文,这个时候会根据Report载荷中的组地址来,执行绑定记录,将载荷中的组地址的3层IP组地址,绑定到接收这个。这个是无法做Report抑制的,如果做了抑制,那我就无法知道我还有那个接口,也是连接了组员的了,Report只要发给交换机,交换机永远只会把这个报文通过路由器接口发走。当这一系列流程做完之后,交换机就会将下游PC要加入的三层组播 Group IP地址和接收Report接口做绑定,这样就形成了IGMP Snoooping 组表项,基于这个组表项,当我在通过路由器接收到Query报文的时候,我就会判断你所属的Group IP地址,来找到对应的IGMP Snooping 组表项,来做一个流量精确转发。
交换机通过PC收到Report后,会对于这个接口做记录,记录成Host Port。
当收到指定组查询后,会根据指定组查询中的 要查询组地址,然后在表项中,在对于组中泛洪。
返还了Report,那么就会发送给路由器,如果没有收到Report,那么交换机会在对应组组表现中,删除掉对应该接口的绑定表项。
因为二层交换设备收到组播包后无法识别IP,收到组播包只能进行泛洪。因为并不是交换机连接的所有接口都需要接受组播流量,或者都接收的是相同的组播流量,那么这在网络中可能造成不必要的流量传播。
IGMP-Snooping赋予二层设备识别组播报文的功能,让二层设备(交换机)生成组播MAC表,仅记录组员的信息,以后每次发包都能依靠该表项来机型。
路由器端口:
由协议生成的路由器端口叫做动态路由器端口。收到源地址不为0.0.0.0的IGMP普遍组查询报文(老化定时器180)或PIM Hello报文(老化定时器105s)的接口都视为动态路由器端口。
手工配置的路由器端口叫做静态路由器端口。
成员端口:
由协议生成的成员端口叫做动态成员端口。收到IGMP Report报文的接口,二层组播设备会将其标识成动态成员端口。
手工配置的成员端口叫做静态成员端口。
收到普遍组查询报文
向VLAN内除了接收接口外的其他所有接口转发,并做如下处理:
收到Report报文:
向VLAN内所有路由器端口转发。从报文中解析出主机要加入的组播组地址,并对接收接口做如下处理:
收到离组报文
先对其要离开的组,进行判断,判断转发表项中,是否有关于这个组的记录,以及转发表项的出接口列表,是否包含接口的接收端口。
如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接口端口,二层组播设备判定此报文非法。则不转发该报文,将其直接丢弃。
如果存在该组对应的转发表项, 且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内的所有路由器端口转发。
当收到离组报文,交换机不会把收到离组报文的接口,从Snooping表项中删掉的,而是要等待老化定时器超时。
在其老化时间范围内:
对交换机性能存在大量的考验,待填写。
面试:在交换机上运行IGMP Snooping有什么风险吗?
强行让二层设备去拆开,解析三层包,让他识别3层报文的协议号,组号,这个对于CPU的资源消耗是十分大的,具体要看交换机接口的转发引擎是否具备识别三层报头功能,
如果接口的转发引擎够支持的起,能够做到识别三层包头,那么不需要依赖太多CPU资源来完成。
如果接口的转发引擎不具备识别三层报头功能,那每收到一个IGMP报文,就需要调用CPU资源,来利用CPU资源帮助自己去识别这个报文是何种类型。依赖CPU是属于软转发的范畴,如果在网络中大量使用这类交换机,那么会产生性能瓶颈。甚至还会造成宕机,就算每宕机,也会造成转发效率降低,用户体验变差。并且IGMP Snooping总结废掉了Report抑制的功能,所以在一个庞大组环境中,如果很多组成员存在,那么路由器会频繁的收到Report回应,这个Report对于路由器的消耗,也是非常的厉害。所以对于这些,就产生了他的升级版本:Proxy
极其消耗资源+无法抑制Report
当启用技术之后,交换机能代替路由器去做一些决策。
路由器给交换机发送了Query后,交换机会把Query发给所有的PC(这里的动作是泛洪,还是指定组),PC给交换机回应Report后,交换机不会直接将Report发给路由器,他会自己记录Report信息,当收集完所有的Report信息后(如何定义收集完?
)他会自己代替PC,产生一个Report,发送给路由器,并且当交换机收到离组报文后,也不会直接把离组报文发送 给路由器,他会代替路由器,给这个组内的所有组员,发送指定组查询,如果我能收到Report,那就不会发给路由器了,但如果我交换机没有收到Report,那这个时候,就会把离组,发送给路由器了,当路由器发送了指定组查询,交换机会再次帮忙转发一次,如果这个时候还是没有应答包的回应,那这个离组,就算是成功了。
HCIE路由交换学习指南
HedEx产品文档
知了社区