当前位置: 首页 > news >正文

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言

TCP(传输控制协议)工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信,隐藏了底层网络的细节,并提供面向连接或无连接的数据传递服务。‌

TCP的工作原理和特性

TCP是一种面向连接的、可靠的传输协议,提供数据的可靠性、流量控制、拥塞控制等功能。它通过使用序号、确认和重传机制来确保数据的可靠传输,并支持全双工通信。TCP通过三次握手建立连接,通过四次挥手关闭连接,确保数据的完整性和顺序性。

TCP报文首部


1.源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
2.序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
3.确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
4.数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;
5.保留,占6位,保留今后使用,但目前应都位0;
6.紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
7.确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
8.推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
9.复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
10.同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
11.终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
12.窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
13.检验和,占2字节,校验首部和数据这两部分;
14.紧急指针,占2字节,指出本报文段中的紧急数据的字节数;
15.选项,长度可变,定义一些其他的可选的参数。

TCP的三次握手

1. 第一次握手:SYN

客户端希望与服务器建立TCP连接时,会发送一个SYN(同步序列编号)包到服务器。这个包中包含客户端的初始序列号(ISN)。

  • SYN标志位:1

  • 序列号:客户端的初始序列号(ISN)

2. 第二次握手:SYN-ACK

服务器收到客户端的SYN包后,会发送一个SYN-ACK包作为响应。这个包中包含服务器的初始序列号和对客户端SYN包的确认。

  • SYN标志位:1

  • ACK标志位:1

  • 序列号:服务器的初始序列号(ISN)

  • 确认号:客户端的初始序列号 + 1

3. 第三次握手:ACK

客户端收到服务器的SYN-ACK包后,会发送一个ACK包作为确认。这个包中包含对服务器SYN包的确认。

  • ACK标志位:1

  • 确认号:服务器的初始序列号 + 1

三次握手的意义

通过三次握手,客户端和服务器确认了彼此的初始序列号,并建立了可靠的连接。这个过程确保了双方都能够接收和发送数据。

TCP的四次挥手

1. 第一次挥手:FIN

当客户端希望终止连接时,会发送一个FIN(结束)包到服务器。

  • FIN标志位:1

2. 第二次挥手:ACK

服务器收到客户端的FIN包后,会发送一个ACK包作为确认。

  • ACK标志位:1

  • 确认号:客户端的序列号 + 1

3. 第三次挥手:FIN

服务器在完成数据传输后,会发送一个FIN包到客户端,表示服务器也希望终止连接。

  • FIN标志位:1

4. 第四次挥手:ACK

客户端收到服务器的FIN包后,会发送一个ACK包作为确认。

  • ACK标志位:1

  • 确认号:服务器的序列号 + 1

四次挥手的意义

通过四次挥手,客户端和服务器确认了连接的终止。这个过程确保了双方都能够优雅地关闭连接,避免数据丢失。

TCP连接的状态转换

建立连接

  1. CLOSED:初始状态,表示没有连接。

  2. SYN-SENT:客户端发送SYN包后进入此状态。

  3. SYN-RECEIVED:服务器收到SYN包并发送SYN-ACK包后进入此状态。

  4. ESTABLISHED:客户端收到SYN-ACK包并发送ACK包后进入此状态,连接建立。

终止连接

  1. ESTABLISHED:连接已建立。

  2. FIN-WAIT-1:客户端发送FIN包后进入此状态。

  3. FIN-WAIT-2:客户端收到服务器的ACK包后进入此状态。

  4. CLOSE-WAIT:服务器收到FIN包并发送ACK包后进入此状态。

  5. LAST-ACK:服务器发送FIN包后进入此状态。

  6. TIME-WAIT:客户端收到FIN包并发送ACK包后进入此状态。

  7. CLOSED:连接完全关闭。

为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

⭐为什么TCP一定要三次握手和四次挥手?少一次不行吗?

如果只有两次握手,会出现以下问题:

  • 无法确认客户端的接收能力

    • 在两次握手中,服务器发送SYN-ACK包后,就认为连接已经建立。但如果客户端的ACK包丢失,服务器并不知道客户端是否真的收到了SYN-ACK包。这会导致服务器认为连接已建立,而客户端认为连接未建立,造成状态不一致。

  • 旧连接的干扰

    • 如果网络中存在延迟的旧SYN包,服务器可能会误认为这是一个新的连接请求,从而建立错误的连接。三次握手通过客户端的ACK包确认,可以有效避免这种情况。

因此,三次握手是确保连接可靠建立的最小次数。

