【JavaEE】——TCP应答报文机制,超时重传机制

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:TCP协议(面试重点重点)

1:报头长度

2:保留位

3:六位标志位

二:TCP传输的可靠性

1:场景引入

2:数据后发先至问题

3:序号解决问题

三:应答报文机制

(1)过程梳理

(2)误区

四:超时重传机制

1:发送方丢包

2:超时重传

(1)重传次数有上限

(2)超时时间动态变化

3:接收方丢包

(1)扣款情景引入

4:数据缓存

(1)数据去重

(2)数据排序


一:TCP协议(面试重点重点)

引入:

8位(bit) = 1 字节(byte),8位就是01010111这样的二进制数字组成

1:报头长度

解释:①看报头部分,不算选项那一行(后面再讲)共计5行每一行32位,换算为4个字节。那总共就是4 * 5 = 20个字节,这20个字节是固定长度(最小长度)

②另一种看法:因为4位首部长度是01这样的二进制数据 即范围为   0101(5)——>1111(15);注意这里4位首部长度的单位是4个字节,不是1个字节。所以报头长度的动态波动长度就为5*4=20,15*4=60。即[20,60]。所以这里多出来的40部分可以理解为,就是为了给选项部分预留的空间。

即:报头长度最低为20字节,此时无选项部分,

2:保留位

像UDP这个协议,受到2个字节的限制,无法扩展,如果扩展就会与其他厂商的机器不兼容,

所以在TCP这里,预防TCP以后进行功能扩展,而保留一部分空间,(留个坑位)

3:六位标志位

可以理解为像UDP中检验和一样,把报头和载荷放到一起进行计算,后续会对里面的内容进行具体解释,后面这个图我们会多次用到

二:TCP传输的可靠性

在过去的学习中我们了解到,TCP传输的特点有:有连接,可靠传输,面向字节流,全双工。

其中最重要的机制就是“可靠传输”,在数据传输过程中,我们无法保证数据100%传达到对端,退而求其次,我们可以确认对端是否受到数据了,这样保住了传输的可靠性

1:场景引入

应答机制这是TCP传输中最核心的机制

试想这样一个情景,我给我的发消息女神表白,并邀请她去爬山

本来女神已经答应做我的女朋友了,但是由于“滚,不行”   这条回复信息  ,后发先至,比“好呀好呀”更快一步到达我这一端,导致我以为女神拒绝我了~~~这是一个悲伤的故事

2:数据后发先至问题

为什么会出现信息后发先至这种情况呢?

我们知道,广域网之间是由很多路由器和交换机连接的,那么数据在进行传输的时候就有很多路径可以选择,倘若先发出去的数据包①遭遇线路阻塞,那么很可能后发的数据包②会比①还要先到达另一端。

3:序号解决问题

我们通过加入序号这一形式,来确认应答的哪一条数据,这里的模型只是简化了一下,实际TCP序号和确认序号都是以字节来进行编号的,要复杂的多

假如载荷中有1000个字节那么每一个字节都会有一个相应的序号。由于这个序号是连续的,我们只要确定头序号,后面的字节通过计算就可以很容易拿到了

三:应答报文机制

数据发送出去了,那么以怎样的形式,告知发送方“哦,我收到了”~

注:应答报文——也叫ask报文(asknowledge缩写),通过应答报文来反馈给发送方,当前的数据收到了。

(1)过程梳理

A发送1-1000这个数据,主机B如果收到了,就会反馈一个“应答报文”——应答报文的序号是收到的数据的最后一个字节的序号+1。即从1001开始

注:这里的1001有两层含义

①告诉主机A:序号<1001的数据我都收到了

②主句A你下次应该给我发1001开始的数据了

(2)误区

确认应答机制是TCP“可靠性传输”的核心机制,并非是只要有确认应答机制就可以保证TCP可靠传输。

TCP的可靠传输是因为“进行了三次握手”这一说法是错误的(后续我们会详细解释)

四:超时重传机制

超时重传机制是确认应答的补充

1:发送方丢包

上文有说到,设备间进行通讯的时候需要经过,像路由器和交换机这种中间站,进行转发,我们知道路由器和交换机能处理转发的数据是由上限的,如果超过了负载上限,这个数据报包就会被丢弃 ,这就是我们说的“丢包”现象

2:超时重传

发送方发送完数据后,会等待接收方返回应答报文(不是无限制的等待~),迟迟等不到(超时)ask应答报文,发送方就会认为,这次发送的数据报包丢失了没有到达接收方,那么就会重新在发送一遍。

注:这里的重传次数也是有策略的

(1)重传次数有上限

