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)去重
当数据到达接收缓冲区的时候,接收方首先会判断一下看当前缓冲区是否已经有这个数据了(或者这个数据曾经在接收缓冲区中存在过)
如果已经存在或者存在过,就直接把重复发来的数据就丢弃了
就能确保不会出现重复数据了
接收方如何判定这个数据是否是 “重复数据”
核心判定依据:【数据的序号】
- 数据还在接受缓冲区里,还没被 read 走。 此时,就拿着新收到的数据的序号,和缓冲区中的所有数据的序号对一下,看看有没有一样的。有一样的就是重复了,就可以把新收到的数据丢弃了。
- 数据在接受缓冲区中,已经被应用程序给 read 走了,此时新来的数据序号直接无法再接受缓冲区查到
注意!!应用程序读取数据的时候,是按照序号的先后顺序,连续读取的!! 先读 1 - 1000 1001 - 2000
2001 - 3000 一定是先读序号小的数据后读序号大的数据的(可以把接收缓冲区这个队列想象成带有优先级的阻塞队列)
此时socket api 中就可以记录上次读的最后一个字节的序号是多少
比如上次读的最后一个字节的序号是 3000
新收到一个数据包的序号是 1001,这个 1001 一定是之前已经读过的了,这个时候同样可以把这个新的数据包判定为 “重复的包”
直接丢弃了。
上述谈到的,ack,重传,保证顺序,自动去重,都是 TCP 内置的。使用 TCP 的 api 的时候outputStream.write ()
只需要调用一个这样的简单代码,上述功能就都自动生效了~~程序员需要操的心就少多了。 如果使用 UDP,上述这些问题就都得好好考虑考虑。
超时是会重传,但不是无限的重传,有一定的策略的
- 重传次数是有上限的。重传到一定程度,还没有 ack,就尝试重置连接,如果重置也失败,就直接放弃连接。
- 重传的超时时间阈值也不是固定不变的,随着重传次数的增加,而增大(重传频率越来越低)
连接管理(三次握手,四次挥手)
后续内容,在我的下一篇文章中有讲到:【TCP的“可靠性”(下)——三次握手四次挥手】
建立连接: 客户端执行 :socket=new Socket(serberIp,serverPort)这个操作就是在建立连接
上述只是调用 socket API ,真正连接建立的过程,是在操作系统内核完成的
建立连接(三次握手)
此处的连接是“虚拟的,抽象的”连接,目的是让通信双方都能保存对方的相关信息
断开连接(四次挥手)
断开连接的本质目的,就是为了把对端的信息从数据结构中给删除掉 / 释放掉。
相关文章:
TCP的“可靠性”(上)
目录 TCP的“可靠性”(上)确认应答(可靠性传输的基础)超时重传连接管理(三次握手,四次挥手) TCP的“可靠性”(上) 想必大家都或多或少的听说过TCP的特性:有连…...
Windows平台Unity3D下如何低延迟低资源占用播放RTMP或RTSP流?
技术探讨 自2017年我们发布跨平台的低延迟Unity下的RTSP|RTMP直播播放器后,Unity下的直播体验有了质的提升,特别是RTMP,从大家认知里面的几秒钟,直接缩减到100-300ms,满足了绝大多数场景下低延迟的技术诉求。今天就Un…...
burp的编解码,日志,比较器
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
Vercel部署前端部署
Vercel 部署 今天要讲的是如何对别人向自己的开源仓库提的PR进行自动代码审核 1. 注册并登录Vercel 访问 Vercel官网点击右上角的"Sign Up"选择使用GitHub、GitLab、Bitbucket或邮箱注册完成注册流程并登录 2. 连接代码仓库 在Vercel仪表板,点击"New Proje…...
Jenkins相关的Api接口调用详解
Jenkins API是Jenkins持续集成和持续部署(CI/CD)平台提供的一组接口,允许外部程序通过HTTP请求与Jenkins进行交互。以下是对Jenkins API使用的简介: 一、Jenkins API的主要功能 作业管理:通过API,可以创建、配置、删除以及查询作业(Job)。构建触发:可以远程触发新的构…...
HBU深度学习实验15-循环神经网络(2)
LSTM的记忆能力实验 飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com) 长短期记忆网络(Long Short-Term Memory Network,LSTM)是一种可以有效缓解长程依赖问题的循环神经网络.LSTM 的特点是引入了一个新的内部状态&am…...
洛谷P1364 医院设置(c嘎嘎)
题目链接:P1364 医院设置 - 洛谷 | 计算机科学教育新生态 题目难度:普及/提高 数据规模与约定: 对于 100%100% 的数据,保证 1≤n≤1001≤n≤100,0≤u,v≤n0≤u,v≤n,1≤w≤1051≤w≤105。 解题思路&…...
Java死锁问题如何解决?
大家好,我是锋哥。今天分享关于【Java死锁问题如何解决?】面试题。希望对大家有帮助; Java死锁问题如何解决? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java中的死锁(Deadlock)是一种并发…...
go锁与chan的性能对比
锁的作用chan 的作用golang的数据并不是并发安全的为什么锁的性能更加优秀?如何选择? 锁的作用 解决并发安全问题,流程控制等 chan 的作用 线程通信(数据传输), 并发安全,流程控制 golang的数据并不是并发安全的 golang的变量并不是并发安全的锁与chan都可以解决并发安全…...
最小二乘法拟合出二阶响应面近似模型
背景:根据样本试验数据拟合出二阶响应面近似模型(正交二次型),并使用决定系数R和调整的决定系数R_adj来判断二阶响应面模型的拟合精度。 1、样本数据(来源:硕士论文《航空发动机用W形金属密封环密封性能分析…...
Scala的隐式转换
package hfdobject Test37 { //复习隐式转换//隐式转换:编译器 偷偷地,自动的帮我们把一种数据类型转换为另外一种类型//列如:int -->double//它有失败的时候(double -->int),有成功的时候//当它转换失败的时候,…...
vue中父组件接收子组件的多个参数的方法:$emit或事件总线
方法一:使用 $emit 方法 原理 子组件通过 $emit 方法向父组件发送事件,同时可以传递多个参数,父组件通过事件监听来接收这些参数。 示例 子组件代码 <template><div><button click"sendData">发送数据</…...
网络安全法-网络安全支持与促进
第二章 网络安全支持与促进 第十五条 国家建立和完善网络安全标准体系。国务院标准化行政主管部门和国务院其他有关部门根据各自的职责,组织制定并适时修订有关网络安全管理以及网络产品、服务和运行安全的国家标准、行业标准。 国家支持企业、研究机构、高等学…...
prometheusgrafana实现监控告警
Prometheus负责集群数据的监控和采集,然后传递给grafana进行可视化,集成睿象云可实现监控报警,为了方便操作,可以通过iframe嵌套grafana到指定的页面。 文章目录 1.Grafana集成Prometheus2.iframe内嵌grafana3.监控告警 1.Grafana…...
php:完整部署Grid++Report到php项目,并实现模板打印
一、下载Grid++Report软件 路径:开发者安装包下载 - 锐浪报表工具 二、 安装软件 1、对下载的压缩包运行内部的exe文件 2、选择语言 3、 完成安装引导 下一步即可 4、接收许可协议 点击“我接受” 5、选择安装路径 “浏览”选择安装路径,点击"安装" 6、完成…...
【数据结构】基数排序的原理及实现
👦个人主页:Weraphael ✍🏻作者简介:目前正在准备26考研 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章…...
Unix/Linux 命令行重定向操作
2>/dev/null 是一个常见的 Unix/Linux 命令行重定向操作,用于将标准错误(stderr)输出重定向到 /dev/null,即丢弃错误信息而不显示。理解这个表达式需要了解几个概念:文件描述符、重定向和特殊文件 /dev/null。 ###…...
leetcode周赛-3379. 转换数组
给你一个整数数组 nums,它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result : 对于每个下标 i(其中 0 < i < nums.length),独立执行以下操作: 如果 nums[i] > 0࿱…...
D89【python 接口自动化学习】- pytest基础用法
day89 pytest的setup,setdown详解 学习日期:20241205 学习目标:pytest基础用法 -- pytest的setup,setdown详解 学习笔记: setup、teardown详解 模块级 setup_module/teardown_module 开始于模块始末,生…...
【Appium】AttributeError: ‘NoneType‘ object has no attribute ‘to_capabilities‘
目录 1、报错内容 2、解决方案 (1)检查 (2)报错原因 (3)解决步骤 3、解决结果 1、报错内容 在PyCharm编写好脚本后,模拟器和appium也是连接成功的,但是运行脚本时报错&…...
【机器人】轨迹规划 之 spline 规划
在轨迹规划中,使用 spline (通常是指通过样条曲线进行轨迹规划)可以实现平滑、连续的路径。以下是使用样条(如B样条、三次样条插值)的具体方法和步骤,结合一个简单的例子说明: 示例场景…...
健康管理系统(Koa+Vue3)
系统界面(源码末尾获取) 系统技术 Vue3 Koa Nodejs Html Css Js ....... 系统介绍 系统比较简单,轻轻松松面对结业课堂作业.采用的是基于nodejs开发的Koa框架作为后端,采用Vue框架作为前端,完成快速开发和界面展示. 系统获取 啊啊啊宝/KoaVue3https://gitee.com/ah-ah-b…...
【MySQL 进阶之路】基础语法及优化技巧
MySQL DML 基础语法及优化技巧 一、DML(数据操作语言)概述 DML 是数据库操作语言的子集,用于数据的增、删、改、查四个基本操作。MySQL 中的 DML 操作通常是指以下四种基本操作: INSERT:插入数据SELECT:…...
2021 年“泰迪杯”数据分析技能赛B 题肥料登记数据分析
2021 年“泰迪杯”数据分析技能赛B 题肥料登记数据分析 完整代码请私聊 博主 一、背景 肥料是农业生产中一种重要的生产资料,其生产销售必须遵循《肥料登记管理办法》,依法在农业行政管理部门进行登记。各省、自治区、直辖市人民政府农业行政主管部门主…...
体验AI直播:感受科技的魅力
在当今这个科技飞速发展的时代,各种创新技术层出不穷,不断刷新着我们的认知和体验。其中,无人直播作为一种新兴的直播形式,正以其独特的魅力吸引着人们的目光。当我们真正去体验无人直播时,才能更深刻地感受到科技…...
NLP-中文分词
中文分词 1、中文分词研究背景及意义 和大部分西方语言不同,书面汉语的词语之间没有明显的空格标记,句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词,即将字串转变成词串。 比如“中国建筑业呈现新格局”分词后的词串…...
oracle 架构详解
Oracle 数据库是一个复杂且强大的关系型数据库管理系统(RDBMS),广泛应用于企业级应用中。了解 Oracle 的架构对于数据库管理员(DBA)、开发人员和架构师来说至关重要。以下是 Oracle 数据库架构的详细解析,涵…...
东方资产管理校招笔试测评题型题目深入解读
东方资管作为四大资产AMC公司之一,其薪资待遇还是不错的,现在为数不多还可以投递简历的金融央企。东方资产管理校招笔试一般在简历投递截止后的周末,总部和子公司、分公司需要分别做笔试。 东方资管笔试大概2h,线上双机位&#x…...
PDF处理的创新工具:福昕低代码平台尝鲜实现PDF2word功能
在当今数字化时代,PDF文件的处理和管理变得越来越重要。福昕低代码平台是新发布的一款创新的工具,旨在简化PDF处理和管理的流程。通过这个平台,用户可以通过简单的拖拽界面上的按钮,轻松完成对Cloud API的调用工作流,而…...
springboot系列--拦截器加载原理
一、拦截器加载原理 拦截器是在容器启动时,就创建并加载好,此时并未放入拦截器链中,只是放在一个拦截器集合当中,当一个请求进来之后,会通过匹配路径,查看是否有命中集合中的拦截器的拦截路径,如…...
当Nginx所在服务器的磁盘空间满了,会有什么影响及如何避免这种问题
大家好,我是G探险者! 最近遇到一个问题是,nginx所在服务器磁盘满了,导致前端页面上的一个文件上传功能不好使了,搞得我排查半天,找不见原因,最后发现是nginx的磁盘满了导致,清理了里…...
光猫开DMZ教程
本教程以移动光猫未例,具体操作以实际光猫为准 1、登录移动光猫管理后台 打开浏览器,在浏览器地址栏输入移动光猫登录管理地址192.168.1.1或者tplogin.cn 按“回车键”打开登录页面,然后输入路由器管理密码登录。 移动光猫登录页面 超级密…...
WireShark速成
1.WireShark安装 官网: Wireshark Go Deep Kali Linux系统自带WireShark工具。 2.WireShark介绍 WireShark是一个网络包分析工具,该工具主要用于捕获网络数据包,并自动解析数据包,为用户显示数据包的详情信息,供…...
BFS入门
目录 定义二叉树层次遍历电梯问题倒可乐BFS基本思想算法 四方访问 定义 BFS 通常是指广度优先搜索(Breadth - First Search),它是一种图形数据结构的遍历算法。从给定的起始顶点开始,首先访问起始顶点的所有邻接顶点,然…...
ElementUI:el-tabs 切换之前判断是否满足条件
<div class"table-card"><div class"card-steps-class"><el-tabsv-model"activeTabsIndex":before-leave"beforeHandleTabsClick"><el-tab-pane name"1" label"基础设置"><span slot&…...
mid360使用cartorapher进行3d建图导航
1. 添加urdf配置文件: 添加IMU配置关节点和laser关节点 <!-- imu livox --> <joint name"livox_frame_joint" type"fixed"> <parent link"base_link" /> <child link"livox_frame" /> <o…...
【CSS in Depth 2 精译_073】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(中):对 CSS 行高的深入思考
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考 ✔️12.1.3 行内元素的间距设置 文章目录 12.1.2 对行高的深入思考…...
JAVA设计模式-观察者模式
概述: 观察者模式通常由两个对象组成:观察者和被观察者。当被观察者状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应,所以也被称作“发布-订阅模式”。 特点: 优点: 解耦且可…...
Java调用SSE流式接口,并流式返回给前端实现打字输出效果
目录 1.SSE概述 1.1 什么是是SSE2.2 与长链接(Long Polling)的区别 长链接(Long Polling)Server-Sent Events (SSE) 比较总结 2.通过okhttp调用SSE流式接口并流式返回给前端 环境要求使用okhttp相关依赖示例 3. 如果Spring Framework 低于5.0,可使用Servlet 3.0进行…...
倚光科技助力自由曲面设计与加工
近年来,自由曲面因其在光学、汽车、航空航天等领域的广泛应用,受到设计师和工程师的高度关注。自由曲面作为一种具有更高自由度的非球面透镜,能够在光学系统中实现更加精确的光线控制,优化像差校正,并且在满足功能需求…...
【推荐算法】推荐系统中的单目标精排模型
前言:推荐系统中模型发展较快,初学者【也就是笔者】很难对模型进行一个系统的学习。因此,这篇文章总结了王树森中的视频以及《深度学习推荐系统》中的单目标精排模型,绘制了一个单目标精排模型的思维导图来帮助初学者【笔者】更好…...
Android UI:ViewTree:源码分析:事件处理:显示事件
文章目录 概述测量:measure和onMeasure View.MeasureSpecViewViewGroupLinearLayoutRelativeLayout布局:layout和onLayout ViewViewGroupLinearLayoutRelativeLayout绘制:dispatchDraw、draw和onDraw ViewViewGroupLinearLayoutRelativeLayout总结概述 显示事…...
esp32 OTA学习笔记
csv分区表中ota-0和ota-1存放程序 不超过1600kb的程序可以ota(可手动划分) 分区表中有 ota0和ota1两个数据分区。 ota是指先下载固件到ota1然后下次从ota1启动,回滚就是回到ota0 启动。 关于固件: bin文件可以用arduino生成也可以…...
口语笔记——祈使句用法
省略主语 (You give me) a cup of tea, please. 一杯茶(You wait for) another minute. 两等一分钟(You) keep quiet. 保持安静give me a break. 饶了我吧take your hand off. 把你的手拿开take this thing away 把这东西拿开never talk to strangers. 永远不要跟陌生人说话Do…...
【微软azure】【devtunnel隧道】工具的使用及介绍
简介:这是一个微软自带的能进行内网穿透的工具,最长30天有效期,可以定时更新,保证端口永久可用----可以理解为永久的nginx 前提:有azure账号,且要有相关权限,试用账号是不行滴 使用说明 1.环…...
重生之我在异世界学智力题(1)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言智力题题目:《奇怪的时钟…...
九、页面级变量的状态管理
状态管理概述 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。 自定义组件拥有变量,变…...
#Vue3篇:defineOptionsvueUse
定义组件name 从 3.3 开始你可以直接通过 defineOptions 来设置组件名或 inheritAttrs 属性。 defineProps() 和 defineEmits() const props defineProps<{foo: stringbar?: number }>()const emit defineEmits<{(e: change, id: number): void(e: update, val…...
李飞飞的生成式3D场景,对数字孪生的未来影响几何?
大家好,我是日拱一卒的攻城师不浪,致力于技术与艺术的融合。这是2024年输出的第47/100篇文章。 前言 这两天,AI界的教母李飞飞团队重磅发布了空间智能生成式AI大模型。 仅通过一张图片就能够生成一个可操作和交互的3D空间场景。 空间智能的…...
《操作系统 - 清华大学》6 -7:局部页面置换算法:Belady现象
文章目录 1. 定义2. LRU、FIFO和Clock的比较 1. 定义 局部页面置换算法的特点是针对一个正在运行的程序,它访问内存的情况,访问页的情况,来决定应该采取什么样策略,把相应的页替换出去,站在算法本身角度来考虑置换哪个…...