【JavaEE初阶】 TCP三次握手四次挥手(超详细版)

news2024/10/6 22:34:08

文章目录

  • 🌴三次握手四次挥手总览
  • 🛫三次握手(建立连接)
    • 🚩为什么要三次握手
      • 📌解决彼此双发彼此认同的问题
      • 📌验证双方的接听发送能力是否正常
    • 🚩建立连接阶段涉及到的两个重要状态:
  • 🛬四次挥手
    • 🚩四次挥手中涉及到的两个重要的TCP状态.
  • ⭕总结

🌴三次握手四次挥手总览

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

整体过程如下:
在这里插入图片描述
该过程对应着很多种状态的转换

服务端状态转化

  • [CLOSED -> LISTEN] 服务器端调用listen后进入LISTEN状态,等待客户端连接;

  • [LISTEN -> SYN_RCVD] 一旦监听到连接请求(同步报文段),就将该连接放入内核等待队列中,并向客户端发送SYN确认报文。

  • [SYN_RCVD -> ESTABLISHED] 服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了。

  • [ESTABLISHED -> CLOSE_WAIT] 当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT;

  • [CLOSE_WAIT -> LAST_ACK] 进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)

  • [LAST_ACK -> CLOSED] 服务器收到了对FIN的ACK,彻底关闭连接

