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篇笔记中生成子群的定…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
