当前位置: 首页 > news >正文

图解 TCP 拥塞控制

文章目录

  • 什么是拥塞控制
  • 拥塞控制算法
    • 慢启动
    • 拥塞避免
    • 快速恢复
  • TCP拥塞控制状态机

什么是拥塞控制

拥塞控制是一种 确保网络中的数据包以可持续的速率传输 的机制,避免因为数据包太多而超过网络当前的承载能力,导致网络性能下降,甚至产生大量的丢包现象。

TCP 使用 端到端拥塞控制 而不是网络辅助的拥塞控制,因为 IP 层不向端系统提供显式的网络拥塞反馈。TCP 采用的方法是让每一个发送方根据 所感知到的网络拥塞程度 来限制向连接发送流量的速率。

运行在发送方的 TCP 拥塞控制机制需要跟踪一个额外的变量——拥塞窗口(congestion window),发送方未确认的数据量不会超过 cwnd(拥塞窗口) 与 rwnd(接收窗口) 中的最小值。

# SND 为发送缓冲区, NEXT 下一个写入的字节编号, UNA 第一个已发送但未确认的字节编号
# NEXT - UNA 等于已发送但未确认的字节范围
SND.NEXT - SND.UNA <= min(cwnd, rwnd)


发送方如何感知网络的拥塞程度

TCP 发送方通过检测丢包事件感知网络的拥塞程度,丢包事件包括:

  • 出现定时器超时;
  • 收到来自接收方的三个重复的 ACK;

TCP 将 ACK 确认报文作为数据正常到达接收方的标志,使用 ACK 报文来增加拥塞窗口的长度;与之相对的,一个丢失的报文段意味着网络拥塞,应当降低 TCP 发送方的速率。


接下来将介绍 TCP 拥塞控制算法,包含了三部分:

  1. 慢启动;
  2. 拥塞避免
  3. 快速恢复;

拥塞控制算法

慢启动

慢启动(slow-start)状态,cwnd 从 1 个 MSS 开始,每当传输传输的 TCP 段首次被确认,cwnd 就增加一个 MSS。TCP 发送速率起始慢,但在慢启动阶段以 指数增长

慢启动过程 以及 cwnd 随请求-应答轮次的变化关系如下图所示:

  • 初始时,发送方的拥塞窗口为 1个 MSS;
  • 第一轮交互后,随着第一个 TCP 段顺利收到 ACK 确认标志,cwnd 增加到 2MSS;
  • 第二轮请求应答后,TCP 发送方收到两个 ACK 确认标志,cwnd 从 2 MSS 增加到 4 MSS;
  • 第三轮次交互后,拥塞窗口 cwnd 会变为上一轮此拥塞窗口的两倍。这说明了慢启动是以指数增长的方式,增加拥塞窗口大小。

当出现下列三种情况之一时,慢启动阶段结束:

  1. 当拥塞窗口 cwnd 超过慢启动阈值 ssthresh,就会进入 拥塞避免阶段,ssthresh 一般为 65535 字节。
  2. 存在超时导致的丢包事件:TCP 发送方将慢启动阈值 ssthresh 设置为当前拥塞窗口 cwnd 的一半,随后将拥塞窗口设置为 1MSS,重新开始慢启动过程。
  3. 检测到 3 个冗余的 ACK,TCP 执行快速重传,拥塞控制进入 快速恢复 阶段。

拥塞避免

进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 MSS cwnd ⋅ MSS \frac{\text{MSS}}{\text{cwnd}}\cdot{\text{MSS}} cwndMSSMSS 字节,即每收到 cwnd MSS \frac{\text{cwnd}}{\text{MSS}} MSScwnd 个 ACK 确认段,拥塞窗口增加 1 MSS。

