TCP的拥塞控制算法:慢启动、拥塞避免、快重传、快恢复

2023-11-17

TCP的拥塞控制

一、前言:什么是拥塞?什么是拥塞控制?
  • 拥塞:随着网络中的主机增加其发送速率并使网络变得十分拥挤,此时会经常发生丢包现象,导致网络的传输效率急剧降低。分组的超时重传通常被作为网络拥塞的标志

  • 如果不对网络拥塞进行控制,整个网络的吞吐量将随着输入负荷的增大而下降,降低网络的传输效率,如下图:

    请添加图片描述

二、TCP的4种拥塞控制算法(慢开始拥塞避免快重传快恢复)
  • 为了便于讨论做一下假设
    1. 数据是单方向传送的,另一个方向只传输确认
    2. 接收方的总是有足够大的缓冲区,因此发送方的发送窗口仅由网络的拥塞程度决定,事实上发送窗口的大小由拥塞窗口和接收方的接收窗口大小共同控制,也即发送窗口 = min[接收窗口, 拥塞窗口];
    3. 最大报文段MSS的个数作为讨论单位,而不是以字节为单位
  • 发送方维护一个叫做拥塞窗口cwnd(congestion window)的状态变量,其值取决于网络的拥塞状况,动态变化
    • 拥塞窗户的维护原则:只要网络没有出现拥塞,cwnd就增大一些;但只要网络出现拥塞,拥塞窗口就减小一些
    • 以分组发生超时重传作为发生网络拥塞的依据
  • TCP还维护一个慢开始门限ssthresh状态变量
    • 当cwnd < ssthresh时,使用慢开始算法
    • 当cwnd > ssthresh时,使用拥塞避免算法
    • 当cwnd = ssthresh时,既可以使用慢开始算法,也可以使用拥塞避免算法
  • 当发生数据正常丢包,但又不是网络拥塞时,使用快重传算法和快恢复算法
    • 如何判断是发生了正常丢包而不是网络拥塞呢?
    • 当发送方连续接收到3次重复确认时,说明这网络不拥塞,只是正常丢包了
① 慢启动(慢开始)
  • 传输轮次:指把发送窗口内可以发送的数据全部发送并接收到最后一个TCP报文的确认报文这样一个来回

请添加图片描述

  • 通常在一条TCP连接开始时,cwnd被设置为1个MSS(最大报文段),也即cwnd=1
  • 该阶段,每当TCP发送方将发送窗口的数据发送完,并顺利接收到所有的确认后,就会将拥塞窗口大小翻倍,也即慢启动阶段,cwnd以指数形式增长,如上图所示;注意这里忽略了接收窗口的影响,上文也提到了。
  • 拥塞窗口会一直增长直到到达慢开始门限ssthresh,开始执行拥塞避免算法
② 拥塞避免
  • 该阶段的拥塞窗口变为线性增长,每次cwnd+1,也即每次增加一个MSS

请添加图片描述

  • 随着拥塞窗口的增加,发送速率不断提高,当TCP遇到分组超时重传时,即认为发生了网络拥塞
    1. 此时将更新ssthresh的值为当前拥塞窗口一半,上图中是更新为24的一半即12
    2. 更新cwnd的值为1
    3. 然后继续执行慢启动拥塞避免,如上图所示
  • 如果TCP发送方接收到连续的3个重复确认,则认为是正常的网络包丢失,而不是网络拥塞造成的(这正是快重传算法的功劳)
    1. 重传丢失的分组
    2. 执行快恢复算法
③ 快重传
  • 所谓的快重传算法,就是让发送方尽快重传,而不是等待超时重传计时器超时再重传
    • 要求接收方不要等待自己发送数据时才捎带确认,而是要立即发送确认
    • 即使是失序的报文段,也要立即发送对已收到的报文段的重复确认
    • 发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等待该报文的重传计时器超时再重传
  • 如下图所示:

请添加图片描述

④ 快恢复
  • 如果发送方收到了3个重复确认,就执行快恢复算法
    • 慢开始门限sstresh拥塞窗口cwnd都设置为当前拥塞窗口的一半,然后执行拥塞避免算法
三、一个糅合了4种拥塞控制算法的例子

请添加图片描述

