文章目录
-
-
- 一、IP组播基础。
-
- 1.组播的优势。
- 2.组播服务模型。
- 3.组播IP地址。
- 4.组播MAC地址。
- 二、IGMP。
-
- 1.IGMPv1。
- 2.IGMPv2。
- 3.IGMPv3。
- 4.IGMP不同版本互操作。
- 5.华为IGMP相关计时器的配置。
- 6.IGMP SSM Mapping。
- 7.IGMP Snooping。
- 8.组播VLAN。
- 三、PIM协议。
-
- 1.报文格式。
- 2.RPF检测。
- 3.PIM-DM。
- 4.PIM-SM(ASM模型)。
- 5.PIM-SM(SSM模型)。
- 四、组播IPv6。
-
一、IP组播基础。
1.组播的优势。
- 相比单播,由于被传递的信息在距信息源尽可能远的网络节点才开始被复制和分发,所以用户的增加不会导致信息源负载的加重以及网络资源消耗的显著增加。
- 相比广播,由于被传递的信息只会发送给需要该信息的接收者,所以不会造成网络资源的浪费,并能提高信息传输的安全性。
2.组播服务模型。
- ASM:任意源组播,仅根据组播地址区分不同的组播业务,比较浪费组播地址,一个组地址仅提供一种组播业务。
- SSM:指定源组播,根据组播地址和源地址共同区分不同的组播业务,节省了组播地址,但需要成员对源和组同时做出选择。
3.组播IP地址。
组播地址使用D类地址,范围是224.0.0.0-239.255.255.255,作为组播报文的目的地址。

4.组播MAC地址。
组播MAC地址的高24bit为0x01005e,第25bit默认为0,MAC地址的低23bit为组播IP地址的低23bit。

IPv4组播地址的前4位是固定的1110,对应组播MAC地址的高25位,后28位中只有23位被映射到MAC地址,因此丢失了5位的地址信息,直接结果是有32个IPv4组播地址映射到同一MAC地址上。例如IP地址为224.0.1.1、224.128.1.1、225.0.1.1、239.128.1.1等组播组的组播MAC地址都为01-00-5e-00-01-01。网络管理员在分配地址时必须考虑这种情况。
二、IGMP。
IGMP协议运行在主机与组播路由器之间。用来在接收者主机和与其所在网段直接相邻的组播路由器之间建立、维护组播组成员关系的协议。IGMP作用:
1.IGMPv1。
(1)报文。
- 普遍组查询报文:查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。周期性的向224.0.0.1地址发送通用查询报文,默认周期为60s。
- 成员关系报告报文:主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。
(2)报文格式。

- Version:IGMP版本,值为1。
- Type:报文类型。该字段有以下两种取值:
- 0x1:表示普遍组查询报文。
- 0x2:表示成员报告报文。
- Unused:在IGMPv1中,该字段在发送时被设为0,并在接收时被忽略。
- Checksum:IGMP报文的校验和。
- Group Address:组播组地址。在普遍组查询报文中,该字段设为0;在成员报告报文中,该字段为成员加入的组播组地址。
(3)工作机制。
-
IGMP查询器周期性60s发送普遍组查询报文,目的地址是224.0.0.1。
- IGMPv1没有查询器选举机制,使用PIM协议的DR路由器充当查询器。
-
组成员收到普遍组查询报文后,启动最大响应时间计时器。
-
第一个定时器超时的组成员发送针对该组的成员关系报告报文。
-
组成员关系报告抑制机制:也想加入这个组的主机收到上面的报告报文,则停止计时器,不再发送对该组的报告报文。目的是减少网段中的流量。
- 值得注意的是在路由器端会在IGMP组播组信息中记录,最后一个发送成员关系报告报文的主机的IP地址,即Last Reporter 。但是这台主机恰恰是在组成员抑制机制场景下第一个发送成员关系报告报文的主机。

-
IGMP路由器接收到主机的报告报文后,了解到本网段内存在组播G1的成员,则由组播路由器协议生成( * ,G)组播转发表项,“ * ”代表任意组播源。网络一旦有G的数据到达自己,将立刻向该网段转发。
-
新加入组成员时,不必等待普遍组查询报文,主机主动发送要加入组播组的成员关系报告报文。
-
IGMPv1没有设置离组机制,组成员静默离开,路由器在130s没有收到该组的组成员关系报告报文,则认为该组没有成员,删除对应的组播表项,停止向该链路上发送该组的组播流量。
- 组成员关系超时时间 = IGMP普遍组查询消息发送间隔 x 健壮系数 + 最大查询响应时间
2.IGMPv2。
(1)IGMPv2的改进。
- 设计了离组机制。
- 能够控制组成员的响应时间。
- 设计了自己的查询器选举机制。
- 设计了特定组查询报文。
(2)报文。
相较于IGMPv1,IGMPv2新增了两种报文:
- 成员离开报文:成员离开组播组时主动向查询器发送的报文,用于宣告自己离开某个组播组。
- 特定组查询报文:查询器向共享网段内指定组播组发送的查询报文,用于查询该组是否存在组成员。
(3)报文格式。

