【JavaEE初阶】网络原理-TCP连接管理之“三次握手和四次挥手”

前言

🌟🌟本期讲解关于TCP协议的重要的机制“连接的建立和断开”~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1.TCP建立连接

1.1连接概念

1.2如何连接(三次握手) 

1.3三次握手的意义

1.第一种意义

2.第二种意义 

3.第三种意义

📚️2.TCP断开连接

 2.1断开连接概念

2.2如何断开连接(四次挥手)

2.3TCP的状态的转化

1.LISTEN状态

2.ESTABLISHED状态

3.CLOSE _WAIT状态

4.TIME_WAIT状态

📚️3.总结


 

 

📚️1.TCP建立连接

1.1连接概念

在之前我们知道TCP的特性之一就是“有连接的”,那我们客户端建立连接是通过在应用程序中进行调用的,然后系统内核帮我们建立连接

连接:所谓的建立连接就是通信的双方保留对方的一些信息数据

那么这里的内核中的连接具体过程如下:

 

1.2如何连接(三次握手) 

 这里就涉及到一个TCP报文段标志位:syn;

此处的syn就是synchronize的首字母缩写,那么此时表示的就是同步的意思,但是在多线程这个场景下,我们叫做加锁;

syn:数据报的特点:

1.不携带载荷,就是没有应用层数据报

2.含有TCP 报头,IP报头,以太网数据帧,这里的TCP报头包含客户端的端口号,IP报头包含客户端的IP地址

具体三次握手过程:

 

那么这里小编就给大家一一解释一下吧:

1.首先客户端向服务器发起请求syn,表示我想和你建立连接;

2.然后服务会发送一个ack表示我收到了信息,然后发送syn表示我愿意建立连接

3.最后客户端最后发送一次ack表示我收到了信息;

 问题一:这里的服务求对于客户端发来的请求都会接收吗?

1.一般情况下,服务求都会进行接受,因为服务器本来就是干这个的;

2.服务器负载极高的境况下,无法进行响应,因为客户端发送过来的请求太多了 ;

问题二:这里的syn在不同场景下的区别

1.在多线程环境下:

这里的synchronized是为了保证多线程下线程的执行顺序,保证线程安全

2.在TCP报文段中:

这里的syn同步是为了进入连接状态,服务器和客户端共同完成一系列工作 

问题三:这里的三次握手体现在哪里,不是四次吗? 

由于这里的网络传输会涉及到包的封装和分用,所以这里两个包合成一个包就会节省开销,并且这里的客户端发送的syn和ack相差的时间不多,所以就可以打包成一个

那么最终的三次握手这里的图如下:

 

注意补充:在三次握手的过程中“确认应答和超时重传机制”这两个特性都是存在的~~~

握手概念:像syn这种数据包,不携带任何数据,没有载荷,没有应用层数据包,没有任何业务逻辑的,我们就任务syn的作用就是“打招呼”,形象的叫做握手~~ 

1.3三次握手的意义

1.第一种意义

