PIM 基础

学习资料:PIM,L7_Multicast

PIM-DM

PIM-DM中默认假设所有路由器都是有客户相连,所以都要接收组播包,如果收到两路同样的组播包,则根据规则,路由器只从RPF口接收,其他口会忽视。并且,它会向那个非RPF口发送PRUNE信息去注销。如果它没有客户了,那也会发送PRUNE给上有路由器去注销。

对于以太网环境(多个路由器在同一网段相连),某一路由器的PRUNE信息不会干扰其他路由器的JOIN信息,否则将导致因为此PRUNE信息使得上有路由器注销该接口而使得新JOIN的路由器无法收到多播包。另外,以太网环境中会出现多路选择问题,即一个数据包可以从多条路径到达客户,这时会启用ASSERT机制,使得该多路上的路由器之间彼此交换路由信息,根据AD,METRIC,RID的顺序来比对判断最佳路径,从而避免多经问题。

PIM-SM

PIM-SM 形成过程:

1、当关于组G的活动源向首跳路由器发送第一个多播包时,首跳路由器就知道它应该向RP注册这个源并且请求RP构建一条由RP返回首跳路由器的源树。
2、首跳路由器把该多播消息封装成注册消息,以单播形式发往RP。
3、RP收到这一注册消息后,解除注册消息的封装后将它沿共享树向下传递。
4、同时发送一个(S,G)加入消息到源S以创建一条(S,G)SPT,也就是说,在SPT途经的所有路由器(包括RP)中创建(S,G)转发条目。
5、当SPT形成后,发自源S的多播数据流将沿SPT从源S直接传到RP。
6、RP一旦接到从源S发出的沿SPT传来的多播包,则向首跳路由器发送注册停止消息,然后首跳路由器停止向RP发送注册消息。
7、最后,多播数据包可沿从源到RP的SPT传至RP,再沿共享树从RP传至接收者。

SPT CUTOVER:

1、末跳路由器根据SPT-Threshold的值决定何时对转发路径加以修正,缺省的情况下这个阈值等于0,表示第一个包沿共享树到达后马上对转发路径加以修正。
2、末跳路由器向源发送(S,G)加入消息来重新构建一条旁路RP的SPT。
3、最后,末跳路由器沿共享树向RP发送(S,G) RP-bit 修剪消息,阻止RP经共享树向末跳路由器转发属于(S,G)源组的多播数据。(这个修剪在RP上生效之前,接收者可能会收到重复数据)
4、如果RP在它的所有属于共享树的接口上都收到了(S,G)RP-bit 修剪消息,那么它会向源发送(S,G)prune 修剪消息。
5、通过这种方式,PIM SM以更经济的方式建立了从源到接收者的(S,G)SPT。

(*,G) prune用于路由器没有HOST的时候,告知RP注销自己在RPT的位置;(S,G)prune 用于告知S的首跳路由器注销自己在SPT中的位置;(S,G) RP-bit prune用于告知RP自己选择SPT树,所以暂时不需要向它发送组播。

(*,G)是基于共享树的转发条目,只有当没有(S,G)匹配时才采用。当一台路由器收到(*,G)加入消息或来自属于组播组G的成员的IGMP报告时,创建(*,G)条目,如果有(S,G)条目产生,则相应的(*,G)条目也会出现。即若路由器STATE为空,现在刚刚加入了(S,G),则会添加相应的(*,G)条目。(*,G)的OIL如果变化,则(S,G)的OIL无条件跟随一起变化。
(S,G)是指定源的具体条目,相对于(*,G)条目有更高的优先权。

当(*,G)条目的OIL由空转为非空时发送(*,G)加入消息,当(*,G)条目的OIL由非空转为空时发送(*,G)prune 修剪消息。

当(S,G)条目的OIL由空转为非空时发送(*,G)加入消息,当(S,G)条目的OIL由非空转为空且从Incoming interface收到相关数据包时发送(*,G)修剪消息。

当(S,G)的RPF信息与(*,G)的RPF信息不一致时(表明SPT和共享树在此处分离)发送(S,G)RP-bit修剪消息。

PIM SM join 流程:

