“三次握手”与“四次挥手”:TCP传输控制协议连接过程
目录
什么是TCP协议
“三次握手”建立连接
“四次挥手”断开连接
“三次握手”和“四次挥手”的反思
总结
什么是TCP协议
想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这封信能够完整、准确地传递,你们制定了一系列规则,比如谁先说、如何确认对方听到了、如果听不清怎么办。这些规则,就像是TCP协议(Transmission Control Protocol,传输控制协议)在计算机网络中的作用。
TCP的基本概念
TCP 是一种面向连接的、可靠的、基于流的传输协议,运行在传输层。它主要用于确保数据能完整、准确地从一台计算机传输到另一台计算机,即使网络环境并不稳定。
简单理解:
- 面向连接:就像打电话一样,TCP 需要在数据传输前先建立一条稳定的通信线路(连接)。
- 可靠传输:TCP 确保数据不会丢失、不会重复、不会乱序,就像你确保信件被完整送达。
- 流式传输:TCP 以数据流的方式传输数据,而不是像快递那样一次性把所有内容打包。
“三次握手”建立连接
在TCP通信开始前,必须先建立连接,这就像是打电话时要先拨号、等待对方接听,然后确认对方能听清楚。
当客户端(Client)和服务器(Server)建立TCP连接时,会经历“三次握手”过程。其目的是:
确保客户端和服务器都具备发送和接收能力。
协商初始序列号(ISN,Initial Sequence Number),防止数据包混乱。
假设客户端A想要与服务器B建立连接:
第一次握手(SYN)
- 客户端A发送一个 SYN(同步)数据包给服务器B,请求建立连接。
- 该数据包包含:
- SYN=1(表示请求建立连接)
- 初始序列号 ISN(A)(用于数据传输的编号,防止乱序)
- 这时,客户端A进入 SYN_SENT(同步已发送) 状态。
第二次握手(SYN-ACK)
- 服务器B收到SYN请求后,回应一个 SYN-ACK(同步-确认)数据包。
- 该数据包包含:
- SYN=1(表示服务器同意建立连接)
- ACK=1(表示确认收到客户端的SYN请求)
- 服务器的初始序列号 ISN(B)
- 确认号 ACK=ISN(A)+1(表示已收到客户端的SYN)
- 服务器B进入 SYN_RECV(同步已收到) 状态。
第三次握手(ACK)
- 客户端A收到服务器B的SYN-ACK后,发送一个 ACK(确认)数据包。
- 该数据包包含:
- ACK=1(确认连接)
- 序列号 = ISN(A)+1
- 确认号 ACK=ISN(B)+1(表示已收到服务器的SYN)
- 服务器B收到ACK后,连接正式建立,双方进入 ESTABLISHED(已建立) 状态。
至此,TCP连接成功建立,双方可以开始数据传输。

TCP如何保证数据可靠传输?
TCP 采用了多个机制来确保数据不会丢失、不会重复、不会乱序。
数据包的编号与确认
每个TCP数据包都会有一个序列号(Sequence Number),而接收方会发送确认号(Acknowledgment Number) 来确认收到的数据。
例如:客户端发送 Seq=1000 的数据包,服务器收到后,会回复 Ack=1001,表示已成功接收。
如果服务器没有收到这个数据包,它不会发送 Ack=1001,这样客户端就知道数据丢失了,需要重新发送。
超时重传
如果客户端发送了数据包,但一直没有收到确认(ACK),就会在一定时间后重发数据,直到对方确认收到。
- 这类似于寄快递时,如果包裹长时间未送达,快递员可能会重新派送。
流量控制
TCP 允许接收方通过滑动窗口机制控制数据发送速度,避免发送方数据过快而接收方处理不过来。
例如:如果服务器处理能力有限,它可以告诉客户端“慢点发,我忙不过来了”,客户端就会降低发送速度。
拥塞控制
当网络拥堵时,TCP 会自动降低发送速率,以防止网络进一步恶化。
这就像高速公路上遇到堵车时,大家会自动放慢速度,避免发生更严重的交通事故。
“四次挥手”断开连接
当通信结束时,TCP使用“四次挥手”来关闭连接。其目的是:
- 确保双方都完成数据传输后,安全地关闭连接。
- 防止数据丢失,确保所有数据包都被正确接收。
假设客户端A想要断开与服务器B的TCP连接:
第一次挥手(FIN)
- 客户端A发送 FIN(终止)数据包,表示“我不想再发送数据了”。
- 该数据包包含:
- FIN=1(请求关闭连接)
- 序列号 seq=U(U是当前数据序列号)
- 客户端A进入 FIN_WAIT_1(终止等待1) 状态。
第二次挥手(ACK)
- 服务器B收到FIN后,发送一个 ACK(确认)数据包。
- 该数据包包含:
- ACK=1(确认关闭请求)
- 序列号 = V
- 确认号 ACK=U+1(确认收到FIN)
- 服务器B进入 CLOSE_WAIT(关闭等待) 状态,等待完成剩余的数据传输。
- 客户端A进入 FIN_WAIT_2(终止等待2) 状态,等待服务器B发送FIN。
第三次挥手(FIN)
- 服务器B数据传输完成后,主动发送 FIN(终止)数据包,表示“我也不想再发送数据了”。
- 该数据包包含:
- FIN=1(请求关闭)
- 序列号 seq=W
- 服务器B进入 LAST_ACK(最后确认) 状态,等待客户端的最后ACK。
第四次挥手(ACK)
- 客户端A收到服务器B的FIN后,发送一个 ACK(确认)数据包,表示“确认关闭”。
- 该数据包包含:
- ACK=1(确认关闭请求)
- 序列号 = X
- 确认号 ACK=W+1(确认收到FIN)
- 服务器B收到ACK后,立即进入 CLOSED(关闭) 状态,释放连接。
- 客户端A等待 TIME_WAIT(通常是2倍的MSL时间,默认240秒)后,最终进入 CLOSED 状态,连接彻底关闭。
至此,TCP连接完全关闭,确保所有数据包已经被正确处理。

