TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
- 一、TCP三次握手(Three-way Handshake)
- 二、TCP四次挥手(Four-way Wave)
- 三、常见问题解答
- 总结
- 为什么三次握手不能减少到两次?
- 为什么三次握手不能增加到四次?
- 为什么四次挥手不能减少到三次?
- 总结:
以下是关于TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)的详细整理:
一、TCP三次握手(Three-way Handshake)
目的:建立可靠的TCP连接,确保双方同步序列号并确认通信能力。
过程(分3步):

- 第一次握手(SYN请求)
- 客户端发送TCP报文,设置标志位
SYN=1,随机生成初始序列号Seq=X,表示请求连接。 - 客户端进入
SYN_SENT状态,等待服务器响应。
- 客户端发送TCP报文,设置标志位
- 第二次握手(SYN+ACK响应)
- 服务器收到请求后,发送TCP报文:
- 标志位
SYN=1, ACK=1,确认号Ack=X+1,自身生成初始序列号Seq=Y。
- 标志位
- 服务器进入
SYN_RCVD状态,表示已准备好连接。
- 服务器收到请求后,发送TCP报文:
- 第三次握手(ACK确认)
- 客户端收到服务器的响应后,发送TCP报文:
- 标志位
ACK=1,确认号Ack=Y+1,序列号Seq=X+1。
- 标志位
- 双方进入
ESTABLISHED状态,连接正式建立,开始数据传输。
- 客户端收到服务器的响应后,发送TCP报文:
关键点:
- 通过序列号与确认号机制确保双方同步,防止旧连接数据干扰。
- 第二次握手合并
SYN与ACK,提高效率(服务器确认客户端的连接能力并同步自身序列号)。
二、TCP四次挥手(Four-way Wave)
目的:优雅关闭TCP连接,确保双方数据完全传输并释放资源。
过程(分4步):

