<JavaEE> TCP 的通信机制(二) -- 连接管理(三次握手和四次挥手)

目录

TCP的通信机制的核心特性

三、连接管理

1)什么是连接管理?

2)“三次握手”建立连接

1> 什么是“三次握手”?

2> “三次握手”的核心作用是什么?

3)“四次挥手”断开连接

1> 什么是“四次挥手”?

2> 为什么需主动断开方要进入“TIME_WAIT”状态?

3> “TIME_WAIT”会等待多久?

4> “四次挥手”能否合并为“三次挥手”?

5> 被动断开方如果一直没有发送FIN,连接就一直不会关闭吗?


TCP的通信机制的核心特性

TCP的通信机制最核心的特性是可靠传输。
TCP至少通过以下机制来保证传输的可靠性,在保证可靠性的同时也采取一些机制来提升传输效率
<1> 确认应答<6> 阻塞控制
<2> 超时重传<7> 延时应答
<3> 连接管理<8> 捎带应答
<4> 滑动窗口<9> 面向字节流
<5> 流量控制<10> 异常情况处理

阅读指针 -> 《 TCP 的通信机制 -- 确认应答 和 超时重传 》<JavaEE> TCP 的通信机制 -- 确认应答 和 超时重传-CSDN博客文章浏览阅读5次。介绍 TCP 的通信机制,确认应答和超时重传。https://blog.csdn.net/zzy734437202/article/details/135228875


三、连接管理

1)什么是连接管理?

连接管理是指,建立连接和断开连接。
在正常情况下,TCP需要经过“三次握手”建立连接,“四次挥手”断开连接。

2)“三次握手”建立连接

1> 什么是“三次握手”?

四个状态:
LISTEN:是TCP连接中,接收方监听等待接收连接的状态。
SYN_SENT:是TCP连接中,发送方第一次给接收方发送连接请求的状态。
SYN_RCVD:是TCP连接中,接收方收到连接请求并返回连接请求之后等待发送方应答的状态。
ESTABLISHED:是TCP连接中,连接准备就绪的状态。
两个数据报标志:
SYN:是同步报文段标志,用于请求建立连接。
ACK:确认标志,表示发来的数据已确认接收无误。

在正式建立TCP连接之前,需要通信的双方先完成三次特殊通信才能正式建立连接。
三次通信分别是:
<1> A端向B端发送SYN报文。
<2> B端成功接收A端发送的SYN报文,并返回ACK报文和SYN报文。至此可以确认A端发送功能正常。
<3> A端成功接收B端发送的ACK+SYN报文,并返回ACK报文。至此可以确认B端接收、发送功能正常,且A端接收功能正常。

2> “三次握手”的核心作用是什么?

<1> 测试当前通信路径是否通畅。
<2> 测试通信双方接收和发送的能力是否正常。
<3> 通信双方对一些通讯重要数据的协商。如序号、初始窗口大小等。

3)“四次挥手”断开连接

1> 什么是“四次挥手”?

六个状态:
FIN_WAIT_1:是TCP连接中,主动断开方第一次给对端发送断开连接请求的状态
CLOSE_WAIT :是TCP连接中,被动断开方收到断开连接请求后,等待关闭连接的状态。
FIN_WAIT_2:是TCP连接中,主动断开方收到对端确认断开应答,等待对端发送断开连接请求的状态。
TIME_WAIT:是TCP连接中,主动断开方收到对端发送断开连接请求后,进入等待的状态。
LAST_ACK:是TCP连接中,被动断开方发送断开连接请求后,等待应答的状态。
CLOSING是TCP连接中,通讯连接断开的状态。
两个数据报标志:
FIN:是结束报文段标志,用于通知对端,本端将结束通讯。
ACK:确认标志,表示发来的数据已确认接收无误。

在正式断开TCP连接之前,需要通信的双方先完成四次特殊通信才能正常断开连接。
四次通信分别是:
<1> A端向B端发送FIN报文。
<2> B端成功接收A端发送的FIN报文,并返回ACK报文。A端成功接收并继续等待B端FIN报文。
<3> B端发送FIN报文,A端成功接收。
<4> A端返回ACK报文。至此,B端在成功接收A端的ACK报文后,关闭连接。A端在等待一段时间没有其他情况后,关闭连接。

2> 为什么需主动断开方要进入“TIME_WAIT”状态?

TIME_WAIT是主动断开方在接收到对端的FIN报文后进入的状态。
在接收到这个FIN报文后,主动断开方会反馈一个ACK报文给对端。
如果这个返回的ACK报文丢失,被动断开方没有接收到,那么站在被动断开方视角,就是自己的FIN没有传达到。此时,被动断开方就会重新发送FIN报文
主动断开方的TIME_WAIT状态,就是为了等待这一条可能发生的报文。但如果过了一段时间后,没有收到这条报文,主动断开方就会认为对端已经CLOSING,自然自己也就CLOSING了。

