23.8.1 PIM-SM简介
PIM SM是显示加入模式,接收者向RP(会聚点)发送PIM加入消息通告其加入组播的行为,发送  者
也要发送注册消息到RP进行注册。RP是共享树的根,由源发出的数据先送至RP,再由RP沿共享树传递
到每个接收者所在的网络。
经过RP的转发可能不是最佳路径,这时最后一跳 路由器可以修正经RP沿共享树的转发为沿基于源
的SPT(Shortest Path Tree)的转发。在共享树中,RPF检验使用RP的地址;在SPT中,RPF检验使用多播源
地址。
通常一个多播网络中只使用一个RP,但是我们可以借助访问列表基于组地址范围将多播信息转
发路径的管理分派给多个RP,它们
可以位于网络中的不同位置,这有
利于优化数据流的转发,  一个多播
组只需要一个RP。RP可以静态配置,
也可以动态学习(通过Auto-RP或PIM
v2 BSR)。  数据包在转发时,省先在
多播路由表里查找匹配的(S, G)条目,
如果找不到,则按照(*,G)条目指定
路径转发。
源树及共享树的形成
 
 
上图中显示的是Receiver向RP注册以及共享树形成的过程,所有途经 路由器中产生相应的(*,G)
条目。
 
而多播源向RP的注册过程要稍稍复杂一点,这一点从图中不同类型的消息流的数量上就能看得出。 
下面我来解释一下整个过程:
当关于组G的活动源向首跳 路由器发送第一个多播包时,首跳 路由器就知道它应该向RP注册  这个
源并且请求RP构建一条由RP返回首跳 路由器的源树。
首跳 路由器把该多播消息封装成注册消息,以单播形式发往RP。
RP收到这一注册消息后,解除注册消息的封装后将它沿共享树向下传递。
同时发送一个(S,G)加入消息到源S以创建一条(S,G)SPT,也就是说,在SPT途经的所  有 路由器(包
括RP)中创建(S,G)转发条目。
当SPT形成后,发自源S的多播数据流将沿SPT从源S直接传到RP。
RP一旦接到从源S发出的沿SPT传来的多播包,则向首跳 路由器发送注册停止消息,然后首跳  路
由器停止向RP发送注册消息。
最后,多播数据包可沿从源到RP的SPT传至RP,再沿共享树从RP传至接收者。
 
 
上图是最后形成的转发树,但是就本图而言,这个转发路径并不理想,事实上有一条不经RP的
  更短的路径可以用来传递这一多播数据流。对这一次佳路径的修正是通过SPT Switchover的过  程
来实现的。
 
23.8.2 STP Switchover
上图中显示的转发树是由从源到RP的源树和从RP到接收者的共享树构成,尽管这两条路径本身
都是最短的,但是合在一起后的结果并不理想,最靠近接收者的末跳 路由器可以对这条次佳路径
加以修正:
1.  末跳 路由器根据SPT-Threshold的值决定何时对转发路径加以修正,缺省的情况下这个阈值
等于0,表示第一个包沿共享树到达后马上对转发路径加以修正。
2.  末跳 路由器向源发送(S,G)加入消息来重新构建一条旁路RP的SPT。
3.  最后,末跳 路由器沿共享树向RP发送(S, G)修剪消息,阻止RP经共享树向末跳 路由器转发  属
于(S,G)源组的多播数据。(这个修剪在RP上生效之前,接收者可能会收到重复数据)
4.  如果RP在它的所有属于共享树的接口上都收到了(S,G)修剪消息,那么它也会向源发送(S, 
G)修剪消息。
5.  通过这种方式,PIM SM以更经济的方式建立了从源到接收者的(S,G)SPT。
 
下图是最后形成的从源直接到接收者的SPT。
 
