【网络原理】TCP协议如何实现可靠传输(确认应答和超时重传机制)

目录
一. TCP协议
二. 确定应答
三. 超时重传
一. TCP协议

1)端口号
- 源端口号:发送方端口号
- 目的端口号:接收方端口号
- 16位(2字节)端口号,可以表示的范围(0~65535)
源端口和目的端口:表示数据从哪个进程来,到哪个进程去
2)序号/确认序号
- TCP将每个字节的数据都进行了编号即为序列号。
- 序号:标识数据包中第一个字节的序号,用于数据排序和可靠传输。
- 确认序号:接收方期望收到的下一个字节的序号
3)首部长度
- 这里的首部长度指的是报头长度
- TCP报头中前20个字节(无选项部分)是固定长度,这里的选项部分可有可无
- 这里的单位是4个字节,可以表示的大小是60个字节(4*15)
4)保留位
- 在学习UDP协议的时候,UDP的长度受限于2个字节,如果想要进行扩展,就只能改变报头结构,但是改变结构,就会出现不兼容问题
- TCP这里使用保留位的机制(占位行为,我现在用不到,不代表我以后用不到),如果后面需要扩展,只需要修改保留位就可以实现
5)窗口大小
- 接收方告诉发送方当前可接收的数据量(单位:字节),用于流量控制。
- 窗口大小的调整是动态的
6)校验和
- 校验TCP报头和数据部分的完整性,检测传输错误。
- 和UDP相同,使用算法,通过对比数据来进行检验
7)紧急指针
- 仅在URG=1时有效,指示紧急数据的末尾位置
8)选项
- 可选的TCP头部选项,用于扩展TCP功能。
9)标志位
TCP最核心的部件
- URG(Urgent):表示是否包含紧急数据。
- ACK(Acknowledgment):表示确认号是否有效。
- PSH(Push):表示是否立即推送。
- RST(Reset):表示连接是否复位。携带RST标识的称为复位报文段。
- SYN(Synchronize):表示同步请求/应答。携带SYN标识的称为同步报文段
- FIN(Finish):表示传输结束。携带FIN标识的为结束报文段。
- TCP的6位标志位默认为0,当返回相应的报文时,会把该报文位设置位1。
二. 确定应答
确认应答
TCP用于保证可靠性,最核心的机制——确认应答
在网络通信过程中,谁也无法100%保证,接收方一定可以收到数据
这里的可靠性,是指发送方可以知道接收方有没有收到数据

如何判断发送成功?
- 发送方发送数据,如果接收方收到数据,就会返回一个应答消息
- 发送方收到了应答消息,则表示数据发送成功
如果发送方一次性发送多条数据,则很有可能会出现后发先至的情况
后发先至

上述就是一个后发先至的情况,先发送的数据最后达到,这样会导致理解发生变化
为什么会出现后发先至的情况?

- 在网络传输中,大部分都是依靠多个路由器/交换机进行转发信号,很少通过一根网线进行通信
- 在中间的网络传输中,从发送方到接收方传输的过程中,走的路径可能不同
- 有点路径畅通,有的路径某一时刻传输数据多,造成堵塞情况(堵车),最终导致数据到达的时间有差异
通过引入序号和确认序号,解决后发先至的问题,
引入序号

- 就是通过引入序号,可以明确数据收到的顺序
- 接收方和发送方都希望读取的数据顺序正确,顺序发生错误对逻辑处理会产生影响
TCP传输数据不是一条一条传输的,TCP传输的单位是字节,TCP的序号和确认序位都是字节

- 发送方的报头中的序号是起始序号,告诉接收方这段数据是从哪里开始的
- 载荷中的单位也是字节,每一个字节对应一个序号,载荷中的字节是连续的
确认报文 (ACK)
应答报文:只有报头,没有载荷

- 接收方每次收到数据都会返回一个应答报文,在应答报文中,使用确认序号返回一个字节
- 确认序号:接收到的最后一个字节数加1
如何区分应答报文?
- 看标志位
- ACK 为 0 表示不是应答报文
- ACK 为 1 表示是应答报文
确认序号含义:1.这个序号之前的字节都收到了,2.接下来从这个序号开始发送数据

- 在接收方这里存在一个缓冲区(类似优先级队列),以序号为优先级参考依据
- 引入这样的机制,可以保证接收的数据都是有序的
三. 超时重传
在传输的过程中,可能会发生数据丢失现象,这里分为两种发送数据丢失和ACK丢失
- 如果发送数据丢失,接收方没有收到,肯定不会返回ack报文
- 如果接收方收到数据,但是返回的ack报文丢失
为什么会发生丢包?

