TCP为什么可靠之“拥塞控制”

拥塞控制是对网络层面的控制,主要是为了避免发送方发送过多的数据导致网络阻塞,以及出现网络阻塞时能够调整数据发送速率,达到对网络阻塞的一个控制。

拥塞窗口

拥塞窗口cwnd,是发送方维护的一个状态变量,会根据网络的拥塞程度动态变化

发送窗口swnd和接收窗口rwdn是约等于的关系,有了拥塞窗口cwnd之后,发送窗口的值就等于min(cwnd,rwnd),也就是拥塞窗口和接收窗口的最小值

拥塞窗口cwnd的变化规则:

  • 只要网络中没有出现拥塞,cwnd就会增大

  • 一旦网络出现拥塞,cwnd就会减小

只要发送方没有在超时时间内接收到ACK应答报文,触发了超时重传,就会认为网络出现了拥塞。

对于网络拥塞的控制,主要通过几个算法实现:

慢启动

在刚建立完TCP连接之后,会有一个慢启动的过程,而不是一上来直接发送大量的数据。

慢启动期间,【当发送方每收到一个ACK确认报文,拥塞窗口就会加1,直到窗口的大小达到慢启动门限】。慢启动门限一般是65535字节。

所以在慢启动期间,窗口大小的增长呈指数增长

拥塞避免

当拥塞窗口大小达到慢启动门限后,就进入拥塞避免阶段,【此时发送方每收到一个ACK确认报文,拥塞窗口就增加窗口分之1的大小,也就是每收到窗口大小个ACK确认报文,窗口大小就加1】

拥塞避免阶段,窗口大小呈线性增长。

随着发送速率的增长,网络可能会出现阻塞,导致丢包,此时进入到拥塞发生阶段,这时候就需要重传数据

拥塞发生

重传数据主要有两种机制,一种是超时重传,另一种是快速重传和快速恢复

  • 超时重传

当发生了超时重传,就会使用拥塞发生算法:【慢启动门限会变为窗口大小的一般,拥塞窗口大小设为初始值,接着重新进入慢启动】

这种方式为了避免继续发送较多的数据而导致网络继续阻塞,而大大减少了数据的发送量

在linux系统中,我们可以使用命令来查看每一个tcp连接拥塞窗口的初始值,一般为10

ss -nli | grep cwnd

  • 快速重传

还有另一种重传算法,也就是快速重传:当接收方发现中间丢了某一个包时,就连续发送3次丢失包的前一个包的ACK报文,于是发送方连续3次接收到相同的ACK报文,就能快速重传丢失的包,不必等到超时再重传

此时,【拥塞窗口大小变为原来的一半,慢启动门限设置为新拥塞窗口的大小,之后进入快速恢复阶段】

  • 快速恢复

快速恢复算法如下:

  • 拥塞窗口cwnd = 慢启动门限 + 3(3的意思是确认有3个数据包被收到了)

  • 重传丢失的数据包

  • 如果再收到重复的ACK,则cwnd + 1

  • 如果收到新的ACK,则把cwnd设置为慢启动门限的值,之后进入拥塞避免阶段。(恢复过程结束,进入到恢复之前的状态)

快速重传和快速恢复算法一般同时使用

总结

TCP协议的拥塞控制主要通过几个算法实现的,包括慢启动,拥塞避免,超时重传,快速重传和快速恢复

  • 当TCP连接刚建立的时候,会进入【慢启动】阶段,也就是设置一个较小的拥塞窗口,发送方每收到一个ACK报文,拥塞窗口就加1,直到窗口大小达到慢启动门限

  • 达到慢启动门限后,就进入【拥塞避免】阶段,发送方每收到拥塞窗口大小个ACK报文,窗口大小就加1

  • 随着拥塞窗口大小,也就是发送速率的不断增加,网络可能会出现拥塞导致丢包,此时就需要重传数据,【重传】主要有两种机制

    • 一种是超时重传,此时慢启动门限会设置为拥塞窗口的一半,窗口大小恢复为初始值,接着重新进入慢启动,发送速率就会瞬间下降很多

    • 另一种是快速重传和快速恢复,当发送方连续接收到重复的ACK报文时,就认为发生丢包,此时拥塞窗口就会设置为原来的一般,慢启动门限设置为原来的一半,随后进入快速恢复阶段。快速恢复阶段会重传丢失的报文,当收到ACK后,拥塞窗口设置为慢启动门限,接着进入拥塞避免阶段。

