【网络原理】TCP 协议中比较重要的一些特性(三)

目录

1、拥塞控制

 2、延时应答

3、捎带应答

4、面向字节流

5、异常情况处理

5.1、其中一方出现了进程崩溃

5.2、其中一方出现关机(正常流程的关机)

5.3、其中一方出现断电(直接拔电源,也是关机,更突然的关机)

5.4、网络断开

1、拥塞控制

和流量控制一样,也是用来限制发送方的发送速率的。

如果当前接收方处理速度很快,但是中间的通信路径出现问题,某个地方出现了“堵车”现象,此时发送的速度再快也没有(反而发的越快丢包丢的越多)。

将中间路径的所有设备视为一个整体,如果按照某个窗口大小发送数据后出现了丢包,就视为中间路径存在拥堵,就减少窗口大小;没有出现丢包,就视为中间路径不存在拥堵,就增加窗口大小

拥塞控制的流程:

  1. 慢启动。由于刚开始网络的拥塞情况未知,如果一上来就搞很大,可能就让原本不富裕的网络宽带雪上加霜,因此此时刚启动的传输时速率比较小,采用的窗口大小(拥塞窗口)也比较小。
  2. 如果在慢启动环节没有出现丢包现象,此时说明网络比较通畅,就使用指数增大的方式逐步增大窗口大小。
  3. 指数增长增长的速度非常快,因此不会一直持续,这里引入了一个“阈值”,当拥塞窗口达到阈值之后,此时指数增长就变成了“线性增长”。
  4. 线性增长积累到一定时间后,由于传输塑速率不断增大,到达某一时刻时可能就会出现丢包,一旦出现丢包,就把拥塞窗口重置成较小的值。以前的做法是:回到最初的“慢启动”过程,然后重新开始。但是这个做法启动的起点太低了,平均速率不快。现在的做法是:启动“快恢复”,设置一个新的“阈值”,回到新的阈值,然后再继续线性增长。

 2、延时应答

也是基于滑动窗口,是要尽可能的再提高一点效率。

结合滑动窗口以及流量控制,通过延时应答 ack 的方式,把返回的“窗口大小”的数值变大一些,核心在于在允许的范围内,让窗口尽可能的大。【通过修改窗口大小提升效率】

接收方收到数据之后,不会立即返回 ack,而是等待一定时间再返回 ack,相当于给接收方的应用程序里腾出了更多的时间,来消费这里的数据,使接收缓冲区的空闲空间更大一些(因为被消费掉了),又由于流量控制“接收方会按照自身接收缓冲区的剩余空间大小作为 ack 中窗口大小的数值,发送方就能根据该数值调整窗口大小。”的机制,此时返回的窗口大小就是一个相对大的值。

前面也讨论过,滑动窗口下,如果 ack 丢了,不会有什么影响。而此处的“延时应答”也一样,可以按照“ack 丢了”的方式来处理。正常每个数据都有 ack,此时就可以每隔几个数据或每隔一定时间再返回一个 ack(起到延时应答的效果),减少了 ack 传输的数量,起到了节省开销的效果

3、捎带应答

基于延时应答引入的机制,能够提升传输效率。尽可能的把能合并的数据包进行合并,从而提高效率。

本身 ack 也不携带载荷,只要把报头中的 ack 标志位设为1,并且设置确认序号以及窗口大小,而这几个属性,response 报文本身也用不到,因此不会产生冲突。

在捎带应答的加持下,后续的每次传输请求响应,都可能触发捎带应答,都可能把接下来要传输的业务数据和上次的 ack 合二为一。(并不一定触发,主要取决于下一个数据来的时间,如果来的快就可能触发合并,来的慢就无法触发)

因为“延时应答”和“捎带应答”,使四次挥手可能合并成“三次挥手”。

4、面向字节流

由于 TCP 面向字节流,会引起“粘包问题”,粘包就类似于一段文字里没有任何标点符号,导致无法正确断句,产生非常多的歧义,包是“TCP载荷中的应用数据包”。

由于 TCP 连接中接收方整个读取过程非常灵活,可能会使代码中无法区分出当前的数据从哪到哪是一个完整的应用数据包。TCP 本身不会解决“粘包问题”,需要程序员在写应用层逻辑的时候自己去进行处理。

粘包问题,不是 TCP 独有的问题,只要面向字节流,都会有粘包问题。

解决粘包问题的关键,就是“明确包之间的边界”:

1、通过特殊符号,作为分隔符。

2、指定出包的长度。比如把包的开始位置加上一个长度表示数据长度。

