当前位置:首页 » 《随便一记》 » 正文

TCP的拥塞控制

17 人参与  2022年12月16日 10:49  分类 : 《随便一记》  评论

点击全文阅读


前言

本文为个人学习笔记的整理,其中很多借鉴了小林coding的图解网络。

为了避免发送方无节制地发送数据,从而造成网络拥堵,所以 TCP 设计了拥塞控制。

流量控制和拥塞控制的区别

流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。

拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。

拥塞窗口

拥塞窗口 cwnd(congestion window)是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。拥塞控制的本质就是使用算法控制拥塞窗口,从而避免过多的数据注入到网络。

但是其实真正决定传输速率的是发送方的滑动窗口大小,发送窗口 = min(拥塞窗口,接收窗口)

当发生了重传,就会认为网络出现了拥塞,拥塞窗口减小;否则拥塞窗口增大。

拥塞控制算法

拥塞控制算法:慢启动、拥塞避免、快速重传、快速恢复(这是官方定义的四大算法,但是个人认为不方便记忆和理解)。整体过程大约如下:

在 TCP 连接建立完毕后,会先使用慢启动算法,指数级逐渐增大拥塞窗口(+1 +2 +4 +8…)。当拥塞窗口达到慢启动门限 ssthresh(slow start threshold)时,会使用拥塞避免算法,线性逐渐增大拥塞窗口。(+1 +1 +1…)当发生超时重传或快速重传时,会使用拥塞发生算法: 发生超时重传,将 ssthresh 设为 cwnd/2,将 cwnd 设为初始值,然后会再次使用慢启动算法。发生快速重传,使用快速恢复算法,然后进入拥塞避免阶段。

在这里插入图片描述

在这里插入图片描述

慢启动

TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。慢启动算法发包的个数是指数性的增长

有一个叫慢启动门限 ssthresh (slow start threshold)的状态变量。

cwnd < ssthresh 时,使用慢启动算法。当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」。
拥塞避免

规则:每当收到一个 ACK 时,cwnd 增加 1/cwnd。

拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长。就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,当触发了重传机制,也就进入了「拥塞发生算法」。

拥塞发生

当触发 TCP 重传机制时,就视为拥塞发生。TCP 的重传包括超时重传和快速重传,两种重传表示两种不同的网络情况,对应的也有两种拥塞控制手段。

超时重传

当发送方未在规定时间内接收到 ACK 确认包时,就会超时重传。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。

当发生「超时重传」,就会使用拥塞发生算法,重新进入慢启动阶段。

这个时候,ssthresh 和 cwnd 的值会发生变化:

ssthresh 设为 cwnd/2cwnd 重置为初始值。
快速重传

快速重传不以时间为驱动,而是以数据驱动重传。

在这里插入图片描述

如果接收方收到一个失序的报文段,就即回送一个 ACK 给发送方。

快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段

当发生「快速重传」,TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthreshcwnd 变化如下:

cwnd = cwnd/2 ;ssthresh = cwnd;进入快速恢复算法阶段
快速恢复

在这里插入图片描述

快速恢复算法如下:

拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是已经确认收到了 3 个重复的数据包);重传丢失的数据包;如果再收到重复的 ACK,那么 cwnd 增加 1(1 代表每个收到的重复的 ACK 包,都已经离开了网络。)如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

首先,快速恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。
其次,过程2(cwnd逐渐加1)的存在是为了尽快将丢失的数据包发给目标,从而解决拥塞的根本问题(三次相同的 ACK 导致的快速重传),所以这一过程中 cwnd 反而是逐渐增大的。

TCP 拥塞控制算法也有很多个版本,最早的 TCP Tahoe,是没有快速恢复算法的,当发生快速重传时,也会进入慢启动过程。

这里说的是 TCP Reno,除此之外,还有很多版本进行了各自的优化。

另外,网上的许多资料都对快速恢复算法进行了简化,跳过了中间过程而直接进入到拥塞避免阶段。文中的详细过程可以参考 RFC2581文档。

扩展-快速恢复失败:快速恢复算法会重传丢失的数据包,如果此时再次发生快速重传,就不会再使用快速恢复,而会直接进入慢启动阶段。


点击全文阅读


本文链接:http://zhangshiyu.com/post/49871.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1