javaEE 初阶 — 连接管理机制

news2024/9/23 9:28:57

文章目录

    • 连接管理机制
      • 1. 建立连接(三次握手)
      • 2. 断开连接(四次挥手)

TCP 的工作机制

确认应答机制

超时重传机制

连接管理机制


比如 主机A 的空间存储了 主机B 的 ip 和 端口,主机B 的空间存储了 主机A 的 ip 和 端口。
当这两部分信息都被维护好了之后,此时连接就有了。
此时也把保存这部分信息的这个空间(数据结构)也称为 连接。

这就好比两个人结婚,结婚证上面会有彼此的另一半是谁,有了结婚证说明这两个人才是正式结为了夫妻,
此时才是成功建立了连接。

如果要断开连接,A 和 B 把自己存储的信息(数据结构)删除了,此时连接就断开了。

管理就是描述了连接如何创建,如何断开。

1. 建立连接(三次握手)


建立连接就是通信双方各自要记录对方的信息,彼此之间要相互认同。

举个例子来说明什么是建立连接。


首先,张三向小红表白,接下来小红接受了张三的表白。此时双方就有了一个认同:小红是张三那个唯一的人。
但是要想成为男女朋友,就需要双方互为唯一,所以此时小红也向张三表白。

这个时候,又建立了一次认同,张三这边知道了,自己是小红唯一的人,而小红这边也知道了张三是她唯一的人。
这个时候才是正真的建立了男女朋友的关系,相当于是连接建立完毕。

此处就把这个过程中的每一次通信都称为一次 “握手”。


如果仔细观察就会发现上面的交互一共是 4 次,那为什么不叫做 四次握手呢?

因为有两次交互是可以合二为一的。



小红在接收张三表白的同时向张三表白,这就节省了一次数据的传输。

通信双方各自要向对方发起一个 “建立连接” 的请求,同时再各自向对方回应一个 ACK,所以这里是有四次信息交互的。
所谓的三次握手,本质上是 四次握手。这是由于中间两次交互是可以合并成一次交互的,因此就构成了三次握手。


这里将两次交互合二为一可以降低成本,好比在一家店铺买了三件商品,商家会打包成一个包裹运过来。
因为这样只需要付一份的运费,而不是分成三个包裹,付三份运费。


为什么不能是两次握手?


如果少了最后一次握手,张三知道了自己是小红的唯一,也知道了小红是自己的唯一。
但是小红这边不知道自己是张三的唯一,也不知道张三是不是她的唯一。

此时从小红的视角张三有可能同时在和多个女朋友交往,相当于是没有建立男女朋友的连接。


三次握手还有另外一个重要的作用,验证通信双方各自发送能力和接收能力是否正常
三次握手也在一定程度上保证了 TCP 传输的可靠性,但是起到的不是关键作用,而是辅助作用。

举个例子来说明。
比如现在李四和张三开黑打游戏,需要连麦,但是在游戏开始之前需要通过三次握手来进行测试验证麦克风和听筒有没有问题。


第一次交互:

1、当李四听到了 “hello !收到请回答” 后,李四就知道了张三的麦克风是好的,李四自身的耳机也是好的。
但是还不知道李四的麦克风是否是好的,也不知道张三的耳机是否是好的。


第二次交互:

2、当张三听到 “收到收到” 后,张三就知道了自己的耳机和李四的麦克风是好的。
同时由于之前是约定好,李四听到张三的 “收到请回答” 后才回复 “收到收到”,所以此时张三的麦克风和李四的耳机是好的。


张三这边已经知道了开麦交流的能力都OK了,但是李四那边的还不清楚,所以需要 第三次交互 同步一下情报。

第三次交互:

1、此时李四听到了 “OKOK” 意味着此时刚才李四发的 “收到收到” 已经被张三收到了。
意味着李四的麦克风和张三的耳机都是好的。

此时双方都知道了,彼此的麦克风和耳机都是好的。


三次握手的意义

1、让通信双方各自建立对方的 “认同”。
2、验证通信双方各自的发送能力和接收能力是否OK。
3、在握手的过程中,双方来协商一些重要的参数。