假设数据传输到接收方的概率是90%,那么发送方发送两次数据发生丢包的概率就是10%*10%=1%。这种情况,此时就很可能不是丢包的问题了,可能是设备的问题,此时设备间就会重新连接,连接失败,就放弃连接了

(2)超时时间动态变化

超时时间会随着重传次数的增加而增大,(因为经历重传之后还丢包的话,大概率是网络的原因,在咋传也是白费力气,不如少传几次,节省力气资源)

3:接收方丢包

上述,我们得到一个结论(有问题):如果发送方(主机A)没有收到ask,那么就认为发送的数据丢包了

这里其实还有一些问题——到底是“发送的数据丢了,还是返回的ask丢了”。从发送方的角度是没有办法区分的。

(1)扣款情景引入

如果是主机A发送扣款数据,主机B完成扣款,并发送ask报文,但是ask丢失了,此时主机A迟迟收不到ask报文(超时重传),A再次发送扣款数据,完蛋了~,扣了两次款。

4:数据缓存

通过之前的socket的学习,我们知道socket在内存当中有一块缓存区(用flush冲刷解决问题那一篇文章)

对于接收到的数据都是先暂时放到缓存区中,攒一波,然后调用read或者scanner.next进行读取操作,这里读的就是接受缓存区中的内容。

这里的应答过程中,也有读取数据这一操作,这里的缓冲区主要有两个作用

(1)数据去重

当数据到达接受方的时候,接收方会先判断一下,缓冲区中是否已经有或者有过这个数据,如果yes,那么就把这个重复发来的数据就丢弃,确保应用程序不会出现重复的数据。

(2)数据排序

对接受的数据按照序号进行排序,保证应用程序中读到的数据顺序跟发送过来的数据顺序是一致的。

注:应用程序读的时候也是按照序号的先后顺序连续读取,可以想象成一个阻塞队列。

实现以上两个作用的核心是:数据有序号

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

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

相关文章

今年双十一可以买啥?2024双十一不用做功课闭眼入的品牌好物分享!

今年的双十一购物狂欢节即将来临&#xff0c;许多消费者已经开始规划他们的购物清单&#xff0c;期待在这个一年一度的促销盛会上抢购到心仪的商品。2024年的双十一&#xff0c;你无需再做繁琐的功课&#xff0c;因为这里将为你分享一些闭眼入的品牌好物&#xff0c;让你轻松享…

unity Gpu优化

不一样的视角&#xff0c;深度解读unity性能优化。unity性能优化&#xff0c;unity内存优化&#xff0c;cpu优化&#xff0c;gpu优化&#xff0c;资源优化&#xff0c;资源包、资源去重优化&#xff0c;ugui优化。 gpu优化静态批处理静态批处理原理规则静态合批的原理静态合批的…

【Sceneform-EQR】(手势优化)通过手势事件实现在AR/VR等三维场景中的控制模型旋转、平移与缩放

在上一篇文档中&#xff0c;我们实现了通过手势控制模型节点的旋转、缩放和平移。现在本文将介绍如何优化上一篇做的手势控制器&#xff0c;从而实现更好的跟手效果。 相关链接&#xff1a;【Sceneform-EQR】&#xff08;手势控制器实现&#xff09;通过手势事件实现在AR/VR等…

网络安全中的RCE命令执行漏洞----入门小白必看

RCE命令执行&代码执行漏洞 RCE命令执行漏洞 RCE漏洞简介 RCE(remote code/command execute) 远程代码/命令执行漏洞 RCE漏洞是两个漏洞&#xff1a; 代码执行漏洞 # 针对后端语言!命令执行漏洞 # 针对系统! 如何产生 在 Web应用中有时候程序员为了考虑灵活性、简洁性…

【SEO】什么是SEO?

什么是SEO&#xff08;搜索引擎优化&#xff09;&#xff1f;为什么SEO对于⼀个⽹站⾄关重要&#xff1f; SEO 全称是搜索引擎优化&#xff08;Search Engine Optimization&#xff09; 因为我们目前开发的网址&#xff0c;需要人看到&#xff0c;除了通过宣传营销的方式展现…

