<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

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

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

相关文章

vue动态路由,三级及以上路由,地址跳转,但是页面不显示

vue动态路由的时候,一级,二级路由都正常展示,但是三级,四级,五级等就只看到地址跳转了,但是页面并没有跳转,原因是共用了一个<router-view></router-view> import Layout from /layout import Vue from vue import Router from vue-router import db from /utils/…

工具系列:TensorFlow决策森林_(8)组合决策森林和神经网络模型

文章目录 介绍安装 TensorFlow Decision Forests导入库数据集模型结构模型训练评估决策森林下一步是什么&#xff1f; 介绍 欢迎来到TensorFlow Decision Forests&#xff08;TF-DF&#xff09;的模型组合教程。本教程将向您展示如何使用通用的预处理层和Keras函数式API将多个…

linux 网络工具(一)

linux 网络工具 1. nmcli命令1.1 介绍1.2 networking 网络控制1.3 connection 连接管理1.4 device 设备管理1.5 nmcli 返回状态码 2. ifcfg命令家族2.1 ifconfig2.2 route2.3 netstat 3. 静态路由CentosUbuntu - netplanUbuntu - network-manager 1. nmcli命令 1.1 介绍 RHEL…

使用机器学习进行语法错误检测/纠正

francescofranco_39234 一、说明 一般的学习&#xff0c;特别是深度学习&#xff0c;促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天&#xff0c;我们将研究另一个流行的用途&#xff1a;我们将使用Gramformer构建一个用于机器…

安卓全球定位系统RTK测量仪 手持GPS北斗定位仪可用于国土电力

RTK&#xff0c;英文全名叫做Real-time kinematic&#xff0c;也就是实时动态。这是一个简称&#xff0c;全称是RTK&#xff08;Real-time kinematic&#xff0c;实时动态&#xff09;载波相位差分技术。 RTK定位是一种高精度的全球卫星导航技术&#xff0c;是实时运用技术&…

springcloud之通过openfeign优化服务调用方式

写在前面 源码 。 在前面的文章中我们实际上已经完成了优惠券模块微服务化的改造&#xff0c;但是其中还是有比较多可以优化和增强的地方&#xff0c;本文就先来对服务间的通信方式进行优化&#xff0c;具体就是使用openfeign来替换调原来的webclient。下面我们就开始吧&#…

低代码平台在金融银行中的应用场景

随着数字化转型的推进&#xff0c;商业银行越来越重视技术在业务发展中的作用。在这个背景下&#xff0c;白码低代码平台作为一种新型的开发方式&#xff0c;正逐渐受到广大商业银行的关注和应用。白码低代码平台能够快速构建各类应用程序&#xff0c;提高开发效率&#xff0c;…

网络攻防中应该掌握的进阶工具udp2raw,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS

网络攻防中应该掌握的进阶工具udp2raw,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS。 udp2raw tunnel,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用kcptun或者finalspeed的…

TiDB 7.5 LTS 发版丨提升规模化场景下关键应用的稳定性和成本的灵活性

互联网时代&#xff0c;数据的迅猛增长给数据库带来了可扩展性的挑战&#xff0c;Gen AI 带来的数据暴增更加剧了这种挑战。传统的数据分片已经不能承载新时代数据暴增的需求&#xff0c;更简单且具有前瞻性的方法则是采用原生分布式数据库来解决扩展性问题。在这种规模化场景的…

MYSQL一一外键约束

概念&#xff1a;外键用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性 建立外键&#xff1a; ①这是在建立表的时候建立外键的方法 ②这是在建立完表之后建立外键的方法&#xff1a; 删除外键&#xff1a; 现在有一张员工表&#xff08;emp&#xf…

Linux基本指令(二)

目录 &#x1f4d5;前言 &#x1f4d5;echo 输出重定向&#xff08;>&#xff09; 追加重定向(>>) 输入重定向&#xff08;<&#xff09; &#x1f4d5;more &#x1f4d5;less &#x1f4d5;head &#x1f4d5;tail 查看大文本的中间部分 &#x1f4d5…

Java 8 中的 Stream 轻松遍历树形结构!

可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理&#xff0c;我们一起来看看…

深入ArkUI:深入实战组件text和text input

文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…

自动化运维平台Spug本地部署结合内网穿透实现远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

【HTML】使用canvas添加水印

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>添加水印</title><style>…

WebRTC原理与web端实战开发

什么是WebRTC webRtc(web real-time Communication) &#xff0c;旨在建立一个浏览器间实时通信的平台 谷歌开源跨平台&#xff08;android&#xff0c;IOS&#xff0c;windows&#xff0c;Linux&#xff09;实时传输&#xff08;提供强大的音视频引擎&#xff09; RTC涉及的…

SpringCloud(H版alibaba)框架开发教程---附源码 一

源码地址&#xff1a;https://gitee.com/jackXUYY/springboot-example 创建订单服务&#xff0c;支付服务&#xff0c;公共api服务&#xff08;共用的实体&#xff09;&#xff0c;eureka服务 1.cloud-consumer-order80 2.cloud-provider-payment8001 3.cloud-api-commons 4.…

Vue框架引入Axios

首先已经创建好了 Vue 框架&#xff0c;安装好了 node.js。 没有完成的可按照此博客搭建&#xff1a;搭建Vue项目 之后打开终端&#xff0c;使用命令。 1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save2、package.json 查看版本 在 p…

Flink1.17实战教程(第五篇:状态管理)

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

新建虚拟环境并与Jupyter内核连接

第一步:在cmd里新建虚拟环境,shap38是新建的虚拟环境的名字 ,python=3.x conda create -n shap38 python=3.8第二步,安装ipykernel,打开anconda powershell prompt: 虚拟环境的文件夹位置,我的如图所示: 进入文件夹并复制地址: 输入复制的文件夹地址更改文件夹:…