其他分享
首页 > 其他分享> > PIM-SM基础原理:共享树的建立、源注册、共享树向源树的切换

PIM-SM基础原理:共享树的建立、源注册、共享树向源树的切换

作者:互联网

共享树

共享树的概念

共享树(shared tree/RP Tree)中无论组播组的源是什么,都有一个共同的根。所有这些树的共享根被称为RP(集合点)。在共享树中,我们会看到(*,G),因为并不关心源,星号代表任何源。所有的流量从源发送到RP,然后数据沿着共享树到达接收者。

共享树的建立

当PIM-SM路由器收到组播组G的IGMP membership report,它检查是否创建了对应的(*, G)。如果有了,则把收到membership report的接口加入到OIL(outgoing interface list,出接口列表)中;如果没有,则建立(*, G),把收到membership report的接口加入到OIL中。查找group-RP映射表,找到对应的RP,查找单播路由表,得知到RP的RPF接口。然后向RP的方向发送(*,G) join消息。

上游路由器收到join消息。

  1. 如果它不是RP,也不在共享树上,即其上没有(*, G),则创建(*, G),然后将收到消息的接口加入到OIL中。然后向上游路由器发送join消息。
  2. 如果它不是RP,但是已经在共享树上了,即其上有(*, G),则将收到消息的接口加入到OIL中。
  3. 如果它是RP,但是其上还没有(*, G),则创建(*,G),然后将收到消息的接口加入到OIL中。
  4. 如果它是RP,而且其上已经有了(*, G),则将收到消息的接口加入到OIL。

注意:因为RP是共享树的根,所以RP上(*,G)的入接口是空。

注意:一个多播组对应一棵共享树。

共享树的维护

共享树建立好之后,路由器要周期性(每隔60s)的向上游发送join消息,如果180s都没有收到下游的join消息,则将到下游路由器的接口从OIL中删除,即剪枝。

如果(*,G)出接口列表为空,则表项置为P,并且向上游接口发送(*,G)prune消息,上游则把它从OIL中删除。此时如果上游路由器(*,G)OIL也为空,则继续向其上游发送(*,G)prune消息。

源注册

数据源将数据发送给DR,DR将数据封装到register报文里单播发送到RP。RP收到register报文之后,解封装之后将里面的数据从(*, G)路由表中OIL中所有接口发送出去。同时,根据register报文的源地址得知源地址S,创建转发表(S, G),将到达数据源S的RPF接口作为IIF(Incoming interface,入接口),拷贝(*, G)表项的OIL作为(S, G)的OIL。然后,向S的方向发送(S,G) join消息。

注意:即使(S,G)的OIL为空,也需要发送(S,G)join,否则源和RP之间的的路由器上可能就没有组播表项了。

当和数据源直接相连的DR路由器收到下游的join消息之后,从源到RP的源树就建好了。之后,RP会收到两份同样的数据,一份经过register封装,另一份没有经过register封装。但是RP只会转出一份报文给接收者。这个时候RP会向数据源直接相连的DR路由器发送register-stop消息。这样数据不再经过register封装,而是通过源树发送给RP。

如果没有receiver,则RP不会向S的DR发送join消息,而只是发送register stop给S的DR,这样S的DR就不会向RP发送无人接收的组播数据了。

 

如果源树建立后,OIL变为空了,则RP向上游发送(S,G)prune。之后表项标志变成P。

 

当DR收到register stop时,Register-Suppression timer置0,当Register-Suppression timer超时(缺省60s超时)后继续发register报文,在这个定时器超时之前,DR会发送register报文,里面没封装包,null-register bit标志置1,如果此消息触发了一个register-stop报文,则Register-Suppression timer重置为0。为什么这样呢?因为可能有新的receiver加入这个多播组,但是这个新的receiver没有和SPT相连,所以这个receiver需要向RP要数据,这样RP就不再向S的DR回复register stop了,则S的DR就持续向RP发送register报文,然后新的receiver就可以收到数据了。

 

如果RP1是G1的RP,那么只要G1仍然存在,RP1上的(*, G1)就不会删除。如何知道G1存在?收到了S的DR发送的register消息则说明G1仍然存在。

(*, G) vs (S, G)

既有(*, G) 又有(S, G)时,使用(S, G)转发组播数据。

注意:

如果(S, G)SPT bit置0,表明SPT还没有建好,依然通过(*, G)转发数据。

共享树向源树的切换

源树的概念

源树(source-specific tree)也称为最短路径树(SPT,Shortest Path Tree),它是一颗从树根(源)到树叶(接收者)的最短路径构成的树。(S, G)代表一对源(单播)地址和组(组播)地址。每一个源树都用(S, G)标识,例如(50.168.1.1, 225.1.1.1)。

共享树向源树的切换

切换原因:

减轻RP负担;提高传输效率。

切换发生的位置:

由最后一跳路由器发起,所以切换条件是在最后一跳路由器上配置的,在接收者和数据源之间的最短路径上进行。

切换的条件:

每秒流量大于 threshold,从RPT切换到SPT。当流量小于threshold时,从SPT切换回RPT。

切换过程:

尾跳路由器建立转发项(S, G),copy (*, G)的OIL。然后,查找源方向的RPF接口,发送(S, G) join。此时路由器上(S, G)、(*, G)同时存在,在没有从(S, G)IIF接收到数据前,(S, G)的SPT bit置0,表明SPT还没有建好,依然通过(*, G)转发数据。

尾跳路由器向源发送join消息,上游路由器有2种情况:

1)没有(S, G),则建立(S, G),把收到join消息的接口加入OIL,向源的方向发送join消息。

2)有(S, G),则只把收到加入消息的接口加入OIL。

这个过程一直延续到源。当SPT建立好后,尾跳路由器会从(*, G)和(S, G)收到两份同样的数据。这时,尾跳路由器向RP方向发送(S, G) RPT位置位的prune消息。需要注意的是尾跳、上游路由器及RP上的(*, G)不受影响,否则将无法接收来组G中自其他数据源的数据。这里需要说明的是实际中尾跳路由器不一定会发送(S, G) RPT prune,除非尾跳路由器的RPT和SPT分离了,即(S,G)和(*,G)的RPF邻居不同。SPT路径上谁的RPT和SPT分离了,谁向上游发送(S, G) RPT prune。

上游收到下游向RP发来的发送(S, G) RPT位置位的prune消息时:

  1)如果上游的路由器有(S, G),则把收到剪枝消息的接口从OIL中删除。

  2)如果没有(S, G),则创建(S, G),copy(*, G)的OIL,然后把收到剪枝消息的那个接口删除。因为这个(S,G)表项是对共享树有用,所以根据RP的地址计算入口和RPF邻居。这样原本通过共享树转发下来的数据,进行转发时会匹配有prune标志的(S,G)表,这样就保证数据不会从共享树发送下来。

  3)(*,G)表项不受影响。

上游路由器继续向上游发送(S,G,RPT) prune。

源树的维护

源树需要数据触发建立,也需要数据来维护,210s没有相应数据,(S,G)表项会被删除。

(S,G)出口需要通过join来维护,如果路由器发现(S,G)和(*,G)的RPF邻居相同,则只发送(*,G)join,如果不同,则分别发送(S,G)和(*,G)join。

如果(S,G)OIL为空时,并不立即出发(S,G)prune,只有当有对应的数据到达时,才向上游发送(S,G)prune。

标签:OIL,RP,PIM,register,发送,树向源,join,共享,路由器
来源: https://blog.csdn.net/jxzdsw/article/details/114323322