HCIP-Datacom Core Technology V1.0_18 PIM原理与配置
PIM基础介绍组播网络基本架构回顾组播数据转发流程回顾正常情况下组播源将它的组播数据推送到第一跳路由器之后就正式开始整个组播数据的转发会通过RPF检查然后再根据组播路由表项进行数据的转发然后将这个组播数据沿着构建的组播分发树推送到最后一跳路由器最后由最后一跳路由器根据IGMP协议将该组播流量推送给特定的接收者来实现整个组播数据的正常接收现在只差最关键的一 步如何在组播分发网络中去构建这个分发树帮助去实现从第一跳路由器传递到最后一跳路由器同时避免环路的产生。组播协议介绍回顾整个组播转发网络中其实是比较复杂的正常情况下如果是跨域的组播网络网络规模就非常大可能会涉及到不同的组播路由协议比如说PIM协议无关组播这个协议它主要是帮助去构建单域类的最大分发树如果是帮助去跨域之间进行数据转发还需要通过MSDB来实现同时在跨域之也要进行一个RPF的流量检查这个时候还需要MBGP因此会发现这样的一个组播网络其实是比较复杂的本章课程主要是介绍单域内的PIM原理与配置章节。PIM协议介绍PIM协议它的全称叫做协议无关组播很多人现学习这个协议的时候其实就有点困惑了为什么这样说呢因为这个协议明明是用在组播转发网络中帮助去构建组播分发树的为什么它的名字又是叫做协议无关组播呢其实这里去了解它的基本工作原理就不难理解它的叫法了。因为它是根据单播路由表然后去进行一个RPF检查RPF检查之后再通过相应的组播路由表项转发组播数据流。但是这一关键在于它是利用单播路由的结果进行RPF检查和转发组播数据而自己不需要维护单播路由协议。这里的协议无关是指与单播路由协议无关。因为它不需要自己去维护单播路由表它是直接把单播路由表里面的结果拿过来直接构建它的一个转发分发树。如果自己再单独用一个组播路由协议去建立组播转发路径这样设备消耗的资源就比较大直接利用单播路由表里忆经建立好的转发路径去实现转发组播数据流量又不需要自己去维护单播路由表里面的资源因此对我来说是一个一劳永逸的事情。PIM有两种工作模式分别是Dense Mode和Saprse Mode。其中Sparse稀疏模式又根据组播服务类型分为两大类分别是为任意源建立发发树和指定源建立分发树。PIM-DM与PIM-SM使用场景Dense Mode一般是用在成员比较少但是相对集中的一个应用场景中它的工作机制是非常多的比如实现一个扩散然后再裁剪这样的一个工作机制而Sparsse Mode是比较适用于成员非常多但是因为网络规模很大成员分散在各个角落因此比较适用于成员多且分散在稀疏的网络规模中它也有自己的工作机制。在现网中用的最多的是第二种Sparse Mode。组播分发树的分类RPRendezvous Point汇集点是PIM-SM稀疏模式中的核心概念用于构建共享树(*, G) 表项。组播分发树主要的作用是构建分发树分发树分为两种类型。第1种如果是以组播源为根构建的分发树为SPT又称它为源树因为是以组播源为根的其中组播组的成员为叶子STP无论是在Dense Mode中还是在Sparse Mode中都会去使用它。第二种RPT是以汇聚点RP为根构建的树它又称共享树这种树只有在PIM稀疏模式中。PIM路由表项在PIM路由表项里面主要是通过PIM协议去构建组播路由表项在PIM网络中一共存在两种路由表项分别是(SG)表项和(*, G)表项针对(S,G)和*G这两个概念应该很熟悉了。所谓的(*,G)是指并不知道数据源只知道想好要加入的组播组。(S,G)是代表既知道组播源是谁又能表明自己想要加入的组播组。S,G表项主要是用来建立SPT。*G主要是建立RPT。问题:(*G)表项在PIM-DM模式中存不存在在 PIM-DM密集模式中不存在 (*, G) 表项。PIM-DM 基于源树最短路径树SPT转发组播流量所有表项都是 (S, G) 形式没有汇聚点RP的概念因此不会生成 (, G) 共享树表项。而 PIM-SM稀疏模式中才会使用 (*, G) 表项来构建共享树。在*G表项中发现它缺少了哪些信息它没有上游接口以及RPF检查为什么它会缺少这一部分信息呢所谓的(*,G)表项是指不知道组播源所以没有办法从组播源到本地路由所接收的端口判断哪一个为正确端口它没有办法去计算最优路径因此它就缺少了正确接收的上游端口以及应该做的RPF检查。在(S,G表项中 就是由正确应该接收的上游接口以及RPF检查而(S,G)表项一定是需要通过流量去触发的因为组播路由表项和交换机的MAC地址其实非常类似它只有流量经过的时候它才会生成相应的表项否则没有流量经过的话经过老化时间它会在表项里面消失了而不像单播路由协议它会一直存在。正常情况下如果关于(S,G)的组播流量经过了运行了组播协议的路由器首先它会进行一个RPF检查然后如果有(S,G)表项它就根据(S,G)表项对应的下游出接口将该组播数据流量转发给下游设备如果没有SG表项只有(*G)表项它会根据(*,G)表项去创建(S,G)表项然后再通过(S,G)表项指导组播数据流量转发。因此真正指导数据转发这样的一个表项是(S,G)表项。因此无论是在现网中还是在做实验中经常会看见组播路由协议它会有两个它可能同时存在(*,G)和(S,G)而这个(S,G)就有可能是通过(*,G)表项进一步去创建的。无论是(S,G)表项还是(*,G)表项都有个Flag字段Flag字段里有不同的含义。这里的WC其实代表*G表项。如果是ACT代表现网中有组播流量已经到达本设备进行数据的转发。loc代表这台路由器和组播源直连的这样一个路由器上。或者说delete标识字段可能代表这个表项即将要删除不再指导数据转发。PIM路由表项与组播路由表项正常情况下如果不是最后一跳路由器组播路由表项是直接根据PIM(S,G)表项去映射过来的PIM(*,G)路由表项缺少了入接口信息无法形成组播路由表。(SG)表项包含的内容比较多可以看到运行的是什么模式知道组播源和组播组信息最关键的有上下游接口最后将上下游接口和 S,G这样的一个信息映射过来就造成了组播路由表项这样数据转发直接根据组播路由表项和对应的出接口将组播数据流推送给下游设备。有一个例外最后一跳路由器在IGMP协议中最后一跳路由器它的组播路由表项就非常复杂它是由IGMP组表项IGMP路由表项以及PIM路由表项这三个表汇总而成的最后形成组播路由表项而其它组播路由器在组播转发网络中它只运行了PIM除了最后一条路由器以外所经它们去构建组播路由表项是比较简单的直接根据PIM的(S,G)表项就可以了。PM-DM介绍PIM-DM基本概念PIM-DM这个模式主要用在成员规模较小但是比较密集的网络中通过扩散剪枝这样的一个方式去构建SPT同时在去构建SPT的过程中它还会有很多机制去维护这种工作状态。如果组播源在Dense Mode中会将这个组播流量进行全网扩散在扩散的过程中如果某一台组播路由发现它的下游没有想要的组成员再通过路径剪枝的方式将该网段的流量进行裁剪。最后就形成了从组播源到想要接收的组播成员构建的一棵SPT然后依赖于组播分发树去转发组播数据流量。PIM-DM协议报文PIM协议封装在IP报文中采用的组播目的地址是224.0.0.13协议号是113它的协议报文和Sparse Mode是不一样的。邻居发现通过发送Hello报文去发现邻居这个就有点类似于前面所学的路由协议当路由协议接口激活了PIM协议之后它就会发送Hello报文当然Hello报文里面也包含了其他参数比如说优选级延迟等等通过Hello报文的交互然后去建立邻居关系正常情况下每隔30t秒发送一次Hello报文里面有一个超时时间正常默认是105秒如果在超时时间内收到Hello报文就认为邻居正常如果超时了依然没有收到对方发给我的Hello报文那么就认为关于PIM邻居失效了那有可能是设备故障或者链路断开了这是第一步建立邻居关系也是去构建组播分发树的一个必要条件之一。首次形成组播分发树当发现邻居之后就正式开始构建组播分发树。在第一次构建组播分发树的过程中一共要用到多种机制这些机制分别有什么作用。扩散机制在Dense Mode中它是假设每一个组播路由器的下游都存在着想要接收组播信息的用户因此它将会组播流量在整个Dense Mode网络中进行全网扩散。断言机制在扩散的过程中如果遇到一个多路访问网络这个时候就要选举一个组播转发路由器来避免重复报文的转发。这个就有点类似于选举DR一样。比如说组播源在进行全网扩散的过程中基中在这两台设备之间就形成了一个多路访问将这个组播流量转发给下游设备就有可能造成下游接收重复的组播报文因此它们之间需要一个断言机制选举一台设备作为组播转发路由器就有点类似于DR一样。由其中的一台设备进行数据的转发另一台设备就不再转发组播数据流量给它的下游设备来避免这样的一个重复性动作。剪枝机制,在组播数据流量向下游扩散的过程中现在某一台组播路由器它的下游是没有任何组成员的这个时候组播流量就不应该到达这台组播路由器因为浪费了带宽因此需要一个剪枝机制针对组播路由器下游没有成员的情况下要告诉上游不要将组播流量转发给本台设备来避免带宽的浪费。扩散机制组播源发送组播报文到第一跳路由器之后就正式开始全网扩散这个扩散是路由器收到组播报文之后首先会进行RPF检查。这个检查是检查正确接收组播流量的入接口它是通过单播路由表去计算到达组播源的最优路径算出对应的出接口和自己接收到的组播流量的入接口将这两个接口进行对比如果是相同就正常接收组播流量如果不同就代表RPF检查失败就进行流量的丢弃检查通过之后组播路由器就开始创建(S,G)表项然后向所有的邻居开始推送组播数据流这个(S,G)表项默认情况下有一个老化时间也就是210秒刚好和前面介绍的第一个概念是有关联的就是说(S,G)表项是由组播流量触发的如果在210秒内没有任何组播流量所谓的(S,G)表项就会消失。在扩散的过程中还会遇到一个问题它的扩散并不是一次性的扩散的而是周期性的从组播源发送数据流每隔180秒扩散一次。在组播数据流扩散的过程中可能会遇到一些问题比如说如何避免重复组播报文发送给下游设备如何去判断组播路由器是否想要接收组播数据流量。pim 路由表项R1display pim routing-table VPN-Instance: public net Total 0 (*, G) entry; 1 (S, G) entry (192.168.10.2, 239.0.0.1) Protocol: pim-dm, Flag: LOC ACT UpTime: 00:15:53 Upstream interface: GigabitEthernet0/0/0 Upstream neighbor: NULL RPF prime neighbor: NULL Downstream interface(s) information: Total number of downstreams: 1 1: GigabitEthernet0/0/2 Protocol: pim-dm, UpTime: 00:15:53, Expires: never下面的是一个多播路由表项,(S,G)表项。多播路由表项R1display multicast routing-table Multicast routing table of VPN-Instance: public net Total 1 entry 00001. (192.168.10.2, 239.0.0.1) Uptime: 00:13:37 Upstream Interface: GigabitEthernet0/0/0 List of 1 downstream interface 1: GigabitEthernet0/0/2多播转发表项R1display multicast forwarding-table Multicast Forwarding Table of VPN-Instance: public net Total 1 entry, 1 matched 00001. (192.168.10.2, 239.0.0.1) MID: 0, Flags: ACT Uptime: 00:15:13, Timeout in: 00:03:25 Incoming interface: GigabitEthernet0/0/0 List of 1 outgoing interfaces: 1: GigabitEthernet0/0/2 Matched 40172 packets(54473232 bytes), Wrong If 0 packets Forwarded 40172 packets(54473232 bytes)断言机制断言机制选举规则正常情况下组播流量到达路由器之后第一次会以扩散的形式进行发送假设这两台设备分别是A和B当它们从相同的组播源收到相同的组播数据之后就会进行扩散同时会发现路由器A,B,C它们在一个共享网络中因此A和B会从邻居也就是说从对方收到组播报文它个时候它们就会产生一个疑问收到的组播报文和要发送的组播报文是相同的组播这个时候它们就会发送一个断言报文来进行一个竞选这个竞选有点类似选举DR获胜者用来向下游发送达样的一个组播数据。先比较自己到组播源的单播路由优选级如果优选级相同再比较开销如果开销也一样最后比较下游接口的IP地址大小通过前面这两个条件这是不是就是路由表中选举最优路由的两个条件。因此大家可以理解一下所谓的协议无关组播是什么样的一个概念。通过这样的一个机制也能够判断出实际上这是为数据源从自己本身到组播源选择一条最优最短的路径。然后为组播数据向下游进行转发。按照图中的案例可知当它们发送Assert断言报文之后先比较路由的优选级都是20但是路由器A到达组播源的开销小一点是3因此它就成为获胜者为下游转发数据流量这个时候失败者不再为下游转发任何组播流量。同时会启动一个定时器这个时间是180秒也就是说失败设备180秒之后会重新参加选举比较Assert报文里面的参数重新成为获胜者这个180秒参加选举重新比较其实有点类似于去判断获胜者设备它是否产生故障是否需要切换。剪枝机制首先组播数据源第一次扩散组播数据流量到达RT2和RT3,现在通过断言机制RT3获胜向下游转发组播数据流量到达RT4,这个时候RT4又将组播数据流量进行进一步扩散发送给RT5,这个时候问题来了RT5的下游并没有任何关于该组的成员也就是说它不需要接收任何该组的组播流量这个组播流量达本设备之后实际上是浪费的反而增加了设备之间的链路带宽和负荷因此它就会产生一个剪枝机制来避免这样的一个资源的浪费。R5会触发剪枝机制向上游发送Prune报文希望上游不要再将该组的组播流量发送给我同时自己组播路由器对应的出接口变成了空接口但是该组播路由表依然会保留是为了后续如果有新成员要加入而上游设备收到这样的一个剪枝报文之后它会将对应的出接口IF3,从组播路由表里面删除保证组播数据不再下发给RT5。完成一个剪枝的过程。这样就避免了RT4和RT5之间浪费不必要的带宽去发送组播数据流量。同时也避免了设备RT5去处理下游没有任何成员的组播流量。当通过一系列的机制之后组播分发树其实就已经确定完成了这个时候组播流量就会沿着源端按照组播分发树发送给接收者成员正常情况下组播分发树形成之后不会发生任何改变但是如何去维护这个组播分发树呢第一个持续发送组播报文组播里面的(S,G)表项是一直需要通过接收到的组播流量报文进行维护的否则就会进行老化删除所以为了保证组播路由表项一直存在需要一直有组播报文的存在才能进行维护。第二个发送状态刷新报文来维护下行接口不发生任何改变。实际上相关的接口剪枝完成之后其实它会启动一个定时器也就是RT4的IF3接口这的定时器是210秒也就是说剪枝的接口210秒之后会重新恢复给下游发送该组的组播数据流量。如果下游没有任何成员重新再进行剪枝。但是这样会有一个问题如果210秒之后下游依然没有任何接收成员要重新进行流量的扩散发送给下游设备再重新进行一个剪枝的这样的流程实际上是没有必要的如果去维护这个剪枝状态呢那就是状态刷新报文。状态刷新机制当RT4将IF3进行剪枝之后它就会启动一个定时器这个定时器从210秒之后重新恢复给下游设备发送组播数据流但是下游持续没有任何组成员想要接收应该保持着该状态成为剪枝状态而依然不恢复否则就要重新建立一个剪枝状态这个时候就会用到刷新机制里面的刷新报文由组播源的第一跳路由器周期性的每60秒发送一次进行全网扩散当接收的路由器收到状态刷新报文之后会将该接口的定时器重新计时避免恢复为下游设备转发组播流量。这就是状态刷新报文的好处能够使剪枝的端口一直处于抑制转发状态但是呢大家是否又可能会产生一个新的问题如果下游设备没有任何组播成员需要长时间给它维持在一个抑制的状态不转发任何组播数据流量。但是如果下游有成员想要加入该组接收组播流量该怎么办通过状态刷新这样的一个机制是否这样的一个剪枝端口就一直处于抑制状态无法去恢复它的转发状态这个时候就要利用到它前面的一个机制扩散机制。组播数据流每隔180秒从源端开始扩散也就是说180秒之后可以通过该端口将流量扩散下去给这样的一个组播成员重新建立一棵组播分发树但是这样的周期是不是又太长了有没有更好的办法既能够避免这样周期太长的更新又能够在如果下面没有组播成员的情况下抑制该端口。新成员加组当有新成员加入到组播组之后分发树就要进行更新如何进行更新呢正常情况下有两种办法第一种办法是通过组播路由表超时进行全网周期性扩散泛洪来进行更新但是这种方法一般是无法控制的所以在现网中一般也不会推荐大家去使用这种通过依赖于定时器的办法进行更新所以就衍生出了一个新的机制叫做嫁接机制。嫁接机制当有一个新的成员要加入到组1后这个时候成员主机发送IGMP成员报告报文给上游设备RT5,这个时候RT5它应该立马就知道想要接收该给的组播数据流量但是这里就有个问题RT5的上游RT4,该端口一直处于一个抑制状态无法发送组播流量如果需要等待周期性的扩散这样的时间间隔又过于长久为了避免这种情况就支动向上游发送一个嫁接报文告诉上游设备RT4现在我的下游有新成员想要接收该组的组播流量你可以将该组播流量发送给我了当上游设备RT5接收到嫁接报文之后它的出接口立马将移除的端口重新添加到出接口中将该组播流量发送给RT5,也就是说将它的端口状态重新恢复到发送组播数据流量的初始状态从而进行了一个组播分发树的更新从这里能够看出什么呢在Dense Mode中状态刷新报文是针对假想下游没有任何组播接收成员进行发送使端口一直处于一个抑制状态而如果有下游有想要加入的组播成员是通过嫁接机制主动反向去重新桥接分发树来进行一个分发树的更新也就是说这两个机制是针对不同的应用场景下去使用的。这两个机制结合在一起就完善组成了Dense Mode中非常重要的组播分发树维持和更新的两个概念。PIM-SM介绍PIM-SM(ASM)工作原理PIM-DM的局限性在网络规模比较大的时候Dense Mode有很多问题因此现网中大部分使用的是 Sparse Mode。在整个网络中如果网络规模非常大通过扩散剪枝的方式全网去扩散组播报文而且是周期性的每隔180秒扩散一次对于网络具有一定的冲击力这种冲击力就类似于设备的处理还有链路的带宽影响是比较大的第二个是某些组播路由器它下面并没有相关的成员但是它依然需要维护关于PIM的组播路由表项同时还需要发送相关的剪枝报文去维护定时器因此就完全浪费了设备的性能对于它而言是没有任何意义的最后一个是在一个成员比较稀疏的网络里面如果还是采用Dense Mode假设在网络里面只有两个用户剩下没有任何组播组的成员那么通过扩散剪枝的方式对整个网络而言是非常大的而且效率也不是很高每一台组播路由器既要维护组播路由表项还要维护相关的定时器同时对于它而言也没有任何相关的组播组成员所以效率显得非常低下。面对这些种种问题一般使用Sparse Mode。PIM-SM(ASM)介绍基本组播数据源Sparse Mode又分为两种类型是任意源还是指定源。使用扩散剪枝的主要原因在Dense Mode中是因为它没有办法去确定用户在哪里所以综的工作的核心思想是假设每个组播路由器下面都有所谓的潜在用户因此它才会扩散组播流量而Sparse Mode和Dense Mode最大区别是它事先告诉了某一台组播路由器也就是汇聚点RP让它知道用户在哪里再去构建组播分发树这样就避免了对整个网络的影响并不是所有的路由器都需要去运行组播路由协议维护相关的组播路由表项。Sparse Mode构建树的一个核心思想第一个有一个非常重要的点叫汇聚点RP这个汇聚点RP它类似于一个中心点一样所有组成员的位置首先要告诉这个组播路由器然后组播源在发送数据流量的时候也会将组播流量首先转发给RP因为RP知道哪些成员在哪里它再通过将组播数据转发给相应的成员避免了带宽的浪费同时面对一些部分的次优路径它还能进行一个自我的优化。PIM-SM(ASM)协议报文Sparse Mode和Dense Mode是有些区别的但是它发送的目的地址和IP协议号都是一样的。RP介绍汇聚点RP它就相当于是一个通上达下的中心核心设备因为它连接着组播源又要知道接收者用户所以在整个PIM的路由器中必须知道谁是RP。在配置RP的过程中有两种办法第一种手工在所有PIM路由器上去静态告诉RP的地址是谁应该怎么去把数据流发给RP但是这种明显比较适用于小型网络。第二路是动态RP选举通过相关机制去选举汇聚点比较适用于大中型网络在这里需要提一个重要的一点是一个组播组只能有一个RP但是一个RP可以有多个组播组提供服务。也就是说不同的组播组可以有不同的RP,它们可以去选择为哪些组播组提供服务在选举RP过程中可能会涉及很多参数。动态选举RP在选举RP的时候主要会涉及两个角色一个是C-BSR一个是C-RP。首先在C-BSR里面会选举一个Bootstrap Router也就是BSR这个BSR的角色类似于一个公平的裁判一样在所有的裁判路由器里面选取一个最公平的裁判路由中器它是用来收集C-RP信息然后在C-RP里面去选举一个RP然后裁判BSR将选取完成的RP信息通过PIM报文的形式扩散给所有运行PIM协议的路由器让它们得知谁是RP。从图中的案例可以了解一下比如说相关的组播路由器配置了C-BSR和C-RP,首先每台C-BSR运行之后都认为自己是BSR然后它们互相交互报文通过里面的参数去比较谁是BSR从图中可以看出左边的为BSRBSR选举完成之后由它来收集整个组播网络中C-RP这样的一个信息然后通过相关的参数比较比如说C-RP所支持的服务掩码长度以及优选级通过这些参数的比较选举出来哪一台设备作为RP最后它会通过PIM报文将谁是RP这样的一个信息在全网进行泛红告诉这些路由器谁是RP这样就通过动态的机制选举出来最合适的RP而且也不需要管理员手工静态在每一台设备上进行配置。首次形成组播分发树选举完RP之后正式开始构建分发树其中在Sparse Mode任意源模型中分发树有两个首先以RP汇聚点为根构建的共享树RPT第二个是以源为根到RP构建的SPT其中在整个构建树的过程中可能也会遇到多路访问网络为了避免重复的报文它和Dense Mode一样也类似于一个DR的这样的一个选举来避免这样的一个重复的组报文转发给下游设备。这个树主要有两部分组成首先是由成员端DR向汇聚点RP构建一棵RPT然后再由RP到达源端去组成一个STP然后数据流首先会沿着STP到达汇聚点然后再由汇聚点给最后一跳路由器然后再转发给组播组成员因此它这棵树是由两部分组成的。RPT构建第一个以RP为根就开始建立这样一颗RPT。当组播组成员想要加入到组之后就会发送IGMP的成员报告报文会给成员端DR上图中会有两个DR一个是源端DR一个是成员端DR无论是源端DR还是成员端DR它的作用都是一样的为了避免重复报文只不过一个是在源端一个在成员端网络里面。当成员端收到了IGMP成员报告报文之后开始向RP去发送一个基于RP消息的Join报文这个报文是沿着RP沿途发送的中间所有经历的组播路由器在向RP发送Join报文消息的时候都会建立一个(*,G)表项为什么是(*,G)表项因为只知道汇聚点是谁而现在针对的是ASM不知道源端只知道汇聚点RP所以创建的是(*,G)表项沿着成员端DR到汇聚点RP沿途发送Join报文就构建了第一棵RPT是以RP为根构建的而成的共享树。组播源注册机制-形成SPT成员端到源端DR这是如何建立组播分发数SPT。首先组播源将组播报文发送给源端DR之后源端DR会将报文封装在Register报文中然后以单播的形式发送给汇聚点RP这一点非常重要。也就是说组播报文封装在Register报文中同时是以单播的形式发送给汇聚点而汇聚点收到这样的一个报文之后会向源端DR反向发送Join报文建立SPT。为什么需要组播源注册机制因为现在所服务的是任意源这样的一个流量模型因此在第一次发送组播报文之前并不知道谁是源端所以只有源端在汇聚点注册之后才能建立(S,G)表项如果它没有注册没有办法直接从自己然后到源端DR发送Join报文构建(S,G)表项。当源端将组播报文封装在Register报文中以单播的形式发给汇聚点RP之后其实这棵SPT已经构建完成了但是还需要做一些后续的操作因为源端虽然已经构成了从DR到RP的SPT但是源端的DR依然会将组播报文封装在Register报文中发送给RP这个时候会造成什么问题。第一个源端最初发送的是单播报文会增加DR和RP的工作量为什么呢因为RP要将单播报文解封装之后拿出组播报文再沿着汇聚点RPT这棵树发送给组播组成员。源端DR收到组播报文需要封装。因此这个组播数据流量要先封装成单播再到RP点解封装成组播再发送针对这两个设备而言工作量就比较大。组播源注册机制-转发组播数据一旦形成SPT之后源端DR既发送单播又发送组播报文这两种流量里面就重复了包含了它想要发送的组播数据。因此SPT一旦建立之后汇聚点RP立即会发送Register-Stop报文给源端DR告诉它后续的报文可以直接以组播的形式沿着所建立的SPT发给汇聚点RP而不需要重新封装成单播再发送给DR同时也会沿途通过STP建立(S,G)表项这个就是组播源的注册机制。这两棵树合在一起为它的整个组播转发流量。首先成员端DR发送Join消息构建(*,G)表项建立起一棵RPT然后通过组播源注册报文之后会建立起一棵SPT这里需要注意的是第一次发送的组播报文是以单播的形式沿着SPT到达汇聚点RPRP解封装之后立马会将这个组播报文沿着RPT首先发给用户。然后RP向源端DR发送Rigister-Stop报文让它下次的流量是以组播的形式发送给RP这样后续的所有的组播流量就会沿着所构建的SPT加RPT这棵树发送流量给接收组成员这就是它整个转发过程。其中一定需要理解的是组播源的注册机制。源/末端网络中的重复组播报文在源端或者末端都可能接收到重复报文那是因为可能会存在着一个多路访问网络面对这个问题就要选举一个类似于DR的角色。所谓DR的角色就是避免重复报文的出现减轻链路的带宽负荷和设备的处理负荷。PIM DR选举PIM DR的选举只要是通过Hello报文里面的优选级和IP地址去比较然后选举DR当DR出现故障之后会进行重新选举。RTP次优路径问题之前在汇聚点RP提到了一个概念就是一个组播组只能对应一个RP但是一个RP可以对应多个组播组在特殊场景下会发现所有的组播流量都会经过RP由RP再进行转发这个时候就会产生一系列问题。现在假设有两个组播源数据分别是S1和S2,它们都对应同一个汇聚点RP那么第一个问题所有的数据流量都会经过汇聚点RP那么对于RP就会形成一个巨大的负担。第二个比较重要的问题是有可能产生次优路径问题假设组播组成员想要接收G1组的数据下面一个组播组成员想要接收的是S2的消息所有的流量都会经过RP。但是针对组播流量(S1,G1)而言从上面转发而言并不是最优路径转发流量从RT2到RT4再到RT5直接转发给这台PC是最优路径。因此面对这种情况就产生了一个次优路径的问题。为了解决次优路径的问题在Sparse Mode中又衍生出了一个新的机制就是STP切换机制。SPT切换机制当数据到达汇聚点RP之后RP会沿着RPT将数据发送给成员端DR这个时候成员端DR接收到组播流量之后它就知道了组播源是谁立马根据组播数据中的源IP反向建立从自己到达源的一棵SPT去判断汇聚点是否在这棵最短的STP上面用于是否要进行一个STP的切换。成员端DR接收到组播报文之后由它触发SPT切换通过自己向源端发送Join消息形成一棵最短的SPT树然后它中间会经历相关的端口检查这个端口就是通过RPF的检查端口去判断是否是最优路径然后沿着最优路径向源端发送Join消息形成了一棵SPT去判断汇聚点是否在这棵最短SPT上如果不在的话针对次优路径它会主动触发Prune报文进行一个剪树状态然后再由成员端DR去维护相应的端口状态保持数据流量从最优路径转发数据报文而避免了非要经过汇聚点RP产生次优路径。其实从这个切换机制不难看出说白了简单概括一点就是当成员端DR收到了组播报文通过里面的源IP它要判断一下现在接收的组播流量是否是从源到自己本身的DR最优路径因此它会类似于去怀疑一下这个RP是否在最优路径上面所以它为什么会需要去反向建立一棵SPT。维护组播分发树当切换之后最优的SPT稳定之后成员端也会周期性的发送相关的Join报文和Prune报文去维护相关的端口来保持这棵最优路径一直为用户持续转发组播数据流量除非210秒内没有任何组播流量相关的路由表项就会消失PIM-SM(SSM)工作原理SSM概念回顾用户组成员在加入组消息中不仅表明了自己想要加入的组播组还指定了自己想要接收针对哪些源发送的组播组消息这样就使生成的表项中不仅有组播组的信息还有组播源的信息比如说这台组播组成员在发送IGMP成员关系报告报文中指定了想要接收来自于源1的组播消息虽然组播源1和组播源2都能提供相同的服务但是只有关于组播源1的流量才能给我这台设备提供服务。PIM-SM(SSM)基本概述如果在PIM的Sparse Mode中基于指定源的流量模型中去构建SPT指导流量数据转发就非常简单了因为指定了源是谁所以不需要维护RP也不需要构建RPT也不需要注册组播源所以它的机制构成就非常简单只有邻居发现DR竞选和构建SPT其中邻居发现和DR竞选和前面的工作机制是相同的只需要反向建立SPT转发数据流量就可以了。组播分发树形成与维护在构建组播分发树基于SSM的流量模型中它主要是依赖于IGMPv3的报文和Join消息因为只有IGMPv3的成员关系报告报文中才携带了指定源。首先由组播组成员发送IGMPv3关系报告报文表明自己想要加入哪个组同时包含了指定源到达成员端DR之后成员端DR根据成员关系报告报文中的组播源发送Join报文沿途所经过的设备都会向源端发送Join报文同时形成一棵组播分发树SPT构建(S,G)表项然后再相应的这样的一个端口通过周期性的发送Join报文来维护组播分发树但是在ASM的模型中不同的是基于SSM的构建的分发树会一直存在不会因为没有组播流量而消失因为自己会通过周期性的发送Join报文去维护这棵生成树这个是最大的区别而不像前面几种类型都是要组播流量经过设备通过接收组播流量来去维护自己的这样一个分发树至此就构建完成了组播分发树组播源就沿着SPT直接从源端DR到成员端DR,同时这是一棵最优的路径帮助去实现组播流量的转发。因此会发现基于SSM的Sparse Mode非常简单。PIM模型比较本章协议PIM协议主要是应用在单域内帮助实现在组播转发网络中从第一跳路由器转发组播流量沿着构建的分发树给最后一跳路由器其中主要分为Dense Mode和Sparse Mode这两种类型现网中使用的最多的是Sparse Mode其中Sparse Mode根据流量又分为两大类其中比较复杂的是基于ASM的流量模型它里面有很多源端注册机制反向SPT切换机制。反观基于SSM的工作模型就非常简单因为它不需要维护RP,它直接从成员端向源端构建一棵SPT指导数据流量转发。PIM的基本配置PIM-DM的基本配置PIM-DM的基础实验PIM-SM的基本配置PIM-SM基础实验