5、异常情况处理

在网络连接的过程中,接收方和发送方之间可能会因为某些原因出现严重的丢包,甚至是网络直接出现故障的情况,对于这些情况该如何处理?

5.1、其中一方出现了进程崩溃

进程无论是正常结束,还是异常崩溃,都会触发“四次挥手”进行回收文件资源和关闭文件(系统自动完成)。

TCP 连接的生命周期,可以比进程更长一些, 这就使得进程虽然已经退出,但是 TCP 连接还在,仍然可以进行“四次挥手”。(虽然说是异常崩溃,实际上和正常的四次挥手结束流程,没有什么区别,进程不在了就通过系统中仍然持有的连接信息,完成后续的挥手流程)

5.2、其中一方出现关机(正常流程的关机)

当一个主机触发关机操作,就会先强制终止所有的进程(类似于上述的进程崩溃,对进程进行强杀操作)

那么根据 情况1 可以知道,终止进程自然会触发“四次挥手”。

而与 情况1 不同的是,虽然进程会自动触发“四次挥手”,但是因为系统马上就关闭,四次挥手不一定能挥完。如果挥得快,能够顺利挥完,此时本端和对端都能正常删除连接信息,完成四次挥手;如果挥得慢至少能把第一个 fin 发送到对端,至少能告诉对方我这边要结束了,对端收到 fin 之后,就会进入释放连接的流程,并返回 ack 和 fin,而此时对端发送的 fin 不会得到 ack 回应(因为本端关机了),没有收到 ack,势必会进行重传,当重传时间达到阈值,就会单方面释放连接信息

5.3、其中一方出现断电(直接拔电源,也是关机,更突然的关机)

如果直接断电,机器瞬间关机,此时肯定来不及发送 fin 。(突然断电的情况非常伤硬盘,尤其机械硬盘)。

a)断电是接收方,发送方就会突然发现没有 ack 返回了,就进行重传,几次重传后还是无回应,就会尝试使用 TCP 中的“复位报文段”进行“复位”连接(清楚原有 TCP 中的各种临时数据,重新连接)。

此时发送的 RST 也不会有 ack,复位连接也不行,就会单方面放弃连接。

b)断电是发送方。由于接收方始终都是在阻塞等待发送方的消息,此时就需要区分,发送方是暂时没法消息,还是挂了。因此 TCP 就引入了“心跳包”概念,每隔一段时间询问对方状态,当发现对方挂了(没有心跳),则按照流程执行复位连接并单方面释放连接。

5.4、网络断开

本质上就是 情况3 中的 a)和 b)的结合。

 对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136529700?spm=1001.2014.3001.5501

JVM 的垃圾回收机制以及垃圾回收算法的详解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136530845?spm=1001.2014.3001.5501【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136322678?spm=1001.2014.3001.5501

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Unity的AssetBundle资源运行内存管理的再次深入思考

大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我…

android studio设置flutter和dart的sdk配置

提示没有配置dart sdk的时候,其实只需要配置一下flutter的sdk就可以了,因为flutter的安装包里面包含了dart的sdk: 按照提示选中这个flutter的安装包路径就可以了: 并且需要开启windows的开发者开关:start ms-settings:…

Oracle 临时表空间管理(Temporary Tablespace)

Oracle临时表空间(Temporary Tablespace)主要用来存储数据库运行中产生的临时对象,例如SQL排序结果集,临时表等,这些对象的生存周期只有会话。本文总结了Oralce中涉及临时表空间的管理和优化操作。 目录 一、临时表空…

微信小程序(五十八)分步表单多页面传值

