TCP的连接管理
三次握手
什么是三次握手?
1. 第一次握手(客户端 → 服务器)
-
客户端发送一个 SYN 报文,请求建立连接。
-
报文中包含一个初始序列号
SEQ = x
。 -
表示:我想和你建立连接,我的序列号是 x。
2. 第二次握手(服务器 → 客户端)
-
服务器收到请求后,回复一个带 SYN 和 ACK 的报文。
-
包含服务器的初始序列号
SEQ = y
和对客户端的确认号ACK = x + 1
。 -
表示:我同意连接,我的序列号是 y,同时确认你发的序列号 x。
3. 第三次握手(客户端 → 服务器)
-
客户端收到服务器的确认后,发送一个 ACK 报文。
-
报文中
SEQ = x + 1
,ACK = y + 1
。 -
表示:我收到你的回应了,一切就绪,我们开始传数据吧。
🤝 举个例子:两个人打电话
你(客户端)想给朋友(服务器)打电话聊天,要确认两件事:
-
你能听到对方的声音
-
对方也能听到你的声音
于是过程是这样的:
✅ 第一次握手:
你打电话说:“喂,你在吗?”(SYN)
—— 你告诉对方:“我准备好了,可以通话。”
✅ 第二次握手:
朋友接到电话,说:“我在,我也准备好了!”(SYN + ACK)
—— 他告诉你:“我听到了你说的话,而且我也准备好了。”
✅ 第三次握手:
你说:“好,我也听到你了,我们开始聊吧!”(ACK)
—— 你再确认一遍:“咱俩都听得见了,正式开始!”
📌 为什么要三次?
-
如果只打两次招呼,比如你说“喂”,对方说“在”,你没回应,那他不知道你到底有没有听到。
-
三次握手让双方都确认彼此听得见,才不会“各说各话”。
四次挥手
① 第一次挥手(主动关闭方发送 FIN 报文)
-
主动关闭方(通常为客户端)发送一个 FIN(Finish)标志位为1 的报文段,表示其已无数据要发送,请求关闭连接。
-
此时,主动方进入 FIN_WAIT_1 状态。
② 第二次挥手(被动关闭方确认 ACK)
-
被动关闭方(通常为服务器)接收到该 FIN 报文后,立即发送一个 ACK 确认报文,确认序号为收到的序列号加一。
-
此时,被动方进入 CLOSE_WAIT 状态,主动方收到 ACK 后进入 FIN_WAIT_2 状态。
-
表示连接的一端(主动方)已关闭发送功能,但仍可接收数据。
③ 第三次挥手(被动关闭方发送 FIN 报文)
-
当被动关闭方确认其数据已发送完毕后,向主动方发送一个 FIN 报文段,请求断开连接。
-
被动方进入 LAST_ACK 状态。
④ 第四次挥手(主动关闭方确认 ACK)
-
主动关闭方接收到该 FIN 报文后,回复一个 ACK 报文,确认序号为收到的序列号加一。
-
然后主动方进入 TIME_WAIT 状态,等待 2 倍最大报文段寿命时间(2MSL)以确保对方收到 ACK。
-
最终,主动方进入 CLOSED 状态,连接完全关闭。
📌 设计四次挥手的原因:
-
TCP 是全双工通信,需要双方分别关闭各自的发送通道,因此每一端都需发送 FIN 和 ACK。
-
四次握手可确保所有未传输完的数据被接收方完整接收,防止数据丢失。
-
引入 TIME_WAIT 状态是为了应对 ACK 报文丢失而可能引起的重复 FIN 报文问题。
🔚 四次挥手是干什么的?
三次握手是“我们开始聊天”,
四次挥手就是“我们聊完了,要挂电话”。
但为什么要挥手四次呢?因为TCP是全双工通信:
客户端和服务器各自都要说一声“我说完了”,所以要四步!
🤝 举个例子:两个人通完电话,要挂断
✅ 第一次挥手(客户端 → 服务器)
你说:“我说完了,不讲了”(FIN=1)
—— 表示你不想再发消息了,但你还能接收对方的消息。
✅ 第二次挥手(服务器 → 客户端)
朋友说:“好的,我知道你说完了。”(ACK = 1)
—— 表示他收到了你的“我说完了”。
✅ 第三次挥手(服务器 → 客户端)
朋友再说:“我也说完了。”(FIN = 1)
—— 表示他也不再发消息了。
✅ 第四次挥手(客户端 → 服务器)
你说:“好的,我知道你也说完了。”(ACK = 1)
—— 表示你收到了他的“我说完了”,双方都确认了。
至此,连接正式断开。
❓为什么不是一次说“咱都不说了”就断?
因为 TCP 要确保双方都“完整地接收了对方要说的最后一句话”。
所以你得等对方也说完,再确认,才能挂电话 —— 这就是四次挥手的意义。
保活计时器(Keep-Alive Timer)
是 TCP 协议中的一种机制,用于检测一个连接是否仍然存活,即使长时间没有数据传输。
✅ 通俗理解:
就像两个人打电话时很久不说话,你会问一句:“你还在吗?”
如果对方不回答,你就知道对方已经断线了。
这就是TCP的保活机制在做的事。
📘 学术定义:
保活计时器(Keep-Alive Timer) 是一种在 TCP 空闲连接期间定期发送探测报文(Keep-Alive Probe)的小型数据包的机制,用以确认对方是否仍保持连接。如果多次发送探测包都未收到响应,则认为连接已断开,并关闭连接。
🔁 工作机制:
-
TCP连接建立后,如果一段时间内没有任何数据传输(默认是2小时),TCP 会启动保活计时器。
-
保活计时器触发后,客户端会发送一个 保活探测包(其实就是一个带 ACK 的空包)。
-
如果服务器:
-
回应了(发送 ACK)→ 连接正常,计时器重新计时。
-
没有回应 → TCP 会重试若干次(如默认5次或10次)。
-
-
连续探测失败 → TCP 判断连接已经断开,关闭连接,通知应用层。
相关文章:

