“三次握手”与“四次挥手”: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上编写…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...