当前位置: 首页 > news >正文

TCP的三次握手和四次挥手

文章目录

  • 三次握手
  • 四次挥手
    • TIME_WAIT
    • CLOSE_WAIT
  • 使用wireshark观察

三次握手

握手的最终目的是主机之间建立连接

首先要有两个预备知识点

  1. 三次握手建立连接不一定会成功,其中最担心的就是最后一次握手失败,不过会有配套的解决方案
  2. 建立好连接后是需要被操作系统统一管理起来的。也就是说连接不是随便一连就完事了,操作系统会经过描述组织后管理起来每一次的连接,又因为维护是需要成本的因而连接并不是建立多少个都可以的

对现实生活来说,都是客户端主动去向服务端请求连接。

  1. 第一次握手:客户端向服务端发送连接请求,TCP报文是有类型的,请求建立连接则TCP报头的SYN置1,也就是发送SYN类型的报文,代表申请连接。当客户端发出请求后,此时的状态为SYN_SENT
  2. 第二次握手:服务端接收到请求,由于应答机制则会返回应答,且应答中有着同意连接的响应,因而服务端返回的报文类型为SYN和ACK。当客户端接收到应答时,注意此时的客户端就已经认为连接成功了,但是服务端并没有认为连接成功,对于TCP而言两端是独立的。当服务端发出应答后,状态为SYN_REVD
  3. 第三次握手:客户端接收到应答后,再向服务端返回一次应答。当服务端接收到应答之后,才会认为连接成功了

image-20230814152140636

那么问题来了,既然三次握手可以建立连接,那么一次,两次,四次等可不可以呢

  1. 对于一次和两次而言:上述提到了建立连接后操作系统需要对每个连接维护起来,那么维护需要成本。如果只有一次握手,那么客户端每一次发送请求后,服务端一收到就建立连接成功了。那么如果有很多客户端都发来请求,那么服务端就会承受不住这么多连接了,这就会出现安全问题导致SYN洪水问题并且一次两次握手都只能单向的建立连接,不能确保可靠性。一次握手时,客户端没有收到服务端的应答,就不知道服务端收到了请求并已经建立好连接了。两次握手时,服务端没有收到客户端的应答,就不知道客户端已经收到了响应并建立好了连接
  2. 那么对于三次以上:其实三次以上的握手都是可以的,因为都能确保双向收到应答确保可靠性。但是这样建立连接的效率不高,时间会更长,因为网络通信是需要成本的。

因此,三次握手是可以用最小的成本验证是否建立好连接,并且可以有效的防止单机进行对服务器的攻击

四次挥手

挥手的最终目的是:为了断开主机间的连接

  1. 第一次挥手:主动断开连接端向被动断开连接端发送FIN类型报文,代表不再发送数据,需要断开连接。
  2. 第二次挥手:被动断开连接端收到主动断开连接端的请求,返回应答,此时被动断开端为CLOSE_WAIT状态。
  3. 第三次挥手:被动断开端向主动端发送FIN类型报文,代表不再发送数据,断开连接。此时被动端为LAST_ACK状态
  4. 第四次挥手:主动段收到报文后,向被动端发送应答。主动端此时为TIME_WAIT状态。被动端收到应答后,至此四次挥手完成,连接全部断开

注意上述的不再发送数据,这里的数据指的是用户数据,也就是报文中的有效载荷。因为底层还是会交互管理的报文,只不过是上层会关闭掉套接字文件

image-20230814155039202

主动断开连接端挥手的最终的状态为TIME_WAIT。被动断开连接段两次挥手后会变为CLOSE_WAIT状态

和双方谁是客户端谁是服务端没有关系,在TCP看来两端的地位是平等的

TIME_WAIT

主动断开连接端在挥手完成后需要保持一段时间的TIME_WAIT状态,为什么呢?

  1. 为了尽量确保最后一次的ACK被对方收到
  2. IME_WAIT状态允许操作系统完全释放与TCP连接相关的资源,比如可以在释放该连接的所有相关资源之前确保该连接在网络中的所有数据已经被删除
  3. 如果一个新的TCP连接想要使用与之前CLOSED状态的连接相同的源IP地址和源端口号,而且该连接的目的IP地址和目的端口号与刚关闭的连接相同,那么TIME_WAIT状态可以防止旧连接的数据干扰新连接的数据。