下图是 cwnd 从慢启动阶段进入拥塞避免阶段后的变化曲线:

  • 慢启动阈值 ssthresh 等于 8MSS,第三轮请求后,cwnd 变为 8MSS 大于等于 ssthresh,进入拥塞避免阶段;
  • 第 4 轮请求,发送方可以发送 8个大小为 1MSS 的 TCP 段。如果顺利,发送方会收到 8 个 ACK 确认段,此时 cwnd 会增加 1 MSS cwnd = 8 MSS ⋅ 8 MSS = 1 MSS \frac{1\text{MSS}}{\text{cwnd}=8\text{MSS}}\cdot{8}\text{MSS}=1 \text{MSS} cwnd=8MSS1MSS8MSS=1MSS。因此在第 4 轮请求过后,拥塞窗口增加到 9MSS。
  • 同理,第 5 轮请求,发送方可以发送 9MSS 的 TCP 段,收到 9 个 ACK 后,拥塞窗口增加到 10MSS。

上面的函数图像清晰地展示了,从慢启动阶段进入拥塞避免阶段后,拥塞窗口变成了线性增长

当出现如下情况之一时,拥塞避免阶段结束:

  1. 存在超时导致的丢包事件:TCP 发送方将慢启动阈值 ssthresh 设置为当前拥塞窗口 cwnd 的一半,随后将拥塞窗口设置为 1MSS,从 拥塞避免 转换为 慢启动阶段
  2. 检测到 3 个冗余的 ACK,TCP 执行快速重传,由 拥塞避免阶段 进入 快速恢复阶段

下图为出现超时丢包时,拥塞窗口的变化情况:


拥塞窗口 cwnd 在达到 12MSS 后,出现超时未收到 ACK 确认的情况。状态变量变更情况:

  • 慢启动阈值由原先的 8MSS 更新为当前拥塞窗口大小的一半,即 cwnd = 12 MSS 2 = 6 MSS \frac{\text{cwnd}=12 \text{MSS}}{2}=6\text{MSS} 2cwnd=12MSS=6MSS
  • 拥塞窗口设置为 1MSS,重新进入慢启动阶段;

快速恢复

快速重传和快速恢复算法一般同时使用,快速恢复算法认为 能收到 3 个重复的 ACK 说明网络并不糟糕,没必要像 RTO 超时时一样直接将 cwnd 锐减至 1MSS。

进入快速恢复阶段前,cwndssthresh 会被更新:

  • cwnd = cwnd/2,即新的拥塞窗口设置为原先的一半大小;
  • ssthresh = cwnd,设置慢启动阈值等于拥塞窗口大小;

进入快速恢复阶段后,执行如下步骤:

  1. 拥塞窗口 cwnd = ssthresh + 3 (3 的意思确认有 3 个数据包被收到);
  2. 重传丢失的数据包;
  3. 如果再收到重复的 ACK,那么 cwnd 增加 1MSS,这一步的目的是 尽快将丢失的数据包发送给接收方
  4. 如果收到新数据的 ACK ,将 cwnd 设置为第一步中的 ssthresh。原因是 ACK 确认了新的数据,说明 重传丢失的数据成功(TCP 累积确认机制保证),恢复过程结束,可以恢复到之前的状态。随后,连接进入 拥塞避免状态

下面为快速恢复阶段,拥塞窗口大小变化示意图:

从图中,我们可以看到几个关键的节点:

  • 第 7 轮结束后,cwnd 为 12MSS。第 8 轮发送的消息中出现了消息丢失,接收方收到大于 [下一个期望序号] 的 TCP 段,于是检测到字节流存在缺口。接收方对 已经接收的最后一个按序字节数据进行反复确认
    当 TCP 发送方收到三个重复的 ACK 后,会将 ssthresh 设置为 cwnd 2 = 12 MSS 2 = 6 MSS \frac{\text{cwnd}}{2}=\frac{12\text{MSS}}{2}=6\text{MSS} 2cwnd=212MSS=6MSS,cwnd 设置为 ssthresh + 3 MSS = 9 MSS \text{ssthresh} + 3\text{MSS}=9\text{MSS} ssthresh+3MSS=9MSS。这就是为什么第 8 轮后,cwnd 变为 9MSS 的原因。
  • 随后,TCP 发送方又接收到了两个重复的 ACK 段,cwnd 从 9MSS 增加为 11 MSS;
  • 在第 11 轮后,TCP 发送方接收到了新的 ACK 段,将 cwnd 设置为 ssthresh=6MSS,进入 拥塞避免阶段

