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

TCP的“可靠性”(上)

目录

  • TCP的“可靠性”(上)
    • 确认应答(可靠性传输的基础)
    • 超时重传
    • 连接管理(三次握手,四次挥手)

TCP的“可靠性”(上)

想必大家都或多或少的听说过TCP的特性:有连接,可靠传输,面向字节流,全双工

本文重点讲讲TCP的“可靠性”

网络通信过程是复杂的,无法确保发送方发送出去的数据,100%能够到达接收放。

此处可靠性,只能“退而求其次”,只要尽可能的去进行发送了,发送方能够指定对方是否收到,就认为是可靠传输了。

网上很多帖子说:”TCP的可靠性是因为三次握手四次挥手“

这个说法是很不准确的,因为三次握手四次挥手只有初次建立连接的时候才会,但是可靠性是整个过程都可靠,那靠的什么呢?

用来确保可靠性,最核心的机制,称为“确认应答”

确认应答(可靠性传输的基础)

确认应答就是:句句有回应!

在这里插入图片描述

比如:银角大王每次像金角大王发出请求,金角大王都有响应

在这里插入图片描述

但是上述的时序有些过于理想了,实际上网络传输过程中,经常会出现“后发先至”情况

为什么网络中会出现“后发先至”情况呢?

一个数据包从发送方到接收方过程中走的路线可能不一样

第一个数据包,走路线一,第二个数据包走路线二

有可能路线二非常通畅,路线一堵车了,第二个数据包虽然发的迟,但是能先到!!

在这里插入图片描述

如果出现后发先至的情况,再去理解这里的含义就会出现问题了!

在这里插入图片描述

为了解决上述问题,引入了序号和确认序号,对于数据进行编号,应答报文里就告诉发送方说,我这次应答的是哪个数据

在这里插入图片描述

这只是简化版本的模型,真实的TCP的情况要更复杂一些。

TCP是面向字节流的,以字节为单位进行传输的,没有“一条两条”的概念

实际上,TCP的序号和确认序号都是以字节来进行编号的

在这里插入图片描述

应答报文中的确认序号,是按照发送过去的最后一个字节的序号再加上1来进行设定的

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

超时重传

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

如果一切顺利,通过应答报文就可以告诉发送方,当前数据是不是成功收到

但是,网络上可能存在“丢包”情况。如果数据包丢了,没有到达对方,对方自然也没有ack报文了。

这个情况下,就需要超时重传了

TCP可靠性就是在对抗丢包(期望在丢包客观存在的背景下,也能够尽可能的把包传过去)

发送方发了个数据之后,要等

等的时间里,收到了ack(数据报在网络上传输,需要时间)

如果等了好久,ack还没等到,此时发送方就认为数据的传输出现丢包了

当认为丢包之后,就会把刚才的数据包再传输一次(重传)

等待的过程有一个时间的阈值(上线),就是(超时)

为啥会存在“丢包”?

网络中的路由器/交换机,不仅仅是给你这一次通信提供服务,还要能支持千千万万的主机之间的通信

整个网络中,就可能存在,某个路由器/交换机,某个时刻,突然负载量很高,短时间内可能有大量的数据包要几个这个设备转发。这个时候,如果瞬间的高负载超出了这个设备能转发的数据量的极限,多出来的部分,就无了,就被设备丢包了。

在这里插入图片描述

当然,没收到ack不一定就是丢包了,也可能是数据到达了,ack丢了

在这里插入图片描述

所以,这里要分情况讨论:

1.丢包了(数据包丢了)

这种情况接收方本身没有收到数据,此时你重传理所应当,没有任何问题

2.ack丢了

数据已经被接收方B接收了,但是B返回的ack丢了

此时发送到再传输一次,同一份数据,B就会收到两次

试想一下,如果发的请求是扣款请求呢??这是肯定不行的

TCP socket再内存中存在接收缓冲区(一块内存空间)

发送方发来的数据,是要首先放到接收方缓冲区中,然后应用程序调用read/sanner.next才能读到数据,这里的读操作其实是读接收缓冲区。

【缓冲区的应对方案】

  • 1)去重