3> “TIME_WAIT”会等待多久?

MSL的概念:MSL是指TCP报文的最大生存时间,这个生存时间在每个系统上是不一样的,同时也是可以配置更改的。
TIME_WAIT状态会持续存在2MSL的时长。这个时长可以保证两个传输方向上尚未被接受或迟到的报文段都已经消失,同时也是理论上保证最后一个报文可靠到达。
简而言之,一来一回的报文最多存在这么长时间,这个时间内没收到,真的还有报文,也已经达到最大生存时间,报文就“消失”了。

4> “四次挥手”能否合并为“三次挥手”?

答案是不确定的,需要具体情况具体分析。
<1> 不会合并的场景。
将被动断开方的ACK和FIN分开传输的原因是,ACK应答报文是由系统内核响应的,而FIN是由应用程序代码调用close()方法触发的。
因此,两者的触发时间不同,且时间差距可能较大,并不适合合并在一起发送。
<2> 可能合并的场景。
在TCP众多机制中,为了控制窗口大小,提高传输效率,存在“延迟应答”的机制。这意味着,如果被动断开方的ACK报文还没发送时,触发了“延迟应答”的机制,那么后续的FIN报文就有可能和ACK报文合并发送

5> 被动断开方如果一直没有发送FIN,连接就一直不会关闭吗?

主动断开方发送了FIN报文。被动断开方返回了ACK报文后,却一直没有发送FIN报文。
存在以下三种情况:
<1> 业务逻辑还未结束,被动断开方还在不断发送业务数据包给对端。
这种情况下,主动断开方可以感知对端还在通信,连接自然不会断开。
<2> 业务逻辑还未结束,被动断开方一直在处理业务,没有发送业务数据包给对端也没有发送FIN。
这种情况下,主动断开方无法感知对端是否还在。但是,TCP中还有“心跳包”机制,约定每隔一段时间通信双方就要进行一次没有业务数据的通信。因此,避免了一端还在处理数据,没来得及发送,另一端就断开了的情况。
<3> 被动断开方因为代码BUG或者通信问题,一直无法送达FIN。
这是一种异常情况,TCP也提供了一些处理异常情况的机制,如上文所说的“心跳包”机制等。因此,即使在异常情况下,连接仍然可以被关闭。

阅读指针 -> 《 TCP 的通信机制 -- 滑动窗口 》

<JavaEE> TCP 的通信机制(三) -- 滑动窗口-CSDN博客介绍了 TCP 的通信机制 -- 滑动窗口https://blog.csdn.net/zzy734437202/article/details/135235928

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

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

相关文章

【JavaWeb】函数式接口(学习笔记)

一、函数式接口概述 定义&#xff1a;有且只有一个抽象方法 注解&#xff1a;FunctionalInterface 函数式接口作为参数&#xff1a;Lambda表达式作为参数传递 函数式接口作为返回值&#xff1a;Lambda表达式作为结果返回 二、Supplier接口 Supplier<T>&#xff1a;…

Ubuntu安装WordPress并使用Nginx作为Web服务器

在Ubuntu上安装和配置WordPress并使用Nginx作为Web服务器&#xff0c;以下是一个简单的操作流程&#xff1a; 步骤 1: 安装Nginx bashCopy code sudo apt update sudo apt install nginx 启动Nginx并设置开机自启&#xff1a; sudo systemctl start nginx sudo systemctl e…

第2课 用FFmpeg读取rtmp流并显示视频

这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前&#xff0c;我们需要先用ffmpeg连接到rtmp服务器&#xff0c;当然也可以打开一个文件。 1.压缩备份上节课工程文件夹为demo.rar&#xff0c;并修…

版权登记是怎么个流程?都需要准备些什么材料?

版权登记是指按照规定的程序和条件&#xff0c;向版权局或相关机构提交申请&#xff0c;对作品进行登记和记录的过程。版权登记是一种法律手段&#xff0c;旨在保护创作者的权益和作品的完整性&#xff0c;防止盗版和侵权行为。 版权登记的申请范围包括但不限于文字作品、口述…

ZETA落地合肥、宜城南方水泥,纵行科技携手中才邦业助力水泥企业数智化管理

近日&#xff0c;合肥南方水泥、宜城南方水泥落地ZETA预测性维护方案&#xff0c;通过在水泥厂内搭建ZETA网络&#xff0c;并在B类及C类主辅机设备上安装ZETA系列端智能传感器&#xff0c;进行数据采集和监测设备运行状态、以及早期故障警报和诊断&#xff0c;实现水泥生产设备…

