组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:廖正军(jerry.liao   jerry.liao@163.net)
译文发布时间:2001-7-5
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。




Network Working Group                                         M. Handley
Request for Comments: 2861                                     J. Padhye
Category: Experimental                                          S. Floyd
                                                                   ACIRI
                                                               June 2000
TCP 拥塞窗口检验
(TCP Congestion Window Validation)
 
本备忘录的状态
本文档讲述了一种Internet社区的实验协议,它并没有制定一种Internet标准,需要进
一步进行讨论和建议以得到改进。本备忘录的发布不受任何限制。
版权声明
Copyright (C) The Internet Society (2001).
摘要
TCP 拥塞窗口控制网络中一个TCP流的包的数目,然而,发送方长时间无响应或者由
于应用程序的限制会导致拥塞窗口的无效,此时,拥塞窗口不在反映网络的当前状况,本文
档描述了对TCP拥塞控制算法的一种简单修正,使得在发送后一段足够长的时间后,拥塞
窗口。同时使用慢启动决值来保存拥塞窗口以前的值。
当拥塞窗口在应用程序限制期间增加时,也会导致一个无效窗口,而原来拥塞窗口的值
可能从来没有利用,我们建议在TCP发送方有应用程序限制时,不增加拥塞窗口的大小,
我们从采用模拟和FREEBSD中实现的实验揭示了这些算法。

目录
1 转换和异义 2
2 介绍 2
3 描述 3
3.1 减小拥塞窗口的基本算法 4
3.2减小拥塞窗口的伪码 4
4 模拟 5
5 实验 5
6 结论 6
7 参考 6
8 安全性考虑 7
9. 作者地址 7
10. 版权说明 8
致谢 8

1 转换和异义
关键字MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, 
RECOMMENDED, MAY, and OPTIONAL,出现在本文中时,参照[97]中的解释。