当数据到达接收缓冲区的时候,接收方首先会判断一下看当前缓冲区是否已经有这个数据了(或者这个数据曾经在接收缓冲区中存在过)

如果已经存在或者存在过,就直接把重复发来的数据就丢弃了

就能确保不会出现重复数据了

接收方如何判定这个数据是否是 “重复数据”
核心判定依据:【数据的序号】

  1. 数据还在接受缓冲区里,还没被 read 走。 此时,就拿着新收到的数据的序号,和缓冲区中的所有数据的序号对一下,看看有没有一样的。有一样的就是重复了,就可以把新收到的数据丢弃了。
  2. 数据在接受缓冲区中,已经被应用程序给 read 走了,此时新来的数据序号直接无法再接受缓冲区查到
    注意!!应用程序读取数据的时候,是按照序号的先后顺序,连续读取的!! 先读 1 - 1000 1001 - 2000
    2001 - 3000 一定是先读序号小的数据后读序号大的数据的(可以把接收缓冲区这个队列想象成带有优先级的阻塞队列)
    此时socket api 中就可以记录上次读的最后一个字节的序号是多少
    比如上次读的最后一个字节的序号是 3000
    新收到一个数据包的序号是 1001,这个 1001 一定是之前已经读过的了,这个时候同样可以把这个新的数据包判定为 “重复的包”
    直接丢弃了。

上述谈到的,ack,重传,保证顺序,自动去重,都是 TCP 内置的。使用 TCP 的 api 的时候outputStream.write ()
只需要调用一个这样的简单代码,上述功能就都自动生效了~~程序员需要操的心就少多了。 如果使用 UDP,上述这些问题就都得好好考虑考虑。

超时是会重传,但不是无限的重传,有一定的策略的

  1. 重传次数是有上限的。重传到一定程度,还没有 ack,就尝试重置连接,如果重置也失败,就直接放弃连接。
  2. 重传的超时时间阈值也不是固定不变的,随着重传次数的增加,而增大(重传频率越来越低)

连接管理(三次握手,四次挥手)

后续内容,在我的下一篇文章中有讲到:【TCP的“可靠性”(下)——三次握手四次挥手】

建立连接: 客户端执行 :socket=new Socket(serberIp,serverPort)这个操作就是在建立连接

上述只是调用 socket API ,真正连接建立的过程,是在操作系统内核完成的

在这里插入图片描述

建立连接(三次握手)

此处的连接是“虚拟的,抽象的”连接,目的是让通信双方都能保存对方的相关信息

断开连接(四次挥手)

断开连接的本质目的,就是为了把对端的信息从数据结构中给删除掉 / 释放掉。

相关文章:

TCP的“可靠性”(上)

目录 TCP的“可靠性”(上)确认应答(可靠性传输的基础)超时重传连接管理(三次握手,四次挥手) TCP的“可靠性”(上) 想必大家都或多或少的听说过TCP的特性:有连…...

超标量处理器设计笔记(5)虚拟存储器、地址转换、page fault

虚拟存储器 概述地址转换单级页表多级页表案例最好情况:虚拟地址是连续的最差情况:每个第二级 PT 都装有一项 增加级数 Page Fault 程序保护 概述 当程序比物理内存空间更大时,无法全部装在物理内存中,需要对程序进行切片 虚拟…...

SparkSQL 读写数据攻略:从基础到实战

目录 一、输入Source 1)代码演示最普通的文件读取方式: 2) 通过jdbc读取数据库数据 3) 读取table中的数据【hive】 二、输出Sink 实战一:保存普通格式 实战二:保存到数据库中 实战三:将结果保存在h…...

react 使用状态管理调用列表接口渲染列表(包含条件查询,统一使用查询按钮,重置功能),避免重复多次调用接口的方法

