本发明属于通信技术领域,更进一步涉及互联网通信技术领域中的一种基于流媒体直播系统的对等网络p2p(peertopeer)构建方法。本发明提出的网络构建方法用于流媒体直播系统中流媒体数据的分发。
背景技术:
相比于传统的c/s(客户端/服务器)模式,p2p模式的显著特点是:每个节点在网络中具有相同的地位,在接受其他节点服务的同时,也向其他节点提供服务。流媒体直播系统采用p2p模式,可以有效减小服务器的压力,降低运营成本。
p2p网络按照有无固定拓扑结构,可以分为两类:结构化(structured)的p2p网络统和非结构化(unstructured)的p2p网络。在结构化p2p网络中,节点之间有稳定的父子关系,相对靠近内容源的父节点将媒体流直接推送给子节点。由于预先有比较明确的数据传输路径,这类系统具有时延小的优点,缺点是在节点频繁加入/退出的环境下需要大量的信令开销用以维持拓扑,对动态环境的适应性不好。在非结构化p2p网络中,每个节点以一部分节点作为邻居,邻居节点之间互相通告自己持有的内容,如果邻居节点持有的内容是自己需要的,就显式地请求该内容。每个节点都有多个能获取流媒体数据的邻居,即使某个邻居退出,也不会过多的影响它的播放质量,因此这类系统对节点频繁加入/退出的环境具有很强的适应性,而它的缺点是每次获取数据前需主动向邻居请求,相比于结构化系统,具有较大的时延。
z.jianming,y.nianmin,c.shaobin,l.xiang在其发表的论文“tree-meshbasedp2pstreamingdatadistributionscheme”(knowledgediscoveryanddataminingadvancesinintelligentandsoftcomputing,vol.135,pp77-83,2012)提出一种混合结构p2p的组网方法。该方法综合了基于分发树的结构化网络和基于网的非结构化网络,其关键在于为节点划分自治域,位于同一自治域的节点组成分发树,不同自治域之间的节点组成网状结构,分发树内的节点采用推的方式转发数据,而不同自治域间节点之间采用拉的方式转发数据。这种方法在降低数据传输时延的同时也解决了因节点频繁加入/退出造成的性能下降问题。但是,该方法仍然存在的不足之处是,不同自治域之间节点基于网状结构,采用拉的方式获取数据,依然存在着较大的时延。
北京邮电大学在其申请的专利文献“基于网状结构的树形cdn-p2p融合网络架构及方法”(公开号cn104660677a,申请号201510021631.6)公开了一种基于网状结构的树形cdn-p2p融合网络架构及方法。该方法利用内容分发网络cdn服务器构成系统的主干网络,每个内容分发网络cdn服务器向网络中的一部分节点提供流媒体数据,节点之间以p2p的方式构成边缘网络,在整体保持树状网络拓扑的前提下,上下层的节点之间形成网格结构。该方法能够将流媒体服务器的内容迅速分发到网络边缘,减小在主干网络中的传输时延。但是,该方法仍然存在的不足之处是,单个内容分发网络cdn服务器的的负载过高,导致较大的成本开销。
技术实现要素:
本发明的目的在于克服上述现有技术的不足,提出一种基于流媒体直播系统的p2p网络构建方法。本发明针对流媒体直播系统的低时延要求的特点,考虑到p2p网络的结构特点,同时充分利用加入流媒体直播系统节点的上传带宽信息,来减少流媒体数据在节点间的传输时延。
本发明实现上述目的的具体思路是,根据节点的上传带宽大小将节点划分不同的层次,上传带宽越大的节点越靠近直播源,对应层次标号越小。从节点层次的角度观察,整个系统构成一棵直播树,加速流媒体数据在节点间的传输;每层内部的节点之间形成网状结构,能够适应节点频繁加入/退出的环境。
本发明实现上述目的的步骤包括如下:
(1)初始化系统参数:
(1a)将待加入系统节点的获取流媒体数据的节点个数的下限和上限分别初始化为2和10;
(1b)将流媒体数据块的大小初始化为一个视频帧的大小;
(2)节点发出请求:
(2a)为流媒体直播系统提供直播节目的内容源节点,向流媒体直播系统发出成为直播源的请求;
(2b)从流媒体直播系统获取直播节目的普通节点,向流媒体直播系统发出成为接收者的请求;
(3)响应内容源节点的请求:
(3a)流媒体直播系统将接收到的请求中的直播节目信息添加到直播节目列表中;
(3b)流媒体直播系统将接收到的请求中的内容源节点信息添加到已注册节点列表中;
(3c)流媒体直播系统利用提供流媒体数据节点数计算公式,计算内容源节点最多能提供流媒体数据的节点数;
(4)判断已注册节点列表中是否存有当前普通节点,若有,则执行步骤(6),否则,执行步骤(5);
(5)响应当前普通节点的请求:
(5a)流媒体直播系统将请求中的当前普通节点信息添加到已注册节点列表中;
(5b)流媒体直播系统向当前普通节点发送直播节目列表;
(5c)流媒体直播系统利用提供流媒体数据节点数计算公式,计算当前普通节点最多能提供流媒体数据的节点数;
(5d)流媒体直播系统利用获取流媒体数据节点数计算公式,计算当前普通节点最多能获取流媒体数据的节点数;
(6)分配提供流媒体数据的节点:
(6a)将已注册节点列表中的所有节点划分层次,将内容源节点作为第0层,将提供流媒体数据节点个数最大的普通节点作为第1层,将提供流媒体数据节点个数第二大的普通节点作为第2层,依此把所有的节点排列成n层;
(6b)建立一个用来存放为当前普通节点提供流媒体数据的节点集合m,将节点集合初始化为空,将当前层次初始化为0;
(6c)建立一个用来存放当前层次节点的集合n;
(6d)寻找该层次中提供流媒体数据的节点数未达到最大值的所有节点,将找到的所有节点存到节点集合n中;
(6e)判断节点集合n是否为空,若是,将当前层次数加1后执行步骤(6h),否则,执行步骤(6f);
(6f)从节点集合n中移出任意一个节点存到节点集合m中;
(6g)判断节点集合m中节点的个数是等于集合上限,若是,则执行步骤(9),否则,执行步骤(6e);
(6h)判断当前层次的值是否大于当前节点所在层数,若是,则执行步骤(7),否则执行步骤(6d);
(7)判断节点集合m中的节点个数是否小于2,若是,则执行步骤(8),否则,执行步骤(9):
(8)调整已注册节点的邻居关系:
(8a)建立一个用来存放节点对的节点对集合z,将集合初始化为空;
(8b)将当前层次赋值为当前节点所在的层数;
(8c)寻找当前层次中提供流媒体数据的节点中存在层数大于当前节点所在层数的所有节点,将找到的每一个节点和它的任意一个获取流媒体数据的节点组成的节点对存到节点对集合z中;
(8d)判断节点对集合z是否为空,若是,则将当前层次减1后执行步骤(8g),否则,执行步骤(8e);
(8e)从节点对集合z中取出任意一个节点对,将所取出的节点对中提供流媒体数据的节点存到节点集合m中,将当前节点变成为节点对中另一个节点提供流媒体数据的节点,断开节点对中两个节点的联系;
(8f)判断节点集合m中的节点个数是否为2,若是,则执行步骤(9),否则执行步骤(8d);
(8g)判断当前层次是否小于0,若是,则执行步骤(9),否则执行(8c);
(9)完成p2p网络的构建:
将节点集合m中的节点变成当前普通节点获取流媒体数据的节点,将当前普通节点加入基于流媒体直播系统的p2p网络。
本发明与现有技术相比具有以下优点:
第1,本发明充分考虑流媒体直播系统的特点,利用加入流媒体直播系统节点的上传带宽信息,将已注册的节点划分层次,使得上传带宽越大的节点越靠近直播源,克服了现有技术流媒体数据从直播源到达节点的时延较大的问题,使得本发明具有了流媒体数据从直播源到达节点的时延较小的优点。
第2,本发明合理利用每个节点上传带宽的最大值,使每个节点下载数据的同时,根据自己上传带宽的上限,尽最大能力为其他节点转发流媒体数据,分担服务器的压力,克服了现有技术服务器负载过高,造成较大成本开销的问题,使得本发明具有低服务器负载,部署成本低的优点。
附图说明
图1是本发明的流程图;
图2是本发明为节点分配提供流媒体数据的节点的流程图;
图3是本发明调整已注册节点的邻居关系的流程图。
具体实施方式
下面结合附图对本发明作进一步的详细描述。
参照附图1,本发明的具体步骤详细描述如下。
步骤1,初始化系统参数。
将待加入系统节点的获取流媒体数据的节点个数的下限和上限分别初始化为2和10。
将流媒体数据块的大小初始化为一个视频帧的大小。
步骤2,节点发出请求。
为流媒体直播系统提供直播节目的内容源节点,向流媒体直播系统发出成为直播源的请求。
从流媒体直播系统获取直播节目的普通节点,向流媒体直播系统发出成为接收者的请求。
步骤3,响应内容源节点的请求。
流媒体直播系统将接收到的的请求中的直播节目信息添加到直播节目列表中,这个列表供待加入的普通节点选择系统能够提供的节目,选择直播节目也就是选择能提供该直播节目的内容源节点。
流媒体直播系统将请求中包含的内容源节点信息添加到已注册节点列表中。
利用提供流媒体数据节点数计算公式,计算内容源节点最多能提供流媒体数据的节点数。所述的节点数计算公式如下:
其中,p表示根据自身上传带宽的大小,节点最多能提供流媒体数据的节点数,u表示节点上传带宽的大小,c表示流媒体数据块的大小。
步骤4,判断已注册节点列表中是否存有当前普通节点,即当前节点是不是第一次发出请求。若有,则执行步骤6,否则,执行步骤5。
步骤5,响应当前普通节点的请求。
流媒体直播系统将发出请求的当前普通节点添加到已注册节点列表中。
流媒体直播系统向当前普通节点发送直播节目列表,当普通节点根据直播节目列表做出选择后,会再次向系统发出请求,请求中携带有内容源节点的信息。
利用提供流媒体数据节点数计算公式,计算当前普通节点最多能提供流媒体数据的节点数。所述的节点数计算公式如下:
其中,p表示根据自身上传带宽的大小,节点最多能提供流媒体数据的节点数,u表示节点上传带宽的大小,c表示流媒体数据块的大小。
利用获取流媒体数据节点数计算公式,计算当前普通节点最多能获取流媒体数据的节点数。所述的节点数计算公式如下:
其中,a表示根据自身下载带宽的大小,当前普通节点最多能获取流媒体数据的节点数,d表示节点下载带宽的大小,c表示流媒体数据块的大小。
步骤6,分配提供流媒体数据的节点。
参照附图2,对分配提供流媒体数据的节点的过程进行详细描述。
第一步,划分节点层次。
将已注册节点列表中的所有节点划分层次,将内容源节点作为第0层,将提供流媒体数据节点个数最大的普通节点作为第1层,将提供流媒体数据节点个数第二大的普通节点作为第2层,依此把所有的节点排列成n层。划分层次的结果使得具有较大的上传带宽的节点更靠近内容源,能够为更多的节点迅速转发流媒体数据。
第二步,初始化。
建立一个用来存放为当前普通节点提供流媒体数据的节点集合m,将节点集合初始化为空,定义当前层次为正在操作的层次,将当前层次初始化为0。建立一个用来存放当前层次中,提供流媒体数据的节点数未达到最大值的节点的集合n。
第三步,寻找符合条件的节点。
遍历当前层次的节点,寻找该层中提供流媒体数据的节点数未达到最大值,即具有剩余服务能力的所有节点,将找到的所有节点存到集合n中。
第四步,判断该层是否有符合条件的节点。
判断集合n是否为空,若是,则执行第六步,否则,执行第五步。
第五步,移动节点。
从集合n中移出任意一个节点存到集合m中。
第六步,检查集合m的节点个数。
判断集合m中节点的个数是等于集合上限,若是,则执行步骤9,否则,执行第四步。所述的集合上限为节点集合m能存放节点个数的最大值,节点上限的值为该节点多能获取流媒体数据的节点数和10之间的最小值。集合上限存在的意义在于,避免因为节点下载带宽太小导致为它提供流媒体数据的节点数量过少,影响播放流媒体性能;也不因为节点下载带宽太大导致为它提供流媒体数据的节点数量过多,造成节点的冗余。
第六步,遍历下一层节点。
将当前层次数加1,准备遍历下一层的节点。
第七步,检查当前层数。
因为为当前节点寻找节点只在上传带宽大于它的节点中进行,因此,判断当前层次的值是否大于当前节点所在层数,若是,则执行步骤7,否则执行第三步。
步骤7,判断集合m中的节点个数是否小于2,若是,则执行步骤8,否则,执行步骤9。
步骤8,调整已注册节点的邻居关系。
参照附图3,对调整已注册节点的邻居关系的过程进行详细描述。
第一步,初始化。
建立一个用来存放节点对的集合z,将集合初始化为空。将当前层次赋值为当前节点所在的层数。
第二步,寻找符合条件的节点对。
遍历当前层次的节点,寻找该层中提供流媒体数据的节点中存在层数大于当前节点所在层数的所有节点。从层次的角度看,就是提供流媒体数据的节点和获取流媒体数据的节点分列当前节点两侧。将找到的每一个节点和它的任意一个获取流媒体数据的节点组成的节点对存到集合z中。
第三步,判断该层是否有符合条件的节点对。
判断集合z是否为空,若是,则将当前层次减1后执行第六步,否则,执行步骤第四步。
第四步,调整节点对的邻居关系。
从集合z中取出任意一个节点对,将所取出的节点对中提供流媒体数据的节点存到集合m中,将当前节点变成为节点对中另一个节点提供流媒体数据的节点断开节点对中两个节点的联系。这样做的结果使得当前节点获取流媒体数据的节点个数增加1,而又减少其他节点获取流媒体数据节点的个数。
第五步,检查集合m的节点个数。
判断集合m中的节点个数是否为2,若是,则执行步骤9,否则执行第三步。
第六步,检查当前层数。
判断当前层次是否小于0,若是,则执行步骤9,否则执行第二步。
步骤9,完成p2p网络的构建。
将集合m中的节点变成当前普通节点获取流媒体数据的节点,将当前普通节点加入基于流媒体直播系统的p2p网络。