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.rhkb.cn/news/247469.html

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

相关文章

如何使用Everything随时随地远程访问本地电脑搜索文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

数据结构排序算详解(动态图+代码描述)

目录 1、直接插入排序&#xff08;升序&#xff09; 2、希尔排序&#xff08;升序&#xff09; 3、选择排序&#xff08;升序&#xff09; 方式一&#xff08;一个指针&#xff09; 方式二&#xff08;两个指针&#xff09; 4、堆排序&#xff08;升序&#xff09; 5、冒…

go包与依赖管理

包&#xff08;package&#xff09; 包介绍 Go语言中支持模块化的开发理念&#xff0c;在Go语言中使用包&#xff08;package&#xff09;来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件&#xff08;.go结尾的文件&#xff09;组成&#xff0c;是一种高级的代码…

CSS之定位

定位在CSS当中是一个比较重要的点&#xff0c;接下来&#xff0c;让我为大家介绍一下定位吧&#xff01; 属性描述position-relative相对定位position-absolute绝对定位position-fixed固定定位position-sticky粘性定位position-static静态定位 一、相对定位 给元素设置 posi…

Vue-40、Vue中TodoList案例

1、MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" v-model"title" keyup.enter"add"></div> </template>&…

OpenHarmony—仅允许在表达式中使用typeof运算符

规则&#xff1a;arkts-no-type-query 级别&#xff1a;错误 ArkTS仅支持在表达式中使用typeof运算符&#xff0c;不允许使用typeof作为类型。 TypeScript let n1 42; let s1 foo; console.log(typeof n1); // number console.log(typeof s1); // string let n2: typeof …

什么是SQL,什么是MYSQL?MYSQL的架构以及SQL执行语句的过程是什么?有哪些数据库的类型?一篇文章带你弄懂!

文章目录 前言一、为什么需要数据库二、数据库的相关概念1.什么是结构化查询语言 (SQL)2.什么是数据库管理系统 (DBMS)3.什么是 MySQL 数据库 三、数据库分类1.关系型数据库&#xff08;SQL&#xff09;2.非关系型数据库&#xff08;NoSQL&#xff09; 四、MYSQL架构1.各组件功…

ES 分词器

概述 分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 什么是分词器 顾名思义&#xff0c;文本分析就是把全文本转换成一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。在 ES 中&#xff0c;Ana…

河南冷链物流盛典 华鼎科技引领行业创新共筑冷链强省梦

近日&#xff0c;由河南省商务厅指导、河南省物流协会主办的在郑州举行&#xff0c;本次大会以“创新驱动未来”为主题,近300名冷链物流行业精英、专家学者等参加了本届盛典。 河南省委、省政府高度重视物流业发展&#xff0c;出台了《河南省“十四五”现代物流业发展规划》、…

go数据格式-JSON、XML、MSGPack

1. JSON json是完全独立于语言的文本格式&#xff0c;是k-v的形式 name:zs应用场景&#xff1a;前后端交互&#xff0c;系统间数据交互 json使用go语言内置的encoding/json 标准库编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码 func Marshal(v interface{}…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

恒创科技:云服务器公网带宽选择多少合适?有计算公式吗?

随着云计算技术的不断发展&#xff0c;越来越多的企业和个人选择使用云服务器来部署应用和存储数据。而在选择云服务器时&#xff0c;公网带宽是一个重要的参数&#xff0c;它直接影响到服务器的网络性能和数据传输速度。 公网带宽是指云服务器在互联网上的数据传输速率&#x…

内网安全:Exchange服务

目录 Exchange服务 实验环境 域横向移动-内网服务-Exchange探针 一. 端口扫描 二. SPN扫描 三. 脚本探针(还可以探针是否有安全漏洞) 域横向移动-内网服务-Exchange爆破 一 .BurpSuite Intruder模块爆破 域横向移动-内网服务-Exchange漏洞 CVE-2020-17144 Exchange R…

怎样用流程自定义表单提升办公效率?

如果想要提升办公协作效率&#xff0c;可以试试低代码技术平台及流程自定义表单工具。不可否认的是&#xff0c;随着社会的进步和发展&#xff0c;传统的表单制作工具已经没有办法再满足业务量不断上涨的办公需求了&#xff0c;但是&#xff0c;借助专业的流程自定义表单工具就…

4核16G幻兽帕鲁服务器优惠价格表,阿里云和腾讯云报价

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云幻兽帕鲁服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64…

【C++杂货铺】详解类和对象 [中]

博主&#xff1a;代码菌-CSDN博客 专栏&#xff1a;C杂货铺_代码菌的博客-CSDN博客 目录 &#x1f308;前言&#x1f308; &#x1f4c1; 类的6个默认成员函数 &#x1f4c1; 构造函数 &#x1f4c2; 概念 &#x1f4c2; 特性&#xff08;灰常重要&#xff09; &#x1f4c…

恒驰喜讯 | 荣获5项表彰!旭龙乘风起,同心聚沪上,2024年华为上海政企合作伙伴大会成功举办

1月24日&#xff0c;2024年华为上海政企合作伙伴大会暨颁奖典礼在上海成功举办。本次大会以“旭龙乘风起&#xff0c;同心聚沪上”为主题&#xff0c;分为“倾听伙伴声音、传递价值主张、携手伙伴共赢”三个篇章&#xff0c;表彰在2023年度做出卓越贡献的伙伴。上海恒驰信息系统…

RabbitMQ问题总结

:::info 使用场景 异步发送&#xff08;验证码、短信、邮件。。。&#xff09;MySQL 和 Redis、ES 之间的数据同步分布式事务削峰填谷… ::: 如何保证消息不丢失 上图是消息正常发送的一个过程&#xff0c;那在哪个环节中消息容易丢失&#xff1f;在哪一个环节都可能丢失 生…

Android创建工程

语言选择Java&#xff0c;我用的Java 最小SDK&#xff1a;就是开发的APP支持的最小安卓版本 Gradle 是一款Google 推出的基于 JVM、通用灵活的项目构建工具&#xff0c;支持 Maven&#xff0c;JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件&#xff0c;转而…