请添加图片描述

  1. 最初cwnd=1ssthresh=16,执行慢开始算法,cwnd大小指数增长
  2. cwnd到达慢开始门限ssthresh后,转而执行拥塞避免算法,cwnd线性加一增长
  3. 随着发送速率的增加,若发生超时重传,则将慢开始门限ssthresh减小为当前拥塞窗口的一半、再将拥塞窗口cwnd设置为1,然后执行慢开始-拥塞避免,重复1、2
  4. 若发送方收到3个重复确认,则表示分组丢失,发送方立刻重传相应分组;然后执行快恢复算法
  5. 慢开始门限ssthresh拥塞窗口cwnd重新设置为当前拥塞窗口的一半,然后执行拥塞避免算法

这是学习湖科大计网时我做的学习笔记,老师讲的太好了,建议去看原版,B站就有!!!


如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP的拥塞控制算法:慢启动、拥塞避免、快重传、快恢复 的相关文章

  • elementui dialog组件固定高度

    弹窗高度过大 想设置个自适应的高度 固定头尾 deep el dialog margin 5vh auto important deep el dialog body height 70vh overflow auto margin hei
  • ChatGPT救命!4岁男孩3年求医17位专家无果,大模型精准揪出病因

    克雷西 萧箫 发自 凹非寺量子位 公众号 QbitAI 怪病 缠身3年求医无果 最终竟然被ChatGPT成功诊断 这是发生在一名4岁男孩身上的真实经历 某次运动后 他身体开始剧痛 母亲前后带她看了17名医生 从儿科 骨科到各种专家 先后进行
  • DeferredResult的使用场景及用法

    场景 假设我们现在要实现这样一个功能 浏览器要实时展示服务端计算出来的数据 一种可能的实现是 浏览器频繁 例如定时1秒 向服务端发起请求以获得服务端数据 但定时请求并不能 实时 反应服务端的数据变化情况 若定时周期为S 则数据延迟周期最大即
  • 小程序支付完整过程。足够详细!

    1 注册小程序 拿到App id 和 AppSecret 小程序密钥 取得商户的微信支付商户号 MCHID 和 微信支付密钥 APIKEY 2 流程 微信用户在微信端选商品下单 后台响应下单生成单号 产生第一次签名数据 提交微信统一支付接口