TCP拥塞控制状态机

最后,贴上一张我在学习《计算机网络自顶向下》时,看到的 TCP 拥塞控制状态机,供朋友们参考:



感谢大家的阅读,如果您对本博客有任何建议和疑问,欢迎在评论区里提出,我们一起讨论共同进步!

相关文章:

图解 TCP 拥塞控制

文章目录 什么是拥塞控制拥塞控制算法慢启动拥塞避免快速恢复 TCP拥塞控制状态机 什么是拥塞控制 拥塞控制是一种 确保网络中的数据包以可持续的速率传输 的机制&#xff0c;避免因为数据包太多而超过网络当前的承载能力&#xff0c;导致网络性能下降&#xff0c;甚至产生大量…...

Nginx配置文件的整体结构

一、Nginx配置文件的整体结构 从图中可以看出主要包含以下几大部分内容&#xff1a; 1. 全局块 该部分配置主要影响Nginx全局&#xff0c;通常包括下面几个部分&#xff1a; 配置运行Nginx服务器用户&#xff08;组&#xff09; worker process数 Nginx进程PID存放路径 错误…...

[SpringCloud] OpenFeign核心架构原理 (三)

文章目录 1.SpringCloud是如何整合Feign的1.1 将FeignClient接口注册到Spring中1.2 FeignClientFactoryBean相关 1.SpringCloud是如何整合Feign的 核心组件重新实现, 支持更多的SpringCloud生态的功能。将接口动态代理对象注入到Spring容器中。 1.1 将FeignClient接口注册到S…...

elementUI Table组件点击取当前行索引

在使用element UI Table组件时&#xff0c;需要点击取当前行索引&#xff0c;并删除当前行&#xff0c;看了element UI 文档好象没有这个的&#xff0c;仔细看下发现当前行索引是在scope里的$.index里。 element UI文档&#xff1a;https://www.uihtm.com/element/#/zh-CN/comp…...

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

基本介绍 组基轨迹建模&#xff08;Group-Based Trajectory Modeling&#xff0c;GBTM&#xff09;&#xff08;旧名称&#xff1a;Semiparametric mixture model&#xff09; 历史&#xff1a;由DANIELS.NAGIN提出&#xff0c;发表文献《Analyzing Developmental Trajectori…...

解决前端性能问题:如何优化大量数据渲染和复杂交互?

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、分页加载数据 二、虚拟滚动 三、懒加载 四、数据缓存 五、减少重绘和回流 …...

【Vue3】深入理解Vue中的ref属性

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

CentOS上安装与配置Nginx

CentOS上安装与配置Nginx Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;并在一个BSD-like协议下发行。以下是在CentOS系统上安装和配置Nginx的步骤。 &#x1f31f; 前言 欢迎来到我的小天地&#xff0c;这…...

DataGrip 连接 Centos MySql失败

首先检查Mysql是否运行&#xff1a; systemctl status mysqld &#xff0c; 如果显示没有启动则需要启动mysql 检查防火墙是否打开&#xff0c;是否打开3306的端口 sudo firewall-cmd --list-all 如果下面3306没有打开则打开3306端口 publictarget: defaulticmp-block-inver…...

【图论】图的遍历 - 构建领接表(无向图)

文章目录 例题&#xff1a;受限条件下可到达节点的数目题目描述代码与注释模板抽象 例题&#xff1a;受限条件下可到达节点的数目 题目链接&#xff1a;2368. 受限条件下可到达节点的数目 题目描述 代码与注释 func reachableNodes(n int, edges [][]int, restricted []int)…...

