加载中…
个人资料
无边-zt
无边-zt
  • 博客等级:
  • 博客积分:0
  • 博客访问:5,195
  • 关注人气:5
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

[转载]【组播技术入门 09】PIM-SM

(2019-11-12 11:49:13)
标签:

转载

一、协议概述

1. 协议概述
  • PIM-DM适用于网络规模较小、组播接收者较为密集的组网;而PIM-SM(PIM-Sparse Mode稀疏模式)则适用于组播接收者较为分散、网络规模较大的组网。
  • PIM-SM采用拉(Pull)的方式,接收者需显式的加入共享树。
  • 引入汇聚点(Rendezvous Ping)作为共享树的公共树根。PIM-SM支持共享树和源树。
  • 第一跳路由器向RP注册,把组播分组发给RP,RP将单个组播数据拷贝发送给接收方。
  • 与组播用户直连的最后一跳路由器知道去RP的最短路径,PIM Join消息逐跳到达RP的过程中,便创建了共享树的一个分支。
  • PIM-SM中的SPT切换机制使得组播流量的转发更加科学。

2. 关于汇聚点RP(Rendezvous Point)

关于RP:
  • 作为RPT的根,负责将来自于源(Source)的组播流量转发到接收者
  • 作为汇聚点,负责一个或多个组播组的组播流量转发
  • 一个组播组只能有一个RP(可以有主备)
RP的发现机制:
  • 静态手工指定(需在所有组播路由器上配置)
  • 动态协议选举:Auto-RP、BSR

3. 与DM有几个共同点
  • 通过HELLO发现邻居
  • 当单播路由发生变化时,重新计算RPF接口
  • 在多路访问的网络中选举指定路由器
  • 在多路访问的网络中使用prune覆盖
  • 在多路访问的网络中使用Assert消息选举指定前传器


二、RPF检查

PIM-SM使用源树和共享树,因此PIM-SM在做RPF检查时:
  • 对于源树,使用组播源的地址进行RPF check
  • 对于共享树,使用RP的地址进行RPF check


三、工作机制

PIM-SM使用一种拉(Pull)模式来传送组播数据包。只有包含活动接收者,并且接收者直接发送数据接收请求的网段才会收到数据。PIM-SM引入了一个非常重要的概念,RP(Rendezous Point),汇聚点。RP的作用:所有的组播源在发送组播数据时,与组播源相连的第一跳路由器都会把组播数据发送给RP,然后再由RP把组播数据发送给有接收需求的路由器,依次类推。

3.1 共享树加入(接收者到RP) 

 [转载]【组播技术入门 <wbr>09】PIM-SM


E收到直连PC发出的IGMP membership Report,表示希望加入组G,于是E向上游接口发送(*,G)Join消息试图将自己拉到RPT共享树中,这个消息包含要加入的组地址及RP的地址,同时设置了两个比特位:
  • WC位=1表示这个加入的地址是一个RP地址,而不是源地址
  • RPT位=1表示这个消息顺着共享树传到RP

上游路由器收到这个(*,G)Join消息后,如果它是以下几种情况
  • 如果它不是RP,并且已经在RPT上,它把收到(*,G)Join消息的接口加入组播组的输出接口列表
  • 如果它不是RP,并且不在RPT上,则创建一个(*,G)条目,并向RP发送自己的(*,G)Join消息
  • 如果它是RP,并且它关于这个组播组已经有一个组播路由表项,则把收到(*,G)Join消息的接口加入输出列表
  • 如果它是RP,并且没有关于这个组播组的组播路由表项,则它会创建一个(*,G),并将收到(*,G)Join消息的接口加入输出列表
  • 回到前面我们描述的这个环境,C是RP,它将创建(*,G)表项,并且将收到Join消息的那个接口加入到出接口集合:
 [转载]【组播技术入门 <wbr>09】PIM-SM

经过前面的步骤,RPT的一个分支就形成了,如果这时候RP已经收到了组播源发送过来的组播流量,则它开始向RPT转发组播流量:
 [转载]【组播技术入门 <wbr>09】PIM-SM

现在F路由也收到直连PC发出的IGMP消息请求加入组G,于是它也创建(*,G)表项,将该接口放入出口列表,同时,向RP方向发送(*,G)Join消息,这时E收到该消息,由于E已经有了(*,G)项,因此它只将收到E的这个Join消息的接口加入(*,G)表项的出口列表:
 [转载]【组播技术入门 <wbr>09】PIM-SM

[转载]【组播技术入门 <wbr>09】PIM-SM

 
现在RPT如下:
 [转载]【组播技术入门 <wbr>09】PIM-SM

