一、组播基础
1.1 组播介绍
作为传统IP传输三种方式之一,IP组播通信指的是IP报文从一个源发出,被转发到一组特定的接收者。相较于传统的单播和广播,IP组播可以有效地节约网络带宽,降低网络负载,所以别广泛应用于IPTV,实时数据传送和多媒体会议等网络业务中。
传统的IP通信有两种方式:单播(Unicast)和广播(Broadcast)
- 对于单播通信,信息源为每个需要信息的主机都发送一份独立的报文。
- 对于广播通信,组播源将信息发送给该网段中的所有主机,而不管其是否需要该信息。
- 采用单播方式时,网络中传输的信息量与需要该信息的用户量成正比,当需要该信息的用户数量较大时,信息源需要将多份内容相同的信息发送给不同的用户,这对信息源以及网络带宽都将带来巨大的压力,因此,该传输方式不利于信息的批量发送,只适用于用户稀少的网络。
- 采用广播方式时,不需要接收信息的主机也将收到该信息,这样不仅信息的安全性得不到保障,而且会造成同一网段中信息泛滥,因此,该传输方式不利于与特定对象进行数据交互,同时会浪费大量的带宽。
由上述可见,传统的单播和广播通信方式不能有效地解决单点发送,多点接收的问题。组播(Multicast)可以很好的解决点到多点的数据传输,如下图所见,源只发送一份数据,网络中只要需要该数据的主机(目标主机HostA和HostC)可以接收该数据,其它主机(HostB)不能收到该数据。
组播相对单播和广播有如下优势:
- 相对单播,由于被传递的信息在距信息源尽可能远的网络节点才开始被复制和分发, 所以用户的增加并不会导致信息源负载的加重以及网络资源消耗的显著增加。
- 相对广播,由于被传递的信息只会发送给需要该信息的接收者,所以不会造成网络资源的浪费,并能提高信息传输的安全性。
组播适用于任何“点到多点”的数据发布,主要包含以下几方面:
- 多媒体,流媒体的应用
- 培训,联合作业场合的通信
- 数据仓库,金融应用(股票)
IP组播技术在ISP提供的互联网信息服务中已经得到应用。例如:在线直播、网络电视、远程教育、远程医疗、网络电台和实时音视频会议等。
1.2 组播基本概念
- 组播组:用IP组播地址进行标识的一个集合。任何用户主机(或其它接收设备),加入一个组播组,就成为了该组成员,可以识别并接收发往该组播组的组播数据。
- 组播源:信息的发送者称为“组播源”,如上图中的Server。一个组播源可以同时向多个组播组发送数据,多个组播源也可以同时向一个组播源发送报文。组播源通常不需要加入组播组,由源端DR负责管理组播源的注册和SPT的建立。
- 组播组成员:所有加入某组播组的主机便成为该组播组的成员,如上图中的PC1和PC3。组播组中的成员是动态的,主机可以在任何时刻加入或离开组播组。组播组成员可以广泛地分布在网络中的任何地方。
- 组播路由器:支持三层组播功能的路由器或交换机,如上图中的各个Router。组播路由器不仅能够提供组播路由功能,也能够在与用户连接的末梢网段上提供组播组成员的管理功能。 | 顺序 | 电视节目传输过程 | 组播方式传输过程 | | :—-: | :—-: | :—-: | | 1 | 电视台向频道内发送数据 | 组播源向组播组发送数据 | | 2 | 观众打开电视机选择到这个频道 | 接收者主机加入该组播组 | | 3 | 电视机播放该频道电视节目 | 主机接收到发送给这个组的数据 | | 4 | 观众可以随时控制电视机的开关和频道间的切换 | 主机可以动态加入或退出组播组 |
1.3 组播服务模型
组播服务模型的分类是针对接收者主机的,对组播源没有区别,组播源发出的组播数据中总是以组播源自己的IP地址为报文的源地址,组播组地址为目的地址。而接收者主机接收数据时可以对源进行选择,因此产生了ASM(Any-Source Multicast)和SSM(Source-Specific Multicast)两种服务模型。这两种服务模型默认使用不同的组播组地址范围。
ASM(Any-Source Multicast):任意源组播模型
SFM(Source-Filtered Multicast):源过滤组播模型
SSM(Source-Specific Multicast):指定源组播模型
1.3.1 ASM模型
- ASM模型
- ASM模型就是任意源组播模型
- 在该模型中,任意发送者都可以成为组播源,向某组播组地址发送信息。
- 众多接收者通过加入由该地址标识的主机组,从而接收到发往该组播组的所有信息。
- 在ASM模型中,接收者无法预先知道组播源的位置,接收者可以在任意时间加入或离开该主机组。
ASM模型仅针对组地址提供组播分发,一个组播组地址作为一个网络服务的集合,任意源发布到该组地址的数据得到同样的服务。接收者主机加入组播源以后可以接收到任意源发送到该组的数据。
为了提高安全性,可以在路由器上配置针对组播源的过滤策略,允许或禁止来自某些组播源的报文通过。最终从接收者角度看,数据经过筛选的。
ASM模型要求组地址必须整个组播网络中唯一。“唯一”指的是同一时刻一个ASM地址只能被一种组播应用使用。如果有两种不同的应用程序使用了同一个ASM组地址发送数据,它们的接收者会同时收到来自两个源的数据。这样一方面会导致网络流量拥塞,另一方面也会给接收者主机造成困扰。
1.3.2 SFM模型
- SFM模型
- SFM模型继承了ASM模型, 从发送者角度来看,组播组成员关系完全相同。
- SFM在功能上对ASM进行了拓展:上层软件对接收到的组播报文的源地址进行检查,允许或禁止来自某些组播源的报文通过。最终,接收者只能接收到来自部分组播源的数据。
- 从接收者角度来看,只有部分组播源是有效的,组播源经过了筛选。
1.3.3 SSM模型
- SSM模型
- 在现实生活中,用户可能仅对某些源发送的组播信息感兴趣,而不愿意接收其它源发送的信息。
- SSM模型为用户提供了一种能够在客户端指定信源的传输服务。
- SSM模型和ASM模型的根本区别是接收者已经通过其他手段预先知道了组播源的具体位置。
- SSM使用和ASM不同的组播地址范围,直接在接收者和其指定的组播源之间建立专用的组播转发路径。
SSM模型针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时,可以指定只接收哪些源的数据或指定拒绝接收来自哪些源的数据。加入组播源以后,主机只会收到指定源发送到该组的数据。
SSM模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。这里的“唯一”指的是同一个源上不同的组播应用必须使用不同的SSM地址来区分。不同的源之间可以使用相同的组地址,因为SSM模型中针对每一个(源、组)信息都会生成表项。这样一方面节省了组播组地址,另一方面也不会造成网络拥塞。
1.4 组播地址
1.4.1 组播IP地址
为了使组播源和组播成员进行通信,需要提供网络层组播,使用IP组播地址。同时,为了在本地物理网络上实现组播信息的正确传输,需要提供链路层组播,使用组播MAC地址。组播数据传输时,其目的地不是一个具体的接收者,而是一个成员不确定的组,所以需要一种技术将IP组播地址映射为组播MAC地址。
永久组地址
- IANA为路由协议预留的组播地址,用于标识一组特定的网络设备(也称为保留组播组)
- 224.0.0.5 OSPF路由器
- 永久组地址保持不变,组成员的数量可以是任意的,甚至可以为零。
临时组地址
- 为用户组播组临时分配的IP地址,组成员的数量一旦为零,即取消。
常见组播IP地址分类
- 224.0.0.0到224.0.0.255为IANA预留的永久组地址,地址224.0.0.0保留不做分配,其它地址供路由协议进行拓扑查找和维护协议使用。该范围内的地址属于局部范畴,不论生存时间字段(TTL)值是多少,都不会被路由器转发,即只在本链路上进行转发。
- 239.0.0.0到239.255.255.255,用户可用的ASM临时组地址,仅在特定的本地管理域内有效,称为本地管理组地址。本地管理组播地址属于私有地址,在不同的管理域内使用相同的本地管理组播地址不会导致冲突。
常用永久组地址
永久组地址 | 含义 |
---|---|
224.0.0.0 | 不分配 |
224.0.0.1 | 网段内所有主机和路由器(等效于广播地址) |
224.0.0.2 | 所有组播路由器 |
224.0.0.3 | 不分配 |
224.0.0.4 | DVMRP(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)路由器 |
224.0.0.5 | OSPF(Open Shortest Path First,开放最短路径优先)路由器 |
224.0.0.6 | OSPF DR(Designated Router,指定路由器) |
224.0.0.7 | ST(Shared Tree,共享树)路由器 |
224.0.0.8 | ST主机 |
224.0.0.9 | RIP-2(Routing Information Protocol version 2,路由信息协议版本2)路由器 |
224.0.0.11 | 移动代理(Mobile-Agents) |
224.0.0.12 | DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 服务器/中继代理 |
224.0.0.13 | 所有PIM(Protocol Independent Multicast,协议无关组播)路由器 |
224.0.0.14 | RSVP(Resource Reservation Protocol,资源预留协议)封装 |
224.0.0.15 | 所有CBT(Core-Based Tree,有核树)路由器 |
224.0.0.16 | 指定SBM(Subnetwork Bandwidth Management,子网带宽管理) |
224.0.0.17 | 所有SBM |
224.0.0.18 | VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议) |
224.0.0.22 | 所有使能IGMPv3(Internet Group Management Protocol, Version 3, 因特网组管理协议)的路由器 |
224.0.0.19 ~ 224.0.0.21 224.0.0.23 ~ 224.0.0.255 |
未指定 |
- 需要记住的 | 224.0.0.1 | 所有主机与路由器 | | :—-: | :—-: | | 224.0.0.2 | 所有组播路由器 | | 224.0.0.5 | OSPF路由器 | | 224.0.0.6 | OSPF DR和BDR | | 224.0.0.9 | RIPv2路由器 | | 224.0.0.12 | DHCP中继代理 | | 224.0.0.13 | 所有PIM路由器 | | 224.0.0.22 | 所有IGMPv3路由器 |
1.4.2 组播MAC地址
组播MAC地址与单播MAC地址的区别
- 组播MAC地址用于在链路层上标识属于同一组播组的接收者。
- IANA规定,组播MAC地址的高24bit为0x01005e,第25bit固定为0,低23bit为组播IP地址的低23bit。
IP地址到MAC地址的映射
- IP组播地址的前4bit是1110,代表组播标识,而后28bit中有23bit被映射到MAC地址。
映射导致的问题
- 由于IP组播地址的前4bit是1110,代表组播标识,而后28bit中有23bit被映射到MAC地址,这样IP地址中就有5bit信息丢失,直接的结果是出现了32个IP组播地址映射到同一MAC地址上。
1.5 组播协议
- 组播协议包括用于主机注册的组播组管理协议,和用于组播选路转发的组播路由协议。各种组播协议在网络中得到运用如图所示。
- IGMP(Internet Group Management Protocol)在接收者主机和组播路由器之间运行,该协议定义了主机与路由器之间建立和维护组播成员关系的机制。
- 组播路由器之间运行组播路由协议,组播路由协议用于建立和维护组播路由,并正确、高效地转发组播数据包
1.5.1 ASM组播路由协议
对于ASM模型,可以将组播路由分为域内和域间两大类。
域内组播路由协议
- 域内组播路由协议用来自治系统AS(Autonomous System)内发现组播源并构建组播分发树,将信息传递到接收者。
- 域内组播路由协议包括:DVRMP、MOSPF、PIM。
- DVRMP是距离矢量组播路由协议是一种密集模式协议。该协议有跳数限制,最大跳数为32跳。
- MOSPF是OSPF路由协议的拓展协议,它通过定义新的LSA(6类LSA)来支持组播。
- PIM(Protocol Independent Multicast)是典型的域内组播路由协议,分为DM(Dense Mode)和SM(Sparse Mode)两种模型。当接收者在网络中的分布较为密集时,适用DM,较为稀疏时,适用SM。PIM必须和单播路由协议协同工作。
域间组播路由协议
- 域间组播路由协议用来实现组播信息在AS之间的传递。
- MSDP(Multicast Source Discouvery Protocol)能够跨越AS传播组播源信息。
- MPBGP(MultiProtocol Border Gateway Protocol)的组播拓展MBGP(Multicast BGP)能够跨越AS传播组播路由。
1.5.2 SSM组播路由协议
对于SSM模型,没有域内和域间的划分。由于接收者预先知道组播源的具体位置,因此可以借助PIM SM的部分功能直接创建组播传输路径。(从成员端路由器一直向源端路由器发送加组信息)。
1.5.3 组播协议分层体系
1.6 组播分发树
什么是组播分发树?
- 用来描述IP组播报文在网络中经过的路径。
组播分发树的两个基本概念
- 源路径树
- 以组播源作为树根,将组播源到每一个接收者的最短路径结合起来构成的转发树。
- 共享树
- 使用放在网络的某些节点的单独的公用根。根据组播路由协议,这个根常被称为汇聚点(RP)或核心,因此,共享树也可以称为RPT。
1.6.1 源路径树(SPT)
- 源路径树是以组播源作为树根,将组播源到每一个接收者的最短路径结合起来构成的转发树。
- 源路径树使用的是从组播源到接收者的最短路径,也称为最短路径树(SPT)。
- 对于某个组,网络要为任何一个向该组发送报文的组播源建立一棵树。(注意与共享树的区分,共享树即使有多个源,对应一个组,只有一棵树)。
- 本例中有两个组播源(源S1和源S2),接收者R1和R2。所以本例中有两颗源路径树,分别是
- S1-A-C(R1)-E(R2)
- S2-F-D-C(R1)-E(R2)
1.6.2 共享树(RPT)
- 共享树以某个路由器作为路由树的树根,该路由器称为汇聚点(RP),将RP到所有接收者的最短路径结合起来构成转发树。
- 使用共享树时,对应某个组,网络中只有一棵树。所有的组播源和接收者都使用这棵树来收发报文,组播源先向树根发送数据报文,之后报文又向下转发到达所有的接收者。
- 本例中两个源S1和S2共享一棵树D(RP)—-C(R1)—-E(R2)
1.6.3 STP与RPT比较
源路径树(SPT)
- 路径越优,延迟越小,占用内存较多
共享树(RPT)
- 路径不是最优的,引入额外的延迟,占用内存较少
1.7 组播数据转发
1.7.1 单播路由与组播路由
组播路由和单播路由是相反的
- 单播路由关心数据报文要到哪里去
- 组播路由关心数据报文从哪里来。(RPF检查)
单播报文转发
- 单播报文的转发过程中,路由器并不关心源地址,只关心报文中的目的地址,通过目的地址决定向哪个接口转发。
组播报文转发
- 在组播中,报文是发送给一组接收者的,这些接收者用一个逻辑地址标识。路由器在接收到报文后,必须根据源和目的地址确定出上游(指向组播源)和下游方向,把报文沿着远离组播源的方向进行转发(这就是需要关心数据报文从哪里来了)
- 这个过程称作RPF(Reverse Path Fowarding,逆向路径转发)。
1.7.2 反向路径转发RPF
什么是RPF?
- 路由器收到组播数据报文后,只有确认这个数据报文是从自身连接到组播源的接口上收到的,才进行转发,否则丢弃。
RPF检查
- 在单播路由表中查找到组播报文源地址的路由
如果该路由的出接口就是组播报文的入接口,RPF检查成功否则RPF检查失败,报文丢弃。
RPF执行过程中会用到原有的单播路由表以确定上游和下游的邻接结点。只有当报文是从上游邻接结点对应的接口(称作RPF接口)到达时,才向下游转发。
RPF的作用除了可以正确地按照组播路由的配置转发报文外,还能避免由于各种原因造成的环路,环路避免在组播路由中是一个非常重要的问题。(环路问题可以参考RPF举例的拓扑图)
RPF的主体是RPF检查,路由器收到组播报文后,先对报文进行RPF检查,只有检查通过才转发,否则丢弃。RPF检查过程如下:
- 路由器在单播路由表中查找组播源或RP对应的RPF接口(当使用信源树时,查找组播源对应的RPF接口,使用共享树时查找RP对应的RPF接口),某个地址对应的RPF接口是指从路由器向该地址发送报文时的出接口;
- 如果组播报文是从RPF接口接收下来的,则RPF检查通过,报文向下游接口转发;
- 否则,丢弃该报文。
1.7.3 RPF举例
- 本例中路由器RTE从S0口接收到组播报文,于是该接口进行RPF检查。发现报文是从错误的接口收到的,于是RPF检查失败,RTE丢弃该报文。
- 从上图可以看出,如果没有RPF检查,则会导致环路问题。
二、IGMP
- IGMP协议工作机制
- 接收者的加入过程
- 组成员的维护过程
- 接收者的离开过程
- 从上面三个方面来学习IGMP协议
2.1 IGMP协议介绍
IGMP协议运行于主机和与主机直接相连的组播路由器之间。
IGMP工作机制
- 接收者主机向所在的共享网络报告组成员关系。
- 查询器周期性地向共享网段发送组成员查询消息。
- 接收者主机接收到查询消息后进行响应以报告组成员关系。
- 网段中的组播路由器依据接收到的响应来刷新组成员的存在消息。
支持组播的路由器不需要也不可能保存所有主机的成员关系,它只是通过IGMP协议了解每个接口连接的网段上是否存在某个组播组的接收者,即组成员。(所以对应于某个组播组,会存在一个Last Reporter的记录表项)而各主机只需要保存自己加入了哪些组播组。
2.2 IGMP协议发展
到目前为止,IGMP有三个版本
- IGMPv1定义了基本的组成员查询和报告过程
- IGMPv2在IGMPv1的基础上添加了组成员快速离开的机制。
- IGMPv3增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。
所有IGMP版本都支持ASM模型,IGMPv3可以直接应用于SSM模型,而IGMPv1和IGMPv2则需要SSM-Mapping技术的支持。
IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组成员离开的机制,IGMPv3中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。三个版本在演化过程中对协议报文的处理是向前兼容的,因此尽管各个版本的协议报文格式不同,但是运行IGMP高版本的路由器可以识别低版本的IGMP报文。
项目 | IGMPv1 | IGMPv2 | IGMPv3 |
---|---|---|---|
查询器选举方式 | 依靠组播路由协议PIM选举 | 同网段组播路由器之间竞争选举 | 同网段组播路由器之间竞争选举 |
普遍组查询报文 | 支持 | 支持 | 支持 |
成员报告报文 | 支持 | 支持 | 支持 |
特定组查询报文 | 不支持 | 支持 | 支持 |
成员离开报文 | 不支持 | 支持 | 没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达 |
特定源组查询报文 | 不支持 | 不支持 | 支持 |
指定组播源 | 不支持 | 不支持 | 支持 |
可识别报文协议版本 | IGMPv1 | IGMPv1、IGMPv2 | IGMPv1、IGMPv2、IGMPv3 |
ASM模型 | 支持 | 支持 | 支持 |
SSM模型 | 需要IGMP SSM Mapping技术支持 | 需要IGMP SSM Mapping技术支持 | 支持 |
2.3 IGMPv1基本原理
2.3.1 IGMP报文概述
- IGMP消息封装在IP报文中。
- IP报文头的协议类型字段值为2,用来标识数据部分封装了IGMP消息。
- IP报文头的TTL字段值为1,表示IGMP消息只在本地网段传播。
- IGMP有三个版本,不同版本报文格式不一样。
- 不同版本的IGMP协议,支持的IGMP消息也不同。
2.3.2 IGMPv1报文格式
- Version:IGMP版本标识,版本1为1。IGMPv2的报文中没有该字段。
- Type:类型字段。标识IGMP报文类型。IGMPv1支持两种类型的报文:
- 成员关系查询(0X11):路由器周期性发送成员关系查询报文去查询是否有组播成员。默认查询周期为60秒
- 成员关系报告(0X12):成员关系报告用于表示主机想加入某个组播组。
- 成员关系报告的发送可以被动发送也可主动发送。
- 被动发送指当主机收到成员关系查询消息后如果对某个组播组感兴趣想加入组播组时发送成员关系报告
- 主动发送指主机想加入某个组播组时,可以不用等待成员关系查询报文,而主动地发送成员关系报告。
- Checksum:IGMP消息的校验和,该字段在进行校验计算时设为0.
- 当传送报文的时候,必须计算该校验字并插入到该字段中去。
- 当接收包的时候,该校验字必须在处理该包之前进行校验。
- 组地址:不同类型的IGMP报文中组地址不同。
- 在成员关系报告报文中,组地址为某个特定的组播地址。
- 在成员关系查询报文中,组地址为0。
字段 | 说明 |
---|---|
Version | IGMP版本,值为1。 |
Type | 报文类型。该字段有以下两种取值: - 0x1:表示普遍组查询报文。 - 0x2:表示成员报告报文。 |
Unused | 在IGMPv1中,该字段在发送时被设为0,并在接收时被忽略。 |
Checksum | IGMP报文的校验和。校验和是IGMP报文长度(即IP报文的整个有效负载)的16位检测,表示IGMP信息补码之和的补码。Checksum字段在进行校验计算时设为0。当发送报文时,必须计算校验和并插入到Checksum字段中去。当接收报文时,校验和必须在处理该报文之前进行检验。 |
Group Address | 组播组地址。在普遍组查询报文中,该字段设为0;在成员报告报文中,该字段为成员加入的组播组地址。 |
报文示例:
以下两个报文抓包:IGMPv1报文.zip
- 成员关系查询报文,路由器周期60s发送
- 成员报告报文,由主机发送,组地址为想要加入的报文
2.3.3 IGMPv1组成员加入
目的地址:加入的组播组地址
主机主动发送IGMP成员关系报告报文,表示想加入一个组播组中。
- 该报文中组地址为主机想加入的组播组的地址。
主机PC3不等待普遍组查询报文的到来,主动发送针对组播组G2的报告报文以声明加入,IGMP查询器接收到PC3的报告报文后,了解到本网段内出现了组播组G2的成员,则生成组播转发表项(*,G2)。网络中一旦有G2的数据到达路由器,将向该网段转发。
2.3.4 IGMPv1查询与响应
- 查询目的地址:224.0.0.1
- 响应目的地址:加入的组播组地址
IGMPv1的查询与响应过程如下:
- IGMP查询器周期性地向共享网段内所有主机以组播方式(目的地址为224.0.0.1)发送成员关系查询消息(组地址为0)。(查询周期为60s)
- 网络内所有主机都接收到该查询消息,如果某主机(如PC1、PC2和PC3)对任意组播组G感兴趣,则以组播方式发送“成员关系报告”报文(其中携带组播组G的地址)来宣告自己将加入该组播组,假设PC2首先发送此报告。(实验效果为,IGMP响应报告的目的地址应该为加入的组播组地址)
经过查询/响应过程后,IGMP路由器了解到本网络内存在组播组G对应的接收者,生成(*,G)组播项并依此作为组播信息的转发依据。
- *代表任意组播源,G表示某个组播组。
IGMPv1规定,当共享网络中有多台路由器时,只需要一台周期性的向共享网段内发送成员关系查询报文,所以由组播路由协议选举查询器。不同的组播路由协议有不同的选举机制。(运行PIM DM或PIM SM的网段会选举DR,同时该DR也是IGMPv1的查询器。)
2.3.5 IGMPv1抑制机制
- IGMP成员关系查询报文是目的地址是224.0.0.1,就是说网段内所有的设备都会接收到该查询报文。
- 但并不是所有接收到该报文的主机都会响应查询请求的。
- 本例中只有一个主机会以成员关系报告报文响应,而其他主机则抑制成员关系报告的发送。
- 实际上主机收到IGMP成员关系查询时,会对它已经加入的每个组播组启动一个倒计数报告计时器,计时器的值默认为0到最大响应值,IGMPv1中计时器最大响应值固定使用10秒。计时器到时的主机则主动发送成员关系报告,组地址为该组播组地址,目的地址为224.0.0.1。(这里有误,目的地址应该为加入的组播组的地址)于是网段内其它主机都会收到该成员关系报告报文,接收到成员关系报告报文的主机抑制成员关系报告的发送,并删除计时器。(所以这些被抑制的主机也就知道自己不是Last Reporter了)
- 当路由器周期性的发送成员关系查询报文时,每个主机都会再次启动计时器进行查询/响应/抑制。(路由器查询间隔为60秒)。
2.3.6 IGMPv1组成员离开
- 由于IGMPv1版本没有定义专门离开组播组的信息,因此主机离开组时是默默离开不发送任何报文。
- 而组播路由器如何知道用户已经离开组呢?IGMPv1主要是基于查询无响应而超时的思路实现的。
- 成员悄悄离开组播组,不发送任何报文。路由器依旧周期性的发送成员关系查询报文,周期为60秒,当路由器发送3次成员关系查询报文都没有收到响应的成员关系报告报文时,路由器认为该组内没有成员,不再向该网段转发组播报文。
- 假设HostA想要退出组播组G1
HostA收到IGMP查询器发送的普遍组查询报文时,不再发送针对G1的报告报文。由于网段内还存在G1组成员HostB,HostB会向IGMP查询器发送针对G1的报告报文,因此IGMP查询器感知不到HostA的离开。 - 假设HostC想要退出组播组G2
HostC收到IGMP查询器发送的普遍组查询报文时,不再发送针对G2的报告报文。由于网段内不存在组G2的其他成员,IGMP查询器不会收到G2组成员的报告报文,则在一定时间(缺省值为130秒)后,删除G2所对应的组播转发表项。
2.4 IGMPv2基本原理
2.4.1 IGMPv2报文格式
IGMPv2报文与IGMPv1报文略有不同,取消了版本字段而相应增加了最大响应时间字段。
- Type:报文类型,IGMPv2报文中有三种报文类型
- Type=0x11:成员关系查询报文,又分两种子类型
- 常规查询:用于确定哪些组播组是有效的,即该组是否还有成员在使用,常规查询组地址为零。
- 特定查询:用于查询特定的组播组是否还有组成员,组地址为特定的组播地址。(当最后一个接收者离开时发送,即接收到Last Reporter发送的离开组消息时)
- Type=0x16:IGMPv2组成员关系报告。
- 为了和IGMPv1兼容,还有另外的一个附加的消息类别:
- 0x12=IGMPv1成员报告。
- Type=0x17:离开组消息,主机发送的离开报告。
- 只有Last Reporter才会发送,不是Last Reporter则依然会静默离开
- Type=0x11:成员关系查询报文,又分两种子类型
- Max Resp Time:最大响应时间字段,仅用于组成员关系查询。表示主机响应查询返回报告的时间范围。IGMPv1中没有该字段。
- 普遍组查询最大响应计时器(默认为10s)
- 特定组查询最大响应计时器(默认为1s)
- Checksum:IGMP消息的校验和,是IGMP消息长度(IP包的整个有效负载)的16位检测。
- 传输报文时,必须计算校验和并填入该字段中
- 接收报文时,必须在处理报文之前检验校验和,以判断IGMP消息在传输过程中是否发生了错误。
- 组地址字段
- 发送常规查询时,组地址字段设置为零
- 特定组查询时候,设置为要查询的组地址
- 当主机成员发回组关系报告或是发送离开组消息时,本字段设置为目的组地址。
字段 | 说明 |
---|---|
Type | 报文类型。该字段有以下四种取值: - 0x11:表示查询报文。IGMPv2的查询报文包括普遍组查询报文和特定组查询报文两类。 - 0x12:表示IGMPv1成员报告报文。 - 0x16:表示IGMPv2成员报告报文。 - 0x17:表示成员离开报文。 |
Max Response Time | 最大响应时间。成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。该字段仅在IGMP查询报文中有效。 |
Checksum | IGMP报文的校验和。校验和是IGMP报文长度(即IP报文的整个有效负载)的16位检测,表示IGMP信息补码之和的补码。Checksum字段在进行校验计算时设为0。当发送报文时,必须计算校验和并插入到Checksum字段中去。当接收报文时,校验和必须在处理该报文之前进行检验。 |
Group Address | 组播组地址。 - 在普遍组查询报文中,该字段设为0。 - 在特定组查询报文中,该字段为要查询的组播组地址。 - 在成员报告报文和离开报文中,该字段为成员要加入或离开的组播组地址。 |
报文示例:
- IGMPv2成员查询消息
- IGMPv2成员报告消息
- IGMPv2离开组消息
- 特定组查询报文
2.4.2 IGMPv2组成员加入
目的地址:加入的组播组地址
当一个主机首次加入组播组时,主机立即发送成员关系报告报文。
- 初始的成员报告可能会丢失或会受到损害,为了防止此种情况,推荐在短的间隔时间内报告一次或两次(RFC2326推荐的时间间隔为10秒)。(所以才需要发送多个)
- IGMPv2主机也支持IGMPv1的成员关系报告报文。
2.4.3 IGMPv2查询与响应
- 普遍组查询目的地址:224.0.0.1
- 特定组查询目的地址:某个组播组的IP地址
响应目的地址:加入的组播组地址
IGMPv2版本增加了最大响应时间字段。前面介绍了主机收到成员关系查询报文时,会为每个已经加入的组播组启动一个计时器。计时器到期的主机才会发送IGMP成员关系报告报文来响应路由器的查询。在v2中该计时器的值为“1~最大响应时间”之间的一个随机值。(此时的最大响应时间为10s)
- IGMPv2版本增加最大响应时间字段,以动态地调整主机对组查询报文的响应时间。
- 在IGMPv1版本中,组播路由器发起的查询是针对该网段下的所有组播组,这种查询被称为普遍组查询。
- IGMPv2版本中,在普遍组查询之外增加了特定组的查询,这种查询报文的目的IP地址为某个组播组的IP地址,报文中的组地址字段也为该组播组的IP地址,网络中属于该组播组成员的主机才会进行响应,这样就避免了属于其它组播组成员的主机发送响应报文。
2.4.4 IGMPv2查询器选举
- 对于一个网段上有多个组播路由器的共享网段,此网段下运行IGMP的路由器都能从主机那里收到成员关系报告消息,但是只需要一个路由器发送成员关系查询消息,所以这就需要一个路由器选举机制来确定一个路由器作为查询器。
- 只有查询器才会发送成员关系查询报文。在IGMPv1版本上,查询器的选择由组播路由协议决定
IGMPv2版本对此做了改进,规定同一网段上有多个组播路由器时,具有最小IP地址的组播路由器被选举出来充当查询器。
路由器启动,主动发出到目的地(224.0.0.1)的IGMPv2常规查询信息。
- 收到常规查询信息的路由器,会把此信息的源IP地址和接收口的IP地址作比较,拥有最小IP地址的路由器被选举为IGMP查询路由器。
- 查询器也会有失效的时候,当查询器失效时,另一路由器成为查询器。所以非查询路由器会启动一个查询计时器,周期检查IGMP查询路由器的状态,缺省情况下120秒(其实就是等两个查询周期),该值可以通过命令
time other-querier-present interval
修改。
2.4.5 IGMPv2组成员离开
离开报告报文目的地址:加入的组播组地址;
在IGMPv1版本中,主机悄然离开组播组,不会向任何组播路由器发出任何通知。造成组播路由器只能依靠响应超时来获知组成员的离开。
而在v2版本中,当一个主机决定离开一个组播组时,它会向网络中所有加入这个组的组播路由器以组播方式(目的IP为加入的组播组)发送离开组的消息(目的地址为加入的组播组地址),为了明确该组播组中是否还包含其它成员主机,该网段组播路由器会向网络中发送特定组查询消息。在查询的最大响应时间内(默认为1秒)没有收到该组的报告,则再次发送特定组查询。2次特定组查询后仍没有收到成员报告,则认为组播成员全部离开。(注意只是该组的组播成员,但网络中可能还有其它的组播组)(发送针对组成员离开的特定组查询,最大响应时间才为1s,其它情况为10s)。
问题1:谁是最后一个离开者
路由器上有记录last reporter,同时主机也可以知道自己是否是last reporter(是否有被抑制)。所以当last reporter发送离开组消息时,路由器就会发送特定组查询。需要注意的是,如果不是last reporter,离开的时候也是跟V1一样,悄悄离开。当然,V1也有last reporter,只是它仅仅是个显示而已,不具备像V2这样的特性。(华为没有实现这个功能,是个摆设)
问题2:离开组报告也应该是只需要1台主机发送
只是这个时候使用的最大响应时间是特定组查询的最大响应时间1s。
IGMPv2快速离开机制
- 如果路由器上只有一个主机加入了某个主机组,则可以设置快速离开,这样当主机离开该组的时候,路由器就不会发送两次特定组查询了。
acl 2000
rule permit source 239.1.1.1 0
int g0/0/0
igmp prompt-leave group-policy 2000
- 如果路由器上只有一个主机加入了某个主机组,则可以设置快速离开,这样当主机离开该组的时候,路由器就不会发送两次特定组查询了。
2.5 IGMPv1与v2的互操作性
与IGMPv1路由器兼容
- IGMPv2主机必须发送版本1成员报告报文,且不发送成员离开报文
- IGMPv2路由器必须强制发送版本1报文
与IGMPv1主机兼容
- IGMPv2主机成员报告报文需被版本1主机抑制
- IGMPv2路由器忽略收到的成员离开报文
2.5.1 v2主机与v1路由器
- 版本1路由器把IGMPv2报告看作无效的IGMP信息类型并且忽略它。当版本1路由器作为有效的IGMP查询器的时候,版本2的主机必须发送IGMPv1报告。
- 当版本2的主机检测出IGMP查询器是版本1的路由器时,它必须始终用IGMPv1报告做出响应。在这种情况下,版本2的主机也可以抑制发送离开组信息。(即此时版本2的主机如果需要离开组时,就不需要再发送离开组消息了,因为此时它是工作在IGMPv1模式下)(从IGMPv1查询器只认识IGMPv1报文的角度去考虑IGMPv2的工作方式)
- 为了维护本接口的状态,无论何时IGMPv1查询在接口处被收到,版本2主机会启动一个400秒的倒数计时器,当另一个IGMPv1查询被收到时,计时器被复位。如果计时器到时,此接口恢复成为IGMPv2接口并且IGMPv2信息被再次发送。
- 版本2主机必须允许它的成员关系报告被IGMPv1或IGMPv2抑制。
2.5.2 v1主机与v2路由器
- 如果某个版本2的路由器是IGMP查询器,同时在局域网中版本1的主机也是一组成员,那么该组的IGMPv1报告总是被收到,因为IGMPv2报告在版本1的主机中不会抑制,版本1的主机不兼容版本2的报告,因此忽略它们
- 无论何时,只要版本1的主机成为组成员,IGMPv2离开过程都将被搁置。(指的是IGMPv2路由器收到IGMPv2离开报文后也不会去发送特定查询,因为这时还有IGMPv1主机,因为它是静默离开的,所以就会设置一个定时器)
注意IGMPv2的报文格式中有IGMPv1的查询类型。
补充:为什么要设置一个倒数计时器?
- 因为IGMPv1主机离开时并不会发送离开消息,所以必须要针对v1主机设定一个计时器(在该定时器之后,如果没有收到IGMPv1主机的报告报文,就说明IGMPv1主机已经离开了该组播组,此时已经没有IGMPv1的主机,路由器就没有必要再使用版本1的查询了)
- 可以看下面的命令输出:
- 看到version1一行,确实有一个定时器,如果该组中没有v1的主机,则该定时器的标识应该为off状态。
2.5.3 混合版本
- 如果一些运行IGMP版本1的路由器存在于子网中,那么必须强制性地为子网中的所有路由器配置IGMPv1以便正常使用。(即必须要将RTB重新配置为IGMPv1的路由器才行)
2.6 IGMPv3基本原理
2.6.1 IGMPv3报文
IGMPv3主要是为了配合SSM模型发展起来的,提供了在报文中携带组播源信息的能力,即能加入到指定源的组播组。
相较于IGMPv2,IGMPv3新增的报文:
- 特定源组查询报文
- 报告报文包括主机要加入的组和组播源的过滤模式
- Include
- Exclude(如果没有指定源,则主机加入组时默认为此模式,并且Exclude列表为null)
- 取消成员关系报告抑制机制
- 因为有可能加入了相同的组,但是不同的源,这就要分开来查询了
IGMPv3的报文格式可参考报文格式大全,它包含了查询报文和报告报文两种不同格式的报文。
IGMPv3查询报文格式
字段 | 说明 |
---|---|
Type | 报文类型,取值为0x11。 |
Max Response Code | 最大响应时间。成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。 |
Checksum | IGMP报文的校验和。校验和是IGMP报文长度(即IP报文的整个有效负载)的16位检测,表示IGMP信息补码之和的补码。Checksum字段在进行校验计算时设为0。当发送报文时,必须计算校验和并插入到Checksum字段中去。当接收报文时,校验和必须在处理该报文之前进行检验。 |
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报文的校验和。校验和是IGMP报文长度(即IP报文的整个有效负载)的16位检测,表示IGMP信息补码之和的补码。Checksum字段在进行校验计算时设为0。当发送报文时,必须计算校验和并插入到Checksum字段中去。当接收报文时,校验和必须在处理该报文之前进行检验。 |
Number of Group Records | 报文中包含的组记录的数量。 |
Group Record | 组记录。Group Record字段的格式如下图所示,解释如下图所示。 |
Group Record字段格式
**
字段 | 说明 |
---|---|
Record Type | - 组记录的类型。共分为三大类。 - - 当前状态报告。用于对查询报文进行响应,通告自己目前的状态,共两种:一种是MODE_IS_INCLUDE,表示接收源地址列表包含的源发往该组的组播数据。如果指定源地址列表为空,该报文无效;另一种是MODE_IS_EXCLUDE,表示不接收源地址列表包含的源发往该组的组播数据。 |
- 过滤模式改变报告。当组和源的关系在INCLUDE和EXCLUDE之间切换时,会通告过滤模式发生变化,共两种:一种是CHANGE_TO_INCLUDE_MODE,表示过滤模式由EXCLUDE转换到INCLUDE,接收源地址列表包含的新组播源发往该组播组的数据。如果指定源地址列表为空,主机将离开组播组;另一种是CHANGE_TO_EXCLUDE_MODE,表示过滤模式由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的报告报文中,不存在辅助数据 |
2.6.2 IGMPv3查询报文
相较于IGMPv2,其变化如下:
- 查询报文中除了普遍组查询和特定组查询,新增了特定源组查询报文。该报文由查询器向共享网段内特定组播组成员发送,用于查询该成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
- 当IGMPv3主机离开某一个组时,路由器就会发送该特定源组查询报文。
- 需要注意的是,IGMPv3支持特定组查询是为了兼容IGMPv2。
2.6.3 IGMPv3报告报文
相较于IGMPv2,其变化如下:
- 报告报文不仅通知路由器主机要加入某组播组,并且可以指定只接收哪些组播源发往该组的数据。
IGMPv3增加了针对组播源的过滤模式(Include/Exclude)
- (G,INCLUDE,(S1、S2…)),表示只接收来自指定组播源S1、S2……发往组G的数据。
- (G,EXCLUDE,(S1、S2…)),表示接收除了组播源S1、S2……之外的组播源发往组G的数据,即S1、S2……在接收范围之外。
IGMPv3报告报文的目的地址为224.0.0.22,表示发往所有使能了IGMPv3的路由器。
2.6.4 IGMPv3报告报文组几记录
IGMPv3报告报文中的组类型
- IS_IN
- 表示组播组与源列表之间的对应方式为Include,即接收从指定源列表发往该组播组的数据。
- IS_EX
- 表示组播组与源列表之间的对应方式为Exclude,即不接收源地址列表中包含的源发往该组的组播数据。
- TO_IN
- 表示组播组与源列表之间的对应方式由Exclude转换到Include。如果这时指定源列表为空,则表示离开该组播组
- TO_EX
- 表示组播组与源列表之间的对应方式由Include转换到Exclude。
- ALLOW
- 表示在现有的基础上,还希望从某些组播源接收组播数据。如果当前对应关系为Include,则向现有源列表中添加某些组播源;如果当前对应关系为Exclude,则从现有源列表中删除某些组播源。
BLOCK
- 表示在现有的基础上,不再希望从某些组播源接收组播数据。如果当前对应关系为Include,则从现有源列表中删除某些组播源,如果当前对应关系为Exclude,则向现有源列表中添加某些组播源。
在IGMPv3中一个成员报告报文可以携带多个组播组信息,而之前的版本一个成员报告只能携带一个组播组。这样在IGMPv3中报文数量大大减少。
- IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。例如组225.1.1.1的成员想离开这个组,则会发送(225.1.1.1,TO_IN,(0))的报告报文。
2.6.5 IGMPv3工作机制
- 如果主机和路由器之间运行的是IGMPv1或IGMPv2,主机加入组播组G时无法对组播源进行选择,无论其是否需要,都会同时接收到来自组播源S1和S2的数据。
如果采用IGMPv3,主机可以选择仅接收S1组播数据。
- 方法一:Host发送IGMPv3报告(G,IS_IN,(S1)),仅接收源S1向组播组G发送的数据。
- 方法二:Host发送IGMPv3报告(G,IS_EX,(S2)),不接收指定源S2向组播组G发送的数据,从而仅有来自S1的组播数据才能传递到Host。
补充:此时在路由器上看不到相关超时信息
只是因为显示到详细信息中了,因为它还需要针对某个源设置定时器:
可以看到,对于同一个组,两个源就有两个超时时间。
可以查看其中一个主机发送的报告报文:
2.7 IGMP版本比较
三、二层组播
3.1 IGMP Snooping
3.1.1 IGMP Snooping概述
- 根据IGMP协议,主机加入组播组时,需要向上游设备发送IGMP报文,向其报告加入组播组消息,这样上游设备才可以将组播报文发送给主机。
- 由于IGMP报文是封装在IP报文内,属于三层协议报文,而二层设备不处理报文的三层信息,所以这个过程它并不知道,而且通过对数据链路层数据帧的源MAC地址的学习也学不到组播MAC地址(数据帧的源MAC地址不会是组播MAC地址)。
- 这样当二层设备在接收到一个目的MAC地址为组播MAC地址的数据帧时,在以前学习的MAC地址表中就不会找到对应的表项。
- 那么这时候,它就会采用广播方式发送接收到的组播报文,这样一来不但会造成宽带的极大浪费,而且影响网络安全。(即交换机会采用泛洪的方式发送数据)
- 没有运行IGMP Snooping时,组播报文将在二层广播,运行IGMP Snooping后,报文将不再在二层广播,而是进行二层组播。
3.1.2 IGMP Snooping基本概念
- 路由器端口:路由器端口是指朝向组播路由器的端口,数据链路层组播设备将从该端口接收组播报文。路由器端口分为如下两类:
- 动态路由器端口:能够接收到源地址不为0.0.0.0的IGMP Query报文或者PIM Hello报文的端口。动态路由器端口依赖于组播设备与主机之间交互的协议报文,动态维护。每个动态路由器端口启动一个路由器端口老化定时器,定时器超时则该路由器端口失效。
- 静态路由端口:用户使用配置命令指定的,不会老化。
- 组播组成员端口:组播成员端口是指朝向组成员主机的端口,数据链路层组播设备从该端口发出组播报文。组播组成员端口简称为成员端口,分为如下两类:
- 动态成员端口:能够接收到IGMP Report报文的端口。动态成员端口依赖于组播设备与主机之间交互的协议报文,动态维护。每个动态成员端口启动一个成员端口老化定时器,定时器超时则该成员端口失效。
- 静态成员端口:用户使用配置命令指定的,不会老化。
- 出端口信息是二层组播转发表项中的一个重要信息,包括路由器端口和成员端口。
3.1.3 IGMP Snooping工作机制
- 当收到IGMP通用查询报文时:
- 如果收到通用查询报文的端口原来就是路由器端口,以太网交换机就重置该端口的老化定时器。
- 如果收到通用查询报文的端口原来不是路由器端口,则交换机启动对该端口的老化定时器(老化时间为180秒或PIM Hello报文携带的Holdtime值,其中Holdtime缺省为105秒)。(即现在变成路由器端口了)
- 当以太网交换机收到IGMP报告报文时,首先判断该报文要加入的IP组播组对应的MAC组播组是否已经存在。
- 如果不存在则新建MAC组播组,并将接收报告报文的端口加入该MAC组播组中,同时启动该端口的老化定时器(健壮系数 × 普遍查询时间间隔 + 最大响应时间),将该端口所属VLAN下存在的所有路由器端口加入到此MAC组播转发表中,而且新建IP组播组,并将接收报告报文的端口加入到IP组播组中。
- 如果该报文对应的MAC组播组已经存在,但是接收报告报文的端口不在该MAC组播组中,则将接收报告报文的端口加入MAC组播组中并启动该端口的老化定时器,然后判断此报文对应的IP组播组是否存在:
- 如果不存在,则新建IP组播组并把接收报告报文的端口加入到IP组播组中,
- 如果存在则将接收报告报文的端口加入到IP组播组中。
- 如果该报文对应的MAC组播组已存在,并且接收报告报文的端口也已经存在于该MAC组播组,则仅重置接收报告报文的端口上的老化定时器。
- IGMP离开报文:当以太网交换机收到对某IP组播组的离开报文,则会向接收此离开报文的端口发送所离开组的特定组查询报文,以确认此端口相连的主机中还有没有此组播组的其他成员,同时启动一个响应查询定时器(特定组查询消息发送时间间隔 ×健壮系数)。如果在该定时器超时的时候还没有收到该组播组的报告报文,则将该端口从相应MAC组播组中删去。如果MAC组播组没有组播成员端口时,交换机将通知组播路由器将该分支从组播树中删除。(注意,这是在交换机上开启了IGMP Snooping Proxy的情况下)
3.1.4 IGMP Snooping建立和维护组
- 在上图中,PC2希望加入组播组224.1.2.3,因此以组播方式发送一个IGMP成员报告给该组,报告中具有目的MAC地址0x0100.5e01.0203。最初转发表上没有这个组播MAC地址的表项,所以该报告被扩散到交换机的所有端口,包括与交换机CPU相连的内部端口0;
- 当CPU收到PC2组播的IGMP报告时,CPU利用IGMP报告中的信息建立了一个转发表项,此表项包括PC2的端口号,连接路由器的端口号和连接交换机内部CPU的端口号;
- 形成此转发表项的结果是使后面任何目的地址为0x0100.5e01.0203的组播帧都被抑制在端口0、1和3,而且不向交换机其他端口扩散。
- 假设PC4要加入该组,并主动发一个IGMP报告给该组,交换机根据转发表项 向外部端口1和3转发此报告。交换机的CPU也收到此报告,它在转发表项上为MAC地址0x0100.5e01.0203增加一个端口(端口5)。
3.1.5 详细工作机制(友商设备)
第2点主要是为了维护组播MAC表项。(主要是交换机不转发IGMP报告报文给其他主机)
- A和B都认为自己是last reporter
3.1.6 详细工作机制(华为设备)
截获路由协议是为了判断哪些接口是路由器接口
PC1/PC2是用路由器通过VPN-Instance同时模拟了两台主机
实际上路由器在10s内只收到1份report报文,即交换机接收到主机发送的report报文后,一般只会发送一份report报文给路由器,这样就实现了优化。(指的是在最大响应时间10s内)(实际上没有这优化,上面说先送先收到的,后面收到的也会送,优化是proxy的功能)
(目的地址应该是加入的组播组地址)
- 对于所存在问题的解释,即交换机从一个端口收到离开组报文后,就会从相应的组播MAC地址表项中将该端口删除,所以就过于果断了,另外目的地址应该为加入的组播组地址
IGMP代理功能的实际应用场景
3.2 组播VLAN
3.2.1 组播VLAN基本概念
- 组播VLAN:网络侧接口所属VLAN,用于实现组播流的汇聚。一个组播VLAN可以绑定多个用户VLAN。
- 用户VLAN:用户侧接口所属VLAN,用于接收组播VLAN的组播数据。一个用户VLAN只能加入一个组播VLAN
3.2.2 组播VLAN工作原理
- 二层组播
- 如果不同VLAN的用户有相同的组播数据需求时,上游路由器仍然需要发送多份相同报文到不同VLAN中
- 属于不同VLAN(VLAN2和VLAN3)的用户需要接收相同的组播流,上游路由器R1就会把组播数据在每个VLAN内都复制一份然后发送给下游交换机S1。这样,既造成了路由器与二层设备之间带宽的浪费,也增加了路由器额外的负担。
- 组播VLAN
- 组播VLAN,在二层网络设备上进行跨VLAN组播复制。
- 在交换机上部署了组播VLAN功能后,上游路由器不必在每个用户VLAN(VLAN2和VLAN3)内都复制一份组播流,而是数据流在组播VLAN(VLAN4)内复制一份后发送给二层设备。这样就避免了组播流在上游设备的重复复制,不仅节省了网络带宽,又减轻了上游路由器的负担。
四、PIM
4.1 基本概念
4.1.1 PIM协议
- PIM(Protocol Independent Multicast):协议无关组播,不依赖于具体单播路由协议,表示单播路由协议可以为OSPF,ISIS等,只要单播路由协议产生所需路由表项能够完成RPF检查即可。
- 域内组播路由协议
- 构建、维护组播路由转发表项
- 运行在路由器与路由器之间
- PIM分为PIM-DM和PIM-SM
补充说明:
- 与组播相关的协议中前面已经介绍到组播组管理协议IGMP。组播组管理协议IGMP在接收者主机和组播路由器之间运行。
- 路由器之间则需要运行组播路由协议。
- 组播路由协议用于建立和维护组播路由,并正确、高效地转发组播数据包。
- 组播路由形成了一个从数据源到多个接收端的单向无环数据传输路径,即组播分发树。
- 组播路由协议分为域内组播路由和域间组播路由协议。这里介绍最典型的域内组播路由协议PIM。
4.1.2 PIM路由器
- PIM路由器:在接口上使能了PIM协议的路由器即为PIM路由器。在建立组播分发树的过程中,PIM路由器又分为以下几种:
- 叶子路由器:与用户主机相连的PIM路由器,但连接的用户主机不一定为组成员。
- 第一跳路由器:组播转发路径上,与组播源相连且负责转发该组播源发出的组播数据的PIM路由器。
- 最后一跳路由器:组播转发路径上,与组播组成员相连且负责向该组成员转发组播数据的PIM路由器。
- 中间路由器:组播转发路径上,第一跳路由器与最后一跳路由器之间的PIM路由器。
- 第一跳路由器和服务器连接的接口必须使能PIM,否则路由器是无权处理从该接口接收的组播数据的
- 严格上来讲,MBGP/MSDP不是组播路由协议,只是借用这两个工具来实现域间组播。
- 连接主机的接口要同时运行PIM和IGMP
4.1.3 源树(SPT)
- 分发树
- PIM网络以组播组为单位在路由器上建立一点到多点的组播转发路径。由于组播转发路径呈现树形结构,也称为组播分发树。
- 组播分发树的两个基本概念:源路径树和共享树。
- 源树
- 源路径树以组播源作为树根,将组播源到每一个接收者的最短路径结合起来构成的转发树。
- 源路径树使用的是从组播源到接收者的最短路径,也称为最短路径树。对于某个组,网络要为任何一个向该组发送报文的组播源建立一棵树。(判断有几棵树,看有多少个根就可以了)。
- 本例中有两个组播源(源S1和源S2),接收者PC1和PC2。所以本例中有两颗源路径树。
- PIM路由表项
- PIM路由表项即通过PIM协议建立的组播路由表项
- (S,G)路由表项知道组播源S的位置,主要用于在PIM路由器上建立SPT。对于PIM-DM网络和PIM-SM网络都适用。
- 如果存在(S,G)路由表项,则由(S,G)路由表项指导报文转发。
4.1.4 共享树(RPT)
共享树
- 共享树以某个路由器作为树根,该路由器称为汇聚点(RP),将RP到所有接收者的最短路径结合起来构建转发树。使用共享树时,对应某个组,网络中只有一棵树。所有的组播源和接收者都使用这颗树来收发报文,组播源先向树根发送数据报文,之后报文又向下转发到达所有的接收者。(这是因为,一个组播组只能有一个RP)
- 本例中两个源S1和S2共享一棵树。(在SPT中,对于一个组播组,有多个源就会有多棵树)
PIM路由表项
- PIM路由表项即通过PIM协议建立的组播路由表项
- (*,G)路由表项由于只知道组播组G的存在,主要用于在PIM路由器上建立RPT。对于PIM-SM网络适用
- 如果不存在(S,G)路由表项,只存在(,G)路由表项,则先依照(,G)路由表项创建(S,G)路由表项,再由(S,G)路由表项指导报文转发。(当组播数据到达时,就会有这个过程。)
4.2 PIM-DM
- PIM-DM使用“推(Push)模式”转发组播报文,一般应用于组播组成员规模相对较小、相对密集的网络。
- 在实现过程中,它会假设网络中的组成员分布非常稠密,每个网段都可能存在组成员。当有活跃的组播源出现时,PIM-DM会将组播源发来的组播报文扩散到整个网络的PIM路由器上,再裁剪掉不存在组成员的分支。
- PIM-DM通过周期性的进行“扩散(Flooding)——剪枝(Prune)”,来构建并维护一颗连接组播源和组成员的单向无环SPT(在PIM-DM的早期是每3分钟一个周期重复该过程,但华为设备通过状态刷新进行了优化)
- 如果在下一次“扩散-剪枝”进行前,被裁剪掉的分支由于其叶子路由器上有新的组成员加入而希望提前恢复转发状态,也可通过嫁接(Graft)机制主动恢复其对组播报文的转发。(如果不使用嫁接,则主机需要等3分钟才能重新接收组播数据,因为组播路由器会以3分钟的周期进行扩散,但是因为状态刷新的存在,如果不进行嫁接,就无法进行恢复数据的转发了)
- PIM-DM的关键工作机制包括邻居发现、扩散、剪枝、嫁接、断言和状态刷新。其中,扩散、剪枝、嫁接是构建SPT的主要方法。
4.2.2 PIMv2报文头格式
- Version:4bit,PIM版本,值为2
- Type:4bit,消息类型
- 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)-状态刷新
- 0:Hello(PIM-DM与PIM-SM都适用)
- Reserved:8bit,保留
- Checksum:16bit,校验和
4.2.3 PIM-DM邻居发现(有竞选)
- 在PIM路由器每个使能了PIM协议的接口上,都会对外发送Hello报文。封装Hello报文的组播报文的目的地址是224.0.0.13(表示同一网段中所有PIM路由器)、源地址为接口的IP地址、TTL数值为1。
Hello报文的作用:发现PIM邻居、协调各项PIM协议报文参数、维护邻居关系。
- 发现PIM邻居
- 同一网段中的PIM路由器都必须接收目的地址为224.0.0.13的组播报文。这样直接相连的PIM路由器之间通过交互Hello报文以后,就可以彼此知道自己的邻居信息,建立邻居关系。
- 只有邻居关系建立成功后,PIM路由器才能接收其他PIM协议报文,从而创建组播路由表项。
- 协调各项PIM协议报文参数
- Hello报文中携带多项PIM协议报文参数,主要用于PIM邻居之间PIM协议报文的控制。具体参数如下
- DR_Priority:表示各路由器接口竞选DR的优先级,优先级越高越容易获胜。该参数只用于PIM-SM中DR的选举。当优先级一样时,IP地址较大者为DR。(点到点链路是不会选举的,只在以太网链路选举)
- Holdtime:表示保持邻居为可达状态的超时时间。
- LAN_Delay:表示共享网段内传输Prune报文的延迟时间。
- Neighbor-Tracking:表示邻居跟踪功能。
- Override-Interval:表示Hello报文中携带的否决剪枝的时间间隔。
- Hello报文中携带多项PIM协议报文参数,主要用于PIM邻居之间PIM协议报文的控制。具体参数如下
- 维持邻居关系
- PIM路由器之间周期性地发送Hello报文。如果Holdtime超时还没有收到该PIM邻居发出的新的Hello报文,则认为该邻居不可达,将其从邻居列表中清楚。
- PIM邻居的变化将导致网络中组播拓扑的变化。如果组播分发树上的某上游邻居或下游邻居不可达,将导致组播路由重新收敛,组播分发树迁移。
- 发现PIM邻居
为IGMPv1选举查询者
- 在PIM-DM中通过比较Hello消息上携带的优先级和IP地址,各路由器为多路由器网段选举指定路由器DR,充当IGMPv1的查询器。(优先级高的成为查询器,相同时则IP地址大者为DR)
- 当DR出现故障时,接收Hello消息将会超时,邻居路由器之间会触发新的DR选举过程。
- Hello计时器
- Hello消息默认发送周期是30秒。
- Hello超时消息默认为105秒。(报文选项类型Option Type = 1)
4.2.4 PIM-DM扩散
- 当PIM-DM网络中出现活跃的组播源之后,组播源发送的组播报文将在全网内扩散。
- 当PIM路由器接收到组播报文,根据单播路由表进行RPF检查通过后,就会在该路由器上创建(S,G)表项,下游接口列表中包括除上游接口之外与所有PIM邻居相连的接口,后续到达的组播报文将从各个下游接口转发出去。
最后组播报文扩散到达叶子路由器,会出现以下两种情况:
- 若与该叶子路由器相连用户网段上存在组成员,则将与该网段相连的接口加入(S,G)表项的下游接口列表中,后续的组播报文会向组成员转发。
- 若与该叶子路由器相连用户网段上不存在组成员,且不需要向其下游PIM邻居转发组播报文,则执行剪枝机制
拓扑描述
- 组播源S开始向组播组G发送组播报文。
- R1接收到源发送的组播报文后,根据单播路由表进行RPF检查。RPF检查通过,创建(S,G)表项,下游接口列表包括与R2和R5相连的接口,后续到达的报文向R2和R5转发。(会向R2和R5转发该组播数据,是因为连接的相应接口建立了PIM-DM邻居关系)
- R2接收到来自R1的组播报文,RPF检查成功,在本地创建对应(S,G)表项,下游接口列表包括与R3和R4相连的接口,后续到达的报文向R3和R4转发。
- R5接收到来自R1的组播报文,由于与R5相连下游网段不存在组成员和PIM邻居,执行剪枝。
- R3接收到来自R2的组播报文,RPF检查成功,在本地创建对应(S,G)表项,下游接口列表添加与组成员PC1相连的接口,后续到达的报文向PC1转发。
- R4接收到来自R2的组播报文,由于与R4相连下游网段不存在组成员和PIM邻居,执行剪枝。
4.2.5 PIM-DM剪枝/加入
- 当PIM路由器接收到组播报文后,RPF检查通过,但是下游网段没有组播报文需求。
- 此时PIM路由器会向上游发送剪枝报文,通知上游路由器禁止相应下游接口的转发,将其从(S,G)表项的下游接口列表中删除。(向上游节点发送剪枝消息224.0.0.13)
- 剪枝操作由叶子路由器发起,逐跳向上,最终组播转发路径上只存在与组成员相连的分支。
- 路由器为被裁剪的下游接口启动一个剪枝定时器(默认为210秒,应该为3分钟才对,但实际中观察到的真的是210秒),定时器超时后接口恢复转发。组播报文重新在全网范围内扩散,新加入的组成员可以接收到组播报文。(prune状态接口每3分钟后又变成forwarding状态【这是早期的机制】,但是实际在华为路由器上,第一跳路由器会每隔1分钟发送状态刷新信息,剪枝定时器又会重新刷新,这样就可以避免没有意义的流量扩散【后期的研发改进】)
- 随后,下游不存在组成员的叶子路由器将向上发起剪枝操作。
通过这种周期性的扩散-剪枝,PIM-DM周期性地刷新SPT。
当下游接口被剪枝后如果下游叶子路由器有组成员加入,并且希望在下次“扩散-剪枝”前就恢复组播报文转发,则执行嫁接机制
如果下游叶子路由器一直没有组成员加入,希望该接口保持抑制转发状态,则执行状态刷新机制。
拓扑描述R5向上游R1发送Prune报文,通知R1不用再转发数据到该下游网段。
- R1收到Prune报文后,停止该下游接口转发,将该下游接口从(S,G)表项中删除。由于R1上还存在其他处于转发状态的下游接口,剪枝过程停止。后续到达的报文只向R2转发。
- R4向上游R1发送Prune报文,通知R2不用再转发数据到该下游网段。
- R2收到Prune报文后,等待3秒(Lan-delay + override-interval ),此时R3也能收到R4向上游发送的Prune消息,且R3发现自己下游有一个接收者,所以R3向上游发送Join消息以否决R4发送的Prune消息。
当R2收到Join消息后,会忽略R4发送的Prune消息。继续向下游转发组播流量。
对于Lan-delay和override-interval的解释路由器向外发送的Hello报文携带lan-delay(报文传输延迟时间,默认为500毫秒)参数和override-interval(剪枝否决时间间隔,默认为2500毫秒,所以加上前面的500毫秒就为30s)参数。override-interval表示允许下游路由器否决Prune剪枝动作的时间。
- 当同一网段中有路由器向上游发送剪枝报文时,如果其他路由器仍然需要接收组播数据,则必须在override-interval时间内向上游发送剪枝否决报文。
- 当同一链路中的所有路由器上的override-interval值不同时,将进行协商从中选取最大值。
- lan-delay + override-interval = PPT。路由器接收到下游剪枝报文后,并不立即执行剪枝操作,而是等待一段时间PPT(Prune-Pending Timer),超时则剪枝。在PPT时间内如果收到下游发来的剪枝否决报文,则取消剪枝操作。(注意这是在LAN网段内)
会发生剪枝的情况:
多路访问网段的修剪延迟:
- 实际上否决信息也就是Join信息
- 会存在的问题:每次流量来时都会重新修剪和否决,但其实也没有太大的影响,工作机制就是这样的。
- 因为会存在上面的延迟,所以这也是PIM DM机制不高效的原因。
可以查看下面的数据包:
**查看被修剪接口的定时器display pim routing-table fsm
4.2.6 PIM-DM SPT树形成
- 组播路由器根据剪枝消息剪去多余的分支,形成一颗新的SPT树。
- 虽然剪枝消息让路由器不再向没有组播成员的分支转发组播报文。但是每台路由器上的(S,G)表项仍然是存在的,其目的是为了一旦有组播成员加入时可以快速加入并转发组播报文。(这也是PIM-DM的缺点,就是会比较消耗设备的内存资源)
4.2.7 PIM-DM嫁接
- PIM-DM通过嫁接机制,使有新组成员加入的网段快速得到组播报文。
- 叶子路由器通过IGMP了解到与其相连的用户网段上,组播组G有新的组成员加入。
- 随后叶子路由器会向上发送Graft报文(嫁接是单播消息,剪枝是组播消息),请求上游路由器恢复相应出接口转发,将其添加在(S,G)表项下游接口列表中。
- 嫁接过程从叶子路由器开始,到有组播报文到达的路由器结束。
处于Prune状态的接口收到嫁接消息后会把接口状态更改为Forwarding状态,同时会回复Graft ACK消息,如果下游节点3s后没有收到Graft ACK消息,也会重新发送,所以这是一种可靠的机制。
拓扑描述
- 被剪枝的下游节点可以在剪枝定时器超时后恢复到转发状态,但是剪枝定时器要等待210秒(应该是3分钟才对,不过实际观察得到的的确是210秒)。如果在这期间有组播成员相加入时必须等待,这个时间是比较长的。为了减少反应的时间,当被剪枝的下游节点需要恢复到转发状态时,该节点可以使用Graft嫁接消息主动通知上游节点。
- 网络中一个接收者恢复接收组播数据,R5会发送Graft嫁接消息,并逐跳向组播源S传递,R1接收到Graft嫁接消息后回应确认,从而先前被减掉的分支恢复信息传输。
4.2.8 PIM-DM状态刷新
- 在PIM-DM网络中,为了避免被裁剪的接口因为“剪枝定时器”超时而恢复转发,离组播源最近的第一跳路由器会周期性地触发State Refresh报文在全网内扩散。
- 收到State Refresh报文的PIM路由器会刷新剪枝定时器的状态。被裁剪接口的下游叶子路由器如果一直没有组成员加入,该接口将一直处于抑制转发状态。
- 状态刷新消息每60s发送一次。
- 第一跳路由器发送状态刷新信息的前提条件是,网络中一直有组播流量在发送。(可以考虑,如果没有流量在发送,也就没有必要修剪了)
- 所以在华为设备上也就没有3分钟一扩散一剪枝的过程了。
拓扑描述
- R1触发状态刷新机制,将State Refresh报文向R2和R5扩散。
- R5上存在被裁剪接口,刷新该接口的“剪枝定时器”的状态。下一次“扩散-剪枝”来临时,由于R5上仍然没有组成员加入,R5上被裁剪的接口将被抑制转发组播报文。(实际上R1也不会向R5发送组播数据,因为当R1收到状态刷新消息时,也会将连接R5的接口的剪枝定时器刷新)
4.2.9 PIM-DM断言(有竞选)
- 当一个网段内有多个相连的PIM路由器RPF检查通过向该网段转发组播报文时,则需要通过断言机制来保证只有一个PIM路由器向该网段转发组播报文。
- PIM路由器在接收到邻居路由器发送的相同组播报文后,会以组播的方式向本网段的所有PIM路由器发送Assert报文,其中目的地址为永久组地址224.0.0.13。
- 其它PIM路由器在接收到Assert报文后,将自身参数与对方报文中携带的参数做比较,进行Assert竞选。
竞选规则如下:
- 单播路由协议优先级较高者获胜。(去往组播源的单播路由优先级)
- 如果优先级相同,则到组播源的开销较小者获胜。
- 如果以上都相同,则下游接口IP地址最大者获胜。(在这种情况下,下游的路由器选择到源的单播路由中IP地址大的来作为RPF邻居,刚好与这一竞选规则对应)
- 根据Assert竞选结果,路由器将执行不同的操作:
- 获胜一方的下游接口称为Assert Winner,将负责后续对该网段组播报文的转发。
- 落败一方的下游接口称为Assert Loser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表中删除。(但是该(S, G)表项还是存在的)(同时会将该接口变为prune状态)
- Assert竞选结束后,该网段上只存在一个下游接口,只传输一份组播报文。
- 所有Assert Loser可以周期性(理论上默认为180秒,实际观察为210s)地恢复组播报文转发,从而引发周期性的Assert竞选。(但是由于DM状态刷新的存在,最后prune的定时器还是会被重置的)
拓扑描述
- 假设R2到组播源的开销小于R3到组播源的开销。
- R2和R3从各自下游接口接收到对方发来的组播报文,RPF检查都失败,报文被丢弃。同时,R2和R3分别向该网段发送Assert报文。
- R2将自身的路由信息与R3发来的Assert报文中携带的路由信息进行比较,由于自身到组播源的开销较小而获胜。于是后续组播报文仍然向该网段转发,R3在接收到组播报文后仍然由于RPF检查失败而丢弃。(180s后R3还是会尝试向该网段发送组播数据,以引发周期性的Assert竞选)(但是由于DM状态刷新的存在,最后prune的定时器还是会被重置的)
- R3将自身的路由信息与R2发来的Assert报文中携带的路由信息进行比较,由于自身到组播源的开销较大而落败。于是禁止相应下游接口向该网段转发组播报文,将其从(S,G)表项的下游接口列表中删除。(同时会将该接口变为prune状态)
4.2.10 RPF检查细则(重要)
注意:MBGP学习到的路由不会放到单播路由表中,只会用来做RPF检查。(RPF检查包括对组播数据的RPF检查和对BSR消息的RPF检查)
- 首先从MBGP、单播路由、组播静态路由各取一条到源的路由,优先级最高的一条作为RPF检查的路由,如果优先级相同,就按照组播静态路由,MBGP路由,单播路由的顺序选择。
查看RPF信息:
出现上面这样的情况,会选择下一跳IP地址大的来作为RPF邻居:
如果需要修改,可以添加修改了优先级的静态路由:
或者不改优先级,通过改静态路由的掩码长度来修改(先删除上面配置了优先级的静态路由):
这种情况下最长匹配原则:
当然,优先级最高的是组播静态路由(前面配置了/32掩码的静态路由不用删除):
上面的配置之后,R7的G0/0/0接口会被修剪掉:
- 这是在R7上看到的表项,具体的过程为,R5向R7发送数据过快,R7的G0/0/0也会向R5发送组播数据,由于此时R5本身也在向该网段发送组播数据,所以这一过程会引发Assert断言机制。
- 结果是R7胜出,成为Winner。(IP地址大)
- 所以R5就不会从G0/0/0接口发送组播数据。
- 另外,R7的G0/0/0也处于prune状态,因为R5收到该组播数据后,RPF检查失败(对于R5,RPF接口是G0/0/1),就会发送剪枝消息。
- 而同时,R5的G0/0/0只会处于assert的L状态(loser),因为Assert竞选失败后,就不会再向该网段发送组播数据了。
(上面的结果使用命令dis pim routing-table fsm)
- 另外,R7收到R5发送的组播数据后,虽然RPF检查失败,但是也没有发送剪枝消息,是因为R7有组播成员接到了R7上,所以就没有必要发送剪枝消息了。(实际上应该是R5会成为Winner才对,但因为模拟器上Metric值为0,也就模拟器有Bug,所以才导致最后需要比较IP地址才能进行竞选,所以R7才会成为Winner,在真实设备上Metric肯定不会是0的。)
- 上面的情况在这个环境中是相对比较特殊的。就是不太正常的Assert机制的场景(即组播流量发送太快,往回发了),如果要想清晰地研究一下Assert机制,选择一个正常一点的环境就好了。
4.2.11 PIM-DM表项维护(重要)
- PIM-DM(*,G)状态规则
从中可以看出,有两个计时器,一个是表项的,一个则是接口的。
- PIM DM(*,G)状态维护
正确应该为:没有接收者的时候,表项马上就会删除。(对于PIM-DM的*,G表项会马上删除,但是对于PIM-SM的则不会)。
- PIM DM(S,G)状态规则
- PIM DM(S,G)状态维护
周期有PIM Join的原因,因为叶子路由器会每隔1分钟发送普遍组查询,收到report报文后,就会向上发送PIM Join消息(所以join消息也是每分钟向上游发送一次)。在没有流量的情况下,最终(S,G)表项会超时,自然也就没有接口计时器了,这句话很重要。
4.3 PIM-SM
4.3.1 PIM-SM概述
- PIM-SM适用于ASM和SSM两种模型。
- 在ASM模型中,它使用“拉(Pull)模式”转发组播报文,一般应用于组播成员规模相对较大、相对稀疏的网络。
- 基于这一种稀疏的网络模型,它的实现方式是:
- 在网络中维护一台重要的PIM路由器:汇聚点RP,可以为随时出现的组成员或组播源服务。网络中所有PIM路由器都知道RP的位置。
- 当网络中出现组成员(用户主机通过IGMP加入某组播组G)时,最后一跳路由器向RP发送Join报文,逐跳创建(S,G)表项,生成一颗以RP为根的RPT。
- 当网络中出现活跃的组播源(信源向某组播组G发送第一个组播数据)时,第一跳路由器将组播数据封装在Register报文中单播发往RP,在RP上创建(S,G)表项,注册源信息。
- 这一过程可参考下面的图示:
- 在ASM模型中,PIM-SM的关键机制包括邻居发现、DR竞选、RP发现、RPT构建、组播源注册、SPT切换、剪枝、断言;同时也可通过配置BSR(Bootstrap Router)管理域来实现单个PIM-SM域的精细化管理。
4.3.2 PIM-SM转发树
- 从RP到组播接收者数据转发的路径称为共享树。
- 从组播源到RP的数据转发路径称为源路径树。
- RPF检查根据树的种类进行:
- 在共享树下,使用RP地址作为检测地址。
- 在源路径树下,使用组播源地址作为检测地址。
4.3.3 PIM-SM邻居发现和DR竞选(有竞选)
- 在组播源或组成员所在的网段,通常同时连接着多台PIM路由器。
- 这些PIM路由器之间通过交互Hello报文成为PIM邻居,Hello报文中携带DR优先级和该网段接口地址。
- PIM路由器将自身条件与对方报文中携带的信息进行比较,选举出唯一的DR来负责源端或组成员端组播报文的收发。
竞选规则如下:
- DR优先级较高者获胜(网段中所有PIM路由器都支持DR优先级,默认优先级是1)。
- 如果DR优先级相同或该网段存在至少一台PIM路由器不支持在Hello报文中携带DR优先级,则IP地址大者获胜
- 如果当前DR出现故障,将导致PIM邻居关系超时(缺省为105秒),其他PIM邻居之间会触发新一轮的DR竞选
在ASM模型中,DR主要作用如下:
- 在连接组播源的共享网段,由DR负责向RP发送Register注册报文。与组播源相连的DR称为源端DR。
- 在连接组成员的共享网段,由DR负责向RP发送Join加入报文。与组成员相连的DR称为组成员端DR。
- 只要是共享的网段都会选举DR,但是对于中间的路由器,选举了也没有作用,只有上面两种情况有用。
DR竞选时关于RPF邻居的特殊情况
说明:在这个场景中,R4和R6是不启用的,R5为静态RP
R5在向组播源发送join消息时(组播发送),其中会携带有RPF邻居字段(上游邻居),在这个场景中应该为R3(选IP地址大的),所以R3负责注册和转发组播数据,即R3会形成S,G表项,但是R2不会,因为RPF邻居并不是R2。
但是如果把该网段的源端DR设置为R2,那么这个时候的情况就变为,R2负责向RP发送注册信息,但是由于R5的RPF邻居还是R3,所以当发送join消息时,携带的RPF邻居字段还是R3,当R3收到以后,就会形成S,G表项,由于R2不是其RPF邻居,收到后并不会形成该表项。这也就意味着,在这种情况下,R2和R3就分工了,其中R2负责发送注册信息,而R3则负责转发组播数据。这是没有问题的。(在华为设备上,这种情况下,由于R2不会加入到SPT中,所以还是会每分钟发送注册信息,如果R3为DR,则就不会每分钟发送了,在4.3.5中有提及到,因为这个时候R3已经加入到了SPT中)
4.3.4 PIM-SM RPT树构建
- PIM-SM RPT是一颗RP为根,以存在组成员关系的PIM路由器为叶子的组播分发树。
如拓扑所示,当网络中出现组成员(用户主机通过IGMP加入某组播组G)时,组成员端DR向RP发送Join报文,在通向RP的路径上逐跳创建(*,G)表项,生成一颗以RP为根的RPT,同时沿途经过的路由器的RPF接口就是去往RP的单播路由的出接口。
当某接收者对组播信息不再感兴趣时,离该接收者最近的组播路由器会逆着RPT树朝RP方向逐跳发送Prune剪枝消息。第一个上游路由器接收到该剪枝消息,在接口列表中删除连接此下游路由器的接口,并检查自己是否拥有感兴趣的接收者,如果没有则继续向上游转发该剪枝消息。这一过程同PIM-DM的剪枝相同。
4.3.5 PIM-SM组播源注册
- 在PIM-SM网络中,任何一个新出现的组播源都必须首先在RP处“注册”,继而才能将组播报文传输到组成员。具体过程如下:
- 组播源将组播报文发给源端DR。
- 源端DR接收到组播报文后,将其封装在Register报文中,发送给RP。(单播,用来询问RP是否有对此组播组感兴趣的成员,因为RP上可能会有*,G表项)
- RP接收到Register报文,将其解封装,建立(S,G)表项,并将组播数据沿RPT发送到达组成员。(RP收到Register报文后执行的两个动作:解封装报文并沿RPT发送,同时发送join消息沿组播源方向建立S,G表项)
- 此时RP不再需要R1发送的Register报文,所以RP会单播向R1(DR)发送Register-Stop报文,告知R1停止发送Register报文。
第一跳路由器在什么情况下不会发送注册消息?
- 收到RP发送过来的停止注册消息
RP在什么情况下会发送停止注册消息?
- RP收到了纯组播报文的时候。(这意味着从源到RP的SPT已经形成),第一跳路由器收到了停止注册消息后就不会再注册了。(需要注意的是,即使在第一跳路由器的S,G表项已经形成,如果还没有收到RP发送的停止注册信息,仍然会发送注册信息,假设第一跳路由器在发送第二份组播报文的时候已经形成了S,G表项,那么它会把收到的组播报文复制一份,原来那份通过S,G表项进行转发,复制的一份则还是封装在Register报文中单播发送给RP,直到收到了RP发送的停止注册信息)(前面和下面所说的形成S,G表项,更准确的表述应该是,该S,G表项的下游存在接口,即有下游成员,这非常重要,因为只要有组播数据到达,就会有S,G表项生成,但如果需要有下游接口,就必须要收到下游发送的join消息)
- 第一跳路由器发送了第一份组播数据报文之后的组播路由表的情况如下:
表明这个时候还需要发送注册,即还没有收到RP发送过来的停止注册消息。
收到了RP的停止注册消息后,Register表项才会消息。(实际观察,注册了也还是会有这个消息???因为在华为设备上并不会发送停止注册消息,但是一段时间之后,它自己又会消失的。)
- 但是第一跳路由器只是在接下来的1分钟不发送注册消息,过来1分钟后还是会再次发送(一直有组播数据的前提下)
在华为模拟器和真实设备上:
实际的情况是,第一跳路由器在发送第二份组播报文的时候(这个时候的S,G表项也形成了),并不会发送组注册信息,同时也就不会收到RP发送过来的停止注册消息,这也可以认为是一种优化,也就是说通过(S,G)表项就可以判断出SPT树的形成,也就没有必要再去发送注册信息了。(上面说的S,G表项的形成指的是,在S,G表项中已经可以看到下游接口了)
但实际上还是会容易出现问题,就是当接收者离开后,DR还是不发注册信息,那么RP上的表项迟早会超时,到后面如果接收者再加入时,也就再也收不到组播数据了。(所谓的超时指的应该是,由于没有接收者,一段时间后,S,G表项会超时消失,SPT树就不会形成了,所以当组播数据接收到的时候,还是会发送注册信息,个人认为是这样的情况,而不是韩Sir在视频中所说的情况,这样的话就变成了先有组播数据,后有接收者的场景了)
4.3.6 PIM-SM SPT树切换
- 在PIM-SM网络中,一个组播组只对应一个RP,只构建一棵RPT。
- 在未进行SPT切换的情况下,所有发往该组的组播报文都必须先封装在注册报文中发往RP,RP解封装后,再沿RPT分发。(在未收到停止注册消息时才需要封装)
- RP是所有组播报文必经的中转站,当组播报文速率逐渐增大时,对RP形成巨大的负担。
- 为了解决此问题,PIM-SM允许RP或组成员端DR通过触发SPT切换来减轻RP的负担。
切换条件
- 当信息吞吐率超过预定的值时,PIM-SM就会从共享树切换到组播源路径树。
在VRP中,缺省情况下连接接收者的路由器在探测到组播源之后(即接收到第一个数据报文),便立即加入最短路径树(源树),即从RPT向SPT切换。(因为默认情况下,配置的阀值是0,需要注意的是,是最后一跳路由器进行切换)
组成员端DR周期性检测组播报文的转发速率,一旦发现(S,G)报文的转发速率超过阈值,则触发SPT切换:
- 组成员端DR逐跳向源端DR逐跳发送Join报文并创建(S,G)表项,建立源端DR到组成员DR的SPT。(注意,此时由组成员端DR到源端DR的S,G表项跟组成员端到RP的S,G表项是不一样的,这非常重要)
- SPT建立后,组成员端DR会沿着RPT逐跳向RP发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,RP不再沿RPT转发组播报文到组成员端。(但此时RPT树还是存在的,并没有修剪掉RPT树,因为*,G表项还是存在的)
- 如果SPT不经过RP,RP会继续向源端DR逐跳发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,源端DR不再沿“源端DR-RP”的SPT转发组播报文到RP。
RPT上的剪枝
- 在RPT中,注意减掉的是原来共享树的流量,共享树并没有剪掉
- 注意RP位剪枝的意义,查看后面的拓展。
SPT上的剪枝
在SPT中,上面的步骤之后,RP上的S,G表项,出接口为空,RP会向组播源剪掉源树,这时剪掉的就是SPT树了,而不仅仅是流量。(途经SPT树的路由器的S,G表项的出接口为空)
一个完整的RPT切换实验
下面的说明依照的拓扑为:
其中,在R6上演示RPT的切换。
R6上,切换后的组播路由表项,SWT表示有实际数据到达的路由表项,ACT表示切换后的路由表项。
R7上,实际上在RPT树上转发组播数据时,还是会形成S,G表项的,那么当发生切换时,第一跳路由器就会沿RP方向的RPT上发送prune消息,使沿途经过的路由器删除S,G表项的下游接口,这样当组播数据到达时,发现没有下游接口,就会把组播数据丢掉。(即实际上共享树上的数据转发还是按照S,G表项来进行组播数据的转发的,有组播数据到达,就会有S,G表项,只是这时在RPT的S,G表项中,仍然是以RP为源进行RPF的检查)
但是共享树还是在的,而且也有出接口:
这就是所谓的把共享树上的流量修剪掉的意思。
上面的情况中,PC3和PC1都加入了同一个组(在前面实验的基础上又把PC1加进了这个组播组),但是R6配置了切换,而R7则不配置切换,最后的情况是,组播数据到来时,是沿两个路径分别发送给PC3和PC1的,同时在,在R7上,S,G表项的下游接口只有G0/0/2,而没有G0/0/1,G0/0/1已经被修剪了,它收到了R6发送的RPbit置位的剪枝消息,所以就会从S,G表项中删除出接口G0/0/1(这时可以在S,G表项中看到表项的Flag位为RPT)。
拓展:什么情况下会发送RPbit置为的剪枝消息——S,G表项和*,G表项的上游邻居不一样
- 即使R6下面有一台R8路由器,那么发送RPbit修剪的路由器依然是R6,因为此时的R6已经进行了RPT的切换,所以它的S,G表项和*,G表项的RPF邻居是不一样的,所以还是由R6进行发送。
拓展:增加一台路由器
**
增加之后,因为剪枝否决的存在,所以R6上仍然会收到组播数据,只是RPF检查失败,所以仍然会发送RPbit置位的剪枝消息,但是新加入的路由器也会发送join消息进行否决,这个过程不断重复。
4.3.7 两棵树形成的两种情况
- 第一种情况:先有接收者,后来有组播数据流
这种情况跟前面的介绍内容是一样的,即先形成RPT树,再形成SPT树。(在这种情况下,华为设备确实不会发送停止注册消息)
- 第二种情况:先有组播数据流,后来有接收者
但是RP也会解封装,同时形成S,G表项,只是这时候不会向上游发送join,因为不存在,G表项,即这时候还没有接收者,所以S,G表项的下游接口为空。(在这种情况下,华为设备会发送停止注册消息)
(需要注意的是,此时组播数据沿途经过的路由器其实是有S,G表项的,只是没有下游接口,这很重要)
由于DR上没有S,G表项(其实只是没有下游接口),而且也收到了RP发送过来的停止注册信息,所以当DR再收到组播数据的时候就会丢掉。
1分钟后又重新发送注册消息,重复前面的过程,直到有组成员加入该组播组。
RP由于还缓存有S,G表项,所以当收到join消息时,会建立,G表项,同时会向上游发送join消息,以让上游设备形成S,G表项,保证组播数据的正常发送。
DR每分钟发送注册消息的原因:
在先有组播数据,后有接收者的情况下。如果DR发送一次注册消息,虽然一段时间内RP上会形成S,G表项,但是该表项会有过期的时候(7~10分钟不等),然后删S,G表项。
DR不再每分钟发送注册信息,假如这时候有接收者加入该组播组,会沿RP方向形成,G表项,由于此时RP上的S,G表项已经删除,所以就不会沿着组播源方向发送join消息,也就没有办法形成RP到组播源的SPT,最后接收者就不能正常收到组播数据。(没有S,G表项的下游接口,组播数据就不会向下游发送,不会发送单播注册数据,那么也就是说会把组播数据丢弃了)
*即每分钟发送注册信息的原因是为了让RP缓存S,G表项。
4.3.8 PIM-SM修剪过程
- 会发生修剪的情况
4.3.9 PIM-SM表项原则
- PIM-SM(*,G)状态规则
- 最后一条,可以考虑RP在接收到组播数据的时候,是朝着*,G表项的下游接口来发送流量的。
另外需要注意的是,在PIM-DM中,只要组成员离开,*,G表项就会马上删除,但是在PIM-SM中,仍然会等待超时。
PIM-SM(S,G)状态规则
情况1、情况2:考虑SPT的形成
情况3:考虑第一跳路由器收到组播数据时
情况4:当RP收到注册消息时执行的动作
- PIM-SM状态维护
第二条和第三条很重要,不要弄混。实际上,S,G表项不存在的时候,接口定时器也就没有了。在没有流量时,一段时间后,S,G表项是会消失的。
4.3.10 BSR与RP概述
- 总结:C-BSR、BSR、C-RP、RP各类消息发送与过程
- C-BSR消息以组播方式全网通告(周期60s,超时130s),可以选举出BSR,同时组播域路由器可以知道BSR的位置(C-BSR消息源为路由器接口IP地址,而BSR报文中是携带有BSR的地址的)
- C-RP向BSR单播发送C-RP通告(周期60s,超时150s)(C-RP消息源为C-RP地址,目的地址为BSR地址)
- BSR收集C-RP通告,组成RP-Set集,向全网PIM-SM路由器以组播方式通告
- PIM-SM路由器根据收到的BSR消息中的RP-Set集,选举出RP
4.3.11 RP发现
- 在PIM-SM的组播网络里,担当共享树树根的节点成为RP
RP的作用:
- 共享树里所有组播流都通过RP转发到接收者。
RP可以负责几个或者所有组播组的转发,网络中可以有一个或多个RP。用户通过配置命令,可以限制RP只为IP地址在一定范围的组播组服务。一个RP可以同时为多个组播组服务,但一个组播组只能对应一个RP(即每个RP负责的组是不同的)。所有该组成员和向该组发送组播数据的组播源都向唯一的RP汇聚。
RP的发现:静态RP:在PIM域中的所有PIM路由器上逐一进行配置,静态指定RP。static-rp rp-address 指定静态RP的IP地址。(包括RP自己也要手动指定)
动态RP:在PIM域内选择几台PIM路由器,配置成为C-RP(Candidate-RP),最后从C-RP中竞选产生RP。使用动态RP,必须同时配置C-BSR(Candidate-BootStrap Router)。由C-BSR竞选产生BSR。(**默认情况下,动态比静态优先**)
RP是PIM-SM域中的核心路由器,在小型并且简单的网络中,组播信息量少,全网络仅依靠一个RP进行信息转发即可,此时可以在SM域中各路由器上静态指定RP位置。
- 但是更多的情况下,PIM-SM网络规模都很大,通过RP转发的组播信息量巨大。
- 为了缓解RP的负担同时优化共享树的拓扑结构,不同组播组应该对应不同的RP,此时就需要自举机制来动态选举RP,配置自举路由器BSR(BootStrap Router)。
静态RP配置:
默认为所有的组播组服务,但是除了224.0.0.0~224.0.0.255的组播地址。
4.3.12 RP选举原则(有竞选)
RP选举原则
- 1.如果PIM-SM域中只有一个候选RP(Candidate-RP,C-RP),那么这个节点就是域里的RP。
- 如果域中存在多个C-RP并拥有相同的优先级,**则ACL覆盖范围小的优先** (模拟器做这个实验是有问题的,即使用了ACL,看到的还是为224.0.0.0/4的组播服务)
- 2.如果域中存在多个C-RP并都拥有不同的优先级时,则优先级最高(优先级数值越小优先级越高)的将会被选举为域中的RP。(这里是比较特殊的)(除了IGMPv2的查询器选举中的IP地址和RP选举中的优先级是比小的外,在组播中其它都是比大的)
- 3.如果域中存在多个C-RP并都拥有相同的优先级时,则依靠Hash算法算出的数值来决定RP,数值最大的成为RP。Hash算法参数:
- 组地址;
- 掩码长度;
- C-RP地址。
- 4.如果域中存在多个C-RP并都拥有相同的优先级与Hash数值时,则拥有最高IP地址的C-RP为该域的RP。
4.3.13 BSR
- BSR自举路由器是PIM-SM网络里的管理核心,负责收集网络中候选RP(C-RP)发来的Advertisement宣告信息。(宣告信息包括C-RP地址、服务的组范围和C-RP优先级)
- 然后将为每个组播组选择部分C-RP信息以组成RP-Set集(即组播组和RP的映射数据库),并发布到整个PIM-SM网络,从而网络内的所有路由器(包括DR)都会知道RP的位置。(全网PIM-SM路由器根据BootStrap报文包含的信息选举RP,而不是由BSR自己选举的,BSR只是负责收集C-RP信息)
- C-RP周期性的发送Advertisement宣告消息的时间间隔(advertisement-interval )缺省值是60s。(该消息是单播发送的,因为这个时候全网所有的PIM-SM路由器已经知道BSR的位置)
- BSR在holdtime hold-interva(缺省150s)内等待接收C-RP发送的Advertisement宣告消息,超过150s,BSR认为C-RP失效。
- 一个PIM-SM域内也可以配置多个C-RP,由BSR机制计算出和每个组播组对应的RP。
- 一个网络(或某管理域)内部只能选举出一个BSR,但可以配置多个候选BSR (Candidate-BSR C-BSR),当BSR发生故障后,其余C-BSR能够通过自动选举产生新的BSR,从而确保业务免受中断。
4.3.14 BSR选举(有竞选)
BSR选举原则
- 1.如果域中只有一台C-BSR,该台路由器就是该域里的BSR。
- 2.如果域中存在多台C-BSR,则拥有最高优先级的路由器为BSR。(优先级默认为0,C-BSR会设置一个计时器130s倒计时来检查当前Active BSR的状态,这个计时器跟下面所提及的计时器是同一个计时器)
3.如果域里存在多台拥有相同优先级的C-BSR,则拥有最高IP地址的路由器为BSR。
BootStrap Router工作原理和过程1、在网络中选择合适的路由器把它配置成候选BSR(C-BSR),每个C-BSR都有优先级。当它得知自己是C-BSR后,首先启动一个定时器(默认为130秒),监听网络中的 BootStrap Message。BootStrap Message初始时通告发送路由器的优先级、BSR的IP地址和哈希掩码长度。(C-BSR消息默认是每60s发送,可以在pim模式下修改,注意这是初始的BSR消息,因为并没有携带RP-Set集)
- 2、当C-BSR收到一个BootStrap Message后,它会把自己的优先级和报文里的优先级做比较,如果对方的优先级高,它就把自己的定时器重置,继续监听BootStrap Message;如果是自己的高,那么它就发送BootStrap Message声明自己是BSR,如果优先级相等,则比较IP地址,谁的IP地址大谁就是BSR。
- 3、BSR消息发送的目的地址是224.0.0.13,所有的PIM路由器都能接收到这个报文,该报文TTL一般被置为1,但每个PIM路由器收到此报文后都是把它以泛洪的方式从自己所有的使能PIM的接口上发送出去,这就能保证网络中的每台PIM设备都能收到BootStrap Message。(BSR消息的的源地址是路由器接口的IP地址)
- C-BSR在竞选的时候,开始时每个C-BSR都认为自己是BSR,向全网发送Bootstrap报文(Bootstrap报文全网发送,这意味着组播域中的路由器都能知道BSR的地址,所以C-RP也就可以把C-RP通告发送给BSR了)。Bootstrap报文中携带C-BSR地址、C-BSR的优先级。每一台PIM路由器都收到所有C-BSR发出的Bootstrap报文,通过比较这些C-BSR信息,竞选产生BSR。
- 另外需要注意的是,初始BootStrap Message中,包括的信息有:Hash mask len(哈希掩码长度)、BSR优先级、BSR地址。
- 非初始BSR消息
4.4 PIM-SSM
- SSM模型是借助PIM-SM的部分技术和IGMPv3/MLDv2来实现的,无需维护RP、无需构建RPT、无需注册组播源,可以直接在源与组成员之间建立SPT。
SSM的特点是网络用户能够预先知道组播源的具体位置。因此用户在加入组播组时,可以明确指定从哪些源接收信息。组成员端DR了解到用户主机的需求后,直接向源端DR发送Join报文。Join报文逐跳向上传输,在源与组成员之间建立SPT。
SPT的建立过程如下:R3、R5借助IGMPv3协议了解到用户主机有到相同组播组不同组播源的组播需要,逐跳向源方向发送Join报文。
- PIM路由器通过Join报文分别创建(S1,G)、(S2,G)表项,从而分别建立了源S1到组成员PC1、源S2到组成员PC2的SPT。
- SPT建立后,源端就会将组播报文沿着SPT分发给组成员。
- 补充
- 虽然SSM理论上的组播地址为232.0.0.0~232.255.255.255,但是在华为设备上,使用其它组播地址也是没有问题的。只是在模拟器上,如果发送的组播地址不在这个范围的,则IGMP加入消息就无法发送。
- 但是在SSM Mapping中,必须要使用理论上的SSM组播地址,否则就需要在pim模式下配置ssm-policy指定SSM的组播地址范围。
acl number 2000
rule 5 permit source 239.0.0.0 0.255.255.255
rule 10 permit source 232.0.0.0 0.255.255.255
[AR3]pim
[AR3-pim]ssm-policy 2000
4.5 IGMP SSM Mapping
- SSM Mapping的机制是:通过在路由器上静态配置SSM地址的映射规则,将IGMPv1和IGMPv2报告报文中的(*,G)信息转化为对应的(S,G)信息,以提供SSM组播服务。缺省情况下,SSM组地址范围为232.0.0.0~232.255.255.255。
- IGMP SSM Mapping不处理IGMPv3的报告报文。为了保证同一网段运行任意IGMP版本的主机都能得到SSM服务,需要在路由器接口上运行IGMPv3。
配置了SSM Mapping规则后,当路由器收到来自成员主机的IGMPv1或IGMPv2报告报文时,首先检查该报文中所携带的组播组地址G,然后根据检查结果的不同分别进行处理。
- 如果G在ASM(Any-Source Multicast)范围内,则只提供ASM服务。
- 如果G在SSM组地址范围内:
- 如果路由器上没有G对应的SSM Mapping规则,则无法提供SSM服务,丢弃该报文。
- 如果路由器上有G对应的SSM Mapping规则,则依据规则将报告报文中所包含的(*,G)信息映射为(S,G)信息,提供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)
实验配置
5.组播路由管理
5.1 RPF检查
RPF检查原理
- 路由器收到一份组播报文后,会根据报文的源地址通过单播路由表查找到达“报文源”的路由,查看到“报文源”的路由表项的出接口是否与收到组播报文的入接口一致。如果一致,则认为该组播报文从正确的接口到达,从而保证了整个转发路径的正确性和唯一性。这个过程就被称为RPF检查。
- 如果这几条等价路由都是来自同一张路由表项,则选取下一跳地址最大的路由作为RPF路由。
- RPF检验可以基于单播路由、MBGP路由和组播静态路由。他们之间的优先顺序为组播静态路由、MBGP路由、单播路由。
5.2 静态组播路由
- R3到组播源(Source)的RPF邻居为R1,从Source发出的组播报文会沿着Source->R1->R3的路径传输。
- 此时,在R3上配置组播静态路由,指定R3的RPF邻居为R2,则从Source发出的组播报文的传输路径将发生改变,改为沿Source->R1->R2->R3的路径传输,区别于原来的单播路由路径。
6.域间路由协议——MSDP/MBGP
需要考虑的问题:
BSR消息也要做RPF检查,因为还是有可能会有环路的
6.1 MSDP实验
6.2 MBGP协议
7.Anycast
7.1 基本原理
- 实际上是想借助MSDP实现单个域内的任播功能,但做实验时有些问题,思路还是正确的。
7.2 实验
实验拓扑:Anycast.zip