TCP 通信过程中有些数据通信双方要相互同步,此时就需要有这样的交互过程。
恰好可以利用三次握手的机会来完成数据的同步。




客户端主动给服务器发起的建立连接请求,称为 SYN,这个是 同步报文段

客户端是主动的一方,服务器是被动的一方,一定是客户端先向服务器发起 “建立连接请求”。

客户端服务器这个身份概念只是按照主不主动来进行区分的。
同一个程序在不同的场景下可能是作为服务器也可能是作为客户端。

三次握手中的TCP 的状态



圈出的描述了TCP的状态,TCP 不同的状态就体现了当前 TCP 在干什么。

建立连接阶段主要认识两个状态:

1、LISTEN 服务器的状态。
表示了服务器已经准备就绪,随时可以有客户端来建立连接了。相当于手机开机,信号良好随时可以有人来打电话。


2、ESTABLISHED 客户端和服务器都有。
连接建立完成,接下来就可以正常通信了,相当于电话拨过去,对方接通了。


在这里插入图片描述

圈出的描述了 TCP 和 socket api 之间的关系,此处的 socket api 是系统原生 api (C语言版本)
这个和 java 版本的已经有了一定的差距,因此这里不做关注。

2. 断开连接(四次挥手)


四次挥手和三次握手非常类似,都是通信双方各自向对方发起一个断开连接的请求,再各自给对方一个回应。



经过双方确认分手后,两个人确定断开了连接变成了陌生人。

需要注意的是断开连接中间两条交互,在通常下是不可以合而为一的。
如果两个数据的发送时间相同才能合并,如果是不同的时机,就无法合并!!!


为什么不能合二为一

举个例子。比如说在网上买快递,如果是在一个店铺同时下了多个订单,那么店家会发一个快递,承担一份运费。
如果是一周下一个订单,分三次下完,那么此时店家就会发三个快递,承担三份快递。

主要是因为下订单的时间是完全不同的。


三次握手中的两次能够合并是因为这两个是同一时机的。

具体来说,三次握手这三次交互过程,是纯内核中完成的。(应用程序感受不到,也无法干预)

服务器的系统内核收到 SYN 之后,就会立即发送 ACK 也会立即发送 SYN。




FIN 的发起不是由内核控制的,而是由应用程序调用 socket 的 close 方法(或者进程退出)才会触发 FIN。

ACK 则是由内核控制的,是收到了 FIN 之后立即返回 ACK,服务器的应用程序执行到对应的 close 方法才会触发 FIN。
这两者之间就回隔了一个时间差,这个时间是长还是短,取决于代码是在怎么实现的。


四次挥手中的TCP 的状态



四次挥手涉及到了两个重要的 TCP 状态:

1、CLOSE_WAIT 出现在被动发起断开连接的的一方。等待关闭 (等待调用 close 方法关闭 socket)
建立连接一定是客户端主动发起请求,断开连接可能是客户端主动发起也可能是服务器主动发起。


2、TIME_WAIT 出现在主动发起断开连接的一方。

假如是客户端主动断开连接,当客户端进入 TIME_WAIT 状态的时候,相当于四次挥手已经挥完了。
此时,这里的 TIME_WAIT 要保持当前的 TCP 状态不要立即就释放。

为什么 TIME_WAIT 会保留一会连接不立即释放???

此时最后一个 ACK 刚刚发送出去还没到呢!如果这个最后一个 ACK 丢包了呢?
因此,TIME_WAIT 会等一会,如果超出了等待的时间也没有收到重传的 FIN,此时就认为最后一个 ACK 没丢包,
于是就彻底的释放连接了。


在三次握手和四次挥手的过程中,同样是存在重传的。

如果是最后一个 ACK 丢包了,站在服务器的视角来看,服务器是不知道是因为 ACK 丢了,还是自己发的 FIN 丢了。
所以统一视为 FIN 丢了,统一进行重传操作。

