tcp协议的延迟应答(介绍+原则),拥塞控制(拥塞窗口,网络出现拥塞时,滑动窗口的大小如何确定,慢启动,阈值)

目录

延迟应答

引入

介绍

原则

拥塞控制

引入

网络出现拥塞

引入

介绍

介绍 

拥塞窗口

介绍

决定滑动窗口的大小

慢启动

介绍

为什么要有慢启动

阈值

算法

总结


延迟应答

引入

发送方一次发送更多的数据,发送效率就越高

  • 因为要写入网卡
  • 硬件的io速度很慢,尽量少访问硬件,io效率会提高

而发送的数据量取决于对方的接收能力(窗口大小)

  • 那么,如何让接收方向对方通告一个更大的窗口呢?

介绍

也就是让接收方先不着急返回应答,等一等,给上层留时间读取数据

  • 这样就有较大概率可以有更大的窗口
  • 当然,效率提高不是一定的,因为上层读不读我们没法控制

所以,这也给我们有一定的启示

  • 编写基于tcp的服务器代码时,要尽快把数据读上来
  • 这样就能提供更大的接收窗口->对方的滑动窗口大小增大->对方就可以发送更多的数据

原则

  • 不同os有不同的具体设置,一般N=2,最大延迟时间=200ms
  • 这个[最大延迟时间]要比[超时时间]短的多

拥塞控制

引入

之前介绍的策略,都是作用在双方主机上的 

  • 但是,数据包大部分时间都在网络中,所以网络信道也对通信有影响
  • 所以,tcp还需要对网络制定策略
  • 但是因为网络不属于客户端/服务端的范畴,所以这俩没法对网络直接做些什么,只是一些策略

网络出现拥塞

引入

对于网络拥塞问题,我们可以做个比喻:

  • 如果一场考试,只有几个人挂科,那只能说明是这几个没好好学
  • 如果班上大部分人都挂科了,只有几个及格,不免让人怀疑这场考试有问题

网络也是如此:

  • 出现少量丢包是正常的
  • 但如果大面积丢包,可能就是通信过程中有什么问题

一是对方可能来不及接收,导致丢包

  • 但是有流量控制,所以应当不会

二是网络有问题

  • 可能是硬件设备有问题
  • 或是数据量过大,引起阻塞
  • 这两个问题也可能是一个问题,因设备问题导致数据阻塞

所以,在通信过程中,不仅要考虑双方如何,也要考虑网络如何,也就是需要评估网络的健康状态

介绍

如果通信时出现了大量丢包

  • tcp就认为是网络出了问题(网络阻塞)

如果知道大量丢包(即滑动窗口内有大量的数据都超时了,连应答都没有)

  • 大部分可能自己过一会儿会缓过来,但我们也不能坐以待毙啊,总得做点什么,也就有了拥塞控制
  • 如果网络大量瘫痪,tcp协议也救不了,那就只能让工程师来维修了(毕竟tcp制定的机制并不是万能的)

介绍 

所以,对于这些大量超时的数据,发送方该如何呢?

  • 首先,肯定是不能立即重传的(少量重传倒是没问题,因为只是个例)
  • 而大量丢包必然是哪里出了问题
  • 如果是设备出错,即使发了也是白发
  • 如果是数据拥塞,那重发了岂不是会更加重拥塞程度
  • 所以,发送方需要先等等

这样的话,所有遵守tcp协议的主机遇到网络拥塞时都等一等

  • 在网络中传递的数据量一下子就少了,拥塞自然很快就能消减
  • 这属于是用tcp协议实现了多主机面对网络出现拥塞问题的共识

当然,也不是所有主机都能识别到网络拥塞,也就不会触发拥塞控制,可能它发送的数据少,丢包的就少

  • 网络拥塞程度越严重,影响的主机越多,就有更多的主机触发拥塞控制,减少数据量的发送
  • 如果网络拥塞并不严重,也就只会带动少量的主机
  • 挺巧妙的

当识别到网络拥塞时,我们需要引入一个新概念 -- 慢启动

同时也要引入一个新窗口 -- 拥塞窗口

拥塞窗口

介绍

初始值为1,以指数级增长

  • 在慢启动阶段,拥塞窗口的大小会随着每次收到一个ACK而指数增长,直到达到慢启动阈值

决定滑动窗口的大小

每次发送报文时,不仅要考虑对方的接收能力,也要考虑网络的拥塞情况

  • 所以,实际发送数量 = min( 拥塞窗口大小,对方的接收窗口大小 )

而我们知道,发送数据的量取决于滑动窗口的大小

  • 所以,我们就能修改之前对滑动窗口大小的认知了:
  • 滑动窗口大小=min(拥塞窗口大小,对方的接收窗口大小)

因为即使对方的接收能力很强,网络容纳不下也是白搭

  • 所以也需要动态考虑网络的接收能力
  • 反过来也是如此
  • 所以,需要以最小限度作为限制