Claude 3家族惊艳亮相:AI领域掀起新浪潮,GPT-4面临强劲挑战

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-agd7RSCGMblYxo85 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…...

Linux Watchdog 机制是什么

当涉及到Linux操作系统的稳定性和可靠性时&#xff0c;Linux Watchdog机制是一个至关重要的议题。该机制旨在监控系统状态&#xff0c;确保在出现问题时采取适当的措施以维持系统的正常运行。本文将深入探讨Linux Watchdog机制的工作原理、应用范围以及如何配置和使用该机制来提…...

Linux权限问题

1.用户 Linux系统下分为两种用户 a.超级用户&#xff08;root&#xff09; b.普通用户 超级用户的命令提示符是“#”&#xff0c;普通用户的命令提示符是“$” 怎么切换用户呢&#xff1f; 命令 su 用户名 其中切换root可以为su 或者su root-----不用密码 普通用户切换…...

python基础练习题目

1. 根据身高体重&#xff0c;判断人的胖瘦 描述&#xff1a; 通过身高和体重&#xff0c;判断一个人的胖瘦。国际上一般采用BMI体重指数&#xff0c;计算公式为BMI 体重 / 身高2(保留小数点后1位)&#xff0c;参考标准如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪…...

视频编码标准H.264/AVC,H.265/HEVC,VP8/VP9,AV1的基本原理、优缺点以及适用场景

视频编码标准是用于压缩数字视频数据的技术规范&#xff0c;以减少存储和传输所需的带宽。以下是关于H.264/AVC、H.265/HEVC、VP8/VP9和AV1这些标准的基本原理、优缺点以及适用场景的简要描述&#xff1a; H.264/AVC (Advanced Video Coding) 基本原理&#xff1a; H.264是一…...

MATLAB2020a安装编译器mingw-64(6.3.0)

MATLAB2020a指定安装mingw-64&#xff08;6.3.0&#xff09;版本编译器 记录一下几个要点 mingw-64&#xff08;6.3.0&#xff09; 找到对应的mingw-64安装包 设置mingw的bin文件路径到环境变量 变量名&#xff1a;MW_MINGW64_LOC MATLAB设置路径...

Python网络请求高级篇:Requests库的深度运用

在Python网络请求中级篇中&#xff0c;我们了解了如何通过Requests库发送带参数的请求&#xff0c;处理Cookies&#xff0c;使用Session对象&#xff0c;以及设置请求头。在本文中&#xff0c;我们将进一步深入学习Requests库的高级功能&#xff0c;包括处理重定向&#xff0c;…...

AWS认证

AWS新增DEA-C01认证考试知识要点 原创 云计算狂魔 云计算狂魔 2024-03-04 23:58 北京 由于AWS将于3月12日正式启动DEA-C01认证考试&#xff0c;我们整理了相关考试知识要点&#xff0c;请各位考生了解。...

【排序】详解插入排序

一、思想 插入排序是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。具体步骤如下&#xff0c;将数组下标为0的元素视为已经排序的部分&#xff0c;从1开始遍历数组&#xff0c;在遍历的过程中当前元素从…...

Linux开发板移植rz、sz指令实现串口传输文件

一、开发环境 实现开发板和电脑通过串口来收发互传文件。 开发板&#xff1a;NUC980开发板 环境&#xff1a;Ubuntu 22.04.3 LTS 64-bit lrzsz的源码包:例如 lrzsz-0.12.20.tar.gz&#xff0c;下载地址https://ohse.de/uwe/software/lrzsz.html 二、移植步骤 在开发板上移植…...

别再只用手动调参了!用ArcGIS的Geostatistical Analyst工具包自动优化克里金插值参数

