拥塞控制(详解)

一:TCP的拥塞控制

1:是什么

(1):是什么(拥塞现象)

网络的 吞吐量 与 通信子网 负荷(即通信子网中正在传输的分组数)有着密切的关系。当 通信子网 负荷比较小时,网络的 吞吐量 (分组数/秒)随网络负荷(每个 节点 中分组的平均数)的增加而线性增加。当网络负荷增加到某一值后,若 网络吞吐量 反而下降,则表征网络中出现了拥塞现象。在一个出现拥塞现象的网络中,到达某个 节点 的分组将会遇到无缓冲区可用的情况,从而使这些分组不得不由前一节点重传,或者需要由源节点或源 端系统 重传。当拥塞比较严重时, 通信子网 中相当多的传输能力和 节点 缓冲器都用于这种无谓的重传,从而使通信子网的有效 吞吐量 下降。由此引起恶性循环,使 通信子网 的局部甚至全部处于 死锁 状态,最终导致网络有效 吞吐量 接近为零。(百度百科)
(自我理解)
当网络的吞吐量达到一定的限制后,会发生拥塞现象,那么此时发送的数据包会因为延迟无法到达接收端,因为超时重传机制所以发送端会重新发送数据包,那么网络带宽中本来就很拥塞,那么的话再发数据包就会更加拥塞,由此会形成恶性循环,如果不加控制的话,那么最终网络的有效吞吐量将接近为0.

2:拥塞中的相关概念

(1):cwnd
这个是一个发送方维护的一个状态变量,他会根据网络的拥塞程度动态变化。(刚开始的时候cwnd是不断增长的,直到遇到拥塞就会发生相应的调整)
发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是
swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。

3:如何知道网络中是否发生了拥塞

其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传(快速重传),就会认为网络出现了用拥塞。

4:如何控制网络拥塞

(1):拥塞控制算法简介

拥塞控制的过程分为四个阶段:慢启动、拥塞避免、拥塞发生(快重传),快恢复
在这里插入图片描述

a:慢启动
慢启动阶段思路是不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小,在没有出现丢包时每收到一个 ACK 就将拥塞窗口大小加一(单位是 MSS,最大单个报文段长度),每轮次发送窗口增加一倍,呈指数增长,若出现丢包,则将拥塞窗口减半,进入拥塞避免阶段;
b:拥塞避免和快重传
当窗口达到慢启动阈值或出现丢包时,进入拥塞避免阶段,窗口每轮次加一,呈线性增长;当收到对一个报文的三个重复的 ACK 时,认为这个报文的下一个报文丢失了,进入快重传阶段,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认;
c:快恢复
快重传完成后进入快恢复阶段,将慢启动阈值修改为当前拥塞窗口值的一半,同时拥塞窗口值等于慢启动阈值,然后进入拥塞避免阶段,重复上述过程

(2):慢启动

TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,如果一上来就发大量的数据,这不是给网络添堵吗?
慢启动的算法记住一个规则就行:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。
这里假定拥塞窗口 cwnd 和发送窗口 swnd 相等,下面举个栗子:

  • 连接建立完成后,一开始初始化 cwnd = 1,表示可以传一个 MSS 大小的数据。

  • 当收到一个 ACK 确认应答后,cwnd 增加 1,于是一次能够发送 2 个当收到 2 个的 ACK 确认应答后, cwnd 增加 2,于是就可以比之前多发2 个,所以这一次能够发送 4 个

  • 当这 4 个的 ACK 确认到来的时候,每个确认 cwnd 增加 1, 4 个确认 cwnd 增加 4,于是就可以比之前多发 4 个,所以这一次能够发送 8 个。
    在这里插入图片描述
    可以看出慢启动算法,发包的个数是指数性的增长。
    “ 那慢启动涨到什么时候是个头呢?

    有一个叫慢启动门限(慢启动阙值) ssthresh (slow start threshold)状态变量。
    当 cwnd < ssthresh 时,使用慢启动算法。当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」