同样的,滑动窗口的右指针的计算方式也要变

  • 因为要考虑网络状况,所以end = min( 接收窗口大小,有效数据大小,拥塞窗口大小 )

慢启动

介绍

慢启动是TCP连接建立后的初始阶段

  • 其目的是为了迅速估计网络的可用带宽和避免拥塞
  • 在慢启动阶段,发送方以指数增长的方式增加拥塞窗口的大小,从而逐渐增加发送的数据量,直到达到一个阈值
  • 慢启动只是初始值增长的慢,一段时间后就很恐怖了

所以,为什么慢启动可以控制发送方发送的数据量?

  • 因为它可以限制滑动窗口大小
  • 也就是上面说的,滑动窗口大小的取决因素里,有拥塞窗口的存在

为什么要有慢启动

因为需要在前期发送少量报文

  • 用于试探网络状态

如果发送的报文基本都有应答,说明此时网络很健康

  • 那么就该加大发送力度,就不能让拥塞窗口大小限制住数据发送量
  • (中后期拥塞窗口很大,计算实际发送量时,只取决于对方的接收能力)

阈值

当然,拥塞窗口也不能这样一直增大下去,超变量范围了怎么办

  • 所以要引入慢启动的阈值

超过这个阈值后,窗口大小将以线性方式增长,也就退出慢启动阶段

如果在增长的过程中出现了网络拥塞

  • 就以此时的窗口大小作为基准值,进行某一运算后得到新的阈值
  • 然后以新的阈值重新进行慢启动,达到阈值后就变为线性增长

但是,也不一定就会出现网络阻塞

  • 并且当滑动窗口大小取决于接收窗口大小时,阻塞窗口更不更新就不重要了
算法

新阈值=导致拥塞的窗口大小/2

  • /2可能是经过实验得到的比较合适的算法
  • 策略/原理啥的都需要经过测试,测试得出来确实是效率更高,所以就采用了

总结

所以,我们现在拥有三个窗口,接收窗口,滑动窗口,拥塞窗口

拥塞窗口 --- 主机衡量网络健康状态的指标

  • 因为网络是动态变化的,所以拥塞窗口本身就不是静态的
  • 如果发送数据量超过拥塞窗口大小,就会引起网络拥塞

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

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

相关文章

conda 创建环境失败

conda create -n pylableimg python3.10在conda (base)环境下,创建新的环境,失败。 报错: LookupError: didn’t find info-scipy-1.11.3-py310h309d312_0 component in C:\Users\Jane.conda\pkgs\scipy-1.11.3-py310h…

英伟达:史上最牛一笔天使投资

200万美元的天使投资,让刚成立就面临倒闭风险的英伟达由危转安,并由此缔造了一个2.8万亿美元的市值神话。 这是全球风投史上浓墨重彩的一笔。 前不久,黄仁勋在母校斯坦福大学的演讲中,提到了人生中的第一笔融资——1993年&#x…

刷代码随想录有感(98):动态规划——爬楼梯

题干&#xff1a; 代码&#xff1a; class Solution { public:int climbStairs(int n) {if(n 1)return 1;if(n 2)return 2;vector<int>dp(n 1);dp[0] 0;dp[1] 1;dp[2] 2;for(int i 3; i < n; i){dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }; 其实就是斐波…

liquibase做数据库版本管理

通过这个配置就会自动启动liquibase 比对 https://www.cnblogs.com/ludangxin/p/16676701.html https://zhuyizhuo.github.io/2020/07/04/spring-boot/spring-boot-liquibase-database-version-control/

上市公司短视主义数据集(2001-2022年)

数据简介&#xff1a;上市公司短视主义是指公司管理层过于关注短期业绩和股价表现&#xff0c;而忽视公司的长期发展和战略规划。这种短视行为可能会导致公司投资决策的失误&#xff0c;影响公司的长期竞争力。 在上市公司年度报告年度中&#xff0c;通过已有的反映管理者“短…

Excel 将同一分类下的值依次填进分类格右边的格中

表格的第2列是分类&#xff0c;第3列是明细&#xff1a; ABC1S.noAccountProduct21AAAQatAAG32BAAQbIAAW43BAAQkJAAW54CAAQaAAP65DAAQaAAX76DAAQbAAX87DAAQcAAX 需要将同一分类下的值依次填入分类格右边的格中&#xff1a; ABCD1S.noAccountProduct21AAAQatAAG32BAAQbIAAWkJ…

快速安装Windows和Ubuntu双系统

一、参考资料 用UltraISO制作Ubuntu16.04 U盘启动盘 DiskPart Command-Line Options 二、相关介绍 1. MBR和GPT分区模式 MBR分区模式 MBR最大仅支持2TB磁盘&#xff0c;超过2TB不可识别。 MBR&#xff08;Master Boot Record&#xff09;&#xff0c;即硬盘的主引导记录分…

