• (王道考研计算机网络)第五章传输层-第三节1-5:TCP拥塞控制


    • 本文大部分内容来自博主:【小林coding】,如有需求请大家关注。本文会在此基础上结合王道课本进行梳理

    一:什么是拥塞控制

    (1)拥塞控制

    拥塞控制:是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时,端点并不了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加

    (2)拥塞控制和流量控制的区别

    • 拥塞控制:是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素
    • 流量控制:是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收

    二:拥塞窗口

    拥塞控制cwnd是发送方维护的一个状态变量,它会根据网络的拥塞程度动态变化
    前面讲到的发送窗口swnd和接受窗口rwnd是约等于的关系,这里由于加入了拥塞窗口,因此swnd=min(cwnd,rwnd)

    拥塞窗口变化规则

    • 网络中没有出现拥塞:cwnd就会增大
    • 网络中出现了拥塞:cwnd就会减少

    每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小值作为实际发送的窗口

    三:拥塞控制四大算法

    (1)慢启动

    慢启动:TCP在刚建立完连接后,会一点一点的提高发送数据包的数量,随着时间推移数据量会越来越大。具体规则为:当发送方每收到一个ACK,拥塞窗口cwnd大小+1

    如下图,假定拥塞窗口cwnd和发送窗口swnd相等

    • 连接建立完成后,一开始初始化cwnd为1,表示可以传一个MSS大小的数据
    • 当收到一个ACK确认应答后,cwnd增加1,于是一次可以发送2个
    • 当收到2个ACK时,cwnd曾家2,于是这次可以发送4个
    • 当4个都到来时,每个cwnd增加一个,那么这次就可以发送8个

    在这里插入图片描述

    可以看出慢启动算法,发送数据包的数量是呈现指数级的增长的,当超过某个阈(慢启动阈值)值时,按照线性方式增长

    在这里插入图片描述
    其中这个阈值就是ssthresh(slow start threshold)

    • cwnd>ssthresh时,使用慢启动算法
    • cwnd>=ssthresh时,使用拥塞避免算法

    (2)拥塞避免

    拥塞避免:当拥塞窗口cwnd超过慢启动门限ssthresh时就会进入拥塞避免算法(一般来说,ssthresh=65535字节)。具体规则为:每收到一个ACK时,cwnd增加1/cwnd

    接上面的例子,如下图

    • 当8个ACK到来时,每个确认增加1/8,8个ACK于是cwnd一共增加1,于是这一次可以发送9个MSS大小的数据,变为了线性增长

    在这里插入图片描述

    因此拥塞避免算法将原本慢启动算法的指数级增长变为了线性增长,因此增长速度变得缓慢了很多。

    虽然速度变慢了,但是毕竟一直在增长,所以网络就会慢慢进入拥塞的状态,也就会产生丢包,这时就需要对丢失的数据包进行重传

    当触发重传时,进入拥塞发生算法

    (3)拥塞发生

    当网络出现拥塞,发生数据包重传,重传方式主要有两种,其对应的拥塞发生算法是不同的

    • 超时重传
    • 快速重传

    A:发生超时重传时的拥塞发生算法

    这个时候,ssthreshcwnd的值会发生变化

    • ssthresh设为cwnd/2
    • cwnd重置为1

    如下图,发生超时重传就意味着“一夜回到解放前”,之后就重新开始了慢启动。这种方式很明显太激进了,几乎是戛然而止,会造成网络卡顿

    在这里插入图片描述

    B:发生快速重传时的拥塞发生算法

    快速重传算法是当接收方发现丢了一个中间包时,发送三次前一个包的ACK,于是发送单就会快速重传,不必等待超时再重传

    TCP认为这种情况不严重,因为大部分没有丢失,于是ssthreshcwnd变化如下

    • cwnd=cwnd/2
    • ssthresh=cwnd
    • 进入快速恢复算法

    (4)快速恢复

    快速恢复:快速重传和快速恢复算法一般同时使用,快速恢复算法认为,你还能收到3个重复ACK说明网络也不那么糟糕嘛,所以没有必要像超时重传那样强烈

    因此首先

    • cwnd=cwnd/2
    • ssthresh=cwnd

    然后进入快速恢复

    • 拥塞窗口cwnd=ssthresh+3(意思是确认有3个数据包收到了)
    • 重传丢失的数据包
    • 如果再收到重复的ACK,那么cwnd+1
    • 如果收到新数据的ACK后,就把cwnd设置为第一个中的ssthresh的值,原因是该ACK确认了新的数据,说明从duplicated ACK的数据都已经收到,该恢复过程已经结束,可以回到恢复之前的状态了,也就是再次进入拥塞避免状态。
      在这里插入图片描述

    四:拥塞控制算法完整过程图

    如下图是一个比较经典的拥塞算法的过程图
    在这里插入图片描述

  • 相关阅读:
    代码随想录算法训练营 Day 52 | 300.最长递增子序列,674.最长连续递增序列,718.最长重复子数组
    LuatOS-SOC接口文档(air780E)--errDump - 错误上报
    不止硬件,苹果的软件也是频出问题!iOS 17.0.3使iPhone在一夜之间随机开关机
    delphi中Message消息的使用方法
    Python小游戏14——雷霆战机
    python接口自动化测试 之mock模块基本使用介绍
    建成 5000 多间「梦想中心」后,他们决定将技术开源
    【前沿技术RPA】 一文学会用UiPath实现自动发送电子邮件(Email Automation)
    【动画进阶】神奇的背景,生化危机4日食 Loading 动画还原
    LVS和keepalived
  • 原文地址:https://blog.csdn.net/qq_39183034/article/details/125627384