TCP_拥塞控制

引言

24年春节马上就要到了,作为开车党,最大的期盼就是顺利回家过年不要堵车。梦想是美好的,但现实是骨感的,拥堵的道路让人苦不堪言。
在网络世界中,类似于堵车的问题也存在,而TCP(Transmission Control Protocol)的拥塞控制机制就是为了解决这一问题而设计的。
在这里插入图片描述

为什么需要拥塞控制

前面介绍TCP滑动窗口的博文中,我们已经了解到TCP有两种流控机制,即接收方的滑动窗口和发送方的拥塞窗口。接收方的流控机制主要是为了防止接收方无法处理过多的数据而导致溢出,而拥塞控制则是为了避免网络中的拥塞,确保数据能够流畅传输。

类比高速堵车的案例,不同路段的通行能力不同,当车流量超过某一路段的容量时,就会发生“堵车”现象,需要交警来管控疏导。TCP的拥塞控制机制,是发送方主动感知、适配链路状态而采取的速度控制策略,在防止网络拥塞的前提下来最大程度的利用带宽。发送方是如何感知到“堵车”的,它又怎样来进行限流?

链路拥塞的感知方法

TCP拥塞控制主要依赖于两种链路拥塞的感知方法:网络辅助的拥塞控制和端到端的拥塞控制。

网络辅助的拥塞控制依赖于网络层提供的拥塞信息,而端到端的拥塞控制则通过报文段的丢失来感知链路的拥塞情况。

TCP采用端到端的拥塞控制,因为IP层不提供拥塞控制反馈。
在这里插入图片描述

TCP的拥塞控制机制

TCP的拥塞控制主要依赖于发送方维护的拥塞窗口(congestion window,缩写为cwnd)。cwnd控制着流量的发送速率,即数据发送到网络中的速率。与之相对应的是接收方的窗口大小(rwnd),由接收方通告。

发送方可发送的在途流量(未收到ACK)<= min {cwnd,rwnd}

TCP拥塞控制遵循三个指导性原则:

  • 一个丢失的报文段意味着拥塞,此时应当降低发送速率;一个超时事件或者四个确认(一个初始ACK和其后的三个冗余ACK),是一种隐含的丢包指示;
  • 一个确认报文段指示网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认达到时,能够增加发送方的速率;
  • 带宽探测。给定ACK指示链路无拥塞,丢包说明有拥塞,TCP通过调节发送速率来探测带宽。当收到ACK时增加发送速率,直至出现丢包,降低速率。然后开始新的一轮探测,逐渐趋近于带宽上限。

接下来介绍tcp的拥塞控制算法,包括三个主要部分:慢启动,拥塞避免,快速恢复;其中慢启动和拥塞避免是TCP的强制部分,两者的区别在于收到的ACK时拥塞窗口的增速不一样,快速恢复是推荐部分。

慢启动

慢启动特点是发送速率慢,当增速(加速度)快,以指数增长;
TCP连接刚建立的时候,不了解实际的带宽情况,需要能快速的探测拥塞点,提高带宽利用率。
每收到一个确认时,拥塞窗口增加一个MSS,即每经过一个RTT周期,cwnd的大小翻倍。

假设MSS=1024、RTT=100ms、初始cwnd为1个MSS,最开始的发送速率约为80kps;但经过一秒后,cwnd会扩大到1024(假设尚未到拥塞点),速率提高到80Mbps。
在这里插入图片描述

慢启动阶段可能在以下情况结束:

  • 超时丢包:TCP记录慢启动阈值(ssthresh),将其设置为当前拥塞窗口大小的一半,然后将cwnd重置为1,重新开始慢启动的过程。

  • cwnd>=ssthresh:继续翻倍增加大小可能导致二次拥塞,结束慢启动进入拥塞避免。

  • 三个冗余的ACK:进入快速恢复状态。
    在这里插入图片描述

拥塞避免

拥塞避免阶段的特点发送速率快,但增速慢,以线性增长。在接近拥塞点时,缓慢增加发送速率,每个RTT只将cwnd的值增加一个MSS。处理超时丢包和三个冗余的ACK的行为与慢启动阶段相似。

快速恢复