23.8.3 PIM邻居发现
PIM通过周期性的Hello消息发现并维持邻居关系,多路访问网络中, 路由器向224.0.0.13(All-PIM-
Router)发送Hello消息。并进行DR(Designated Router)的选举(有最高IP地址的胜出)。
DR在PIM  SM中用于为多路访问网络中的接收者向RP发送Join消息,以及为多路访问网络中的多
播源发送注册消息,在密模式中DR无意义,当然了,如果用的是IGMP版本1,则DR做为IGMP  Querier
代表所有 路由器向多路访问网络内的接收者发送定期的查询。
 
 
23.8.4 PIM状态
每台 路由器对当前多播信息的转发都有自己的理解,但这里指的PIM状态指整个网络内的信息转
发情况。
PIM状态主要通过多播路由表体现,其中包含(*,G)和(S,G)条目,(S,G)条目较(*,G)  有更高的
优先权,所有条目中都包含Incoming  interface、Upstream  neighbor和Outgoing  interface  list。Incoming
interface是通过RPF检验的接口,且只有从Incoming interface  收到的多播数据才会被转发到OIL。
下图是一个多播路由表的示例,下面我们来解释这张表的维护过程:
 
 
 
23.8.5 PIM路由维持
(*,G)是基于共享树的转发条目,只有当没有(S,G)匹配时才采用。当一台 路由器收到(*,  G)加
入消息或来自属于组播组G的成员的IGMP报告时,创建(*,G)条目,如果有(S,G)条  目产生,则相应
的(*, G)条目也会出现。 (*, G)中的Incoming interface为该 路由器指向RP的接口(根据RPF), OIL为收到(*,
G)加入消息的接口、直接连接有接收者的接口或手工设置的静态转发接口。(命令:ip igmp static-group
<group>)当OIL=NULL或没有子(S, G)条目时(*, G)条目将被删除。 (S, G)是指定源的具体条目,相对于(*,
G)条目有更高的优先权。  当收到(S,G)加入消息或PIM SM中首跳 路由器发向RP的注册消息时,(S,G)
条目被创建。如果相应的(*,G)条目不存在,则它必须被创建。(S,G)条目中的Incoming  interface和
Upstream neighbor由RPF决定。OIL复制于(*,G)条  目,但是不包含Incoming interface.
来看看OIL的管理:  收到(S,G)或(*,G)加入消息时将收到该消息的接口加入相应条目的OIL,(*,
G)的OIL。如果变化,则(S,G)的OIL无条件跟随一起变化。收到(S,G)或(*,G)修剪消息时将收到该消
息的接口从相应条目的OIL中删除,(*,G)的  OIL如果变化,则(S,G)的OIL无条件跟随一起变化。此外,
OIL中的接口过期时限为3分钟,  如果3分钟没有收到下游 路由器的加入消息或来自直接相连成员的
IGMP报告的话,也将会被删除。
当(*,G)条目的OIL由空转为非空时发送(*,G)加入消息,当(*,G)条目的OIL由非空转为空时发送
(*,G)修剪消息。
当(S,G)条目的OIL由空转为非空时发送(*,G)加入消息,当(S,G)条目的OIL由非空转为空且从
Incoming interface收到相关数据包时发送(*,G)修剪消息。
当(S,G)的RPF信息与(*,G)的RPF信息不一致时(表明SPT和共享树在此处分离)发送(S,  G)RP-bit
修剪消息。
 
23.8.6 PIM状态标志
S      表示Sparse Mode,仅见于(*,G)条目。
C      表示有组成员与 路由器直接相连。
L    表示 路由器自身是该多播组成员。(当使用Auto-RP时,所有 路由器自动加入224.0.1.40)
P    表示OIL为空,该 路由器正向上游 路由器发送修剪消息。
T    表示至少有一个数据包已经通过SPT送达。
J    在(*, G)中表示收到下一个包后转发路径将由共享树切换到SPT,在(S, G)中表示该条目是SPT
Threshold超过后被创建的。
F    在(S,G)中表示该 路由器与源直接相连(首跳 路由器),它也出现在多播边界 路由器上,
        (*,G)条目会随(S,G)条目上的F标志的出现而出现。
R    表示RP-bit,在修正经RP沿共享树的转发为SPT的过程中用于修剪(S, G)经共享树的转发,   关
于这点我们后面还会详细讲述。
X    只见于(S,G)条目,当代理加入计数器运行时使用,一般用于SPT与共享树合并时,
 
