一种公平性好效率高的多链路数据传输方法

文档序号:7770341阅读:191来源:国知局
专利名称:一种公平性好效率高的多链路数据传输方法
技术领域
本发明属于网络通信技术领域,具体来说涉及一种公平性好效率高的多链路数据传输方法。
背景技术
互联网发展迅速,许多中小型企事业单位采用租用链路的方式传输数据或接入因特网。随着数据业务量的增长和对服务质量要求的提高,现有的带宽常显不够,带宽争用也使得单条链路可靠性降低。例如目前电信企业提供的链路通常是El速率(2. 048Mbp/s),当快速增长的企业数据业务要求比El更高的带宽时,电信企业并没有好的办法解决这个矛盾,因为能够提供更高带宽的标准是E3线路(34Mbps)。但是,这种线路不但昂贵,而且企业要求的带宽往往远远低于E3可以提供的带宽,如果租用,将导致链路不能充分使用,造成资源和资金的浪费,然而很少有电信企业能够提供处于El和E3之间的带宽。这种情况下,为了保护已有的投资,并考虑租用链路的价格因素,采用多链路数据传输是一种解决问题的有效方法,即在原有链路的基础上增加通向同一 ISP ( Internet Service Provider, 因特网服务供应商)的链路,通过两条或多条链路来传输数据,并均衡链路之间的负载以提高带宽的利用率,达到以较低的成本提高网络系统的带宽、可靠性和灵活性。多链路数据传输又称为负载分担(Load sharing)或反向复用(Inverse multiplexing),常用于计算机网络中,如多链路点对点协议MLPPP (Point-to-Point Multilink Protocol,RFC 1990)就是其中的典型代表。PPP最初是作为在点到点链路上进行IP通信的封装协议,它定义了 IP地址的分配和管理、封装、网络协议复用、链路配置、链路质量测试、错误检测等标准,以及网络层地址协议和数据压缩协议等可选协议标准。PPP 的动态地址协商机制和认证机制,为客户提供了大规模拨号上网的解决方案。同时PPP在虚拟专用网络(VPN)和虚拟专用拨号网络(VPDN)中也发挥了极大的作用,PPP配合第2层传输协议(L2TP)建立起由终端企业用户到企业网关之间的协商和认证机制,有效地保证了私有网络的安全性。随着网络通信速率的提高,单一的PPP链路已经不能满足需要,于是产生了多链路PPP,其目的是利用一对系统间物理上的多条链路提供更高的带宽。多链路的分配机制是把一个大的分组分成若干小的分组,同时在各个物理链路上传输,或对于小的分组不进行分片,而是在多个链路上轮流发送,以达到加快传输速率的目的。但是,如果只是简单地将数据分配在多个通道上传送,这样来实现多链路会带来一些问题,数据会错序,接收方无法重组数据以得到正确的报文。因此MLPPP在数据包前添加了 4字节的排序标识来控制顺序,并采用了简单的同步规则,这就允许将数据分配在并行的通道上传输,并在接收方以正确的顺序重组。多链路数据传输需要解决的另一个问题就是链路使用的公平性问题,即链路之间的负载均衡。对于从网络层收到的下行数据,多链路模块要在各子链路中轮询发送数据,但 RFC1990并没有对多链路PPP的报文调度提供具体的规定,仅提出了两种简单的轮询发送方法(1)对于收到的上层数据报文,简单轮询所有子链路,找到一条非阻塞链路发送,若报文长度超过该子链路的最大传输单元,则按最大传输单元进行分片,若报文长度小于该子链路的最大传输单元,则不分片而直接传输。很显然,当系统处于轻负载的情况下,这种方法使用的仅是部分链路的带宽,不能充分利用多链路提供的带宽。(2)对于收到的上层数据报文,轮询所有子链路,找到所有非阻塞链路,把数据报文在所有这些非阻塞子链路上分片,各片段的大小可以不同,与各个子链路的速率成正比。这种方法可以充分利用多链路的带宽,但在系统负载很重的情况下,简单地在所有的非阻塞链路上分片,将导致报文重组时延过长,接收端缓冲区占用过大,而且一旦发生这种状况,性能很难恢复,因此,在重负载下报文传输速率并不一定能得到提高。由此可见,多链路PPP需要增加额外的开销来解决发送端和接收端的数据顺序问题,另外,报文重组也会增加数据传输的时延;另一方面,对于链路间的负载均衡,多链路 PPP只提出了简单的轮询发送方法,不能充分利用多链路提供的带宽,还可能造成报文重组时延过长、接收端缓冲区占用过大等问题。

