【概述】
拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不至于出现过载
当出现拥塞时,端点并不能了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为时延的增加
比较来说,拥塞控制是让网络能够承受现有网络负荷,是一个全局性的过程,涉及到所有的主机、路由器、与降低网络传输性能有关的因素;流量控制,是端到端的通信量控制,通过抑制发送端发送速率,来使接收端来得及接收
在 TCP 中,流量控制由接收方根据其放在 TCP 报文段首部的窗口字段来通知发送方,从而保证将未确认的数据量控制在接收窗口 rwnd
的范围内;拥塞窗口,就是通过一定的算法,来维护拥塞窗口 cwnd
的大小
为了对 TCP 进行拥塞控制,定义了四个算法:慢开始、拥塞避免、快重传、快恢复
【慢开始与拥塞避免】
慢开始
当 TPC 连接建立完毕,刚开始发送 TCP 报文段时,先令拥塞窗口 cwnd=1
,即一个最大报文段长度 MSS,之后,每收到一个对新的报文段的确认后,就令 cwnd
加 $1$
例如,A
向 B
发送数据,发送时 A
的 cwnd=2
,那么 A
一次可以发送 $2$ 个 TCP 报文段,当经过一个传输轮次 RTT 后,A
收到 B
对刚才 $2$ 个 TCP 报文段的确认,于是就令 cwnd=4
,下一次发送就可发送 $4$ 个报文段
在使用慢开始算法后,没经过一个传输轮次,拥塞窗口 cwnd
就会加倍,其大小呈指数型增长
这样,慢开始一直将拥塞窗口 cwnd
增大到一个事先规定的慢开始门限 ssthresh
,之后,采用拥塞避免算法
拥塞避免
拥塞避免是指:当发送方的拥塞窗口 cwnd
每经历一个 RTT,就增加一个 MSS,即令 cwnd
加 $1$,这使得 cwnd
线性增长,即加法增大
综上,根据 cwnd
与 ssthresh
的大小,可以进行如下归纳:
cwnd
$<$ssthresh
:执行慢开始算法cwnd
$>$ssthresh
:执行拥塞避免算法cwnd
$=$ssthresh
:可以使用慢开始也可以使用拥塞避免,通常使用拥塞避免
网络拥塞的处理
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件发生,即没有收到确认,重传计时器超时,就可认为网络出现拥塞
此时,要将慢开始门限 ssthresh
设为出现拥塞时发送方 cwnd
的一半,即乘法减小,同时,令 cwnd=1
,之后,执行慢开始算法
这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间将队列中积压的分组处理完毕
也就是说,拥塞避免并非完全避免拥塞,而是指在拥塞避免阶段,将拥塞窗口 cwnd
控制为线性增长,在出现拥塞时减少网络分组,使网络比较不容易出现拥塞
慢开始与拥塞避免的实现过程
下面给出一个慢开始与拥塞避免实现过程的示例图
初始时,拥塞窗口 cwnd=1
,慢开始门限 ssthresh=16
之后,发送方每收到一个确认 ACK,cwnd
的值就加 $1$,即 cwnd
呈指数增大
当拥塞窗口 cwnd=ssthresh
,即 cwnd=16
时,改为采用拥塞避免算法,此时 cwnd
呈加法增大
假定 cwnd=24
时,出现拥塞,那么,设置 ssthresh=12
,并令 cwnd=1
,此时,cwnd
呈乘法减小
之后,重新开始执行慢开始算法,当 cwnd=12
时,改为执行拥塞避免算法
要注意的是,在慢开始阶段,若 $2cwnd>ssthresh$,则下一个 RTT 的cwnd
应该等于 ssthresh
,而不是 2cwnd
,即 *cwnd
不能跃过 ssthresh
在上例中,第 $16$ 个轮次 cwnd=8
,ssthresh=12
,第 $17$ 个轮次 cwnd=12
,而非 $16$
【快重传与快恢复】
快重传与快恢复是对慢开始和拥塞避免的改进,其在两者的基础上引入了 TCP 可靠传输机制中的冗余 ACK 机制
在拥塞控制中,慢开始、拥塞避免、快重传、快恢复,实际上是同时应用在拥塞控制机制中的,当发送方检测到超时就采用慢开始和拥塞避免,当发送方接收到三个冗余 ACK 就采用快重传和快恢复
快重传
在 TCP 可靠传输机制中,快速重传技术使用了冗余 ACK 来检测丢包的发生,而在网络中,丢包,说明网络可能出现拥塞
快重传即当发送方连续收到三个重复的 ACK 报文时,直接重传尚未收到的报文段,不必等待该 TCP 报文段设置的重传计时器超时
快重传并非取消重传计时器,而且在可能丢包的情况下更早地重传丢失的报文段
快恢复
快恢复是指:当发送方连续收到三个冗余 ACK 报文时,就认为网络中出现丢包,开始执行乘法减小,令慢开始门限 ssthresh
为发送方拥塞窗口 cwnd
的一半
与慢开始算法将 cwnd
设为 $1$ 不同,快恢复将 cwnd
的值设为 ssthresh
改变后的数值,之后开始执行拥塞避免算法,令拥塞窗口加法增大
如下图,可以发现,当网络出现拥塞时,cwnd
跳过了从 $1$ 开始的慢开始过程,所以被称为快恢复