Java【TCP 协议2】好多人都错了! 保证可靠传输的不是三次握手和四次挥手! 而是...

news2024/11/25 12:01:21

文章目录

  • 前言
  • 一、确认应答
    • 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 用来提高效率

上篇文章介绍了连接管理机制(三次握手四次挥手)

很多人都误以为连接管理机制也是用来保证可靠性的, 其实并不是

UDP 协议是无连接传输, 因此使用 UDP 协议协议传输数据, 发送方甚至不关心对端是否能接收, 不做任何检查就一股脑发出去了, 而 TCP 则不然, TCP 实现了在通信之前先建立连接, 通信完了再断开连接, 所以连接管理机制仅仅是通信前的"检查"

本篇就来介绍 TCP 保证可靠性的确认应答机制和超时重传机制


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

一、确认应答

之前的文章就提到过, 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/552145.html

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

相关文章

蓝牙RFCOMM 协议

蓝牙RFCOMM 1.RFCOMM1.1 服务定义模型1.2 字节排序 2 RFCOMM数据帧2.1 选项和模式2.2 帧类型2.3 帧格式2.3.1 Address2.3.2 Control(帧类型)2.3.3 Length2.3.4 InfoData2.3.5 FCS 2.4 多路复用控制命令(DLCI 0)2.4.1 DLC paramete…

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作 import cv2 as cv import numpy as np一、颜色空间转换 1、转换颜色空间 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。 我们…

《面试1v1》volatile

基本功 我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你能解释一下 volatile 关键字的作用吗? 候选人: 当我们在编写多线程程序时,经常会遇到线程安全的问…

iptables防火墙(一)

iptables防火墙 一、iptables概述1、netfilter 与 iptables 的关系1.netfilter2.iptables 2、四表五链1.四表2.五链3.表的匹配优先级4.规则链之间的匹配顺序5.规则链内的匹配顺序 二、iptables防火墙的安装及配置方法1、iptables防火墙安装2、iptables防火墙的配置方法1.iptabl…

nginx(七十八)日志的深入探究

一 日志 ① nginx与日志相关的指令 access_log log_format error_log rewrite_log log_subrequest debug_connection rewrite_log limit_conn_log_level limit_req_log_level log_not_found open_log_file_cache uninitialized_variable_warn log_not_found …

【重新定义matlab强大系列八】利用matlab求局部值(函数islocalmax求局部最大值+函数islocalmin求局部最小值)

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

三控开关接线方式记录

参考原视频 三控开关与双控开关的多种接法,多控开关的工作原理_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Qh4y1J7gC/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e原视频讲的不错,大家可以关…

国内好用的免费AI处理工具:Chat8(实现类似ChatGPT功能、TCP/IP通讯问题)

目前国外的ChatGPT比较火,朋友推荐了一个chat8,经过使用,觉得还不错,链接如下: https://ai.chat86.co/go/kl/775283,进去后可以直接用手机注册使用,以下是我问其关于TCP/IP的对话过程&#xff0…

(转载)从0开始学matlab(第11天)—关系运算符和逻辑运算符

选择结构的运算由一个表达式控制的,这个表达式的结果只有 true(1) 和 false(0)。有两种形式的运算符可以在 MATLAB 中关系得到 true/false:关系运算符和逻辑运算符。跟 C 语言一样, MATLAB 没有布尔型和逻辑数据类型。 MATLAB 把 0 …

模块一:k8s集群部署与安全配置

模块一:k8s集群部署与安全配置 目录 1、K8s安全运维概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PST6trat-1684674016197)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/1665822875941-73d822c8-7bdd-481c-acc1-df97b70c…

python爬虫实战——小说爬取

python爬虫实战——小说爬取 基于requests库和lxml库编写的爬虫,目标小说网站域名http://www.365kk.cc/,类似的小说网站殊途同归,均可采用本文方法爬取。 目标网站:传送门 本文的目标书籍:《我的师兄实在太稳健了》…

软件设计师第4题

首先,我是备考2023年上半年的考试。 一、历年考试题 历年的考题如下,从表中分析可以看出,动态规划法、排序算法、回溯法、分治法是很大概率考察的算法,尤其是动态规划法,本身其理解难度较高,且可以出的题型…

docker:容器的数据卷

1 数据卷概念及作用 1.1 什么是容器数据卷 先来看看Docker的理念: 将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过…

什么是人工智能的知识图谱?知识图谱的组成、构建、应用有哪些?

人工智能(Artificial Intelligence,AI)是一种通过计算机模拟人类智能的技术,其应用范围越来越广泛。知识图谱(Knowledge Graph,KG)则是人工智能技术中的重要组成部分,它是一种结构化…

Redis集群安装之主从集群

1.主从集群 Redis有三种集群模式,分别是:主从模式、哨兵模式、Cluster模式。Rdis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和s…

TCP实现HTTP服务

在之前的篇章中我们已经讲过七层参考模型了,今天我们从传输层实现应用层http服务 使用nodejs原生net模块就可以打通TCP传输层并且提供一个端口号进行监听 创建一个TCP服务 import net from netconst server net.createServer((socket) > {socket.on(data, (da…

【路径规划】基于人工蜂群算法的栅格法路径规划 机器人路径规划【Matlab代码#23】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 原始ABC算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节:资源获取】 1. 原…

【实时性】实时性优化的一些参数设置和心得

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Deformable DETR 论文学习

1. 解决了什么问题? DETR 去除了目标检测算法中的人为设计,取得了不错的表现。但是其收敛速度很慢,对低分辨率特征识别效果差: 模型初始化时,注意力模块给特征图上所有的像素点分配的权重是均匀的,就需要…

chatgpt赋能Python-python5的阶乘

Python5的阶乘介绍 Python是一门广泛应用于编写脚本、自动化、爬虫、数据分析等方面的编程语言,也是很多科研领域使用的首选。Python的功能和灵活性可以帮助用户解决各种问题,而本文要介绍的是Python中计算阶乘的方法。 阶乘是数学中的一个概念&#x…