TCP 协议的相关特性

1. TCP格式 

  TCP特性:有连接,全双关,面向字节流,可靠传输。(TCP安身立命的本钱,初心就是解决“可靠传输”问题)

  其实TCP的特征有很多这里我就简单的介绍几个。

  2. 确认应答

  其实用来确保可靠性,最核心机制。就用我女神来简单举个例子。

   其实我发出短信之后,我也不知道是否发送成功,此时我们也不知道对方是否有收到,是不是对方收到一个消息回一个消息,是不是也可能出现“后发先至”的情况。为了解决上述问题,引入了序号和确认序号,对于数据进行编号,应答报文里就告诉发送方说,我这次应答的是哪个数据。

下图就是确认应答的伪图:

 

 3. 超时重传(是确认应答的补充)

  定义:如果一切顺利,通过应答报文就可以告诉发送方,当前数据是不是成功收到。但是网络上可能存在“丢包”情况,如果数据包丢了,没有到达对方,对方自然也没有ack报文了,这个情况下,就需要超时重传了。TCP可靠性就是在对抗丢包,期望在丢包客观存在的背景下,也可能尽可能的把包给传过去,发送方发了个数据之后,要等,等的时间里,收到了ack(数据报在网络上传输,需要时间的)如果等了好久,ack还没等到,此时发送方就认为数据的传输出现丢包了。当认为丢包之后,就会把刚才的数据包再传输一次(重传),等待的过程有一个时间的阈值(上线),就是(超时)。

  此时就会出现了几个典型的ack问题(这里讲俩个):

第一个情况:接收方本身就没收到数据,此时你重传理所应当,没有任何问题。

第二个情况:数据已经被B收到了,再传输一次,同一份数据,B就会收到俩次。

  这时TCP socket在内核中存在接收缓冲区(一块内存空间)发送方发来的数据,是要先放到接收缓冲区中的。然后应用程序调用read/scanner.next 才能读到数据,这里的读操作其实是读接收缓冲区。接收缓冲区,除了能够帮助我们去重之外,还能够进行排序。

  注意点:超时是会重传,重传也不是无线的重传,也要有一定的策略。

  1. 重传次数是有上限的,重传到一定程度,还没有ack,就尝试连接,如果重置也失败,就直接放弃连接。

  2. 重传时间超过阈值也不是固定不变的,随着重传次数的增加,而增大(而重传频率越来越低)

 4. 连接管理

 4.1 建立连接(三次握手)

  这个处于accpet之前的阶段。此处谈到等等连接“虚拟的,抽象的”连接,目的是让通信双方都能保存对方的相关的学习。

  所谓的建立连接过程,本质上是通过双方各自给对方发起一个syn,各自给对方一个ack。(这里客户端的信息告知服务器,这个操作确实在第一次握手的时候就完成了,但是最终强力出这个连接要建立,确立出后续要进行通信,还是得所有流程都走完)

这个是详细图:

那我们为什么要握手呢???意义何在?

 1. 三次握手,可以先针对通信路径,进行投石文路,初步的确认一下通信的链路是否畅通(可靠性的前提条件)。

2. 三次握手,也是在验证通信双方,发送能力和接受能力正常。

注意:三次握手对于“可靠传输”这件事情,是有意义,起到了一些作用,但是他的作用有限,关键的可靠传输还是通过确认应答以及超时重传来保证的(毕竟三次握手,只是通信最开始的时候,握了一下,后面数据开始传输了,就和三次握手无关了)。

4.2 断开连接(四次挥手)

 是不是有一个问题四次挥手能不能跟三次握三一样合并一个??它是有点时候能合并,有的时候不能合并,在实际通信过程中,ack和第二个fin时间间隔比较长,此时就无法进行合并了,就分俩次来传输。

四次挥手和三次握手之间的相似之处和不同之处: 

相似之处:

  都是通信双反各自给对方发起一个syn/fin,各自给对方返回ack,数据传输的顺序,syn/ack/syn /ac k, fin/ack/fin/ack。

