5.8.9 TCP拥塞控制
我们先来说一个生活中的例子,在节假日到来的时候,由于高速公路免费通行,大量汽车涌上高速公路,最终造成交通拥堵,类似的情况也有可能出现在网络中,由于核心的交换设备在存储、带宽、速率等方面限制,如果数据量过大,就有可能造成核心设备的拥塞,所以我们知道拥塞控制的基本功能是避免网络发生拥塞,或者缓解已经发生的拥塞,TCP/IP拥塞控制机制主要在传输层TCP实现,TCP为了能够进行有效的拥塞控制需要通过拥塞窗口cwnd(congestion window)来衡量网络的拥塞程度,这里需要注意的是发送窗口的取值要依据拥塞窗口和接收窗口中取小的一个。鉴于**接收窗口rwnd(receive window)**在流量控制我们已然了解(5.8.8 TCP流量控制),所以这里我们只关注拥塞窗口。这里我们家庭接收窗口足够大。
为了更好的进行拥塞控制,在Internet标准中推荐使用以下四种技术。
- 慢启动(Slow start)
- 拥塞避免(Congestion avoidance)
- 快速重传(Fast retransmit)
- 快速恢复(Fast Recovery)
一、慢启动算法
指在TCP刚建立连接或者当网络发生拥塞超时的时候,将拥塞窗口cwnd设置成一个报文段大小,并且当cwnd ≤ \leq ≤**ssthresh(门限值)**时,指数方式增大cwnd(即每经过一个传输轮次,cwnd加倍)
慢启动算法在两种情况下使用
- TCP刚建立连接的情况下
- 当网络发生拥塞超时的时候
二、拥塞避免算法
当cwnd ≥ \geq ≥ssthresh时,为避免网络发生拥塞,进入拥塞避免算法,这时以线性方式增大cwnd(即每经过一个传输轮次,cwnd只增大一个报文段)
三、快速重传算法
指发送方如果连续收到三个重复确认的ACK(即对同一个报文段的重复的确认ACK),则立即重传该报文段,而不必等待重传定时器超时后再重传。
四、快速恢复算法
它是与快速重传拥塞控制算法配合使用的,是指当采用快速重传算法的时候,直接执行拥塞避免算法。这样可以提高传输效率。
在四个算法中我们看到门限值(ssthresh)是为了防止因数据发送过大而引起的网络拥塞,它是在几种拥塞控制算法之间切换的一个阈值,它的值设置为出现拥塞时的发送窗口值的一半,当然它必须要大于等于2,不管是慢启动还是在拥塞避免的阶段,只要网络发生超时的现象就必须退回到慢启动阶段,拥塞窗口从一个报文段大小重新开始,如果采用的是快速重传算法,则拥塞窗口就是调整之后的门限值,如此以来就可以提高网络的吞吐量。
五、四种算法的关系
如图
在TCP刚建立连接使用慢启动拥塞控制算法,同时设定好初始的门限值,当拥塞窗口cwnd ≥ \geq ≥门限值ssthresh时则进入拥塞避免算法,图中我们可以看到,有两种情况发生
- 收到三个对同一报文段重复的确认ACK,那就说明网络中出现了丢包的情况,但情况不是很严重,因为确认报文段能够回复给发送方,此时的门限值设置成当前发送窗口值的一半,当然必须要大于等于2,直接进入到快速重传和快速恢复阶段。
- 如果出现了网络拥塞,出现网络拥塞的标志就是发送方发送了数据之后没有能够在重传时间RTO之内收到来自接收方的确认报文段,此时发送方就将缓存中的数据重新发送,此时就认为是网络因为发生了拥塞而丢包,此时就要减少进入到网络的报文段,重新执行慢启动拥塞控制算法。
这里我们应重点理解TCP拥塞控制中的慢启动、拥塞避免算法的背景、工作条件、算法的原理和算法的切换过程,对于慢启动我们应该知道它在开始的时候数值比较小,是一个报文段的长度,但是它是以指数的方式来增大拥塞窗口的过程所以这里就会出现一个问题,即网络进入饱和的状态非常容易,但是让网络从饱和状态恢复过来却很难,所以这里就需要给定一个门限值,当超过门限值之后我们就要执行拥塞避免的控制算法,它是以线性的方式来增大窗口,同时我们也知道发送窗口的取值是拥塞窗口和接收窗口之间的较小的那一个。