文章目录- 1. 拥塞网络的代价
- 2. TCP拥塞控制概述
- 3. TCP拥塞控制算法
- 3.1 慢启动(强制)
- 3.2 拥塞避免(强制)
- 3.3 快速恢复(推荐)
- 3.4 总结
- 3.1 慢启动(强制)
- 3.2 拥塞避免(强制)
- 3.3 快速恢复(推荐)
- 3.4 总结
TCP拥塞控制是为了解决发送方以过高的速率发送导致网络中出现阻塞,其核心思想就是发生重传时控制发送方滑动窗口(通过控制拥塞窗口cwnd)的大小,从而控制其发送速率。
1. 拥塞网络的代价
1、当分组的到达速率率接近链路容量时,分组经历巨大的排队时延 。
2、发送方必须执行重传以补偿因为缓存溢出而丢弃(丢失)的分组 。
3、发送方在遇到大时延时所进行的不必要重传会引起路由器利用其链路带宽来转发不必要的分组副本 。
4、当一个分组沿一条路径被丢弃时,每个上游路由器用于转发该分组到丢弃该分组而使用的传输容量最终被浪费掉了。
总结: 排队时延、不必要重传;丢弃:重传、浪费路由器。
2. TCP拥塞控制概述
1、如何限制发送速率:控制cwnd,进而控制滑动窗口,限制发送方中未被确认的数据量,间接影响发送速率。
2、如何感知拥塞与否:丢包事件(超时或3个冗余的ACK);收到(非冗余)ACK指示网络正常。
3、感知拥塞时何种算法改变速率:收到(非冗余)ACK,增大发送速率,探测是否出现丢包,丢包则降低速率,重新开始探测。(ACK和丢包事件充当了隐式信号)
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 总结
1、慢启动每遇到一个新ACK,cwnd就加一个MSS,而在拥塞避免是一个RTT才加一个MSS。
2、遇到超时事件时,都执行相同的操作,ssthresh=cwnd/2,cwnd=1 并进入慢启动状态。
3、遇到三个冗余ACK指示的丢包事件,都会进入快速恢复。
4、遇到丢包事件(不论是超时还是冗余ACK),都会ssthresh=cwnd/2,只不过cwnd改变不同:超时时说明情况严重,cwnd置为1,并进入慢启动;冗余ACK说明网络继续在交付报文段,情况没那么严重,cwnd就只是减半,重传缺失报文并进入快速恢复。
5、一个完整的可能过程: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著,陈鸣译