论文部分内容阅读
TCP协议是当前互联网使用最广泛的传输层协议,其性能很大程度上决定了用户感知的网络服务质量。TCP拥塞控制是保证网络传输性能的关键,其控制注入网络的流量大小,防止因流量过多而使网络过载。上个世纪80年代末提出了最早的拥塞控制机制,然而随着移动网络技术的发展和短流应用的增加,现在的网络环境与当时相比发生了巨大的变化,早期拥塞控制方法的缺陷越来越明显:这些方法为了探测出可用带宽,不断增加发送速率直至丢包,当路由缓存过小时会造成高丢包率,而路由缓存很大时,为将缓存填满,丢包之前会经历高时延。 为解决这一问题,本文从TCP拥塞控制的实现框架出发,提出将丢包识别和拥塞控制解耦合的思路。二者解耦合后,丢包识别部分仅负责判断是否出现丢包,如果有丢包则重传,而不再直接影响拥塞窗口的变化。拥塞控制部分只负责控制发送速率,其可以监测丢包、时延、带宽变化等各种拥塞信号。采用该方案,在不同网络条件下,可以分别选择匹配的丢包识别算法和拥塞控制算法,从而增强TCP对不同网络场景的适应性。本文工作主要包括以下三个方面: 1.丢包识别模块化。目前,多种丢包识别算法在Linux内核中实现,并与拥塞控制强耦合。采用该方案,一方面非拥塞丢包也会导致发送速率下降,降低带宽利用率;另一方面,丢包识别算法实现复杂,造成内核代码臃肿。因此,本文提出将丢包识别与拥塞控制解耦合,并将丢包识别算法在模块中实现。首先,将丢包识别过程归纳为确定丢包识别依据,确定区分丢包和包乱序的阈值,更新信息和标记丢包四个步骤,然后据此设计接口并实现。丢包识别算法则在内核模块中实现,通过接口与内核交互,获知网络状态信息,做出相应处理,最终提供丢包识别的结果。通过动态加载模块,内核可以支持多种丢包识别算法。 2.基于发送序列号的丢包识别算法。目前,二次重传(重传包丢失)和连续丢包场景下的丢包都要通过超时重传才能恢复。为解决这一问题,本文提出基于发送序列号的丢包识别算法。该算法的主要思想是:额外增加一个发送序列号,根据发送序列号做丢包判断,如果发送序列号大的包先被确认,则推断发送序列号小于它的包丢了。实验结果表明,该算法可以在1-2个RTT内恢复二次重传和连续丢包场景中的丢包,当网络严重拥塞时吞吐率可以提高10%-60%。 3.基于RTT自适应调整的拥塞控制算法。现有基于RTT的拥塞控制算法在测量链路固定带宽、适应带宽变化方面存在缺陷,因此提出基于RTT自适应调整的拥塞控制算法。该算法取每隔一段时间内RTT采样的最小值作为链路的固定时延,将实时RTT采样与该固定时延进行对比,根据它们之间的差值来调节拥塞窗口。为了适应带宽的变化,参数进行自适应调整。另外,还根据该差值来区分拥塞丢包和链路错误丢包。实验结果表明,在不同的RTT环境下,该算法的吞吐率相比Vegas和CUBIC提升1.6-5倍;在不同的丢包率环境下,该算法的吞吐率相比Vegas和CUBIC提升3-10倍。该算法还可以保证同一链路上使用不同算法的TCP流的公平性。