react开发调用api接口一般使用useEffect来监听值的变化,通过值的变化与否来进行接口调用。 比如我们要进行一个查询接口 const [pageParams, setPage] useState({name: ,id: ,});const [dataList, setDataList] useState([]);const getList async () > {const…...

Stable Audio Open模型部署教程:用AI打造独家节拍,让声音焕发新活力!

Stable Audio Open 是一个开源的文本到音频模型,允许用户从简单的文本提示中生成长达 47 秒的高质量音频数据。该模型非常适合创建鼓点、乐器即兴演奏、环境声音、拟音录音和其他用于音乐制作和声音设计的音频样本。用户还可以根据他们的自定义音频数据微调模型&…...

加油站-(贪心算法)

题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas…...

k8s-持久化存储PV与PVC(1)

1、概述 为什么 kubernetes 要持久化存储? 在 kubernetes 中部署应用都是以 Pod 的容器运行的,而 Pod 是有生命周期,一旦 Pod 被删除或重启后,这些数据也会随着丢失,则需要对这些数据进行持久化存储。 PV&#xff1…...

Linux Red Hat Enterprise

下载 https://developers.redhat.com/products/rhel/download 安装...

《中型 Vue 项目:挑战与成长》

一、引言 在当今的前端开发领域,Vue 作为一款渐进式 JavaScript 框架,以其强大的功能和灵活性备受开发者青睐。对于中型 Vue 项目而言,其重要性不言而喻。中型 Vue 项目通常在功能复杂度和规模上介于小型项目和大型项目之间,既需要…...

配置 DNS over HTTPS阻止DNS污染

概念介绍 DOH简介 ​ DNS(域名系统)的主要功能是将域名解析成IP地址,域名的解析工作由DNS服务器完成。从安全角度来看,域名解析的请求传输时通常不进行任何加密,这导致第三方能够很容易拦截用户的DNS,将用…...

Facebook广告文案流量秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密! 一、广告文案怎么写? 正文:这是帖子的正文,出现在您姓名的正下方。它可…...

22. 五子棋小游戏

文章目录 概要整体架构流程技术名词解释技术细节小结 1. 概要 🔊 JackQiao 对 米粒 说:“今天咱们玩个五子棋小游戏,电脑与你轮流在一个 nn 的网格上放置棋子(X 或 O),网格由你输入的正整数n决定&#xff0…...

fastadmin框架同时使用 阿里云oss和阿里云点播

背景 项目的实际需求中既要用到阿里云oss产品又用到阿里云点播系统&#xff0c;实现完美的统一。设置两个地址downUrl&#xff0c;thirdCode。分别代表阿里云oss上传路径和阿里云点播系统vId。 实现 默认框架你已经集成好阿里云oss集成工作&#xff0c;前端html页面实现 <…...

Java-JMX 组件架构即详解

JMX架构由三个主要组件构成&#xff1a; ‌MBeans&#xff08;Managed Beans&#xff09;‌&#xff1a;代表可管理的资源&#xff0c;是JMX的核心。MBean可以是Java类或接口&#xff0c;提供了管理操作的接口&#xff0c;如获取系统信息、设置参数等。‌MBeanServer‌&#x…...

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…...

java+ssm+mysql校园物品租赁网

项目介绍&#xff1a; 使用javassmmysql开发的校园物品租赁网&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;物品管理&#xff08;物品种类、物品信息、评论信息&#xff09;&#xff1b;订单管理&#xff1…...

Spring Boot中实现JPA多数据源配置指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始&#xff0c;到配置数据源、创建DataSource bean、定义实体和Repository&#xff0c;最后到配置事务管理器和使用多数据…...

服务器加固

1.服务器密码复杂度 密码最小长度&#xff0c;密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit&#xff1a;大写字母个数&#xff1b;lcredit&#xff1a;小写字母个数&#xff1b;dcredit&#xff1a;数字个数&#xff1b;ocredit&#xff1a;…...

探索CSS中的背景图片属性,让你的网页更加美观

导语&#xff1a;在网页设计中&#xff0c;背景图片的运用能够丰富页面视觉效果&#xff0c;提升用户体验。本文将详细介绍CSS中背景图片的相关属性&#xff0c;帮助大家更好地掌握这一技能。 一、背景图片基本属性 1、background-image 该属性用于设置元素的背景图片。语法如…...

Oracle的打开游标(OPEN_CURSORS)

一、OPEN_CURSORS 概述 OPEN_CURSORS 指定会话一次可以拥有的打开游标&#xff08;私有 SQL 区域的句柄&#xff09;的最大数量。可以使用此参数来防止会话打开过多的游标。 OPEN_CURSORS参数说明 特性 描述 参数类型 Integer 默认值 50 修改方式 ALTER SYSTEM PDB级别…...

数值分析—数值积分

研究背景 积分的数学解法为牛顿莱布尼兹公式&#xff0c;数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫ab​f(x)dxF(b)−F(a)&#xff0c;但应用该方法有如下困难&#xff1a; 1&#xff0c; f ( x ) f(x) f(x)的原函数有时不能用初等函…...

克服大规模语言模型限制,构建新的应用方法——LangChain

大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命&#xff0c;改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展&#xff0c;大模型的数据集(包括多模态数据集)制作已经形成了规约&#xff0c;Meta、Go…...

计算机网络 —— HTTPS 协议

前一篇文章&#xff1a;计算机网络 —— HTTP 协议&#xff08;详解&#xff09;-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书&#xff1f; 2.中间人能否调…...

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…...

React第十五节useReducer使用详解差异

useReducer() 的用法注意事项 1、 概述&#xff1a; useReducer() 常用于管理复杂的状态更新逻辑&#xff0c;特别是在状态更新依赖于多个条件或动作时&#xff0c;useReducer 提供了一种更加结构化和可维护的方式来处理状态。可以将更新函数写在组件外面 它与 useState() 相…...

NanoLog起步笔记-5-客户端简要描述

nonolog起步笔记-5-客户端简要描述 客户端的简要的设计图路notify模式服务端最好分两个核 NanoLog::setLogLevel(NOTICE);从 NANO_LOG 开始NANO_LOGcompiling time的语句getNumNibblesNeeded&#xff1a;得到prompt中&#xff0c;number的数量countFmtParams&#xff1a;得到所…...

Flink:入门介绍

目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK​编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…...

目标跟踪领域经典论文解析

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一&#xff0c;它为互联网上的数据传输提供了可靠性和连接管理。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议…...

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果...

网站和网页不同吗/seo服务优化

【解决方案】服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)参考文章&#xff1a; &#xff08;1&#xff09;【解决方案】服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473) &#xff08;2&#xff09;https://www.cnblogs.com/LeeXiaoFeng/p/114173…...