三次握手可以针对通信路径,投石问路,确认当前的路径是否是通畅的(这是针对的中间路径

举例:在地铁中,每天早上都有特定的地铁检修工,对地铁的观察修复后,地铁会优先空车跑一路,确认过是否通畅后,在进行接客;

2.第二种意义 

三次握手也在检查发送双方的接受能力和发送能力是否正常(这是针对的通信的两端) 

举例:假如双方打游戏交流连麦的时候,我会首先说“喂喂喂,听得到吗?”,对方回“听到了”(此时我们就知道我的麦没有问题,然后它的耳机没有问题)然后我再回“好的”,那么此时 (我的耳机没有问题,他知道它的麦就没有问题);

3.第三种意义

三次握手也是为了协商一些重要的参数,通信是双方的事情,其中有些内容就要保持一致

这里的协商就是在选项里体现(最多40个字节) ,报头固定位20字节,然后这里的tcp报头最大就是60字节;

这里的重要一部分关键就是“通信序号

这里的每次通信连接,通信序号相差很大,不是0,1开始的,那么就解决了一下问题:

举例:假如在三次握手四次挥手结束后,由于网络传输存在“先发后至的情况,那么就会导致一个数据堵车”,在第二次三次握手通信后才传输到,那么就会由于前面的包的序号和此次的传输的包序号相差很大就会将这个数据丢弃~~~

📚️2.TCP断开连接

 2.1断开连接概念

我们知道建立连接即时双方保存对端的信息,当信息太多了就会存储到数据结构中,那么下面就是断开连接的概念

断开连接:所谓的断开连接就是通过将数据结构中保存对方的信息给删除掉

注意:此处提到的断开连接需要的四次挥手是一种“和离”,不是所有的断开都是四次分手,涉及到不是“和离”的,那么断开连接还有其他的方式;

2.2如何断开连接(四次挥手)

这里就涉及到一个重要的TCP报文段标志位:fin

这里的fin标志位代表的意思就是提出要断开连接了,此时注意:

 这里和三次握手不一样,这里的提出带有fin标志位的TCP报文段可以是通信双方,而三次握手提出syn的只能是客户端

此时四次挥手的过程具体如下:

此时就可以看到,解释:

1.客户端发送fin标志的TCP报文段,然后这里表示我要与你断开连接

2.然后这里服务器内核自动发送ack,表示我已经收到了断开连接的信息

3.然后通过应用程序调用close实现发送fin表示我也要和你断开

4.最后客户端发送ack表示我收到消息了 

此时就完成了四次挥手的操作;

1.问题一:为啥这里的中间的两步不能像三次挥手一样进行合并的操作呢?

       这里的合并只能说是“如和”,一般情况下,由于fin是通过close来进行触发,假如客户端进程结束了那么就会触发close操作,而服务器内核会自动发送ack,就会导致fin通过应用程序调用,那么这两个标志位的报文段相差的时间就会比较长那么就无法进行合并了~~

2.问题二:这里的四次挥手和三次握手的区别与相似点是什么?

1.相似之处:

两种都会给对方发送一个fin/syn,然后给对方返回一个ack;

发送的顺序都是:syn/ack/syn/ack,与fin/ack/fin/ack,然后这里中间的位置都是同一台机器发送的~~~

2.不同之处:

这里的不同之处即:三次握手中间部分一定能合并,然后四次挥手中间部分不一定能合并;

三次握手一定是客户端发起的,四次挥手不一定是客户端发起的,还有可能是服务器

2.3TCP的状态的转化

1.LISTEN状态

这里表示的是服务已经执行了serverSocket,已经绑定了端口号与IP地址了,表示可以建立连接了~~~ 

我们通过前一期写过的TCP回显服务器来进行举例,我们启动服务器:

然后通过在命令提示符中输入:netstat -ano | findstr 3456;

C:\Users\Administrator>netstat -ano | findstr 3456
  TCP    0.0.0.0:3456           0.0.0.0:0              LISTENING       12828
  TCP    [::]:3456              [::]:0                 LISTENING       12828

 可以看到此时就是LISTEN状态;

解释:从左到右是:本端,外端,状态,程序的“身份证号”,此时由于没有客户端,所以这里对端就是0.0.0.0:0;

2.ESTABLISHED状态

表示客户端已经建立完毕,三次握手已经完成了,准备通信了~~

这里我们就直接启动客户端:

那么此时继续使用刚才的命令:

C:\Users\Administrator>netstat -ano | findstr 3456
  TCP    0.0.0.0:3456           0.0.0.0:0              LISTENING       12828
  TCP    127.0.0.1:3456         127.0.0.1:61966        ESTABLISHED     12828
  TCP    127.0.0.1:61966        127.0.0.1:3456         ESTABLISHED     10376
  TCP    [::]:3456              [::]:0                 LISTENING       12828

那么此时就可以看到,中间部分已经建立了链接标志,此时表示的就是本机的端口,本机随机分配的端口;

3.CLOSE _WAIT状态

这里表示接下来的代码要调用close来发送fin,这里是为收到fin的一段进入的状态

4.TIME_WAIT状态

即本端发送fin后,等待对端发送fin,此时就进入TIME_WAIT状态

这里的TIME_WAIT状态的意义:防止最后一个ack发生丢包的,然后进行重传;

如果TIME_WAIT状态下,TCP断开连接,那么就会导致f重传fin后,无法送到ack(在) 会导致增加系统资源的开销,(这里存在确认应答与超时重传)(只有保存对端在数据结构的信息,才能建立连接,提供一系列的操作,才会返回ack)

📚️3.总结

💬💬本次小编主要讲解了关于TCP中重要的机制“三次握手,四次挥手” 的重要操作,即建立连接和断开连接,以及最后提及的TCP状态的转化~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                              😊😊  期待你的关注~~~

 

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

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

相关文章

Linux 部署 mysql

Linux(四)- Ubuntu安装Mysql_mysql-community-server-core depends on libaio1 (>-CSDN博客 #创建用户 打开终端。 登录到MySQL服务器: mysql -u root -p 创建新用户。替换new_user为您想要的用户名,password为新用户的密码&am…

python异常监测-ARIMA(自回归积分滑动平均模型)

系列文章目录 Python异常检测- Isolation Forest(孤立森林) python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子(LOF)算法 Python异常检测- DBSCAN Python异常检测- 单类支持向量机(…

python之数据结构与算法(数据结构篇)-- 元组

一、元组的概念 其实,所谓的“元组”就是一组不能改变的特殊数组(一般情况下),这里我们去创建一个“小羊元组”,大家就能更加明白其中的意思了。 二、元组实现思路 1.我们去定义一个“羊村小羊”的元组 # 创建一个"羊村小羊"的元…

SystemC学习(2)— APB_SRAM的建模与测试

SystemC学习(2)— APB_SRAM的建模与测试 一、前言 二、APB_SRAM建模 编写APB_SRAM模型文件apb_sram.h文件如下所示: #ifndef __APB_SRAM_H #define __APB_SRAM_H#include "systemc.h"const int ADDR_SIZE 32; const int DATA_…

【专题】计算机网络之数据链路层

数据链路层的地位:网络中的主机、路由器等都必须实现数据链路层。 数据链路层信道类型: 点对点信道。 使用一对一的点对点通信方式。 广播信道。 使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调这些主机的数据发送。 1. 使用点对点信道…

三次握手与四次挥手

1.三次握手 1.1状态机 客户端 SYN_SENT:客户端发送SYN报文段请求建立连接 ESTABLISHED:在收到服务端发来的SYN请求报文以及确认报文后就建立客户端到服务端的连接 服务端 LISTEN:一开始时LISTEN状态,等待客户端的SYN请求 SY…

群晖系统基本命令

切换超级管理员 sudo -i 查询系统 运行的所有服务 synoservicecfg --list 启动服务命令(该命令需要使用超级管理员) #老版本群晖使用synoservice命令 synoservice --start 服务名称#新版本群晖使用systemctl命令 systemctl start 服务名称 synoservice所管理的服务配置文…

MySql数据库中数据类型

本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库): 目录如下: 目录 数值类型 1. 整数类型 2. …

【网站项目】SpringBoot397学校财务管理系统

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

【论文阅读】SRGAN

学习资料 论文题目:基于生成对抗网络的照片级单幅图像超分辨率(Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network)论文地址:https://arxiv.org/abs/1609.04802 代码:GitHub - x…

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节|征文# 🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 (一)安装 Selenium 库 &#xff0…

SpringBoot项目里怎么简单高效使用Redis?我选择使用Lock4j

文章目录 前言正文1、Lock4j的代码仓库2、pine-manage-common-redis的项目结构3、pine-manage-common-redis 的完整代码3.1 maven依赖:pom.xml3.2 redis连接参数:application.yaml3.3 RedisCache.java3.4 CacheConfig.java3.5 RedissonClientUtil.java3.…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

Redisson(三)应用场景及demo

一、基本的存储与查询 分布式环境下&#xff0c;为了方便多个进程之间的数据共享&#xff0c;可以使用RedissonClient的分布式集合类型&#xff0c;如List、Set、SortedSet等。 1、demo <parent><groupId>org.springframework.boot</groupId><artifact…

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候&#xff0c;sg是要检查门的极性的。 如果qualifier和src经过与门汇聚&#xff0c;在同另一个src1信号或门汇聚&#xff0c;sg是报unsync的。 假设当qualifier为0时&#xff0c;0&&src||src1src1&#xff0c;src1无法被gat…

Mysql入门3——多表操作、事务、索引

Mysql入门3——多表操作、事务、索引 一、多表设计 ​ 在项目开发中&#xff0c;在进行数据库表的结构设计时&#xff0c;会根据业务需求及业务模块之前的关系&#xff0c;分析并设计表的结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表之间也存在着各种关系&am…

基于SSM的智慧篮球馆预约系统

前言 近些年&#xff0c;随着中国经济发展&#xff0c;人民的生活质量逐渐提高&#xff0c;对网络的依赖性越来越高&#xff0c;通过网络处理的事务越来越多。随着智慧篮球馆预约的常态化&#xff0c;如果依然采用传统的管理方式&#xff0c;将会为工作人员带来庞大的工作量&a…

css设置滚动条样式

效果图&#xff1a; // 滚动条样式 div::-webkit-scrollbar {width: 4px; } /* 滚动条滑块&#xff08;里面小方块&#xff09; */ div::-webkit-scrollbar-thumb {border-radius: 10px;-webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);opacity: 0.2;background-color…

【面试经典150】day 8

#1024程序员节 | 征文# 作为一个未来的程序员&#xff0c;现在我要继续刷题了。 力扣时刻。 目录 1.接雨水 2.罗马数字转整数 3.最后一个单词的长度 4.最长公共前缀 5.反转字符串中的单词 1.接雨水 好好好好好好&#xff0c;一开始就接雨水。我记得接了n次了。。。 痛苦战…

【读书笔记·VLSI电路设计方法解密】问题25:为什么时钟如此重要

时钟是一种在高电平和低电平之间振荡的电信号。它通常是一个具有预定周期(频率)的方波,如图3.6所示。在同步数字电路中,时钟信号协调芯片上所有电路元件的动作。电路在时钟信号的上升沿、下降沿或两者的边缘处变为活动状态以实现同步。时钟信号相关问题是任何VLSI芯片设计中…