Java【TCP 协议2】确认应答、超时重传机制

news2025/1/17 1:03:13

文章目录

  • 前言
  • 一、确认应答
    • 1, 什么是确认应答
    • 2, 序列号和确认应答号
  • 二、超时重传
    • 1, 什么是超时重传
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

TCP 协议是一种有链接的可靠传输协议, 并且 TCP 设计的宗旨是保证可靠性的同时, 尽可能地提高传输效率, 因此 TCP 具有八大机制 :

  • 1️⃣连接管理(三次握手 + 四次挥手)
  • 2️⃣确认应答
  • 3️⃣超时重传
  • 4️⃣滑动窗口
  • 5️⃣流量控制
  • 6️⃣拥塞控制
  • 7️⃣延迟应答
  • 8️⃣捎带应答

在这里插入图片描述

看不懂吧, 没关系, 我会出手, 先记住2~3 用来保证可靠性, 4~8 用来提高效率

上篇文章介绍了连接管理机制(三次握手四次挥手), 本篇主要介绍保证可靠性的确认应答机制和超时重传机制


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、确认应答

之前的文章就提到过, TCP协议的可靠性不是说确保每次发送数据都能 100% 能成功, 而是如果发送失败, 发送方会知道自己发送失败

如何做到呢? 正是因为有确认应答机制


1, 什么是确认应答

是指 : 如果接收方收到了数据报, 由操作系统内核来返回一个 ack (确认应答报文)

确认应答最明显的作用就是 : >如果发送方收到了 ack, 视为数据发送成功, 如果没有收到 ack, 就视为数据发送失败

确认应答机制有三种情况, 如图 :
在这里插入图片描述
第一次发送数据, 发送方收到了 ack, 视为发送成功
第二次发送数据, 数据报半路丢了, 接收方当然不会返回 ack, 发送方没有收到 ack, 视为发送失败
第三次发送数据, 接收方确实收到了数据报, 但是 ack 半路丢了, 发送方没有收到 ack , 也视为发送失败

ack 也是数据报, 数据报半路丢了的情况, 称作"丢包"


2, 序列号和确认应答号

实际上, TCP 的报头格式中包含两个字段 : (发送方的)序列号 (接收方的)确认应答号

序列号是指 : 给发送的数据的每一个字节标号, 第一个字节就是该数据报的序列号
确认应答号是指 : 接收方已经收到的序列号 + 1, 来表示下次应该收到的序列号
在这里插入图片描述
上图中第一个数据报发送之后, 接收端已经收到了序列号为1000之前的所有数据, 返回 ack 中的确认应答序号为 1001 的意思就是"我该接收序列号为 1001 "的数据了

TCP数据报的实际长度可能并不是1000字节, 并且序列号的初始值是一个随机数

序列号和确认应答号最明显的作用就是, 让发送方知道接收方已经收到了哪些数据, 还有其他作用, 后续介绍其他机制时慢慢补充


二、超时重传

如果网络通畅, 一切顺利的话, 通过确认应答就能很好的保证并确认数据成功发送, 但是难免会有网络拥堵或其他原因导致丢包

可能是发送的数据丢包, 也可能是 ack 丢包, 无论那种情况, 发送方都不能及时地收到 ack , 所以视为发送失败, 这种情况下为了保证可靠性, 超时重传机制就做出了补救


1, 什么是超时重传

是指 : 一定时间内, 发送方没有收到接收方返回的 ack , 就尝试再次发送数据

也就是说, 发送方发完数据之后会等 ack , 等一会之后没等到, 就重发. 当然重发的数据也有可能再次丢包导致没收到 ack , 那就多等一会, 总之, 每次重发都会指数形式延长等待时间

难道要一直重发吗? 发送方重发多次还收不到 ack, 基本上是网络或者对端主机有异常, 发送端会主动断开连接

名言 : 难办? 那就**别办了!