RPT建立起来后,路由器周期性的向上游邻居发(*,G)Join消息保活。周期默认60s,使用ip pim message-interval改变。保活时间是join/prune间隔的3倍,也就是3分钟,3分钟后,如果路由器没收到已知下游邻居的(*,G)Join消息,则将那个接口从输出列表中删除。
当然如果RP上没有组播组G的组播数据,则需等到组播源完成向RP的注册,共享树才能够收到组播数据。

3.2 共享树剪枝
 
 [转载]【组播技术入门 <wbr>09】PIM-SM

[转载]【组播技术入门 <wbr>09】PIM-SM


3.3 组播源注册
 
[转载]【组播技术入门 <wbr>09】PIM-SM

  • 当PIM-SM路由器(第一跳路由器)首次收到直连的源发出的多播流量时,它通过查找组到RP的映射来找出这个组的正确RP。决定了组的RP后,路由器将组播包封装在PIM Register消息中,并将这个消息发往RP,Register消息是由第一跳路由器单播发到RP的地址,他收到组播数据包后,在本地创建(S,G)转发表项,并开始发送单播的register。
  • 当RP收到这个Register消息后,将组播包去除封装。如果组播路由表中已经了有这个组的表项,则组播包的拷贝将从所有输出端口上送出。而如果RP没有组共享树,则它只是简单的丢弃组播数据包,而且不向源发送加入消息。
  • 如果有相当多的组播流量要发向RP,不断在Register消息里封装这些发往RP的包是很低效的。因此接下来RP准备在自己与源之间构建一棵SPT,这样它就能够通过SPT直接收到组播源发送过来的组播数据而不是单播的register包。RP在组播表里建立一个(S,G)表项,并且用(S,G)Join消息与源DR间创建一条SPT,并按照这个SPT从组播源接收组播数据。这个消息包含组播源的地址,WC位=0、RPT位=0 表示这条通路是基于源的源树SPT,而不是共享树RPT:
 [转载]【组播技术入门 <wbr>09】PIM-SM

[转载]【组播技术入门 <wbr>09】PIM-SM

 
  • 建立好SPT后,RP能通过树收到组的流量。现在再从Register消息接收被封装的组播数据就没有意义了,因此它向组播源DR发送Register Stop消息,告诉它停止在Register消息(也即PIM保留消息)中发送组播包:
 [转载]【组播技术入门 <wbr>09】PIM-SM

以下几种情况RP会发送register-stop:
1. 当RP通过Source和RP之间的(S,G)SPT开始收到来自Source的组播数据时
2. 如果RP不需要组播信息(因为没有该组的共享树存在,也就是没有组播用户)
最终,网络中的组播树如下:
 
  • 如果当组播源开始向RP发送组播流量,而组内还没有组员时,RP不会建立SPT。相反,它会向组播源DR发送Register Stop消息,告诉它停止在Register消息中封装多播包。RP对这个(*,G)对建立一个条目,当有组员加入后,RP会主动发送join消息来发起建立SPT。
  • 有一个称为注册抑制的机制来保护DR继续向一个无效的RP发送包。当DR收到Register Stop,启动一个60s的注册抑制计时器,当这个计时器超时,路由器再次用Register消息向RP发送多播包。不过在发送消息5s前DR发送一个设置了一个标识的Register消息,这个标识称为空注册比特,而且这个消息也不封装任何包。如果这个消息触发RP发送一个Register Stop消息,则重新设置注册抑制计时器。

4.4 RPT到SPT的切换
 [转载]【组播技术入门 <wbr>09】PIM-SM

经过前面的步骤,F路由器已经能够收到沿着RPT下来的组播数据,但是很明显目前的组播流传播路径是非常低效的,为什么F不能直接从A-E接收组播数据而非得要从A-B-C-E收到组播数据呢?
F此刻已经知道了Source1作为组播组G的活动源,接下来它要在自己与A之间构建一个SPT。
由于F想加入SPT(组播流量超出了阀值),因此它向源发送(S,G)Join信息,F通过计算通向Source的RPF接口来确定把此信息发送出去的正确接口(RPF接口计算依赖单播路由表,其也表示E是E通向source的下一跳路由器)。
当E收到(S,G)Join消息,就在它的组播表中创建(S,G)条目,并且将收到该加入消息的接口添加到输出接口集合中。随后E继续向上游发送(S,G)Join消息。
 [转载]【组播技术入门 <wbr>09】PIM-SM

A收到了这个Join消息,作为直连组播源S的第一跳路由器,它创建(S1,G)条目,并且将收到Join消息的接口添加到输出接口集合中:
 [转载]【组播技术入门 <wbr>09】PIM-SM