不同之处:

  三次握手中间俩次一定能合并,四次挥手则不一定。三次握手必须客户端主动,四次挥手,客户端/服务器都可以主动。   

 详图:

这里TIME_WAIT存在的意义,主要是防止,最后一个ACK丢包。服务器如果没有收到最后一个ACK,就会重传FIN。一般最多等待2MSL。

5. 滑动窗口

  为什么有滑动窗口??一为了批量传输,之前发一个数据等待ack,再发一条数据,现在是连续发了一定数据之后,统一等一波ack,把多次请求的等待时间,使用同一份时间来等了,减少了总的等待时间。

虽然减少了时间也出现了问题;

1. ack丢了

  这里要了解ack的用处了,ack是放回1001之前的数据传输成功而,这里1001没有穿过去,但是2001的穿过去了,表示2001之前的传输成功,是不是包含了1001,所以这里ack掉了不用任何操作。

2.数据丢了

  在上述重传过程中,整体的效率是非常高的。这里的重传做到了“针对性”的重传,哪个丢了就重传哪个,已经收到的数据,是不必重复发送的(因为TCP有个接受缓冲区,这边发的数据到了接收方都是先放到接收缓冲区里的排队)。整体的效率没有额外的损失,就把这种重传成为“快速重传”。

6.流量控制

  滑动窗口越大,此时传输数据的速度越快,但也不能无限快,但是接收方的接收能力存在上限,取决于接收方应用程序,读取接收缓冲区的熟读,这里需要根据接收方的处理能力(使用接受缓冲区剩余空间大小)反向影响发送方的发送速率。

  当窗口大小为0,意味着接受缓冲区满了,此时发送方就应该暂停发送,发送方会周期的触发“窗口探测包”并不携带载荷,这样的包对于业务不产生影响,只是为了触发ack。一旦查询出来的结果,是已经非0 了,缓冲区又行了,发送方继续发送。

7. 拥塞控制

  都是要限制发送方发送数据的速率,流量控制是站在接收方的角度来制约发送方速率。也符合木桶效应,能装多少水,取决你“最短的板”。

这里就举了方法:

1. 慢启动: 刚开始传输的数据,速率是比较小的,采用的窗口大小也就比较小,此时,网络的拥堵情况未知,如果一上来就搞很大,可能就让本来不富裕的网络带宽,雪上加霜。

2. 如果上述传输的数据,没有出现丢包,说明网络还是流畅的,就要增大窗口大小,此时,增大方式是按照指数来增长(*2)

3. 指数增长,不会一直持续保持的,可能会增大太快,一下导致网络拥堵,这里引入了一个“阈值”,当拥塞窗口达到阈值之后,指数增长就成了线性增长。

4. 线性增长也是一直在增长,积累一段时间之后,传输的速度可能太快,此时还是会引起丢包。一旦出现了丢包,就把拥塞窗口重置成比较下的值,回到最初的 慢启动过程,并且这里也会根据刚才丢包的窗口大小,重新设计阈值。、

8. 延时应答

也是基于滑动窗口,是要尽可能的再提高一点效率,结合滑动窗口以及流量控制,能够通过延时应答ack的方式,把反馈的窗口大小,弄大点。(核心让窗口尽可能大) 

如我们前面讨论的:滑动窗口下如果ack丢了,没啥影响,延时应答具体怎么延时,也不是简单的按照时间,而是可以按照ack丢了的方式来处理,正常每个数据都会有ack,此时就可以每隔几个数据再放回ack了(每隔几个数九,就能起到了延时应答的效果)。另外也能减少ack传输的数量,也能起到节省开销的效果。 

9. 捎带应答

  基于延时应答引入的机制,能够提升传输效率,修改窗口大小,确实是提升效率的有效途径,捎带应答,就是走另一条路,尽可能的把能合并的数据包进行合并,从而起到提高效率的效果。 

10. 面向字节流