【激光雷达】

激光雷达 机械式360扫描雷达半固态激光雷达二维扫描一维扫描 固态激光雷达OPA固态激光雷达&#xff08; 光学相控阵技术&#xff09; FMCW 激光雷达 激光雷达技术在近几年可以说是蓬勃发展&#xff0c;新能源汽车的大量使用&#xff0c;给雷达技术的发展提供了肥沃的土壤&#…

嵌入式作业6

1、利用SysTick定时器编写倒计时程序&#xff0c;如初始设置为2分30秒&#xff0c;每秒在屏幕上输出一次时间&#xff0c;倒计时为0后&#xff0c;红灯亮&#xff0c;停止屏幕输出&#xff0c;并关闭SysTick定时器的中断。 2、利用RTC显示日期&#xff08;年月日、时分秒&…

【C++类和对象中篇】(构造函数和析构函数)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f369;1.默认成员函数的概念&#xff1a; &#x1f369;2.构造函数&#xff1a; 2.1特性&…

从零开始理解AdaBoost算法:设计思路与算法流程(二)【权值更新与加权表决、数学公式】

设计思路 AdaBoost算法属于Boosting算法家族中的一种&#xff0c;其基本思路是将多个弱分类器组合成一个强分类器。 “强分类器”是指一个分类准确率较高的模型“弱分类器”则是指分类准确率略高于随机猜测的简单模型。 AdaBoost的核心思想是通过 加权 的方式逐步提高分类器…

黑马es学习

es 0. 基础概念0.1 倒排索引0.2 文档、索引0.3 与mysql对比 1 基本操作1.1 mapping 索引库操作1.2 单个文档CRUD 3. DSL查询3.1 查询所有3.2 全文检索3.3 精确查询3.4 复合查询-相关性得分3.5 分页3.6 高亮3.7 总结 2. RestClientmysql与es数据同步es集群去重 黑马视频 官方使…

Docker:利用Docker搭建一个nginx服务

文章目录 搭建一个nginx服务认识nginx服务Web服务器反向代理服务器高性能特点 安装nginx启动nginx停止nginx查找nginx镜像拉取nginx镜像&#xff0c;启动nginx站点其他方式拉取nginx镜像信息通过 DIGEST 拉取镜像 搭建一个nginx服务 首先先认识一下nginx服务&#xff1a; NGI…

04-认识微服务-SpringCloud

04-认识微服务-SpringCloud 1.SpringCloud&#xff1a; 1.SpringCloud是目前国内使用最广泛的微服务框架。官网地址&#xff1a;https://spring.io/projects/spring-cloud 2.SpringCloud集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了这些组件的自动装配&…

SpringCloud-面试篇(二十四)

&#xff08;1&#xff09;Nacos如何支撑数十万服务注册的压力 小型企业来讲nacos压力没有那么大&#xff0c;但是想阿里&#xff0c;服务的数量可能会达到数万&#xff0c;那麽多的服务。当服务原来越多时&#xff0c;除了服务注册以外&#xff0c;还有服务的定时更新&#x…

自养号测评防关联的关键点解析, 确保店铺权重和买家账号的安全稳定

现在很多大卖都是自己管理几百个账号&#xff0c;交给服务商不是特别靠谱。你不知道服务商账号质量怎么样&#xff0c;账号一天下了多少你也不清楚&#xff0c;如果下了很多单万一封号被关联了怎么办&#xff0c;你也不知道服务商用什么卡给你下单&#xff0c;用一些低汇率和黑…

一个简单好用的 C# Easing Animation 缓动动画类库

文章目录 1.类库说明2.使用步骤2.1 创建一个Windows Form 项目2.2 安装类库2.3 编码2.4 效果 3. 扩展方法3.1 MoveTo 动画3.2 使用回调函数的Color动画3.3 属性动画3.4 自定义缓动函数 4.该库支持的内置缓动函数5.代码下载 1.类库说明 App.Animations 类库是一个很精炼、好用的…

Django ORM的QuerySet:解锁数据库交互的魔法钥匙

用到此篇文章知识的几篇文章&#xff1a; Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django API开发实战&#xff1a;前后端分离、Restful风格与DRF序列化器详解 文章目录 前言一、什么是QuerySet&#xff1f;二、QuerySet 的用途三…

Dell服务器根据GPU温度调整风扇转速

前言 dell服务器自动风扇是根据CPU温度来调速的&#xff0c;我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行&#xff0c;我看了下也没有基于显卡温度调速的脚本&#xff0c;于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …

搭建vauditdemo靶场mysql为NO问题

一、问题 在搭建vauditdemo时&#xff0c;遇到如下显示问题&#xff1a; mysql版本检测为NO 二、解决 查找该方面问题时&#xff0c;并没有找到解决方法 然后换mysql版本换了五六个也没有解决问题 问了AI后给的答复有一条为将mysql改为mysqli 修改保存后解决问题 步骤如…