2 介绍
TCP拥塞窗口控制网络中一个TCP流中包的数量,拥塞窗口采用慢增快减(AIMD)的机
制来试探网络带宽,作动态调整了改善网络状态。AIMD机制在发送方有连续的数据发送时
工作良好,这对使用缓冲数据的TCP来说是很典型的。对于使用TCP的TELNET应用程序
来说,发送方只有很少的数据或没有数据发送,发送速率也是由用户产生数据的速率决定的,
随着WEB的诞生,包括动态产生数据的TCP发送方和持续连接TCP的HTTP1.1的发展,
应用程序限制和网络限制之间的交互变得越来越重要,更精确的说,我们把网络限制期间定
义为发送者以满窗口大小发送数据,
当发送者由于应用程序限制而造成时间太长会导致拥塞窗口的无效,在由于网络限制期
间,由于窗口数据总是没有丢失,拥塞窗口总是被检验有效,此时,总是有超时新数据的确
认输入流给出网络中最近可用的带宽,与之相反,在由于应用程序限制期间,用拥塞窗口来
估计可用带宽随着时间流逝而准确性降低,特别的,被用来网络限制的容量可能会被其他的
流量占用,
当前的TCP实现在一段时间的IDLE后,有一些启动的措施,在IDLE的时间超过RTO
估计值(正如RFC2581和附录[VJ88]所建议的)后,一些TCP实现采用慢启动机制,而其他
的实现则并不降低它们的拥塞窗口,RFC 2581 中推荐:如果TCP在超过超时重发的间隔内
没有数据发送,TCP应将窗口大小设置成不超过原来窗口大小,在[HTH98]中讨论了在IDLE
后TCP慢启动的建议,除了在TCP和IP环境中,拥塞信息的检验也在其他的环境中提到,
如在ATM网络中的“或使用它,或丢弃它”的机制中。
在一段应用程序限制后,为了讨论拥塞窗口的有限性,我们对TCP的拥塞控制算法作
了一点简单的修改,使得在发送后拥塞窗口的大小从一段足够长的应用程序限制退化到网络
限制期间,特别的,在一段IDLE后,对于在每个数据流保持IDLE的RTT内,发送方都应
将它的拥塞窗口减半。
当拥塞窗口大小减小时,慢启动的阕值保留为最近拥塞窗口的大小,特别的,在一段应
用程序限制之后,阕值从不降低,在窗口减小以前,阕值被设为它的当前最大值,这种阕值
的使用容许TCP发送方在一段应用程序限制后增加它的发送速率来加快慢启动恢复拥塞窗
口的以前的值,更精确的,在一段应用程序限制后,拥塞窗口减小,如果阕值小于窗口大小
的3/4,那么阕值在拥塞窗口减小之前,阕值增加到窗口的3/4。
在应用程序限制期间,当拥塞窗口增大时,也会导致无效的拥塞窗口,而拥塞窗口原来
的值可能从来没有使用,我们都知道,当有确认帧到达时,如果接收方的广告窗口和满启动
及拥塞避免算法容许,没有检查拥塞窗口原来的值有没有被使用,当前所有的TCP实现都
增加拥塞窗口大小, 本文建议在应用程序限制期间,并不激活窗口增加算法[MSML 99],
特别的,当TCP发送方在应用程序限制时,发送方并不增加拥塞窗口,这种限制防止拥塞
窗口的任意增加,以防止拥塞窗口不被网络支持,在[MSML 99 SETION 5.2]中:“这种限制
保证只有在TCP实际上向网络成功发送数据后,窗口大小才增加。”
在一段应用程序限制后保持一个大的拥塞窗口一个值得考虑的问题是在一段静止期间
后,发送方突然有大量的数据要发送,可能立即发送一个满窗口的包的数据,这种发送突发
大量包的问题可以被基于速率的方法(RBP, [VH97])有效的处理,或者最大发送数据控制
[FF96],即使使用限制包的发送机制,一个没有充分使用的拥塞窗口不能被作为当前可用带
宽的表示,
3 描述
当一个TCP发送者有足够的数据来充分使用网络容量时,窗口大小和阕值将被设置为与网
络状况相似的值,当TCP发送方停止发送数据时,流将停止采样网络状况,并将导致拥塞
窗口的值不准确,我们相信,在这种环境下,对每个RTT内流不活动的状况,将拥塞窗口
减半是一种正确的处理方法,减半的值是很保守的数值,这是建立在有丢包的情况下,倍减
将多快减小窗口的基础上。
另一种可能是发送者并不停止发送,是由于应用程序限制而不是网络限制,使得提供的数据
少于拥塞窗口容许发送的数据。在这种情况下,TCP流仍然采样网络状况,但并不提供足
够的流量来保证在网络中有足够的带宽来以满拥塞窗口来发送数据,在这些情况下,我们相
信,对发送方而言,在每个RTT中跟踪拥塞窗口的最大值,并将拥塞窗口的值设为当前窗
口和曾经的最大值的均值,是一种正确的处理。
在拥塞窗口减小以前,阕值被设为当前值和窗口的3/4两者之中的最大值,如果发送方
有比减小了的窗口大小有更多的数据发送,TCP将慢启动窗口值到原来窗口的值。
窗口的3/4可以理解为拥塞窗口的最近一段时间内的保守估计值,且TCP 应能慢启动
到这个值,每次拥塞窗口达到某个最大值,TCP 降低其拥塞窗口的大小,当处于这种稳定
状况,拥塞窗口的平均值为最大值的3/4,当连接变为应用程序限制时,窗口大小将变为最
大值的3/4,在这种情况下,窗口大小本身代表了拥塞窗口大小的平均值,然而,当窗口等
于最大值时,如果连接变为应用程序限制,那么拥塞窗口的平均值为窗口的3/4。
有一种可能性是将阕值设为当前阕值和窗口原来大小两者之间的最大值,容许TCP慢
启动至窗口的原来大小,对于阕值的设置,可以做更进一步的实验来评估这两种选择。
在对于一个确认帧的回应时,对于拥塞窗口的增加的各种情况,我们相信,当确认帧到
达时,只要窗口是满的,增加拥塞窗口都是正确的处理方法。
我们把这种改进称为TCP拥塞窗口校验(CWV),因为这总是保证拥塞窗口总反映当前
的网络状况,
3.1 减小拥塞窗口的基本算法
在CWV算法中,一个关键的问题是在应用程序限制的流中,对每一个往返时间内,如
何将这些原则应用于降低拥塞窗口中去,我们使用TCP 的重发超时器作为往返时间的合理
上限,并在每一个重发超时内迅速降低拥塞窗口大小。
基本算法在TCP中可按如下进行实现:当TCP发送一个新包时,它检查自从前一包发
送后,是否已过了一个重发超时,如果是,则阕值设为窗口的3/4和当前阕值两者之间的最
大值,然后,自从前一包发送后过一个重发超时,则将拥塞窗口减半,另外,T_prev被设
置为当前时间,而W_used被重置为0,T_prev被用来决定自从发送的上一次网络限制或在
一段IDLE已经减小了窗口后的流逝的时间,当发送方是应用程序时,W_used保留自从发
送方为上一次网络限制来的被使用的最大拥塞窗口值。
在最近IDLE时间内决定RTO的数目的机制可以通过一个计时器来实现,计时器在最
后一次的包发送后的每一个RTO内超时,而不是检查每一个包,在不同操作系统上的效率
将表现那一个更容易实现。
在TCP发送一个包以后,它会检查这个包是否填满了拥塞窗口,如果是,发送者是受
网络限制的,并把T_prev的值设为当前TCP的时钟,W_used被置为0。
当TCP发送一个没有填满拥塞窗口的包时,并且TCP发送队列为空时,发送者是受应
用限制的,发送方检查未确认的帧是否比W_used大,如果是,W_used被置为未确认的帧
数,另外,TCP检查自从T_prev以来流逝的时间是否大于RTO,如果是,TCP在一个RTO
间隔内,但小于两个RTO内是应用程序限制,而不是网络限制的,在这种情况下,TCP将
阕值设为窗口的3/4和当前阕值两者之间的最大值,并将其拥塞窗口减小到(cwnd+W_used)/2. 
W_used被置为0,T_prev的值设为当前的时钟,这样直到另一个RTO流逝,才会进一步减
小拥塞窗口,因此,在应用程序限制时,CWV算法每个RTO减低拥塞窗口的大小。
3.2减小拥塞窗口的伪码

   Initially:
       T_last = tcpnow, T_prev = tcpnow, W_used = 0

   After sending a data segment:
       If tcpnow - T_last >= RTO
           (The sender has been idle.)
           ssthresh =  max(ssthresh, 3*cwnd/4)
           For i=1  To (tcpnow - T_last)/RTO
               win =  min(cwnd, receiver's declared max window)
               cwnd =  max(win/2, MSS)
           T_prev = tcpnow
           W_used = 0

       T_last = tcpnow

       If window is full
           T_prev = tcpnow