23.8.7    PIM-SM  加入
第一步,接收者A向224.0.0.2(All-Routers)发出IGMP  Join消息请求接收多播组G的数据。(见下图第
一步)
 
 
第二步,末跳 路由器收到该请求消息后,首先查看(*,G)条目是否已经存在,如果已经存在,  则
只需将收到该请求的接口加入OIL,如果不存在,则先创建(*,G)转发条目,并向指向RP  路径上的上
路由器发送(*,G)加入消息。(见下图第二步)
 
 
类似的过程在到达RP途经的 路由器上依次重复,直到RP或一台已经属于共享树的 路由器为止,   最
后生成一条从RP到末跳 路由器的共享树。(见下图三四步)
 
23.8.8 PIM稀疏模式注册过程
首先,多播源向组G发送多播消息,首跳 路由器收到该组播数据后将其封装在单播形式的注册消
息包内发向RP,并在多播路由表内创建(S,G)和(*,G)条目。RP收到该注册消息后,解出  内部的多播
数据包沿共享树传递给接收者。(见下图中一、二、三步)
 
 
 
这种情况下,RP不向上游 路由器发送(S,G)加入请求构建源树,而是直接向首跳 路由器发送  注册
停止消息,见下图。
 
首跳 路由器的注册消息将被抑制,多播转发表中(S,G)和(*,G)的OIL均为空,三分钟之后,该条
.目超时消失,一个重新注册的过程再次开始。见下图。
 
 
只要多播源不停止发送数据,这个注册和抑制的过程就会继续下去,并且导致RP中的(S, G)  和(*,
G)条目始终存在,尽管它们的OIL为空,如果有接收者出现,RP将主动向SPT所经上游  路由器主动发送
(S,G)加入消息。见下图。
 
什么情况都可能存在,如果一个接收者出现在源树上会怎么样呢?如下图,源树和共享树都已经
建立并正常转发多播数据,此时,一个接收者向属于源树的一台 路由器发出了加入请求。
 
23.8.9 PIM稀疏模式SPT切换  
经由RP的转发路径通常不是从源到接收者的最佳路径,SPT翻转可以将经由源树和共享树的路径
修正为从源直接到接收者的SPT,这样做的优点是可以减少多播数据转发延时,缺点是在多播路
由器中产生较多的(S,G)转发条目。下面我们来介绍整个过程。 经共享树到达的多播流量超过SPT-Threshold(阈值)时,末跳 路由器将会沿到达源的路径向上游路
由器发送(*,G)加入消息以构建从源直接到接收者的SPT,这个消息一路传递一直到源。
 
 
23.8.10 PIM稀疏模式裁剪
下面我们将介绍哪些情况下 路由器将向上游 路由器发送修剪消息。  第一种情况,当叶子 路由器
接收到来自最后一个接收者的IGMP离开消息时,它会将相应接口从(*,G)和(S,G)中删除[注意:下图
中只有(*,G)条目],如果删除后OIL为空,它会向上游 路由器发送修剪消息。
 
 
缺省情况下,加入/修剪状态信息三分钟后会过期,所以 路由器必须周期性的向所有邻居 路由器
发送加入/修剪消息。周期性的加入消息将会刷新多播转发条目的OIL中的相应接口的超时计数器,如
果该计数器为0,  则接口从OIL中删除,如果OIL为NULL,将发送修剪消息到上游 路由器。周期性的修
剪消息将会导致 路由器从OIL中删除掉收到消息的接口,   或沿共享树向RP发送(S,G)RP-bit修剪消息。多播数据包的接收将复位(S,G)超时计数器,(S,G)条目超时值为0则该条目被删除(例如  源停止发送
数据时)。
 
23.8.11 PIM稀疏模式回顾
类似前面讲过的密模式,在本单元的最后我们通地一个例子来总结一下稀疏模式的工作原理。  
下图是本例的网络结构。
 
 
 
 
 