- Type:报文类型。该字段有以下四种取值:
- 0x11:表示查询报文。IGMPv2的查询报文包括普遍组查询报文和特定组查询报文两类。
- 0x12:表示IGMPv1成员报告报文。
- 0x16:表示IGMPv2成员报告报文。
- 0x17:表示成员离开报文。
- Max Response Time:最大响应时间。成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。该字段仅在IGMP查询报文中有效。
- Checksum:IGMP报文的校验和。
- Group Address:组播组地址。
- 在普遍组查询报文中,该字段设为0。
- 在特定组查询报文中,该字段为要查询的组播组地址。
- 在成员报告报文和离开报文中,该字段为成员要加入或离开的组播组地址。
(4)工作机制。
- 所有运行IGMPv2的路由器在最初都认为自己是查询器,向本网段所有主机和组播路由器发送普遍组查询报文,目的地址是224.0.0.1,并且报文中携带最大响应时间,用于控制组成员的响应时间。
- 在收到普遍组查询报文之后,IP地址小的路由器将成为查询器,其他成为非查询器。
- 此后,查询器将向其他主机和组播路由器发送普遍组查询报文。
- 非查询器将设置一个定时器(其他查询器存在时间,默认125S)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器,否则将认为原查询器失效,并发起新的查询器选举过程。
- 组成员离组时会主动发送离组报文,目的地址是224.0.0.2,有两种发送方式:
- 主机离组时主动发送离组报文。
- 当Last reporter离组时发送离组报文,非Last reporter离组不发送离组报文。具体采用哪种方式主要看主机是否知道Last reporter。
- 路由器收到离组报文之后,发送特定组查询报文,目的地址为离组的组地址。也有两种发送方式:
- 只要收到组成员的离组报文就发送特定组查询报文。
- 仅在收到Last reporter的离组报文之后,才会发送特定组查询报文。
- 默认每隔1S发送一次,连续发送两次,即总计时间为2S,2S内如果没有收到该组的成员关系报告报文,即认为组中不存在成员,删除组播表项停止该组的组播数据转发。
- 如果网段内还有组G2的其他成员,则这些成员在收到特定组查询报文后,会在该报文中指定的最大响应时间内发送针对组G2的报告报文。路由器继续维护该组成员关系。
3.IGMPv3。
IGMPv3主要是为了配合SSM(Source-Specific Multicast)模型发展起来的,提供了在报文中携带组播源信息的能力,即主机可以对组播源进行选择。
(1)IGMPv3报文的变化。
与IGMPv2相比,IGMPv3报文的变化如下:
- IGMPv3报文包含两大类:查询报文和成员报告报文。IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。
- 查询报文中不仅包含普遍组查询报文和特定组查询报文,还新增了特定源组查询报文(Group-and-Source-Specific Query)。该报文由查询器向共享网段内特定组播组成员发送,用于查询该组成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
(2)报文格式。
IGMPv3查询报文格式

- Type:报文类型,取值为0x11。
- Max Response Code:最大响应时间。成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。
- Checksum:IGMP报文的校验和。
- Group Address:组播组地址。在普遍组查询报文中,该字段设为0;在特定组查询报文和特定源组查询报文中,该字段为要查询的组播组地址。
- Resv:保留字段。发送报文时该字段设为0;接收报文时,对该字段不做处理。
- S:该比特位为1时,所有收到此查询报文的其他路由器不启动定时器刷新过程,但是此查询报文并不抑制查询器选举过程和路由器的主机侧处理过程。
- QRV:如果该字段非0,则表示查询器的健壮系数(Robustness Variable)。如果该字段为0,则表示查询器的健壮系数大于7。路由器接收到查询报文时,如果发现该字段非0,则将自己的健壮系数调整为该字段的值;如果发现该字段为0,则不做处理。
- QQIC:IGMP查询器的查询间隔,单位为秒。非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值;如果发现该字段为0,则不做处理。
- Number of Sources:报文中包含的组播源的数量。对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段非0。此参数的大小受到所在网络MTU大小的限制。
- Source Address 组播源地址,其数量受到Number of Sources字段值大小的限制。
IGMPv3成员报告报文格式

- Type:报文类型,取值为0x22。
- Reserved:保留字段。发送报文时该字段设为0;接收报文时,对该字段不做处理。
- Checksum:IGMP报文的校验和。
- Number of Group Records:报文中包含的组记录的数量。
- Group Record:组记录。
Group Record字段格式

- Record Type:组记录的类型。共分为三大类。
- 当前状态报告:用于对查询报文进行响应,通告自己目前的状态,共两种:
- MODE_IS_INCLUDE:表示接收源地址列表包含的源发往该组的组播数据。如果指定源地址列表为空,该报文无效;

