Alex_McAvoy

想要成为渔夫的猎手

TCP 拥塞控制

【概述】

拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不至于出现过载

当出现拥塞时,端点并不能了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为时延的增加

比较来说,拥塞控制是让网络能够承受现有网络负荷,是一个全局性的过程,涉及到所有的主机、路由器、与降低网络传输性能有关的因素;流量控制,是端到端的通信量控制,通过抑制发送端发送速率,来使接收端来得及接收

在 TCP 中,流量控制由接收方根据其放在 TCP 报文段首部的窗口字段来通知发送方,从而保证将未确认的数据量控制在接收窗口 rwnd 的范围内;拥塞窗口,就是通过一定的算法,来维护拥塞窗口 cwnd 的大小

为了对 TCP 进行拥塞控制,定义了四个算法:慢开始拥塞避免快重传快恢复

【慢开始与拥塞避免】

慢开始

当 TPC 连接建立完毕,刚开始发送 TCP 报文段时,先令拥塞窗口 cwnd=1,即一个最大报文段长度 MSS,之后,每收到一个对新的报文段的确认后,就令 cwnd 加 $1$

例如,AB 发送数据,发送时 Acwnd=2,那么 A 一次可以发送 $2$ 个 TCP 报文段,当经过一个传输轮次 RTT 后,A 收到 B 对刚才 $2$ 个 TCP 报文段的确认,于是就令 cwnd=4,下一次发送就可发送 $4$ 个报文段

在使用慢开始算法后,没经过一个传输轮次,拥塞窗口 cwnd 就会加倍,其大小呈指数型增长

这样,慢开始一直将拥塞窗口 cwnd 增大到一个事先规定的慢开始门限 ssthresh,之后,采用拥塞避免算法

拥塞避免

拥塞避免是指:当发送方的拥塞窗口 cwnd 每经历一个 RTT,就增加一个 MSS,即令 cwnd 加 $1$,这使得 cwnd 线性增长,即加法增大

综上,根据 cwndssthresh 的大小,可以进行如下归纳:

  • 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=8ssthresh=12,第 $17$ 个轮次 cwnd=12,而非 $16$

【快重传与快恢复】

快重传与快恢复是对慢开始和拥塞避免的改进,其在两者的基础上引入了 TCP 可靠传输机制中的冗余 ACK 机制

在拥塞控制中,慢开始、拥塞避免、快重传、快恢复,实际上是同时应用在拥塞控制机制中的,当发送方检测到超时就采用慢开始和拥塞避免,当发送方接收到三个冗余 ACK 就采用快重传和快恢复

快重传

在 TCP 可靠传输机制中,快速重传技术使用了冗余 ACK 来检测丢包的发生,而在网络中,丢包,说明网络可能出现拥塞

快重传即当发送方连续收到三个重复的 ACK 报文时,直接重传尚未收到的报文段,不必等待该 TCP 报文段设置的重传计时器超时

快重传并非取消重传计时器,而且在可能丢包的情况下更早地重传丢失的报文段

快恢复

快恢复是指:当发送方连续收到三个冗余 ACK 报文时,就认为网络中出现丢包,开始执行乘法减小,令慢开始门限 ssthresh 为发送方拥塞窗口 cwnd 的一半

与慢开始算法将 cwnd 设为 $1$ 不同,快恢复将 cwnd 的值设为 ssthresh 改变后的数值,之后开始执行拥塞避免算法,令拥塞窗口加法增大

如下图,可以发现,当网络出现拥塞时,cwnd 跳过了从 $1$ 开始的慢开始过程,所以被称为快恢复

感谢您对我的支持,让我继续努力分享有用的技术与知识点!