TCP_拥塞控制

news2024/11/17 14:19:58

引言

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.coloradmin.cn/o/1418050.html

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

相关文章

智慧矿山数字孪生三维可视化平台,赋能矿业新型工业化数字化转型

智慧矿山数字孪生三维可视化平台&#xff0c;赋能矿业新型工业化数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。矿业作为传统产业&#xff0c;也需要紧跟时代步伐&#xff0c;通过数字化转型实现更加高效、安全和环保的生产方式。智慧…

STM32_JTAG引脚及复用代码

目录 1.JTAG引脚1.1 说明&#xff08;可以不看&#xff09;1.2 引脚 2.复用代码3. 手册介绍&#xff08;可以不看&#xff09; 总是忘记有些引脚是JTAG复用的&#xff0c;导致偶尔浪费一些时间&#xff0c;记录一下。 1.JTAG引脚 1.1 说明&#xff08;可以不看&#xff09; …

修改el-date-picker datetimerange内部样式 或 popper-class不生效

看官网介绍 需要添加一个 popper-class类名去控制 有可能发现 popper-class不生效。 这时我们需要看 样式 是否加了 scoped。这个的作用就是样式隔离了。 所以我们需要在重新写个style在这当前页面下即可&#xff0c;或者在最外层重新写个样式。我这里直接放在了当前页面下。…

muduo网络库剖析——接受新连接Acceptor类

muduo网络库剖析——接受新连接Acceptor类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取…

Hbuilder真机调试

1.找到adbs文件&#xff0c;执行adb.exe文件 2.手机找到开发人员选项&#xff08;设置-系统和更新-开发人员选项&#xff09; 打开之后在调试里面打开USB调试&#xff0c;数据线连接电脑 手机会弹窗提示&#xff0c;点击确定 然后就准备运行啦 3.Hbuilder运行 点击运行就可以…

Kotlin快速入门5

Kotlin的继承与重写 kotlin的继承 Kotlin中所有类都继承自Any类&#xff0c;Any类是所有类的超类&#xff0c;对于没有超类型声明的类是默认超类&#xff08;Any 不是 java.lang.Object&#xff09;&#xff1a; class LearnKotlin // 默认继承自Any Any类默认提供三个函数…

LeetCode力扣题解(随机每日一题)——使数组为空的最少操作次数

目录 题目链接 题目描述 输入输出示例 代码 复杂度分析 题目链接 2870. 使数组为空的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的正整数数组 nums 。 你可以对数组执行以下两种操作 任意次 &#xff1a; 从数组中选择 两个…

Ubuntu的应用

记得看目录哦&#xff01; 1. root用户1.1 root介绍1.2 hello Python 2. APT2.1 APT原理机制2.2 Ubuntu软件操作的相关命令2.3 更新Ubuntu软件下载地址2.4 安装一下vim2.5 使用vim 3. 远程登录Ubuntu3.1 ssh介绍3.2 原理图3.3 安装ssh3.4 安装net-tools3.5 查看端口号&#xff…

【Web前端实操17】导航栏效果——滑动门

滑动门 定义: 类似于这种: 滑到导航栏的某一项就会出现相应的画面,里面有对应的画面出现。 箭头图标操作和引用: 像一些图标,如果需要的话,可以找字体图标,比如阿里巴巴矢量图标库:iconfont-阿里巴巴矢量图标库 选择一个——>添加至购物车——>下载代码 因…

Abp 从空白WebApplication开始

开发环境&#xff1a;VS2022、.NET6 1、创建项目&#xff1a;BasicAspNetCoreApplication 2、NuGet添加&#xff1a;Volo.Abp.AspNetCore.Mvc和Volo.Abp.Autofac&#xff0c;如下图所示&#xff1a; 3、开始写代码&#xff0c;目录如下图所示&#xff1a; 3.1、添加启动模块Ap…

2023年:个人年度成长与团队协作成就

文章目录 个人职业发展的喜悦团队成就的辉煌公众号CSDN申请了移动安全领域新星创作者获得6月城市之星北京TOP 10获得23年博客之星TOP 41年度总结 知识星球 开拓新领域的决心免费知识大陆付费知识大陆 展望未来福利时间知识星球会员一年知识星球立减88券 在这个充满挑战与机遇的…

【Spark系列1】DAG中Stage和Task的划分全流程

本文字数在7800字左右&#xff0c;预计时间在15分钟 一、整体流程 每个Aciton操作会创建一个JOB&#xff0c;JOB会提交给DAGScheduler&#xff0c;DAGScheduler根据RDD依赖的关系划分为多个Stage&#xff0c;每个Stage又会创建多个TaskSet&#xff0c;每个TaskSet包含多个Tas…

解决 微信退款,本地退款可以,但是测试环境退款失败问题

1.问题描述 微信小程序退款操作&#xff0c;测试环境一直退款失败&#xff0c;但是本地测试退款却没问题 2.原因分析 本地退款可以&#xff0c;但是测试环境不行&#xff0c;说明问题出在测试环境上 经过排查发现是测试环境的微信商户证书是另一个小程序的&#xff0c;不是正在…

【Delphi】系统菜单中增加菜单项

目录 一、问题提出 二、程序截图 ​编辑 ​编辑 三、程序代码&#xff1a; 一、问题提出 我们在开发windows程序的时候&#xff0c;可能会希望在窗体的系统菜单中增加一个菜单项&#xff0c;那么如何实现呢&#xff0c;实际上通过调用windows API是可以实现的&#xff0c;…

C++初阶:C/C++内存管理、new与delete详解

之前结束了类与对象&#xff1a;今天进行下面部分内容的学习 文章目录 1.C/C内存分布2.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3.C动态内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数5.new和…

安科瑞AAFD系列故障电弧探测器应用以及选型

功能&#xff1a; 故障电弧探测器&#xff08;以下简称探测器&#xff09;对接入线路中的故障电弧&#xff08;包括故障并联电弧、故障串联电弧&#xff09;进行有效的检测&#xff0c;当检测到线路中存在引起火灾的故障电弧时&#xff0c;可以进行现场的声光报警&#xff0c;…

MYSQL中group by分组查询的用法详解(where和having的区别)!

文章目录 前言一、数据准备二、使用实例1.如何显示每个部门的平均工资和最高工资2.显示每个部门的每种岗位的平均工资和最低工资3.显示平均工资低于2000的部门和它的平均工资4.having 和 where 的区别5.SQL查询中各个关键字的执行先后顺序 前言 在前面的文章中&#xff0c;我们…

MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推

MySQL知识点总结&#xff08;一&#xff09;——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推 一条SQL的执行过程索引底层数据结构为什么不使用二叉树&#xff1f;为什么不使用红黑树?为什么不使用hash表&#xff1f;为什么不使用…

elementUI的el-select传递item对象或其他参数的2种方法

方法1 :value“item” 绑定对象 只要:value绑定item对象就可以 value-key"value" 必须是item里的一个属性&#xff0c;绑定值为对象类型时必填 <el-select v-model"value" placeholder"请选择" value-key"value" change"cha…