(3):拥塞避免算法

当拥塞窗口 cwnd 「超过」慢启动门限 ssthresh 就会进入拥塞避免算法。
一般来说 ssthresh 的大小是 65535 字节。
那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd

示例:
接上前面的慢启动的栗子,现假定 ssthresh 为 8:
当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长

在这里插入图片描述
所以,我们可以发现,拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。
就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。
当触发了重传机制,也就进入了「拥塞发生算法」。

(4):拥塞发生(快重传或超时重传)

「快速重传算法」。当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。
TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:
cwnd = cwnd/2 ,也就是设置为原来的一半;
ssthresh = cwnd;进入快速恢复算法

(5):快速恢复

快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕
正如前面所说,进入快速恢复之前,cwnd 和 ssthresh 已被更新了:
cwnd = cwnd/2 ,也就是设置为原来的一半;
ssthresh = cwnd;
在这里插入图片描述
然后,进入快速恢复算法如下:
拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);

  • 重传丢失的数据包;

  • 如果再收到重复的 ACK,那么 cwnd 增加 1;

  • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态; (当重新接收到ACK的话说明传输数据包已经正常,那么就可以恢复到之前的状态拥塞状态)
    在这里插入图片描述
    参考自

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

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

相关文章

解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)

解决 WPF 绑定集合后数据变动界面却不更新的问题独立观察员 2020 年 9 月 9 日在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合&#xff08;满足需求即可&#xff0c;无所谓什么类型的集合&#xff09;&#xff0c;以下是 Xaml 代码&#xff08;瞟一眼就行&…

Kubernetes Liveness and Readiness Probes

在设计关键任务、高可用应用程序时&#xff0c;弹性是要考虑的最重要因素之一。当应用程序可以快速从故障中恢复时&#xff0c;它便具有弹性。云原生应用程序通常设计为使用微服务架构&#xff0c;其中每个组件都位于容器中。为了确保Kubernetes托管的应用程序高可用&#xff0…

「offer来了」2种递进学习思维,24道计网题目,保姆级巩固你的计网知识体系

「面试专栏」前端面试之计算机网络篇⚾序言&#x1f3d0;一、基础知识环节1、专栏学习2、书籍学习⚽二、思维导图环节&#x1f3b3;三、OSI七层模型1、OSI模型是什么&#xff1f;2、OSI七层模型遵循原则&#x1f3cf;四、TCP与UDP1、TCP与UDP的区别2、TCP/UDP的优缺点&#xff…

leetcode236. 二叉树的最近公共祖先