在网络传输的过程中,某个路由器/交换机,突然负载量很高,短时间处理大量数据,超过了负荷,那么多余的部分就会被设备丢弃
发送数据丢失

- 解决方案很简单,就是再发送一次
- 这里发送方会等待一定的时间间隔,如果还没有接收到ack报文,则会重新发送一次
ACK报文丢失

- 接收方再次发送数据,接收方发现这个数据重复会直接丢弃,然后返回一次ACK应答报文
无论是数据丢了还是ack报文丢了,发送方是无法区分的,发送方只会再发送一次
接收方会有一个缓冲区,用来接收数据,当数据到达缓冲区,接收方首先会在缓冲区检查,这个元素是否存在或者曾经存在过,如果存在或者存在过,则直接丢弃掉这个数据,确保这个数据不会读取两次
如何发现重复数据?
依靠序号
- 拿着接收方发来的数据,跟缓冲区中的所有序号进行对比,如果有一样的,表示这个数据存在,直接丢弃
- 这里跟所有的序号对比,一定是从序号小的开始(将缓冲区看成带有优先级的阻塞队列)
- 如果经过对比没有发现这个序号,那么查看最后一次读到的序号
- 如果读到的最后一个序号是200,那么表示200之前的数据都已经收到了,传来的序号如果比200小,则表示已经收到了这个数据
超时重传,并不是无限次进行重传,也有一定的策略
- 重传次数有上限,如果多次重传,依旧没有用,则会重置连接,如果重置失败,则放弃连接
- 重传的时间阈值,会逐渐变大,次数越多,等待的时间越久(频率越低)
如果重传了很多次,依旧没有收到ack应答,说明网络出现了很严重的故障,重传的意义也不大,还不如休息,节省cpu资源
点赞的宝子今晚自动触发「躺赢锦鲤」buff!
相关文章:
【网络原理】TCP协议如何实现可靠传输(确认应答和超时重传机制)
目录 一. TCP协议 二. 确定应答 三. 超时重传 一. TCP协议 1)端口号 源端口号:发送方端口号目的端口号:接收方端口号 16位(2字节)端口号,可以表示的范围(0~65535) 源端口和目的…...
【国家能源集团生态协作平台-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
Java表达式1.0
Java开发工具 在当今的Java开发领域,IntelliJ IDEA已然成为了众多开发者心目中的首选利器,它被广泛认为是目前Java开发效率最快的IDE工具。这款备受瞩目的开发工具是由JetBrains公司精心打造的,而JetBrains公司总部位于风景如画的捷克共和国首…...
idea中导入从GitHub上克隆下来的springboot项目解决找不到主类的问题
第一步:删除目录下的.idea和target,然后用idea打开 第二步:如果有需要,idea更换jdk版本 原文链接:https://blog.csdn.net/m0_74036731/article/details/146779040 解决方法(idea中解决)&#…...
Android音视频开发
Android Framework 与音视频技术深度解析 一、Android音视频架构全景 ▶ 四层架构协同┌──────────────┐│ 应用层 │ ▶ MediaPlayer/ExoPlayer/Camera2 API调用└──────┬───────┘┌──────▼───────┐│ 框架层 │…...
【AI论文】CLIMB:基于聚类的迭代数据混合自举语言模型预训练
摘要:预训练数据集通常是从网络内容中收集的,缺乏固有的领域划分。 例如,像 Common Crawl 这样广泛使用的数据集并不包含明确的领域标签,而手动整理标记数据集(如 The Pile)则是一项劳动密集型工作。 因此&…...
Linux操作系统--环境变量
目录 基本概念: 常见环境变量: 查看环境变量的方法: 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式:编辑 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 环境变量通常具有全局属性 基本概念…...
Jenkins 多分支管道
如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线,本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。 Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一,因为它完全基于 git(源代…...
精益数据分析(9/126):如何筛选创业路上的关键数据指标
精益数据分析(9/126):如何筛选创业路上的关键数据指标 大家好!在创业的漫漫长路中,数据就像一盏明灯,指引着我们前行的方向。但要让这盏灯发挥作用,关键在于找到那些真正有价值的数据指标。今天…...
C语言之图像文件的属性
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 图像文件属性提取系统设计与实现 目录 设计题目设计内容系统分析总体设计详细设计程序实现…...
LeetCode hot 100—分割等和子集
题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 B卷
上册期中同步测试卷 B卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 由f(2/n), n→∞可知 2/n→0, 即x→0. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小…...
【算法】快速排序、归并排序(非递归版)
目录 一、快速排序(非递归) 1.原理 2.实现 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、归并排序(非递归) 1.原理 2.实现 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…...
python-将文本生成音频
将文本生成音频通常需要结合 文本转语音(TTS,Text-to-Speech) 工具或库来实现,比如 Google TTS (gtts)、Amazon Polly、Microsoft Azure TTS 等。 一、使用 Google TTS (gtts) 将文本生成音频 gtts 是一个简单易用的 Python 库&a…...
[王阳明代数讲义]语言模型核心代码调研
语言模型核心代码调研 基于Consciciteation的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程,实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理,将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制,…...
4月19日记(补)算了和周日一块写了 4月20日日记
周六啊 昨天晚上又玩的太嗨了。睡觉的时候有点晚了,眼睛疼就没写日记。现在补上 实际上现在是20号晚上八点半了。理论上来说应该写今天的日记。 周六上午打比赛啦,和研究生,输了,我是替补没上场。没关系再练一练明天就可以变强…...
trivy开源安全漏洞扫描器——筑梦之路
开源地址:https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库(远程)虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛,其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…...
【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)
1 dot1x部署【用户名密码认证,也可以解决私接无线AP等功能】 说明:如果一个网络需要通过用户名认证才能访问内网,而认证失败只能访问外网与服务器,可以部署dot1x功能。它能实现的效果是,当内部用户输入正常的…...
[matlab]南海地形眩晕图代码
[matlab]南海地形眩晕图代码 请ChatGPT帮写个南海地形眩晕图代码 图片 图片 代码 .rtcContent { padding: 30px; } .lineNode {font-size: 12pt; font-family: "Times New Roman", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: n…...
Web安全和渗透测试--day6--sql注入--part 1
场景: win11家庭版,edge浏览器 , sqlin靶场 定义: SQL 注入(SQL Injection)是一种常见的网络安全攻击方式,攻击者通过在 Web 应用程序中输入恶意的 SQL 代码,绕过应用程序的安全机…...
大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...
MIT6.S081-lab4
MIT6.S081-lab4 注:本篇lab的前置知识在《MIT6.S081-lab3前置》 1. RISC-V assembly 第一个问题 Which registers contain arguments to functions? For example, which register holds 13 in main’s call to printf? 我们先来看看main干了什么: …...
精通 Spring Cache + Redis:避坑指南与最佳实践
Spring Cache 以其优雅的注解方式,极大地简化了 Java 应用中缓存逻辑的实现。结合高性能的内存数据库 Redis,我们可以轻松构建出响应迅速、扩展性强的应用程序。然而,在享受便捷的同时,一些常见的“坑”和被忽视的最佳实践可能会悄…...
[SpringBoot]快速入门搭建springboot
默认有spring基础,不会一行代码一行代码那么细致地讲。 SpringBoot的作用 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的。就像我们整个SSM框架时,就常常会碰到版本导致包名对不上、Bean非法参数类型的一系列问题(原出…...
理解.NET Core中的配置Configuration
什么是配置 .NET中的配置,本质上就是key-value键值对,并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作,这里我们以为.NET 的源码项目为例,来看下.NET中的配置主要是有…...
C++面试八股文:智能指针
一、了解哪些智能指针? 回答:智能指针是用于管理动态分配的内存,行为类似于指针,但又具有自动管理内存的能力,所以称为智能指针。 首先说一下 auto_ptr和unique_ptr,它们都是独占式指针,同一时…...
nohup命令使用说明
文章目录 如何在后台运行程序呢?如何正常运行代码重定向呢?nohup: ignoring input 如何在后台运行程序呢? 使用nohup命令即可, nohup python dataset/ReferESpatialDataset.py >>dataset_20250417.log 2>&1 &n…...
MYSQL “Too Many Connections“ 错误解决
1.查询当前连接数 show status like "Threads_connected"; 2.查询数据库最大连接数 show variables like "max_connections" 3.查询所有活动连接 show processlist; 4.根据查询结果观察是否有长时间未被释放的连接 参数解释 : 字段说明id连接的唯一…...
Linux `init 6` 相关命令的完整使用指南
Linux init 6 相关命令的完整使用指南—目录 一、init 系统简介二、init 6 的含义与作用三、不同 Init 系统下的 init 6 行为1. SysVinit(如 CentOS 6、Debian 7)2. systemd(如 CentOS 7、Ubuntu 16.04)3. Upstart(如 …...
【外研在线-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
