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

文章目录

  • 🌴三次握手四次挥手总览
  • 🛫三次握手(建立连接)
    • 🚩为什么要三次握手
      • 📌解决彼此双发彼此认同的问题
      • 📌验证双方的接听发送能力是否正常
    • 🚩建立连接阶段涉及到的两个重要状态:
  • 🛬四次挥手
    • 🚩四次挥手中涉及到的两个重要的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三次握手四次挥手(超详细版)》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

blender动画制作软件拓扑全流程

拓扑在三维动画制作中至关重要,原因如下: 1. 动画变形: 自然形变: 良好的拓扑结构能够支持角色或物体在动画中的自然形变,例如关节弯曲、肌肉收缩等。流畅运动: 适当的拓扑有助于保持模型表面的平滑性&…

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

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

Windows安装Docker(无网)

Windows安装Docker(无网) window无网安装Docker 1. 开启虚拟化功能 1. 开启window的虚拟化功能 方式一:直接在window的搜索框搜索 “启用或关闭windows功能”,就可以快捷进入【启用或关闭windows功能】页面 方式二&#xff1…

【MySQL】想不想知道数据库到底是啥?想了就进来看看

数据库是什么 前言正式开始连接mysql理解mysql第一层理解第二层理解第三层理解 小问题见见猪跑show databases;create database xxx;create table xxx; 主流数据库mysql架构SQL语句的种类存储引擎 前言 你手上有没有MySQL?有了最好,没有的话建议下一个&…

2022美亚杯团队赛

2022美亚杯团体赛 - XDforensics-Wiki 2022 美亚杯 团体赛AGC部分资格赛服务器部分 所有服务器部分解题思路_2022美亚杯团体赛复盘-CSDN博客 目录 AGC 1 2 Media Sever挂载 3 ssh登入的看法 PTS 4 5 ssh日志 6 7 查看docker列表 8 查看docker运行 9 建立网站…

solidworks对电脑要求高吗?2023solidworks配置要求

solidworks对电脑要求高吗?SolidWorks是一款功能强大的三维CAD软件,对电脑配置有一定的要求。一般来说,运行SolidWorks需要的电脑配置包括较高的处理器性能、足够的内存和存储空间,以及一块性能良好的显卡。此外,对于大…

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

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

记一次上位机软件线程泄露的分析及解决

上位机软件在客户现场隔一段时间说操作了没反应,但是上位机又没死,出现了一些奇怪现象: 左上角的时间不走了(本来是1s运行一次)使用任务管理器查看,内存占用1.5G,线程有3000多个,正常情况下&am…

将 ONLYOFFICE 文档编辑器与 С# 群件平台集成

在本文中,我们会向您展示 ONLYOFFICE 文档编辑器与其自有的协作平台集成。 ONLYOFFICE 是一款开源办公套件,包括文本文档、电子表格和演示文稿编辑器。这款套件支持用户通过文档编辑组件扩展第三方 web 应用的功能,可直接在应用的界面中使用。…

VMware ifconfig ip报错解决记录

1.报错 ifconfig后出现以下报错 lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 9216 b…

Element-Ui入门教学——<el-upload>限制上传文件类型

要限制<el-upload>上传文件的类型&#xff0c;需要给组件绑定:before-upload属性。 before-upload可选参数, 上传文件之前的钩子&#xff0c;参数为上传的文件&#xff0c;若返回 false 或者 Promise 则停止上传。HTML代码 <template><el-uploadclass"uplo…

竞赛 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

Simulia仿真之CST的使用指南(1) | 百世慧®

前言 CST是Computer Simulation Technology的缩写,是全球范围内众多工程师都喜欢使用的高端电磁仿真分析软件。 本文又名《智慧的CST生活》这里一共列出了120个章节&#xff0c;其中包括CST使用过程中的有用小技巧&#xff0c;还有给用户提供技术支持的过程中常见的问题。本专…

Linux服务器上搭建JupyterNotebook教程

搭建需知 1.确保是Linux服务器&#xff1b; 2.已经在linux服务器上安装好anaconda3&#xff1b; 搭建教程 请按照顺序依次执行下面的命令&#xff1a; 1、安装Jupyter Notebook 执行以下命令&#xff0c;安装jupyter notebook conda install jupyter【注】 如果anaconda3…

maven-compiler-plugin和spring-boot-maven-plugin的区别

两者都能打包&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 格式不同&#xff01;&#xff01;&#xff01;用处不同&#xff01;&#xff01;&#xff01; 以实验为准&#xff0c;下面开始实验&#xff1a; maven-compiler-plugin &…

双11狂欢最后一天

大家好&#xff0c;本年度双11即将到来&#xff0c;为了答谢大家多年来的支持及更广泛的推广VBA的应用&#xff0c;“VBA语言専功”在此期间推出巨大优惠&#xff1a;此期间打包购买VBA技术资料实行半价优惠。 1&#xff1a;面向对象&#xff1a;学员及非学员 2&#xff1a;打…

Android发热监控实践

一、背景 相信移动端高度普及的现在&#xff0c;大家或多或少都会存在电量焦虑&#xff0c;拥有过手机发热发烫的糟糕体验。而发热问题是一个长时间、多场景的指标存在&#xff0c;且涉及到端侧应用层、手机 ROM 厂商系统、外界环境等多方面的影响。如何有效衡量发热场景、定位…

NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

C#动态拦截并覆盖第三方进程的函数,实现函数篡改(外挂)

今天在看之前收藏的一个pdf文档(介绍C#外挂的相关知识的)&#xff0c;结合网上的东西及个人的理解才有了这篇文章。 参考文章&#xff1a; 【精选】一文带解读C# 动态拦截覆盖第三方进程中的函数&#xff08;外挂必备&#xff09;_zls365365的博客-CSDN博客 DotNetDetour - …

UE5数字孪生制作-数据篇(二) - 数据处理

1.卫星图与DEM高度图坐标一致处理 https://www.bilibili.com/video/BV1op4y1V71r?p4&vd_source707ec8983cc32e6e065d5496a7f79ee6 坐标系的调整 先把工程默认坐标调整下&#xff0c;建议调整到3857&#xff0c;在菜单的设置&#xff08;s&#xff09;里找到&#xff0c;修…