当前位置: 首页 > article >正文

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

【算法】快速排序、归并排序(非递归版)

目录 一、快速排序&#xff08;非递归&#xff09; 1.原理 2.实现 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、归并排序&#xff08;非递归&#xff09; 1.原理 2.实现 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…...

python-将文本生成音频

将文本生成音频通常需要结合 文本转语音&#xff08;TTS&#xff0c;Text-to-Speech&#xff09; 工具或库来实现&#xff0c;比如 Google TTS (gtts)、Amazon Polly、Microsoft Azure TTS 等。 一、使用 Google TTS (gtts) 将文本生成音频 gtts 是一个简单易用的 Python 库&a…...

[王阳明代数讲义]语言模型核心代码调研

语言模型核心代码调研 基于Consciciteation‌的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程&#xff0c;实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理&#xff0c;将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制&#xff0c…...

4月19日记(补)算了和周日一块写了 4月20日日记

周六啊 昨天晚上又玩的太嗨了。睡觉的时候有点晚了&#xff0c;眼睛疼就没写日记。现在补上 实际上现在是20号晚上八点半了。理论上来说应该写今天的日记。 周六上午打比赛啦&#xff0c;和研究生&#xff0c;输了&#xff0c;我是替补没上场。没关系再练一练明天就可以变强…...

trivy开源安全漏洞扫描器——筑梦之路

开源地址&#xff1a;https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库&#xff08;远程&#xff09;虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛&#xff0c;其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…...

【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)

1 dot1x部署【用户名密码认证&#xff0c;也可以解决私接无线AP等功能】 说明&#xff1a;如果一个网络需要通过用户名认证才能访问内网&#xff0c;而认证失败只能访问外网与服务器&#xff0c;可以部署dot1x功能。它能实现的效果是&#xff0c;当内部用户输入正常的…...

[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

场景&#xff1a; win11家庭版&#xff0c;edge浏览器 &#xff0c; sqlin靶场 定义&#xff1a; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全攻击方式&#xff0c;攻击者通过在 Web 应用程序中输入恶意的 SQL 代码&#xff0c;绕过应用程序的安全机…...

大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...

MIT6.S081-lab4

MIT6.S081-lab4 注&#xff1a;本篇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干了什么&#xff1a; …...

精通 Spring Cache + Redis:避坑指南与最佳实践

Spring Cache 以其优雅的注解方式&#xff0c;极大地简化了 Java 应用中缓存逻辑的实现。结合高性能的内存数据库 Redis&#xff0c;我们可以轻松构建出响应迅速、扩展性强的应用程序。然而&#xff0c;在享受便捷的同时&#xff0c;一些常见的“坑”和被忽视的最佳实践可能会悄…...

[SpringBoot]快速入门搭建springboot

默认有spring基础&#xff0c;不会一行代码一行代码那么细致地讲。 SpringBoot的作用 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的。就像我们整个SSM框架时&#xff0c;就常常会碰到版本导致包名对不上、Bean非法参数类型的一系列问题&#xff08;原出…...

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本质上就是key-value键值对&#xff0c;并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作&#xff0c;这里我们以为.NET 的源码项目为例&#xff0c;来看下.NET中的配置主要是有…...

C++面试八股文:智能指针

一、了解哪些智能指针&#xff1f; 回答&#xff1a;智能指针是用于管理动态分配的内存&#xff0c;行为类似于指针&#xff0c;但又具有自动管理内存的能力&#xff0c;所以称为智能指针。 首先说一下 auto_ptr和unique_ptr&#xff0c;它们都是独占式指针&#xff0c;同一时…...

nohup命令使用说明

文章目录 如何在后台运行程序呢&#xff1f;如何正常运行代码重定向呢&#xff1f;nohup: ignoring input 如何在后台运行程序呢&#xff1f; 使用nohup命令即可&#xff0c; 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&#xff08;如 CentOS 6、Debian 7&#xff09;2. systemd&#xff08;如 CentOS 7、Ubuntu 16.04&#xff09;3. Upstart&#xff08;如 …...

【外研在线-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...