注释很详细,直接上代码 上一篇 新增内容: 1.分步表单传值 2.伪数据生成 源码: app.json {"pages": ["pages/index/index","pages/building/building","pages/room/room","pages/logs/logs&quo…

hot100 -- 矩阵

👂 Peter Pan - kidult. - 单曲 - 网易云音乐 👂 Bibliothque(图书馆) - Jasing Rye - 单曲 - 网易云音乐 目录 🌼前言 🌼二分模板 🎂矩阵置零 AC 标记数组 AC 标记变量 🚩…

REDHAWK——连接

文章目录 前言一、连接过程二、为什么要使用端口三、端口访问四、动态连接五、标准化数据接口六、BulkIO1、流 API①、数据类型②、输出流<1>、创建<2>、修改流元数据<3>、写入<4>、写入复数数据<5>、写缓冲<6>、关闭 ③、输入流<1>…

手机中的8款万能App推荐!

目录 1.全能AI工具箱——HuluAI 2.AI视频生成——巨日禄 3.全能办公套件——鲸鲮Office 4.视频音频转换器——VideotoMP3Converter 5.特效滤镜摄影——PicsArt 6.智能工具箱——SmartTools 7.手机视频编辑软件——KineMaster 8.安卓版万能文档阅读器——AllDocumentRea…

蓝桥杯单片机快速开发笔记——矩阵键盘

一、原理分析 二、思维导图 三、示例框架 定义了四个位控制变量&#xff0c;用于控制键盘扫描时的行列信号。 在Scan_Keys()函数中&#xff0c;首先设置行列信号&#xff0c;将其中一个行信号置为0&#xff0c;另一个行信号置为1&#xff0c;同时将列信号置为1&#xff0c;用于…

Python基础入门 --- 5.函数

文章目录 Python基础入门5.函数5.1 基本定义5.2 传入参数5.3 返回值5.3.1 None类型 5.4 说明文档5.5 嵌套调用 Python基础入门 5.函数 定义&#xff1a;可重复使用&#xff0c;用来实现特定功能的代码段。 # 不使用内置函数len&#xff0c;统计字符串的长度 str "Hell…

AI预测福彩3D第10弹【2024年3月16日预测--第2套算法重新开始计算第2次测试】

今天继续开始咱们第2套算法的验证&#xff0c;计划每套算法连续测试10期&#xff0c;达到50%的命中率即为较优的模型&#xff0c;可继续使用。老规矩&#xff0c;先上图表&#xff0c;再下结论~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月16日福彩3D的七码预测结果如下…

深度学习-基于机器学习的情绪分析研究

概要 互联网技术的迅速发展使得社交平台逐渐成为热点事件中社会情感的枢纽。社会热点事件的舆论监管的其中一个重要环节就是能够准确分析民众的社会情绪。本文旨在探索可以基于文本大数据彻底分析民众对热点事件的社会情绪的模型和方法。先是从社交平台上借助文本大数据、对数据…

SQL-Labs靶场“32-33”关通关教程

君衍. 一、32关 GET单引号闭合宽字节注入1、源码分析2、宽字节注入原理3、联合查询注入4、updatexml报错注入5、floor报错注入 二、33关 GET单引号addslashes逃逸注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程&#xff1a; SQL注入…

【Vite+Ts】自动按需引入Element-Plus

安装插件 cnpm i -D unplugin-vue-components unplugin-auto-import unplugin-element-plus修改vite.config.ts // vite.config.ts import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; impor…

SQLite数据库使用指南以及相关API编程

SQLite介绍 SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎&#xff0c;被嵌入到所有移动设备和大部分计算机中&#xff0c;并且伴随着无数日常使用的应用程序一起提供。SQLite的文件格式具有稳…

html中如何让网页禁用右键禁止查看源代码

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

深入浅出理解 AI 生图模型

引言 众所周知&#xff0c;视频是图片连起来快速播放的&#xff0c;所以Stable Diffusion可能是sora参考的重要模型之一。 随着深度学习和生成模型的发展&#xff0c;扩散模型在生成领域也取得了显著进步。这类扩散模型通常分为扩散过程和逆扩散过程。 扩散过程是对数据&…

SPSS k-均值聚类的 anova分析表解读

from&#xff1a;SPSS K均值聚类&#xff08;k-means&#xff09;和可视化方法 - CollinsLi - 博客园 (cnblogs.com) F值&#xff1a;变量对聚类的贡献 显著性水平&#xff1a;<0.05 则因子显著

整数和浮点数在内存中是如何存储的?

1.整数在内存中的存储 首先数据在内存中都是以二进制的形式存储的&#xff0c;而整数在内存中也是以二进制的形式存储的&#xff0c;而整数的表示形式有三种&#xff0c;分别是源码&#xff0c;反码&#xff0c;补码&#xff0c;而整数在内存中是以补码的形式存放的。 三种表示…

SQLiteC/C++接口详细介绍之sqlite3类(十七)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;十八&#xff09; ​ 53.sqlite3_trace_v2 函数功能&#x…

element-plus怎么修改表单中的label字体颜色及大小

问题描述&#xff1a; 当我们在vue3中使用element-plus组件库提供的表单组件时&#xff0c;有时我们需要修改表单中label的字体颜色等属性&#xff0c;这是如果直接选中label的class进行修改是不起作用的&#xff0c;我们只需深度选择即可选中并进行修改。 比如&#xff1a; …