javaEE 初阶 — 连接管理机制
文章目录
- 连接管理机制
- 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、在握手的过程中,双方来协商一些重要的参数。
相关文章:

javaEE 初阶 — 连接管理机制
文章目录连接管理机制1. 建立连接(三次握手)2. 断开连接(四次挥手)TCP 的工作机制确认应答机制 超时重传机制 连接管理机制 比如 主机A 的空间存储了 主机B 的 ip 和 端口,主机B 的空间存储了 主机A 的 ip 和 端口。…...

40个改变你编程技能的小技巧!
40个改变编程技能的小技巧 1、将大块代码分解成小函数 2、今日事今日毕,如果没毕,就留到明天。 如果下班之前还没有解决的问题,那么你需要做的,就是关闭电脑,把它留到明天。 中途不要再想着问题了! 3、…...

iTOP3588开发板直连电脑配置方法(无线上网)配置主机IP
首先使用网线连接好主机和开发板,在没有上电的情况下,可以看到以太网显示网络电缆 被拔出,如下图所示: 当开发板上电以后,开发板网卡与笔记本电脑的网卡会连接,如下图所示: 然后右键点击以太网…...

压电陶瓷换能器导纳圆图公式推导及匹配
压电陶瓷换能器的等效电路图如下图所示,分为左右两个部分左边的电容和电阻并联构成了电路的静态支路,被称为静态电容,可以由电表很方便的测量得到,这部分的参数是由换能器的电学参数决定的。右边的串联构成了动态支路,…...

设计模式C++实现11:观察者模式
参考大话设计模式; 详细内容参见大话设计模式一书第十四章,该书使用C#实现,本实验通过C语言实现。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察…...

l1和l2接口如何进行编写?一定要掌握这几个元素
在这个大数据时代,很多地方都需要用到l1和l2接口,l1和l2接口在应用程序与数据库之间起着桥梁的作用,是实现数据的整合与共享的重要帮手。 l1和l2接口适用于各行各业,应用场景的不断拓展,l1和l2接口的发展也兴起&#…...

GAMES101作业7及课程总结(重点实现多线程加速,微表面模型材质)
目录闲言碎语最终全部效果展示(均为10241024512ssp)课程总结与理解(Path Tracing)框架梳理任务一:迁移相关代码任务二:实现path tracing任务三:多线程加速(包括其他加速的小trick&am…...

面试题(二十四)数据结构与算法
9.1哈希 请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方? 考察点:JAVA哈希表 参考回答: Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。…...

【HAL库】STM32CubeMX开发----STM32F407----Uart串口接收空闲中断
一、Uart串口接收空闲中断----详解 首先介绍串口通信的数据传输方式,这样后面的Uart串口空闲中断能更好的理解。 Uart串口通信----数据传输方式 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备得RXD接口。 一个字符一个字符地传输,每个字符…...
Qt_文件操作
本文包含以下内容: 文件操作 基本介绍:ini文件:csv文件:代码功能文件读写:1.1 读取文件1.1.1按行读取1.1.2整体读取1.2 写入文件2. 文件信息读取3. 文件夹的创建4. 获取文件夹下所有的文件5. 获取文件夹及子文件夹下所有的文件用树的方式在界面显示文件夹目录基本介绍: …...

int和Integer有什么区别?
第7讲 | int和Integer有什么区别? Java 虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以在面试中,经常考察原始数据类型和包装类等 Java 语言特性。 今天我要问你的问题是,int 和 Integer 有什么…...

Axure 9 收录不同效果的制作过程
效果类别 一、默认选中实现单选效果 1、默认选中 点击组件,右键选择selected字样; 2、实现单选效果 点击所有组件,右键选择selected group,填好命名,并设置选中时的组件样式;选择其中一个组件…...

[Datawhale][CS224W]图神经网络(一)
目录一、导读1.1 当前图神经网络的难点1.2 图神经网络应用场景及对应的相关模型:1.3 图神经网络的应用方向及应用场景二、图机器学习、图神经网络编程工具参考文献一、导读 传统深度学习技术,如循环神经网络和卷积神经网络已经在图像等欧式数据和信号…...
【Android实现16位灰度图数据转RGB数据并以bitmap格式显示】
Android实现16位灰度图数据转RGB数据并以bitmap显示(单通道Gray数据转三通道RGB数据并显示) 需求发现问题解决方案需求 问题需求:项目上需要实现将深度相机传感器给出的数据实时显示出来的功能。经过了解得知,传感器给出的数据为16位灰度图数据,即16位数据表示一个像素的…...

uni-app②
文章目录二、微信小程序简介(一)文档相关开发者工具使用小程序代码构成小程序基本操作三、uniapp 开发规范uniapp 开发环境开发工具下载 HBuilderX工程搭建项目运行浏览器运行四、组件基础组件基础组件列表组件公共属性集合扩展组件自定义组件UNI-ICON五…...
FFmpeg视频处理
目录 1. Ubuntu(wsl)安装 ffmpeg 2. ffmpeg查看指令 3. ffmpeg查看媒体文件信息 4. ffmpeg基础操作指令 5. ffmpeg视频抽帧 5.1 基于时间抽取帧 5.2 两种抽帧方式 5.3 视频流抽帧 5.4 视频批量抽帧 6. ffmpeg更改视频播放速度 7. ffmpeg视频格…...

FreeRTOS任务通知 | FreeRTOS十二
目录 说明: 一、任务通知 1.1、什么是任务通知 1.2、任务通知优势与劣势 1.3、任务通知值的更新方式 1.4、任务通知值状态 1.5、任务通知状态 1.6、任务通知方式类型 二、任务通知相关API函数 2.1、常用的发送通知API函数 2.2、带通知值的发送通知函数 …...

CentOS搭建博客typecho
Ubuntu搭建博客typecho_Dyansts的博客-CSDN博客 见过这样的文章展示页面吗? 详细视频安装教程: 9分钟快速搭建typecho博客,让你不再烦恼_哔哩哔哩_bilibili 现在就把他搭建出来 展示页面:Hello World 其他的插件:…...
湖南中创教育PMP如何实施风险应对,避免产生投诉
一、评估风险 评估风险影响的直接或间接价值 面临的潜在威胁,威胁发生的可能性有多大? 威胁一旦发生,损失是多大? 评估承受风险的能力 采取怎样的措施才能将损失降到最低,甚至为零 二、规划风险 对识别出来的风险进行分组或分类 确定…...
Urho3D子系统
通过使用函数RegisterSubsystem(),任何对象都可以作为子系统注册到上下文中。然后,通过调用GetSubsystem(),同一上下文中的任何其他对象都可以访问它们。每个对象类型只能有一个实例作为子系统存在。 发动机初始化后,以下子系统将…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...