- MODE_IS_EXCLUDE:表示不接收源地址列表包含的源发往该组的组播数据。

- 过滤模式改变报告:当组和源的关系在INCLUDE和EXCLUDE之间切换时,会通告过滤模式发生变化,共两种:
- 源列表改变报告:当指定源发生改变时,会通告源列表发生变化,共两种:
- ALLOW_NEW_SOURCES:表示在现有的基础上,需要接收源地址列表包含的组播源发往该组播组的组播数据。如果当前对应关系为INCLUDE,则向现有源列表中添加这些组播源;如果当前对应关系为EXCLUDE,则从现有阻塞源列表中删除这些组播源;

- BLOCK_OLD_SOURCES:表示在现有的基础上,不再接收源地址列表包含的组播源发往该组播组的组播数据。如果当前对应关系为INCLUDE,则从现有源列表中删除这些组播源;如果当前对应关系为EXCLUDE,则向现有源列表中添加这些组播源。

- Aux Data Len:辅助数据长度。在IGMPv3的报告报文中,不存在辅助数据字段,该字段设为0。
- Number of Sources:本记录中包含的源地址数量。
- Multicast Address:组播组地址。
- Sources Address:组播源地址。
- Auxiliary Data:辅助数据。预留给IGMP后续扩展或后续版本。在IGMPv3的报告报文中,不存在辅助数据。
(3)工作机制。
- 特定源组加入:与IGMPv2相比,IGMPv3增加了主机对组播源的选择能力。IGMPv3的成员报告报文的目的地址为224.0.0.22(表示同一网段所有使能IGMPv3的路由器)。通过在报告报文中携带组记录,主机在加入组播组的同时,能够明确要求接收或不接收特定组播源发出的组播数据。如下图所示,网络中存在S1和S2两个组播源,均向组播组G发送组播数据,Host仅希望接收从组播源S1发往组播组G的信息。
- 方法一:Host发送IGMPv3报告(G,INCLUDE,(S1)),仅接收源S1向组播组G发送的数据。
- 方法二:Host发送IGMPv3报告(G,EXCLUDE,(S2)),不接收指定源S2向组播组G发送的数据,从而仅有来自S1的组播数据才能传递到Host。
- 特定源组查询:当接收到组成员发送的改变组播组与源列表的对应关系的报告时(CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE),IGMP查询器会发送特定源组查询报文。如果组成员希望接收其中任意一个源的组播数据,将反馈报告报文。IGMP查询器根据反馈的组成员报告更新该组对应的源列表。

4.IGMP不同版本互操作。
IGMPv2主机与IGMPv1路由器兼容:
- 当版本2的主机发现版本1的路由器后,版本2的主机必须发送Type字段等于 0x12的版本1的成员关系报告报文,并且不能发送成员离开报文。
- 同一网段既有版本1路由器,又有版本2路由器,则查询路由器必须发送版本1报文。一般情况IGMPv2的路由器会充当查询器,应为IGMPv1没有查询器选举机制。
IGMPv2路由器与IGMPv1主机兼容:
- 版本2主机的成员关系报告报文必须被版本1主机的成员关系报告报文抑制,否则查询者将不会知道网络中存在版本1的主机。如果查询者为版本2路由器,且该查询者收到成员关系(假设版本1主机在该组中)离开报文,则会导致版本1主机不能收到特定组的流量。
- IGMPv2路由器如果发现网络中存在版本1的主机后,该路由器会忽略后续收到的成员离开报文。
5.华为IGMP相关计时器的配置。
- igmp timer query 10 修改IGMPv1/v2/v3的普通组查询发送间隔
- igmp max-response-time 修改IGMPv2/v3普通组查询的最大的响应时间
- igmp lastmember-queryinterval 修改指定组查询的最大响应时间IGMPv2/v3
- igmp robust-count 指定特定组查询连续发送的次数,IGMPv2/v3
- igmp timer other-querier-present 其他查询器失效时间IGMPv2/v3
6.IGMP SSM Mapping。
SSM(Source-Specific Multicast)称为指定源组播,要求路由器能了解成员主机加入组播组时所指定的组播源。如果成员主机上运行IGMPv3,可以在IGMPv3报告报文中直接指定组播源地址。但是某些情况下,成员主机只能运行IGMPv1或IGMPv2,为了使其也能够使用SSM服务,路由器上需要提供IGMP SSM Mapping功能。
(1)工作机制。
- 通过在路由器上静态配置SSM地址的映射规则,将IGMPv1和IGMPv2报告报文中的(*, G)信息转化为对应的(G, INCLUDE, (S1, S2…))信息,以提供SSM组播服务。
- 配置了SSM Mapping规则后,当IGMP查询器收到来自成员主机的IGMPv1或IGMPv2报告报文时,首先检查该报文中所携带的组播组地址G,然后根据检查结果的不同分别进行处理。
- 如果G在ASM(Any-Source Multicast)范围内,则只提供ASM服务。
- 如果G在SSM组地址范围内(缺省情况下为232.0.0.0~232.255.255.255):
- 如果路由器上没有G对应的SSM Mapping规则,则无法提供SSM服务,丢弃该报文。
- 如果路由器上有G对应的SSM Mapping规则,则依据规则将报告报文中所包含的(*, G)信息映射为(G, INCLUDE, (S1, S2…))信息,提供SSM服务。

