三次握手,四次挥手的大白话版本

三握四挥

首先我们要知道握手和挥手是在做什么,握手是为了让客户端和服务端建立连接,挥手是为了让客户端和服务端断开连接,握手时客户端主动发起请求,挥手双方都能发起请求。

三次握手

有必要解释一下,SYN的意思是同步,意思是客户端想要与服务端建立连接,1表示打开,0表示关闭

ACK是确认的意思,表示服务端确认收到请求或者其他确认的意思,1表示打开即确定确认,0表示关闭,即不想确认;

而seq,ack,可以理解为加密的意思,都是客户端无规律生成的加密值,为了防止黑客在握手过程中干涉;(seq是自己生成的序列号,相当于自己发给对方的加密值,对方想要和自己握手,就需要携带这个加密值+1握手,ack是对方生成的序列号,你要是想和对方再次握手,就需要下次发送对方的序列号+1,让对方知道还是你了); seq是序号,ack是确认号

1.随着第一次握手将想要建立连接的请求SYN,以及加密值seq发送过去,服务端收到SYN=1后理解了客户的需求是想要建立连接,

2.也发送了一个加密值,seq=y,并将客户的加密值x+1也发送过去(发送x+1是为了让对方知道自己是正确的服务端,发送y是为了第三次握手时检验是否还是第一次的客户端,是否已经被黑客提前替代了),客户收到ack的值会自动进行-1操作,并与自己之前生成的x作比较,发现相同,说明客户端还是客户端了,而收到ACK=1,SYN=1说明服务端同意了连接的请求,还收到了一个y值,这个是一个服务端随机生成的加密值,为的是第三次握手时,确认客户端是不是还是第一次握手的客户端了

3.当客户端返回ACK=1,表示确认,并发送seq=x+1,ack=y+1,服务端自动-1,发现是y值,说明这个就是之前和自己通信的服务端,发现是x值,说明是和自己建立连接的客户端,再通俗一点(x是确认对方是第一次握手发送消息的客户端,y是确认对方是第二次握手收到自己消息的客户端),二者缺一不可;

都有了之后,两个就建立连接;开始进行http通信;

可以看下边的实例加深理解;

image-20240220092031691

image-20240220092231597

四次挥手

image-20240220095602650

先说FIN意思是结束,为1表示想要结束;

ACK仍然是确认

以客户端主动发起结束为例

1:客户端先向服务端发送FIN=1,seq=序号 u,向服务端表示自己想关闭连接了

2 服务端收到FIN=1,知道客户端要关闭了,发送ACK确认收到,并发送自己的序号和客户端刚刚发送到确认号+1,但由于服务端是被动收到客户端要关闭,所以需要一些时间来处理未处理完的数据,服务端会将未处理完的数据发给客户端;

3 待数据全部处理完成后,客户端再次向服务端发送FIN=1,表示自己也可以结束了,并发送ACK=1确认,发送确认号和自己的序列号,

4 客户端收到后返回ACK=1,以及确认号,序列号,两方都关闭连接;

Time-Wait相关问题

等等:看图片还有一个等待2MSL是什么呢?为什么要等2MSL才关闭呢。我们可以看图,右侧服务端只有在收到最后一次挥手后才会关闭,但有时也会出现异常,服务端没有收到客户端的最后一次挥手,导致迟迟无法关闭,而客户端又早早关闭,为了防止这种情况,当服务端没有收到第四次握手的请求时,会一直发送第三次挥手,告诉客户端重新发送第四次挥手,这中间的2MSL时间就是为了在意外情况下,给客户端重新发送第四次挥手的时间。每进行过一次第四次挥手,2MSL都会刷新,直到服务端没有再次发送第三次挥手为止,表示服务端终于收到第四次的挥手了,客户端也能安安心心关机了;

time-wait占用资源过多问题的解决方案

但是,伴随着这个就又出现了新的问题,每次断开客户端都要多等待2MSL,当高并发时,大量断开连接,所有端口都是处于等待过程中,端口很快就用完了,