23.8.12 PIM-SM RP查找过程
共享树根植于多播网络中的一台 路由器,而并非源,  在PIM-SM中称其为会聚点(Rendezvous
Point,RP).  寻找RP地址有3种方法:
1.  RP地址可以静态的配置与每一台 路由器
2. 用开放标准的BootStrap协议来指定和通告RP
3. 以Cisco私有的Auto-RP来指定和宣告RP
 
1.BootStrap协议
Cisco使用BootStrap协议和Auto-RP的方式来选定RP。首先一组 路由器被配置成C-BSR和
C-RP。C-BSR(Candidate BooStrap Router)同C-RP(candidate RP)通过IP地址识别自己。这个地址
一般为loopback接口地址。
第一步是从C-BSR中选举出BSR。每个C-BSR都可以分配一个0~255的优先级和一个BSR IP
地址。优先级默认为0。当配置成C-BSR时,设置BootStrap  Timer    130s。并同时开始监听
BootStrap消息。
BootStrap消息宣告了消息发起者的优先级和它的BSR  IP地址。当一个CBSR收到一个
BootStrap消息后,比较发起 路由器的优先级,如果对方优先级更高,则reset自己的计时器,
继续监听,  如果自己有较高的优先级,则宣告自己为BSR,并开始每60s发送一次BootStrap
消息,如果优先级相同,比较IP地址。
BSR不是唯一的。至少需要一个,但允许多个做备份
BootStrap消息采用了224.0.0.13  的组播方式,TTL为1。确保每个PIM 路由器都能收到。
消息中包含所有  Group-to-RP  信息和  BSR  的地址。这个消息会被所有的 路由器向前传递(通
过  RPF  检验的消息发向除接收端口外的其它端口,TTL=1)。
BSR选举完成后, BSR会对所有的C-RP加以整理,列出它们的优先级和组。编成“RP集”。
通过BootStrap消息向整个多播域宣告RP集。
当一个 路由器收到一个IGMP加入报文,则 路由器根据RP集查找RP,查找规则如下:
1. 如果只有一个RP,则选定
2. 如果有多个,选优先级最低的
3. 如果有多个,且优先级均相同,运行一个Hash函数,取函数最大值
Hash函数如下:
Hash G,M, C
=  1103515245 ∗   1103515245 ∗  G&M  + 12345 Xor  C
+ 12345 mod 231
G=组地址前缀
M=hash掩码
C=C-CP地址
 
2.Auto-RP协议
所有 路由器自动学习与特定组相关的  RP  地址,除了  Candidate  RPs(RP  候选者)和
MappingAgents(映射代理)外的 路由器不需要为  RP  做任何设置。通过专用的两个多播地址
224.0.1.39(Cisco-Announce)和  224.0.1.40(Cisco-Discovery)以PIM  DM(否则存在  Chicken  and
Egg  问题)方式传递  RP  相关信息。可以存在多个  RP  以作备份,可以通过管理范围对消息
的传递加以限制,BSR  不个备这一功能,这一功能对减少多播信息对广域网带宽的占用非
常有效。
 
Mapping Agents
用于接收发自  Candidate    RPs  的声明,自动加入  224.0.0.39  这个多播组。所有
声明存储在缓存中,[注意:所有  MA  的缓存内容必须一致。]为每个特定组范围选
举具有最高  IP  地址的候选者作为  RP。向  224.0.1.40  地址发送  Cisco-Discovery  消
息,每  60  秒或检测到变化时发送。消息中包含从  多个候选者中选出的  RP。
通常一个网络中应该至少设置两个  C-RP  和  MA,一台 路由器可以同时担当这两
种角色。Intfc最好使用回环接口来定义。需要支持多播的每台 路由器的每个接口下都应该配置成疏密模式,因为   Auto-RP    采用密模式  PIM  工作,其它多播数据采
用稀疏模式工作。
Candidate RPs  
RP  候选者以固定周期向  224.0.1.39  组播地址发送  RP-Announcement  消息,这
个消息用来说明该 路由器是一个  RP  候选者Group-list  中的  Deny  在不同的  IOS  版
本中意义不同,12.0(1.1)以前的版本中表示当前路  由器不是相应组范围的候选  RP,
12.0(1.1)以后版本中表示该组范围永远采用密模式。