- SSM网络中PC1运行IGMPv3、PC2运行IGMPv2、PC3运行IGMPv1。PC2和PC3无法升级到IGMPv3,如果要为该网段中的所有主机提供SSM服务,需要在R1上使用IGMP SSM Mapping。
- 使能映射前,R1上的映射关系如下:
- 组播组----源:232.0.0.0/8----10.10.1.1
- 组播组----源:232.1.0.0/16----10.10.2.2
- 组播组----源:232.1.1.0/24----10.10.3.3
- 使能映射后,首先判断报文携带的组地址是否在SSM范围内,发现在SSM范围内,则根据配置的映射规则生成如下所示的组播表项。如果一个组地址映射了多个源,则生成多个(S,G)表项。这里给出针对PC2和PC3报告报文形成的表项:
- (10.10.1.1,232.1.2.2)
- (10.10.2.2,232.1.2.2)
- (10.10.1.1,232.1.3.3)
- (10.10.2.2,232.1.3.3)
(2)配置。

7.IGMP Snooping。
当Router将组播报文转发至Switch以后,Switch负责将组播报文转发给组播用户。由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC表项的,因此组播报文就会在所有接口进行广播,和它在同一广播域内的组播成员和非组播成员都能收到组播报文。这样不但浪费了网络带宽,而且影响了网络信息安全。

配置IGMP Snooping后,二层组播设备可以侦听和分析组播用户和上游路由器之间的IGMP报文,根据这些信息建立二层组播转发表项,控制组播数据报文转发。这样就防止了组播数据在二层网络中的广播。

(1)工作原理。

(2)工作机制。
二层组播设备运行了IGMP Snooping后,收到不同的IGMP协议报文会进行不同的处理,并在此过程中建立起二层组播转发表项。

此外,当二层组播设备收到PIM Hello报文时,向VLAN内除接收接口外的其他所有接口转发,并对接收接口做如下处理:
- 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器。
- 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器。
- 老化时间为Hello报文中Hold time字段的值。
8.组播VLAN。
解决路由器为不同VLAN用户复制多份流量的问题。
(1)二层组播。
- 如果不同VLAN的用户有相同的组播数据需求时,上游路由器仍然需要发送多份相同报文到不同VLAN中。
- 属于不同VLAN(VLAN2和VLAN3)的用户需要接收相同的组播流,上游路由器R1就会把组播数据在每个VLAN内都复制一份然后发送给下游交换机S1。这样,既造成了路由器与二层设备之间带宽的浪费,也增加了路由器额外的负担。

(2)组播VLAN。
- 组播VLAN,在二层网络设备上进行跨VLAN组播复制。
- 在交换机上部署了组播VLAN功能后,上游路由器不必在每个用户VLAN(VLAN2和VLAN3)内都复制一份组播流,而是数据流在组播VLAN(VLAN4)内复制一份后发送给二层设备。这样就避免了组播流在上游设备的重复复制,不仅节省了网络带宽,又减轻了上游路由器的负担。
(3)配置。

- igmp-snooping enable 使能IGMP Snooping
- multicast-vlan enable 配置当前VLAN为组播VLAN
- multicast-vlan user-vlan 100 200 300 绑定用户VLAN 100、VLAN 200和VLAN 300
- igmp-snooping querier enable 使能IGMP Snooping查询器功能
三、PIM协议。
PIM(Protocol Independent Multicast)称为协议无关组播。这里的协议无关指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息。它直接利用单播路由表的路由信息,对组播报文执行RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文。
1.报文格式。
(1) PIM 通用格式。

- Version:4比特 PIM版本,值为2
- Type:4比特, 消息类型,取值如下:
- 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比特,保留。
- Reserved 8比特 保留。
(2)PIM Hello消息格式。

