UDP可靠传输,全双工思考,UDX协议杂谈

关见字:

TCP OVER UDP

UDX,

UDT

VTCP,

RAKNET

可靠文件传输

可靠UDP

QQ的P2P文件传输

 

 

完成UDX已经有一段时间了,但是一直有几个问题困扰着我。其实际上,我最近二年一直围绕这几点问题在工作。

希望同行能认同我的观点,并进行补充,欢迎大家批评指正,并和我联系,我的QQ是 24508609 msn是wpllg@hotmail.com

UDX的官方网站是www.goodudx.com

 

问题:

1.如何检测当前链路实际可用流量。

2.如何在最大流量处保持发送速度

3.如何在其他流加入时,提升竟争性让自己的算法能有效利用代宽。

4.当其他流离开时,如何恢复到,最佳状态,即,以最小的RTT,换取最大的代宽。

5.不管是大包小包,满足以上四点要求。

6.如何让一个联接在处于双工情况,双向工作良好。满足以上几点。

 

其实际上,如果做到以上几点,那么,可靠传输算法应该是最佳的。

 

这几个问题,存在我的脑海里已经有相当一段时间,大概有一年多时间。

 

UDX就是不断的完善以上几点,我不懈的去思考,去修改算法达到目的。

 

我们分别对以上几点来简单阐述UDX是如何实现的,并针对一些算法,就作者的理解进行和UDX比较。s

1.如何检测当前链路实际可用流量。

在前面几个博客文章中我已经描述过,这里也简单的说明一下。

在以前的版本中,UDX以RTT为测量方法,通过VEGAS算法,估计流量,DIFF = EXPECT - ACT,他的原理就是控制当前处在网络上的变化流量在一定范围中(A,B),A<DIFF<B.最近UDX通过流量的增量DEL BEW来测量网络代宽,但是牺牲了反应的灵敏性,没有VEGAS更加灵活的控制发送速度,VEGAS可以提前预测拥赛,所以,UDX目前的算法,会以牺牲丢包来检测最佳流量,但实际实现上,UDX也考虑过VEGAS算法,只是作为一个辅助指标。

 

2.如何在最大流量处保持发送速度,这确实是一个棘手的问题,在相当一段时间内,我也很难解决这个问题,幸好我有足够的时间来做这个,这得亏于在www.pipi.cn公司工作,让我有足够的时间来优化我的算法。

首先这里有一个命题,如何知道当前已经到了最佳发送速度?虽然前面我们问题1已经解决了这个问题,但是我们的算法一直以时间T在不断前进。而且,不断有回包应答,由于每个应答我们都会去增加发送窗口,但是并不是不停增加发送速度就能增加实际的发送流量。

所以,解决方法是,当最大发送速度时,我们停止增加窗口,使其稳定在一个大小,这样,流量发送就会很平稳。

在UDX内部有四个主要变量,最佳发送速度,最大发送速度,实际发送速度,最大流量。

判断条件是,最大流量时,实际发送速度 > 最佳发送流量的*1.25倍,当然实际上还有一些条件,但是这是主要条件。

这四个变量是相互影响的,请不要试图去通过经验值来确定某个量。而1.25是经验值,这也是竟争性的主要值,越大竟争性越强。

 

3.如何在其他流加入时,提升竟争性让自己的算法能有效利用代宽。这个问题,也是一个非常有意义的事情。因为现在的应用越来越多,不同的应用有不同的网络需求。有时为了保证一些数据能够最快的传输出去,我们必须让其占用更多的代宽,典型的就是视频语音数据。而UDX最适合传输视频,文件数据。而作为语音数据,由于其特别性,一般不需要可靠传输。

这里的核心问题是,如何检测有其他流加入?当网络在一个平横状态下,UDX保持在最佳状态,UDX是如何知道有流加入呢?

这个问题,我也花了很多时间去思考。我注意到当有流加入时,会有更多的丢包,更长的往返时间,传输质量的下降和流量的减少。早期的版本,UDX会因为平横打破去寻找新的平横点。由于以前算法的缺陷有时在没有找到新的平衡点时可能已经击穿了网络。这样UDX可能就失效了,他会重新进入慢起动,这样效率有很大损失。

如果我们单纯的去看丢包率,往返时间是不会找到真正的解决办法的,虽然在某些网络上,我们可以固定一些参数,比如往返时间的变化率,流量增量等,可以检测到但是,都不够灵活和准确。

我最终选择了逼近算法,而不是通过某一个量来检测。当平横打破时,UDX会侦测RTT的变化,这些变化本质上是引起了流量的变化,结合实际的应答流量,来影响前面提到的四个量,他们通过1的工式可以很快达到新的平横。

 

4.当其他流离开时,如何恢复到,最佳状态,即,以最小的RTT,换取最大的代宽。其实这个问题,在我看来是所有问题中最难解决的问题。

以前的UDX版本,因为达到了新的平横是不能回到最开始的平横点时。很显然,在新的平横点是建力在有新的流加入竟争的时候,产生的。但是,现在别的流已经离开,我如何回到之前的平横点呢?我们仔细想想看其实是问题3的相反命题,确实是一个棘手的问题。

我尝试过,修改,最大发送速度,丢包后减少的增量,窗口步进的步长,等许多方法都没有成功。而在我写这片文章时,我已经解决了这个问题。我恍然大悟,其实,我们不必调整当前发送速度,并不是真正的不去调整它,而是要调整本质----控制发送速度的,最佳发送速度。

在新的平横点时最佳发送速度,也发生了变化,而之前UDX都没有去修改这个值,所以,UDX就一直处于这个新的平衡点。有人会说,新的平横点有什么不好呢?确实,大多数情况下,新的平横点并没有坏处,他也是处于最大流量的点。但是这是一个危险的点,原因是,他已经处于一个快崩溃点,也就是非常接近拥赛点了,我们必须调整,否则稍有网络波动就会发生丢包。最佳速度根据往返时间进行调整后,发送速度也会自然因为我们之前的四个量的平横判断条件,逐步恢复到最佳点。这里的难点就是不能直接调整发送窗口(发送速度),所以我一直处理这个误区。但现在好了。

 

5.不管是大包小包,满足以上四点要求。这个小包的问题,我已经在上一片博客中已经说过,具体请参阅

http://blog.csdn.net/wwwllg/archive/2011/03/31/6291082.aspx

 

6.如何让一个联接在处于双工情况,双向工作良好。满足以上几点。

这个问题其实是最不好说明的问题,其实本质答案也是第一个问题,就是检测最大流量的方式。

而检测方式有很多种,比如vegas,丢包检测,主要是二种方法,一种是以RTT为核心的算法,VEGAS为代表的,另外一个是以RENO为代表的丢包检测,而UDX是不同于上面二者的,当然也有他们的算法实现并应用在UDX中,UDX最主要的检测是流量的增量来控制的。所以在双向的时候,并不会因为RTT的变化来影响单边的流量算法,这样,相当于独立的两条链路,从而可以双向传输较好质量。

而象VEGAS这类算法,因为,RTT是贡享的,一边的传输会严重影响另一方的传输,并且糟糕的是会以单边流量低者为衡量,显然这会大大降低有效利用率。而以RENO算法来讲,他是可以完成检测的,但是,他是直到丢包为止,这样,也会间接引响到回包,也同样会影响到另一方。所以,我们需要把两者结合,综合考虑。

 

其实要解决的远不止以上提到的问题,但主要就是这些问题,也很难说清楚,我文笔也不是很好,希望同行指正交流。更希望通过此文大家能得到启发,写出更好的算法,促进我们共同进步。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值