5.8 PIM-SM 操作
通过前面的学习,已经知道了为什么共享树在稀疏分布的多播互联网络中的扩展性较好,也知道了为什么共享树可以应用于密集分布的多播互联网络。前面的讨论可能会给读者留下一个印象,那就是共享多播树总是优于有源树,但事实并非如此。
图5-54给出了一种有源树可能会优于共享树的应用场景。在图中所示的拓扑结构中,多播源与目的地之间的距离比各自到核心路由器(是共享树中的根部)的距离要近得多,因而直接在多播源和目的地之间建立有源树更好(如果可以降低相关开销的话)。
与CBT不同,PIM-SM同时支持共享树和有源树,这也是当前大多数现代互联网络广泛使用该协议的一个主要原因。有关PIM-SM的描述请参见RFC 236213。
图5-54 某些互联网络中的有源树可能会优于共享树
5.8.1 PIM-SM 基础
PIM-SM使用以下7种PIMv2消息。
• Hello;
• Bootstrap(引导);
• Candidate-RP-Advertisement(候选RP宣告);
• Join/Prune(加入/剪除);
• Assert(声明);
• Register(注册);
• Register-Stop(注册终止)。
其中的Hello、Join/Prune和Assert 3条消息在PIM-DM中也有,其余4条则是PIM-SM的特有消息(就像Graft和Graft-Ack是PIM-DM的特有消息一样)。
PIM-SM与PIM-DM有以下共同功能。
• 通过交换Hello消息来发现邻居;
• 单播路由表发生变化后需要重新计算RPF接口;
• 在多路接入网络中选举一台指派路由器;
• 在多路接入网络中使用剪除覆盖机制;
• 在多路接入网络中利用Assert消息来选举一台指派转发路由器。
上述功能都已在PIM-DM中介绍过了,本小节不再赘述。
与PIM-DM不同,PIM-SM采用的是显式加入机制,从而使得共享多播树和有源多播树的创建更加有效。
5.8.2 发现 RP
如前所述,共享树的根部是互联网络中的某台路由器,而不是多播源,CBT将该路由器称为核心路由器(core),而PIM-SM则将该路由器称为RP(Rendezvous Point,聚合点)。在建立共享树之前,加入的路由器必须知道如何发现RP。路由器可以通过以下3种方式来获知 RP的地址。
• 可以在所有路由器上静态配置RP的地址;
• 可以利用开放的标准Bootstrap(引导)协议来指定和宣告RP;
• 可以利用Cisco专有的Auto-RP协议来指定和宣告RP。
有关上述方法的使用方法将在第6章进行详细介绍。
对静态路由来说,在所有路由器上静态配置RP地址的好处是可以非常精确地控制互联网络,但代价是要付出较高的管理开销。静态RP配置方式一般仅适用于小型多播互联网络。
1.Bootstrap协议
Cisco IOS Software从Release 11.3T开始支持Bootstrap协议,该协议与CBT用来宣告核心路由器的协议相同,只是在消息名称和消息格式上有所区别。要想运行Bootstrap协议,就必须在互联网络中指派C-BSR(Candidate BootStrap Router,候选引导路由器)和C-RP(Candidate Rendezvous Point,候选聚合点)。通常情况下,一般将同一组路由器同时配置为 C-BSR和C-RP,通过IP地址(通常配置为环回接口的地址)来区分C-BSR和C-RP。
首先要从C-BSR中选出BSR(BootStrap Router,引导路由器),每台C-BSR都被指定了一个0~255之间的优先级(默认为0)和一个BSRIP地址。当路由器被配置为C-BSR后,会启动一个130秒的引导定时器并侦听Bootstrap消息。
Bootstrap消息的作用是宣告发信路由器的优先级和BSR IP地址。当C-BSR收到Bootstrap消息后,会将自己的优先级与发信路由器的优先级进行对比,如果发信路由器的优先级较高,则接收路由器会重置自己的引导定时器并继续侦听;如果接收路由器的优先级较高,则将自己宣称为BSR并开始每隔60秒发送一条Bootstrap消息;如果两者的优先级相等,则BSR IP地址较高的路由器成为BSR。
当C-BSR的130秒引导定时器到期时,该路由器将认定网络中无BSR,则将自己宣称为BSR,并开始每隔60秒发送一条Bootstrap消息。
Bootstrap消息使用ALL PIM Routers(全部PIM路由器)地址224.0.0.13,且TTL为1。当PIM路由器接收到一条Bootstrap消息后,会通过所有接口(接收到该消息的接口除外)向外发送该消息的拷贝。该处理过程不仅可以保证将Bootstrap消息泛洪到整个多播源,还可以确保每台PIM路由器都能接收到一份消息拷贝并知道哪台路由器是BSR。
每台C-RP都会被分配一个RP IP地址和一个0~255之间的优先级,可以将路由器配置为某些特定多播组的C-RP,也可以配置为所有多播组的C-RP,当通过接收到的Bootstrap消息知道了BSR之后,C-RP就开始向BSR单播发送Candidate-RP-Advertisement(候选RP宣告)消息,这些消息中包含了发信路由器的RP地址、组地址(发信路由器是该组的候选RP)及其优先级。
BSR将所有C-RP的优先级及相关的多播组都编译成RP-Set,并通过Bootstrap消息在整个 PIM域中宣告该RP-Set。此外,Bootstrap消息中还包括一个8bit哈希掩码(hash-mask)。由于 Bootstrap消息使用的是地址224.0.0.13,因而所有的PIM路由器都将收到该Bootstrap消息。
当某台路由器接收到IGMP消息或PIM Join消息而要加入某共享树时,需要检查接收自 BSR(通过Bootstrap消息)的RP-Set。
• 如果该多播组只有一个C-RP,则该路由器将被选为RP。
• 如果该多播组拥有多个C-RP,且优先级不同,则优先级最低的路由器将成为RP。
• 如果该多播组拥有多个C-RP,且优先级均相同,则需要运行哈希函数。该函数的输入是组前缀、哈希掩码和C-RP地址,输出是某些度量值。函数输出值最大的C-RP将成为RP。
• 如果多个C-RP的哈希函数输出值完全相同,则IP地址最大的C-RP将成为RP。
注意: 哈希函数如下。Value(G,M,C)=(1103515245 ((11035515245 (G&M)+ 12345)XOR C)+12345)mod 231
其中,G=组前缀,M=哈希掩码,C=C-RP地址。
上述处理过程可以确保PIM域中的所有路由器都能为同一个多播组选出相同的RP。需要哈希函数的惟一原因就是要融入哈希掩码,哈希掩码可以将多个连续的组地址映射为同一个RP。有关哈希掩码的使用方法将在第6章进行详细描述。
2.Auto-RP协议
Cisco IOS Software从Release 11.1(6)开始支持Auto-RP协议,在PIM-SM所用的Bootstrap协议出现之前,Cisco开发了该协议以提供RP的自动发现功能。与Bootstrap协议类似,Auto-RP也需要在PIM-SM中指派C-RP,并通过指派的IP地址(通常是环回接口的地址)来标识C-RP。此外,还需要指定一个或多个RP映射代理(RP mapping agent),RP映射代理的作用与BSR相似。Auto-RP协议与Bootstrap协议之间的主要差别如下。
• Auto-RP是Cisco专有协议,因而通常不能用于多厂商拓扑结构,不过现在也有部分厂商开始支持Auto-RP协议。
• 与BSR需要从一组候选BSR中选举出来不一样,RP映射代理是直接指派的。
• RP映射代理是将多播组映射到RP,而不是宣告RP-Set以及在整个多播域中发布选举进程。
• 与Bootstrap协议使用多播地址224.0.0.13且能被所有PIM路由器理解不一样,Auto-RP使用的是两个保留的多播地址224.0.1.39和224.0.1.40。
当某台Cisco PIM-SM路由器被配置为一个或多个多播组的C-RP时,它会在RP-Announce(RP通告)消息中宣告自己是这些多播组的C-RP,并每隔60秒将这些消息多播到保留的Cisco-RP-Announce地址224.0.1.39。PIM域中已配置的RP映射代理将侦听该地址,并从接收到的全部RP-Announce消息中为该多播组选出一个RP(该多播组的所有C-RP中IP地址最大者将成为RP)。
然后,RP映射代理在RP-Discovery(RP发现)消息中宣告完整的group-to-RP(组到 RP)映射列表,并以60秒为间隔将这些消息多播到保留的Cisco-RP-Discovery地址224.0.1.40。所有的Cisco PIM-SM路由器都会侦听该地址,因而可以掌握每个多播组的RP情况。
5.8.3 PIM-SM 与共享树
共享树路由表项与有源树或SPT路由表项之间的主要区别在于,共享树路由表项中没有指定多播源——这与共享树中多个多播源共享同一个多播树相一致。因而,共享树路由表项是一个(*,G)对,其中的星号为通配符,表示发送给多播组G的任意或全部源地址。
当PIM-SM DR从某台希望加入某多播组的主机接收到IGMP成员关系报告消息之后,首先检查其多播表中是否已经存在该多播组的路由表项,如果存在,那么接收到该IGMP消息的接口将被加入到路由表项中作为出站接口,无需再做其他操作。
如果多播表中无相应的表项,那么就需要为该多播组创建一个新的(*,G)表项,并加入出站接口。之后该路由器会查找group-to-RP映射列表中的该多播组(如例5-14所示),查询单播路由表以找到去往特定RP的路由,并将去往RP的上行接口加入到入站(RPF)接口中。
例5-14:命令show ip pim rp mapping显示了路由器的group-to-RP映射列表,所有的多播组都被映射到RP 172.16.224.1。
例5-15给出了图5-55中路由器Iron中的一个(*,G)路由表项示例。
例5-15:本例中的(*,G)表项显示出多播树上的多播组236.82.134.23的上游邻居是 172.16.224.1,通过出接口S1.708可达,且该多播组的RP为172.16.224.1。与该路由表项相关的标记表示该多播网络为稀疏模式且连接了一个组成员(在接口E0上)。
图5-55 路由器Brass是本PIM-SM域的RP,在其环回接口上配置了RP地址(172.16.224.1)
之后,该路由器将通过上行出接口向224.0.0.13发送一条Join/Prune消息(如图5-56所示)。该消息中包含了将要加入的多播组的地址和RP的地址,消息中的剪除字段为空。此外,还设置了两个标记——WC-bit(wildcard bit,通配符bit)和RPT-bit(RP-tree bit,RP树bit)。
• WC-bit=1表示加入地址是RP地址,而不是源地址。
• RPT-bit=1表示该消息沿多播树被传播到RP。
图5-56 Join/Prune消息以多播方式逐跳传送到RP
当上游路由器接收到Join/Prune消息后,可能会执行以下4种操作中的一种。
• 如果该路由器不是RP,但位于共享树上,那么该路由器会将接收到Join/Prune消息的接口加入到该多播组的出站接口列表中;
• 如果该路由器不是RP,且不位于共享树上,那么该路由器将创建一个(*,G)表项,并沿着RP的方向向上游邻居发送自己的Join/Prune消息;
• 如果该路由器是RP,且其路由表中已经存在该多播组的路由表项,那么该路由器会将接收到Join/Prune消息的接口加入到该多播组的出站接口列表中;
• 如果该路由器是RP,但其路由表中没有该多播组的路由表项,那么该路由器将创建一个(*,G)表项,并将接收到Join/Prune消息的接口加入到该多播组的出站接口列表中。
最后一种情形包含了一层隐含意义,那就是一个多播组并不需要有一个用于多播树(构建自RP成员)的多播源。
多播树建立之后,路由器就开始周期性地向上游邻居发送Join/Prune消息,以保持激活。这些Join/Prune消息中列出了目的邻居是前一跳路由器的所有路由表项,默认的发送周期是 60秒,也可以利用Cisco IOS命令ip pim message-interval修改该周期。保持时间则是 Join/Prune消息间隔的3倍或默认值3分钟,该时间也要通过Join/Prune消息进行宣告。如果在保持时间内,PIM-SM路由器都没有从下游邻居接收到某多播组的Join/Prune消息,则将下游邻居从其多播组表项的出站接口列表中剪除。例5-16显示了图5-55路由器Tin中多播组236.82.134.23的路由表项。去往路由器Iron的出站接口是S1.805,如果在2分11秒之内都没有收到Iron发送来的Join/Prune消息,则Tin会将该接口从出站接口列表中剪除。
例5-16:图5-55路由器Tin中多播组236.82.134.23的路由表项显示了与下游路由器Iron相关联的剩余保持时间。请注意,由于Tin没有直连的组成员,因而该表项没有设置C标记。
剪除过程与前面所述一样,当路由器希望将自己从共享树中剪除出去时(因为该路由器已经无直连的组成员或下游邻居),会从RPF接口向上游邻居发送一条Join/Prune消息,组地址和RP地址位于该消息的剪除字段,且设置了WC-bit和RPT-bit。之后,上游路由器就从该多播组的出站接口列表中删除接收到该消息的接收接口,如果该上游路由器也没有下游邻居且未连接组成员,则也要剪除自己。
注意: PIM-SM也使用PIM-DM中描述的剪除覆盖机制,以确保多路接入网络中的下游邻居不会被意外剪除。
5.8.4 源注册
前面已经多次提到过共享树的基本概念,即多播树的根部是核心路由器或聚合点,而不是多播源,但随之而来的问题是多播源如何将多播包分发给RP,再由RP分发到多播树的所有树枝?回顾一下CBT的解决方法,CBT使用了双向树(即多播包可以从核心路由器往下传送到树枝,也可以从树枝往上传送到核心路由器)。这样一来,与多播源直连的路由器加入去往核心路由器的共享树之后,就可以将多播流量从树枝发送到核心路由器。但双向树的缺点是很难保证无环路拓扑结构,原因是此时没有“上游”和“下游”之分,也就无法执行RPF检查。
与CBT不同,PIM-SM使用了RPF检查,因而其多播树必须是单向树,即多播流量只能从RP向下传送到树枝,单向流量可以清晰地定义入站或RPF接口。但是,如果只能从RP向外发送多播流量,那么多播源如何将自己的多播流量分发给RP呢?
当PIM-SM路由器首次接收到其直连多播源的多播包时,会在其group-to-RP映射表中查找目的多播组的RP(如例5-17所示),该步骤与组成员通过ICMP消息告知其希望加入某多播组类似。
例5-17:图5-55中路由器Aluminum的group-to-RP映射表。与例5-14相比,Iron有一个静态RP映射,而Aluminum则是动态学习RP地址。
确定了多播组的RP之后,路由器就将多播包封装在PIM Register(注册)消息中,并将该消息发送给RP。需要注意的是,Register消息是以单播方式(而不是多播方式)发送到RP地址的(如图5-57所示)。
图5-57 第一个多播包被封装在PIM Register(注册)消息中,并以单播方式传送给RP
RP接收到Register消息之后,就将多播包解封装出来,如果其多播路由表中已存在该多播组的路由表项,则在其出站接口列表中的所有接口上转发该多播包(如图5-58所示)。
图5-58 从Register消息中解封装出多播包,并在出站接口列表中的所有接口上转发该多播包的拷贝
如果需要将大量的多播包传送到RP,那么继续将多播包封装到Register消息中再传送到 RP,效率将非常低下。因而,RP在其多播表中创建了一个(S,G)表项,并通过多播传送一条Join/Prune消息来建立一个去往源DR的SPT(如图5-59所示),这条消息中包含了多播源地址,WC-bit=0且RPT-bit=0,表示该路径是有源SPT,而不是共享RPT。
图5-59 RP创建了一个去往多播源的DR的有源最短路径树
建立了SPT之后,RP就可以通过该多播树接收多播流量。此时,路由器需要向多播源的DR发送一条Register Stop(注册终止)消息,告诉DR停止在Register消息中发送多播包(如图5-60所示)。
图5-60 RP发送一条Register Stop消息来终止Register消息,此时多播源的多播包开始通过SPT被发送给RP
如果多播源开始向RP发送多播流量的时候没有组成员,那么RP将不构建SPT,而是向多播源的DR发送一条Register Stop消息,让其停止在Register消息中发送被封装的多播包。RP有该多播组的(*,G)表项,当有组成员加入时,RP就可以启动SPT。
一种被称为注册抑制(Register Suppression)的机制可以阻止DR持续不断地向失效RP发送数据包。当DR接收到Register Stop消息之后,会启动一个60s注册抑制定时器(Register-Suppression timer)。当定时器到期时,该路由器会再次通过Register消息发送多播包,但是在这之前的5s,DR会发送一条携带Null-Register(空注册)bit标记的Register消息。如果该消息触发了一条来自RP的Register Stop消息,那么就会重置注册抑制定时器。
例5-18中的调试消息显示了路由器Aluminum开始向多播组236.82.134.23发送多播流量时的事件顺序。对本例来说,此时还没有组成员加入该多播包,因而RP(Brass)立即向 Aluminum发送一条Register Stop消息,作为Register消息的响应消息。
例5-18:该RP没有多播组236.82.134.23的成员,因而立即向Aluminum(172.16.2. 233)发送一条Register Stop消息,作为Register消息的响应消息。请注意,这两条消息都是以单播方式(而不是多播方式)进行传送。
例5-19显示了该多播组的路由表项。可以看到,该多播组同时拥有(,G)和(S,G)表项,其中,(,G)表项显示的入站接口为Null(空),RPF邻居为0.0.0.0,表明该路由器是共享树的根部;(S,G)表项显示去往多播源的上游邻居Platinum(172.16.2.246)是RPF邻居,由于出站接口列表中无任何接口,因而该表项被剪除。
例5-19:RP上多播组236.82.134.23的路由表项,此时无任何成员加入该多播组。
例5-20显示了Aluminum(为该多播源的DR)上该多播组的路由表项,其中也存在(*,G)表项,出站接口列表中显示以太网接口连接到多播源,而入站接口列表为Null(空)。(S,G)表项显示该以太网接口在入站接口列表中。这两个表项有两个相同的标记,其中的一个标记(C)表示该多播源是直连在该路由器上,另一个标记(F)表示该路由器必须发送一条Register消息以传送多播流量。
(S,G)表项中的标记T表示该表项为SPT,标记P表示出站接口列表中无接口,如果有一个RPF邻居,那么该路由器将向该邻居发送一条该多播组的Prune(剪除)消息。
(*,G)表项中的标记J表示在共享树上接收到一个多播包后,路由器会切换到SPT,至于路由器如何从共享树切换到SPT将在下一小节进行描述。
例5-20:多播组源的DR的相关路由表项显示了一个被剪除的SPT项。
例5-21给出的调试消息显示了连接在路由器Iron上的主机加入该多播组后发生的一系列事件,接收自Tin的Join/Prune消息被Iron再生后以多播方式逐跳发送给RP。然后将去往 Tin的接口加入到(*,G)表项中,同时该接口也会被加入到(S,G)表项中(因为将使用去往Aluminum的SPT)。接下来,就是将SPT Join消息发送给Aluminum。
例5-21:这些debug消息显示连接在路由器Iron上的组成员正在加入多播组236.82.134.23。
例5-22显示了RP的路由表项,例5-23显示了多播源的DR的路由表项。
例5-22:当组成员加入时,其接口将被加入到(*,G)表项中。由于要使用去往Aluminum的SPT,因而该接口也被加入到(S,G)表项中。
例5-23:去往RP的接口已被加入到Aluminum的(S,G)表项的出站接口列表中,该表项也不再处于剪除状态。
5.8.5 PIM-SM 与最短路径树
如图5-61所示,路由器Lead已经被加入到PIM-SM域中,且Lead连接了一个组成员。根据基本的共享树规则,Lead将加入根部为Brass的共享树。但是从这个例子中可以很明显地看到,去往Aluminum的直连链路是多播包从多播源到Lead的组成员更有效路径。
图5-61 Lead与Aluminum之间的直连链路是多播包去往Lead所连组成员的更优路由(与Aluminum-Platinum-Brass-Lead路径相比)
读者已经了解了PIM-SM如何在RP和源DR之间建立SPT,而且该协议也允许在任何连接了组成员的路由器到源DR之间建立SPT,从而解决了拓扑结构的低效问题(如图5-61所示情形)。
例5-24显示了路由器Lead在其组成员通过IGMP请求加入某多播组之后的SPT构建情况。首先,Lead向RP发送Join消息(通过出接口S1.605),多播包到达后,Lead就查看多播源的IP地址,通过查找其单播路由表可以知道,需要通过其他接口(S1.603,不是去往 RP的接口S1.605)可以到达多播源IP地址。接着,Lead向Aluminum发送一条Join消息,并在这两台路由器之间直接建立SPT。当Lead开始通过SPT接收(172.16.1.1,236.82.134.23)的多播流量时,会向RP发送一条Prune消息,以便将自己从共享树中剪除出去。
例5-24:Lead加入了共享RPT,但开始接收多播流量之后就加入了直接从源到DR的 SPT,并将自己从RPT中剪除出去。
例5-25显示了Lead针对多播组236.82.134.23的多播路由表项。仍然存在共享树的(*,G)表项,只要该路由器连接了组成员或者有该多播组的下游邻居,那么该表项将一直存在。但是,需要注意的是,(S,G)表项显示了一个不同的入站接口和一个不同的RPF邻居。
例5-25:Lead中关于多播组236.82.134.23的多播路由表项显示该路由器已经从RPT切换到了SPT。
例5-26显示了Aluminum的路由表项,例5-27显示了Brass的路由表项,可以看出,Aluminum正通过SPT树将多播流量转发给Lead和Brass。对Brass来说,去往Lead的接口没在(S,G)表项的出站接口列表中(因为RP没有向Lead转发多播流量)。
例5-26:Aluminum中关于多播组236.82.134.23的多播路由表项,显示了一个去往Lead和Brass的SPT。
例5-27:Brass中关于多播组236.82.134.23的多播路由表项,去往Lead的接口(S1.506)仍然位于(*,G)表项的出站接口列表中,但不在(S,G)表项的出站接口列表中。
RFC 2362规定,当“数据速率很高时”,路由器应该从RPT切换到SPT,那么何谓高数据速率呢?这个问题没有确定的答案。因为这可能与该路由上的累计可用带宽、拥塞情况以及路由器的性能等多种因素相关,所以需要网络管理员根据自己互联网络的特征做出决定。
Cisco使用一种简单的默认机制,Cisco路由器首次从共享树上接收到某(S,G)的多播包后就立即加入SPT。可以使用命令ip pim spt-threshold来更改这种默认机制,其中,切换到SPT的速率阈值以kbit/s为单位(默认值为Okbit/s),路由器按秒来测量多播包的到达速率,如果多播包(任意多播组或某特定多播组)的到达速率超出了阈值,那么路由器就切换到SPT。路由器切换到SPT之后,就开始监控该有源树上的到达速率。如果该多播组的速率低于预配置阈值超过60秒,路由器就会切换回该多播组的共享树。
可以在命令ip pim spt-threshold中使用关键字infinity,以阻止路由器切换到SPT。
有意思的是,即使去往多播源的最短路径通过RP,路由器也要切换到SPT。在前面的示例中,路由器Iron位于RPT上,原因是在Iron的配置中加入了语句ip pim spt-threshold infinity。例5-28显示了Iron中关于多播组236.82.134.23的路由表项,然后从Iron的配置中删除命令ip pim spt-threshold infinity并重新观察该路由,可以看到,将SPT阈值重置为默认值之后,路由器就立即切换到SPT。由于去往路由器Iron的接口已经位于(S,G)表项的出站接口列表中,因而RP中的路由表项与例5-27保持一致。
例5-28:Iron中关于多播组236.82.134.23的路由表项,显示了将SPT切换阈值重置为默认值前后的情况。
在例5-28中以及前面的一些示意图中,标记J与(,G)表项或(S,G)表项或两者有关,该标记为加入SPT标记。当标记J与(,G)相关联时,表示沿共享树向下传送的多播流量超出了SPT阈值,如果没有加入SPT,则将在下一次接收到多播包的时候加入 SPT。当标记J与(S,G)相关联时,表示该路由器已经加入SPT(因为RPT流量已经超出了SPT阈值)。
表5-11列出了与多播路由标记相关联的全部标记,该列表直接引用自Cisco IOS Software Command Reference(软件命令参考指南)。
表5-11 多播路由标记
5.8.6 PIMv2 消息格式
PIMv2消息被封装在IP包中,协议号为103,除了以单播方式传送这些消息之外,IP目的地址都使用保留的多播地址224.0.0.13,且TTL为1。通过多播地址和TTL,可以确保仅将这些消息转发给邻居路由器。
虽然PIMv2是当前版本,但PIMv1的应用仍然相当普遍,PIMv1使用的IP协议号是2,为IGMP协议的一个子集,PIMv1使用的多播地址是224.0.0.2。
Cisco IOS自11.3(2)T之后开始支持PIMv2,并提供了与PIMv1的后向兼容性,PIMv2路由器在任何接口上检测到PIMv1邻居之后,都会自动切换到PIMv1。此外,还可以利用命令ip pim version以手工方式将某接口设置为PIMv1或PIMv2。
出于篇幅考虑,本书仅讨论PIMv2的消息格式,有关PIMv1的消息格式请参考相关的 Internet草案。
读者可能已经注意到,某些类型的消息中包含了用来引用被编码地址的字段标签,有关编码格式及这些字段的详细信息,请参考RFC 2362的第4.1节。
以下消息中的所有保留(Reserved)字段都被设置为全0,并在接收时予以忽略。
1.PIMv2消息头格式
所有的PIMv消息都有一个标准的消息头(如图5-62所示)。
图5-62 PIMv2消息头格式
PIMv2消息头的字段定义如下。
• 版本(Version):指定版本号。虽然PIMv1目前仍在广泛使用,但目前的版本号是2。
• 类型(Type):指定封装在头部后面的PIM消息类型,表5-12列出了PIMv2消息类型。
表5-12 PIMv2消息类型
• 校验和(Checksum):一个标准的IP式校验和,长16bit,是PIM消息(除了Register消息中的数据部分)的反码的反码。
2.PIMv2 Hello消息格式
PIMv2的Hello消息用于邻居发现和邻居保持激活,其消息格式详见图5-63。在默认情况下,每隔30秒发送一次Hello消息,可以利用命令ip pim query-interval来修改该发送间隔。
图5-63 PIMv2 Hello消息格式
PIMv2 Hello消息的字段定义如下。
• 选项类型(Option Type):指定选项值(Option Vlaue)字段中的选项类型,目前仅使用了选项类型1,表示选项值字段为保持时间,选项值2〜16保留。
• 选项长度(Option Length):指定选项值字段的长度(以字节为单位),当选项值为保持时间(选项类型=1)时,选项长度为2。
• 选项值(Option Vlaue):一个可变长字段,携带由选项类型指定的各种类型的值。保持时间(选项类型=1,选项长度=2)是路由器在宣称邻居路由器无效之前等待从 PIM邻居接收到Hello消息的时间,保持时间是Hello间隔的3.5倍。
从Hello消息的格式可以看出,单个Hello消息中可以携带多种选项TLV(类型/长度/值)。
3.PIMv2 Register(注册)消息格式
Register消息仅用于PIM-SM,其消息格式如图5-64所示。Register消息以单播方式从多播源的DR传送到RP,并携带来自多播源的初始多播包,也就是说,当自多播源的 DR至RP的SPT尚未建立的时候,由Register消息负责以隧道方式将多播流量从多播源传送到RP。
图5-64 PIMv2 Register(注册)消息格式
PIMv2 Register消息中的字段定义如下。
• 校验和(Checksum):计算Register消息中的校验和字段时仅计算消息头,不包括数据部分。
• B:边界(Border)比特。如果发信路由器是直连多播源的DR,则该bit被设置为0;如果多播源是PMBR(PIM Multicast Border Router,PIM多播边界路由器),则该bit被设置为1。有关PMBR及其他域间多播问题将在第7章进行讨论。
• N:Null-Register(空注册)比特,DR在其本地注册抑制定时器到期之前探测RP,则将该bit设置为1。
• 多播数据包(Multicast Data Packet):单个来自多播源的数据包,该多播包在Register消息中以隧道方式被传送给RP。
4.PIMv2 Register Stop(注册终止)消息格式
Register Stop消息由RP发送给发起Register消息的DR,其消息格式如图5-65所示。该消息用于以下两种情形。
• RP开始通过SPT接收多播源发出的多播包,不再需要将这些多播包封装在Register消息中进行接收;
• RP没有需要转发多播包的组成员(直连或通过SPT/RPT连接的组成员)。
PIMv2 Register Stop消息的字段定义如下。
• 已被编码的组地址(Encoded Group Address):多播组IP地址,接收方应该停止向该地址发送Register消息。
• 已被编码的单播源地址(Encoded Unicast Source Address):多播源的IP地址,通过将字段的地址设置为全0,就可以为(*,G)表项指定所有多播源。
图5-65 PIMv2 Register Stop(注册终止)消息格式
5.PIMv2 Join/Prune(加入/剪除)消息格式
Join/Prune消息沿上游方向发送给RP或多播源,用于加入和剪除RPT或SPT,其消息格式如图5-66所示。Join/Prune消息由多个多播组列表组成,对每个多播地址来说,有一个或多个源地址,这些列表合起来就可以指定将要加入或剪除的(S,G)和(*,G)表项。
图5-66 PIMv2 Join/Prune(加入/剪除)消息格式
PIMv2 Join/Prune消息中的字段定义如下。
• 被编码的单播上游邻居地址(Encoded Unicast Upstream Neighbor Address):RPF的地址或该消息所要发往的上游邻居的地址。
• 多播组数量(Number of Groups):指定该消息中包含的多播组数量。
• 已被编码的多播组地址(Encoded Multicast Group Address):指定某多播组的IP地址。
• 将要加入的多播源数量(Number of Joined Sources):指定该多播组地址下所列出的已被编码的将要加入的多播源地址(Encoded Joined Source Addresses)数量。
• 被剪除的多播源的数量(Number of Pruned Sources):指定该多播组地址下所列出的已被编码的将要被剪除的多播源地址(Encoded Pruned Source Address)数量。
• 已被编码的将要加入的多播源地址(Encoded Joined Source Address):指定(S,G)中的源地址或(,G)中的通配符,此外,也可以在该字段中指定(,*,RP)(详见第7章)中的两个通配符。除了源地址之外,该字段中还包含了以下3个标记。
— S是稀疏(Sparse)bit,对PIM-SM来说该bit为1,用来与版本1保持兼容性。
— W是WC(WildCard,通配符)bit,如果W bit为1,则已被编码的将要加入的多播源地址字段为(,G)和(,*,RP)表项中的通配符;如果W bit为0,则已被编码的将要加入的多播源地址字段为(S,G)表项中的源地址。向RP发送加入消息时,必须将W bit设置为1。
— R是RPT bit,如果R bit为1,则表示向RP发送加入消息,如果R bit为0,则表示向多播源发送加入消息。
• 已被编码的将要被剪除的多播源地址(Encoded Pruned Source Address):指定将要被剪除的多播源的地址。编码方式与已被编码的将要加入的多播源地址字段一致,而且也使用S、W、R bit。
6.PIMv2 Bootstrap(引导)消息格式
Bootstrap消息由BSR(Bootstrap Router,引导路由器)每隔60秒发送一次,并泛洪到整个PIM-SM域,以确保所有的路由器都能为同样的多播组确定相同的RP。Bootstrap消息的格式如图5-67所示,消息中包含了一个或多个多播组地址列表,对其中的每个多播组地址来说,都有一个C-RP及相应的优先级。该地址列表实际上就是多播组的RP-Set,接收路由器会使用一种通用算法从C-RP列表中确定该多播组的RP,该算法可以确保PIMv域中的所有路由器都能得出相同的RP地址。此外,Bootstrap消息还被用来选举BSR(如“Bootstrap协议”一节所述)。
PIMv2 Bootstrap消息中的字段定义如下。
• 片段标签(Fragment Tag):当Bootstrap消息长度超出了最大包尺寸而必须分割成多个片段时就需要使用本字段。片段标签是一个随机生成的数值,被分配给同一条消息的所有片段,也就是说,每条Bootstrap消息的所有片段的该字段值都一样。
• 哈希掩码长度(Hash Mask Length):描述哈希算法中使用的掩码,利用命令ip pim bsr-candidate可以设置掩码的长度。
• BSR优先级(BSR Priority):取值范围为0〜255,用来指定发信C-BSR的优先级,优先级最高的C-BSR将成为BSR,利用命令ip pim bsr-candidate可以设置该优先级。
• 已被编码的单播BSR地址(Encoded Unicast BSR Address):该多播域的BSR的IP地址。
图5-67 PIMv2 Bootstrap(引导)消息格式
• 已被编码的多播组地址(Encoded Group Address):多播组的IP地址。
• RP数量(RP Count):用来指定某特定多播组的C-RP数量,即RP-Set的大小。考虑到Bootstrap消息可能会被分段,如果某个片段出现丢失,那么整个PIM域中确定的RP就可能会出现不一致,因而描述RP-Set的大小非常重要。如果所接收到的 RP-Set中的RP数量与本字段中的RP数量不一致,则丢弃整个RP-Set。
• 片段RP数量(Fragment RP Count):指定该多播组片段中包含的C-RP数量。
• 已被编码的单播RP地址(Encoded Unicast RP Address):C-RP的IP地址。
• RP保持时间(RP Holdtime):在从RP-Set中删除C-RP之前,BSR应该等待该字段所指定的时间来接收Candidate-RP-Advertisement(候选RP宣告)消息。
• RP优先级(RP Priority):取值范围是0~255,用于RP选举算法,“最高”优先级为0。
7.PIMv2 Assert(声明)消息格式
PIMv2 Assert消息用于为多路接入网络选举一台指派转发路由器,其消息格式如图5-68所示。PIM路由器在某接口上接收到一个多播包(该接口为该多播包所属多播组的出站接口)之后,会认定该数据链路层上连接了另一台正在转发该多播组流量的路由器。因而该PIM路由器会发送一条Assert消息,以便让共享该多路接入网络的其他路由器能确定由谁负责转发该多播组的流量。
图5-68 PIMv2 Assert(声明)消息格式
PIMv2 Assert消息中的字段定义如下。
• 已被编码的多播组地址(Encoded Group Address):触发Assert消息的数据包的多播 IP目的地址。
• 已被编码的单播源地址(Encoded Unicast Source Address):触发Assert消息的多播包的IP源地址。
• 度量优先值(Metric Preference):分配给单播路由协议(提供去往多播源的路由)的优先值,该优先值的使用方式与管理性距离相似,为来自不同路由协议的路由进行比较提供统一的尺度。
• 度量值(Metric):与发信路由器单播路由表中去往多播源的路由相关联的度量值。
8.PIMv2 Graft(嫁接)消息格式
PIM-DM路由器通过向其上游邻居发送PIMv2 Graft消息,来请求重新加入先前被剪除的多播树,其消息格式与图5-66所示的Join/Prune消息格式类似,区别在于类型=6。
9.PIMv2 Graft-ACK(嫁接确认)消息格式
PIM-DM路由器向其下游邻居发送Graft-Ack消息以响应Graft消息,其消息格式与图 5-66所示的Join/Prune消息格式类似,区别在于类型=7。
10.PIMv2 Candidate-RP-Advertisement(候选RP宣告)消息格式
C-RP周期性地向BSR以单播方式发送Candidate-RP-Advertisement消息,BSR利用该消息中的信息构建其RP-Set,而RP-Set又通过Bootstrap消息宣告给域中的所有PIM-SM路由器。图5-69显示了Candidate-RP-Advertisement消息的格式情况。
PIMv2 Candidate-RP-Advertisement消息中的字段定义如下。
• 前缀数量(Prefix Count):指定该消息中包含的多播组地址数量。如果发信路由器是该多播域中全部多播组的C-RP,那么该字段为0。
图5-69 PIMv2 Candidate-RP-Advertisement(候选RP宣告)消息格式
• 优先级(Priority):取值范围为0~255,用于指定发信C-RP的优先级。该优先级用于选举RP的算法之中,实际的优先级与优先级数值大小正好相反,即0代表最高优先级,255代表最低优先级。
• 保持时间(Holdtime):指定该消息的有效时间。
• 已被编码的单播RP地址(Encoded Unicast RP Address):C-RP地址。该地址是本路由器某个接口的IP地址,通常情况下使用的是环回(loopback)接口地址。
• 已被编码的多播组地址(Encoded Group Address):指定一个或多个发信路由器是 C-RP的多播组地址。