随机推荐

  • IDA工具介绍

    往期推荐 IDA工具安装 分享 ARM处理器寻址方式 ARM指令集 ARM汇编语言程序结构 昨天给大家概括性的了解了IDA工具 今天分享IDA工具的实际应用 一 IDA打开so文件 1 首先打开IDA工具 进入选项界面 直接选中Go选项 如
  • 初识 libcurl multi:实现一个 http 请求处理客户端,一个线程玩命发一个线程吐血收

    一 引言 最近在工作中 遇到了这么一个需求 我们希望拥有一个高性能的 http 请求处理客户端程序 这个客户端要求有这样的架构 它拥有两个线程 一个线程接收业务程序通过消息队列发来的批量的 http 请求信息 进行批量的 http 请求 另
  • 深入了解scratch中的“移动10步”和(你真的了解scratch吗?scratch初学者值得一看)

    scratch中的 移动10步 是scratch运动类积木中的第一个积木 也是大多数初学者使用scratch的时候用到的第一个积木命令 当我们运行 移动10步 积木时 小猫会向右移动10步 目测其实也就一点点距离 那么 移动10步 究竟在s
  • 正交多项式-勒让德多项式,两类切比雪夫多项式及零点,拉盖尔多项式,埃尔米特多项式

    1 正交多项式 设 n x 是 a
  • Linux 云服务器运维(操作及命令)

    1 什么是linux服务器load average Load是用来度量服务器工作量的大小 即计算机cpu任务执行队列的长度 值越大 表明包括正在运行和待运行的进程数越多 2 如何查看linux服务器负载 可以通过w top uptime p
  • Tomcat多实例部署

    文章目录 一 Tomcat多实例的操作步骤 1 关闭防火墙 将安装 Tomcat 所需软件包传到 opt目录下 2 安装JDK 3 安装 tomcat 4 配置 tomcat 环境变量 5 修改 tomcat2 中的 server xml
  • Qt设计模式与运行界面有偏差 Qt自适应高清屏

    原因Qt对高分辨率屏幕支持的问题 设置下属性 注意在应用程序实例之前设置 int main int argc char argv if QT VERSION gt QT VERSION CHECK 5 9 0 QApplication se
  • 安装NVIDIA CUDA失败最简单详细解决方法

    针对于这样的情况直接下载显卡驱动卸载工具 进入网站 点击下载 网页下拉 会出现如下图所示的内容 点击官方下载 下载软件 运行程序 下载完之后是一个压缩包的形式 解压缩 之后点击运行 如果不是最新版本会跳出如下弹出框 程序是否为最新版本没有影
  • 服务器怎么修改mac,服务器如何修改MAC地址

    服务器如何修改MAC地址 内容精选 换一换 如果要自定义裸金属服务器的DNS服务器信息 需要将裸金属服务器网络设置为静态IP 若将动态DHCP改为静态IP设置 IP和网关等网络信息必须和裸金属服务器下发时保持一致 否则可能会引起网络不通 以
  • Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一 简介 二 概要 三 知识点 附代码 1 Flask基础入门 1 路由route的创建 2 endpoint的作用 3 request对象的使用 4 请求钩子before after request 5 redi
  • Day6:浅谈useState

    目标 持续输出 每日分享关于web前端常见知识 面试题 性能优化 新技术等方面的内容 Day6 今日话题 谈谈react hooks中的useState 将从以下七个角度介绍 用法 参数 返回值 作用 工作原理 优缺点 注意点 用法 use
  • Map BSTMap映射代码(java)

    public interface Map
  • DDR3学习总结(一)

    简介 DDR3 SDRAM常 简称 DDR3 是当今较为常见的一种储存器 在计算机及嵌入式产品中得到广泛应用 特别是应用在涉及到大量数据交互的场合 比如电脑的内存条 对DDR3的读写操作大都借助IP核来完成 本次实验将采用 Xilinx公司
  • 报错 blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];ElasticSearch 报错

    报错 Caused by org elasticsearch cluster block ClusterBlockException blocked by FORBIDDEN 12 index read only allow delete
  • Kali Linux 从入门到精通(一)-概论

    Kali Linux 从入门到精通 一 概论 欢迎关注 https github com Wheeeeeeeeels 基本介绍 1 安全目标 先于攻击者发现和防止漏洞出现 攻击型安全 防护型安全 2 渗透测试 尝试挫败安全防御机制 发现系统
  • 好像还挺好玩的GAN重制版2——Keras搭建SRGAN平台进行图片超分辨率提升

    好像还挺好玩的GAN重制版2 Keras搭建SRGAN平台进行图片超分辨率提升 学习前言 源码下载地址 网络构建 一 什么是SRGAN 二 生成网络的构建 三 判别网络的构建 训练思路 一 判别器的训练 二 生成器的训练 利用SRGAN生成
  • Deep Learning(深度学习)之(三)Deep Learning的常用模型或者方法

    九 Deep Learning的常用模型或者方法 9 1 AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点 人工神经网络 ANN 本身就是具有层次结构的系统 如果给定一个神经网络 我们假设
  • 用单例模式封装实现一个数据库类

    使用单例模式的出发点 1 php的应用主要在于数据库应用 所以一个应用中会存在大量的数据库操作 使用单例模式 则可以避免大量的new 操作消耗的资源 2 如果系统中需要有一个类来全局控制某些配置信息 那么使用单例模式可以很方便的实现 这个可
  • 【PTA】念数字

    输入一个整数 输出每个数字对应的拼音 当整数为负数时 先输出fu字 十个数字对应的拼音如下 0 ling 1 yi 2 er 3 san 4 si 5 wu 6 liu 7 qi 8 ba 9 jiu 输入格式 输入在一行中给出一个整数 如
  • TCP的拥塞控制算法:慢启动、拥塞避免、快重传、快恢复

    TCP的拥塞控制 一 前言 什么是拥塞 什么是拥塞控制 拥塞 随着网络中的主机增加其发送速率并使网络变得十分拥挤 此时会经常发生丢包现象 导致网络的传输效率急剧降低 分组的超时重传通常被作为网络拥塞的标志 如果不对网络拥塞进行控制 整个网络