主要的是一个粘包问题的处理。此处的包是“TCP的载荷中的应用数据包”。

  粘包问题不是TCP独有的问题,只要你是面向字节流的,都是同样的问题的,解决问题的关键,就是明确包之间的边界:

  1. 通过特殊符号,作为分隔符。

  2. 指定出包的长度,比如在包开始的位置,加上了一个特殊的空间来表示整个数据的长度。

11. 异常情况

  11.1 其中有一方出现了进程崩溃

  进程无论是正常结束,还是异常崩溃,都会触发回收文件资源,关闭文件这样的效果(系统自动完成的)就会触发四次挥手,TCP连接的生命周期,可以比进程更长一些,虽然进程已近退出了,但是TCP连接还在,仍然可以继续进行四次挥手。

  11.2 其中一方出现了 关机

  点了关机之后,此时四次挥手不一定能挥完,系统马上要关闭了。如果挥的快,就能顺利挥完。但是如果挥的慢,至少也把第一个fin发给对端,至少告诉对方,我这边要结束了,对端收到fin之后,对端进入释放连接的流程了,放回ack并且也发fin,这里的fin不会有ack了。就会直接单方面删除连接信息。 

  11.3 其中一方出现了断电

  对端是发送方:与主机关机执行机制顺序相同:接收不到ack->超时重传->重置连接->释放连接。

  对端是接收方:对端无法立即知道此电脑是未发送新的数据还是直接关机。因此TCP内置了心跳包(保活机制),对端会定期给此电脑发送一个心跳包,此电脑会返回一个回应。如果每个心跳包都有及时的回应,就说明当前的状态良好。如果心跳包发送过去后没有回应,就说明此电脑关闭。       

11.4 网线断开

  执行的顺序与断电的一致。                                                                                                             

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/363811.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【新课】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战

本课程由云贝教育-刘峰老师出品,感谢关注 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性,同时提高性能。本课程基于当前主流版本Oracle 1…

2024.1.30 GNSS 学习笔记

站星双差Kalman滤波伪距差分定位流程 1. RTK定位技术(实时载波相位差分技术)原理-站间单差浮点解 1.RTK技术其实就是在RTD技术的基础上增加载波观测值的使用。由于伪距的噪声在分米量级,即使我们通过站间单差消除了绝大部分的误差影响&…

前端入门第二天

目录 一、列表、表格、表单 二、列表(布局内容排列整齐的区域) 1.无序列表(不规定顺序) 2.有序列表(规定顺序) 3.定义列表(一个标题多个分类) 三、表格 1.表格结构标签 2.合并…

基于Raspberry Pi的自动巡航与避障系统(二)

在上一篇中,我们讨论了智能小车的避障逻辑实现,在本篇中,我们将进一步扩展智能小车的功能,包括更高级的避障策略、路径规划和导航功能,同时,我们还将提供相应的代码示例,以帮助读者更好地理解和…

Typora导出html文件图片自动转换成base64

Typora导出html文件图片自动转换成base64 一、出现问题二、解决方案三、编码实现3.1.创建Java项目3.2.代码3.3.打包成Jar包 四、如何使用endl 一、出现问题 typora 导出 html 的时候必须带有原图片,不方便交流学习,文件太多显得冗余,只有将图…

GNSS技术助力航海业迈向新时代:海洋测绘与航行的创新应用

全球导航卫星系统(GNSS)技术在海洋测绘与航行领域的广泛应用,正推动航海业迎来新一轮的科技变革。MinewSemi的GNSS模块为船舶导航、海洋资源勘探和航行安全提供了更为精确和高效的解决方案。本文将深入研究GNSS技术在海洋测绘与航行中的创新应…

开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板

vue3.3-Mobile-template 基于Vue3.3 TS Vant4 Vite5 Pinia ViewPort适配 Sass Axios封装 vconsole调试工具,搭建的H5移动端开发模板,开箱即用的。 环境要求: Node:16.20.1 pnpm:8.14.0 必须装上安装pnpm,没装的看这篇…

基于PSO-BP神经网络的风电功率MATLAB预测程序