如果只有三次挥手,会出现以下问题:

  • 数据丢失的风险

    • 在三次挥手中,服务器在收到客户端的FIN包后,会立即发送FIN-ACK包,表示自己也希望关闭连接。但如果服务器还有未发送完的数据,这些数据可能会丢失。四次挥手允许服务器在确认客户端的FIN包后,继续发送剩余的数据,直到所有数据发送完毕后再发送自己的FIN包。

  • 状态不一致

    • 如果服务器在收到客户端的FIN包后立即关闭连接,而客户端仍在等待服务器的FIN包,会导致状态不一致。四次挥手通过明确的FIN和ACK交互,确保双方都同意关闭连接。

因此,四次挥手是确保连接可靠关闭的最小次数。

结论

TCP的三次握手和四次挥手是建立和终止连接的关键步骤。通过理解这两个过程,我们可以更好地理解TCP协议的工作原理,并在实际应用中优化网络性能。、

相关文章:

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP(传输控制协议)工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案

摘要: 文中以某住宅小区建设工程为例,重点研究了住宅小区地下车库新能源汽车充电桩配电设计,从位置设置、安装方式选择、配电箱设置、配电箱回路设置、供配电系统设计等方面展开分析,提出了民用建筑充电桩设计的科学建议,为新能源充电桩的推广应用提供参考。 关键…...

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…...

java jar包内的jar包如何打补丁

问题描述: 主包:hisca.jar,解压后 BOOT-INFO/lib下有其他jar包 因为一个小bug,需要修改这个hisca包下BOOT-INF/lib下的子jar包service-hisca-impl-1.0.0.jar中的一个service类及xml文件 操作步骤: 1、主包jar -xvf …...

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用,如何实现? 在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中,不仅会导致页面加载缓慢,还可能占用大量内存&#x…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式:网络地址转换的奥秘 在计算机网络的世界里,NAT 模式(Network Address Translation,网络地址转换)扮演着至关重要的角色。它就像是网络中的翻译官,在不同网络地址之间进行转换&#xff0…...

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例:https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2(Gradle 8.10.2 AGP 8.8.0 JDK17) 的本地 Maven 仓库发布示例,包含aar和jar的不同配置: 1.…...

无服务边缘融合架构:重新定义云原生应用边界

引言:零部署计算的革命突破 Airbnb迁移至LambdaEdge架构后,全球客房详情页渲染延迟降至35ms,冷启动时间缩至50ms以内。Stripe采用无服务边缘计算处理支付事务,成功将动态API响应P99延迟从210ms压缩至19ms。AWS官方基准显示&#…...

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较:TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化:如何提升数据库查询速度,揭秘实战技巧与挑战 引言 T…...

Nodejs-逐行读取文件【简易版】

“勤奋就是成功之母。”‌ —— 茅以升 目录 逐行读取文件四种方法:Node.js 逐行读取文件的核心方法:同步读取(适用于小文件):异步流式处理(推荐用于大文件):[使用 readline 模块](h…...

上海市计算机学会竞赛平台2024年5月月赛丙组城市距离之和

城市距离之和 内存限制: 256 Mb时间限制: 1000 ms 题目描述 设 (x,y)(x,y) 与 (x′,y′)(x′,y′) 是平面上的两个点的坐标,它们之间的城市距离定义为 ∣x−x′∣∣y−y′∣∣x−x′∣∣y−y′∣ 给定 nn 个点,请计算所有点对之间的城市距离之和。 …...

穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路

回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…...

基于Python socket库构建的基于 P2P 的文件共享系统示例

基于 P2P 的文件共享系统 实现方式&#xff1a; 使用 Python 的socket库构建 P2P 网络&#xff0c;节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表&#xff0c;并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时&#xff0c;它会向网络中的其…...

JavaScript 函数重载:灵活应对多场景的编程技巧

在 JavaScript 中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;是一个常见的需求。尽管 JavaScript 本身并不支持传统意义上的函数重载&#xff08;即在同一个作用域内定义多个同名函数&#xff0c;根据参数的不同调用不同的函数&#xff09;&#xff0c;…...

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么&#xff1f; Redis&#xff1a;像你家的“小冰箱”&#xff0c;专门存高频使用的食物&#xff08;数据&#xff09;。它是基于内存的键值数据库&#xff0c;读写速度极快&#xff08;每秒超10万次操作&#xff09;。比如你每次打开手机App&#xff0c;用…...

计算机毕业设计SpringBoot+Vue.js汽车销售网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【0010】HTML水平线标签详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 一、水平线标签概述 在HTML中&#xff0c;<hr>标签用于在网页上插入一条水平线&#xff0c;其主要…...

FastExcel与Reactor响应式编程深度集成技术解析

一、技术融合背景与核心价值 在2025年企业级应用开发中&#xff0c;大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案&#xff0c;通过以下技术协同实现突破性性能&#xff1a; 内存效率革命&#xff1a;FastExcel的流式字节操作与Re…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...