ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-12 12:58:01  阅读:342  来源: 互联网

标签:OIL RP PIM register 发送 树向源 join 共享 路由器


共享树

共享树的概念

共享树(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有