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…

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

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

如何培养孩子的自信心

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

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看一下目录里边的内容。

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;…

【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 的数字 这篇文章是一篇…

武林风云之linux组软raid0

小y可喜欢玩文明系列的游戏了&#xff0c;因为小y也一直喜欢造轮子&#xff0c;属于自己的轮子。 每次小y听到”要向雄鹰一样&#xff0c;定要遨游于天际。”感觉自己给自己打了一针强心剂&#xff0c;要求自己拼搏进取。 众所周知&#xff0c;文明是个原生的linux游戏&#xf…

大创项目推荐 深度学习 opencv python 实现中国交通标志识别_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

架构设计系列之常见架构(二)

五、DDD&#xff08;领域驱动设计&#xff09; 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种开发思想&#xff0c;强调将软件系统的注意力集中在业务领域上&#xff0c;将领域视为应用的核心。在架构设计中&#xff0c;DDD 提供了一种不同…

提前预警,时刻守护:迅软DLP的数据安全先锋

许多数据泄密事件的发生&#xff0c;往往都是由于没有在案发事前做好安全保护&#xff0c;使得重要信息被随意攻击、盗取、泄密。比起在危机发生后亡羊补牢&#xff0c;更重要的是应该在案发之前未雨绸缪。迅软DLP作为迅软股份研发的“重磅选手”&#xff0c;可为政企单位在一切…

Spring Boot整合Sharding-JDBC实现数据脱敏

目录 背景ShardingSphere脱敏规则sharding-jdbc数据脱敏数据脱敏配置数据分片 数据脱敏配置 背景 对互联网公司、传统行业来说&#xff0c;数据安全一直是极为重视和敏感的话题。数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护…

华为配置VRRP负载分担示例

组网需求 如图1所示&#xff0c;HostA和HostC通过Switch双归属到SwitchA和SwitchB。为减轻SwitchA上数据流量的承载压力&#xff0c;HostA以SwitchA为默认网关接入Internet&#xff0c;SwitchB作为备份网关&#xff1b;HostC以SwitchB为默认网关接入Internet&#xff0c;Switc…

深入理解网络 I/O:单 Selector 多线程|单线程模型

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…