计算机网络——TCP拥塞控制

TCP拥塞控制是为了解决发送方以太高的速率发送致使网络中出现阻塞,其核心思想就是发生重传时控制发送方滑动窗口(经过控制拥塞窗口cwnd)的大小,从而控制其发送速率web

1. 拥塞网络的代价

一、当分组的到达速率率接近链路容量时,分组经历巨大的排队时延算法

二、发送方必须执行重传以补偿由于缓存溢出而丢弃(丢失)的分组 。缓存

三、发送方在遇到大时延时所进行的没必要要重传会引发路由器利用其链路带宽来转发没必要要的分组副本 。网络

四、当一个分组沿一条路径被丢弃时,每一个上游路由器用于转发该分组到丢弃该分组而使用的传输容量最终被浪费掉了。svg

总结: 排队时延、没必要要重传;丢弃:重传、浪费路由器。.net

2. TCP拥塞控制概述

一、如何限制发送速率:控制cwnd,进而控制滑动窗口,限制发送方中未被确认的数据量,间接影响发送速率。计算机网络

二、如何感知拥塞与否:丢包事件(超时或3个冗余的ACK);收到(非冗余)ACK指示网络正常。xml

三、感知拥塞时何种算法改变速率:收到(非冗余)ACK,增大发送速率,探测是否出现丢包,丢包则下降速率,从新开始探测。(ACK和丢包事件充当了隐式信号)blog

3. TCP拥塞控制算法

3.1 慢启动(强制)

Slow Start。当一条TCP链接开始时,cwnd一般初始置为一个较小的值MSS(Maximum Segment Size,最大报文段长度(不含包头)),即初始发送速率约为MSS/RTT,每当传输的报文段首次被确认(收到新的ACK)就增长1 个 MSS ,这一过程每过一个 RTT,发送速率就翻番 。 所以, TCP 发送速率起始慢,但在慢启动阶段以指数增加。 注意这里的”慢“启动,是指起始速率慢,但其增加速率是很是快的,由于但愿迅速找到可用带宽。事件

在这里插入图片描述

什么时候结束指数增加:

(1) 若出现超时指示的丢包事件(即拥塞),cwnd置为1,ssthresh(慢启动阈值)设置为 cwnd / 2,并从新开始慢启动。

(2) 当cwnd到达ssthresh时,进入拥塞避免状态,由于继续翻倍有些鲁莽了。(ssthresh的初始值能够设得很大,以后再由(1)设置为 cwnd / 2)。

(3) 检测到 3 个冗余 ACK ,这时 TCP 执行一种快速重传,ssthresh设置为 cwnd / 2,cwnd 的值减半并加上3个MSS(计及已收到的3个冗余的ACK),并进入快速恢复状态。

在这里插入图片描述

3.2 拥塞避免(强制)

Congestion Avoidance。每一个 RTT 只将 cwnd 的值增长一个 MSS。一种通用的方法是对于 TCP 发送方不管什么时候到达一个新的确认,就将 cwnd 增长一个MSS (MSS/cwnd)字节 。即一个RTT内收到cwnd/MSS个报文的确认,恰好增长一个MSS。

什么时候结束线性增加:

(1) 出现超时时,同慢启动(1)

(2) 检测到 3 个冗余 ACK,同慢启动(3)

3.3 快速恢复(推荐)

Fast Recovery。对于引发 TCP 进入快速恢复状态的缺失报文段,对收到的每一个冗余的ACK,cwnd 的值增长一个 MSS。

什么时候结束增加:

(1) 当对丢失报文段的一个新 ACK 到达时,cwnd 降为ssthresh并进入拥塞避免状态 。

(2) 出现超时时与慢启动和拥塞避免相同。

一种称为 TCP Tahoe 的TCP早期版本,无论是发生超时指示的丢包事件,仍是发生3个冗余ACK指示的丢包事件,都无条件地将其拥塞窗口减至 1 个 MSS ,并进入慢启动阶段。TCP的较新版本TCP Reno ,则综合了快速恢复。

下图在第8个round出现了三个冗余ACK, TCP Tahoe 和 TCP Reno表现有所不一样:
在这里插入图片描述

3.4 总结

一、慢启动每遇到一个新ACK,cwnd就加一个MSS,而在拥塞避免是一个RTT才加一个MSS。

二、遇到超时事件时,都执行相同的操做,ssthresh=cwnd/2,cwnd=1 并进入慢启动状态。

三、遇到三个冗余ACK指示的丢包事件,都会进入快速恢复。

四、遇到丢包事件(不管是超时仍是冗余ACK),都会ssthresh=cwnd/2,只不过cwnd改变不一样:超时时说明状况严重,cwnd置为1,并进入慢启动;冗余ACK说明网络继续在交付报文段,状况没那么严重,cwnd就只是减半,重传缺失报文并进入快速恢复。

五、一个完整的可能过程:cwnd=1·MSS,开始慢启动,每收到一个新ACK,cwnd就加一个MSS(指数增加);到达阈值ssthresh,进入拥塞避免,开始线性增加;遇到三个冗余ACK,ssthresh = cwnd / 2,cwnd = ssthresh + 3·MSS,快速重传,并进入快速恢复,每遇到一个冗余ACK,cwnd = cwnd + MSS,直到遇到新的ACK,cwnd = ssthresh,并进入拥塞避免;当出现超时时,ssthresh = cwnd / 2,cwnd = 1·MSS,并进入慢启动从新开始。


参考书目:
《计算机网络——自顶向下方法》James F. Kurose & Keith W.Ross著,陈鸣译

相关阅读:
计算机网络——TCP三次握手详解为何两次不行
计算机网络——TCP四次挥手过程详解
TCP链接的三次握手四次挥手——类比异地恋情侣开始交往和分手(通俗易懂)