既然服务器可能要重传 FIN ,客户端就需要能够针对这个重传的 FIN 进行 ACK 响应。
很明显,如果刚才彻底把连接释放了,这样的 ACK 就无法进行了。因此使用 TIME_WAIT 状态保留一定的时间,就是为了能够处理最后一个 ACK 丢包的情况,能够在收到重传的 FIN 之后进行 ACK 响应。


TIME_WAIT 保存的具体时长

约定了一个时间,叫做 2MSL 指的是,互联网上两个结点之间数据传输消耗的最大时间。

如果 A 经历了 2MSL 这个时间还没收到重传的 FIN ,就认为上个 ACK 就正常到达了(认为对方没有重传 FIN 了)


MSL 这个值通常情况下是 60s,但是传输数据的实际时长完全是有可能会超过 60s 的。
如果把 MSL 定义为 1h,传输数据的实际时长也有可能是比 1h 多的。

无论如何定义 MSL 都无法理论上排出这样的特殊情况,因此 MSL 其实相当于是一个经验值。
按照一般的经验来说,绝大部分(99.99%)数据传输的时间都不会超过 MSL。


小结:

TCP 作为一个有连接的协议,就需要建立连接和断开连接。

其中建立连接的过程是三次握手,断开连接的过程是四次挥手。

三次握手的意义:

1、让通信双方各自建立对方的 “认同”。
2、验证通信双方各自的发送能力和接收能力是否OK。
3、在握手的过程中,双方来协商一些重要的参数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

autoCAD2022 - 设置新的原点

文章目录autoCAD2022 - 设置新的原点概述笔记UCS原点设置功能的菜单位置ENDautoCAD2022 - 设置新的原点 概述 上次整板子的dxf时, 原来的原点不合适, 想调整一下. 当时整完了, 没记录. 这次用的时候, 又找半天… 设置新原点的功能, 不在顶部菜单中, 而是在视图右上角的UCS图标…

微服务网关(十二)redis流量统计

微服务网关(十二)redis流量统计中间件 redis流量统计中间件 redis详细: redis.go: // RedisConfPipline redis连接的设置方法,例如在流量统计中间件中设置数据和超时时间 func RedisConfPipline(pip ...func(c redis.Conn)) e…

Linux 内核定时器实验

目录 一、内核时间管理简介 二、内核定时器简介 三、驱动编写 1、修改makefile 2、添加定义 3、初始化led函数 4、添加调用 5、初始化定时器与定时器处理函数 这部分代码如下 四、ioctl函数 五、内核添加unlocked_ioctl 函数 1、添加设备操作集unlocked_ioctl成员 2…

【Android 后台持续定位】

最近工作中遇到了一个涉及后台持续性定位的问题。这里做一下总结:随着Android版本的条件,Google对后台服务管控的也是越来越严格。 这时有的小伙伴会说了,开启一个service然后把服务和通知关联一下变成前台服务,不就行了&#xff…

steam/csgo搬砖,2023年最暴利的项目

这个项目赚钱主要来源于两个地方: 1.比如说今天美元的汇率是1美元6.8人民币,那我们有特定的渠道能拿到1美元5.0-5.5左右人民币的价格,100美元的汇率差利润就有180元左右的利润,当然这个价格是根据国际的汇率上下会有浮动的。 2.…

什么是极速文件传输,极速文件传输如何进行大文件传输

当谈到大文件传输时,人们总是担心大数据文件的大小以及将它们从一个位置交换到另一个位置需要多长时间。由于数据捕获高分辨率视频和图像的日益复杂,文件的大小不断增加。数据工作流在地理上变得越来越分散。在一个位置生成的文件在其他位置处理或使用。…

晚上适合做什么副业?靠自己的劳动赚钱最光荣

对于大多数普通人来说,晚上的空闲时间是很多的,但是却总是在手机上打游戏、刷视频而白白度过了一晚上。其实最近几年来很多朋友都想利用晚上的时间做一些副业,因为当下的工资已经满足不了自己的需求,再加上生活方方面面的压力&…

【swagger2】开发api文档

文章目录一、swagger2 简介背景Open API ???swagger2的作用swagger2常用工具组件:二、Springfox三、springBoot使用swagger2(简单示例)四、Swagger-UI使用五、配置文件1、配置类:给docket上下文配置api描述信息2、配置类&#…

