1网络拥塞发生的原因
网络中的拥塞来源于网络资源和流量分布的不均衡性。一旦网络中存在过多的数据包,就会导致网络性能的下降,这种现象称为拥塞。
拥塞会导致分组丢失率增加,从而增大端到端的延迟,累积到一定程度就是整个系统的崩溃。这样的例子在互联网发展史上曾经不止一次的出现过,当网络处于拥塞崩溃状态时,微小的负载增量都将使网络的有效吞吐量急剧下降。
网络拥塞发生的原因说起来也很简单,就是“需求”大于“供给”。
网络本身无法根据现有资源的情况限制用户的数量;互联网络又是一个分散控制系统,无法控制用户使用资源的数量,不断增长的用户和应用的数量必然会导致网络发生拥塞。
2 TCP拥塞控制
研究拥塞控制的目的不是要完全避免拥塞,而是研究怎样的拥塞程度是合适的。 TCP 网络是可靠数据传输,采用分组交换技术来提高网络链路的利用率,也就是说,路由器队列缓存如果是满的,则网络利用率最高,但传输延迟大;队列始终是空的或不满,则网络利用率低,传输延迟小。所以拥塞控制的目标就是实现网络利用率和传输延迟等综合性能指标达到最优化,提高网络的总体性能,保证网络系统长期的稳定性和鲁棒性。
TCP 的实现包含四个连续的基本过程, 其实是四个不同的阶段,分别是:慢启动、拥塞避免、快速重传和快速恢复。
慢启动:当一个新的 TCP 连接建立时,发送方发送一个缺省大小为 512 字节的 TCP 报文段(segment),称为拥塞窗口(cwnd),该 cwnd的值被初始化为一个数据包, 因此每经过一个 RTT,cwnd 将指数增加。该算法的原理就是将能发送到网络的新数据包的发送速率对应从接受端返回的确认消息的速率。
拥塞避免: 拥塞避免的触发条件是当发现接收方的 ACK 确认包超时到达或者收到了三个相同的 ACK 确认包时,TCP 就认为网络中出现了拥塞,开始执行拥塞避免算法,这里的触发条件是有前提条件的, 那就是 TCP 假设由于线路传输引起的数据包损坏和丢失的概率非常小,Jacobson V 在 1988 年提出的值为小于 1%时条件就成立。 在这一阶段,慢启动阈值(ssthresh)设置为 cwnd 的一半,如果是超时,cwnd 则被置 1。 如果此时 cwnd<=ssthresh。 TCP 就重新进入慢启动,如果 cwnd>ssthresh,TCP 进入拥塞避免, 发送方每收到一个 ACK,则cwnd=cwnd+1/cwnd。可见慢启动阶段 cwnd 的增加是指数的,而拥塞避免阶段则是线性的。
快速重传和快速恢复:发送方不等到数据包超时,在收到三个或三个以上的重复 ACK 时就判断数据包已经丢失, 这样不用等定时器超时后 cwnd 置 1,就马上重传该数据包,同时将 ssthresh 的值置为当前 cwnd 的一半,这种算法来保证 TCP 保持足够的吞吐量。 快速恢复的算法是:(1)当第三个重复的 ACK 到达,设置 ssthresh=cwnd/2;重传丢失的报文;设置 cwnd=ssthresh+3。加 3 是因为三个重复的 ACK 表示有三个数据包已经被接受方缓存了。 (2)每次有一个更多的重复 ACK到达,把 cwnd 加 1 并在可能的情况下传输一个报文段。 (3)当确认新数据的下一个 ACK 到达时,设置 cwnd=ssthresh,进入拥塞避免。
3 TCP拥塞控制算法的改进
3.1 慢启动的改进
随着 Internet 应用在互联网络中的占的比例逐步增大,Web 数据流占了网络流量的相当部分,这些 TCP 连接的数据量一般都很短小,通过了解 TCP 拥塞控制原理, 我们知道短 TCP 流主要工作的阶段是慢启动阶段, 它不具备长 TCP 流的传输时间, 无法达到拥塞避免阶段,所以短 TCP 流的问题是,如果一个分组丢失,按照拥塞控制算法,需要等待定时器超时重传,这在带宽竞争上就无法和长 TCP 流竞争,从而造成网络的拥塞节点处,长 TCP 流会挤掉短 TCP 流,使贷款分配不均。针对这些问题,研究者们提出了传统的慢启动存在的两个问题:(1)数据发送从一个数据包开始,要经过多个 RTT 才能达到较大吞吐量, 这不利于流量小但是链路延迟又比较大的 TCP 流的传输;(2)采用指数增长的方式发送数据造成了数据突发, 易引起瓶颈链路的拥塞。
针对第一个问题,大家提出了很多解决方法,比如采用大的初始窗口,将初始窗口从 1MSS 增加到 4MSS,(Allman M.et al, 1998),这种方法虽然可以改善慢启动的性能,但是不能适应多变的网络带宽。 还有就是将各个 TCP 连接的信息共享(Padmanabhan V.et al,1998;TouchJ,1997;Savage S.et al,1999),后面的连接可以使用具有相同目的地址的连接信息,从而可以减少慢启动的时延,但是这样会使连接很快造成网络拥塞,而短 TCP 的长度只需要几个 RTT 就可以传输完毕,网络拥塞会造成额外的时延。 再后来提出了将初始窗口设定为 4 个分组,而从以快速重传来减少重传超时造成的传输时延(Mellia M.et al,2001)。
解决第二个问题可以通过使用带宽时延的估计来设定初始慢启动阈值 ssthresh(Hoe J,1996)。 Smoot-start 方法(Marchese M,2001)使发送方从慢启动阶段较为平滑的过渡到拥塞避免阶段,减少了数据包丢失和突发流,当拥塞窗口到达 Smsthresh 后,采用比较平缓的指数方式增长拥塞窗口,逐渐达到默认值或估算的 ssthresh 值。
3.2 快速重传和快速恢复的改进
有时发送端减少拥塞窗口值并不是因为分组丢失,而是分组数据传输中顺序错误引起的重复 ACK。 有限传输机制 (Allman M,Balakrishman H.and Floyd S.2001)是一种改进方法 ,当发送端收到一个或两个重复的 ACK 后,如果被允许,发送端就发送一个新的分组。
这种方式对错序的状况有较好的调节作用。 还有 D-SACK 方式,是一种基于 SACK 的方式,通过给 TCP 发送端一个附加信息,来判断是否发生了不必要的重传,D-SACK 通过接收端受用 SACK 选项来报告收到了重复的分组序列,D-SACK 在容易引起错序的环境下提供更高的效率。
快速恢复的改进机制有SACK (Selective Acknowledgement),FACK(Forward Acknowledgement),TCP New-Reno 等。 SACK 方式的接收端通过 ACK 向发送端通过所有正确的分组, 发送端只需重传真正丢失的分组。FACK 是基于 SACK 的改进,它们的问题都是增加了 TCP的复杂性,对 TCP 版本的兼容性较差。 TCP New-Reno 不需要接收端的特殊支持,相对实现起来简单,但是数据传输效率相对不高。 Rate-Halving(Allman M ,Dawkins S,Glover D,et al,2000)是 FACK 的一个比较新的版本。 在快速恢复阶段, 每收到 2 个 ACK 发送一个新的分组, 从而在一个 RTT 里将拥塞窗口减小到网络能处理的分组数的一半大小,并保持了 TCP 的自计时特性。
目前,TCP 基于窗口的拥塞控制策略被广泛的应用。 各种改进的TCP 控制策略在不同侧面解决了一定的问题, 但是也有着局限性,有的实现起来过于复杂,有的解决了多个分组丢失的恢复问题,但对恢复过程中出现的分组丢失却无法得到解决。
4结束语
在实际的应用中,针对不同特点的 TCP 网络,有着适合的改进策略,这些策略不用做到面面俱到,只要具有一定的针对性就可以。网络拥塞的改进是十分灵活的,方法也很非常多,其原因正式因为不同网络中传输的数据特点不同,从而选择合适的改进策略是关键。
参考文献:
TCP 拥塞控制研究李 婷(西安财经学院统计学院,陕西 西安710061).