TCP的连接管理
三次握手 什么是三次握手? 1. 第一次握手(客户端 → 服务器) 客户端发送一个 SYN 报文,请求建立连接。 报文中包含一个初始序列号 SEQ x。 表示:我想和你建立连接,我的序列号是 x。 2. 第二次握手&a…...
DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南
引言 在数字化转型的浪潮中,数据已成为企业的核心资产。然而,数据孤岛、冗余和不一致问题严重制约了数据价值的释放。DAMA(数据管理协会)提出的参考数据(Reference Data)与主数据(Master Data&…...

初识Linux · 传输层协议TCP · 下
目录 前言: 滑动窗口和流量控制机制 流量控制 滑动窗口 1.滑动窗口如何移动 2.滑动窗口的大小如何变化的 3.如果发生了丢包如何解决(快重传) 拥塞控制 延迟应答 面向字节流 RST PSH URG 什么是 PSH? 什么是 URG&…...
Kubernetes生产实战(十六):集群安全加固全攻略
Kubernetes集群安全加固全攻略:生产环境必备的12个关键策略 在容器化时代,Kubernetes已成为企业应用部署的核心基础设施。但根据CNCF 2023年云原生安全报告显示,75%的安全事件源于K8s配置错误。本文将基于生产环境实践,系统讲解集…...

什么是分布式光伏系统?屋顶分布式光伏如何并网?
政策窗口倒计时!分布式光伏如何破局而立? 2025年,中国分布式光伏行业迎来关键转折: ▸ "430"落幕——抢装潮收官,但考验才刚开始; ▸ "531"生死线——新增项目全面市场化交易启动&…...
YOLO 从入门到精通学习指南
一、引言 在计算机视觉领域,目标检测是一项至关重要的任务,其应用场景广泛,涵盖安防监控、自动驾驶、智能交通等众多领域。YOLO(You Only Look Once)作为目标检测领域的经典算法系列,以其高效、快速的特点受到了广泛的关注和应用。本学习指南将带领你从 YOLO 的基础概念…...
嵌入式硬件篇---麦克纳姆轮(简单运动实现)
文章目录 前言1. 麦克纳姆轮的基本布局X型布局O型布局 2. 运动模式实现原理(1) 前进/后退前进后退 (2) 左右平移向左平移向右平移 (3) 原地旋转顺时针旋转(右旋)逆时针旋转(左旋) (4) 斜向移动左上45移动 (5) 180旋转 3. 数学原理…...

完整进行一次共线性分析
(随便找个基因家族) 1.数据收集 使用水稻、拟南芥、玉米三种作物进行示例 可以直接去ensemble去找最标准的基因组fasta文件和gff文件。 2.预处理数据 这里对于fasta和gff数据看情况要不要过滤掉线粒体叶绿体的基因,数据差异非常大&#…...

RabbitMQ--基础篇
RabbitMQ 简介:RabbitMQ 是一种开源的消息队列中间件,你可以把它想象成一个高效的“邮局”。它专门负责在不同应用程序之间传递消息,让系统各部分能松耦合地协作 优势: 异步处理:比如用户注册后,主程序将发…...

Quorum协议原理与应用详解
一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议,通过权衡一致性(C)与可用性(A)实现数据冗余和最终一致性。其核心规则为: W(写成功副本数) …...

vue搭建+element引入
vue搭建element 在使用Vue.js开发项目时,经常会选择使用Element UI作为UI框架,因为它提供了丰富的组件和良好的设计,可以大大提高开发效率。以下是如何在Vue项目中集成Element UI的步骤: 1. 创建Vue项目 如果你还没有创建Vue项…...

食物数据分析系统vue+flask
食物数据分析系统 项目概述 食物数据分析系统是一个集食物营养成分查询、对比分析和数据可视化于一体的Web应用。系统采用前后端分离架构,为用户提供食物营养信息检索、食物对比和营养分析等功能,帮助用户了解食物的营养成分,做出更健康的饮…...

SPDK NVMe of RDMA 部署
使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先,我们需要从GitHub上克隆SPDK的源码仓库。打开终端,输入以下命令: git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…...
《C++中插入位的函数实现及示例说明》
《C中插入位的函数实现及示例说明》 这个函数 insertBits 的作用是将整数 M 插入到整数 N 的指定位置区间 [i, j] 中。具体来说,函数会先清除 N 中从第 i 位到第 j 位的所有位,然后将 M 左移 i 位后与清除后的 N 相加,从而将 M 插入到 N 的指…...

【Redis】缓存和分布式锁
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、缓存(Cache) 概述 Redis最主要的应用场景便是作为缓存。缓存(Cache)是一种用于存储数据副本的技术或组件,…...
SDK游戏盾与高防ip的的区别
SDK游戏盾与高防IP是两种针对不同业务场景设计的网络安全防护方案,二者在技术原理、防护能力、应用场景及用户体验等方面存在显著差异。以下为具体对比分析: 一、技术原理与实现方式 高防IP 原理:通过DNS解析或BGP路由将流量牵引至高防机房…...

OpenLayers 精确经过三个点的曲线绘制
OpenLayers 精确经过三个点的曲线绘制 根据您的需求,我将提供一个使用 OpenLayers 绘制精确经过三个指定点的曲线解决方案。对于三个点的情况,我们可以使用 二次贝塞尔曲线 或 三次样条插值,确保曲线精确通过所有控制点。 实现方案 下面是…...

大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调
文章目录 一、简介二、如何安装2.1 安装2.2 校验 三、开始使用3.1 可视化界面3.2 使用命令行3.2.1 模型微调训练3.2.2 模型合并3.2.3 模型推理3.2.4 模型评估 四、高级功能4.1 分布训练4.2 DeepSpeed4.2.1 单机多卡4.2.2 多机多卡 五、日志分析 一、简介 LLaMA-Factory 是一个…...

GLPK(GNU线性规划工具包)介绍
GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包),可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库,最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载,仅包含源码,最新版本为5.0。 GLPK是…...
Kubernetes生产实战(十七):负载均衡流量分发管理实战指南
在Kubernetes集群中,负载均衡是保障应用高可用、高性能的核心机制。本文将从生产环境视角,深入解析Kubernetes负载均衡的实现方式、最佳实践及常见问题解决方案。 一、Kubernetes负载均衡的三大核心组件 1)Service资源:集群内流…...

