【网络原理】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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拜占庭将军问题相关问题

1、拜占庭将军问题基本描述 问题 当我们讨论区块链共识时,为什么会讨论拜占庭将军问题? 区块链网络的本质是一个分布式系统,在存在恶意节点的情况下,希望 整个系统当中的善良节点能够对于重要的信息达成一致,这个机…

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码 上机代码: # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

第十三篇:复习Java面向对象

文章目录 一、面向对象的概念二、类和对象1. 如何定义/使用类2. 定义类的补充注意事项 三、面向对象三大特征1. 封装2. 继承2.1 例子2.2 继承类型2.3 继承的特性2.4 继承中的关键字2.4.1 extend2.4.2 implements2.4.3 super/this2.4.4 final 3. 多态4. 抽象类4.1 抽象类4.2 抽象…

微信小程序关闭首页广告

由于之前微信小程序默认开启了首页广告位。导致很多老人误入广告页的内容,所以想着怎么屏蔽广告。好家伙,搜索一圈,要么是用户版本的屏蔽广告,或者是以下一个模棱两可的答案,要开发者设置一下什么参数的,如…

ZK vs FHE

1. 引言 近期ZAMA获得7300万美金的投资,使得FHE获得更多关注。FHE仍处于萌芽阶段,是未来隐私游戏规则的改变者。FHE需与ZK和MPC一起结合,以发挥最大效用。如: Threshold FHE:将FHE与MPC结合,实现信任最小…

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单,但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始,ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…

Python基础(七)之数值类型集合

Python基础(七)之数值类型集合 1、简介 集合,英文set。 集合(set)是由一个或多个元素组成,是一个无序且不可重复的序列。 集合(set)只存储不可变的数据类型,如Number、…

高德 Android 地图SDK 去除logo

问题 高德 Android 地图SDK 去除logo 详细问题 笔者进行Android 项目开发,接入高德地图SDK。但是默认在地图左下角有高德地图logo,现需要去除该logo 期望效果 解决方案 import com.amap.api.maps.UiSettings; UiSettings settingsmMapView.getMap(…

CSS-DAY3

CSS-DAY3 2024/2/7 盒子模型 页面布局要学习三大核心, 盒子模型, 浮动 和 定位. 学习好盒子模型能非常好的帮助我们布局页面 1.1 看透网页布局的本质 网页布局过程: 先准备好相关的网页元素,网页元素基本都是盒子 Box 。利用 CSS 设置好盒子样式&a…

c++之旅第七弹——继承

大家好啊,这里是c之旅第七弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一.继承和派生…

夜间8点到12点能干点啥副业?

们放松和追求个人兴趣的时候,也是一段时间可以用来开展副业的机会。以下是一些适合晚上从事的副业的建议。 1.【千金宝库】软件做任务赚钱 【千金宝库】任务平台是为那些没有资源和人脉的人准备的。它非常适合那些没有时间限制、没有门槛的学生,平时玩…

以太网传输图片工程出现的问题总结(含源码)

本文对以太网传输图片的工程曾经出现过的问题及解决思路进行整理,便于日后出现类似问题能够快速处理。也指出为什么前文在FIFO IP设计时为啥强调深度的重要性。 1、问题 当工程综合完毕之后,下载到板子,连接以太网口,相关硬件如下…

0G联合创始人MICHAEL HEINRICH确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的不断发展和应用,全球开发者瞩目的Hack.Summit() 2024区块链开发者大会即将于2024年4月9日至10日在香港数码港盛大举行。此次大会由Hack VC主办,并得到AltLayer和Berachain的协办,同时汇聚了Solana、The Graph、Blockchain Ac…

Vue | 使用 ECharts 绘制折线图

目录 一、安装和引入 ECharts 二、使用 ECharts 2.1 新增 div 盒子 2.2 编写画图函数 2.3 完整代码结构 三、各种小问题 3.1 函数调用问题 3.2 数据格式问题 3.3 坐标轴标签问题 3.4 间隔显示标签 参考博客:Vue —— ECharts实现折线图 本文是在上…

jvm 内存泄露、内存溢出、栈溢出区别

JVM(Java虚拟机)是负责执行Java程序的运行环境。以下是对内存泄露、内存溢出和栈溢出这几个概念的解释: 内存泄露(Memory Leak): 内存泄露指的是程序中分配的内存空间在不再被使用时没有被释放的情况。这可…

【DFS深度优先搜索专题】【蓝桥杯备考训练】:迷宫、奶牛选美、树的重心、大臣的旅费、扫雷【已更新完成】

目录 1、迷宫(《信息学奥赛一本通》) 2、奶牛选美(USACO 2011 November Contest Bronze Division) 3、树的重心(模板) 4、大臣的旅费(第四届蓝桥杯省赛Java & C A组) 5、扫…

git的下载与安装

下载 首先,打开您的浏览器,并输入Git的官方网站地址 点击图标进行下载 下载页面会列出不同操作系统和平台的Git安装包。根据您的操作系统(Windows、macOS、Linux等)和位数(32位或64位),选择适…

面试经典-33-反转链表 II

题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a…

【渗透测试】redis漏洞利用

redis安装及配置 wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make cp /root/redis-6.2.6/redis.conf /usr/local/redis/bin/ cd /usr/local/redis/bin/ vi redis.conf #修改内容如下&#xff1a; #protected-mode …

【消息队列开发】 实现MemoryDataCenter类——管理内存数据

文章目录 &#x1f343;前言&#x1f334;数据格式的准备&#x1f332;内存操作&#x1f6a9;对于交换机&#x1f6a9;对于队列&#x1f6a9;对于绑定&#x1f6a9;对于单个消息&#x1f6a9;对于队列与消息链表&#x1f6a9;对于未确认消息&#x1f6a9;从硬盘上读取数据 ⭕总…