基于不定叉树的应用层组播协议

来源:互联网 发布:网络套现平台如何举报 编辑:程序博客网 时间:2024/05/01 11:12

1  概述

    自应用层组播的概念提出以来,已有很多各具特点的解决方案被提出。各个不同的应用层组播系统具有不同的设计目标及系统结构。如,ESM(End-System Multicast)[1]和ALMI[2]适合时延要求不高的小规模多对多通信,而Scattercast[3]和Overcasts[4]则支持大规模的数据递送系统。
在系统结构方面,根据建立应用层组播拓扑结构时采用的方案,将这些系统分为两种:网优先(Mesh First)和树优先(TreeFirst),网优先的系统会首先为覆盖节点建立一个网状的拓扑结构,然后按照某种路由协议来生成数据路由树,如ESM的Narada协议,会先构建一个网,然后通过修改后的DVMRP协议完成路由树的生成;而树优先的系统则是直接建立数据路由树,ALMI、 Overcast、 HostMulticastis[5]均属于这种系统。一般来说,网优先的系统稳定性更好,不会形成回路,树优先的系统则在效率上占优势。
    在多源的应用层组播方案中,根据数据路由树的使用和维持,可以分为Shared Tree和Source-specificTree两种。Shared Tree,就是所有的源使用同一棵树;Source-specificTree,就是每个源维持一棵树,前者不能保证每个源都能获得较好的传输延迟。
    本协议根据视频会议系统的应用特点,采用效率较高的树优先的拓扑结构,使用Source-specificTree数据路由树策略。树的生成、维持由根(源)负责,集中点(RP)不参与,这点类似Host Multicast的做法,HostMulticast是分布的方式,每个组的数据路由树都有一个根节点,每个新的组成员加入时,都要从该根节点开始依次协商,直到找到一个距离最近的节点为止。

2  基于不定叉树的应用层组播协议

2.1 协议设计思想

    我们的思路是,建立一个全分布的,支持多组、多源,低时延的,基于不定叉源指定树(Source-specific Tree)的Tree-First应用层组播协议平台。
   由于目前Internet终端多数是以xDSL方式接入的,考虑到这些终端具有的极限带宽是上传512kbps(部分是1Mbps),下载5Mbps(其余接入方式的终端一般具有更高的带宽),假定每个源每秒产生的实时数据流量为150kbps(如视频会议),按照90%极限上传带宽的可利用率,一个节点可以为3个节点实现分发任务;再假定组的规模控制在100个节点内,如果按照三叉树的组织结构,这样的树将不超过4层,经过4个节点的转发,其时延基本可以控制在5秒内。
    基于以上的假设,我们将在组应用开始前建立n棵Source-specificTree,n等于组的节点数,每个节点负责生成一棵以它为根的满三叉树。我们又知道,有的节点的上传能力可能不到3个,有的节点则可能超过3个,而且这种能力可能是变动的。由此,这些树必须根据网络的实际状态进行调整,节点的分发孩子个数视其能力变动而定,分发能力的判断,则通过孩子节点反馈RTCP信息包来计算丢包率。也就是说,满三叉树在应用预运行或运行后成为动态调整的不定叉树。

2.2 节点加入

    节点必须清楚自己属于哪个组,然后加入到合适的组中。
    RP(集中点)为节点提供加入服务。任一个节点加入时,必须向RP报到,RP将新节点加入到组的节点列表中,然后将已加入的节点列表发给新节点,同时,向所有节点通告单个节点加入消息。

2.3 满三叉树的生成

2.3.1 “距离”与“距离”计算
    节点一旦成功加入,马上与列表中的同组节点通信,估算节点之间的“距离”。所谓的“距离”,指的是节点间的传输延迟和带宽加权后的值,我们采取简单做法,就是测试1K UDP包来回所需的时间。我们采取如下算法计算NodeA和NodeB节点间的“距离”:
TimeAS= Current Time of NodeA
NodeA Send 1K bytes to NodeB by UDP with TimeAS
NodeB Recvive packet from NodeA
TimeBR= Time when NodeB Recvives the packet
TimeBS= Current Time of NodeB
NodeB Send 1K bytes to A by UDP with TimeAS, TimeBR and TimeBS
Node A Recvive packet from NodeB
TimeAR= Time when NodeA Recvives the packet
DistanceAB=TimeAR- TimeAS- (TimeBS -TimeBR)
 2.3.2  树生成
    开始时,每个源生成一棵不超过4层(源,即根,为0层)的满三叉数据路由树,树的生成依据这样的原则,在树中,离源较近的节点与源有更近的“距离”,而第2层的节点即与其第1层的父亲节点有更近的“距离” ,依此类推。
    首先,根选择3个最合适的节点作为它的第一层子节点,然后,根分别通知这3个子节点,去寻找它们合适的孩子节点,过程不断重复,直到所有的节点都加入到树中。树的生成是由覆盖网中的所有节点协同完成的,因此其生成算法是分布的,算法如下:
OnReceiveCreateTree (void *packet){
//根收到建树命令,每个节点都需要生成一棵以其为根的树
    按”距离”大小选择3个孩子节点;
    向选择好的节点发送邀请其成为我的孩子节点的请求包(以’我’为根的树);
}
OnReceiveInviteTobeChildReq(void * packet){//收到i邀请为其孩子的请求(j为根的树)
    if(我还没加入到以j为根的树)发送接受邀请的回应包;
    else发送拒绝邀请的回应包;
}
OnReceiveToBeChildReply(void * packet){//收到节点i对我邀请的回应(j为根的树)
if(i接受我的邀请){
   将i置为 以j为根的树中的’我’的孩子;
   将i加入到本地以j为根的树已入树节点列表;
   if(我是j)修改树结构;//根维持整棵树的结构描述,树生成后,分发给所有孩子
}
else {
   将i加入到本地在建以j为根的树中拒绝我的节点列表;
   if(重新选择一个节点成功)
      向被选择的节点发送邀请其成为我的孩子节点的请求包(以j为根的树);
}
if( (孩子数==3 ) || (已入树节点数+拒绝我的节点数==组节点数)){// 以j为根的树
  if((我是j){
      将孩子节点列表打包;
      向被选中的孩子节点发送选择孩子的命令;
  }
else
将孩子节点列表打包,发送给根;
        }
   }
OnReceiveSelectChildrenOrder(void * packet){//收到根的选择孩子节点的命令
   将包中已入树的节点列表复制到本地;
   for(int i=0; i<3;i++){
      if(选择一个节点成功)向其发送邀请其成为孩子的请求;
      else break;
   }
}
    树生成的算法是由分布在网络上的多个节点机共同执行的,为避免多个节点同时选择一个节点为其孩子,因此,我们采用了应答制。

2.4 性能优化--不定叉树的调整

    前面讲到,在生成树时,并没有过多考虑树的上传能力,只是基于经验及网络的一般现状,假设每节点有能力完成对3个节点的视音频数据转发。但,实际情况可能是,有的节点的分发能力超过3,有的节点则不足3。这样,在应用预运行后,必须尽快对树进行调整。
   我们使用UDP协议进行应用数据的传输,父亲在向孩子节点发送应用数据包时,统计单位时间已向孩子节点发送了多少数据包,每隔3秒钟,孩子节点向父亲发送一个RTCP包,告诉父亲,最近3秒,已接收其发送的数据包数量,父亲节点据此计算单链路的丢包率,并根据所有链路的丢包率,结合帧率,估算其带宽,然后通告带宽。为将问题简单化,并基于Internet现状(xDSL节点是上传能力不足,非下载能力不足),我们规定,当一定时间内,丢包率超过一定程度时,总假定是父亲节点上传能力不足。
   当父亲节点认为其上传能力不足时,希望移交孩子节点,父亲节点会选择带宽较高的节点发送移交请求。收到移交请求的节点检查其自身上传能力,回应接受请求或不接受请求,发送移交请求的节点会一直尝试,直到有节点同意移交,此外,上传能力不足的节点可以启用选帧,降低对带宽的需求,这属于应用层QoS的任务,不在这里详述。
   目前多数的ALM协议,对底层网络变动的适应普遍采取整体变动的方法,这样的代价相当大,如NARADA,节点状态的变化将导致网Mesh的重构,从而导致所有source-specific Tree的重构,这个过程需要较长的收敛时间。我们采取局部变化的对策以适应overlayNetwork的变化。


图1 节点转移实现优化

2.5 树的修补

    有边相连的节点,互相为邻居。节点每3秒钟向邻居发送“心跳”信息。“心跳”信息可以简单到是一个不断增长的序列号。当节点在30秒钟收不到邻居的“心跳”信息后,节点认为邻居已经出现故障。
    故障处理:
    1). 为避免多个节点同时尝试修补树,我们规定,只允许上层节点对下层节点进行修补。如果根节点故障,树的修补失去意义。
    2). 后备选择
    从故障节点的最左边的子孙节点逐级往上提升,最左的节点不存在,则往右选择。
    3). 叶子节点故障将不修补。
    4). 树修补算法
    如图2:
   i发现其儿子节点j故障后,执行如下算法:
    1.  向组内所有节点通告j的故障
    2.  j是叶子节点吗?
    2.1 是,算法结束
    2.2 否,转3
    3.  j有合适的孩子吗?
    3.1 有,转4
    3.2 没有,算法结束
    4. 选择合适的孩子,向其发送接替j的通知
    5.  T:=j      

                       
图2树的修补
    任何节点k收到l发送给自己,要求自己接替节点j的通知,执行如下算法:
    1. k是否叶子
    1.1 是,向l发送j ßk、kß0的通知
    1.2 否,选择合适的儿子,向其发送接替k的通知,T:=j,T1:=l
 
    任何节点k收到确认接替的通知,执行如下算法:
    1. 接替串的第一个节点是自己吗?
    1.1 是,接替串 := Tßk+接替串,向T1发送接替串
    1.2 否,根据接替串替换树,将新树向所有节点发送

3  性能测试


4  小结及下一步工作

    本协议适合小规模、时延要求高的应用层组播系统,我们在协议的基础上开发了一个视频会议系统,经试验,在网络状态变动不是太频繁的前提下,系统能很好工作。
协议对很多复杂问题做了简化,这些简化对协议的实现带来很大的便利,但同时也使得协议的适应能力存在着一定的问题,我们将在树的优化、修补上进行改造,以使得协议具有更广阔的适应能力。

参考文献

1 Chu Y, Rao S, Zhang H. A Case for End System Multicast. ACM SIGMETRICS, 2000
2 Pendarakis D. ALMI: An Application Level Multicast Infrastructure 3rd USNIX Symp. Internet Tech. and Sys., 2001-03
3 Chawathe Y. Scattercast: An Architecture for Internet Broadcast Distribution as an Infrastructure Service[Ph.D.Thesis].2000
4 Jannot J.Overcast: Reliable Multicasting with An Overlay Network.USENIX OSDI, 2000-10

本文引自:http://www.ahcit.com/lanmuyd.asp?id=2194

原创粉丝点击