TCP的拥塞控制
一、拥塞控制的一般原理
1.1.简介
-
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。
-
出现资源拥塞的条件:
对资源需求的总和 > 可用资源
-
拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
-
流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
1.2.拥塞控制所起的作用
- 吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量。比如某网络的带宽为100M,那么该网络的最大吞吐量为100M/s 。
- 可以看到,理想的拥塞控制为:随着传输数据量(负载)的增加,数据传输速度(吞吐量)越来越快,当吞吐量达到网络的最大带宽时,继续增大传输数据量,传输的速度(吞吐量)也不会再增加,所以这样并不会造成网络拥塞导致传输速度(吞吐量)下降。例如,路由器间的带宽为100M,当传输150M数据时,路由器把处理不过来的50M数据扔掉,继续保持100M的传输速度。
- 当无拥塞控制时,假设两路由器间的网络带宽为100M,当传输的数据小于100M时,随着数据量(负载)的增加丢包情况越来越明显,此时成为轻度拥塞;当传输的数据量(负载)大于100M时,大量的数据包使路由器无法及时处理,错误情况越来越多,最后路由器死机,无法传输数据导致死锁,此时吞吐量为0。
- 在实际的拥塞控制中,网络设备随着传输的数据量(提供的负载)越来越大,传输的速度(吞吐量)越快,丢包率也越来越大,依靠拥塞控制机制会适当降低数据传输的速度(吞吐量),以减少拥塞。
二、拥塞控制方法
2.1.简介
-
发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变量。
拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。
-
发送方控制拥塞窗口的原则是:
- 只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。
- 只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
2.2.慢开始和拥塞避免(1988年提出)
- 慢开始图例:
发送窗口一般等于拥塞窗口。
第一轮:刚开始cwnd=1,发送窗口也为1,发送方先发送一个报文M1测试连接通畅程度,当收到对M1报文的确认之后,cwnd+1,即发送窗口变为2,可以同时发送两个报文M2~M3;
第二轮:发送方发送两个报文M2~M3,发送方收到了M2报文的确认后使cwnd+1变为3,收到了M3报文确认后cwnd+1变为4,即每收到一个对新报文的确认(重传的不算在内)就使cwnd+1。由此cwnd=4,即发送窗口也为4,可以同时发送四个报文M4~M7 。
以此类推第三轮之后cwnd=8。传输速度由慢开始,每轮翻倍,最后传输速度越来越快。
传输轮次 (transmission round)
- 使用慢开始算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍。
- 一个传输轮次所经历的时间其实就是往返时间 RTT。
慢开始门限状态变量ssthresh
- 当 cwnd < ssthresh 时,使用慢开始算法(cwnd每轮加倍)。
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
- 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。
- 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
当网络出现拥塞时
- 无论处于慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认数据包),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方发送窗口值(多数情况下等于cwnd)的一半(但不能小于2)。
- 然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
- 这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
**慢开始和拥塞避免算法的实现举例 **
- 可以看到,开始时采用慢开始算法,每经历一轮cwnd翻倍,传输的数据包翻倍,到第4轮时cwnd=16,意味着可以同时发送16个数据包,到达了设定的慢开始门限值ssthresh,随后采用拥塞避免算法。
- 采用拥塞避免算法期间,每经历一轮cwnd+1。当cwnd=24时,发送方不能准时收到确认数据包(即丢包),判断出现网络拥塞,于是把慢开始门限值ssthresh重新设为当前cwnd值(24)的一半,即12,并把cwnd重置为1 ,再次进入慢开始阶段。
- 可以看到:采用慢开始算法,cwnd按指数规律增长;采用拥塞避免算法,cwnd按线性规律增长。
注意
-
“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
-
“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
2.3.快重传和快恢复(1990年提出)
快重传举例
当不出现丢包情况时,接收方是每接收多个数据包才给发送方一个确认。例如每收到5个连续的数据包,发送以此确认信息。
当出现丢包情况时:如发送数据包M1~M5,丢失了M3,如按上述规律,接收方要等到接收完M5后才能向发送方反馈丢失M4的信息。实际上,接收方接连收到不连续的数据包M2、M4,就已经发现丢失了M3,可采用以下的快重传方式。
- 快重传算法要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方尽早知道有报文段没有到达接收方。
- 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
**快恢复算法 **
-
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。
-
由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1 。而是将cwnd当前值减半作为新的慢开始门限 ssthresh 值,并让cwnd的值等于这个新的慢开始门限ssthresh值。
也有人认为,由于接收了三个重复的ACK,按照上述规律没收到一个ACK,cwnd+1,所以cwnd=新ssthresh+3,这里采用前一种观点。
随后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。 这便是快恢复算法。
-
下为图例:
可以看到,当发送端收到3个重复的确认后,执行快重传算法,cwnd
快恢复是配套着快重传使用的,快恢复是相对于慢开始算法而言的。使用快恢复算法时,cwnd从较大值开始,通过拥塞避免算法逐渐线性增大,经过较短时间便能恢复比较快的传输速度;使用慢开始算法时,cwnd从1开始,需要较常时间才能达到较快的速度。
2.4.发送窗口的上限值
前面讲过发送方的发送窗口是由接收方的接收窗口决定的。例如接收方的接收窗口为100字节,那么发送方的发送窗口就为100字节。实际上:
- 发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:
- 即刚开始发送数据时,由于网络情况未知cwnd的值由1开始按指数规律增大,而接收窗口的是固定的假设为100字节。此时 cwnd < rwnd ,网络的拥塞窗口cwnd限制了发送窗口的最大值。
- 之后cwnd的值越来越大,最后被限制在接收方的接收窗口大小100字节上。此时此时 cwnd > rwnd ,接收方的接收能力限制了发送窗口的最大值。