发明内容
为了解决多链路数据传输存在的上述技术问题,本发明提供一种公平性好效率高的多链路数据传输方法。在发送端和接收端之间有两条或两条以上的链路,在发送端实现负载分担,而在接收端实现的是列队调度,并得到与发送端顺序一致的数据分组序列。本发明解决上述技术问题的技术方案包括以下步骤 其中发送端的步骤为
(1)发送端对负载分担模块进行初始化,包括发送端活动链路列表、发送端访问链路计数器赋初值0、给发送端使用的每条链路的P值赋初值0 ;
(2)数据分组进入发送端数据请求发送队列,如果数据请求发送队列为空,则负载分担模块进入等待数据分组到达的状态,否则,继续;判断访问链路计数器是否为0,如果是,继续;否则,执行步骤(5);
(3)将发送端活动链路列表中每条链路的字节数计数器置为0;
(4)将发送端活动链路的条数置于访问链路计数器;
(5)从数据请求发送队列中提取一个数据分组,将数据分组从活动链路列表中的第一条链路发送出去,将所发送出去分组的字节数累加到所述链路的字节数计数器;
(6)判断所选链路的P值减去所述链路的字节数计数器值是否大于0,如果是,继续;否则,执行步骤(9);
(7)判断数据请求发送队列是否为空,如果是,执行步骤(2);否则,继续;
(8)继续从数据请求发送队列中提取一个数据分组从所选择的链路上发送出去;将所发送出去分组的字节数累加到所述链路的字节数计数器;执行步骤(6);
(9)将所选择的链路移到活动链路列表的尾部;
(10)访问链路计数器减1;
(11)判断访问链路计数器是否为0,如果是,继续;否则,执行步骤(14);
(12)计算活动链路列表中每条链路的下一个轮次的P值;
(13)执行步骤(2);(14)判断数据请求发送队列是否为空,如果是,执行步骤(2);否则,执行步骤(5)。
接收端的步骤为
AO对接收端队列调度模块进行初始化,包括初始化接收端活动链路列表、接收端访问链路计数器赋初值0、给接收端使用的每条链路的P值赋初值0 ;
Al当活动链路列表中第一条链路的队列为空时,即当前链路的队列中没有分组需要调度,则队列调度模块进入等待分组到达的状态,否则,继续;
A2判断访问链路计数器是否为0,如果是,继续;否则,执行步骤A4 ; A3将接收端活动链路的条数置于访问链路计数器;
A4选择活动链路列表中的第一条链路,将这个链路所对应的队列中的第一个分组从输出链路发送出去;将所发送出去分组的字节数累加到所述链路的字节数计数器;
A5判断所选链路的P值减去本轮次中所发送出去的分组的长度和是否大于0 ;如果是,继续;否则,执行步骤A8 ;
A6判断活动链路列表中第一个链路的队列是否为空,如果是,执行步骤Al ;否则,继
续;
A7继续发送所选队列中的下一个分组;将所发送出去分组的字节数累加到所述链路的字节数计数器;执行步骤A5 ;
A8将所选择的链路移到活动链路列表的尾部; A9访问链路计数器减1 ;
AlO判断访问链路计数器是否为0,如果是,继续;否则,执行步骤A13 ; All计算活动链路列表中每条链路的下一个轮次的P值;将活动链路列表中每个链路的字节数计数器置为0 ; A12执行步骤Al ;
A13判断活动链路列表中第一个链路的队列是否为空,如果是,执行步骤Al ;否则,执行步骤A4。
本发明的技术效果在于(1)本发明中增加物理链路可以线性地增加数据传输的带宽;(2)本发明可以公平地分配多条链路的带宽资源,实现链路之间的负载均衡;(3)本发明不需要增加额外开销来保证发送端和接收端的数据分组顺序;(4)本发明具有低的复杂度,硬件实现也很简单。


