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

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

相关文章

笔记 | 软件工程06-2:软件设计-软件体系结构设计

1 软件体系结构的概念 1.1 软件体系结构的设计元素 1.2 不同的抽象层次 1.3 软件体系结构的不同视图 1.3.1 软件体系结构的逻辑视图:包图 1.3.2 软件体系结构的逻辑视图:构件图 1.3.3 软件体系结构的开发视图 1.3.4 软件体系结构的部署视图 1.3.4.1 描述…

02眼电识别眼动--软件V1.0

对应视频链接点击直达 01项目点击下载,可直接运行(含数据库) 02眼电识别眼动--软件V1.0 对应视频链接点击直达构思结语其他以下是废话 构思 对于软件,主要就是接收数据、处理数据、储存和显示数据。 这是主要页面,…

【第2章】Vue快速上手

文章目录 前言一、第一个Vue程序二、Open in Browser插件1.安装2. 使用3. 界面 总结 前言 这里我们来实现我们的第一个程序。 一、第一个Vue程序 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&quo…

java版UWB高精度实时定位系统源码springboot+vue

UWB人员定位系统&#xff0c;实现人员的自动识别、位置定位、区域报警等功能。该系统能高效记录人员信息&#xff0c;出入信息及位置信息&#xff0c;并能灵活的查询及管理历史轨迹&#xff0c;可极大提高信息安全度&#xff0c;有效弥补了视频监控的不足。使人员管理实现信息化…

【端午惊喜】2024年6月6日 docker 国内镜像源集体失效

文章目录 概述中科大镜像源阿里镜像源其他镜像源可用的镜像源写在最后 概述 大家都知道使用docker hub官方镜像需要魔法&#xff0c;虽然大部人有魔法&#xff0c;但是网速也是很慢&#xff0c;还有部分同学没有&#xff0c;全靠国内各大厂商的镜像源&#xff0c;可是端午6.6大…

一个公用的数据状态修改组件

灵感来自于一项重复的工作&#xff0c;下图中&#xff0c;这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是&#xff0c;基于该组件类捕获组件跳转写了这款通用接口。省时省力。 代码如下&#xff1a;…

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时&#xff0c;若发现程序运行时间越长&#xff0c;占用内存越大直至崩溃&#xff0c;通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因&#xff0c;包括数组和字符串处理、未释放的资源、循环中的对象创建等&#xff0c;并提供具体的解决方…

【ARM Coresight Debug 系列 -- ARMv8/v9 软件实现断点地址设置】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v8 软件设置段带你断点地址软件配置流程代码实现 ARMv8/v8 软件设置段带你 在ARMv8/9架构中&#xff0c;可以通过寄存器 DBGBVR0_EL1 设置断点。这个寄存器是一系列调试断点值寄存器中的第一个DBGBVRn_EL1&#xff0c;其中n…

http接口上传文件响应413:413 Request Entity Too Large

目录 一、场景简介二、异常展示三、原因四、解决 一、场景简介 1、服务端有经过nginx代理 2、上传文件超过5M时&#xff0c;响应码为413 3、上传文件小于5M时&#xff0c;上传正常 二、异常展示 三、原因 nginx限制了上传数据的大小 四、解决 扩大nginx上传数据的大小 步…

大模型生成短视频

最近看到一个开源项目可以通过AI生成短视频&#xff0c;然后尝试了下&#xff0c;感觉还不错&#xff0c;下面是具体步骤。 项目名叫moneyprinterTurbo&#xff0c;它本意是对接到Youtube&#xff0c;自动生成视频并上传到Youtube获取流量赚钱&#xff0c;所以项目名叫moneypri…

CISP究竟适合谁?这四类人没跑了

在信息技术飞速发展的现在&#xff0c;网络安全已经成为了一个不可忽视的话题。 CISP&#xff0c;即注册信息安全专业人员&#xff0c;是网络安全领域内一项备受认可的专业认证。 但CISP究竟适合谁考呢&#xff1f;这不仅是一个技术问题&#xff0c;更是一个职业规划的问题。…

修改onnx模型中间节点命名(包含输入、输出重命名)

来源&#xff1a;Paddle2ONNX Paddle2ONNX/tools/onnx/README.md at develop PaddlePaddle/Paddle2ONNX GitHub 依赖&#xff1a;import onnx python rename_onnx_model.py --model model.onnx --origin_names x y z --new_names x1 y1 z1 --save_file new_model.onnx 其中 …

Windows 10 找不到Microsoft Edge 浏览器

下载链接 了解 Microsoft Edge 手动下载浏览器 问题说明 一般来说&#xff0c;windows10系统应该是自带浏览器edge的&#xff0c;但有的电脑就是没有找到edge浏览器&#xff0c;可能系统是精简过的&#xff0c;可能是被卸载了。如下&#xff0c;控制面板确实没找到程序。 ​ …

修改SubVI的LabVIEW默认搜索路径

在启动顶级VI后&#xff0c;LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下&#xff0c;LabVIEW会按以下顺序搜索文件位置&#xff08;*表示LabVIEW将搜索子目录&#xff09;&#xff1a; <t…

基于SSM+Jsp的交通事故档案管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

3.Nginx配置文件基本介绍

nginx配置文件所在路径&#xff1a;/usr/local/nginx/conf/nginx.conf nginx配置文件有三块&#xff1a; 1.全局块 从配置文件开始到events块之间的内容&#xff0c;主要会设置一些影响nginx服务器整体运行的配置指令。 配置运行nginx服务器的用户(组)允许生成的worker pro…

hadoop和hbase对应版本关系

https://hbase.apache.org/book.html#configuration

Vulnhub-DC-3

joomla3.7.0的提权 靶机IP:192.168.20.136 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 首先nmap扫端口和版本&#xff0c;dirsearch跑下目录&#xff0c;wappalyzer也可以用下 发现服务器用的ubuntu&#xff0c;JoomlaCMS等…

Activiti7 Maven笔记

通过maven完成BPMN的创建,定义流程,部署流程,完成流程等操作 代码整合创建maven项目添加log4j日志配置添加activiti配置文件创建数据库 activitijava类编写程序生成表如果代码运行,没有生成表,可能是没有读取到activiti的配置文件 Activiti数据表介绍类关系图工作流引擎创建默认…

【C语言】一篇带你高强度解析精通 字符串函数和内存函数 (万字总结大全,含思维导图)(建议收藏!!!)

【 库函数】——字符串函数和内存函数 目录 思维导图&#xff1a; 一&#xff1a;字符串函数 1.1&#xff1a;字符串常规函数 1.1.1&#xff1a;长度不受限制的字符串函数 1.1.1.1&#xff1a;strlen函数 1.1.1.2&#xff1a;strcpy函数 1.1.1.3&#xff1a;strcat函数 …