PCB设计实践(十三)PCB设计中差分线间距与线宽设置的深度解析
一、差分信号的基本原理与物理背景 差分信号技术通过两条等幅反相的传输线实现信号传输,其核心优势体现在电磁场耦合的对称性上。根据麦克斯韦方程组的对称解原理,两条线产生的电磁场在远场区域相互抵消,形成以下特性: 1. 共模噪…...

2025python学习笔记
一.Python语言基础入门 第一章 01.初识Python Python的起源: 1989年,为了打发圣诞节假期,Gudio van Rossum吉多范罗苏姆(龟叔)决心开发一个新的解释程序(Python维形)1991年,第一个…...
前端取经路——入门取经:初出师门的九个CSS修行
大家好,我是老十三,一名前端开发工程师。CSS就像前端修行路上的第一道关卡,看似简单,实则暗藏玄机。在今天的文章中,我将带你一起应对九大CSS难题,从Flexbox布局到响应式设计,从选择器优先级到B…...
【Pandas】pandas DataFrame corr
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

【并发编程】基于 Redis 手写分布式锁
目录 一、基于 Redis 演示超卖现象 1.1 Redis 超卖现象 1.2 超卖现象解决方案 二、Redis 的乐观锁机制 2.1 原生客户端演示 2.2 业务代码实现 三、单机部署 Redis 实现分布式锁 3.1 分布式锁的演变和升级 3.2 setnx 实现分布式锁 3.2.1 递归调用实现分布式锁 3.2.2 循…...
Web3 初学者的第一个实战项目:留言上链 DApp
目录 📌 项目简介:留言上链 DApp(MessageBoard DApp) 🧠 技术栈 🔶 1. Solidity 智能合约代码(MessageBoard.sol) 🔷 2. 前端代码(index.html script.js…...

Jsp技术入门指南【十二】自定义标签
Jsp技术入门指南【十二】自定义标签 前言一、什么是标签二、标签的类型有哪些?1. 空标签2. 带有属性的标签3. 带主体的标签 三、自定义标签的部件3.1 自定义标签的四步骤3.2 标签处理程序3.3 自定义标签的开发及使用步骤第一步:创建标签助手类第二步&…...

Java—— 泛型详解
泛型概述 泛型是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。 泛型的格式:<数据类型> 注意:泛型只能支持引用数据类型。 泛型的好处 没有泛型的时候,可以往集合中添加任意类型的数据&#x…...

GPT-4o, GPT 4.5, GPT 4.1, O3, O4-mini等模型的区别与联系
大模型时代浪潮汹涌,作为其中的领军者,OpenAI 其推出的系列模型以强大的能力深刻影响着整个行业,并常常成为业界其他公司对标和比较的基准。因此,深入了解 OpenAI 的大模型,不仅是为了使用它们,更是为了理解当前大模型的能力边界和发展趋势,这对于我们评估和选择其他各类…...
Harness: 全流程 DevOps 解决方案,让持续集成如吃饭般简单
引言 在当今快速发展的软件开发世界中,高效的 DevOps 工具变得越来越重要。Harness 作为一个开源的运维平台,为开发和运维团队提供了从代码托管到 CI/CD 的全流程解决方案,同时实现自动化的开发环境和制品管理。这种集中化的工具可以显著减少运维难度,提高团队效率,真正解…...