web期末大作业--网页设计 HTML+CSS+JS(附源码)

目录 一&#xff0c;作品介绍 二.运用知识 三.作品详情 四.部分作品效果图 我的&#xff1a;​编辑 五.部分源代码 六.文件目录 七.源码 一&#xff0c;作品介绍 作品介绍&#xff1a;该作品是一个是一个关于影视作品的网页&#xff0c;一共有五个页面&#xff0c;主页&a…

文件IO

文章目录 文章目录 前言 一 . 文件 文件路径 文件类型 Java中操作文件 File 概述 属性 构造方法 方法 createNewFile mkdir 二 . 文件内容的读写 - IO InputStream 概述 FileInputStream 概述 利用 Scanner 进行字符读取 OutputStream 概述 PrintWriter封装O…

gin框架使用系列之五——表单校验

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》 一 、表单验证的基本理论 在第三篇中&#xff0c;我们介绍了如何…

SpringIOC-注解式

IOC操作Bean管理(基于注解方式) 1.什么是注解(1)注解是代码的特殊标记, 格式 注解名(属性名值,属性2值2)(2)使用注解,注解作用在 类上面,方法上,属性上(3)使用注解目的: 简化xml配置2.spring针对bean 管理中创建对象提供注解(1) Component (2) Service(3) Controller(4) Repo…

Flink1.17实战教程(第四篇:处理函数)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

Hadoop集群找不到native-hadoop

1.问题描述 hive 运行中的问题&#xff0c;需要把把native复制进去 /usr/lib 2023-02-15 19:59:42,165 WARN scheduler.TaskSetManager: Lost task 11.0 in stage 1.0 (TID 3, common4, executor 2): java.lang.RuntimeException: Hive Runtime Error while closing operators…

获取当前进程cpu瞬时占用[linux][windows][c++]

linux #include <iostream> #include <fstream> #include <sstream> #include <unistd.h>class ProcessCPUMonitor { public:double getProcessCPUUsage() const {// 获取进程启动时间long startTime getProcessStartTime();// 获取进程的 CPU 时间l…

C# LINQ

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第22章《LINQ》 二、LINQ to XML 我们可以通过LINQ to XML来创造xml文件 如下示例&#xff0c;我们用LINQ to XML来创造。 <Books><CSharp Time"2019"><book>C# 入门经典</book><…

【Go语言入门:Go语言的数据结构】

文章目录 3.Go语言的数据结构&#xff1a;3.1. 指针3.2. struct&#xff08;结构体&#xff09;3.3. Map(映射,哈希&#xff09; 3.Go语言的数据结构&#xff1a; 简介&#xff1a; 在Go语言中&#xff0c;数据结构体可以分为四种类型&#xff1a;基础类型、聚合类型、引用类型…

uniapp 输入手机号并且正则校验

1.<input input“onInput” :value“phoneNum” type“number” maxlength“11”/> 3. method里面写 onInput(e){ this.phoneNum e.detail.value }, 4.调用接口时候校验正则 if (!/^1[3456789]\d{9}$/.test(this.phoneNum)) {uni.showToast({title: 请输入正确的手机号…

对于c++的总结与思考

笔者觉得好用的学习方法&#xff1a;模板法 1.采用原因&#xff1a;由于刚从c语言面向过程的学习中解脱出来&#xff0c;立即把思路从面向过程转到面向对象肯定不现实&#xff0c;加之全新的复杂语法与操作&#xff0c;着实给新手学习这门语言带来了不小的困难。所以&#xff…

【Linux系统编程】环境变量

介绍 环境变量是一个系统预定义的全局参数&#xff0c;系统自己开辟空间&#xff0c;将它存在于所有的Shell中&#xff0c;具有继承性&#xff0c;可以存储有关shell会话和工作环境的信息。 环境变量不是只有一个&#xff0c;而是一堆&#xff0c;是系统内具有特殊用途的变量。…

【动画视频生成】

转自&#xff1a;机器之心 动画视频生成这几天火了&#xff0c;这次 NUS、字节的新框架不仅效果自然流畅&#xff0c;还在视频保真度方面比其他方法强了一大截。 最近&#xff0c;阿里研究团队构建了一种名为 Animate Anyone 的方法&#xff0c;只需要一张人物照片&#xff0…

数据结构与算法教程,数据结构C语言版教程!(第一部分、数据结构快速入门,数据结构基础详解)二

第一部分、数据结构快速入门&#xff0c;数据结构基础详解 数据结构基础&#xff0c;主要研究数据存储的方式。 本章作为数据结构的入门课程&#xff0c;主要让读者明白&#xff0c;数据结构到底是什么&#xff0c;常用的数据存储结构有哪些&#xff0c;数据结构和算法之间到底…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…