客户端状态转化

  • [CLOSED -> SYN_SENT] 客户端调用connect,发送同步报文段;

  • [SYN_SENT -> ESTABLISHED] connect调用成功,则进入ESTABLISHED状态,开始读写数据;

  • [ESTABLISHED -> FIN_WAIT_1] 客户端主动调用close时,向服务器发送结束报文段,同时
    进入FIN_WAIT_1;

  • [FIN_WAIT_1 -> FIN_WAIT_2] 客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段;

  • [FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK;

  • [TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态。

下图是TCP状态转换的一个汇总:

  • 较粗的虚线表示服务端的状态变化情况;

  • 较粗的实线表示客户端的状态变化情况;

  • CLOSED是一个假想的起始点,不是真实状态

在这里插入图片描述
上述只是TCP三次握手四次挥手的一个总览,接下来我将具体为大家介绍以下连接是如何建立的,又是如何断开的,以及为什么要叫三次握手四次挥手

🛫三次握手(建立连接)

三次握手其实就是客户端服务器三次的通信的过程

举一个例子,如果一个男生和一个女生要成为男女朋友,那么彼此就会是对方唯一的那个人,那么就会出现以下对话
在这里插入图片描述
这样一来,他们就算是建立连接了,但是我们可以发现这里其实是四次通信的过程。这是因为在这个例子中我们的女生是不是可以将两句话合成一句话给男生发过去,这样一来就变成了三次握手
在这里插入图片描述
而我们的TCP也正是如此做的,由于封装一个TCP报文很麻烦,所以为了提高效率,就将两条信息包装在一起就行发送了
在这里插入图片描述
这里我们用了一个标志位SYN,该标志的作用是:请求建立连接;我们把携带SYN标识的称为同步报文段

🚩为什么要三次握手

📌解决彼此双发彼此认同的问题

上面所举得例子中我们也可以看出,这三次交互才使得他们二人男女朋友关系建立完成。

这样可能看不出效果,我们对比一下两次“握手”的场景进行对比一下,比如上述例子的一下场景
在这里插入图片描述
这时候就出现问题了:女生是男生的唯一,但是男生是女生的唯一还是备胎,男生也就不知道,这样男女朋友就算是没有建立了(舔狗除外)

📌验证双方的接听发送能力是否正常

这里也为大家举个例子吧,还是一对情侣,他们异地,然后他们现在要打游戏连麦,交互过程如下:

  1. 男:听的我说话吗?

  2. 女:听得到,你听的到我说话吗?

  3. 男:听的到,那我们开始吧!

第一次交互,这个过程中,当女生听到男生说得话,这时候

  • 女生:

    • 知道男生的麦(发送能力)正常,不知道男生听筒(接收能力)是否正常
    • 不知道自己麦(发送能力)是否正常,知道自己听筒(接收能力)正常
  • 男生:

    • 不知道女生麦(发送能力)是否正常,不知道女生听筒(接收能力)是否正常
    • 不知道自己麦(发送能力)是否正常,不知道自己听筒(接受能力)是否正常

第二次交互,女生给男生回应,这时候

  • 女生:

    • 知道男生的麦(发送能力)正常,不知道男生听筒(接收能力)是否正常
    • 不知道自己麦(发送能力)是否正常,知道自己听筒(接收能力)正常
  • 男生:

    • 知道女生麦(发送能力)是否正常,知道女生听筒(接收能力)正常
    • 知道自己麦(发送能力)正常,知道自己听筒(接受能力)正常

第三次交互,男生给女声回应,这时候女生收到后

  • 女生:

    • 知道男生的麦(发送能力)正常,知道男生听筒(接收能力)是否正常
    • 知道自己麦(发送能力)是否正常,知道自己听筒(接收能力)正常
  • 男生:

    • 知道女生麦(发送能力)是否正常,知道女生听筒(接收能力)正常
    • 知道自己麦(发送能力)正常,知道自己听筒(接受能力)正常

这时候他们就知道对方和自己的发送能力和接收能力都正常,就可以开始通信

TCP的三次握手也是如此。

🚩建立连接阶段涉及到的两个重要状态:

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

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

🛬四次挥手

了解了三次握手之后,四次挥手也就好理解,也就是四次交互的过程。

举个例子吧,比如现在一对情侣要分手了,他们之间就会有以下交互
在这里插入图片描述
这里的情侣不再是彼此的唯一,也就断开了连接

在TCP中,我们请求断开的请求使用标志位FIN标记,作用为:通知对方,本端要关闭了,四次握手过程如下:
在这里插入图片描述
这里有可能就会有人有疑问呢?为什么这里的女生的话不可以合并了呢?

这里呢,女生可能因为生气或者心已经不再男生这里,所以回复消息的速度变慢,或者有什么事儿耽搁了,所以消息就没有及时回复

在TCP断开连接的过程中,通常情况下请求与回应合并是不可以的,特殊情况下可以

和不合并取决于两者的发送的时机是否相同,三次握手中间两次之所以可以合并,是因为三次握手的时机相同,该三次握手都是纯内核中完成的(应用程序感知不到,也无法干预),内核在收到syn报文时会立即发送ack也会立即发送syn。

下面所见内容可能会涉及到TCP服务器于客户端的建立,如果对着方面不了解的小伙伴,可以去看看博主写的【JavaEE初阶】 TCP服务器与客户端的搭建,了解后再进行观看

在我们四次挥手过程中

  • FIN的发起是由应用程序发起的,而不是由内核发起的,应用程序调用Socket的close()方法才会触发。
  • 服务求收到FIN后,内核立即发出ACK,而服务器的FIN是由服务器的程序决定的,当服务器的程序执行到close()是才会发送FIN,比如博主在【JavaEE初阶】 TCP服务器与客户端的搭建中的代码里:在这里插入图片描述
  • 引用程序在break是客户端通知结束,但是如果我们要执行close()时由我们服务器决定的,在close()前面是否由其他的代码和事情需要处理,我们就不知道了
  • 就相当于同一家店铺买一些东西,如果同一时间买的,机会一同发货,如果买的这几件东西的时间相差很多,那商家肯定选择分开发货了

这就是为什么不能合并的原因了

🚩四次挥手中涉及到的两个重要的TCP状态.

  1. CLOSE_WAIT
    出现在被动发起断开连接的一方.
    等待关闭(等待调用close方法关闭socket)

注意:对于 CLOSE WAIT,一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态,原因就是服务器没有正确的关闭 socket,导致四次挥手没有正确完成。这是一个 BUG。只需要加上对应的 close 即可解决问题。

  1. TIME_WAIT
    出现在主动发起断开连接的一方.
    假设是客户端主动断开连接.
    当客户端进入TIME_ WAIT状态的时候,相当于四次挥手已经挥完了.

这里的TIME_WAIT表示当前连接不要立即释放,而是需要等待一会,那为什么需要等待呢?

我们需要注意的是,在四次挥手过程中同样存在丢包,超时重传现象,

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

  • 既然服务器可能要重传FIN,客户端就需要能够针对这个重传的FIN进行ACK响应.很明显,如果刚才彻底把连接释放了,这样的ACK就无法进行了.

  • 因此使用TIME_ WAIT状态保留一定的时间, 就是为了能够处理最后-一个ACK丢包的情况,能够在收到重传的FIN之后,进行ACK响应.

这个时间是多长呢?是2MSL

想一想,为什么是TIME_WAIT的时间是2MSL?

  • MSL是TCP报文的最大生存时间,因此TIME_WAIT持续存在2MSL的话

  • 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启,可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的);

  • 同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失,那么服务器会再重发一个FIN。这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK);

⭕总结

关于《【JavaEE初阶】 TCP三次握手四次挥手(超详细版)》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

iOS 设置图标和upload包时显示错误

右键-show in finder-AppIcon.appiconset-然后替换图片 然后遇到个问题 就是图片不能有alpha [Xcode]应用图标:ERROR ITMS-90717: “Invalid App Store Icon. The App Store Icon in the asset catalog in x… 具体操作:只需确保【AppIcon】图片集中不…

【23真题】简单!原题很多!211!

今天分享的是23年内蒙古869的信号与系统试题及解析。 本套试卷难度分析:22年内蒙古大学869考研真题,若有需要,戳这里自取!该院校是考察通信原理信号的,从信号部分来看,本套试题内容难度中等偏下&#xff0…

类图复习:类图简单介绍

入职新公司在看新项目的代码,所以借助类图梳理各个类之间的关系,奈何知识已经还给了老师,不得不重新学习下类图的相关知识,此处将相关内容记录下方便后续使用。 文章目录 类图语法类与类的关系画类图 类图语法 语法描述public-pr…