2.RPF检测。
路由器收到一份组播报文后,会根据报文的源地址通过单播路由表查找到达“报文源”的路由,查看到“报文源”的路由表项的出接口是否与收到组播报文的入接口一致。如果一致,则认为该组播报文从RPF接口到达,从而保证了整个转发路径的正确性和唯一性。这个过程就被称为RPF检查。 检测过程如下:
- 首先,通过报文源地址,分别从单播路由表、MBGP路由表和组播静态路由表中各选出一条最优路由。出接口为RPF接口,下一跳为RPF邻居。
- 然后,根据以下原则从这三条最优路由中选择一条作为RPF路由。
- 如果配置了按照最长匹配选择路由,则从这三条路由中选出最长匹配的那条路由;如果这三条路由的掩码一样,则选择优先级最高的那条路由;如果它们的优先级也相同,则按照组播静态路由、MBGP路由、单播路由的顺序进行选择。
- 如果没有配置按照最长匹配选择路由,则从这三条路由中选出优先级最高的那条路由;如果它们的优先级相同,则按照组播静态路由、MBGP路由、单播路由的顺序进行选择。
- 按照最长匹配原则匹配路由的命令:multicast longest-match。
- 最后,路由器会将报文的入接口与RPF路由的RPF接口进行比较。如果一致则RPF检查通过,表明该报文来源路径正确,会将其向下游转发;如果不一致即RPF检查失败,表明该报文来源路径错误,就将其丢弃。
下面是RPF检测的两种应用场景:
- 去往组播源有多个接口,则接口地址大的是RPF接口,RPF接口上的PIM邻居为RPF邻居。

- RPF接口上存在多个PIM邻居,则地址大的邻居为RPF邻居。

3.PIM-DM。
PIM-DM密集模式,假定网络中的每一条链路都存在组成员。只需要把组播流量“推”到每条链路上上即可完成。一般应用于组播组成员规模相对较小、相对密集的网络。
(1)邻居发现。
- 在PIM-DM网络中,路由器周期性发送Hello消息,目的地址是224.0.0.13,来发现、建立并维护邻居关系。
- pim timer hello xxx 在接口视图下配置Hello消息时间间隔,默认30s。
- pim hello-option holdtime xxx 在接口视图下配置Hello消息超时时间间隔,默认105s。
(2)DR。
- DR选举:通过Hello消息中携带的优先级和IP地址进行选举。
- 优先级大的成为DR,可以抢占。
- 优先级相同,接口IP地址大的成为DR。
- 如果当前DR出现故障,将导致PIM邻居关系超时(缺省为105秒),其他PIM邻居之间会触发新一轮的DR竞选。
- DR作用:
- 作为IGMPv1的查询器。
- 稀疏模式中用于组播源注册,用于构建RPT树。
- DR对于密集模式没有作用。
(3)扩散机制。
- PIM路由器收到组播流量,根据组播源地址进行RPF检测。
- 检测通过,创建(S,G)表项,即创建SPT树。
- (S,G)表项的上游接口是RPF接口,负责接收组播流量。
- (S,G)表项的下游接口是存在PIM邻居和组成员的接口,RPF接口除外。
- 将组播流量泛洪到下游接口。
(4)剪枝/加入机制(prune/join)。

- 正常剪枝:PC3-R5-R1的过程
- 当路由器发现(S,G)表项的下游接口为Null时,则由RPF接口向RPF接口上的所有PIM邻居发送prune报文(携带RPF邻居的地址,目的地址是224.0.0.13)。
- 当RPF邻居收到prune报文之后,在3s(PPT时间)内没有收到join报文,则将自己(S,G)表项中收到剪枝报文的接口删除,并且判断自身的(S,G)表项的下游接口是否为Null。
- 如果为Null则由RPF接口继续向RPF接口上的所有PIM邻居发送prune报文,进行相同的操作。
- 如果不为Null则prune结束。
- 剪枝否决:PC2-R4-R2 R3-R2
- 当同一网段中有路由器向上游发送剪枝报文时,如果其他路由器仍然需要接收组播数据,则必须在override-interval时间内向上游发送join报文。
- Hello报文中lan-delay + override-interval = PPT=3s。路由器接收到下游剪枝报文后,并不立即执行剪枝操作,而是等待一个PPT(Prune-Pending Timer)时间,超时则剪枝。在PPT时间内如果收到下游发来的join报文,则取消剪枝操作。
(5)周期性“扩散-剪枝”机制。
- 工作机制:
- 每一个收到剪枝报文的PIM路由器都会为下游的PIM路由器维护一个剪枝定时器,默认210s,当剪枝定时器超时后,就会恢复对下游设备的数据转发。
- 如果下游设备的链路上依然不存在组成员,则继续向上游设备执行剪枝操作。
- 作用:
- 向全网的路由器表达组播源的活跃性。
- 周期性扩散,保证全网PIM路由器能持续维护活跃的组播源的(S,G)表项,方便后续组成员快速获得组播流量。
- 缺点:如果下游设备上一直不存在组成员,则周期性的扩散-剪枝机制会导致不必要的网络资源浪费。
(6)状态刷新机制。
通过第一跳路由器周期性发送State Refresh来避免被裁剪的接口因为“剪枝定时器”超时而恢复转发。
- 解决周期性“扩散-剪枝”机制带来的问题。
- 离组播源最近的第一跳PIM路由器周期性触发State Refresh消息。
- State Refresh消息在全网扩散,刷新所有设备上的剪枝定时器状态。
- 刷新(S,G)表项的老化计时器,保证全网PIM路由器能持续维护活跃的组播源的(S,G)表项,方便后续组成员快速获得组播流量。
- 状态刷新使得PIM路由器不再周期性的收到组播数据,但是当有组成员加组之后,如果一直是剪枝状态,用户无法收到组播数据,此时就需要嫁接机制。
- 接口视图下undo pim state-refresh-capable 禁止状态刷新报文的转发嫁接机制。
- pim视图可使用state-refresh-interval xxx 配置配置状态刷新报文的发送周期。
(7)嫁接机制。
- 作用:在剪枝的路径上加入组成员后,能快速获得组播流量。
- 工作机制:
- 嫁接机制的前提是路由器必须存在对应的(S,G)表项,所以DM模式为了让活跃的(S,G)表项不被老化,采用了周期性扩散-剪枝机制和状态刷新机制,来保证全网(S,G)表项不被老化。
- 叶子路由器在收到成员关系报告报文之后,根据组地址,查找对应的(S,G)表项,找到源地址,根据去往源的RPF接口向RPF邻居发送单播的Graft报文。
- 上游的路由器在收到Graft报文之后,执行两个操作:
- 向下游发送Graft-Ack报文。
- 将接收到Graft报文的接口重新加入到自身的(S,G)表项的下行口。
- 如果嫁接的接口是唯一的下行口,则继续根据去往源的RPF接口向RPF邻居发送单播的Graft报文;
- 如果不是唯一的下行口,则停止嫁接,向嫁接添加的下行口发送对应的组播流量。
(8)断言机制。(Assert)
- 作用:解决共享链路上发送重复组播流量的问题。
- 工作机制:
- 当路由器接口发送组播流量时,同时在接口上有收到了同源同组的组播流量,触发断言机制。
- 在该接口上向所有的PIM邻居发送断言报文。
- 断言报文携带着三个选举参数:
- 自身到达组播源路由的协议优先级。
- 身到达组播源路由的开销值。
- 自身接口的IP地址。

