网络原理-四

一、续

当窗口大小为0,意味着缓冲区满了,此时发送方,就因该暂停发送,发送方会周期性的除法 " 窗口探测包 " ,并不携带载荷,这样的包对于业务不产生影响,只是为了触发ACK,一旦查询出来的结果是非0,缓冲区右有空间了,发送方就可以继续发送.

二、拥塞控制

要限制发送方发送数据的速率

如果当前接收方处理数据的速度非常快,但是中间路径出现了问题,发送速度再快也没有用.

木桶效用 : 能装多杀水,取决于最短的板

针对这种情况,核心思路,把中间的路径经过的所有设备看作一个整体,通过实验的方式找到最快的方式.

如果按照某个窗口大小发送数据之后,出现丢包,就视为中间路径存在拥堵,就减小窗口大小,

没出现丢包,视为中间路径不存才拥堵,就增大窗口大小.

这种方案,一方面简化了问题,另一方面也能很好地适应,当前网络环境的复杂性.

中间这些节点,什么时候出现拥堵,什么时候不拥堵,都是随机的

此时按照以上策略,就可以让发送速率,.动态变化.

总的原则是,流量控制和拥塞控制,谁产生的窗口大小更小,谁说的算.

拥塞控制具体是怎么把窗口大小给试出来的?

1. 慢启动.刚开始传输的数据,速率是比较小的,采用的窗口 (拥塞窗口) 大小也就比较小.此时,网络的拥堵情况未知,如果上来就很大,可能会出问题.

2. 此时上述传输的数据,没有出现丢包,说明网络还是通畅的,就要增大窗口大小,此时,增大的方式是按照指数来增长的.

由于慢启动,.开始的时候,窗口大小非常小,也有可能网络上就是很畅通,通过指数可以让上述窗口快速增长,这样就可以保证效率了.

3. 指数增长,不会一直保持的,可能会增长太快,一下子导致网络拥堵.

这里引入了一个 "阈值",当拥塞窗口达到阈值后,此时指数增长就变成线性的了.