电机应用-无刷直流电机

无刷直流电机 无刷直流电机(Brushless Dirent Current Motor,简称BLDCM)由电动机主体和驱动器组成,无电刷和无换向器,是除了有刷电机外用得最多的一种电机。 无刷直流电机不使用机械的电刷装置,采用方波自控…

网络安全专业的就业方向有哪些?

网络安全专业的就业方向有哪些? 网络安全专业毕业生就业较多,可以从事计算机科学与技术、信息与通信、电子商务、互联网金融、电子政务等领域的相关工作。还可以从事政府机关事业单位、银行、保险等信息安全产品的研发、信息系统安全分析与设计、信息安…

Leetcode_3:无重复字符的最长子串

题目描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s "bbbbb"…

STM32——端口复用与重映射概述与配置(HAL库)

文章目录 前言一、什么是端口复用?什么是重映射?有什么区别?二、端口复用配置 前言 本篇文章介绍了在单片机开发过程中使用的端口复用与重映射。做自我学习的简单总结,不做权威使用,参考资料为正点原子STM32F1系列精英…

【Kurbernetes资源管理】陈述式资源管理方式(Kubectl命令详解)

陈述式 一、 理论部分1.1 管理K8s资源的基本方法1.1.1 陈述式资源管理方式1.1.2声明式资源管理方式1.1.3 GUI式资源管理方法 1.2 陈述式资源管理方式1.2.1 Kubelet工具简介1.2.2 kubectl 的基本语法1.2.3 Kubectl工具的自动补全功能 1.3 Kubernetes Service1.4 Service 的类型(…

Java开发者的囧境:那些让你苦笑不得的Bug

Java开发者的囧境:那些让你苦笑不得的Bug 《Java开发者的囧境:那些让你苦笑不得的Bug》摘要引言1. 编码时的“眼瞎病”小心!变量名不要写错了哦!情景描述建议与注意事项代码示例扩展 2. 时间的“穿越者”Bug原来是发生在几天前的代…

强化学习 - 策略梯度(Policy Gradient)

引言 强化学习常见的方法为基于值函数或者基于策略梯度。 值函数:值函数最优时得到最优策略,即状态s下,最大行为值函数maxQ(s,a)对应的动作。 但对于机器人连续动作空间,动作连续时,基于值函数,存在以下问…

Linux友人帐之网络编程基础FTP服务器

一、概述 1.1FTP基本概念 FTP(File Transfer Protocol)是一种用于文件传输的标准协议。FTP服务是一种能够让用户通过FTP协议在本地计算机和远程服务器之间进行文件传输的服务。FTP服务可以允许用户上传或下载文件,也可以进行目录浏览、文件删…

如何低门槛开发有趣实用的ZigBee产品?

一、什么是 Zigbee 协议? Zigbee 技术是一种连接距离短、功耗低、复杂程度低、数据传输量低的无线通信技术,其命名灵感源自于蜜蜂在群体中的信息传输。它主要通过网关与互联网进行通信,并嵌入各种智能设备,最终实现自动控制和远程…

关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退

先说结论,我用的app cleaner 重新删除的pycharm ,再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm,因为装不了新的插件,没办法就升级了。新装2023打开之后闪退,重启系统也不行,怀疑是一起破解…

物奇平台耳机宕机恢复功能实现

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,群赠送语音信号处理降噪算法,蓝牙音频,DSP音频项目核心开发资料, 物奇平台耳机宕机恢复功能实现 一 需求与场景 1 使…

城市内涝积水的原因有哪些?万宾科技内涝积水监测仪工作原理

一旦有暴雨预警出现多地便会立即响应,以防城市内涝问题出现。随着人口迁移,越来越多的人口涌入城市之中,为了完善城市基础设施建设,城市应急管理部门对内涝的监测越来越严格,在信息化时代,城市管理也趋向于…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼,头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作,会有一种浮在云端的虚无感 但是如果要实际操作,我又不想直接调用库包 可是…如果不直接调包,感…

【苍穹外卖 | 项目日记】第九天 万字总结

前言: 之前就写完了,用了几天补一下项目总结,本文会从宏观上介绍整体项目构架和所应用的技术以及项目亮点,最后再加上我个人的感悟。本文适合打算开始写苍穹外卖的小伙伴阅读,提高对整体项目的认知。 往期项目日记&am…

XSS 漏洞详解

XSS 漏洞详解 文章目录 XSS 漏洞详解漏洞描述漏洞原理漏洞场景漏洞评级漏洞危害漏洞验证漏洞利用防御方案典型案例 漏洞描述 XSS全名叫Cross Site Scripting(跨站脚本攻击)因为简写和css同名所以改名为XSS,该漏洞主要利用javascript可以控制html,css&am…

Redis6的IO多线程分析

性能测试 机器配置 C Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 14 On-line CPU(s) list: 0-13 Mem: 62G性能 配置推荐 官方表示,当使用redis时有性能瓶…