微❤关注“电气仔推送”获得资料(专享优惠) 参考文献 基于风电场运行特性的风电功率预测及应用分析——倪巡天 资源简介 由于自然风具有一定的随机性、不确定性与波动性,这将会使风电场的功率预测受到一定程度的影响,它们之间…

GPT-4级别模型惨遭泄露!引爆AI社区,“欧洲版OpenAI”下场认领

大家好,我是二狗。 这两天,一款性能接近GPT-4的模型惨遭泄露,引发了AI社区的热议。 这背后究竟是怎么回事呢? 起因是1月28日,一位名为“Miqu Dev”的用户在 HuggingFace 上发布了一组文件,这些文件共同组…

iOS pod sdk开发到发布,记录

本文章记录从开发sdk到发布cocopod的问题和流程,省的每次都忘还得重新查 1:pod lib create (sdk名称) 命令创建 工程结构,然后根据命令行提示进行选择. What platform do you want to use?? [ iOS / macOS ]。~》 iOS What language do you want to use?? [ Swift / Obj…

“/“应用程序中的服务器错误.

<div id"m_category" class" round2"><h3>管理中心</h3><div class"con"> <p><a href"categorymanager.aspx">类别管理</a></p> /*我是这段代码出现问题*/ <p><a …

异步编程,到底有什么用?

关键词&#xff1a;高性能、架构设计、异步思想、场景落地 文章导读 场景切入 先来看一个日常生活快递寄件场景&#xff0c;从寄件人&#xff08;寄件&#xff09;到收件人&#xff08;收件&#xff09;&#xff0c;全流程如下 当你准备寄送一个包裹时&#xff0c;通常你可以…

Android配置GitLab CI/CD持续集成,Shell版本的gitlab-runner,FastLane执行,上传蒲公英

mac环境下, 首选需要安装gitlab-runner和fastlane brew install gitlab-runner brew install fastlane 安装完成,来到我们在gitlab下新建的Android项目,我们开始创建gitlab-runner 1、创建runner 点开runner,点击新建runner 选择macos,自定义一个标签,把运行未打标签…

合约短线高胜率策略-扭转乾坤指标使用说明

扭转乾坤指标使用说明 行情判断 双绿线 多趋势双红线 空趋势大绿线 小红线 多震荡大红线 小绿线 空震荡 进场条件 趋势行情进场 多趋势 多信号 底金叉 做多空趋势 空信号 顶死叉 做空 震荡行情进场 多震荡 多信号 底金叉 做多多震荡 空信号 顶死叉 做空空…

Elasticsearch:将文档级安全性 (DLS) 添加到你的内部知识搜索

作者&#xff1a;来自 Elastic Sean Story 你的企业很可能淹没在内部数据中。 你拥有问题跟踪、笔记记录、会议记录、维基页面、视频录制、聊天以及即时消息和私信。 并且不要忘记电子邮件&#xff01; 难怪如此多的企业都在尝试创造工作场所搜索体验 - 为员工提供集中、一站…

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体&#xff09;这种就解决不了&#xff0c;也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中&#xff0c;客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

python+selenium的web自动化】- 元素的常用操作详解(一)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

PySimpleGUI 综合应用|英语文本朗读以及转换为语音Mp3

PySimpleGUI 综合应用 目录 PySimpleGUI 综合应用 应用界面 完整代码 所需模块 PySimpleGUI pyttsx3 pyaudio rapidfuzz 字典格式 应用界面 完整代码 英语朗读器.pyw import PySimpleGUI as sg import pyttsx3,pyaudio,pyperclip import os,re,datetime,wave,threa…

EasyExcel使用,实体导入导出

简介 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是在内存中…

@JsonProperty(“xx“)的使用

JsonProperty(“xx”) 指定JSON字段的名称 常见的场景 1、第三方调用本系统&#xff0c;参数接收不到 &#xff0c;没有使用驼峰命名&#xff0c;或者传参格式不一致问题 2、前后端调试&#xff0c;接收不到个别参数 遇到的场景描述&#xff1a; 1&#xff0c;项目提供ope…