(线性增长能使当下窗口保持在一个很快的效率,并且不容易丢包.

4. 线性增长也是一直在增长,积累一段时间之后,传输速度可能太快,此时还是会引起丢包,一旦出现丢包,就把拥塞窗口重置成最小的值,回到最初的慢启动的过程(再次指数增长),并且这里也会根据刚才丢包的窗口大小,重新设置指数增长到线性增长的阈值.

三、延时应答

也是基于滑动窗口,是要尽可能在提高一点效率.

结合滑动窗口及流量控制,能够通过延时应答ACK的方式,把反馈窗口的大小变得更大一点.

核心就在于在允许范围内,使,窗口尽可能的变大.

接收方收到数据之后,不会立即返回ACK,而是稍等一下,等一下再返回ACK.

等了一会儿,相当于给接收方的应用程序这里,腾出来更多的时间,来消费这里的数据.

也就是等一会儿,让接受让先处理一下数据,就会让缓冲区空余空间变大,然后再发送更多的数据.

延时应答是按照ACK丢了的方式来处理,因为滑动窗口中ACK丢了也不会产生什么影响.

正常每个数据都有ACK,此时就可以隔几个数据返回一次ACK,

四、捎带应答

基于延时应答,引入的机制,能够提升传输效率.

修改窗口大小,确实是提高效率的有效途径.

捎带应答,就是走另一条路,尽可能的把能合并的数据包进行合并,从而起到提高效率的效果.

正常情况下,服务器返回的ACK和response之间,有一定的时间间隔,此时就得分两个包发送了.

由于有了延时应答, 服务器收到请求后,要执行业务逻辑,根据请求计算响应.

ACK延时这段时间里,响应数据刚好准备好了,此时就可以把AKC和响应数据合并成一个TCP数据报

本身ACK也不带载荷,只是把报头中的ACK标志位设为1,并且设置确认序号以及窗口.

这几个属性不会冲突.

五、面向字节流

"粘包问题"

此处的包是 " TCP载荷中的应用数据包"

TCP传输的数据到了接收方后,接收方要根据socket api 来 read 出来,read出来的结果就是应用层数据包.

由于整个read过程非常灵活,可能会使代码中无法区分出当前的数据是从哪到哪是一个完整的应用数据包,

如上图,就无法确定从哪到哪是一个数据.

解决问题的关键,就是"明确包与包之间的边界"

1. 通过特殊符号,作为分隔符,见到分隔符,就视为一个包结束了

2. 指定出包的长度,比如在包开始的位置,加上一个特殊的空间来表示整个数据的长度.

上述这样的问题,都应该是在设计应用层协议的时候就设计好了的.

六、异常问题

考虑比丢包更严重的情况,甚至说网络直接出现故障等情况

1. 其中有一方出现了进程崩溃

进程无论是正常结束,还是异常崩溃,都会触发到回收文件资源,关闭文件这样的效果(系统自动完成的),就会触发四次挥手

TCP的生命周期.可以比进程更长一点,虽然进程已经退出了,但是TCP连接还在,仍然可以继续进行四次挥手.

2. 其中有一方关机了(正常流程)

关机会强制终止所有进程,此时四次挥手不一定能完成

如果够快,此时,本段和对端都能正确删除保存的连接信息.

如果不够快,至少也把第一个FIN发给对方,告诉对方我这里要结束了.

对端收到FIN后,对端也要进入释放连接的流程了,返回ACK,并且也发FIN,这里发的FIN不会再有ACK了.

FIN没有收到ACK之后,会进行重传,达到指定次数后,就单方面释放连接了.

3. 其中一方出现断电.

   3.1 断电的是接收方,发送方会突然发现没有ACK了,就要重传.

        重试几次后还是不行,TCP就会尝试复位连接.(相当于清楚原来的TCP中的各种临时数据,重新开始.)

这就需要用到TCP中的一个复位报文段.

通过此处的RST,报文直接复位.

        3.2 断电的是发送方

接收方本来在阻塞等待发送方的消息,结果一直没来.

这是就要区分,发送方是挂了还是没准备好.

TCP中,接收方一段时间后,没有收到消息,就会触发 " 心跳包 " 来询问对方的情况.

心跳包:不携带应用层数据包的特殊数据包,1. 周期的   2. 没有心跳,视为是对端挂了.

如果对端没有心跳了,此时本端也会尝试复位并且单方面释放连接了.

   4. 网线断开.

这种情况本质上就是3的3.1 和 3.2 的结合了.

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

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

相关文章

【AI+知识库问答】沉浸式体验了解 AI知识库问答fastGPT

之前写过一篇文章 【AI本地知识库】个人整理的几种常见本地知识库技术方案 , 由于当时主要是针对AI本地知识库, 所以没列fastGPT。 最近经常刷到fastGPT,这里单独水一篇。 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,…

Github 2024-06-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5Jupyter Notebook项目2TypeScript项目1Go项目1Shell项目1Lua项目1Kong:云原生API网关与AI能力 创建周期:3482 天开发语言:Lua协议…

云原生架构相关技术_4.服务网格

1.技术特点 服务网格(ServiceMesh)是分布式应用在微服务软件架构之上发展起来的新技术,旨在将那些微服务间的连接、安全、流量控制和可观测等通用功能下沉为平台基础设施,实现应用与平台基础设施的解耦。这个解耦意味着开发者无需…

Chisel入门——在windows下vscode搭建|部署Scala2.13.3开发环境|用Chisel点亮FPGA小灯等实验

文章目录 前言一、vscode搭建scala开发环境1.1 安装Scala官方插件1.2 创建hello_world.scala文件1.3 确认java的版本(博主使用的是1.8)1.4 下载Scala Windows版本的二进制文件1.5 配置环境变量1.6 交互模式测试一下1.7 vscode运行scala 二、windows安装sbt2.1 下载sbt2.2 设置环…

函数递归及具体例子(持续更新)

递归就是函数自己调用自己 求n的阶乘 n! n * (n - 1)! 直到n为1或者0的时候为止 举个例子 int Fun(int n) {if (n < 0){return 1;}else{return n * Fun(n - 1);} }int main() {int n 0;scanf("%d", &n);int ret Fun(n);printf("%d\n", ret…

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…

springboot中抽象类无法注入到ioc容器

1、背景 在写代码时&#xff0c;发现service接口有两个实现类&#xff0c;并且两个实现类中没有对类名重命名&#xff0c;属性注入的时候也没有使用byName或Qualifier&#xff0c;正确情况下会发生多实现报错的问题&#xff0c;以前对这个问题进行解析过。 2、调试过程 我想…

【设计模式】创建型-建造者模式

前言 在面向对象的软件开发中&#xff0c;构建复杂对象时经常会遇到许多挑战。一种常见的解决方案是使用设计模式&#xff0c;其中建造者模式是一个强大而灵活的选择。本文将深入探讨建造者模式的原理、结构、优点以及如何在实际项目中应用它。 一、复杂的对象 public class…

飞凌嵌入式FET3568/3568J-C核心板现已适配OpenHarmony4.1

近日&#xff0c;飞凌嵌入式为FET3568/3568J-C核心板适配了OpenHarmony4.1系统&#xff0c;新系统的加持使核心板在兼容性、稳定性与安全性等方面都得到进一步提升&#xff0c;不仅为FET3568/3568J-C核心板赋予了更强大的功能&#xff0c;也为开发者们提供了更加广阔的创新空间…

每日一练编程题:今天是【接口,多态】

设计程序 : 电脑类的属性USB接口数组 : 有3个usb插口电脑类的功能 : 通过接口插入外设 (u盘,麦克风,键盘等) addUSB(USB usb) { }开机 要求: 电脑开机前,先启动外设关机 要求: 电脑关机前,先关闭外设 外设类(u盘,麦克风,键盘等) 功能 : 启动 关闭 USB接口 定义usb设备的统一…

python多种方式 保留小数点位数(附Demo)

目录 前言1. 字符串格式2. round函数3. Decimal模块4. numpy库5. Demo 前言 在Python中&#xff0c;保留小数点后特定位数可以通过多种方式实现 以下是几种常见的方法&#xff0c;并附上相应的代码示例&#xff1a; 使用字符串格式化&#xff08;String Formatting&#xff…

Ubuntu20.04 Mysql基本操作知识

#Mysql基本知识 运行环境Ubuntu20.04 1.开启mysql服务 sytemctl start mysql不然&#xff0c;命令行进入myql交互行提交命令后&#xff0c;就会出现4200错误。 2.显示所有数据库 SHOW DATABASES;注意复数s&#xff0c;毕竟很多数据库 3.新建数据库test CREATE DATABASE …

【学习笔记】计算机组成原理(九+十)

控制单元的功能 文章目录 控制单元的功能9.1 微操作命令的分析9.1.1 取指周期9.1.2 间址周期9.1.3 执行周期9.1.4 中断周期 9.2 控制单元的功能9.2.1 控制单元的外特性9.2.2 控制信号举例9.2.3 多级时序系统9.2.4 控制方式 控制单元的设计10.1 组合逻辑设计10.1.1 组合逻辑控制…

LabVIEW与Simulink的通信及调用方式

LabVIEW和Simulink可以通过多种方式进行通信和集成&#xff0c;实现数据交互和功能调用。常见的通信方式包括TCP/IP、UDP、共享内存等&#xff0c;此外还可以利用MATLAB Script Node和S-Function等直接调用对方的功能。这些方法使得LabVIEW和Simulink能够协同工作&#xff0c;充…

[Algorithm][动态规划][子序列问题][最长递增子序列的个数][最长数对链]详细讲解

目录 1.最长递增子序列的个数1.题目链接2.算法原理详解3.代码实现 2.最长数对链1.题目链接2.算法原理详解3.代码实现 1.最长递增子序列的个数 1.题目链接 最长递增子序列的个数 2.算法原理详解 注意&#xff1a;本题思路和思维方式及用到的方法很值得考究&#xff0c;个人感…

dubbo复习:(18)服务端Filter

用来在服务响应返回到客户端之前进行额外处理。 一、定义Filter package cn.edu.tju.config;import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invocation; import org.apache.du…

大量path计算优化方案

1.影响path基础属性数据做key缓存&#xff0c;缓存的path应去除坐标变换&#xff0c;归一化。基础属性应满足CAB, BC-A 2.高频path操作以&#xff08;keykey操作&#xff09;做新key缓存。 3.高频修改高级属性&#xff0c;以新key属性变更做新key缓存。 4.key与id做中转映射&am…

ad18学习笔记20:焊盘设置Solder Mask Expansion(阻焊层延伸)

【AD18新手入门】从零开始制造自己的PCB_ad18教程-CSDN博客 Altium Designer绘制焊盘孔&#xff08;Pad孔&#xff09;封装库的技巧&#xff0c;包括原理图封装和PCB封装_哔哩哔哩_bilibili 默认的焊盘中间是有个过孔的&#xff0c;单层焊盘&#xff08;表贴烛盘&#xff09;…

工作流 Activiti7 初始

文章目录 ☃️1.1 Activiti 介绍☃️1.2 Activiti 开发流程☃️1.3 BPMN 2.0 规范是什么☃️1.4 BPMN 2.0 基本流程符号❄️❄️1.4.1 事件 Event❄️❄️1.4.2 活动❄️❄️1.4.3 网关 Gateway ☃️1.5 Activiti API 服务接口❄️❄️1.5.1 核心Service接口及其获取 ☃️1.1 A…

fps游戏如何快速定位矩阵

fps游戏如何快速定位矩阵 矩阵特点: 1、第一行第一列值的范围在**-1 ---- 1**之间&#xff0c;如果开镜之后值会变大。 2、第一行第三列的值始终为 0。 3、第一行第四列 的值比较大 &#xff0c; >300或者**<-300**。 根据这三个特点&#xff0c;定位矩阵已经足够了…