净现值、投资回收期例题讲解

净现值概念净现值(NPV):指今后某年的Y元相当于今年的X元。需要关注两个概念:利率:利率是指借款、存入或借入金额(称为本金总额)中每个期间到期的利息金额与票面价值的比率。贴现率(D…

微软Bing的AI人工只能对话体验名额申请教程

微软Bing 免费体验名额申请教程流程ChatGPT这东西可太过火了。国外国内,圈里圈外都是人声鼎沸。微软,谷歌,百度这些大佬纷纷出手。连看个同花顺都有GPT概念了,搞技术,做生意的看来都盯上了 流程 下面就讲一下如何申…

Python3遍历文件夹提取关键字及其附近字符

要求: 1,遍历文件夹下所有的.xml文件 2,从.xml文件中提取关键字以及左右十个字符 3,输出到excel 一:遍历文件夹找到所有xml文件及其路径 for root, dirs, files in os.walk(self.inputFilePath):for file in files:…

靓号管理-搜索

搜索手机号: 最后一条就是使用的关键mobile__contains 使用字典: 后端的逻辑: """靓号列表"""data_dict {}search_data request.GET.get(q, "")# 根据关键字进行搜索,如果关键字存在&…

综合项目 旅游网 【5.旅游线路收藏功能】

分析判断当前登录用户是否收藏过该线路当页面加载完成后,发送ajax请求,获取用户是否收藏的标记根据标记,展示不同的按钮样式编写代码后台代码RouteServlet/*** 判断当前登录用户是否收藏过该路线*/ public void isFavorite(HttpServletReques…

.md文件上传视频的踩坑经历小记

分别用QQ录制了前后两个视频&#xff0c;并利用video标签引用。这两个视频&#xff0c;明明代码一样&#xff0c;偏偏就一个成功&#xff0c;一个失败。 代码如下&#xff1a; <!-- 能够成功显示mp4视频 --> <video src"/images/video/2020110411.mp4" co…

海卡和海派有什么区别

一、海卡和海派有什么区别 海派和海卡实际上就是快船和慢船的区别。都是头程选用海运的方式&#xff0c;海派是到海港海关清关拆柜后&#xff0c;尾程配送是采用快递配送。而海卡则是到海港海关清关拆柜后&#xff0c;尾程选用货车配送。1、海派比较适用于小件货物 海派是海运抵…

OPenCV库移植到ARM开发板子上面配置过程

步骤一 1&#xff0c;环境准备去下载opencv官方的源码。 我这里用的是opencv-4.5.5版本的 2&#xff0c;还需要交叉编译工具一般&#xff0c;你交叉编译的工具板子厂家会提供工具&#xff0c;最好还是用板子厂家提供的交叉编译工具&#xff0c;因为我之前编译试过其他的交叉…

第一章:unity性能优化之内存优化

目录 前言 unity性能优化之内存的优化 一、unity Analysis工具的使用。 二、内存优化方法 1、设置和压缩图片 2、图片格式 3、动画文件 4、模型 5、RenderTexture&#xff08;RT&#xff09; 6、分辨率 7、资源的重复利用 8、shader优化 9、对bundle进行良好的管…

数字三角形

题目描述上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外&…

RK3399平台开发系列讲解(文件系统篇)虚拟文件系统的数据结构

🚀返回专栏总目录 文章目录 一、超级块二、挂载描述符三、文件系统类型四、索引节点五、目录项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍虚拟文件系统的数据结构。 一、超级块 文件系统的第一块是超级块,用来描述文件系统的总体信息。当我们把文件系…

【论文速递】Arxiv2018 - 加州伯克利大学借助引导网络实现快速、准确的小样本分割

【论文速递】Arxiv2018 - 加州伯克利大学借助引导网络实现快速、准确的小样本分割 【论文原文】&#xff1a;Few-Shot Segmentation Propagation with Guided Networks 【作者信息】&#xff1a;Kate Rakelly∗ Evan Shelhamer∗ Trevor Darrell Alexei Efros Sergey Levine …