这些拥塞控制算法能够防止一下子发送过多的数据导致网络拥塞,以及出现网络拥塞时及时调整数据的发送速率。

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

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

相关文章

Windows 11上边两个空格导致我多熬了1个多小时

将图中的文件路径复制,然后到文件管理器里边去搜索。 发现找不到,可是明明就在这里啊。 我百思不得其解,还以为是IDEA出了问题,我只能是重新启动项目,结果还是告诉我找不到文件。 要是同一个目录下已经有一个名为a…

什么是CORS?如何在PHP中处理CORS问题?

CORS(Cross-Origin Resource Sharing)是一种机制,它使用额外的 HTTP 头来告诉浏览器是否允许在 Web 页面上访问来自不同域的资源。在默认情况下,浏览器限制跨域请求,以防止潜在的安全风险。CORS 允许服务器指定哪些源&…

【设计模式--行为型--中介者模式】

设计模式--行为型--中介者模式 中介者模式定义结构案例实现优缺点使用场景 中介者模式 定义 又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互。 结构 抽象中介者角色…

React中简单实现路由守卫(主要演示其原理)

路由守卫在后台管理系统两种经典的跳转情况: 如果访问的是登录页面, 并且有token, 跳转到首页 如果访问的不是登录页面,并且没有token, 跳转到登录页 其余的都可以正常放行 下面简单实现React路由守卫功能&…

Python学习之复习MySQL-Day2(DML)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!DML介绍添加数据给指定字段添加数据给全部字段添加数据给指定字段添加多条数据给全部字段添加多条数据 修改数据修改指定条件的记录的数据修改全部记录的数据 删除数据 文章声明⭐⭐⭐ 该文章为我(有编程语言…

矩阵理论及其应用邱启荣习题3.5题解

(1) P ( − 1 0 1 − 1 − 1 2 1 1 − 1 ) \begin{pmatrix} -1 & 0&1 \\ -1 & -1&2\\1&1&-1 \end{pmatrix} ​−1−11​0−11​12−1​ ​ A ( 1 0 1 1 1 0 − 1 2 1 ) \begin{pmatrix} 1 & 0&1 \\ 1 & 1&0\\-1&2&1 \end{pmat…

MySQL5.7忘记root密码

1)停止mysql服务 systemctl stop mysqld2)跳过权限验证启动mysql mysqld --skip-grant-tables --userroot3)新开一个shell客户端,直接输入mysql回车就能登陆 [rootlocalhost ~]# mysql Welcome to the MySQL monitor. Commands…

如何培养孩子的自信心

当谈论培养孩子的自信心时,许多家长可能会感到困惑。自信心是一个孩子成长过程中非常重要的品质,它可以帮助孩子在面对挑战时更加勇敢和坚定。那么,如何培养孩子的自信心呢?以下是一些建议,希望能对您有所帮助。 鼓励孩…

git checkout进行更改分支

git clone https://gitee.com/yaleguo1/minit-learning-demo.git下载代码。 cd minit-learning-demo/进入目录里边。 ls -l看一下当前分支的内容。 git checkout geek_chapter02更改分支到geek_chapter02。 ls -l看一下目录里边的内容。

【Rust日报】2023-12-14 Mojo 也要支持生存期

