TCP三次握手四次挥手详解
TCP三次握手建立连接的过程:
- 一次握手:客户端发送带有 SYN(seq=x)标志的数据包到服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认。
- 二次握手:服务端收到 SYN 包后,发送带有 SYN+ACK(seq=y,ack=x+1)标志的数据包到客户端,然后服务器进入 SYN_RECV 状态。
- 三次握手:客户端收到 SYN+ACK 包后,发送带有 ACK(ack=y+1)标志的数据包到服务端,然后客户端和服务端都进入ESTABLISHED状态,连接完成。
SYN 指同步序列号,只有在第一次和第二次发起连接请求和连接接受的情况下置为1,seq为随机取值。
seq 指初始化序列号,用于标识客户端将要发送的数据包顺序。确保建立的连接是可靠的传输,不会造成数据丢失和失序。
第一次握手和第二次握手不发送数据,只有第三次握手时才发送数据。
TCP四次挥手释放连接的过程:
- 第一次挥手:客户端发送一个 FIN(seq=x)标志的数据包到服务端,用来关闭客户端到服务端的数据传送,然后客户端进入 FIN-WAIT-1状态。
- 第二次挥手:服务端收到这个 FIN(seq=x)标志的数据包,它发送一个 ACK(ack=x+1)标志的数据包到客户端,然后服务端进入 CLOST-WAIT状态,客户端进入 FIN-WAIT-2状态。
- 第三次挥手:服务端发送一个 FIN(seq=y)标志的数据包到客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
- 第四次挥手:客户端发送 ACK(ack=y+1)标志的数据包到服务端,然后客户端进入 TIME-WAIT状态,服务端在收到ACK(ack=y+1)标志的数据包后进入CLOSED状态,此时如果客户端等待2MSL后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。
1.1. 为什么要三次握手?
三次握手的目的是建立可靠的通信信道,确保客户端和服务端发送及接收数据都是正常的。
- 第一次握手:服务端确认客户端发送正常,服务端接收正常。
- 第二次握手:客户端确认接收发送正常,服务端接收发送正常。
- 第三次握手:服务端确认服务端发送正常,客户端接收正常。
其次是为了防止“已失效的连接请求报文段”被服务器误接收。当网络情况比较复杂的情况下,发送方第一次发送请求后,由于网络原因发生了阻塞,此时客户端会超时重传再次发送请求。如果握手只有两次,那么当连接释放后,之前阻塞的请求到达服务端,服务端此时以为与客户端建立了连接,会分配资源保持这个连接,一直监听等待客户端发送数据,但客户端不会发送请求,造成了服务端资源的浪费。
因此需要服务端发送请求后,客户端响应了服务端的请求进行三次握手后,才算建立了连接,可以发送请求。
1.2. 为什么要四次挥手?
因为TCP通过三次握手建立的是全双工通信,任何一方都可以在数据传送结束后发出连接释放的通知, 当一方想要关闭连接时,不能直接断开,因为另一方可能还有数据需要发送。 某一方发出释放连接请求时,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放的通知,对方确认后完全关闭TCP连接。因此四次挥手保证了双方都确认断开连接,有效防止了未传输完的数据丢失。
- 第一次挥手:客户端发送 FIN,表示它不再发送数据。
- 第二次挥手:服务端收到 FIN,回复 ACK,确认不再接收客户端数据。
- 第三次挥手:服务端发送 FIN,表示它的数据也发送完毕,不再发送数据,请求释放连接。
- 第四次挥手:客户端收到服务端的 FIN,发送 ACK,确认连接关闭。
1.3. 为什么不能把服务端发送的ACK和FIN合并起来,变成三次挥手?
因为服务端收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示服务端收到了客户端发送的断开连接的请求,不再接收客户端发送的数据,但服务端此时仍可以向客户端发送数据,等到数据发完之后再发送 FIN 给客户端,断开服务端到客户端的数据传送。
1.4. 如果第二次挥手时服务端的 ACK 没有送达客户端,会怎样?
客户端在发送 FIN 给服务端后,没有收到服务端发送到 ACK,会重新发送 FIN 请求。
1.5. 为什么要有第四次挥手?
第四次挥手客户端发送 ACK 给服务端的目的是确保服务端知道客户端已经收到关闭请求,服务端可以安全的释放资源并结束连接。否则如果不进行第四次挥手的话,服务端发送 FIN给客户端后,无法知道客户端是否接收到了自己释放连接的请求,导致客户端一直进行等待。如果客户端不发送 ACK,服务端会一直保持 LAST-ACK状态,直至超时或重发 FIN。
1.6. 为什么第四次挥手客户端需要等待 2*MSL(报文最长寿命)时间后才进入CLOSED状态?
因为第四次挥手时,客户端发送给服务端的 ACK 有可能丢失,如果服务端因为某些原因没有接收到 ACK 的话,服务端就会重发 FIN ,如果客户端在 2*MSL的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止服务端没有收到 ACK 而不断重发 FIN。
MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。
相关文章:

TCP三次握手四次挥手详解
TCP三次握手建立连接的过程: 一次握手:客户端发送带有 SYN(seqx)标志的数据包到服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认。二次握手:服务端收到 SYN 包后,发送带有 S…...