这就是RPT到SPT的切换机制,在PIM-SM中,这是一种提高数据传输效率、降低网络资源利用率的有效方法,只要最后一条路由器转发的组播流量超过特定的阈值就会触发切换,这个阀值在CISCO上默认为0,也就是一有组播流量,马上切换。
使用 ip pim spt-threshold修改 单位kbps
 上述命令后Infinity关键字可以防止路由器切换到SPT

在E加入SPT后,此时由于E也在RPT上,因此将导致E收到两份重复的组播数据:
 [转载]【组播技术入门 <wbr>09】PIM-SM

这时E将向RP发送一种特定类型的剪枝:(S,G)RP位剪枝消息。RP标志(也叫RP位)表示这消息可应用于RPT,并且必须沿着通向RP的共享树向上转发。当RP收到该剪枝消息,它将更新自己的组播表项,以便(S,G)组播流量不会沿着共享树转发到E:
 [转载]【组播技术入门 <wbr>09】PIM-SM

由于该接口是RP唯一的(S,G)出口,被剪枝后RP不在需要(S,G)的组播流量了,因此RP发送(S,G)的剪枝消息返回Source:
 [转载]【组播技术入门 <wbr>09】PIM-SM

稳定后,组播树及组播流量的转发路径如下:
 [转载]【组播技术入门 <wbr>09】PIM-SM


五、PIM-SM状态刷新

共享树建立起来后,
  • 路由器周期性的向上游邻居发送join/prune消息保活。默认60S,使用ip pim message-interval修改。
  • 保活时间是join/prune间隔的3倍,也就是3分钟,3分钟后,如果路由器没收到已知下游邻居的join/prune消息,则将那个接口从输出列表中删除。
所以,总结如下:
  • 路由器默认每60s向RP方向的上游邻居发送(*,G)加入消息刷新RPT;
  • 路由器默认每60s向源方向的上游邻居发送(S,G)加入消息刷新SPT。
  • 只要是这些组播转发表项在其输出接口合集中存在接口,这个周期性的动作就会持续。

六、PIM-SM DR 

PIM在每一个多路访问网络,使用HELLO消息选择一个DR(Designated Router, 指定路由器)。DR的角色是可抢占的。

1. PIM-DM中的DR
在PIM-DM中,只有当IGMPv1被用在多路访问网络的时候DR才会有意义,这是因为IGMPv1没有定义IGMP查询器选择机制,在这种情况下,被选择的DR也有IGMP查询功能。PIM-SM中,指定路由器的作用更大。

2. PIM-SM中的DR
 [转载]【组播技术入门 <wbr>09】PIM-SM

  • 靠近源的DR(如上图中的R2)负责将source的组播数据发给RP
设想一下,源与两个第一跳路由器连接在同一个LAN中,源发送组播数据的话,R1、R2都会收到,如果两者都向RP发送PIM Register消息,RP就会收到两份组播数据,这显然是无意义的,因此再这种情况下,会在LAN中选举出一个DR,由该DR负责向RP发送PIM Register消息。当然,在完成源到RP的SPT构建后,也是由DR来向RP发送(S,G)的组播数据。
  • 靠近接收者的DR(如上图中的R4)负责向RP发送Join消息从而将分支拉到共享树
上图中,与组播接收者同处于一个LAN的最后一跳路由器有两台,当接收者发出IGMP成员关系报告时,R3及R4都能感知到该LAN中出现了组播组的成员,如果他们都向RP发送Join消息、都试图将自己拉近共享树的话,就有会导致接收者接收到两份相同的组播数据,这是无意义的,因此R3及R4的连接到该LAN的接口会进行DR的选举,成为DR的路由器负责向RP发送Join消息形成共享树的分支。 

3.DR的选举

一个LAN中IP最大的PIM接口成为DR,但是这个因素不太稳定,毕竟想要改变DR还得改IP编址,因此增强的PIM协议建议在PIMv2的hello信息中加入DR优先级选项(默认值为1),优先级最高的路由器成为DR,如果优先级相等,则再比较IP地址,选拥有最大IP的接口。
当然并非所有的PIM路由器都支持这个DR优先级选项,不支持的路由器在发送PIM HELLO的时候不携带这个选项,当PIMv2路由器收到一个不包含DR优先级选项的hello时(或此消息中的优先级=0),那么接收方就知道,发送者不支持这个优先级选项,因此这个子网中的DR选举将使用IP地址进行比较。使用如下命令修改接口的PIM DR优先级(默认为1):
Router(config-if)#ip pim dr-priority x
关于DR还有一部分知识点,请看下文:PIM在MA网络中的组播数据转发问题。





红茶三杯(http://weibo.com/vinsoney/)原创文章,作者版权所有,转载请注明出处



====================================================
红茶三杯

网络工程 | 项目管理 | 技术培训
学习 沉淀 成长 分享
====================================================

0

  

新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有