前端布局与响应式设计综合指南(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:前端布局与响应式设计综合指南(二) 目录 23、行内元素和块级元素&#xff1f;img算什么&…

影刀RPA实战:操作Mysql数据库

1.摘要 影刀RPA&#xff08;Robotic Process Automation&#xff09;是一种软件自动化工具&#xff0c;它可以模拟人类用户执行各种重复性任务&#xff0c;其中包括对数据库的操作。 我们可以使用软件自动化指令&#xff0c;通过获取数据库窗口对象来操作数据库&#xff0c;也…

《探秘数据合规官CCRC-DCO人员能力验证》

在当今竞争激烈的商业世界中&#xff0c;“数据合规官CCRC-DCO人员能力验证”这个词逐渐走入人们的视野。但究竟什么是数据合规官CCRC-DCO人员能力验证呢&#xff1f; 首先&#xff0c;咱们来明确一下概念。数据合规官CCRC-DCO人员能力验证&#xff0c;简单来说&#xff0c;就…

数仓范式建模和维度建模有什么不同?

在数据库设计的复杂世界中&#xff0c;还有一类建模方法&#xff0c;为范式建模&#xff0c;是一种旨在优化数据库结构、提高数据一致性和完整性的设计方法。本文将深入探讨范式建模的概念、原理、步骤以及与维度建模的区别。 一、什么是范式建模&#xff1f; 范式建模是一种…

Chromium 中window.DOMParser接口说明c++

一、DOMParser DOMParser 可以将存储在字符串中的 XML 或 HTML 源代码解析为一个 DOM Document。 备注&#xff1a; XMLHttpRequest 支持从 URL 可寻址资源解析 XML 和 HTML&#xff0c;在其response 属性中返回Document。 你可以使用XMLSerializer 接口执行相反的操作 - 将…

接口测试自动化后起之秀-YApi接口管理平台

前言 众多接口管理工具如雨后春笋&#xff0c;让人欣慰的是&#xff0c;有许多优秀作品来自国内&#xff0c;包含Yapi和rap&#xff0c;看着中文的官网&#xff0c;华丽的汉语&#xff0c;不禁让人大快朵颐&#xff0c;暗自称爽。当然这也就带来另一个弊端&#xff0c;使用基数…

nodejs的卸载和nvm安装

由于项目需求&#xff0c;需要多版本控制的nodejs&#xff0c;所以要把原来的nodejs卸载干净&#xff0c;然后再装nvm 常见问题 1.在安装nvm的时候没有卸载node&#xff0c;导致使用nvm安装完之后&#xff0c;node和npm都不可用。 2.在第一次使用nvm安装node后&#xff0c;要…

从零开始使用最新版Paddle【PaddleOCR系列】——第二部分:自建数据集 + 模型微调训练

目录 一、自建数据集 1.官方数据集格式参考 2.自建数据集txt文件编写代码 3.数据集检验 二、模型训练 1.模型配置yaml文件 2.命令行指令训练 在上一篇文章中&#xff0c;构建好了paddleOCR 运行必需的环境&#xff0c;并通过在线下载的方式&#xff0c;使用官方训练好的模型进…

深入理解 JDK 的 Optional 类

深入理解 JDK 的 Optional 类 深入理解 JDK 的 Optional 类1. 什么是 Optional&#xff1f;1.1 主要构造方法示例 2. Optional 的常用方法2.1 判断值是否存在示例2.2 获取值示例2.3 进行操作示例 3. 使用场景3.1 避免 null 值示例3.2 提高代码可读性3.3 与流结合示例 4. 注意事…

中航资本:股市融资50万一天的利息是多少?融资一般多久归还?

融资官方利率是8.35%&#xff0c;实际上大部分券商融资利息在6%~8%左右&#xff0c;详细利率因券商及投资者状况而异。少部分券商可提供低至5%&#xff0c;乃至更低的优惠利率。 该利息按天然日核算&#xff0c;融资利息融资金额融资年利率实际使用资金的天然日天数/360。 假…

基于深度学习的细粒度图像分析综述【翻译】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 基础信息0 摘要1 INTRODUCTION2 识别与检索 RECOGNITION VS. RETRIEVAL3 问题和…

React01 开发环境搭建

React 开发环境搭建 一、创建 React 项目二、项目精简 一、创建 React 项目 执行下述命令创建 react 项目 blu-react-basis npx create-react-app blu-react-basis项目目录结构如下&#xff1a; 执行下述命令启动项目 npm run start启动效果如下&#xff1a; 二、项目精简 …

Vue.js 错误异常: Component template should contain exactly one root element.

一、错误异常&#xff1a; Errors compiling template: Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead. 二、原因 组件模板应该只包含一个根元素 查看vue代码&#xff0c;发…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了多种人脸检测方法&#xff0c;以下是对OpenCV人脸检测的详细介绍&#xff1a; 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

【C语言】数据输出格式控制

数据的输出格式修饰 常用两种&#xff1a; 整型中&#xff0c;输出数据左对齐、右对齐、占m位、不足m位前补0。浮点型中&#xff0c;默认通过四舍五入保留小数点后6位&#xff0c;通过参数设置保留小数点后n位。 #include <stdio.h> #define PI 3.14159 /* 功能&#x…