- 比较协议的优先级,最优的成为断言的胜利者。
- 协议优先级相同比较开销值,开销小的成为胜利者。
- 开销相同,则比较接口地址,大的成为胜利者。
- 断言的胜利者和和失败者将互相发送prune报文,将接受到prune报文的接口从自身的(S,G)表项中删除。
- 但是如果共享链路上依然存在其他的PIM邻居,将会出发剪枝否决机制,在2.5s之内这台PIM路由器将会发送join报文,携带自己的RPF邻居,取消断言胜利者剪枝操作。
- 如果存在断言的优胜者和RPF邻居不一致的情况则断言的优胜者做RPF邻居。

4.PIM-SM(ASM模型)。
PIM-SM适用于ASM和SSM两种模型。在ASM模型中,它使用“拉(Pull)模式”转发组播报文,一般应用于组播组成员规模相对较大、相对稀疏的网络。
(1)邻居发现和DR竞选。
邻居发现和PIM-DM模式完全一致,DR的竞选也和PIM-DM模式完全一致,不同之处在DR在PIM-DM模式下没有作用,在PIM-SM模式下的作用如下:
- 在连接组播源的共享网段,由DR负责向RP发送Register注册报文。与组播源相连的DR称为源端DR。
- 在连接组成员的共享网段,由DR负责向RP发送Join加入报文。与组成员相连的DR称为组成员端DR。
(2)RP的发现。
汇聚点RP为网络中一台重要的PIM路由器,用于处理源端DR注册信息及组成员加入请求,网络中的所有PIM路由器都必须知道RP的地址,类似于一个供求信息的汇聚中心。一个组播组只能对应一个RP,一个RP可以对应多个组播组。目前可以通过以下方式配置RP:
- 静态RP:在网络中的所有PIM路由器上配置相同的RP地址,静态指定RP的位置。
- 动态RP:在PIM域内选择几台PIM路由器,配置C-RP来动态竞选出RP。同时,还需要通过配置C-BSR选举出BSR,来收集C-RP的通告信息,向PIM-SM域内的所有PIM路由器发布。
动态RP的竞选过程:
- 首先需要竞选BSR,C-BSR在竞选的时候,开始时每个C-BSR都认为自己是BSR,向全网发送Bootstrap报文。Bootstrap报文有以下发送特点:
- 向所有存在PIM邻居的接口上发送,源地址为接口IP,目的地址为224.0.0.13,携带BSR优先级,BSR竟选地址,Hash掩码。

- 优先级大的成为BSR,优先级相同,BSR的IP地址大成为BSR,竞争失败的C-BSR不再发送自举报文,BSR每隔60s发送自举报文。C-BSR如果在150s没收到BSR的自举报文,则认为BSR失效,进行新的一轮选举。
- BSR协议的RPF检测,用来防止Bootstrap报文的泛洪环路。对接口接收的Bootstarp报文进行RPF检查,同时满足以下2个条件才接收:
- 该接口是去往BSR地址的RPF接口。
- Bootstrap报文源地址是去往BSR地址的RPF邻居的地址。