超时重传不成功的情况 :
在这里插入图片描述
每次等待的时间都会以指数形式增长, 包括最后主动断开连接, 这都在一定程度上避免了网络流量浪费

超时重传成功的情况 :
在这里插入图片描述

所以, 如果是网络或者对端主机没问题, 偶尔一次小概率的丢包, 通过超时重传就可以保证可靠传输

需要注意的是, 上图中虽然由于超时重传机制成功发送了数据, 但是接收方收到了两份序列号为 1 的数据报, 难道接收方的应用程序会读取两次吗?

并不会, 因为接收方的接收缓冲区会根据序列号进行去重, 保证同一份数据只读取一次, 上述过程其实也有"序列号和确认应答号"的作用


总结

以上就是本篇的全部内容, 主要介绍了确认应答机制和超时重传机制, 这两个机制保证了TCP协议传输时的可靠性

策略是 : 如果一切正常, 通过确认应答机制保证接收方收到了数据, 如果丢包, 通过超时重传及时补救

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

python基础(循环语句 while循环、break、continue,字符格式化,运算符)

1. while循环 【1】语法: while 条件:.........举例: print("123") while 条件:......... print(456)【2】循环语句的基本使用 示例1: print("开始") while True:print("hello world") print("结束&…

约瑟夫问题的环形链表实现[Java]

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁…

(全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp

文章目录 前言一、Cryptopp是什么?1. Cryptopp(CRYPTO)官方文档wiki 二、下载Cryptopp2. Crypto下载地址3. 下载PEM包 三、在VS2022中使用Cryptopp库4. 处理crypto源文件5. 在VS2022项目中使用crypto库 四、运行代码后一些关于c的错误总结 前…

单片机--中断实验练习

【1】实验要求: STM32上电LED(PB0)灯亮 ,当检测到按键(PA8)按下时处理中断事件,变量i 扩展:知识点 响应优先级->在两个中断同时触发时,且这两个中断的优先级相同&a…

SpringBootWeb入门

1. SpringBootWeb快速入门 1.1 需求 需求:基于SpringBoot的方式开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串 “Hello World ~”。 1.2 开发步骤 第1步:创建SpringBoot工程项目 第2步:定义HelloCon…

chatgpt赋能Python-python_docx_目录

简介 Python是一种非常优秀的编程语言,主要用于数据分析、机器学习、人工智能等领域。在这些领域中,常常需要使用文档处理相关的工具,例如Microsoft Word。在使用Python编程的过程中,文档处理是非常常见的操作,因此Py…

AC规则-1

本文主要参考规范 GPD_Secure Element Access Control_vxxx.pdf OMA 架构 基本定义 GP(GlobalPlatform)定义了一套允许各应用提供方独立且安全地管理其在SE上的应用的安全框架,而AC(Access Control),顾名思义,是对外部应用进行SE上应用访问…

pyinstaller 打包 ! pyinstaller 打包路径问题!wordcloud打包缺失stopwords文件

wordcloud打包缺失stopwords文件 错误描述 Unhandled exception in script Failed to execute scriptmain due to unhandled exception: (Errno 2] No such file or directory: C:\Users\VADMINI\appDatallLocal\Templ\2\ME186322\wordcloud\stopwords解决办法 找到安装word…

实验室基础操作

一:FZmotion。 1:查看相机是否加入成功。 2:添加蒙版。 3:选择标定杆类型。500mm 4:标定。 5:数据传输。 二:MotionBuilder。 1:所使用插件。 2:fzmotion插件安装。 Mo…

chatgpt赋能Python-python_errno22

Python的errno22错误——引起问题的原因及解决方法 如果你使用过Python编程语言进行过开发,你可能会像其他开发者一样遭遇过errno22错误。这种错误通常会导致程序崩溃或者无法正常运行。在这篇文章里,我们将深入了解errno22错误的原因,并提供…

【数据结构】C--顺序表1.0版本(本文非常适合小白观看,已尽力详解,以及图解也是尽量列举)

目录 0.前言 什么是数据结构? 1.逻辑结构: 1.1线性结构: 1.2非线性结构: (1)集合 (2)树形结构 (3)图形结构或者网状结构 2.存储结构 一.线性表 二.顺序表 顺序表与数组的关系:(非常容易混淆) 1.静态顺序表:使用定长数组存储元素 2.动态顺序表…

MySQL中auto_increment有什么作用?(IT枫斗者)

MySQL中auto_increment有什么作用? 问题来源 很多时候,MySQL语句中会出现【auto_increment】这个词汇,大多数时候,表都是自动生成的,刚开始学习MySQL数据库时会学习到,后来,渐渐地可能会忘记&…

Windows安装VirtualBox教程(图文版)

VirtualBox是一款免费的虚拟化软件,可以在一台计算机上运行多个操作系统。它可以在Windows、Linux、Mac OS X和Solaris等操作系统上运行。VirtualBox支持多种虚拟硬件设备,包括网络适配器、USB控制器、显卡等。用户可以通过VirtualBox创建一个虚拟的计算…

同个前端页面,在手机端和PC端打开,访问到的资源有可能不是同一个

记录项目遇到的问题,问题表现为: 1、用手机端和PC端打开同一个前端页面,通讯到达的后端服务却不是同一个 排查: 1、确认手机端和PC端打开后,实际访问的前端资源并不是同一个 2、手机端配置的socket端口有误&#x…

图片模块封装:Glide高级使用+使用设计模式图片框架封装+Bitmap尺寸压缩和质量压缩+Bitmap加载大图长图

图片模块封装:Glide高级使用使用设计模式图片封装Bitmap尺寸压缩和质量压缩Bitmap加载大图长图 一.如何更换图片框架二.Glide配置1.依赖:2.缓存配置:3.网络配置:glide默认使用httpUrlConnection完成网络请求,可以改成o…

Python学习笔记——《吴恩达Machine Learning》逻辑回归例程

文章目录 逻辑回归和线性回归的区别?正则化逻辑回归逻辑回归中的梯度下降: 模型预测案例解决二分类问题:不同的 λ \lambda λ会产生不同的分类结果: 逻辑回归和线性回归的区别? 逻辑回归可以理解为线性回归的一个plus版&#xf…

架构-软件工程模块-3

系统测试 #mermaid-svg-cpVF4noxB0estLWd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cpVF4noxB0estLWd .error-icon{fill:#552222;}#mermaid-svg-cpVF4noxB0estLWd .error-text{fill:#552222;stroke:#552222;}#…

【Python】判断语句 ③ ( if elif else 语句 | 语法简介 | 代码示例 )

文章目录 一、 if elif else 语句语法二、 代码示例 一、 if elif else 语句语法 在开发场景中 , 经常用到 多条件判定 , 初次判定 , 先进行 条件 1 判定 , 如果 条件 1 满足 则执行 条件 1 对应动作 , 如果 条件 1 不满足 , 则 判定 条件 2 是否满足 , 如果 条件 2 满足 则 …

linux操作系统【进阶完整版】

文章目录 基础命令tailvimsystemctl 用户和组/权限su/sudo创建删除ls -lchmodchown 实用操作快捷键软件安装软链接时区与时间date修改时区 ip、主机名网络传输请求端口 进程管理主机状态监控系统资源占用磁盘信息监控网络状态监控 环境变量上传和下载压缩和解压tarzip/unzip 安…

一、尚医通上传医院接口

文章目录 一、上传医院接口1、集成mongodb1.1添加依赖1.2添加配置 2、添加医院基础类2.1 添加model2.2 添加Repository2.3 添加service接口及实现类2.4 添加controller 3、上传医院3.1 接口数据分析3.2 添加service接口3.3 添加repository接口3.4 添加controller接口3.5 添加帮…