了解 如何使用同快充充电器给不同设备快速充电
在这科技发展迅速的时代,快充技术已经走进了我们生活,不得不说有了快充技术的对比,传统的充电模式已经满足不了人们对充电速度的要求。就比如用华为输出100 W快充充电器为手机充电大概需要23分钟充满100%电量,而传统的充电器则需要…...

AGI interior designer丨OPENAIGC开发者大赛高校组AI创作力奖
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...

Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
🧸本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻 📜后续会退出ububtu安装docker教程,敬请期待 📜作者首页&…...

QT day01
自定义实现登录界面: #include "widget.h" #include "ui_widget.h" #include<QPushButton> #include<QLineEdit> #include<QLabel>Widget::Widget(QWidget *parent) //定义有参构造函数: QWidget(parent), ui(new Ui::Widge…...

如何从飞机、电报中提取数据
电报,通常简称TG,是一个跨平台的即时通讯软件。客户端是开源的,而服务器是专有的。用户可以交换加密的、自毁的信息(类似于“阅读后烧伤”),并共享各种文件,包括照片和视频。它的安全性很高&…...

【算法篇】二叉树类(2)(笔记)
目录 一、Leetcode 题目 1. 左叶子之和 (1)迭代法 (2)递归法 2. 找树左下角的值 (1)广度优先算法 (2)递归法 3. 路径总和 (1)递归法 (2…...

Flask学习之项目搭建
一、项目基本结构 1、 exts.py 存在的目的:在Python中,如果两个或更多模块(文件)相互导入对方,就会形成导入循环。例如,模块A导入了模块B,同时模块B又导入了模块A,这就会导致导入循环。 比如在这个项目中…...
**CentOS7安装Maven**
CentOS7安装Maven 首先先解压压缩包apache-maven-3.9.9-bin.tar.gz tar -xvf apache-maven-3.9.9-bin.tar.gz解压完毕后配置环境变量 vim /etc/profile在环境变量配置文件中加入这句话 #Maven export MAVEN_HOME/opt/soft/maven362 //换成自己的路径 export PATH$PATH:$JAVA…...

(undone) MIT6.824 Lecture1 笔记
参考1MIT课程视频:https://www.bilibili.com/video/BV16f4y1z7kn/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考2某大佬笔记:https://ashiamd.github.io/docsify-notes/#/study/%E5%88%86%E5%B8%83%…...
小白投资理财 - 开篇
小白投资理财 - 开篇 第一健身第二提升工作技能第三理财自律和规划 我认为的人生三件大事值得投资,一是强身健体,有个好身体;二是提升工作技能,不断学习工作领域里的新知识;三是投资理财,确保资产不贬值。 …...

高中还来得及选择信息学奥赛赛道吗?
随着信息学奥赛(NOI)在升学中的重要性日益凸显,越来越多的学生和家长将其视为进入顶尖高校的一个重要途径。然而,很多学生可能直到高中阶段才意识到信息学奥赛的重要性,或者才开始对编程产生兴趣。于是问题出现了&…...
01_OpenCV图片读取与展示
import cv2 img cv2.imread(夕阳.jpg, 1) #cv2.imshow(image, img) #此行只能命令行处py文件执行,会弹出一个视频窗口 #cv2.waitKey (0)以下会在jupyter Lab控件中显示读取的图像 #bgr8转jpeg格式 import enum import cv2def bgr8_to_jpeg(value, quality75):ret…...
C语言中的输入控制重要基础
在C语言编程中,处理输入数据是一个常见的任务。根据不同的情况,我们可以采用不同的输入控制方法。本文将介绍三类输入控制方式,分别是已知数据组数的输入、以特定符号结束的输入,以及以EOF结束的输入。 1. 已知数据组数的输入 在…...
Vue 学习
使用 vue 创建一个项目 检查是否已经安装了 npm 和 node npm --version node --version 使用 npm 安装 vue npm install -g vue/cli 检查 vue 工具是否安装成功 vue --version 使用 vue 工具创建一个名为 vue-router-syntax 的项目 这是命令行的创建方式 vue create vu…...

Redis集群的两种方式
1.Redis集群 1.1 搭建主从集群 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写的分离。一般情况下,主节点负责写操作,从节点负责读操作。而从节点如何得知数据呢ÿ…...

QT--基础
将默认提供的程序都注释上意义 0101.pro QT core gui #QT表示要引入的类库 core:核心库 gui:图形化界面库 #如果要使用其他库类中的相关函数,则需要加对应的库类后,才能使用 greaterThan(QT_MAJOR_VERSION, 4): QT wid…...

一、前后端分离及drf的概念
1.1什么是前后端分离 程序角度 前后端不分离:一个程序(如django),接收请求处理HTML模版用户返回 前后端分离:两个程序 --前端:vue.js/react.js/angular.js --后端:Django drf(django rest framework) 2.专业角度 --…...

AI垃圾溢出识别摄像机
随着城市化进程的加快,垃圾处理成为城市管理中的一项重要工作。然而,垃圾桶溢出现象经常发生,给城市环境卫生和市民生活带来不便。为了解决这一问题,AI垃圾溢出识别摄像机 应运而生,利用人工智能技术,实现对…...
【抽代复习笔记】29-群(二十三):生成子群的两道例题及子群陪集的定义
例1:取S3的子集S {(12),(123)},S的生成子群包含哪些元?一个群的两个不同的子集会不会生成相同的子群? 解:(1)S的生成子群就是S3。证明[有不理解之处可以回头看看第27篇笔记中生成子群的定…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...

GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...