解决方法:

  1. 优化连接管理
    • 在高并发环境中,对于长时间处于 TIME_WAIT 状态的连接,可以适当调整系统的 TCP 参数,例如减少 TIME_WAIT 时间、增加可用端口范围等,以释放被占用的端口资源。
  2. 连接复用
    • 在一些场景中,可以考虑使用连接复用技术,例如 HTTP/1.1 的 Keep-Alive 和 HTTP/2 的连接复用等。通过复用已经建立的连接,可以减少连接的建立和关闭次数,从而减少了四次挥手所占用的端口资源。
  3. 使用连接池
    • 对于需要频繁创建和关闭连接的应用,可以考虑使用连接池来管理连接资源。连接池可以预先创建一定数量的连接,并在需要时从连接池中获取和释放连接,从而减少了连接的创建和关闭次数,减轻了对端口资源的压力。
  4. 增加端口资源
    • 如果系统确实遇到了端口资源不足的问题,可以考虑增加系统的端口资源。可以通过调整操作系统的参数或者增加硬件资源来提高系统的端口容量,从而满足高并发环境下的连接需求。
  5. 使用更高级的网络协议
    • 有些高级的网络协议,如 UDP、WebSocket 等,可以避免 TCP 四次挥手的开销。在一些场景下,可以考虑使用这些协议来替代 TCP,从而降低连接管理的复杂度和开销。

相信大家都有个疑问,为什么客户端两次发送的序列号不一样呢,其实是因为在两次握手之间,服务端又向客户端发送了数据,导致序列号会发生改变,这点需要注意一下;

image-20240220102727572

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

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

相关文章

OLED示例程序、keil的调试模式

调试方式 串口调试:通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息 显示屏调试:直接将显示屏连接到单片机,将调试信息打印在显示屏上 Keil调试模式:借助Keil软件的调试模式&#xf…

Vue模版语法之属性绑定v-bind

双大括号不能在 HTML 属性中使用。想要响应式地绑定一个属性&#xff0c;应该使用 v-bind 指令 1. 使用v-bind绑定属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>新建页面</title><sc…

pclpy 安装和使用

pclpy 安装和使用 一、安装pclpy二、问题与解决方法三、测试四、测试结果五、相关链接 一、安装pclpy pclpy是点云库(PCL)的Python绑定。使用CppHeaderParser和pybind11从头文件生成。这个库正在积极开发中&#xff0c;目前Windows只支持python 3.6 x64 和 python3.7&#xff…

Arcgis小技巧【17】——如何修改ArcGIS中影像的背景颜色

一、问题分析 在ArcGIS中&#xff0c;有时候会遇到影像有背景色&#xff0c;看上去很不美观。 尤其在多个影像叠加的时候&#xff0c;更是会造成遮挡的问题。 二、解决办法 首先&#xff0c;用【识别】工具在背景色是点击一下&#xff0c;查看弹出的窗口&#xff0c;记住背景…

Leetcode1206(设计跳表)

例题&#xff1a; 分析&#xff1a; 我们先来找一找跳表与单链表的相同点和不同点。 相同点&#xff1a; 跳表和单链表一样&#xff0c;都是由一个一个的节点组成的链表。 不同点&#xff1a; ①&#xff1a;跳表中的元素已经是排好序的&#xff08;图中从小到大&#xff09;&…

Spring Cloud Alibaba-04-Sentinel服务容错

Lison <dreamlison163.com>, v1.0.0, 2023.09.10 Spring Cloud Alibaba-04-Sentinel服务容错 文章目录 Spring Cloud Alibaba-04-Sentinel服务容错高并发带来的问题服务雪崩效应常见容错方案Sentinel入门什么是Sentinel微服务集成Sentinel安装Sentinel控制台 实现一个接…

【Vue】v-for中:key中item.id与Index使用的区别

先说结论&#xff0c;推荐使用【:key"item.id"】而不是将数组下标当做唯一标识&#xff0c;前者能做到全部复用 场景&#xff1a;删除无序列表中的<li>标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

nginx的功能以及运用