TIME_WAIT状态一般会维持 2 * MSL的时间

MSL:报文的最大寿命,以防止TCP报文在网络中循环传递,避免网络拥塞或因网络故障导致报文无法到达目的地。根据操作系统的 不同值不同,在Centos7中默认为60s。

因此如果是服务器在连接过程中关闭了进程,那么就是服务器主动断开连接,此时是不能够立即重启该端口的。但是也有办法可以立即重启

调用setsockopt接口,设置socket描述符的选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

CLOSE_WAIT

CLOSE_WAIT状态的维持是非常短暂的,只要被动断开端发出断开请求后,这个状态就没有了,也就是第三次挥手。

如果服务器中出现大量的CLOSE_WAIT,这种情况可能是因为

  1. 出现bug,没有做出关闭套接字文件描述符
  2. 服务器压力太大,可能一直在给客户端推送数据,来不及关闭文件

如果这个状态出现的太久,可能会导致资源浪费和连接数量上限的问题。

使用wireshark观察

首先观察握手过程

image-20230814164144203

再看看挥手过程

image-20230814164212984

为什么会只出现3次挥手呢?

实际上是因为TCP具有捎带应答机制,导致第二和第三次挥手重叠在一起了

相关文章:

TCP的三次握手和四次挥手

文章目录 三次握手四次挥手TIME_WAITCLOSE_WAIT 使用wireshark观察 三次握手 握手的最终目的是主机之间建立连接 首先要有两个预备知识点 三次握手建立连接不一定会成功&#xff0c;其中最担心的就是最后一次握手失败&#xff0c;不过会有配套的解决方案建立好连接后是需要被…...

前后端分离------后端创建笔记(08)表单提交

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…...

途乐证券-KDJ分别代表什么?

KDJ是一种技能剖析东西&#xff0c;常见于股票、期货等商场中&#xff0c;它的全称是随机目标&#xff08;KDJ&#xff09;。KDJ目标包括三条线&#xff0c;分别为K线、D线和J线。那么&#xff0c;KDJ分别代表什么呢&#xff1f;本文将从多个视点进行剖析。 1. KDJ的简单介绍 …...

用C语言重写的原始Matlab OpenShoe算法:深入理解和实现步态分析的关键技术

一、引言 在许多领域&#xff0c;如医疗健康、体育科学、虚拟现实和机器人技术中&#xff0c;步态分析都是一个重要的研究领域。步态分析可以帮助我们理解人体运动的机制&#xff0c;评估疾病的影响&#xff0c;优化运动员的表现&#xff0c;甚至设计更自然的机器人运动。Open…...

什么开放式耳机音质好?值得推荐的开放式耳机分享

与封闭式耳机相比&#xff0c;开放式耳机具有更为自然、真实的音质&#xff0c;能够更好地还原音乐现场的声音环境。以下是几款值得推荐的开放式耳机&#xff0c;都来看看有哪些吧。 推荐一&#xff1a;NANK南卡00压开放式耳机 点评&#xff1a;体验最好的开放式耳机没有之一…...

mac harbor的安装

harbor的安装 为什么要整这个呢&#xff0c;因为我在学习k8s&#xff0c;但是需要一个自己的镜像仓库。于是&#xff0c;最开始想到的就是在本地直接部署一个&#xff0c;还比较安全、快速。 直接下载了官方的项目&#xff0c;运行脚本发现出了异常&#xff0c;这种异常我已经…...

SetActive和Enable有什么不同?

介绍 在Unity中&#xff0c;SetActive和Enable都是常用的方法&#xff0c;用于在运行时控制对象的可见性和功能开启状态。尽管它们的目的相似&#xff0c;但在使用时有一些区别。 SetActive SetActive是GameObject类的方法&#xff0c;用于启用或禁用游戏对象及其所有子对象…...

【Vue-Router】重定向

First.vue <template><h1>First Seciton</h1> </template>Second.vue&#xff0c;Third.vue代码同理 UserSettings.vue <template><h1>UserSettings</h1><router-link to"/settings/children1">children1</ro…...

vulnhub靶场之ADROIT: 1.0.1