在收到三个冗余的ACK时,发送方进入快速恢复状态,对丢失的报文进行重传。快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。如果出现超时事件,处理行为和慢启动阶段超时丢包事件处理行为一样。

对丢失的报文进行重传时会涉及到重传策略,是回退N步(GNB)还是选择重传(SR)(这两种重传策略介绍,可参见前面博文TCP_可靠数据传输原理),reno算法使用选择性重传。

快速恢复是TCP的推荐策略,早期版本的TCP Tahoe,不管是超时丢包还是冗余ACK丢包事件,均直接进入慢启动阶段。reno对丢失报文的处理更加智能。

下图中,可以看到冗余ACK出现时,这两个算法拥塞窗口的变化差异。最开始慢启动阈值为8,第8个传输回合收到三个冗余ACK,然后慢启动阈值变为6。
在这里插入图片描述

通过慢启动、拥塞避免和快速恢复这三个阶段,TCP的拥塞控制机制实现了在不同网络环境下的自适应调整,以确保数据的可靠传输并最大化网络利用率。

拥塞控制的关键原则

  • 丢包指示拥塞: 丢失的报文段被视为拥塞的信号,导致发送方降低发送速率。
  • 确认报文段指示网络畅通: 接收到确认报文段时,说明网络正在成功传递数据,发送方可以适度增加发送速率。
  • 带宽探测: TCP通过调节发送速率来主动探测带宽,通过适应性地调整拥塞窗口大小,以达到最优的传输速率。

新的拥塞感知方式

除了基于丢包事件的拥塞感知方式外,还有基于RTT(往返时延)策略的拥塞感知方式。这种策略通过测量数据包的往返时延来推断网络的拥塞程度。
例如,Google推出的BBR算法就是一种基于RTT的拥塞控制算法,它能够在不同网络环境下实现较高的带宽利用率和较低的延迟。

结语

TCP的拥塞控制机制是保证网络传输稳定性和高效性的重要组成部分。通过慢启动、拥塞避免和快速恢复等阶段,TCP能够根据网络环境的变化动态地调整发送速率,避免拥塞的发生,从而确保数据能够顺利地传输。这种自适应调整的特性使得TCP成为网络通信中不可或缺的协议之一。

在网络世界中,就像在开车的路上一样,遇到拥堵时我们需要智能的调整速度和路径以避免更大的问题。TCP的拥塞控制就是网络通信的"交警",在网络的高速公路上引导数据流畅行,确保通信的顺畅和高效。

参考资料

TCP拥塞控制介绍和BBR算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(一)Spring 核心之控制反转(IoC)—— 配置及使用

目录 一. 前言 二. IoC 基础 2.1. IoC 是什么 2.2. IoC 能做什么 2.3. IoC 和 DI 是什么关系 三. IoC 配置的三种方式 3.1. XML 配置 3.2. Java 配置 3.3. 注解配置 四. 依赖注入的三种方式 4.1. 属性注入&#xff08;setter 注入&#xff09; 4.2. 构造方法注入&a…

【更新】人工智能-55个工具变量汇总(2024年更新)

一、引言 工具变量是一种在统计学和计量经济学中常用的技术&#xff0c;用于处理因果关系研究中的内生性问题。内生性问题通常是由于遗漏变量、双向因果关系或测量误差等原因造成的&#xff0c;这会导致估计结果出现偏误。工具变量的使用可以帮助解决这一问题 整理收集了CSSC…

Android MediaCodec 简明教程(四):使用 MediaCodec 将视频解码到 Surface,并使用 SurfaceView 播放视频

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇&#xff08;二&#xff09; 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景&#xff08;支持 Batch / Streaming&#xff09;&#xff1a;With 语句和离线 Hive SQL With 语句一样的&#xff0c;语法糖 1&#xff0c;使用…

inode生命周期

1.添加inode到inode cache链表 当inode的引用计数器i_count为0后&#xff0c;会调用iput_final去释放 static void iput_final(struct inode *inode) {struct super_block *sb inode->i_sb;const struct super_operations *op inode->i_sb->s_op;unsigned long sta…

PaddleNLP的简单使用

1 介绍 PaddleNLP是一个基于PaddlePaddle深度学习平台的自然语言处理&#xff08;NLP&#xff09;工具库。 它提供了一系列用于文本处理、文本分类、情感分析、文本生成等任务的预训练模型、模型组件和工具函数。 PaddleNLP有统一的应用范式&#xff1a;通过 paddlenlp.Task…

