TCP 拥塞控制(慢开始 拥塞避免 快重传 快恢复)
前言
所谓拥塞控制,是指防止过多的数据注入网络,以使网络中的路由器或链路不致过载。出现拥塞时,端点并不了解到拥塞发生的细节面对通信连接的端点来说,拥塞往往表现为通信时延的增加,当然,拥塞控制和流量控制也有相似的地方,即他们都通过控制发送方发送数据的速率来达到控制效果。
拥塞控制与流量控制的区别:拥塞控制时让网络能承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能相关的所有因素。相反,流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,一遍使接收端来得及接收。
比如:某个链路的传输速率为10Gb/s,某巨型机向一台PC以1Gb/s的速率传送文件,显然网络的带宽使足够大的,不存在拥塞问题,但如此高的发送速率将导致PC可能来不及接收,因此必须进行流量控制。但若有100万台PC在此链路上以1Mb/s的速率传送文件,则现在的问题就变成了网络的负载是否超过了现有网络所能承受的范围。
为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下4中算法:满开始、拥塞避免、快重传、快恢复。
发送方在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP协议要求发送方维护以下两个窗口:
- (1)接收窗口rwnd(receive windows):接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。
- (2)拥塞窗口cwnd(congestion windows):发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络的当前容量。只要网络未出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络的分组数。
发送窗口的上限值应取接收窗口rwnd和拥塞窗口cwnd中较小的一个
发送窗口的上限值 = min{rwnd,cwnd}
注:接收方总有足够大的缓存空间,因而发送窗口大小由网络的拥塞程度决定,也就是说,可以将发送窗口等同为拥塞窗口。
????思考:接收窗口的大小我们知道可以根据TCP报文首部的窗口字段通知发送方,而发送方如何维护拥塞窗口呢?
慢开始和拥塞避免
慢开始算法
再TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd = 1,每经过一个传输轮船(即往返时延RTT),拥塞窗口就会加倍,即cwnd得大小指数式增长。这样慢开始一直把拥塞窗口cwnd增大到一个规定得慢开始门限ssthresh(阀值),然后改用拥塞避免算法
拥塞避免算法
发送端得拥塞窗口美经过一个往返时延RTT就增加一个MSS得大小,而不是加倍,使cwnd按线性规律增长(即加法增大),而当出现一次超时(网络拥塞)时,令慢开始门限ssthresh等于当前cwnd的一半(即乘法减小),但不能小于2,同时cwnd重新设置为1,执行慢开始算法。
根据cwnd得大小执行不同得算法,可归纳如下:
- 当cwnd < ssthresh,使用慢开始算法
- 当cwnd > ssthresh时,停止使用慢开始算法改用拥塞避免算法。
- 当cwnd = ssthresh时,既可以使用慢开始算法,又可使用拥塞避免算法(通常为拥塞避免算法)
慢开始和拥塞避免算法以及拥塞处理示意图:
快重传和快恢复
快重重和快恢复算法时对慢开始和拥塞避免算法的改进
快重传
快重传技术使用冗余ACK来检测丢包的发生。同样,冗余ACK也用于网络拥塞检测(丢了包当然意味着网络可能出现了拥塞)。快重传并非取消重传计时器,而是再某些情况下可更早地重传丢失的报文段。
当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文端,而不必等待那个报文段设置的重传计时器超时
快恢复
快恢复算法的原理是:发送端收到连续三个冗余ACK(即重复确认)时,执行“乘法减小”算法,把门限ssthresh设置为出现拥塞时发送方cwnd的一半,与慢开始把cwnd设置为1的不同之处是。它把cwnd的值设置为门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。