TCP拥塞控制( 二 )


和[Jac90]中被提出 。在某些情况下,比算法的限定更加保守地行事也许对一个TCP发送端更
有益,无论如何,TCP不能超出下列算法的限定(也就是说,当下列算法计算出来的cwnd值
不答应数据被发送时,就不能发送数据) 。
3.1慢启动和拥塞避免
慢启动和拥塞避免算法必须被TCP发送端用来控制正在向网络输送的数据量 。为了
实现这些算法,必须向TCP每连接状态加入两个参量 。拥塞窗口(cwnd)是对发送端收到确
认(ACK)之前能向网络传送的最大数据量的一个发送端限制,接收端通知窗口(rwnd)是对
未完成数据量的接收端限制 。Cwnd和rwnd的最小值决定了数据传送 。
另一个状态参量,慢启动阀值(ssthresh),被用来确定是用慢启动还是用拥塞避免
算法来控制数据传送,讨论如下:
在不清楚环境的情况下向网络传送数据,要求TCP缓慢地探测网络以确定可用流量,
以避免忽然传送大量数据而使网络拥塞 。在传送开始时,或者在修复了由重发定时器探测到
的数据丢失之后使用慢启动算法来达到此目的 。
IW,cwnd的初始值,必须小于或等于2*SMSS字节而且不能大于两个数据段 。
我们注重到一个非标准的,实验性的TCP的扩充答应TCP使用一个更大的初始窗口
(IW),在等式1中给予定义[AFP98]:
 IW=min(4*SMSS,max(2*SMSS,4380bytes))(1)
有了这个扩充,TCP发送端可以使用一个3或4数据段的初始窗口,只要这些数据
段的总尺寸不超过4380字节 。我们没有将这一改变作为这篇文档定义的标准的一部分 。但是,
我们在这篇文档的剩余部分包含了对(1)的讨论,将它作为那些实验的指导方针,而不是遵
守目前的TCP拥塞控制标准 。
Ssthresh的初始值可以任意大(比如,一些实现使用通知窗口的尺寸),但是作为
对拥塞的响应,其大小可能会被减小 。慢启动算法在cwnd在cwnd>ssthresh时使用 。当cwnd和ssthresh相等时,发送端既可以使用慢启动也可以使
用拥塞避免 。
在慢启动期间,一个TCP的cwnd对每一个接收到的用于确认新数据的ACK至多增加
SMSS字节 。当cwnd超过ssthresh(或者,当cwnd大小达到ssthresh的大小,如上所述)
或者当观察到拥塞时慢启动结束 。
在拥塞避免期间,cwnd以每个往返(RTT)1满尺寸数据段的速度递增 。拥塞避免继
续保持直到拥塞被检测到 。等式2给出了一个普通使用的在拥塞避免期间用来修正cwnd值的
公式
cwnd =SMSS*SMSS/cwnd(2)
此修正被实行于每个新到的非重复ACK 。等式(2)为cwnd以每个往返(RTT)1满
尺寸数据段的速度递增的潜在原则提供了一个可接受的近似值 。(注重,假如连接的接收端对
每一个数据段都要确认,(2)被证实了比每RTT一数据段更有冒险,对每隔一个包进行一次
确认的接收端来说,(2)冒的险更少一些 。
实现说明:因为整数式经常用于TCP实现,等式2中给出的公式在拥塞窗口非常大
时也许不能够增加cwnd值 。假如上述公式结果为0,结果应被设成1字节 。
实现说明:早期的实现在等式(2)的右边有一个另外的附加值 。这是不合理的,在
实际中能导致性能降低[PAD 98] 。
另一种在拥塞避免期间增加cwnd值的可接受的方法是计算由ACK确认的数据的字节
数(这种实现的一个缺点是它要求维持一个另外的状态参量) 。当确认的数据的字节数达到
cwnd值,cwnd值能被增加到SMSS字节 。注重到在拥塞避免期间,cwnd每次的增加量既不能
大于每RTT一满尺寸数据段,也不能大于等式2计算的值 。

推荐阅读