“三次握手”和“四次挥手”的反思
为什么 TCP 需要三次握手,而不是两次?
两次握手可能会导致已失效的 SYN 报文被服务器误认为是新的连接,从而建立了一个无效连接。而三次握手可以确保双方都明确对方的接收和发送能力。例如,客户端发出的 SYN 因为网络问题被延迟,服务器收到后认为是新的连接请求并建立连接,但客户端并不知情,导致连接状态不同步。
三次握手能够确保:
客户端确认服务器的 接收能力。
服务器确认客户端的 接收能力。
双方都确认了彼此的 发送和接收能力,确保连接有效。
为什么 TCP 需要四次挥手,而不是三次?
因为 TCP 是全双工通信,数据的发送和接收是独立的,一方发出 FIN 只表示它不再发送数据,但仍然可以接收数据,所以另一方要单独再发送 FIN 以表示自己也不再发送数据,这就导致了四次挥手。
为什么A在TIME-WAIT状态必须等待2MSL的时间
MSL最长报文段寿命Maximum Segment Lifetime,MSL=2
这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
总结:
- 确保 B 已经收到 A 的最后一个 ACK,若 B 没收到,会重发 FIN,A 需要有时间处理。
- 防止历史连接中的旧报文在网络中滞留,影响后续新的连接。
总结
三次握手(TCP 连接建立)
A -> B(SYN):A 发送 SYN 报文,表示请求建立连接,进入 SYN-SENT 状态。
B -> A(SYN-ACK):B 收到 SYN 后,发送 SYN-ACK 报文,表示同意建立连接,进入 SYN-RECEIVED 状态。
A -> B(ACK):A 收到 SYN-ACK 后,发送 ACK 报文,B 进入 ESTABLISHED 状态,A 也进入 ESTABLISHED 状态,连接建立完成。
四次挥手(TCP 连接释放)
A -> B(FIN):A 发送 FIN 报文,表示不再发送数据,进入 FIN-WAIT-1 状态。
B -> A(ACK):B 收到 FIN 后,发送 ACK,表示确认,进入 CLOSE-WAIT 状态;A 收到 ACK 后,进入 FIN-WAIT-2 状态。
B -> A(FIN):B 处理完剩余数据后,发送 FIN 报文,进入 LAST-ACK 状态。
A -> B(ACK):A 收到 FIN 后,发送 ACK 报文,进入 TIME-WAIT 状态,等待 2MSL;B 收到 ACK 后,进入 CLOSED 状态。
A 进入 CLOSED 状态:等待计时器 2MSL 结束后,A 进入 CLOSED 状态,连接彻底关闭。
相关文章:
“三次握手”与“四次挥手”:TCP传输控制协议连接过程
目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这…...
OpenCV形态学操作
1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...
深入理解WebSocket接口:如何使用C++实现行情接口
在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...
汇能感知的光谱相机/模块产品有哪些?
CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…...
抓包工具是什么?
抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程,查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释: 1. 主要功能 捕获数据包:抓包工具能够实时捕…...
Kubernetes的Ingress 资源是什么?
在Kubernetes中,Ingress资源是一种用于管理集群外部对内部服务访问的API对象,主要用于将不同的外部请求路由到集群内的不同服务,以下是关于它的详细介绍: 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…...
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
业务场景 发布信息,更新到数据库MySQLCOS操作,更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…...
DevOps自动化部署详解:从理念到实践
在软件开发日益快速迭代的今天,如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生,它打破开发、测试、运维之间的壁垒,通过自动化工具和流程,实现持…...
LeetCodehot 力扣热题100
class Solution { public:int max_sum INT_MIN; // 初始化为最小值,确保能够处理所有可能的路径和int maxPathSum(TreeNode* root) {dfs(root);return max_sum;}int dfs(TreeNode* root) {if (root nullptr) return 0; // 如果是空节点,返回0// 递归…...
解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025
2025 年 3 月 11-13 日,全球规模最大的嵌入式展览会——Embedded World 2025 将在德国纽伦堡盛大开幕。作为物联网和嵌入式技术领域的领先企业,乐鑫信息科技 (688018.SH) 将展示在 AI LLM、HMI、双频 Wi-Fi 6、低功耗 MCU 和 Matter 等领域的最新技术及解…...
C# 背景 透明 抗锯齿 (效果完美)
主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...
Debezium:实时数据捕获与同步的利器
一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...
Word中接入大模型教程
前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事,拆分一下就是: 获取用户…...
Centos修改ip
1 查看ip [rootlocalhost ~]# ip addr2 root账号修改ip [rootlocalhost ~]# su [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-scripts]# llvi编辑ifcfg-ens33 3 重启网卡 [rootlocalhost network-scripts]# systemctl restart network...
uni-app小程序开发 基础知识2
目标: 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码: <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…...
第4章 4.1 Entity Framework Core概述
4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象,而“关系”是关系型数据库,“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM ,可以通过创建C#对象的方式把数据插入数据库而不需…...
在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解
文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类:初始化 Bean3. 测试类:使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好? 随着大语言模型(LLM)在实际应用中的普及,许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中,La…...
Java 中的内存泄漏问题及解决方案
在 Java 中,内存泄漏(Memory Leak)是指在程序运行过程中,某些对象已经不再使用,但由于引用仍然存在,这些对象无法被垃圾回收器回收,从而导致内存无法释放,最终可能导致系统性能下降甚…...
VS Code 如何搭建C/C++开发环境
目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