一:题目 二:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:/**思路:1.这里我们需要的是从底向上开…

进击吧! Blazor !第二期 页面制作

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

「软件项目管理」一文详解软件项目管理概述

一文详解软件项目管理概述&#x1f6b5;前言&#x1f93d;一、项目与软件项目1、项目的定义2、项目的特征3、项目与日常运作举例&#xff08;1&#xff09;判断哪些活动是项目&#xff08;2&#xff09;举例结果&#xff08;3&#xff09;项目与日常运作区别总结4、软件项目的特…

初识ABP vNext(9):ABP模块化开发-文件管理

点击上方蓝字"小黑在哪里"关注我吧创建模块模块开发应用服务运行模块单元测试模块使用前言在之前的章节中介绍过ABP扩展实体&#xff0c;当时在用户表扩展了用户头像字段&#xff0c;用户头像就涉及到文件上传和文件存储。文件上传是很多系统都会涉及到的一个基础功能…

「offer来了」浏览器原理被问懵?5大知识板块巩固你的http知识体系(3.6w字)

「面试专栏」前端面试之浏览器原理篇&#x1f3d4;️序言&#x1f304;一、http和https协议&#xff08;一&#xff09;http和https之间的关系&#x1f9ed;1、http和https是什么&#xff1f;2、http和https的区别&#xff08;二&#xff09;http协议&#x1f9ed;1、http1.0、…

使用Azure DevOps Pipeline实现.Net Core程序的CD

上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI。这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD。实现本次目标我们除了Azure DevOps外还需要&#xff1a;一台安装了Docker的主机一个 Docker Hub 账号上一次我们的CI实现了&#xff1a;发布>编…

TCP四次挥手(详解)

一:TCP四次挥手 1:图示 二:TCP四次挥手的过程 所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放&#xff0c;另一方被动释放。挥手之前主动释放连接的客户端结束ESTABLISHED阶段。随后开始“四次挥手”&#xff1a; a:首先客户端想要释放连接&#xff0c…

「软件项目管理」项目初始——项目确立与生存期模型

「软件项目管理」项目初始阶段——项目确立与生存期模型&#x1f6f0;️序言Preface&#x1f680;一、项目评估1、评估内容2、净利润与投资回报率3、举例阐述&#x1fa90;二、项目立项1、立项流程2、Make or Buy决策3、Make or Buy决策实例&#x1f6f8;三、项目招投标1、项目…

双城生活,一种相对无奈且幸福的选择

这是头哥侃码的第215篇原创我小时候经常被人问到一个问题&#xff1a;“你喜欢夏天还是冬天&#xff1f;”“夏天啊&#xff01;因为夏天可以有两个月的暑假&#xff0c;而且还可以玩水&#xff0c;还有清凉的盐水棒冰、短裤和凉拖&#xff0c;还可以在空调间里打游戏&#xff…

leetcode450. 删除二叉搜索树中的节点(详解)

一:题目 二:上码 1.确定递归函数和参数 TreeNode* deleteNode(TreeNode* root, int key) 这里的返回参数 我们也用一个指针接住&#xff0c;反正我们最终是返回的整棵树&#xff08;如果没找到那就是空&#xff09; 2.确定递归函数的终止条件 if(root NULL) return root; 3.确…

「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识

「面试专栏」前端面试之操作系统篇&#x1f3b9;序言&#x1f3b8;一、思维导图&#x1f3ba;二、常见面试题1、进程和线程以及它们的区别2、进程间通信的几种方式&#xff08;1&#xff09;管道(pipe)及命名管道(named pipe)&#xff08;2&#xff09;信号(signal)&#xff08…

推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架

JHRS一个新学WPF的IT老鸟&#xff0c;肝了2个月做了这么一个WPF企业级开发框架&#xff0c;站长clone学习&#xff0c;觉得甚是不错。这是一个使用了Prism搭建的插件式框架&#xff0c;封装了DataGrid的使用&#xff0c;使整个框架子模块简单易学、易扩展&#xff0c;特别是作者…

「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系

「面试专栏」前端面试之vuejs篇&#x1f5bc;️序言&#x1f399;️一、vue2.x基础知识预备&#x1f4fb;二、vue2.x基础知识常见面试题1、请说出vue.cli项目中src目录每个文件夹和文件的用法&#xff1f;2、vue.cli中怎样使用自定义的组件&#xff1f;有遇到过哪些问题&#x…

.NET Core 下使用 Apollo 配置中心

“Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适用于微服务配置管理场景。服务…

「offer来了」从基础配置到高级配置,16大知识点带你巩固webpack知识体系

「面试专栏」前端面试之Webpack篇&#x1f9e9;序言&#x1f3a8;一、基础知识学习&#x1f3b2;二、常见面试题汇总&#x1f3af;三、构建和打包1、前端代码如何进行构建和打包&#xff1f;2、前端为何要进行打包和构建&#xff1f;3、webpack原理&#x1f3b0;四、模块相关1、…

进击吧!Blazor!第一期回顾

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

《五分钟商学院》个人篇学习总结(下)

【商业知识】| 作者 / Edison Zhou这是EdisonTalk的第286篇原创内容商业篇聚焦的是我们与外部的关系&#xff0c;管理篇聚焦的是我们与内部的关系&#xff0c;而个人篇聚焦的则是我们与自己的关系。与自己斗&#xff0c;其乐无穷&#xff0c;本文是个人篇的下半部分学习总结。上…