数据结构-数组(详细讲解)

文章目录 数组数组的概述数组的图示一维数组二维数组 数组的定义一维数组的定义二维数组的定义 数组的取值赋值一维数组二维数组 数组的操作一维数组的操作索引实现指针实现 二位数组的操作矩阵转三元组矩阵的乘法 数组 数组的概述 概述&#xff1a;数组是一种线性数据结构&a…

C# 使用WMI监听进程的启动和关闭

写在前面 Windows Management Instrumentation&#xff08;WMI&#xff09;是用于管理基于 Windows 操作系统的数据和操作的基础结构。具体的API可以查看 WMI编程手册。 WMIC 是WMI的命令行管理工具&#xff0c;使用 WMIC&#xff0c;不但可以管理本地计算机&#xff0c;还可…

粒子群算法求解港口泊位调度问题(MATLAB代码)

粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;它通过模拟鸟群或鱼群的行为来寻找最优解。在泊位调度问题中&#xff0c;目标是最小化所有船只在港时间的总和&#xff0c;而PSO算法可以帮助我们找到一…

Java把列表数据导出为PDF文件,同时加上PDF水印

一、实现效果 二、遇到的问题 实现导出PDF主体代码参考&#xff1a;Java纯代码实现导出PDF功能&#xff0c;下图是原作者实现的效果 导出报错Font STSong-Light with UniGB-UCS2-H is not recognized.。参考&#xff1a;itext 生成 PDF(五) 使用外部字体 网上都是说jar包的版本…

FastBee开源物联网平台2.0开源版发布啦!!!

一、项目介绍 物美智能(wumei-smart)更名为蜂信物联(FastBee)。 FastBee开源物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用…

成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘

成功解决AttributeError: ‘str’ object has no attribute ‘decode’. &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析及解决方案&#x1f333;&#x1f333;参考文章&#x1f333;&#x1f333;结尾&#x1f333; &#x1f333;引…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

算法沉淀——前缀和(leetcode真题剖析)

算法沉淀——前缀和 01.一维前缀和02.二维前缀和03.寻找数组的中心下标04.除自身以外数组的乘积05.和为 K 的子数组06.和可被 K 整除的子数组07.连续数组08.矩阵区域和 前缀和算法是一种用于高效计算数组或序列中某个范围内元素之和的技巧。它通过预先计算数组的前缀和&#xf…

Redhat 8.4 一键安装 Oracle 11GR2 单机版

Oracle 一键安装脚本&#xff0c;演示 Redhat 8.4 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 脚本…

宝塔控制面板配置SSL证书实现网站HTTPS

宝塔安装SSL证书提前申请好SSL证书&#xff0c;如果还没有&#xff0c;先去Gworg里面申请&#xff0c;一般几分钟就可以下来&#xff0c;申请地址&#xff1a;首页-Gworg官方店-淘宝网 一、登录邮箱下载&#xff1a;Gworg证书文件目录 &#xff0c;都会有以下五个文件夹。宝塔…

ROS学习笔记11——ROS中的重名问题

一、ros功能包重名——ros工作空间覆盖 功能包重名时&#xff0c;会按照 ROS_PACKAGE_PATH 查找&#xff0c;在前的会优先执行。ROS 会解析 .bashrc 文件&#xff0c;并生成 ROS_PACKAGE_PATH ROS包路径&#xff0c;即调用功能包的顺序&#xff0c;该变量中按照 .bashrc 中配置…

Blender教程(基础)-内插面、分离、环切、倒角-08

一、内插面 菜单位置如下图位置。 单击需要处理的面&#xff0c;出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插&#xff0c;但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后&#xff0c;鼠标移动到外面&#xff0c;键盘在英…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

【CMU-自主导航与规划】M-TARE planner 配置与运行

M-TARE docker M-TARE 源码 一、依赖 Docker, Docker Compose, NVIDIA Container Toolkit, Nvidia GPU Driver&#xff08;需要至少2个&#xff0c;带Nvidia GPU&#xff09; 1.1 Docker docker -v #查询版本1.2 Docker Compose docker compose version1.3 …