图1本发明中发送端数据流、数据请求发送队列、负载分担模块、链路之间的关系示意图。图2本发明中接收端链路、链路队列、队列调度模块、输出链路之间的关系示意图。图3本发明实施例中一个到达发送端的数据流示意图,用字母标识分组,字母后面的数字表示分组的长度。
图4本发明实施例中发送端和接收端之间的链路示意图,链路箭头表示数据分组的传递方向。图5本发明实施例中,第1轮次的负载分担情形示意图,从左至右的内容是链路标识、链路本轮次的SP值、发送的分组、链路下一个轮次的SP值计算(图6、图7、图8的内容与图5相同)。图6本发明实施例中,第2轮次的负载分担情形示意图。图7本发明实施例中,第3轮次的负载分担情形示意图。图8本发明实施例中,第4轮次的负载分担情形示意图。图9本发明实施例中,经过发送端负载分担过程后,分组进入到接收端链路队列的示意图。图10发送端负载分担过程流程图。图11接收端队列调度过程流程图。
具体实施例方式下面结合附图和具体实施例对本发明作进一步的说明。本发明所提供的一种公平性好、效率高的多链路数据传输方法,其特征是它包括发送端初始化过程、发送端分组排队过程、发送端负载分担过程、接收端初始化过程、接收端入队列排队过程、接收端出队列调度过程。所述的多链路数据传输方法,定义一条链路是活动的(Active),当这条链路处于正常的UP状态。为了描述本发明所述的多链路数据传输方法,将所有活动的链路放在一个列表中,这个列表称为“活动链路列表”。发送端和接收端各有一个“活动链路列表”,而且在初始状态时,这两个列表是完全一致的,包括链路的先后顺序。在接收端每条链路都有一个与之对应的队列。如果一条链路变成DOWN状态,这条链路成为非活动的(^active),将从“活动链路列表”中删除;如果一条链路重新成为活动的,将添加在“活动链路列表”的尾部,等同于增加一条新的链路。删除和添加操作在发送端和接收端的“活动链路列表”中同步进行。所述的多链路数据传输方法,将到达发送端请求发送的数据分组放在一个列队中,这个队列称为“数据请求发送队列”,发送端负载分担模块将按先来先服务原则从队列中提取数据分组。所述的多链路数据传输方法,定义一个轮次(Round)是某一时刻Tl (T1>0),在发送端,“活动链路列表”中所包含的链路被负载分担模块访问的过程;或者是,在接收端,“活动链路列表”中所包含的链路对应的队列被出队列调度模块访问的过程。在一个轮次执行过程中,重新成为活动的链路可以加入到发送端和接收端“活动链路列表”的尾部,但将从下一轮次开始被访问。所述的多链路数据传输方法,为了表示一个轮次中所需要访问的链路的数目,引入一个计数器记录链路的数目,这个计数器称为“访问链路计数器”,表示在一个轮次开始时“活动链路列表”中链路的数量。在发送端,每当分负载分担模块访问一条链路,发送端的“访问链路计数器”就减少1,当“访问链路计数器”最终等于0时,就说明这个轮次结束。在接收端,每当出队列调度模块访问一条链路对应的队列,接收端的“访问链路计数器”就减少1,当“访问链路计数器”最终等于0时,就说明这个轮次结束。所述的多链路数据传输方法,将一条链路在一个轮次中所允许(Permission)发送的分组字节数称为这个链路的P值。P值不是固定不变的,除了链路的第1个轮次的P值为初值0外,其余轮次的P值都需要通过重新计算得到。计算方法是所述链路下一轮次的 P值=所述链路本轮次P值+本轮次其他链路平均发送的分组字节数-所述链路本轮次发送的字节数。发送端发送分组到链路上以及接收端从链路所对应的队列中调度分组都需要使用链路的P值,且计算方法相同。发送端和接收端对每条链路有各自的P值,是分开计算的。所述的多链路数据传输方法,用一个计数器记录一个链路在一个轮次中总共发送出去的分组字节数,这个计数器称为“字节数计数器”,每个链路都有一个“字节数计数器”。 在一个轮次开始前,“字节数计数器”的初值为0,然后每发送一个分组,就将分组的字节数累加到对应链路的“字节数计数器”。一条链路在发送端和接收端各有一个“字节数计数器”,在发送端的计数器记录发送到链路上的字节数,在接收端的计数器记录从链路对应的队列中调度出去的字节数。所述的多链路数据传输方法,发送端初始化过程是指对发送端负载分担模块进行初始化,包括初始化发送端“活动链路列表”、发送端“访问链路计数器”赋初值0、给发送端使用的每条链路的P值赋初值0。所述的多链路数据传输方法,发送端分组排队过程是指当有数据分组到达发送端需要进行发送时,首先进入到“数据请求发送队列”中排队,等待发送端负载分担模块选择一条链路将分组发送出去。本发明所提供的多链路数据传输方法中,发送端的数据流、数据请求发送队列、负载分担模块、链路之间的关系如图1所示。当一个数据流1到达发送端时,数据分组首先进入到数据请求发送队列2中排队,等候发送。负载分担模块3使用本发明的负载分担方法 4来分配链路,在η (η为大于0的自然数)条链路5中选择一条链路,对数据请求发送队列 2中的数据分组进行处理,使链路5的资源得到公平分配,实现高效的负载均衡。本发明所提供的多链路数据传输方法中,接收端的链路、链路队列、队列调度模块、输出链路之间的关系如图2所示。发送端通过η条链路5向接收端发送数据分组,这η 条链路5共享一条输出链路9,每一条链路上的分组在发送到输出链路9之前,进入到链路所对应的队列6,等候发送。队列调度模块7使用本发明的队列调度方法8来调度数据分组的传送,使输出链路9的带宽资源得到公平分配,并保持与发送端一致的数据分组顺序。为了表述更直观,用ActiveLinkList表示“活动链路列表”,是所有活动的链路的列表。当一个链路由活动的变成非活动的时,该链路将从ActiveLinkList中移走。当一个链路由非活动的变成活动的时,该链路将加入到ActiveLinkList的尾部。发送端的“活动链路列表”用SActiveLinkList表示,接收端的“活动链路列表”用RActiveLinkList表示。一个轮次中链路的确定现考虑轮次1的开始时间是Tl,结束时间是Τ2(Τ2>Τ1)。 在Tl时刻,ActiveLinkList中包含链路_1、链路_2、链路-3等三条链路,那么在轮次1,负载分担模块或队列调度模块将访问上述的三条链路。在Τ1、Τ2之间,链路-4变成活动的并加入到了 ActiveLinkList,但负载分担模块或队列调度模块不会在轮次1访问链路-4,因
8为链路-4在轮次1开始时刻Tl不在ActiveLinkList中。定义轮次2在T2时刻开始,在轮次2中,负载分担模块或队列调度模块将访问T2时刻ActiveLinkList中的链路,即访问链路-1、链路-2、链路_3、链路-4。另外,第几轮次是相对于某条链路来讲的,如从T2开始的轮次,对于链路-I、链路_2、链路-3来说,是第2轮次,但对于链路-4来说,是第1轮次。为了表述更直观,用VisitLinkCoimt表示“访问链路计数器”,是在一个轮次开始时ActiveLinkList列表中链路的数量。每当负载分担模块或队列调度模块完成对一条链路的访问,VisitLinkCount就减少1,当VisitLinkCount最终等于O时,就说明这个轮次结束。发送端的“访问链路计数器”用SVisitLinkCoimt表示,接收端的“访问链路计数器”用 RVisitLinkCount 表不。为了表述更直观,用knd表示“字节数计数器”,是一个轮次中发送到一条链路或从一条链路的队列中发送出去的字节数。用Send 1表示链路-i (l<i<n,i为自然数) 的“字节数计数器”;用knd i (r)表示在第r (r为大于O的自然数)轮次中发送到链路_i 或从链路_i的队列中发送出去的分组字节数。发送端的“字节数计数器”用Sknd表示, 接收端的“字节数计数器”用Rknd表示。一条链路的P值是一个轮次中允许发送到一条链路或允许从一条链路的队列中发送出去的分组的字节数量。在第r轮次中允许发送到链路_i或允许从链路_i的队列发送的分组字节数,记为Pi (r)。发送端的P值用SP表示,接收端的P值用RP表示。Average Count (AC)对链路_i来说,AC表示从第r (r彡2)个轮次开始,除了链路-i之外的其余链路在前一个轮次r-Ι所发送或从链路队列提取的平均字节数,记为 ACi (r-l)0 如果第 r-Ι 轮次总共有 η 条链路,则 ACi (r_l)= [Send ! (r_l)+…+ Send (r-1)+ Send i+1 (r-1)+···+ Send n (r_l) ]/(n_l),当不能整除时,取不小于商的整数,即商的整数部分+1。一条链路P值的计算当r=l时,链路-i的卩值?1 (I)=O ;当r>l时,Pi (r)= Pi (r-1) + ACi (r-1) - Send j (r_l)。
下面结合实施例来说明本发明所提供的多链路数据传输方法,实施例中有一个到达发送端的数据流,由17个数据分组(本实施例中以分组为数据块格式,如果数据块是以其他的格式来衡量,本发明同样适用,亦属于本发明所涵盖范围之内)组成,分别用 b, c, d, e, f, g, h, j, k, 1,m, ρ, q, s, t, u表示,如图3所示,字母后面的数字表示分组的长度,以字节为单位(本实施例中以字节为单位,如果分组大小是以其他的单位来衡量,本发明同样适用,亦属于本发明所涵盖范围之内)。分组到达的顺序是a是第一个到达的分组,u是最后一个到达的分组,其余分组依次到达。发送端和接收端之间有三条链路,分别用链路-1、链路_2、链路-3表示,如图4所示,链路箭头表示数据分组的传递方向。一、发送端初始化过程
这是发送端负载分担模块进行初始化的过程,包括以下一些操作 本实施例中,活动的链路有链路-1、链路_2、链路_3,所以SActiveLinkList的初值 ={链路-1,链路-2,链路-3};
SVisitLinkCount的初值赋值为O。链路-1、链路-2、链路-3在发送端的P值的初值为=SPi=O, 1 ^ i ^ η,本实施例
9中 n=3。
二、发送端分组排队过程
本实施例中,有 ει,b, c, d, e, f, g, h, j, k, 1,m, ρ, q, s, t, u 等 17 个数据分组进入到了 “数据请求发送队列”中,正在等候分配链路对它们进行传送。
三、发送端负载分担过程
负载分担模块开始对SActiveLinkList中的链路进行访问,选择链路对“数据请求发送队列”中的数据分组进行传送。开始时,首先判断“数据请求发送队列”是否为空,本实施例中,“数据请求发送队列”中有17个分组请求发送,非空。同时,SVisitLinkCount=0。这时,SActiveLinkList= {链路-1,链路_2,链路-3},将SActiveLinkList中每条链路的SSend置为0,即SSendi=O, 1彡i彡3。SVisitLinkCount =SActiveLinkList中链路的条数=3,进入三条链路负载分担的第1轮次
因为链路-1是SActiveLinkList中的第一条链路,所以选择链路_1对“数据请求发送队列”中的第一个分组a进行传送,到达接收端后,会进入接收端链路-1的队列中。分组 a 的长度为 20,所以 SSend1=0+20=20 ;判断 SP1-SSend1 是否大于(^SP1-SSend1=OjO=-ZO 小于0,于是将链路-1移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-2,链路-3,链路-1} ;SVisitLinkCount =3-1=2。继续选择SActiveLinkList中的第一条链路即链路_2,对“数据请求发送队列”中的分组b进行传送,到达接收端后,会进入接收端链路-2的队列中。分组b的长度为10, 所以 SSend2=0+10=10 ;判断 SP2-SSend2 是否大于 0,SP2-SSend2=O-IO=-IO 小于 0,于是将链路-2 移到 SActiveLinkList 的尾部,这时,SActiveLinkList= {链路 _3,链路-1,链路-2}; SVisitLinkCount =2-1=1。继续选择SActiveLinkList中的第一条链路即链路_3,对“数据请求发送队列”中的分组c进行传送,到达接收端后,会进入接收端链路-3的队列中。分组c的长度为15, 所以 SSend3=0+15=15 ;判断 SP3-SSend3 是否大于 0,SP3-SSend3=0_15=-15 小于 0,于是将链路-3 移到 SActiveLinkList 的尾部,这时,SActiveLinkList= {链路-1,链路 _2,链路-3}; SVisitLinkCount =1-1=0。SVisitLinkCount =0说明轮次1已经结束,于是计算SActiveLinkList中每条链路下一个轮次即轮次2的SP值,链路-1在轮次2的SP值为SP (2) =0+13-20=-7,链路-2在轮次2的SP值为SP (2) =0+18-10=8,链路-3在轮次2的SP值为SP (2) =0+15-15=0 ;第1轮次的负载分担情形如图5所示,图的右边显示的是下一轮次SP值的计算。
下面进入负载分担第2轮次
SActiveLinkList= {链路-1,链路-2,链路-3},将 SActiveLinkList 中每条链路的 SSend 置为 0,即 SSendi=O, 1 彡 i 彡 3。SVisitLinkCount =SActiveLinkList 中链路的条数=3。因为链路-1是SActiveLinkList中的第一条链路,所以选择链路-1对“数据请求发送队列”中的第一个分组d进行传送,到达接收端后,会进入接收端链路-1的队列中。分组 d 的长度为 15,所以 SSendeO+lS=^ ;判断 SP1-SSend1 是否大于 0,SP1-SSend1=-7-15=-22 小于0,于是将链路-1移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-2, 链路-3,链路-1} ;SVisitLinkCount =3-1=2。继续选择SActiveLinkList中的第一条链路即链路_2,对“数据请求发送队列”中的分组e进行传送,到达接收端后,会进入接收端链路-2的队列中。分组e的长度为5,所以SSend2=0+5=5 ;判断SP2-SSend2是否大于0,SP2-SSend2=8_5=3大于0,所以继续从“数据请求发送队列”中提取分组f由链路-2传送,到达接收端后,会进入接收端链路-2的队列中。分组 f 的长度为 5,SSend2=5+5=10 ;判断 SP2-SSend2 是否大于 0,SP2-SSend2=8_10=-2 小于0,于是将链路-2移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-3, 链路-1,链路-2} ;SVisitLinkCount =2-1=1。继续选择SActiveLinkList中的第一条链路即链路_3,对“数据请求发送队列” 中的分组g进行传送,到达接收端后,会进入接收端链路-3的队列中。分组g的长度为 3,所以 SSends=0+3=3 ;判断 SP3-SSend3 是否大于 0,SP3-SSend3=0_3=-3 小于 0,于是将链路-3 移到 SActiveLinkList 的尾部,这时,SActiveLinkList= {链路-1,链路 _2,链路-3}; SVisitLinkCount =1-1=0。SVisitLinkCount =0说明轮次2已经结束,于是计算SActiveLinkList中每条链路下一个轮次即轮次3的SP值,链路-1在轮次3的SP值为SP(3)=-7+7-15=-15,链路-2 在轮次3的SP值为SP (3) =8+9-10=7,链路-3在轮次3的SP值为SP (3) =0+13-3=10 ;第2 轮次的负载分担情形如图6所示。
下面进入负载分担第3轮次
SActiveLinkList= {链路-1,链路-2,链路-3},将 SActiveLinkList 中每条链路的 SSend 置为 0,即 SSendi=O, 1 彡 i 彡 3。SVisitLinkCount =SActiveLinkList 中链路的条数=3。因为链路-1是SActiveLinkList中的第一条链路,所以选择链路_1对“数据请求发送队列”中的第一个分组h进行传送,到达接收端后,会进入接收端链路-1的队列中。 分组 h 的长度为 8,所以 SSendpO+SsS ;判断 SP1-SSend1 是否大于 OiSP1-Sknd1=-IS-S=IS 小于0,于是将链路-1移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-2, 链路-3,链路-1} ;SVisitLinkCount =3-1=2。继续选择SActiveLinkList中的第一条链路即链路_2,对“数据请求发送队列”中的分组j进行传送,到达接收端后,会进入接收端链路-2的队列中。分组j的长度为6,所以SSend2=0+6=6 ;判断SP2-SSend2是否大于0,SP2-SSend2=7_6=l大于0,所以继续从“数据请求发送队列”中提取分组k由链路-2传送,到达接收端后,会进入接收端链路-2的队列中。分组 k 的长度为 9,SSend2=6+9=15 ;判断 SP2-SSend2 是否大于 0,SP2-SSend2=7_15=-8 小于0,于是将链路-2移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-3, 链路-1,链路-2} ;SVisitLinkCount =2-1=1。继续选择SActiveLinkList中的第一条链路即链路_3,对“数据请求发送队列”中的分组1进行传送,到达接收端后,会进入接收端链路-3的队列中。分组1的长度为7,所以SSend3=0+7=7 ;判断SP3-SSend3是否大于0,SP3-SSend3=10-7=3大于0,所以继续从“数据请求发送队列”中提取分组m由链路-3传送,到达接收端后,会进入接收端链路-3的队列中。分组 m 的长度为 2,SSend3=7+2=9 ;判断 SP3-SSend3 是否大于 0,SP3-SSend3=10_9=l 大于0,所以继续从“数据请求发送队列”中提取分组ρ由链路-3传送,到达接收端后,会进入接收端链路-3的队列中。分组ρ的长度为ll,Sknd3=9+ll=20 ;判断SP3-SSend3是否大于0,SP3-SSend3=10-20=-10小于0,于是将链路_3移到SActiveLinkList的尾部,这时, SActiveLinkList= {链路-1,链路-2,链路-3} ;SVisitLinkCount =1-1=0。SVisitLinkCount =0说明轮次3已经结束,于是计算SActiveLinkList中每条链路下一个轮次即轮次4的SP值,链路-1在轮次4的SP值为SP (4) =-15+18-8=-5,链路-2 在轮次4的SP值为SP (4) =7+14-15=6,链路-3在轮次4的SP值为SP (4) =10+12-20=2 ;第 3轮次的负载分担情形如图7所示。
下面进入负载分担第4轮次
SActiveLinkList= {链路-1,链路-2,链路-3},将 SActiveLinkList 中每条链路的 SSend 置为 0,即 SSendi=O, 1 彡 i 彡 3。SVisitLinkCount =SActiveLinkList 中链路的条数=3。因为链路-1是SActiveLinkList中的第一条链路,所以选择链路-1对“数据请求发送队列”中的第一个分组q进行传送,到达接收端后,会进入接收端链路-1的队列中。分组 q 的长度为 5,所以 SSend1=0+5=5 ;判断 SP1-SSend1 是否大于 0,SP1-SSend1=-S-S=-IS 小于0,于是将链路-1移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-2,链路-3,链路-1} ;SVisitLinkCount =3-1=2。继续选择SActiveLinkList中的第一条链路即链路_2,对“数据请求发送队列”中的分组s进行传送,到达接收端后,会进入接收端链路-2的队列中。分组s的长度为4,所以SSend2=0+4=4 ;判断SP2-SSend2是否大于0,SP2-SSend2=6-4=2大于0,所以继续从“数据请求发送队列”中提取分组t由链路-2传送,到达接收端后,会进入接收端链路-2的队列中。分组 t 的长度为 6,SSend2=4+6=10 ;判断 SP2-SSend2 是否大于 0,SP2-SSend2=6_10=-4 小于0,于是将链路-2移到SActiveLinkList的尾部,这时,SActiveLinkList= {链路-3, 链路-1,链路-2} ;SVisitLinkCount =2-1=1。继续选择SActiveLinkList中的第一条链路即链路_3,对“数据请求发送队列” 中的分组u进行传送,到达接收端后,会进入接收端链路-3的队列中。分组u的长度为 8,所以 SSend3=0+8=8 ;判断 SP3-SSend3 是否大于 0,SP3-SSend3=2_8=-6 小于 0,于是将链路-3 移到 SActiveLinkList 的尾部,这时,SActiveLinkList= {链路-1,链路 _2,链路-3}; SVisitLinkCount =1-1=0。SVisitLinkCount =0说明轮次4已经结束,于是计算SActiveLinkList中每条链路下一个轮次即轮次5的SP值,链路-1在轮次5的SP值为SP (5) =-5+9-5=-1,链路-2在轮次5的SP值为SP (5) =6+7-10=3,链路-3在轮次5的SP值为SP (5) =2+8-8=2 ;第4轮次的负载分担情形如图8所示。继续执行,由于“数据请求发送队列”已经为空,说明已没有数据分组需要分配链路进行传送,于是,负载分担模块进入到等待数据分组到达的状态。
四、接收端初始化过程
这是接收端队列调度模块进行初始化的过程,包括以下一些操作 本实施例中,活动的链路有链路-1、链路_2、链路_3,所以RActiveLinkList的初值 ={链路-1,链路_2,链路- ,与发送端SActiveLinkList的初值完全一致。RVisitLinkCount 的初值赋值为 O。链路-1、链路-2、链路-3在接收端的P值的初值为=RPi=O, 1 ^ i ^n,本实施例中 n=3。将RActiveLinkList中每条链路的RSend的初值置为0,即RSendi=O, 1彡i彡n, 本实施例中n=3。
五、接收端入队列排队过程
经过发送端的负载分担过程后,有 d, h, g四个分组进入到了接收端链路-1的队列,有b,e, f, j, k, s, t等七个分组进入到了接收端链路-2的队列,有c,g, 1,m, P, u等六个分组进入到了接收端链路-3的队列,如图9所示。从图9中也可以看得出链路之间负载分担的情况。
六、接收端出队列调度过程
队列调度模块开始对RActiveLinkList中链路的队列进行访问,从队列中选取分组并将分组从输出链路发送出去。开始时,首先判断RActiveLinkList中第一条链路的队列是否为空集,本实施例中,RActiveLinkList ={链路_1,链路_2,链路-3},链路-1的队列非空。同时 RVisitLinkCount=0。这时,RvisitLinkCount=RActiveLinkList 中链路的条数=3,首先进入三条链路队列调度第1轮次
因为此时链路-1是RActiveLinkList中的第一条链路,所以对链路-1的队列进行操作,选择链路-1队列中的第一个分组a从输出链路发送出去;分组a的长度为20,所以 1^611(^=0+20=20 ;判断 RP1-RSend1 是否大于 0,RP1-RSend1=0-20=-20 小于 0,于是不再发送链路-1队列中的下一个分组,并将链路-1移到RActiveLinkList的尾部,这时, RActiveLinkList= {链路-2,链路-3,链路-1} ;RVisitLinkCount =3-1=2。继续对RActiveLinkList中的第一条链路即链路_2进行操作,选择链路_2队列中的第一个分组b从输出链路发送出去;分组b的长度为10,所以RSend2=0+10=10 ;判断 RP2-RSend2是否大于0,RP2-RSend2=O-IO=-IO小于0,于是不再发送链路_2队列中的下一个分组,并将链路-2移到RActiveLinkList的尾部,这时,RActiveLinkList = {链路-3,链路-1,链路-2} ;RVisitLinkCount =2-1=1。继续对RActiveLinkList中的第一条链路即链路_3进行操作,选择链路_3队列中的第一个分组c从输出链路发送出去;分组c的长度为15,所以RSend3=0+15=15 ;判断 RP3-RSend3是否大于0,RP3-RSend3=0-15=-15小于0,于是不再发送链路_3队列中的下一个分组,并将链路-3移到RActiveLinkList的尾部,这时,RActiveLinkList = {链路-1,链路-2,链路-3} ;RVisitLinkCount =1-1=0。
RVisitLinkCount =0说明轮次1已经结束,于是计算RActiveLinkList中每条链路下一个轮次即轮次2的RP值,链路-1在轮次2的RP值为RP (2) =0+13_20=_7,链路-2在轮次2的RP值为RP (2) =0+18-10=8,链路-3在轮次2的RP值为RP (2) =0+15-15=0 ;并将每条链路_i的RSend i置为0,1彡i彡n,本实施例中n=3。
下面进入队列调度第2轮次
RActiveLinkList ={链路 _1,链路 _2,链路-3} ;RVisitLinkCount = RActiveLinkList中链路的条数=3。首先对链路-1进行操作,选择链路-1队列中的第一个分组d从输出链路发送出去;分组d的长度为15,所以1^^4=0+15=15 ;判断RP1-RSend1是否大于0, RP1-RSend1=-7-15=-22小于0,于是不再发送链路_1队列中的下一个分组,并将链路_1 移到 RActiveLinkList 的尾部,这时,RActiveLinkList= {链路-2,链路-3,链路-1}; RVisitLinkCount =3-1=2。对链路-2进行操作,选择链路-2队列中的第一个分组e从输出链路发送出去; 分组e的长度为5,所以RSend2=0+5=5 ;判断RP2-RSend2是否大于0,RP2-RSend2=8_5=3大于0,于是继续发送链路-2队列中的下一个分组f,分组f的长度为5,RSend2=5+5=10 ;判断RP2-RSend2是否大于0,RP2-RSend2=8-10=-2小于0,于是不再发送链路_2队列中的下一个分组,并将链路-2移到RActiveLinkList的尾部,这时,RActiveLinkList = {链路-3,链路-1,链路-2} ;RVisitLinkCount =2-1=1。对链路-3进行操作,选择链路-3队列中的第一个分组g从输出链路发送出去;分组g的长度为3,所以I end3=0+3=3 ;判断RP3-RSend3是否大于0,RP3-RSend3=0-3=-3小于 0,于是不再发送链路-3队列中的下一个分组,并将链路-3移到RActiveLinkList的尾部, 这时,RActiveLinkList ={,连路 _1,链路 _2,链路-3} ;RVisitLinkCount =1-1=0。RVisitLinkCount =0说明轮次2已经结束,于是计算RActiveLinkList中每条链路下一个轮次即轮次3的RP值,链路-1在轮次3的RP值为RP (3) =-7+7_15=_15,链路-2 在轮次3的RP值为RP (3) =8+9-10=7,链路-3在轮次3的RP值为RP (3) =0+13-3=10 ;并将每条链路_i的RSend i置为0,1彡i彡n,本实施例中n=3。
下面进入队列调度第3轮次
RActiveLinkList ={链路 _1,链路 _2,链路-3} ;RVisitLinkCount = RActiveLinkList中链路的条数=3。首先对链路-1进行操作,选择链路-1队列中的第一个分组h从输出链路发送出去;分组h的长度为8,所以1^^4=0+8=8 ;判断RP1-RSend1是否大于0, RP1-RSend1=-15-8=-23小于0,于是不再发送链路_1队列中的下一个分组,并将链路_1 移到 RActiveLinkList 的尾部,这时,RActiveLinkList= {链路-2,链路-3,链路-1}; RVisitLinkCount=3_l=20对链路-2进行操作,选择链路-2队列中的第一个分组j从输出链路发送出去; 分组j的长度为6,所以RSend2=0+6=6 ;判断RP2-RSend2是否大于0,RP2-RSend2=7_6=l大于0,于是继续发送链路-2队列中的下一个分组k,分组k的长度为9,RSend2=6+9=15 ;判
14断RP2-RSend2是否大于0,RP2-RSend2=7-15=-8小于0,于是不再发送链路_2队列中的下一个分组,并将链路-2移到RActiveLinkList的尾部,这时,RActiveLinkList= {链路-3,链路-1,链路-2} ;RVisitLinkCount=2-l=l。对链路-3进行操作,选择链路-3队列中的第一个分组1从输出链路发送出去; 分组 1 的长度为 7,所以 I end3=0+7=7 ;判断 RP3-RSend3 是否大于 0,RP3-Rknd3= 10-7=3 大于0,于是继续发送链路-3队列中的下一个分组m,分组m的长度为2,RSend3=7+2=9 ; 判断RP3-RSend3是否大于0,RP3-RSend3=IO-Q=I大于0,于是继续发送链路-3队列中的下一个分组P,分组P的长度为11,RSend3=9+l 1=20 ;判断RP3-RSend3是否大于0, RP3-RSend3=10-20=-10小于0,于是不再发送链路_3队列中的下一个分组,并将链路_3 移至Ij RActiveLinkList 的尾部,这时,RActiveLinkList= {链路-1,链路-2,链路-3}; RVisitLinkCount=l_l=0。RVisitLinkCount=O说明轮次3已经结束,于是计算RActiveLinkList中每条链路下一个轮次即轮次4的RP值,链路-1在轮次4的RP值为RP (4) =_15+18_8=_5,链路-2在轮次4的RP值为RP (4) =7+14-15=6,链路3在轮次4的RP值为RP (4) =10+12-20=2 ;并将每条链路_i的RSend i置为0,1彡i彡n,本实施例中n=3。
下面进入队列调度第4轮次
RActiveLinkList ={链路 _1,链路 _2,链路-3} ;RVisitLinkCount = RActiveLinkList中链路的条数=3。首先对链路-1进行操作,选择链路-1队列中的第一个分组q从输出链路发送出去;分组q的长度为5,所以1^^4=0+5=5 ;判断RP1-RSend1是否大于0, RP1-RSend1=-S-S=-IO小于0,于是不再发送链路_1队列中的下一个分组,并将链路_1 移到 RActiveLinkList 的尾部,这时,RActiveLinkList= {链路-2,链路-3,链路-1}; RVisitLinkCount=3_l=20对链路-2进行操作,选择链路-2队列中的第一个分组s从输出链路发送出去; 分组s的长度为4,所以RSend2=0+4=4 ;判断RP2-RSend2是否大于0,RP2-RSend2=6_4=2大于0,于是继续发送链路-2队列中的下一个分组t,分组t的长度为6,RSend2=4+6=10 ;判断RP2-RSend2是否大于0,RP2-RSend2=6-10=-4小于0,于是不再发送链路_2队列中的下一个分组,并将链路-2移到RActiveLinkList的尾部,这时,RActiveLinkList= {链路-3,链路-1,链路-2} ;RVisitLinkCount=2-l=l。对链路-3进行操作,选择链路-3队列中的第一个分组u从输出链路发送出去;分组u的长度为8,所以I end3=0+8=8 ;判断RP3-RSend3是否大于0,RP3-RSend3=2-8=-6小于 0,于是不再发送链路-3队列中的下一个分组,并将链路-3移到RActiveLinkList的尾部, 这时,RActiveLinkList= {链路-1,链路 _2,链路-3} ;RVisitLinkCount=l_l=0。RVisitLinkCount=O说明轮次4已经结束,于是计算RActiveLinkList中每条链路下一个轮次即轮次5的RP值,链路-1在轮次4的RP值为RP (5) =_5+9_5=_1,链路-2在轮次5的RP值为RP (5) =6+7-10=3,链路3在轮次5的RP值为RP (5) =2+8-8=2 ;并将每条链路_i的RSend i置为0,1彡i彡n,本实施例中n=3。继续执行,由于RActiveLinkList中的第一链路即链路_1的队列已为空集,即此
15时链路-ι的队列中已没有分组需要调度,因此,队列调度模块进入到等待分组到达的状态。经过四个轮次的队列调度,在接收端的输出链路上得到的分组序列是a,b, c, d, e, f, g, h, j, k, 1,m, ρ, q, s, t, u,其中a是最先从输出链路发送出去的分组, u是最后从输出链路发送出去的分组。可以看出,从接收端的输出链路上发送出去的分组顺序与到达发送端的分组顺序是一致的。
如上所述的实施例发送端负载分担过程和接收端队列调度过程,只是描述了在给定实施例的情况下,执行本发明所述的多链路数据传输方法的开始的4个轮次。本发明所述的多链路数据传输方法,对链路数量、轮次的多少是没有限制的,一旦有数据分组到达发送端,负载分担模块还将继续执行链路分配并发送“数据请求发送队列”中分组;数据分组到达接收端的链路队列后,队列调度模块将继续往下执行分组调度,将分组发送到输出链路。 发送端负载分担过程的流程如图10所示,接收端队列调度过程的流程如图11所示。
以上实施例说明的就是本发明所提供的一种多链路数据传输方法的具体实施方式
。本发明所提供的多链路数据输出方法的优势表现在(1)可以通过增加物理链路来增加数据传输的总带宽。(2) —个轮次中允许发送到一条链路或允许从一条链路的队列中发送出去的分组的字节数量,即一条链路的P值。不是对所有的轮次都是固定不变的,而是依赖于前一个轮次中各条链路的使用情况进行计算。一般来讲,在一个轮次中获得很少访问(发送的字节数很少)的链路会在下一个轮次中给予更多的访问机会。这样就保证了链路之间比较好的负载均衡和公平性。(3)从实施例可以看出,接收端得到的分组序列与发送端的分组序列是一致的,这样就不要求像MLPPP —样需要增加额外的开销来保证发送端和接收端的数据分组顺序;避免了报文顺序重组所带来的开销和时延。(4)本发明中所述方法的操作包括分组加入到队列、链路添加到列表中、给变量(PpACpSendi等)赋初值、发送分组、从列表的首部移出一条链路、在列表的尾部添加一条链路、更新变量(VisitLinkCoimt AendpPi 等)的值等操作,所有这些操作都可以在常数时间内完成。因此,本发明所提供的多链路数据传输方法复杂度低、效率高、容易实现。
权利要求
1. 一种公平性好效率高的多链路数据传输方法,包括以下步骤 其中发送端的步骤为(1)发送端对负载分担模块进行初始化,包括发送端活动链路列表、发送端访问链路计数器赋初值0、给发送端使用的每条链路的P值赋初值0 ;(2)数据分组进入发送端数据请求发送队列,如果数据请求发送队列为空,则负载分担模块进入等待数据分组到达的状态,否则,继续;判断访问链路计数器是否为0,如果是,继续;否则,执行步骤(5);(3)将发送端活动链路列表中每条链路的字节数计数器置为0;(4)将发送端活动链路的条数置于访问链路计数器;(5)从数据请求发送队列中提取一个数据分组,将数据分组从活动链路列表中的第一条链路发送出去,将所发送出去分组的字节数累加到所述链路的字节数计数器;(6)判断所选链路的P值减去所述链路的字节数计数器值是否大于0,如果是,继续;否则,执行步骤(9);(7)判断数据请求发送队列是否为空,如果是,执行步骤(2);否则,继续;(8)继续从数据请求发送队列中提取一个数据分组从所选择的链路上发送出去;将所发送出去分组的字节数累加到所述链路的字节数计数器;执行步骤(6);(9)将所选择的链路移到活动链路列表的尾部;(10)访问链路计数器减1;(11)判断访问链路计数器是否为0,如果是,继续;否则,执行步骤(14);(12)计算活动链路列表中每条链路的下一个轮次的P值;(13)执行步骤(2);(14)判断数据请求发送队列是否为空,如果是,执行步骤(2);否则,执行步骤(5); 接收端的步骤为AO对接收端队列调度模块进行初始化,包括初始化接收端活动链路列表、接收端访问链路计数器赋初值0、给接收端使用的每条链路的P值赋初值0 ;Al当活动链路列表中第一条链路的队列为空时,即当前链路的队列中没有分组需要调度,则队列调度模块进入等待分组到达的状态,否则,继续;A2判断访问链路计数器是否为0,如果是,继续;否则,执行步骤A4 ; A3将接收端活动链路的条数置于访问链路计数器;A4选择活动链路列表中的第一条链路,将这个链路所对应的队列中的第一个分组从输出链路发送出去;将所发送出去分组的字节数累加到所述链路的字节数计数器;A5判断所选链路的P值减去本轮次中所发送出去的分组的长度和是否大于0 ;如果是,继续;否则,执行步骤A8 ;A6判断活动链路列表中第一个链路的队列是否为空,如果是,执行步骤Al ;否则,继续;A7继续发送所选队列中的下一个分组;将所发送出去分组的字节数累加到所述链路的字节数计数器;执行步骤A5 ;A8将所选择的链路移到活动链路列表的尾部;A9访问链路计数器减1 ;AlO判断访问链路计数器是否为0,如果是,继续;否则,执行步骤A13 ; All计算活动链路列表中每条链路的下一个轮次的P值;将活动链路列表中每个链路的字节数计数器置为0 ; A12执行步骤Al ;A13判断活动链路列表中第一个链路的队列是否为空,如果是,执行步骤Al ;否则,执行步骤A4。
全文摘要
本发明公开了一种公平性好效率高的多链路数据传输方法。对于多链路数据传输,本发明在数据发送端由负载分担模块按照轮询的方式根据链路的发送端P值选择链路分担;在数据接收端由队列调度模块按照轮询的方式根据链路的接收端P值进行发送。本发明中链路在发送端和接收端的P值都依赖于前一个轮次中各个链路的发送情况进行计算,从而使在一个轮次中获得很少服务的链路会在下一个轮次中给予更多的服务机会,这样就保证链路之间比较好的公平性。本发明可以公平地分配多条链路的带宽资源,实现链路之间的负载均衡,并且不需要增加额外开销来保证发送端和接收端的数据分组顺序,具有复杂度低、硬件实现简单的优点。
文档编号H04L12/56GK102368742SQ20111040876
公开日2012年3月7日 申请日期2011年12月11日 优先权日2011年12月11日
发明者刘桂开, 邓茜, 高蕾 申请人:湖南科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1