目录
【摘要】IGMP(Internet Group Management Protocol,互联网组管理协议)用于实现主机与路由器之间组成员的建立与管理功能。
【关键词】IGMPv2;IGMPv3;MLDv1;MLDv2
【编辑/整理】网洞
1 组播基本概念
1.1 组播应用场景
面对一发多收的情形,存在以下几种数据传输方式。
-
单播(Unicast):对同一份数据,如存在多个接收者,Server需要创建和发送多份相同的数据包(对Server性能要求变高,同时浪费了一定的网络带宽)。
-
广播(Broadcast):Server只发送一份数据,广播域(由三层设备隔绝)内所有设备均能接收到该数据包。由于不需要数据包的设备也需解析处理数据包,广播数据包较多时会消耗大量的设备资源,在IPv6中广播传输方式已被取消。
-
组播(Multicast):Server只发送一份数据,组播网络设备根据需要进行转发或拷贝,发送给需要的组成员。广播可视为组播的特殊情况,但组播可穿越三层设备。
【组播VS单播与广播】
相比单播,组播传递信息在距信息源尽可能远的节点才开始被复制和分发,用户的增加不会导致网络负载的显著增加。
相比广播,组播数据只会发送给需要该数据的接收者,所以可以合理利用带宽,并提高网络安全性。
1.2 组播网络组成
组播网络构成:组播源+组播设备(路由器/交换机等)+组播接收者(主机)
1.2.1 组播源
[发送者] 只负责发送组播数据,不关心组播成员的存在。
根据对组播源处理方式不同,组播模型分三种:
-
ASM(Any-Source Multicast,任意信源组播)
在ASM模型中,任意一个发送者都可以成为组播源。接收者无法预知组播源位置,但可以在任意时间加入和离开组播组。
-
SFM(Source-Filtered Multicast,信源过滤组播)
相比ASM,在SFM模型中上层软件会对组播报文的源地址进行检查,禁止某些组播源的报文通过。接收者只能接收到部分组播源的组播数据。
-
SSM(Source-Specific Multicast,指定信源组播)
相比ASM,在SSM模型中接收者可以通过其他手段预知组播源位置,用户能在客户端指定接收特定组播源的数据。
1.2.2 组播设备
[传输者] 负责把数据拷贝并转发给需要接收该数据的设备或存在组播接收者的网络分支。
组播设备间遵循组播路由协议,对于ASM模型,由于存在AS(Autonomous System,自治系统)概念,分域内与域间两种情况:
-
域内组播路由协议用于AS内部,较为典型的是PIM协议,其又可分为密集与稀疏两种模式,PIM-DM为密集模式,PIM-SM为稀疏模式。
-
域间组播路由协议用于AS之间,较为成型的是MSDP(Multicast Source Discovery Protocol,组播源发现协议)。
对于 SSM 模型,没有域内和域间的划分。由于接收者预先知道组播源的具体位置,因此只需要借助 PIM-SM 构建的通道即可实现组播信息的传输。
1.2.3 组播接收者
[接收者] 可加入感兴趣的组播组,接收组播源的数据包。
主机与组播设备间遵循组成员管理协议(IGMP协议)。
1.3 组播地址形式
1.3.1 组播IPv4地址
224.0.0.0 ~ 239.255.255.255
高4bit固定为1110。使用D类地址(224.0.0.0-239.255.255.255),又分为永久组地址和临时组地址(见下表)。
永久组播组(224.0.0.X) | 说明 |
---|---|
224.0.0.1 | 所有设备(主机与路由器)的地址 |
224.0.0.2 | 所有路由器的地址 |
224.0.0.4 | DVMRP路由器 |
224.0.0.5 | OSPF路由器 |
224.0.0.13 | PIM路由器 |
...... | ...... |
临时组播组 | 说明 |
---|---|
224.0.1.0~231.255.255.255 233.0.0.0~238.255.255.255 | ASM/SFM 组播地址,全网范围内有效 |
232.0.0.0~232.255.255.255 | SSM 组播地址,全网范围内有效 |
239.0.0.0~239.255.255.255 | 本地管理组播地址,仅在特定的本地范围内有效。 |
1.3.2 组播IPv6地址
FF00:0000:0000:0000:0000:0000:0000:0000 ~ FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
高8bit固定为FF,往后4bit为flag位(高3位取0做保留,最低位为0时表永久组播地址,为1时表非永久组播地址),再往后4bit为scope位(标识组播组范围,见下表)。
scope 字段取值 | 说明 |
---|---|
0、F | 保留 |
1 | 节点本地范围 |
2 | 链路本地范围 |
5 | 站点本地范围 |
8 | 机构本地范围 |
E | 全局范围 |
其他 | 未分配 |
1.3.3 组播MAC地址
01-00-5e-XX-XX-XX
高24bit固定为0x015e,第25bit为0(即高25bit固定)。低23bit对应IP地址的低23bit。由于IP地址为32bit,除去前面固定的4bit,有5bit信息丢失,故1个MAC地址会映射到32个IP组播地址上。
2 组播路由协议
在组播中,接收者可能存在于全网中的任意位置,所以如果静态配置组播路由的话,存在时差性差、灵活性差以及工作量大容易出错的问题。为了正确高效的转发组播数据报文,路由器之间则需要运行组播路由器协议。
PIM(Protocol Independent Multicast,协议无关组播)直接利用单播路由表的路由信息,使用RPF(Reverse Path Forwarding,逆向路径转发)机制检测环路,创建路由表项,从而进行组播报文转发。目前常用版本是PIMv2。
RPF防止了组播环路的产生。其原理是在单播路由表中查找组播报文源地址的路由。若该路由的出接口为组播报文的入接口,检查成功。否则检查失败。丢弃报文。
组播数据转发要求:路径无环、无次优路径、无重复包。为解决路由分发问题,需在网络中建立一颗组播分发树。其体现为在每一台组播路由器上建立(S,G)或(*,G)路由表项。
分发树 | 说明 |
---|---|
SRT | 最短路径树,路径最优,延迟最小,但占用内存较多。 |
RPT | 共享树,路由非最优,存在额外延迟,但占用内存少。 |
PIM路由表项即通过PIM协议建立的组播路由表项。PIM网络中存在两种路由表项:(S,G)
路由表项或(*,G)
路由表项。S
表示组播源,G
表示组播组,*
表示任意。
路由表项 | 说明 |
---|---|
(S,G) | 通常表示最短路径树,或S 发往G 的报文。S 表示特定组播源,G 表示特定组播组。 |
(*,G) | 通常表示共享树,或* 发往G 的报文。* 表示任意组播源,G 表示特定组播组。 |
PIM路由器上可能同时存在两种路由表项。当收到源地址为S,组地址为G的组播报文,且RPF检查通过的情况下,按照如下的规则转发:
-
如果存在
(S,G)
路由表项,则由(S,G)
路由表项指导报文转发。 -
如果不存在
(S,G)
路由表项,只存在(*,G)
路由表项,则先依照(*,G)
路由。表项创建(S,G)
路由表项,再由(S,G)
路由表项指导报文转发。
2.1 PIM
2.1.1 报文格式
PIM 控制消息使用 IP 报文封装,IP 报文头的协议类型字段值为 103,用来标识数据部分封装了 PIM 消息。IP 报文头的目的地址字段用来标识该 PIM 消息的目的接收者。可以是单播地址,也可以是组播地址。PIM-DM 协议与 PIM-SM 协议,支持不同的控制消息。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,取值如下:
-
0:Hello(PIM-DM 与 PIM-SM 都适用)
-
1:Register(只适用于 PIM-SM)
-
2:Register-Stop(只适用于 PIM-SM)
-
3:Join/Prune(PIM-DM 与 PIM-SM 都适用)
-
4:Bootstrap(只适用于 PIM-SM)
-
5:Assert(PIM-DM 与 PIM-SM 都适用)
-
6:Graft(只适用于 PIM-DM)
-
7:Graft-Ack(只适用于 PIM-DM)
-
8:Candidate-RP-Advertisement(只适用于 PIM-SM)
-
9:State Refresh(只适用于 PIM-DM)
-
-
Reserved:8 bit,保留
-
Checksum:16 bit,校验和
PIM Hello 消息格式
PIM 路由器之间通过交互 Hello 消息,发现 PIM 邻居并维护邻居关系。Hello 消息同时在 PIM-DM 与 PIM-SM 中使用。Hello 消息中无法区分是 PIM-DM 还是 PIM-SM。
封装 Hello 消息的 IP 报文源地址为本地接口地址,目的地址为 224.0.0.13,TTL 值为 1。使用组播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 0。
-
Reserved:8 bit,保留字段,发送时设置为 0,接收时忽略此值。
-
Checksum:16 bit,校验和。
-
Hello Option [1]...[N]:16 bit,采用 Type-Length-Value(TLV)格式,其中:
-
Type:2 字节,Option 参数类型。
-
Length:Value 字段的长度,字节为单位。
-
Value:Option 参数值。
-
1: Holdtime,表示保持邻居为可达状态的超时时间,若超时仍没有收到 Hello 消息则认为邻居不可达。
-
2: 包括三个字段。LAN Prune Delay,在共享网段上传递 Prune 消息的延迟时间;Override Interval,在共享网段上执行剪枝前的否决时间;T,Join 消息抑制能力位。
-
19: DR Priority,表示各路由器接口竞选 DR 的优先级,优先级越高越容易获胜。
-
20: Generation ID,Hello 消息中携带的随机数,表示当前邻居状态。如果状态发生更新 则随机数也会更新。当路由器发现接收到的来自上游的 Hello 消息中包含不同 Generation ID 值,则认为上游邻居已经丢失或上游邻居状态已经改变。
-
21: State Refresh Capable,表示邻居状态刷新时间间隔。
-
24: Address List,PIM 接口的从地址列表。
-
-
PIM Register 消息格式
当 PIM-SM 网络中出现活跃组播源时,源端 DR 向 RP 发送 Register 消息,进行源注册。
Register 消息只在 PIM-SM 中使用。
封装 Register 消息的 IP 报文源地址为源端 DR,目的地址为 RP。使用单播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 1。
-
Reserved:8 bit,保留字段,发送时设置为 0,接收时忽略此值。
-
Checksum:16 bit,校验和。
-
B:1 bit,边界位。
-
N:1 bit,空注册位。
-
Reserved2:30 bit,保留位。发送时此字段被清零,接收时不处理此字段。
-
Multicast data packet:变长,组播数据报文。源端 DR 将接收到的组播数据报文封装在 Register 消息中发往 RP。RP 解封装后,学习到该组播数据报文的(S,G)信息。
PIM Register-Stop 消息格式
在 PIM-SM 网络中,在以下三种情况下,RP 将会向组播源端 DR 发送 Register-Stop 消息。
-
接收者不再通过 RP 接收发往某组播组的数据
-
RP 不再为某组播组服务
-
组播数据转发路径已经由 RPT 切换到 SPT
组播源端 DR 收到 Register-Stop 消息后,停止使用 Register 注册消息封装组播数据报文,并进入注册抑制状态。 Register-Stop 消息只在 PIM-SM 中使用。 封装 Register-Stop 消息的 IP 报文源地址为 RP,目的地址为源端 DR。使用单播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 2。
-
Reserved:24 bit,保留字段,发送时设置为 0,接收时忽略此值。
-
Group Address:32 bit,组播组地址 G。
-
Source Address:32 bit,组播源地址 S。
PIM Join/Prune 消息格式
一条 Join/Prune 消息中可以同时包含 Join 信息和 Prune 信息。只包含 Join 信息的 Join/Prune 消息称为 Join 消息。只包含 Prune信息的 Join/Prune 消息称为 Prune 消息。
Join/Prune 消息同时在 PIM-DM 和 PIM-SM 中使用。 封装 Join/Prune 消息的 IP 报文源地址为本地接口地址,目的地址为 224.0.0.13,TTL 值为 1。使用组播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 3。
-
Upstream Neighbor Address:32 bit,上游邻居地址。也就是收到 Join/Prune 消息的路由器上,进行 Join 或 Prune 操作的下游接口地址。
-
Number of Groups:8 bit,消息中包含的组播组数目。
-
Holdtime:16 bit,接收 Join/Prune 消息的路由器保持相应接口加入/剪枝状态的时间。
-
Group J/P Record
-
Group Address:32 bit,组播组地址。
-
Number of Joined Sources:16 bit,针对该组播组,请求加入的组播源总数。
-
Number of Pruned Sources:16 bit,针对该组播组,请求剪枝的组播源总数。
-
Joined Source Address:32 bit,请求加入的组播源地址。
-
Pruned Source Address:32 bit,请求剪枝的组播源地址。
-
PIM Graft/Graft-Ack 消息格式
在 PIM-DM 网络中,路由器上出现组成员时,如果本身不在 SPT 上,则从对应的(S,G)表项的上游接口发送 Graft 消息。上游邻居立即恢复下游接口的转发,同时从该下游接口发出 Graft-Ack 消息,表示已经接受嫁接请求。如果上游邻居不在 SPT 上,则继续向上游发送 Graft 消息。
Graft 消息格式与 Join/Prune 消息相同,仅部分字段取值存在差异。
Graft-Ack 消息与 Graft 消息格式相同,并复制了 Graft 消息的内容。其中不同的是,Upstream Neighbor Address 字段,在 Graft-Ack消息中填为 Graft 消息的发出者地址。
封装 Graft-Ack 消息的 IP 报文源地址为下游接口地址,目的地址为 Graft 消息的发出者。使用单播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,Graft 值为 6,Graft-Ack 值为 7。
-
Upstream Neighbor Address:32 bit。
在 Graft 消息中填上游邻居地址。也就是收到嫁接消息的路由器上,进行嫁接操作的下游接口地址。 在 Graft-Ack 消息中填为 Graft 消息的发出者地址。
-
Number of Groups:8 bit,消息中包含的组播组数目。
-
Holdtime:16 bit,该字段为 0。
-
Group J/P Record
-
Group Address:32 bit,组播组地址。
-
Number of Joined Sources:16 bit,针对该组播组,请求加入的组播源总数。
-
Number of Pruned Sources:16 bit,该字段为 0。
-
Joined Source Address:32 bit,待嫁接的(S,G)的源地址。
-
Pruned Source Address:32 bit
-
PIM Bootstrap 消息格式
当 PIM-SM 网络中使用动态 RP 时,配置了 C-BSR 的路由器从所有 PIM 接口周期性的发送 Bootstrap 消息,参与 BSR 竞选。竞选获胜者,继续发送 Bootstrap 消息,向域内所有 PIM 路由器发布 RP-Set 信息。
Bootstrap 消息只在 PIM-SM 中使用。 封装 Bootstrap 消息的 IP 报文源地址为 C-BSR 地址,目的地址为 224.0.0.13,使用组播方式发送。TTL 为 1,在 PIM-SM 网络中逐跳转发,最终达到全网泛滥。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 4。
-
Fragment Tag:16 bit,随机数,用来区分 Bootstrap 消息。
-
Hash Mask length:8 bit,C-BSR 的 Hash 掩码长度。
-
BSR-priority:8 bit,C-BSR 优先级。
-
BSR-Address:32 bit,C-BSR 地址。
-
Group-RP Record
-
Group Address:32 bit,组播组地址。
-
RP-Count:8 bit,希望为该组服务的 C-RP 的总数。
-
Frag RP-Cnt:8 bit,在本段内包含的 C-RP 地址的个数。对于一个给定的组来说,如果 Bootstrap 消息分片,Frag RP-Cnt字段便于将 RP-Set 分片。
-
RP-address:32 bit,C-RP 的地址。
-
RP-holdtime:16 bit,C-RP 发出的 advertisement 消息的老化时间,表示 C-RP 的有效时间。
-
RP-Priority:8 bit,C-RP 的优先级。
-
PIM Assert 消息格式
在共享网段上,如果 PIM 路由器从(S,G)或(*,G)表项的下游接口收到(S,G)报文,则表示该网段存在其他的转发者。路由器从该下游接口发出 Assert 消息,参与竞选。竞选落败者停止下游接口的转发。
Assert 消息同时在 PIM-DM 和 PIM-SM 中使用。 封装 Assert 消息的 IP 报文源地址为本地接口地址,目的地址为 224.0.0.13,TTL 值为 1。使用组播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 5。
-
Group Address:32 bit,组播组地址。
-
Source Address:32 bit,如果竞选(S,G)表项的唯一转发者,则为组播源地址。如果竞选(*,G)表项的唯一转发者,则为 RP地址。
-
R:4 bit,RPT 位。如果竞选(S,G)表项的唯一转发者,该位为 0;如果竞选(*,G)表项的唯一转发者,该位为1。
-
Metric Preference:32 bit,到 Source address 的单播路径的优先级。
-
Metric:32 bit,到 Source address 的单播路由的开销。
PIM C-RP Advertisement 消息格式
当 PIM-SM 网络中使用动态 RP 时,配置了 C-RP 的路由器周期性的向 BSR 发送 Advertisement 消息,通告希望服务的组范围。
C-RP Advertisement 消息只在 PIM-SM 中使用。 封装 Advertisement 消息的 IP 报文源地址为源端 C-RP,目的地址为 BSR。使用单播方式发送。
-
Version:4 bit,PIM 版本,值为 2。
-
Type:4 bit,消息类型,值为 8。
-
Prefix-Cnt:8 bit,组播地址前缀值。
-
Priority:8 bit,C-RP 优先级。
-
Holdtime:16 bit,Advertisement 消息的老化时间。
-
RP-Address:32 bit,C-RP 地址。
-
Group Address:32 bit,组播组地址。
2.2 PIM-DM
PIM-DM(Dense Mode)使用“推模式”转发组播报文,适用于组成员规模较小且相对密集的网络。
PIM-DM假设网络组成员很稠密(每个网段都可能存在组成员),会先将组播报文推送到每个路由器,再裁减掉部分分支。
2.2.1 报文类型
报文类型 | 功能 |
---|---|
Hello | 发现报文,用于建立与维护PIM邻居关系。 |
Join | 加入报文,用于加入组播分发树。 |
Prune | 剪枝报文,用于修剪组播分发树。 |
Graft | 嫁接报文,用于将设备嫁接到组播分发树。 |
Graft-ACK | 嫁接确认报文,用于对邻居发送的嫁接报文进行确认。 |
Assert | 断言报文,用于避免一个网段接收到多台路由器发送的相同数据。 |
2.2.2 工作机制
PIM-DM通过周期性“扩散(Flooding)-剪枝(Prune)”构建与维护单向无环SPT(Shortest Path Tree,最短树路径,又称源树),并通过嫁接(Graft)机制恢复某个分支的组播转发。
PIM-DM的关键工作机制包括邻居发现、扩散、剪枝、嫁接、断言、状态更新。
PIM-DM 邻居发现 在PIM-DM网络中,路由器周期性发送Hello消息来发现、建立并维护邻居关系。
-
Pim Timer Hello Interval,在接口视图下配置发送Hello消息的时间间隔。Hello消息默认周期是30s。
-
PIM hello-option holdtime interval,在接口视图下配置Hello消息超时时间值,默认情况超时时间为105s。
PIM-DM DR的选举
-
在PIM-DM中各路由器通过比较Hello消息上携带的优先级和IP地址,为多路访问网络选举指定路由器DR。
-
DR充当IGMPv1的查询器。
-
接口DR优先级大的路由器将成为该MA网络的DR,在优先级相同的情况下,接口IP地址大的路由器将成为DR。
-
当DR出现故障后,邻居路由器之间会重新选举DR。
PIM-DM 构建SPT
-
扩散过程:PIM-DM假设网络中所有主机都会准备接受组播数据,当某组播源开始向组播组G发送数据时,过程如下:
-
路由器接收到组播报文时会进行RPF检查。
-
如果RPF检查通过,则创建(S,G)表项,然后将数据向所有下游PIM-DM节点转发,这个过程称为扩散(Flooding)。
-
如果RPF检查没有通过,则将报文丢弃。
-
-
RPF检查:为了防止组播报文在转发过程中出现报文及环路的情况,路由器必须执行RPF检查。
-
所谓RPF检查,就是指路由器通过查找去往组播源的路由器来判断所接收到的组播报文是否来自于“正确的”上游接口。某一路由器去往某一组播源的路径所对应的出接口称为该路由器上关于该组播源的RPF接口。一台路由器从某一接口接收到一个组播报文后,如果发现该接口不是相应组播源的RPF接口,就意味着RPF检查失败,所收到的组播报文将被丢弃。
-
-
剪枝过程:当下游没有组播成员,扩散组播报文会导致带宽资源的浪费。为避免带宽的浪费PIM-DM使用剪枝机制。
-
当下游节点没有组播成员,则路由器向上游节点发Prune消息,通知上游节点不用再转发数据到该分支。上游节点收到Prune消息后,就将相应的接口从其组播转发表项(S,G)对应的输出发送列表中删除。剪枝过程继续直到PIM-DM中仅剩下了比要的分支,这就建立了一个以组播源为根的SPT。
-
各个被剪的节点同时提供超时机制,当剪枝超时时重新计算开始扩散—剪枝过程。剪枝状态超时计时器的默认值为210s。
-
PIM-DM的扩散—剪枝机制周期性进行,每3分钟重复一次,如图所示,RTC对RTE所在网段处于剪枝状态,RTC对RTE的接口会维护一个“剪枝定时器”,当剪枝定时器超时时,RTC就会恢复对RTE的数据转发,这样会导致不必要的网络资源浪费。
-
PIM-DM 状态刷新
PIM-DM协议采用状态刷新特性解决周期性“扩散—剪枝”带来的问题:离组播源最近的第一跳RTA周期性触发State Refresh消息。State Refresh消息在全网扩散,刷新所有设备上的剪枝定时器状态。
状态刷新使得RTE不再周期性的收到组播数据,但是当Client B加G1组之后,如果一直是剪枝状态,Client B无法接收到组播数据。
PIM-DM Graft机制
如图所示,当Client B发送组播组G1的IGMP Report报文请求组播数据后。RTE收到Client B的IGMP Report报文,说明RTE具有转发组播数据需求,则立即向上游路由器RTC发送Graft消息,请求上游路由器恢复对应出接口的转发。RTC收到Graft消息后,向RTE回复Graft Ack并将连接RTE的出接口恢复为转发状态。
PIM-DM Assert机制
如图所示,RTA、RTB、RTC均从上游接口收到组播报文并通过了RPF检查,三台路由器的下游接口连接在同一网段。RTA、RTB、RTC都向该网段发送组播报文,三份重复的组播报文浪费带宽资源。
-
为避免重复的组播报文浪费带宽资源,PIM路由器在接收到邻居路由器发送的相同组播报文后,会以组播的方式向本网段的所有PIM路由器发送Assert消息,其中目的地址为224.0.0.13。其它PIM路由器在接收到Assert消息后,将自身参数与对方报文中携带的参数做比较,进行Assert竞选。竞选规则如下:
-
到组播源的单播路由协议优先级较小者获胜。
-
如果优先级相同,则到组播源的路由协议开销较小者获胜。
-
如果以上都相同,则连接到接受者MA网络接口IP地址最大者获胜。
-
-
根据Assert竞选结果,路由器将执行不同的操作:
-
获胜一方的下游接口称为Assert Winner,将负责后续对该网段组播报文的转发。
-
落败一方的下游接口称为Assert Loser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表删除。
-
-
Assert竞选结束后,该网段上只存在一个下游接口,只传输一份组播报文。所有Assert Loser可以周期性地恢复组播报文转发,从而引发周期性的Assert机制。
2.3 PIM-SM
PIM-SM(Sparse Mode)使用“拉模式”转发组播报文,适用于组成员规模较大且相对稀疏的网络。
PIM-SM假定网络中没有组成员,当收到组成员消息后,才将组播报文推送出去。
2.3.1 报文类型
报文类型 | 功能 |
---|---|
Hello | 发现报文,用于建立与维护PIM邻居关系。 |
Join | 加入报文,用于加入组播分发树。 |
Prune | 剪枝报文,用于修剪组播分发树。 |
Register | 注册报文,组播源用于向RP注册过程 |
Register-Stop | 注册停止报文,RP用于通知第一跳路由器停止在注册报文中发送组播流量。 |
Assert | 断言报文,用于避免一个网段接收到多台路由器发送的相同数据。 |
Bootstrap | 自举报文,用于BSP选举和发送C-RP汇总信息。 |
Candidate-RP-Advertisement | C-RP通告报文,C-RP用于向BSR发送通告。 |
2.3.2 工作机制
PIM-SM在网络中维护一台所有组播路由器均知道的RP(Rendezvous Point,汇聚点)路由器,随时为组成员与组播源服务。组成员出现时,最后一跳路由器向RP 发送报文,逐跳创建(*,G)表项,生成以RP为根的RPT(Rendezvous Point Tree,汇聚点树,又称共享树)。
PIM-SM的关键机制包括邻居发现、DR竞选、RP发现、RPT构建、组播源注册、SPT切换、断言。PIM-SM中PIM邻居建立过程以及Assert机制与PIM-DM相同。
PIM-SM RPT建立过程
RPT实现了组播数据按需转发的目的,减少了数据泛洪对网络带宽的占用。RPT的建立过程:
-
主机加入某个组播组时,发送IGMP成员通告。
-
最后一跳路由器向RP发送
(*,G)
Join消息。 -
(*,G)
Join消息到达RP的过程中,沿途各路由器都会生成相应的(*,G)
组播转发条目。
PIM-SM 源端DR与用户端DR
运行PIM-SM的网络,都会进行DR(Designated Router)的选举。其中有两种DR分别称为接收者侧DR和组播源侧DR。PIM-SM中DR的选举原则与PIM-DM相同。
-
组播接收者侧DR:与组播组成员相连的DR,负责向RP发送(*,G)的Join加入消息。
-
组播源侧DR:与组播源相连的DR,负责向RP发送单播的Register消息。
PIM-SM SPT的建立过程
如图所示,在PIM-SM网络中,任何一个新出现的组播源都必须首先在RP处“注册”,继而才能将组播报文传输到组成员。具体过程如下:
-
组播源向组播组发送第一个组播报文。
-
源端DR将该组播报文封装成Register报文并以单播方式发送给相应的RP。
-
RP收到注册消息后,一方面从Register消息中提取出组播报文,并将该组播报文沿RPT分支转发给接收者。
-
另一方面,RP向源端DR发送(S,G)Join消息,沿途路由器上都会生成相应(S,G)表项。从而建立了一颗由组播源至RP的SPT树。
-
SPT树建立后,组播源发出的组播报文沿该SPT转发至RP。
-
RP沿SPT收到该组播报文后,向源端DR单播发送Register-stop消息。
PIM-SM 转发树
PIM-SM同时包含了SPT和RPT。通常情况下,组播源发出的组播报文会沿SPT到达RP,然后从RP沿RPT到达接收者。在这种情况下,从组播源到接收者的路径不一定是最优的,并且RP的工作负担非常大。为此,我们可以启用RPT向SPT进行的切换机制。
PIM-SM Switchover机制
PIM-SM通过指定一个利用带宽的SPT阈值可以实现RPT到SPT的切换。用户端DR周期性检测组播报文的转发速率,一旦发现从RP发往组播组G的报文速率超过阈值,则触发SPT切换:
-
用户端DR逐跳向源端DR发送(S,G)Join报文并创建(S,G)表项,建立源端DR到用户端DR的SPT。
-
SPT建立后,用户端DR会沿着RPT逐跳向RP发送剪枝报文,收到剪枝报文的路由器将(*,G)复制成相应的(S,G),并将相应的下游接口置为剪枝状态。剪枝结束后,RP不再沿RPT转发组播报文到组成员端。
-
如果SPT不经过RP,RP会继续向源端DR逐跳发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,源端DR不再沿“源端DR-RP”的SPT转发组播报文到RP。
在VRP中,缺省情况下连接接收者的路由器在探测到组播源之后(即接收到第一个数据报文),便立即加入最短路径树,即从RPT向SPT切换。通过RPT树到SPT树的切换,PIM-SM能够以比PIM-DM更精确的方式建立SPT转发树。
3 组播组管理协议
组播数据在进行传递时,组播网络为了将组播数据转发至组播组成员,需要知道组播组成员的位置与所加组播组。
组播网络感知组播成员有两种方法:静态配置和动态感知。静态配置使用手工配置的方法,灵活性差,工作量大,现网一般使用动态感知的方法。
IGMP(Internet Group Management Protocol,网路群组管理协议)为IPv4中动态感知组成员存在的协议,在每个网段中部署一个路由器(查询器)用于获取组员信息。IGMP目前有三个版本:IGMPv1(已淘汰)、IGMPv2、IGMPv3。
MLD(Multicast Listener Discovery,组播侦听发现)为IPv6的组播成员动态感知协议。MLD目前存在两个版本:MLDv1(对应IGMPv2),MLDv2(对应IGMPv3)。
3.1 IGMPv1
IGMPv1定义了基本的组员查询与报告。
3.1.1 报文类型
报文类型 | 功能 |
---|---|
普遍组查询(General Query) | 查询器向共享网络上所有主机和路由器发送的查询报文,用于查询哪些组播组存在成员。 |
成员关系报告(Membership Report) | 主机用于申请加入某个组播组,或对查询报文进行应答。 |
3.1.2 报文格式
-
版本(Version):IGMP版本,为1。
-
类型(Type):对应前面报文类型。
-
0x11:查询报文。
-
0x12:成员关系报告报文。
-
-
校验和(Checksum)
-
组播组地址(Group Address):
-
普遍组查询:该字段为全0。
-
成员关系报告:该字段为需报告的组播地址。
-
3.1.3 工作机制
-
查询器选举
IGMPv1没有基于IGMP的查询器选举机制,所以需要依赖组播路由协议(PIM)进行IGMP查询器选举。IGMPv1将组播路由协议(PIM)选举出唯一的组播信息转发者(Assert Winner或DR)作为IGMPv1的查询器,负责该网段的组成员关系查询。
-
主机加入组播组
-
主机不等待普遍组查询报文的到来,主动发送报告报文以声明加入组播组G2。
-
IGMP查询器接收到HostC的报告报文后,了解到本网段内出现了组播组G2的成员,则生成组播转发项(*,G2)。网络中一旦有G2的数据到达路由器,将向该网段转发。
-
-
主机离开组播组
IGMPv1没有专门定义离开组消息,当组播组成员离开组播组时,将不会再对普遍组查询报文做出回应。
当网段内不存在特定组的组成员,IGMP查询器不会收到特定组成员的报告报文,则在一定时间(缺省值为130s)后,删除特定组所对应的组播转发表项。
-
查询器维护组播组
-
IGMP查询器发送目的地址为224.0.0.1(表示同一网段内所有主机和路由器)的普遍组查询报文;收到该查询报文的组成员启动定时器。普遍组查询报文是周期性发送的,发送周期可以通过命令配置,缺省情况下每隔60秒发送一次。HostA和HostB是组播组G1的成员,则在本地启动定时器Timer-G1。缺省情况下,定时器的范围为0~10秒之间的随机值。
-
第一个定时器超时的组成员发送针对该组的报告报文。 假设HostA上的Timer-G1首先超时,HostA向该网段发送目的地址为G1的报告报文。也想加入组G1的HostB收到此报告报文,则停止定时器Timer-G1,不再发送针对G1的报告报文。这样报告报文被抑制,可以减少网段上的流量。
-
IGMP查询器接收到HostA的报告报文后,了解到本网段内存在组播组G1的成员,则由组播路由协议生成(*,G1)组播转发表项,“ * ”代表任意组播源。网络中一旦有组播组G1的数据到达路由器,将向该网段转发。
-
3.2 IGMPv2
IGMPv2增加了快速离组机制,相对IGMPv1新增了两种报文。同时使用独立的查询器选举机制。
3.2.1 报文类型
报文类型 | 功能 |
---|---|
普遍组查询(General Query) | 查询器向共享网络上所有主机和路由器发送的查询报文,用于查询哪些组播组存在成员。 |
特定组查询(Group-Specific Query)[新增] | 查询特定组播组,用以获知该组是否存在成员。 |
成员关系报告(Membership Report) | 主机用于申请加入某个组播组,或对查询报文进行应答。当需要兼容IGMPv1时,使用版本1成员关系报告(Version 1 Membership Report)。 |
成员离开报文(Leave)[新增] | 主机用于宣告离开某个组播组。 |
-
常规查询(General Query),也称普遍组查询
-
报文目标地址为224.0.0.1,组地址为0.0.0.0。
-
默认每隔60s发送一次,等待响应的最长时间为10s。当组播路由器在130s(2*60s+10s)后未收到某个子网的Membership Report消息,路由器将认为该子网内无组员,不在向此子网发送组播数据。
-
-
特定组查询(Group-Specific Query)
-
当IGMP查询器收到离组报文,路由器便会发送该报文,确认该组播是否还有其他成员。
-
报文目的地址为发出离组报文主机的组地址。
-
为避免报文意外丢失导致路由器误认为组内无成员,查询路由器默认以1s间隔连续发送2个报文。如仍未收到回应,将删除相关IGMP组表项。
-
-
成员关系报告(Membership Report)
-
主机通过该报文宣告自己成为组播成员(主机主动宣告);IGMP路由器通过该报文发现直连网段的组成员(主机被动响应)。
-
报文目的地址为主机期望加入的组播组地址。
-
-
离组报文(Leave Report)
-
该报文为IGMPv2新增(组员离组时需发送离组报文),在IGMPv1未定义(IGMPv1使用静默离开机制,组员离组时不发送报文)。
-
该报文目的地址为224.0.0.2。
-
3.2.2 报文格式
-
版本(Version):IGMP版本,为2。
-
类型(Type):对应前面报文类型。
-
0x11:查询报文。
-
0x12:IGMPv1成员关系报告报文。
-
0x16:IGMPv2成员关系报告报文。
-
0x17:成员离开报文。
-
-
最大响应时间(Max Response Time):主机响应查询返回报告的最大时间(只在查询报文中设置,其他报文中为0x00)。
-
普遍组查询:默认10s。
-
特定组查询:默认1s。
-
-
校验和(Checksum)
-
组播组地址(Group Address):
-
普遍组查询:该字段为全0。
-
特定组查询:该字段为需查询的组播地址。
-
成员关系报告/离组报文:该字段为需报告或离开的组播地址。
-
3.2.3 工作机制
-
查询器选举
-
所有IGMPv2 路由器在初始时都认为自己是查询器,并向本地网段内的所有主机和路由器发送IGMP 普遍组查询(General Query)报文(目的地址为224.0.0.1);
-
本地网段中的其它IGMPv2 路由器在收到该报文后,将报文的源IP 地址与自己的接口地址作比较。通过比较,IP 地址最小的路由器将成为查询器,其它路由器成为非查询器(Non-Querier);
-
查询器选出来以后,会连续发送两次普遍组查询报文,两次相隔15秒,如果没有收到竞争者回应,则之后每60秒发送一次普遍组查询报文。
-
非查询器上都会启动一个定时器(即其他查询器存在时间定时器Other Querier Present Time默认125s)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。
-
-
主机加入组播组
同IGMPv1。
-
主机离开组播组
-
组播组成员向本地网段内的所有组播路由器(目的地址为224.0.0.2)发送针对组G1的离开报文。
-
查询器收到离开报文,会发送针对组G1的特定组查询报文。发送间隔和发送次数可以通过命令配置,缺省情况下每隔1秒发送一次,共发送两次。同时查询器启动组成员关系定时器(Timer-Membership=发送间隔x发送次数)。
-
如果该网段内还存在组G1的其他成员,这些成员在收到查询器发送的特定组查询报文后,会立即发送针对组G1的报告报文。查询器收到针对组G1的报告报文后将继续维护该组成员关系。
-
如果该网段内不存在组G1的其他成员,查询器将不会收到针对组G1的报告报文。在Timer-Membership超时后,查询器将删除(*,G1)对应的IGMP组表项。当有组G1的组播数据到达查询器时,查询器将不会向下游转发。
-
-
-
查询器维护组播组
同IGMPv1。
3.3 IGMPv3
IGMPv3可以指定接收或不接受某些组播源的报文。
3.3.1 报文类型
报文类型 | 说明 |
---|---|
普遍组查询(General Query) | 该报文作用与IGMPv1,IGMPv2中的普遍组查询报文作用一致。 |
特定组查询(Group-Specific Query) | 该报文作用与IGMPv2中的特定组查询报文作用一致。 |
特定源组查询(Group-and-Source-Specific Query)[新增] | 该报文用于查询该组成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。 |
成员关系报告(Membership Report)[变化] | IGMPv3成员关系报告报文除了通告组成员的加组信息外,还能通告组成员希望接收的组播源信息。 |
-
普遍组查询(General Query)
-
既不携带组地址,也不携带源地址
-
-
特定组查询(Group-Specific Query)
-
携带组地址,但不携带源地址
-
-
特定源组查询(Group-and-Source-Specific Query)
-
既携带组地址,还携带一个或多个源地址。
-
-
成员关系报告(Membership Report)
-
目的IP地址为224.0.0.22
-
报文中存在不限数目的组记录,组的类型有6种(IS_IN, IS_EX, TO_IN, TO_EX, ALLOW, BLOCK)
-
3.3.2 报文格式
-
查询报文
-
版本类型(Type):取值为0x11。
-
最大响应时间(Max Response Code):成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。
-
校验和(Checksum)
-
组播组地址(Group Address):在普遍组查询报文中,该字段设为0;在特定组查询报文和特定源组查询报文中,该字段为要查询的组播组地址。
-
S:禁止路由器处理的标记位。
-
QRV(Query Robustness Value,查询器的健壮变量)
-
QQIC(Querier‘s Query Interval Code,查询器的查询间隔)
-
组播源的数量(Number of Sources):对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段非0。此参数的大小受到所在网络MTU大小的限制。
-
组播源地址(Source Address):其数量受到Number of Sources字段值大小的限制。
-
-
报告报文
-
报文类型(Type):取值为0x22。
-
组记录数量(Number of Group Records)
-
组记录(Group Record)
-
组记录类型(Record Type):包含三大类型。
-
当前状态报告:指示组播组与源地址为包含(INCLUDE)关系还是排除(EXCLUDE)关系。
-
过滤模式改变报告:指示组播组接收模式发生改变(包含->排除,或排除->包含)。
-
源列表改变报告:指示在现有基础上新增或删除组播源。
-
-
源地址数量(Number of Sources)
-
组播组地址(Multicast Address)
-
组播源地址(Sources Address)
-
-
3.3.3 工作机制
-
查询器选举
同IGMPv2。
-
主机加入组播组
过程同IGMPv1和IGMPv2,但主机在加入组播组的同时,能够明确要求接收或不接收特定组播源发出的组播数据。
-
主机离开组播组
IGMPv3没有专门的成员离开报文,成员离开需要借助组成员关系报告实现。
当成员离开时,会发送一个过滤模式为INCLUDE,源列表为空的状态变更记录。
IGMP查询器在收到改变源组对应关系的成员关系报告后,会发送特定源组查询报文,确认是否还有组成员存在。
-
查询器维护组播组
过程同IGMPv1和IGMPv2,但无成员报告抑制机制。
【IGMP不同版本对比】
机制 | IGMPv1 | IGMPv2 | IGMPv3 |
---|---|---|---|
查询器选举 | 依靠其他协议(PIM) | 自己选举 | 自己选举 |
离组方式 | 静默离开(超时130s) | 主动离开(离开报文) | 主动离开(成员关系报文) |
特定组查询 | 不支持 | 支持 | 支持 |
指定源、组 | 不支持 | 不支持 | 支持 |
3.4 IGMP拓展功能
3.4.1 IGMP Snooping
场景问题:当组播数据从最后一跳路由器发往组播组成员时,往往会经过交换机。由于二层交换机无法学习组播MAC地址,因此组播报文会在二层被广播,即同一广播域内的组播成员和非组播成员都能收到组播报文。
解决方案:IGMP Snooping功能可以控制组播流量在以太网的泛洪范围,避免不同组的组播流量被别组成员接收。
【工作原理】
当主机和上游三层设备之间传递的IGMP协议报文通过二层组播设备时,IGMP Snooping分析报文携带的信息,根据这些信息建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发。
交换机IGMP Snooping使能后,靠近上层组播设备一侧的端口叫路由器端口(Router Port),靠近组播组成员一侧的端口叫成员端口(Member Port)。所有路由端口都会记录在路由器端口列表中,而所有成员端口都会记录在IGMP Snooping转发表中。
当收到查询报文时,建立路由器端口,当收到成员关系报告时,建立成员端口。路由器端口与成员端口都存在老化器。当再次收到对应报文时老化器重置,否则等老化器超时后会删除相应表项释放存储空间。查询报文会从路由器端口发送到所有成员端口,成员关系报告会从成员端口发送到所有路由器端口(由于交换机需要知道所有成员信息,成员端口间不转发成员关系报告,避免相互抑制)。
3.4.2 IGMP Proxy
场景问题:现网中可能存在一台IGMP查询器需要管理大量组成员的情况,大量成员主机频繁加入/离开组播组时,会产生大量的IGMP成员关系报告/离开报文,从而给IGMP查询器带来较大的处理压力。
解决方案:通过IGMP Proxy功能可减少IGMP查询器接收IGMP成员关系报告/离开报文的数量,减轻IGMP查询器压力。
【工作原理】
IGMP Proxy拦截终端用户的IGMP请求并进行相关处理后,再将它转发给上层路由器。对用户侧承担Server的角色,定期查询用户信息,对于网络路由侧又承担Client的角色,在需要时将当前的用户信息发送给网络。
【Snooping VS Proxy】
事件 | IGMP Snooping | IGMP Proxy |
---|---|---|
接收IGMP报告报文 | 原封不动转发给上游路由器处理 | 拦截处理 |
接收IGMP查询报文 | 原封不动转发给下游主机处理 | 直接响应 |
接收IGMP离开报文 | 原封不动转发给上游路由器处理 | 向下游发送查询报文 |
维护组播转发软表 | 依赖上游查询器维护 | 主动维护 |
IGMP Snooping只是监听IGMP报文来建立组播表,而IGMP报文的产生是通过上端的路由器和客户端来完成的。也就是说如果没有路由器存在,就不能实现组播表的建立,而只能采用广播的形式来实现数据的传输。而IGMP Proxy则更多的参与了进来,它直接和客户端和上端的路由器来进行对话,而不再是一个完全透明的角色。因为它做了更多的本地处理,减少了对于上端的路由器的依赖程度,但是也增加了本地的系统负担。但是,从另一方面来讲,使用IGMP Proxy可以减轻上端路由器的负荷。
3.4.3 IGMP SSM Mapping
现网中存在部分只能运行IGMPv1与IGMPv2的老旧终端,在部署SSM模式的组播时,由于IGMPv1与IGMPv2报文中无法携带组播源信息,因此无法使用SSM模式的组播网络。
IGMP SSM Mapping通过静态的将组播源与组播组进行绑定,使得IGMPv1与IGMPv2的组成员也能接入SSM组播网络。
3.5 MLDv1
MLDvl协议是从IGMPv2协议中派生出来的,其运行机制和IGMPv2协议相同,专门用于IPv6组播群组的管理,其主要是应用于ASM模式组播路由协议的组管理工作。
3.5.1 报文类型
报文类型 | 功能 |
---|---|
组播侦听查询(Type=130) | 分两个子类型。 - 通用查询:组地址字段置为全0,对所有的组进行组成员查询 - 特定组查询:用于判断一个特定的组播地址在本地链路上是否有组播侦听者 |
组播侦听报告(Type=131) | 组播侦听报告消息 |
组播侦听离开(Type=132) | 组播侦听完成消息 |
3.5.2 报文格式
-
类型(type)
MLD消息共有三种组播侦听查询(类型值=130),可分为两种子类型
-
普遍查询:用于获得在所连网络上具有侦听者的组播地址
-
特定组播地址查询:用于获得在所连网络上对一特定组播地址是否存在侦听者
-
-
代码(Code):发送时设置为1;接收时忽略
-
校验和(Checksum):标准的ICMPv6校验和,覆盖所有MLD消息以及IPv6首部区域中的伪首部
-
最大响应延迟(Maximum Response Delay)
最大响应延迟值只在查询报文消息中有意义,它指定了发送响应报文的最大允许时间延迟,单位为毫秒。在其他报文消息中,发送时设置为零,接收时忽略,比如说普遍组查询报文的最大响应为10s,特定组查询报文最大响应为1s
-
保留(Reserved):发送者设为零;接收者忽略
-
组播地址(Multicast Address)
-
在查询报文中,当发送普遍查询时,组播地址值设为零
-
当发送特定组查询时,设为特定的IPv6组播地址
-
在报告或离开报文中,组播地址值分别设为报文发送者要侦听或者停止侦听的特定IPv6组播地址
-
3.5.3 工作机制
-
查询器选举
-
所有MLD路由器在初始时都认为自己是查询器,并向本地网段内的所有主机和路由器发送MLD普遍组查询报文(目的地址为 FF02::1)
-
本地网段中的其它MLD路由器在收到该报文后,将报文的源IPv6地址与自己的接口地址作比较。通过比较,IPv6地址最小的路由器将成为查询器,其它路由器成为非查询器
-
所有非查询器上都会启动一个定时器,在定 时器超时前,如果收到了来自查询器的 MLD 查询报文,则重置该定时器;否则,就认为原查询器失效, 并发起新的查询器选举过程
-
-
组成员加组
-
MLD查询器周期性地向共享网段上的所有本地链路主机以组播方式(目的地址为FF02::1)发送普遍查询消息
-
网段上的所有主机都接收到该普遍查询消息。如果主机Host B和Host C希望加入某组播组G1,则设置定时器延时来响应
-
希望加入的主机在定时器超时后以组播方式向网段上的所有主机和路由器发送报告消息来响应查询,此消息包含组播组G1的地址信息
-
网段上的所有主机和路由器接收到此报告消息后,也就获得了关于G1的组播信息。此时网段中其他也希望加入组播组G1的主机将不再发送相同的报告消息,这个就是成员关系抑制机制,因为交换机本身具有的泛洪的工作机制,即当其他主机想要加入这个组的时候,自己也能收到其他主机想要加入这个组的消息,如果两者想要加入同一个组的话则就产生了抑制报文,另外的组就不需要在发送想要加入这个组的报文了,其中一台主机发送即可,从而减少了组播报文的数量减少带宽以及设备性能的损耗,就类似于两个人在同一个饭桌上吃饭,对方点过的菜你就不需要重复点了,你一样可以吃到,就是这个道理,如果主机Host A希望加入另一个组播组G2,就会发送包含组播组G2地址的报告消息以响应普遍查询消息来加入G2
-
在查询/报告过程后,MLD查询器可以了解到在自己的直连网段上是否有组播组G1的接收者,生成形式为(, G1)组播路由项,表示任意的组播源
-
通过组播路由机制,MLD查询器接收到组播源发来的组播信息。如果直连网段上有接收者,就在网段上转发此数据,加入组播组的主机接收该数据
-
-
组成员离租
-
当主机想离开组播组,就以组播地址(目的地址是FF02::2)向链路上发送一个离开消息(Done Message),并且在其组播地址域携带要停止侦听的地址
-
当查询器收到该报文后,向该主机所声明要离开的那个IPv6组播组发送特定组查询报文
-
如果该网段内还有该IPv6组播组的其它成员,则这些成员在收到特定组查询报文后,会在该报文中所设定的最大响应时间内发送成员关系报告报文
-
如果在最大响应时间内收到了该IPv6组播组其它成员发送的成员关系报告报文,查询器就会继续维护该IPv6组播组的成员关系;否则,查询器将认为该网段内已无该IPv6组播组的成员,于是不再维护这个IPv6组播组的成员关系
-
3.6 MLDv2
MLDv2从IGMPv3中发展过来,和MLDv1相比,增加了IGMPv3所具有的源过滤功能,不仅能够支持ASM模式组播路由协议,而且还能够支持基于IPv6的SSM模式组播路由协议。
MLDv2在MLDv1的基础上添加了源组播 (Source Specific Multieast)的概念,主机可以组播源报告(Group-Source Report)报告感兴趣的源,路由器则只转发该链路上所有组成员感兴趣的源所发送的报文。当主机想退出某组播源时,主机发送离开组播源报告(Group-Source Leave),查询者在接收到该报告后可以发送指定组播源请求,确认是否仍有组成员关心该组播源。MLDv2支持源过滤 (SourceFiltering),因此比MLDv1具备更高的可管理性和安全性。此外MLDv2还可以与MLDv1兼容。
3.6.1 报文类型
报文类型 | 功能 |
---|---|
组播侦听查询(Type=130) | 分两个子类型。 - 通用查询:组地址字段置为全0,对所有的组进行组成员查询 - 特定组查询:用于判断一个特定的组播地址在本地链路上是否有组播侦听者 |
组播侦听报告(Type=131) | 组播侦听报告消息 |
组播侦听离开(Type=132) | 组播侦听完成消息 |
组播侦听报告v2(Type=143) | 组播侦听报告消息(version2) |
3.6.2 报文格式
-
类型(Type)
-
编码(Code):被发送者初始化为0,接收者被忽略。
-
校验和(Checksum):标准的ICMPv6校验和;算它,它需要计算整个消息,包括IPv6的伪造报头。为了计算它,首先把它设置为0。收到包后,要先验证后处理。
-
最大响应延迟(Maximum Response Delay):最大响应延迟编码域指定了在发送响应报告的允许的最大延迟。实际时间叫做最大响应延迟,单位为毫秒。
-
预留(Reserved):被发送者初始化为0,被接收者忽略。
-
组播地址(Multicaset Address):对于一般的查询消息,组播地址为0。对于特定组地址或者特定组地址和源的查询消息来说,组播地址被设置成需要查询的地址。
-
查询者查询间隔编码(QQIC):查询者查询间隔编码域指定了查询者使用的查询间隔。实际间隔被叫作查询者查询间隔(QQI),它是以秒为单位的。
-
源个数(Number of Sources):源个数(N)指出在当前处在查询的源地址的个数。在一般查询消息或者特定组播地址的查询消息中源个数都为0,在特定源和组地址的查询消息中不为0。
3.6.3 工作机制
4 参考资料
组播及igmp/mld协议详解:
组播及igmp/mld协议详解(二)_mld头最小长度-CSDN博客
华为数通笔记-组播协议介绍之IGMP:
华为数通笔记-组播协议介绍之IGMP_igmp报告报文的目的地址-CSDN博客
【网络数据通信进阶】16 - 组播专题 - IGMP原理:
【网络数据通信进阶】16 - 组播专题 - IGMP原理_哔哩哔哩_bilibili
什么是组播、以及IGMP、PIM协议详解:
https://zhuanlan.zhihu.com/p/558610009
MLD(组播侦听发现协议):
IGMP、MLD原理:
PIM协议原理与配置
组播基本概念、组播协议之IGMP、PIM-DM 和PIM-SM