准备&#xff1a; 攻击机&#xff1a;虚拟机kali、本机win10。 靶机&#xff1a;Adroit: 1.0.1&#xff0c;下载地址&#xff1a;https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova&#xff0c;下载后直接vbox打开即可。 知识点&#xff1a;shell反弹&#xff08;jar&…...

【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【深入理解ES6】字符串和正则表达式

概念 字符串&#xff08;String&#xff09;是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16码位 字符串里的字符有两种&#xff1a; 前 个码位均以16位的编码单元…...

易服客工作室:Pixwell主题 – 现代杂志/WordPress新闻主题

PixWell主题概述 Pixwell主题是一个强大、多用途和现代的WordPress杂志主题&#xff0c;具有像素完美的设计、出色的功能、完全响应和移动友好。它非常灵活&#xff0c;非常适合食谱、时尚、旅行、技术、个人或任何其他很棒的杂志和博客网站。 该主题与 Elementor、Cooked&am…...

iOS手机无法安装Charles 的ssl证书

问题描述 iOS客户端安装证书时一直卡在下载这一步&#xff0c;无法抓包 1、打开Charles&#xff0c;选择help→SSL Proxying→Install Charles Root Certificate on a Mobile Device or Remote Browser 2、按照步骤1中的提示进行操作&#xff0c;手机连接电脑代理&#xff0c;…...

Promise处理异步操作

Promise是一种在JavaScript中处理异步操作的技术。Promise对象表示一个尚未完成的异步操作&#xff0c;它可以在将来的某个时候产生结果。Promise对象的状态可以是未完成、已完成或已拒绝。当Promise对象处于未完成状态时&#xff0c;我们可以附加一个或多个处理程序&#xff0…...

jpa查询返回自定义对象、返回指定VO、POJO

jpa查询返回自定义对象、返回指定VO、POJO jpa查询返回自定义对象、返回指定VO、POJO&#xff0c;JPA查询前会做大量处理&#xff0c;还有线程通知的操作。若并发大&#xff0c;处理性能直线下降。但是jpa就因为做了大量处理&#xff0c;对多数据库兼容极好&#xff0c;操作方…...

抖音小程序开发,收银台支付回调通知

大家好&#xff0c;我是小悟 关于抖音小程序收银台支付&#xff0c;可阅读【抖音小程序开发&#xff0c;唤起收银台&#xff0c;包括抖音支付、支付宝支付、微信支付】。 做支付功能最重要的一步就是异步回调通知&#xff0c;所谓回调通知就是唤起收银台支付&#xff0c;支付…...

selenium 爬虫

selenium 可以动态爬取网页数据&#xff0c;就像真实用户操作浏览器一样&#xff0c;从终端用户的角度测试应用程序&#xff0c;WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器 webdriver下载 因为selenuim对浏览器的版本存在兼容问题&#xff0c;顾需要针对指定浏…...

​亚商投资顾问 早餐FM/0815生成式人工智能服务管理

01/亚商投资顾问 早间导读 商务部等9部门&#xff1a;促进农村大宗商品消费更新换代中央财办等九部门印发指导意见推动农村流通高质量发展《生成式人工智能服务管理暂行办法》今起施行 02/亚商投资顾问 新闻早餐 // 热点聚焦 // 商务部等9部门印发《县域商业三年行动计划&…...

C语言题目的多种解法分享 2之字符串左旋和补充题

前言 有的时候&#xff0c;这个系列专栏中的解法之间并无优劣&#xff0c;只是给大家提供不同的解题思路 我决定将代码实现的过程写成注释&#xff0c;方便大家直接找到对应的函数&#xff0c;只有需要补充说明的知识才会单拿出来强调 这个系列的文章会更的比较慢&#xff0…...

科技云报道:算力之战,英伟达再度释放AI“炸弹”

科技云报道原创。 近日&#xff0c;在计算机图形学顶会SIGGRAPH 2023现场&#xff0c;英伟达再度释放深夜“炸弹”&#xff0c;大模型专用芯片迎来升级版本。 英伟达在会上发布了新一代GH200 Grace Hopper平台&#xff0c;该平台依托于搭载全球首款搭载HBM3e处理器的新型Grac…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...