做跨境都有哪些网站/《新闻联播》今天

点击上方“服务端思维”&#xff0c;选择“设为星标”回复”669“获取独家整理的精选资料集回复”加群“加入全国服务端高端社群「后端圈」作者 | VishalSinha翻译 | 张卫滨本文要点审计日志系统有很多应用场景&#xff0c;而不仅仅是存储用于审计目的的数据。除了合规性和安全…...

那个网站使用bs做的/搜索关键词热度

2016年4月11日作业 一、法律法规和标准规范1、中国标准划分为哪四个层次&#xff1f;要求最低的是哪个&#xff1f;国家标准、行业标准、地方标准和企业标准&#xff0c;其中要求最低的是国家标准。2、国家标准的制订程序包括哪些&#xff1f;前期准备、立项、起草、征求意见、…...

网站制作案例怎么样/腾讯搜索引擎入口

【jzoj 4743 NOIP2016 提高 A 组模拟 9.2】积木(Standard IO)Time Limits: 1000 ms $ \quad $ Memory Limits: 262144 KB $ \quad $ Detailed LimitsDescription Input 第一行包含一个整数 $ n $ 。 接下来 $ n $ 行&#xff0c;每行包含三个整数 $ a,b,c $ &#xff0c;表示该…...

博客为什么用wordpress/免费seo诊断

RunLoop概念 运行循环&#xff0c;一个 run loop 就是一个事件处理的循环,用来不停的调度工作以及处理事件 作用 保持程序的持续运行监听处理App中的各种事件&#xff08;触摸事件&#xff0c;定时器事件&#xff0c;selector事件&#xff09;节省CPU资源&#xff0c;提高程序性…...

建设规划/上海网站seo公司

快速排序算法的深入分析 --深入浅出&#xff0c;彻底理解 作者:July 二零一一年二月二十七日--------------------------前言一、快速排序最初的版本二、快速排序名字的由来三、Hoare版本的…...