当前位置: 首页 > 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…...

Nunchaku FLUX.1-dev使用手册:ComfyUI中启动、加载工作流与生成图片

Nunchaku FLUX.1-dev使用手册&#xff1a;ComfyUI中启动、加载工作流与生成图片 1. 环境准备与安装部署 1.1 硬件与软件要求 在开始使用Nunchaku FLUX.1-dev模型前&#xff0c;请确保您的系统满足以下基础要求&#xff1a; 硬件配置&#xff1a; 显卡&#xff1a;支持CUDA的…...

Git-RSCLIP快速上手教程:Jupyter替换端口+7860界面双功能实测

Git-RSCLIP快速上手教程&#xff1a;Jupyter替换端口7860界面双功能实测 想试试用一句话就让AI看懂卫星图吗&#xff1f;比如&#xff0c;你上传一张城市航拍图&#xff0c;告诉它“找找看哪里有新建的住宅区”&#xff0c;它就能帮你把相关的区域圈出来。听起来像科幻片&…...

OpenClaw监控方案:Qwen3-4B模型API健康检查自动化

OpenClaw监控方案&#xff1a;Qwen3-4B模型API健康检查自动化 1. 为什么需要模型API监控 上周我的个人自动化流程突然中断了整整8小时——直到第二天早上查看日志才发现是Qwen3-4B模型API服务崩溃了。这个教训让我意识到&#xff1a;本地部署的大模型也需要像云服务一样建立健…...

STC8H8K32U按键控制OLED显示

手动按键按下,OLED显示对应键值 气缸前进后退电机正反转本文实现了一个基于STC8H单片机的按键检测与OLED显示系统。系统通过8个独立按键输入信号&#xff0c;采用消抖算法检测有效按键&#xff0c;并在OLED屏幕上实时显示对应按键编号。程序包含OLED初始化、I2C通信协议实现、按…...

反激电源设计(9)——补偿器参数优化实战

1. 从理论到实战&#xff1a;为什么补偿器参数优化如此重要&#xff1f; 做过反激电源设计的朋友都知道&#xff0c;补偿器就像是电源系统的"大脑"&#xff0c;它决定了整个电源的稳定性和动态响应。但很多工程师在设计时都会遇到这样的困境&#xff1a;明明按照理论…...

SenseVoice实战应用:将语音识别集成到你的Python项目中,快速调用API

SenseVoice实战应用&#xff1a;将语音识别集成到你的Python项目中&#xff0c;快速调用API 1. 引言&#xff1a;让Python项目听懂世界 想象一下&#xff0c;你的Python应用能够听懂用户说的话&#xff0c;理解他们的意图&#xff0c;甚至能感知他们的情绪。这在过去可能需要…...

AI Agent创业商业模式:订阅制、按需付费、定制化服务的选择

AI Agent创业商业模式&#xff1a;订阅制、按需付费、定制化服务的选择1. 标题 (Title) 从工具价值到商业闭环&#xff1a;AI Agent创业的三大核心盈利模式深度拆解与选择指南AI Agent创业避坑指南&#xff1a;订阅制、按需付费、定制化服务的优劣势、适配场景与ROI计算全解析不…...

Qwen3-Reranker常见问题解决:如何稳定运行Decoder-only架构模型

Qwen3-Reranker常见问题解决&#xff1a;如何稳定运行Decoder-only架构模型 1. 问题背景与核心挑战 在部署Qwen3-Reranker-0.6B模型时&#xff0c;许多开发者会遇到一个典型错误&#xff1a;当使用传统的AutoModelForSequenceClassification加载模型时&#xff0c;系统会报错…...

Android-Password-Store自动填充功能详解:让密码自动填写变得简单高效

Android-Password-Store自动填充功能详解&#xff1a;让密码自动填写变得简单高效 【免费下载链接】Android-Password-Store Android application compatible with ZX2C4s Pass command line application 项目地址: https://gitcode.com/gh_mirrors/an/Android-Password-Stor…...

数字游民工作流:OpenClaw+千问3.5-27B自动处理跨境邮件

数字游民工作流&#xff1a;OpenClaw千问3.5-27B自动处理跨境邮件 1. 为什么需要自动化邮件处理 作为数字游民&#xff0c;我每天需要处理来自不同时区的客户邮件。这些邮件往往混杂着英语、西班牙语和中文&#xff0c;且包含大量模糊的需求描述。最痛苦的是凌晨三点被手机提…...