- 第一次挥手(FIN请求关闭)
- 客户端发送TCP报文,设置标志位
FIN=1,序列号Seq=U,表示停止发送数据。 - 客户端进入
FIN_WAIT_1状态,等待服务器确认。
- 客户端发送TCP报文,设置标志位
- 第二次挥手(ACK确认关闭请求)
- 服务器收到
FIN后,发送TCP报文:- 标志位
ACK=1,确认号Ack=U+1,序列号Seq=V(当前发送数据的序列号)。
- 标志位
- 服务器进入
CLOSE_WAIT状态,通知应用层处理关闭请求,但仍可向客户端发送剩余数据。
- 服务器收到
- 第三次挥手(FIN请求反向关闭)
- 服务器发送完剩余数据后,发送TCP报文:
- 标志位
FIN=1, ACK=1,确认号Ack=U+1,序列号Seq=W(可能为V+1)。
- 标志位
- 服务器进入
LAST_ACK状态,等待客户端最终确认。
- 服务器发送完剩余数据后,发送TCP报文:
- 第四次挥手(ACK确认反向关闭)
- 客户端收到服务器的
FIN后,发送TCP报文:- 标志位
ACK=1,确认号Ack=W+1,序列号Seq=U+1。
- 标志位
- 客户端进入
TIME_WAIT状态(持续2MSL时间),确认服务器收到后正式关闭。
- 客户端收到服务器的
关键点:
- 四次挥手而非三次:因TCP是全双工模式,双方需独立关闭数据流。
- 2MSL(Maximum Segment Lifetime)等待:
- 确保最后一个
ACK可靠到达服务器,防止连接异常中断。 - 允许网络中未送达的数据包自然消亡,避免新旧连接混淆。
- 确保最后一个
三、常见问题解答
- 为什么建立连接是三次握手,而关闭是四次挥手?
- 三次握手:服务器收到客户端的
SYN请求后,可同时发送SYN(同步序列号)和ACK(确认),因此合并为一次响应。 - 四次挥手:服务器收到
FIN后需先确认(ACK),但可能仍有数据待发送,需延迟发送FIN,导致分两步。
- 三次握手:服务器收到客户端的
- TIME_WAIT状态的作用?
- 防止延迟的重复
FIN或ACK干扰新连接(若立即关闭,可能误认为新连接数据是旧数据)。 - 确保网络中的旧数据包彻底消失(2MSL通常是数据包的生存周期)。
- 防止延迟的重复
总结
三次握手通过“请求-响应-确认”机制建立可靠连接,而四次挥手通过双向独立关闭确保数据完整性。理解这些机制是网络编程和故障排查的基础,尤其在处理连接延迟、丢包等问题时至关重要。
- SYN 请求连接
- ACK 已正确接收数据
- FIN 是一种停止请求信号
- Seq 是 序列号(Sequence Number)的缩写
- Seq=X 中X是一个变量,
- Ack 是 确认号 他也有自己的变量
TCP/IP协议中的三次握手和四次挥手是确保可靠连接建立与关闭的核心机制,其步骤数量经过精心设计,不能随意增减。以下是具体原因:
为什么三次握手不能减少到两次?
- 双向确认需求:
○ 第一次握手(客户端发SYN):服务器确认客户端的发送能力。
○ 第二次握手(服务器发SYN+ACK):客户端确认服务器的接收和发送能力。
○ 第三次握手(客户端发ACK):服务器确认客户端的接收能力。
○ 若减少为两次(如省略第三次握手):
■ 服务器无法确认客户端的接收能力,可能导致连接建立后,客户端无法接收服务器的数据,造成通信失败。 - 序列号同步:
○ 三次握手通过交换Seq和Ack号,确保双方初始序列号同步,避免后续数据传输混乱。
○ 两次握手无法完成双向同步,可能导致数据丢失或重复。
为什么三次握手不能增加到四次?
- 效率与资源消耗:
○ 三次握手已满足可靠性和同步需求,额外步骤会增加延迟和资源消耗(如TCP报文的传输和处理)。 - 无实际增益:
○ 第三次握手的ACK已确认双方状态,再次确认不会提升可靠性,反而可能引入更多潜在问题(如超时重传机制复杂性增加)。
为什么四次挥手不能减少到三次?
- 全双工特性:
○ TCP连接支持双向数据传输(如客户端和服务器可同时发送数据)。
○ 关闭需独立处理两个方向的数据流:
■ 第一次挥手:客户端停止发送数据(FIN)。
■ 第三次挥手:服务器停止发送数据(FIN)。
○ 若合并为三次(如服务器收到FIN后立即发FIN+ACK):
■ 服务器可能仍有数据未发送完,导致数据丢失。
■ 客户端无法区分FIN和ACK的合并响应,可能误判连接状态。 - 确保数据完整性:
○ 第二次挥手(ACK)确认客户端的关闭请求,允许服务器继续发送剩余数据。
○ 第三次挥手(FIN)通知客户端服务器已无数据发送,触发客户端进入TIME_WAIT状态等待确认。
○ 若减少步骤,可能无法保证所有数据已被传输和确认。
总结:
● 三次握手:通过三次交互确保双向通信能力和序列号同步,减少或增加步骤都会破坏可靠性或效率。
● 四次挥手:因TCP全双工特性,必须分别关闭两个方向的数据流,合并步骤可能导致数据丢失或未完成关闭。
这种设计平衡了可靠性、效率和复杂性,是TCP/IP协议核心机制的关键组成部分。
相关文章:
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave) 一、TCP三次握手(Three-way Handshake)二、TCP四次挥手(Four-way Wave)三、常见问题解答总结为什么三次握手不…...
python学智能算法(八)|决策树
【1】引言 前序学习进程中,已经对KNN邻近算法有了探索,相关文章链接为: python学智能算法(七)|KNN邻近算法-CSDN博客 但KNN邻近算法有一个特点是:它在分类的时候,不能知晓每个类别内事物的具…...
【经验】Orin系列Ubuntu远程桌面:VNC、NoMachine、URDC
1、VNC 1.1 Ubuntu端 1)安装VNC服务器 sudo apt install tigervnc-standalone-server2)安装xfce4 桌面 xfce4 用资源较GNOME ,KDE较少。适合老机器,轻量级桌面。与windows界面环境类似。 sudo apt install xfce4 xfce4-goodies也可以使用其它的桌面系统,可以使用如下命…...
【QT:控件】
目录 控件状态:编辑 geometry : window frame windowlcon: qrc机制 qrc的使用方式: window opacity cursor font: ToolTip focusPolicy: styleSheet: 按钮类控件: PushButton: 给按钮添加图标: 给按钮添加快捷键…...
Python(最新版)集成开发环境PyCharm下载安装详细教程
Python 下载和安装 1.进入Python官网 Download Python | Python.org,点击Downloads,这里以Windows为例 2.选择下载Python 3.13.2 Windows 64位的版本。注意:不能在Windows 7 或更早的版本上使用。 3.打开文件,会自动出现安装界…...
PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码
以下是一个使用 PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码。该代码包含训练和可视化部分,假设输入为图片和 4 个工艺参数,根据这些输入生成相应的图片。 1. 导入必要的库 import …...
【BERT和GPT的区别】
BERT采用完形填空(Masked Language Modeling, MLM)与GPT采用自回归生成(Autoregressive Generation)的差异,本质源于两者对语言建模的不同哲学导向与技术目标的根本分歧。这种选择不仅塑造了模型的架构特性,…...
PTA 7-12 排序
题目描述 给定 n 个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素;数据2:11个不…...
uniapp 实现的步进指示器组件
采用 uniapp 实现的一款步进指示器组件,展示业务步骤进度等内容,对外提供“前进”、“后退”方法,让用户可高度自定义所需交互,适配 web、H5、微信小程序(其他平台小程序未测试过,可自行尝试) 可…...
大模型-提示词调优
什么是提示词 提示词(Prompt)在大模型应用中扮演着关键角色,它是用户输入给模型的一段文本指令 。简单来说,就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如,当我们想让模型写一篇关于春天的散文&a…...
【k8s002】k8s健康检查与故障诊断
k8s健康检查与故障诊断 一、集群状态检查 检查节点健康状态 kubectl get nodes -o wide # 查看节点状态及基本信息 kubectl describe node <node-name> # 分析节点详细事件(如资源不足、网络异常) kubectl top nodes …...
统计数字字符个数(信息学奥赛一本通-1129)
【题目描述】 输入一行字符,统计出其中数字字符的个数。 【输入】 一行字符串,总长度不超过255。 【输出】 输出为1行,输出字符串里面数字字符的个数。 【输入样例】 Peking University is set up at 1898. 【输出样例】 4 【输出样例】 #in…...
CentOS 6 YUM源切换成国内yum源
由于 CentOS 6 已于 2020 年 11 月进入 EOL(End of Life),官方软件源已不再提供更新,因此你可能会遇到 yum makecache 命令失败的问题。以下是解决该问题的详细步骤: ### 解决方案 1. **备份原有 yum 源文件** bash …...
继承知识点—详细
一:普通写法 package extend_;public class Extends01 {public static void main(String[] args) {Pubil pubil new Pubil();pubil.name"小明";pubil.age18;pubil.testing();pubil.setScore(60);pubil.showInfo();System.out.println("-----------…...
设备管理VTY(Telnet、SSH)
实验目的:物理机远程VTY通过telnet协议登录AR1,ssh协议登录AR2和sw 注意配置Cloud1: 注意!!博主的物理机VMnet8--IP:192.168.160.1,所以AR1路由0/0/0端口才添加IP:192.168.160.3,每个…...
Linux 中 Git 使用指南:从零开始掌握版本控制
目录 1. 什么是 Git? Git 的核心功能: 2. Git 的安装 Ubuntu/Debian 系统: 验证安装: 3.gitee库 4. Git 的首次配置 配置用户名和邮箱: 查看配置: 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...
Linux 中的 likely 和 unlikely
1. 源码 # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builtin_expect(!!(x), 0) 实际上就是通过GCC 的内建函数 __builtin_expect() 进行编译优化: long __builtin_expect (long exp, long c) 该函数是告诉编译器:参…...
CSS -属性值的计算过程
目录 一、抛出两个问题1.如果我们学过优先级关系,那么请思考如下样式为何会生效2.如果我们学习过继承,那么可以知道color是可以被子元素继承使用的,那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…...
百度贴吧IP和ID是什么意思?怎么查看
在百度贴吧这一充满活力的网络社区中,IP和ID是两个频繁出现的概念。它们各自承载着不同的意义和作用,对于贴吧用户而言,了解这两个概念有助于更好地参与社区互动、保护个人隐私以及维护社区秩序。本文将详细解析百度贴吧中IP和ID的含义&#…...
SpiderX:专为前端JS加密绕过设计的自动化工具
SpiderX 一、工具概述 SpiderX是一款专为解决前端JS加密问题而设计的自动化绕过工具。在网络安全领域,随着前端加密技术的普及,传统的爬虫和自动化测试工具在面对复杂的JS加密时显得力不从心。SpiderX应运而生,旨在通过自动化手段高效绕过前…...
基于银河麒麟系统ARM架构安装达梦数据库并配置主从模式
达梦数据库简要概述 达梦数据库(DM Database)是一款由武汉达梦公司开发的关系型数据库管理系统,支持多种高可用性和数据同步方案。在主从模式(也称为 Master-Slave 或 Primary-Secondary 模式)中,主要通过…...
【AWS入门】AWS云计算简介
【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算?云计算能干什么?我们如何利用云计算?云计算如何实现? 带着一系列问题,我将做一个普通布道者,引领广…...
适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:适合企业内训的 AI 工具实操培训教程 在当今数字化时代,人工智能(AI)技术迅速发展,深度融入到各个领域,AIGC(人工智能生成内容)更是成…...
【数据结构与算法】Java描述:第四节:二叉树
一、树的相关概念 编程中的树是模仿大自然中的树设计的,呈现倒立的结构,我们着重掌握 二叉树 。 1.1 基本概念: 结点的度:一个结点有几个子结点,度就是几; 如上图:A的度为3 树的度࿱…...
【一起来学kubernetes】14、StatefulSet使用详解
一、核心特性二、架构与组件三、生命周期管理四、典型应用场景**五、注意事项与最佳实践六、对比Deployment一、应用场景二、Pod管理三、部署与更新策略四、其他特性 七、常见问题八、拓展 前文中我们介绍了k8s中常用的一种控制器 Deployment,与之向对应的ÿ…...
Day5 结构体、文字显示与GDT/IDT初始化
文章目录 1. harib02b用例(使用结构体)2. harib02c用例3. harib02d用例(显示字符图案)3. harib02e用例(增加字符图案)4. harib02g用例4.1 显示字符串4.2 显示变量值 5. harib02h用例(显示鼠标&a…...
AI第一天 自我理解笔记--微调大模型
目录 1. 确定目标:明确任务和数据 2. 选择预训练模型 3. 数据预处理 (1) 数据清洗与格式化 (2) 划分数据集 (3) 数据加载与批处理 4. 构建微调模型架构 (1) 加载预训练模型 (2) 修改模型尾部(适配任务) (3) 冻结部分层(可…...
ClientAbortException问题分析
最近遇到一个问题,在设备采数据数据上报后频繁发生ClientAbortException异常,一种处理方案是ClientAbortException 问题分析-CSDN博客 一、ClientAbortException 的触发与影响 1. 定义与场景 ClientAbortException 是后端服务器(如 Tomc…...
系统思考全球化落地
感谢加密货币公司Bybit的再次邀请,为全球团队分享系统思考课程!虽然大家来自不同国家,线上学习的形式依然让大家充满热情与互动,思维的碰撞不断激发新的灵感。 尽管时间存在挑战,但我看到大家的讨论异常积极ÿ…...
【开原宝藏】30天学会CSS - DAY1 第一课
下面提供一个由浅入深、按步骤拆解的示例教程,让你能从零开始,逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了,以下示例仅创建四个图标(Facebook、Twitter、Google、LinkedIn),并在每一步…...