解锁ArcGIS隐藏技能&#xff1a;用Geostatistical Analyst实现克里金插值参数智能优化 当你在深夜盯着屏幕上半变异函数模型的参数犹豫不决时&#xff0c;是否想过让软件替你做出更科学的选择&#xff1f;克里金插值作为地统计学的黄金标准&#xff0c;其精度高度依赖于半变异函…...

Mac环境OpenClaw深度优化:Qwen3-4B模型推理速度提升30%方案

Mac环境OpenClaw深度优化&#xff1a;Qwen3-4B模型推理速度提升30%方案 1. 为什么需要优化OpenClaw的模型推理速度 上周我在用OpenClaw处理一个简单的文件整理任务时&#xff0c;发现整个流程耗时比预期长了近一倍。通过日志排查才发现&#xff0c;大部分时间都消耗在等待Qwe…...

OpenClaw节日营销助手:gemma-3-12b-it自动生成祝福语与发送邮件

OpenClaw节日营销助手&#xff1a;gemma-3-12b-it自动生成祝福语与发送邮件 1. 为什么需要节日营销自动化&#xff1f; 去年端午节前夜&#xff0c;我盯着电脑屏幕上的200多个客户邮箱地址发呆。每个客户都需要个性化的节日祝福&#xff0c;但手动编写和发送至少需要6小时。当…...

终极指南:30分钟打造你的首个ESP32 AI智能硬件项目

终极指南&#xff1a;30分钟打造你的首个ESP32 AI智能硬件项目 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 还在为嵌入式AI开发的高门槛而烦恼吗&#xff1f;物联…...

103. ancher WebSocket 与 NGINX OSS 入口控制器的故障

Environment 环境 SUSE Rancher 2.10.3AWS EKS cluster AWS EKS 集群NGINX OSS Ingress Controller (oci://ghcr.io/nginx/charts/nginx-ingress) NGINX OSS 入口控制器&#xff08;oci:// ghcr.io/nginx/charts/nginx-ingress&#xff09; Situation 地理位置 After upgrad…...

INNISO1接口模块

INNIS01 接口模块INNIS01 是一款应用于工业自动化控制系统中的接口模块&#xff0c;主要用于实现控制系统内部或与外部设备之间的信号连接与数据交互&#xff0c;属于系统中的通信与接口扩展单元。一、基本概述INNIS01 接口模块通常用于连接控制器与现场设备或其他功能模块&…...

ABB机器人Profinet通信实战:如何正确传输Real类型数据(附完整代码示例)

ABB机器人Profinet通信实战&#xff1a;Real类型数据的高效传输与解析 在工业自动化领域&#xff0c;ABB机器人与PLC之间的实时数据交互是产线高效运行的关键。Profinet作为工业以太网标准协议&#xff0c;其通信性能直接影响着生产节拍和系统稳定性。而Real类型数据的传输&…...

Adams导入SOLIDWORKS模型“隐身”难题:从Parasolid格式到视图显示的完整排查指南

1. 当你的模型在Adams中"隐身"了怎么办&#xff1f; 最近有个做机械仿真的朋友跟我吐槽&#xff0c;说他在SOLIDWORKS里精心设计的模型&#xff0c;导出为Parasolid格式后导入Adams&#xff0c;结果模型树里明明有显示&#xff0c;3D视图区却空空如也。这种"看…...

SQLite3嵌入式开发实战:从零构建一个轻量级学生管理系统(C语言版)

SQLite3嵌入式开发实战&#xff1a;从零构建一个轻量级学生管理系统&#xff08;C语言版&#xff09; 在嵌入式系统开发中&#xff0c;数据存储和管理一直是开发者需要面对的核心问题之一。传统文件系统虽然简单&#xff0c;但缺乏结构化查询能力&#xff1b;而大型数据库又过…...

离线语音智能处理平台Buzz:本地化音频转文本全攻略

离线语音智能处理平台Buzz&#xff1a;本地化音频转文本全攻略 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 在当今信息驱动…...