- 接下来进行C-RP的竞选过程如下:
- C-RP向BSR发送单播的Advertisement报文,报文中携带C-RP地址、服务的组范围和C-RP优先级。

- BSR将这些信息汇总为RP-Set,封装在Bootstrap报文中,发布给全网的每一台PIM-SM路由器。

- 各PIM路由器根据RP-Set,使用相同的规则进行计算和比较,从多个针对特定组的C-RP中竞选出该组RP。规则如下:
- 与用户加入的组地址匹配的C-RP服务的组范围掩码最长者获胜。
- 如果以上比较结果相同,则C-RP优先级较高者获胜(优先级数值越小优先级越高)。
- 如果以上比较结果都相同,则执行Hash函数,计算结果较大者获胜。
- hash掩码长度的作用:用32位的掩码减去hash掩码长度,计算结果为x。然后进行2^x计算,用计算的结果将组播组分组,轮询选择RP,实现RP的负载分担。例如:hash掩码长度是30,计算结果是2,2的2次方等于4,所以将组播组地址4个分为一组,轮询选择RP。
- 如果以上比较结果都相同,则C-RP的IP地址较大者获胜。
(3)RPT树的构建。
PIM-SM模式(*,G)表项规则生成规则:
- ( * ,G)总是被显式的Report报文或者( * ,G)Join报文触发而产生。
- ( * ,G)上行接口规则:总是指向去往该组的RP的RPF接口。
- ( * ,G)下行接口规则:收到report报文或者( * ,G)join报文做为下行接口。
构建过程:
- 用户主机通过IGMP加入某组播组G,组成员端DR接收到成员关系报告报文生成(*,G)表项,将收到成员关系报文的地址作为下行接口,将去往RP的RPF接口作为上行接口。
- 组成员端DR发送(*,G)的Join报文,报文携带RPF邻居地址。
- RPF接收到Join报文后,创建(*,G)表项,将收到Join报文的接口作为下行接口,将去往RP的RPF接口作为上行接口。
- 以此类推,在通向RP的路径上逐跳创建(*,G)表项,生成一棵以RP为根的RPT。
- 在RPT构建过程中,PIM路由器在发送Join报文时,会进行RPF检查:查找到达RP的单播路由,单播路由的出接口为上游接口,下一跳为RPF邻居。Join报文从组成员端DR开始逐跳发送,直至到RP。
(4)组播源注册。
RPT树上没有接收者:
- 源开始发送组播流量。
- 源端DR将信息包封装在Registers消息中封装包,单播到RP。
- RP在共享树上没有接收者则丢弃该包。RP向DR发送Register-Stop报文。
- 源端DR在自身(S,G)表项没有老化删除之前,会每隔60s秒周期性发送register报文,用于告知组播源是活跃的。
- 当(S,G)表项不存在后,则不再发送Regisiter,当再次创建(S,G)表项是会立即发送注册报文。
- 当源端DR路由器接收到从RP发来的针对(S,G)表项的Register-Stop报文后,会立刻停止发送封装组播数据的Register报文,此时路由器进入注册抑制状态。
- 执行命令register-suppression-timeout xx 可设置注册抑制状态的超时时间。超时后,源端DR将恢复向RP发送Register报文。
RPT树上有接收者:
- 源开始发送组播流量。
- 源端DR将信息包封装在Registers消息中封装包,单播到RP。
- RP在共享树上存在接收者则RP向DR发送Register-Stop报文。创建(S,G)表项,将(*,G)表项的下游接口复制到(S,G)表项的下游接口,然后向下游接口发送组播流量。
- 同时RP会向源端DR逐跳发送(S,G)的Join报文。发送过程中在PIM路由器创建(S,G)表项,从而建立了RP到源的SPT。
RPT树上有接收者:
- 源开始发送组播流量。
- 源端DR将信息包封装在Registers消息中封装包,单播到RP。
- RP在共享树上存在接收者则RP向DR发送Register-Stop报文。创建(S,G)表项,将(*,G)表项的下游接口复制到(S,G)表项的下游接口,然后向下游接口发送组播流量。
- 同时RP会向源端DR逐跳发送(S,G)的Join报文。发送过程中在PIM路由器创建(S,G)表项,从而建立了RP到源的SPT。
(5)SPT切换。
RP是所有组播报文必经的中转站,当组播报文速率逐渐变大时,对RP形成巨大的负担。为了解决此问题,PIM-SM允许RP或组成员端DR通过触发SPT切换来减轻RP的负担。
- 切换条件:华为路由器,缺省情况下组成员的路由器在接收到第一个数据报文之后,便立即加入SPT树,即从RPT向SPT切换。这是因为华为路由器会默认根据组播数据报文创建(S,G)表项即创建了SPT树。
- 切换的过程:
- 组成员端DR逐跳向源端DR逐跳发送Join报文并创建(S,G)表项,建立源端DR到组成员DR的SPT。
- 组成员端DR会沿着RPT逐跳向RP发送剪枝报文,让RP删除(S,G)表项中相应的下游接口。剪枝结束后,RP不在沿着RPT转发组播报文到组成员端。
- Prune/Join报文中flag字段三个重要的bit位:
- S :等于1表示稀疏模式。
- W:等于1表示Prune/Join的source是RP的地址即(*,G)表项,等于0表示Prune/Join的source是组播源的地址(S,G)表项。
- R:等于1表示Prune/Join报文是沿着RPT树发给RP的,等于0表示Prune/Join报文是沿着组播源的RPF接口发给组播源的。