【帖子】学习 Rust 的经历,好坏参半 这篇 Reddit 帖子中,一位用户分享了他学习 Rust 编程语言的经历,并表示他的体验褒贬不一。他提到自己是一名有 15 年经验的开发者,曾使用过多种编程语言,包括 Go、Java、PHP、JavaS…

Sui第八轮资助:七个项目获得资助

今天,Sui基金会宣布本月的资助获得者,他们因构建项目以推动Sui的采用和发展而获得资助。要获得资助,项目必须提交提案,详细说明他们正在构建的内容、预算明细、关键里程碑、团队经验以及对Sui社区的预期贡献。 以下七个项目致力于…

MySQL事务与MVCC详解

前置概念之事务 在开始MVCC的讨论之前,我们必须了解一些关于事务的概念。 什么是事务 现在我们开发的一个功能需要进行操作多张表,假如我们遇到以下几种情况: 某个逻辑报错数据库连接中断某台服务器突然宕机… 这时候我们数据库执行的操作可能才到一…

【算法题】N进制减法(js)

返回结果-1 const str "2 11 1"; const str1 "8 07 1"; const str2 "16 af ff"; function solution(str) {const [n, minuend, subtrahend] str.split(" ");if (n < 2 || n > 35) return -1;else if (isValid(minuend) &am…

如何用 Cargo 管理 Rust 工程系列 丙

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/viSsCaFR2x9hZOvo1PoRqA 添加依赖项 前面已经提到过在 cargo 配置文件 Cargo.toml 中如何手动添加工程依赖项&#xff0c;cargo 同样提供了 add …

stable-diffusion-webui(AI绘画)项目实现,即遇到的问题

实现步骤&#xff1a; 为了使环境中的库版本不会乱&#xff0c;导致自己电脑原来一些项目无法运行最好使用虚拟环境 下载miniconda 在搜索中搜所miniconda找到 建立虚拟环境 conda create --name sdwebui python3.10.6 每次运行激活这个虚拟环境 conda activate sdwebui …

DVWA靶场的设置

1).在win 10系统安phpstudy2016&#xff0c;如图所示 2&#xff09;创建DVWA的靶场&#xff0c;解压DVWA-master.zip到C:\phpStudy\WWW\DWA-master 3&#xff09;配置DVWA链接数据库 右键选择记事本打开configlconfig.inc.php.dist【也可以使⽤其他编辑⼯具打开】&#xff0c;…

hive 常见存储格式和应用场景

1.存储格式 textfile、sequencefile、orc、parquet sequencefile很少使用&#xff08;不介绍了&#xff09;&#xff0c;常见的主要就是orc 和 parquet 建表声明语句是&#xff1a;stored as textfile/orc/parquet行存储&#xff1a;同一条数据的不同字段都在相邻位置&#xff…

【Linux】Redis 数据库安装教程(Ubuntu 22.04)

前言 Redis是一个开源的内存数据库&#xff0c;它可以用作键值存储、缓存和消息代理。它支持各种数据结构&#xff0c;包括字符串、哈希、列表、集合、有序集合等。Redis通常被用于构建高性能、可扩展的应用程序&#xff0c;特别是那些需要快速访问数据和实时数据处理的应用场…

教育数字化转型 赋能家庭场景自主学习习惯养成

北京市气象台12月12日22时升级发布暴雪橙色预警信号&#xff0c;北京市教委决定自12月13日开始&#xff0c;全市中小学幼儿园采取学生临时居家学习措施。自疫情以来&#xff0c;家庭已经成为另一个学习中心&#xff0c;学校不再是教育的孤岛。 学习方式的变革&#xff0c;数字…

C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用

目录 1.STL的诞生 2. STL的基本概念 3. STL六大组件 4. STL容器&#xff0c;算法&#xff0c;迭代器 容器&#xff1a;存放数据的地方 算法&#xff1a;解决问题的方法 迭代器&#xff1a;容器和算法之间的桥梁 5. STL初始&#xff1a;打印0 ~ 9 的数字 这篇文章是一篇…