nginx与apache的对比 nginx优点 nginx使用场景 编译安装nginx过程 1.先清空opt文件夹 2.关闭防火墙&#xff0c;关闭防护 3 安装依赖包&#xff0c;可以通过本地yum去安装 首先就是挂载&#xff0c;随后切换到配置文件中修改 4本地配置文件配置内容 5 随后安装环境包 yum -y …

NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!

NoSQL 数据库管理工具&#xff0c;搭载强大支持&#xff1a;Redis、Memcached、SSDB、LevelDB、RocksDB&#xff0c;为您的数据存储提供无与伦比的灵活性与性能&#xff01; 【官网地址】&#xff1a;http://www.redisant.cn/nosql 介绍 直观的用户界面 从单一应用程序中同…

鸿蒙Next怎么升级,有便捷的方法?

早在2023年11月&#xff0c;市场上有自媒体博主表示&#xff0c;华为HarmonyOS NEXT的升级计划是2X年底到2X年初完成一亿部&#xff0c;2X年底完成三亿部。虽然该博主没有明确具体年份&#xff0c;但预计是2024年底2025年初升级一亿部HarmonyOS NEXT设备&#xff0c;2025年底完…

计算机网络Day1--计算机网络体系

1.三网合一 电信网络、广播电视网络、计算机网络&#xff08;最基础最重要发展最快&#xff09; 2.Internet 名为国际互联网、因特网&#xff0c;指当前全球最大的、开放的、由众多网络相互连接而成的特定互连网&#xff0c;采用TCP/IP 协议族作为通信的规则&#xff0c;前…

Python学习-用Python设计第一个游戏

三、用Python设计第一个游戏 1、新建文件 使用IDLE的编辑器模式&#xff0c;新建一个文件&#xff0c;点击File—>New File 2、将下面的游戏代码敲入进去 """用Python设计第一个游戏"""temp input("不妨猜一下小甲鱼现在心里想的是…

openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优

文章目录 openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优224.1 全局并发队列224.2 局部并发队列 openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优 数据库提供两种手段进行并发队…

maven插件exec-maven-plugin、maven-antrun-plugin使用详解

文章目录 前言一、exec-maven-plugin使用exec:java的使用idgoalsphaseconfigurationexec:exec的使用使用exec-maven-plugin来构建前端项目直接用mvn命令来使用exec-maven-plugin插件 二、maven-antrun-plugin使用echo打印功能拷贝文件拷贝文件夹ftp/scp/sshexec 总结 前言 在使…

【Flink状态管理(八)】Checkpoint:CheckpointBarrier对齐后Checkpoint的完成、通知与对学习状态管理源码的思考

文章目录 一. 调用StreamTask执行Checkpoint操作1. 执行Checkpoint总体代码流程1.1. StreamTask.checkpointState()1.2. executeCheckpointing1.3. 将算子中的状态快照操作封装在OperatorSnapshotFutures中1.4. 算子状态进行快照1.5. 状态数据快照持久化 二. CheckpointCoordin…

【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

认识K8S

K8S K8S 的全称为 Kubernetes (K12345678S) 是一个跨主机容器编排工具 作用 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群…

深入理解java虚拟机---自动内存管理

2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是依赖用户线程的启动和结束而建立和销…

基于python社交网络大数据分析系统的设计与实现

项目&#xff1a;基于python社交网络大数据分析系统的设计与实现 摘 要 社交网络大数据分析系统是一种能自动从网络上收集信息的工具&#xff0c;可根据用户的需求定向采集特定数据信息的工具&#xff0c;本项目通过研究爬取微博网来实现社交网络大数据分析系统功能。对于采集…

Echarts图例如何将选中与未选中状态配置成不同图形

背景 使用Echarts实现功能过程中&#xff0c;由于用户感觉Echarts图例的原生图案(例如圆形)不能直观地表现出该处可以点击筛选展示&#xff0c;故设计将选中的图例与未选中的图例设置成两种不同的图形(多为勾选与未勾选)。Echarts原生功能可以配置图例图案&#xff0c;但无法直…