第一步,接收者A向224.0.0.2(All-Routers)发出IGMP Join消息请求接收多播组G的数据。
第二步,末跳路由器收到该请求消息后,首先查看(*,G)条目是否已经存在,如果已经存在,则只需将收到该请求的接口加入OIL,如果不存在,则先创建(*,G)转发条目,并向指向RP路径上的上游路由器发送(*,G)加入消息。类似的过程在到达RP途经的路由器上依次重复,直到RP或一台已经属于共享树的路由器为止,最后生成一条从RP到末跳路由器的共享树。

PIM SM register 流程:

首先,多播源向组G发送多播消息,首跳路由器收到该组播数据后将其封装在单播形式的注册消息包内发向RP,并在多播路由表内创建(S,G)和(*,G)条目(首跳路由器上注册时已经同时建立了(S,G)和(*,G)表)。RP收到该注册消息后,解出内部的多播数据包沿共享树传递给接收者。


接下来RP沿指向源的方向向上游路由器发送(S,G)加入条目以构建源树,沿途路由器都做类似操作,直到首跳路由器,源树形成,注意首跳路由器已将S0加入(S,G)条目的OIL中。

源树构建完毕后,RP将收到经源树送达的多播数据包,此时同样的多播数据RP将收到两份(另一份封装在注册消息中)收到经源树送达的多播数据包后,RP向首跳路由器发送注册停止消息。

SPT路径上的所有路由器都有两个STATE,(*,G)和 (S,G),因为按照STATE创建原则,一个路由器如果什么STATE的都没有的情况下创建了(S,G),则相应的也会自动创建(*,G)。

此时上图所有路由器STATE分别为:(*,G)代表所有源,(S,G)代表特定源,所以特定源开放的OIL端口,所有源一定会开放。

Ra: (*,G){IIF=S0,OIL=NULL},(S,G){IIF=E0,OIL=S0}  /*RPT树成员,但是没有用户,SG起始位置,指明S在E0上,并有下家*/

Rb: (*,G){IIF=S1,OIL=NULL},(S,G){IIF=S0,OIL=S1}  /*RPT树成员,但是没有用户,SG成员,有下家*/

Rc-RP: (*,G){IIF=NULL,OIL=S1},(S,G){IIF=S3,OIL=S1}  /*RPT树RP,有用户在S1上,SG成员*/

若RP的(*,G)的OIL口为空,即没有用户,则此注册过程将变为RP直接发送REGISTER STOP信息,而不会有上述流程。

若RP所经SPT上还有其他(S,G)成员,则Rb的STATE会变为(*,G){IIF=S1,OIL=E0}和(S,G){IIF=S0,OIL=S1,E0}。根据(*,G)与(S,G)的同步原则,RP的STATE会变为(*,G){IIF=NULL,OIL=S3,S1}和(S,G){IIF=S3,OIL=S1,S3},S3应该被加入(S,G)的OIL,但是S3是(S,G)的Incoming Interface,所以不加入,最后的结果是(S,G)的数据流并不会由RP再转发回Rb。就是说,在RP看来,R2虽然是自己RPT树的成员,但并不是RPT中S的用户树成员,因为RP的STATE中没有分配给S源的面向Rb的接口。而RP中保持S3口为OIL的目的是如果右边还有另一个源,此时Rb就可以直接利用RPT与源通信,而RP上不需任何改变。

PIM SM CUTOVER举例:
经共享树到达的多播流量超过SPT-Threshold(阈值)时,末跳路由器将会沿到达源的路径向上游路由器发送(S,G)加入消息以构建从源直接到接收者的SPT,这个消息一路传递一直到源。从源到接收者的SPT形成后,末跳路由器向RP发送(S,G)RP-bit剪裁消息,通知RP停止通过共享树向其转发(S,G)数据流。

若RPT树的叶子上没有客户了,它会发送(*,G) RPUNE给RP,告知自己没有客户,可以离开RPT树,下次不用发给它了。

若它既是RPT又是SPT成员,则先向RPT树的RP发送(*,G) RPUNE离开RPT树队列,再准备发(S,G) RPUNE离开SPT队列(只有接收到SPT发来的组播包的时候,才会回复PRUNE),如果这期间S没有发送数据包,则三分钟后STATE刷掉。

Advertisements