- 如果SPT不经过RP,RP会继续向源端DR逐跳发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,源端DR不再沿“源端DR-RP”的SPT转发组播报文到RP。
- spt-switch-threshold infinity 命令关闭SPT树的切换。
(6)断言机制。

5.PIM-SM(SSM模型)。
SSM模型是借助PIM-SM的部分技术和IGMPv3/MLDv2来实现的,无需维护RP、无需构建RPT、无需注册组播源,可以直接在源与组成员之间建立SPT。使用组播地址232.0.0.0-232.255.255.255。

SPT的建立过程如下:
- R3、R5借助IGMPv3协议了解到用户主机有到相同组播组不同组播源的组播需要,逐跳向源方向发送Join报文。
- PIM路由器通过Join报文分别创建(S1,G)、(S2,G)表项,从而分别建立了源S1到组成员PC1、源S2到组成员PC2的SPT。
- SPT建立后,源端就会将组播报文沿着SPT分发给组成员。
四、组播IPv6。
组播IPv6协议的工作原理与IPv4大致相同。主要不同之处在于IPv6协议使用MLD协议代替的IPv4中的IGMP协议。组播IPv6的PIM-SM协议可以利用嵌入式RP实现,RP的自动发现。
1.MLD协议。
组播侦听者发现协议MLD(Multicast Listener Discovery)是负责IPv6组播成员管理的协议,用来在IPv6成员主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。MLD通过在成员主机和组播路由器之间交互MLD报文实现组成员管理功能,MLD报文封装在IPv6报文中。到目前为止,MLD由以下两个版本:
- MLDv1版本,对应IGMPv2。
- MLDv2版本,对应IGMPv3。
MLDv1的工作机制与IGMPv2相同,基于查询和响应机制完成对IPv6组播组成员的管理。MLDv2在MLDv1的基础上,增加的主要功能是成员主机可以指定接收或不接收某些组播源的报文。MLD两个版本在演进过程中对协议报文的处理是向前兼容的,即运行MLDv2的组播路由器可以识别MLDv1的协议报文。
(1)MLDv1报文。
- 普遍组查询报文:Type值是130,查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。
- 特定组查询报文:Type值是130,查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员。
- 成员报告报文:Type值是131,主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。
- 成员离开报文:Type值是132,主机离开组播组时主动向查询器发送的报文,用于宣告自己离开了某个组播组。
(2)MLDv2报文。
- MLDv2报文包含两大类:查询报文和成员报告报文。MLDv2没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。
- 查询报文中不仅包含普遍组查询报文和特定组查询报文,还新增了特定源组查询报文。该报文由查询器向共享网段内特定组播组成员发送,目的地址是FF02::16,用于查询该组成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
2.嵌入式RP。
(1)嵌入式RP的工作原理。
- 使能嵌入RP功能允许路由器从IPv6组播组地址中分析出RP的地址,从而取代静态配置RP或由BSR动态计算的RP。
- 接收者主机发布MLD报告消息,加入组播组;接收侧DR提取内嵌在组播组地址中的RP地址,向其发送IPv6 PIM-SM加入消息。
- 组播源知道组播地址后,向此组播组发送报文;源侧DR提取内嵌在组地址中的RP地址,向其以单播方式发送IPv6 PIM-SM注册消息。
(2)内嵌地址的规则。
内嵌地址范围:使用嵌入式RP的组播组地址范围是FF7x::/16和FFFx::/16,x表示0~F的任意一个十六进制数。

- 头8bits为FF说明是IPv6组播地址。
- Flags字段的范围是7-F,说明是一个嵌入了RP地址的IPv6组播组地址。
- RIID字段:RP Interface ID,抽取出来填充在RP地址的最后4bits。
- Plen字段:RP地址的前缀长度,换算成十进制数后不能为0,也不能大于64。
- Network Prefix字段:RP的地址前缀。
- Group ID:组ID。
例子:组播地址FF70:0140:2001:0DB8:BEEF:FEED::/96,则从组播地址中获取的RP地址为2001:DB8:BEEF:FEED::1/64。