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

一文详解TCP三次握手四次挥手

文章目录

  • TCP的三次握手和四次挥手
    • 三次握手
    • 四次挥手

TCP的三次握手和四次挥手

基本概念

  • SYN(Synchronize Sequence Numbers,同步序列数字):用于建立连接的同步信号

    SYN 序列号的作用是用于标识每个数据包中的字节流的起始位置。在 TCP 连接的建立过程中,双方会约定一个初始的序列号(标准的TCP连接中都是设置为初始序列号都是设置为1),相当于起始字节流的编号。每个数据包都附带有一个序列号字段,在传输过程中不断递增,用于指示数据包中字节的位置。

    通过使用 SYN 序列号,双方能够确保数据包的顺序和完整性。接收方可以根据序列号信息验证数据包的顺序,并进行数据重组和重传操作。因此,SYN 序列号在 TCP 连接的建立和数据传输过程中起到了重要的同步和校验作用

  • SEQ(Sequence Number):用于标识发送方发送的数据包的序列号

    它是一个32位的无符号整数,序列号的作用是保证TCP连接中数据包的顺序性和可靠性。发送方在发送数据时,会为每个数据包分配一个唯一的序列号。接收方在接收到数据包后,可以通过序列号来确定接收到的数据包的顺序,并进行重组。

  • ACK(Acknowledgement,确认):用于确认应答

    字段等于1的含义是,表示接收方已经正确地收到了对方发送的SYN(同步序列编号)字段。需要注意的是ACK字段并不是固定等于1的,它可以根据具体的场景和TCP协议的版本进行调整。但是在标准的TCP三次握手过程中,ACK字段等于1是一种常见的设置方式。

  • FIN(Finish,完成):用于表示后面没有数据发送了,通常意味着连接的断开。

    当一方希望关闭连接时,会发送一个带有FIN = 1的数据包给对方,表示自己不再发送数据了,并请求对方关闭连接。

三次握手

image-20230320221444356

理解性记忆:想要别人回复都需要设置 SYN(SYN值为1),发送请求都需要设置 seq(seq值为接收请求 ACK 的值,上一次请求没有 ACK 就自己设置一个值),回复请求都需要设置 ACK(ACK的值为接收请求 seq 的值 + 1)。

总结就是:所有的请求都必须有 seq,非最后一次请求都必须有 SYN,非第一次请求都必须有 ACK 和 ack

  • 每次握手的含义

    • 第一次握手:A发送消息给B,“我想当你男朋友,你愿意吗?”
    • 第二次握手:B回复消息给A,“我愿意!”
    • 第三次握手:A回复消息给B,“我现在知道你愿意当我女朋友了”,于是 A 和 B 建立了男女朋友关系

    第一次握手,A表达了想和B建立连接的意愿;第二次握手,B表达了自己的意愿;第三次握手,A告诉B他已经知道了B的意愿。

    PS:A(客户端,扮演男朋友角色),B(服务端,扮演女朋友角色)

  • 现在我们再来推敲一下为什么必须是三次握手,不能是1次、2次或4次握手

    • 如果是一次握手,那么 A 只是表达了自己的意愿,并不知道 B 的意愿,所以他们无法直接就建立男女朋友关系,要不然你随便和一个陌生女孩表白,那你们就建立男女朋友关系了,这显然不太可能吧🤣;

    • 如果是两次握手,那么A表达了自己的意愿,B也表达了自己的意愿,但是此时,A知道B的意愿,但B并不知道A是否知道知道自己的意愿,这样会存在安全隐患,以及出现脏连接1,因为 B 并不知道 A 是否知道他是否知道自己的意愿,就会默认他知道自己的意愿,于是就进行了交往,但却殊不知 A 没收到 B 的请求,也就是 A 不知道 B 同意了自己的交往请求,于是 A 秉持着不在一个棵树上吊死的精神,移情别恋了,这就导致 B 后续的请求直接落了个空;

    • 如果是四次握手,其实在第三次握手时就能够确保 A 和 B 都表达了自己的意愿,而 A 和 B 也都知道了双方的意愿,第四次握手就显得有些冗余了;

    综上所诉,三次握手的是保障双方信息对等,同时避免出现连接超时导致出现脏连接最少握手次数,多一次握手多余,浪费资源,少一次握手不安全,而握手三次不多不少刚刚好

image-20230320221553826

现在再来讲一讲什么是脏连接,为什么两次握手就会导致出现脏连接,所谓的脏连接(Dirty Connection)是指在网络通信中,由于某种原因导致连接状态出现异常或错误的情况

  • 常见的导致出现脏连接的情况有

    • 网络中断或故障:当网络中断或发生故障时,连接可能会被意外中断,但是连接的状态却没有及时更新。这导致连接状态变为脏连接,无法正常传输数据。

    • 服务器或客户端崩溃:如果服务器或客户端在连接过程中崩溃或异常终止,连接状态可能无法正确清理和关闭,从而产生脏连接。

    • 防火墙或网络设备问题:防火墙或其他网络设备配置不正确、软件故障或过滤规则错误等问题可能导致连接被错误地阻塞或终止,造成脏连接。

    • 应用程序错误:应用程序编码错误、资源管理问题或逻辑错误可能导致连接处理不当,使连接处于脏的状态。

  • 脏连接的危害

    • 占用服务器资源:脏连接可能占用服务器资源,如内存、CPU等,导致性能下降。
    • 数据传输异常:脏连接可能导致数据丢失、错乱甚至数据冲突。
    • 安全隐患:脏连接可能被黑客利用进行未授权访问、攻击或其他恶意行为。

如果我们采用了两次握手,客户端发送请求给服务端,服务端收到客户端的请求,由于省掉了第三次握手,所以此时服务端在接收到客户端的请求之后单方面认为客户端接收到了自己的回复,服务端开启了TCP连接(此时的连接变成了半双工2连接了,而TCP是全双工3连接),但此时客户端可能并没有接收到服务端的连接,此时服务端的回复就有可能被第三发截取,从而造成安全事故。(这个单向的TCP连接是一个脏连接,因为它处于一个异常的连接状态)

注意:并不是说使用三次握手就能完全避免脏连接,只是说通过三次握手能大幅度降低脏连接发生的概率

四次挥手

image-20230320224223726

理解性记忆:请求需要断开连接时,必须设置 FIN(FIN值为1),发送请求都需要设置 seq(seq值为接收请求的 ACK 值,如果是第一次请求就自己设置一个值),回复请求都需要设置 ACK(ACK 的值为接收请求 seq 的值 + 1)

总结就算:所有请求都必须有 seq,断开连接的请求需要设置 FIN(一次FIN断开一半),非第一次请求都必须有 ACK 和 ack

  • 每次挥手的含义

    • 第一次挥手,A发送请求给B,“我想和你中断关系,你同意吗?”

    • 第二次挥手,B发送请求给A,“我同意了,断开连接前,你先等我收拾一下我的东西,然后回娘家”

    • 第三次挥手,B发送请求给A,“我东西收拾好了,回娘家了”

    • 第四次挥手,A发送请求给B,“知道了”(客户端真是一个无情无义的渣男🤣,关系建立是他提出的,关系结束也是他提出的)

    第一次挥手,A表达了自己要中断夫妻关系的意愿;第二次挥手,B了解了A的意愿同时表达了自己的意愿;第三次挥手,B表达了自己已经东西回娘家的准备;第四次挥手表示A告诉B,自己已经知道他收拾好东西了(这个第四次握手和之前的第三次挥手作用是类似的)

    PS:A(客户端,扮演老公角色),B(服务端,扮演老婆角色)

  • 为什么一定是四次挥手,不能是1次、2次、3次、5次

    • 如果我们少了第二次挥手,直接进行第三次挥手,那么此时服务端B可能就准备释放一些资源,同时将之前一些准备好的资源发送给A,但是由于缺少第二次挥手,客户端A并不知道此时服务端B已经释放了一些资源,此时数据请求还是双向的,客户端还可以会发送一些请求给服务端B,但是服务端已经关闭了资源,这就导致了请求异常;第二次挥手是为了给服务端预留关闭资源和释放资源的时间,这个时间端数据只能是服务端B发送给客户端A,客户端A不能发送数据给服务端B,不然就会发生异常导致连接无法正常关闭;

    • 如果我们少了第三次挥手,那就更加离谱了,B还没完全关闭释放资源,客户端A就直接单方面断开连接了,这就导致了还有一些没有发送出去的资源的浪费;

    • 如果我们少了第四次挥手,这个就和之前的第三次握手是一样的,容易出现脏连接,即:服务端B在没有确定客户端A已经收到自己(资源关闭完成的)请求时进行了单方面的连接断开,而如果此时B的请求在中断发生了丢失,就会导致A一直处于等待状态,造成资源浪费

    其实这个和之前的三次握手是差不多的,这里就只简单介绍一下,首先我们需要明确四次挥手是能够保障信息对等,同时避免数据的丢失资源的浪费最少挥手次数,挥手次数过少,信息不对等,容易出现数据丢失和资源浪费,挥手次数过多浪费资源,而四次不多不少刚刚好O(∩_∩)O

  • 为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态

    客户端A发送给服务端B的ACK请求,可能会发生丢失,此时服务端B会重新发送请求,而网络中报文的最大生存时间通常是 2mls,也就是说如果服务端 B 在 2mls 后没收到 客户端A 的确认请求,就会重新发送 FIN 请求(也就是关闭连接请求)。如果客户端A此时没有这个 2mls 的等待时间直接关闭,就会出现 A 关闭连接,但是 B 一直无法收到 A 的 ACK 出现脏连接(也就是一直向A发送FIN请求)


  1. 脏连接(Dirty Connection):是指在网络通信中,由于某种原因导致连接状态出现异常或错误的情况 ↩︎

  2. 半双工:数据的传输的单向的,要么是A只能传递数据给B,要么是B只能传递数据给A ↩︎

  3. 全双工:数据的传输是双向的,A既可以传递数据给B,B又可以传递数据给A ↩︎

相关文章:

一文详解TCP三次握手四次挥手

文章目录 TCP的三次握手和四次挥手三次握手四次挥手 TCP的三次握手和四次挥手 基本概念 SYN(Synchronize Sequence Numbers,同步序列数字):用于建立连接的同步信号。 SYN 序列号的作用是用于标识每个数据包中的字节流的起始位置。…...

PDF怎么转图片?四种转换方法分享

PDF文件是一种非常常见的文档格式,然而,有时候我们需要将PDF文件转换成图片格式。比如我们可能需要将PDF文件中的某些页面或图表转换成图片格式以便于编辑或分享。在这篇文章中,我们将介绍四种将PDF文件转换成图片的方法。 方法一&#xff1a…...

华为OD机试 - 压缩报文还原 - 正则表达式(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...

电商API的应用价值:淘宝1688京东API接口系列

API接口是一种软件应用程序,它充当两个不同软件应用程序之间的中介。它帮助不同的应用程序相互通信,共享数据,从而使用户能够完成不同的任务。API接口的用途非常广泛,下面是一些常见的用途: 数据共享:API接…...

day38 代码回想录 斐波那契数爬楼梯使用最小花费爬楼梯

大纲 ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯 509. 斐波那契数 题目:509. 斐波那契数 // 斐波那契数列 // 动规 5部曲 // 1 dp[i]代表i处的斐波那契值 // 2 递归公式:dp[0] 0, dp[1]1, dp[i]dp[i-1]dp[i-2] // 3…...

Flink DataStream 体系

前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 思维导图 正文 对 Flink 这种以流为核心的分布式计…...

Linux的调试工具 - gdb(超详细)

Linux的调试工具 - gdb 1. 背景2. 开始使用指令的使用都用下面这个C语言简单小代码来进行演示:1. list或l 行号:显示文件源代码,接着上次的位置往下列,每次列10行。2. list或l 函数名:列出某个函数的源代码。3. r或run: 运行程序。…...

已知平面内三点,求其平面的法向量

三点平面法向量 设三点坐标为A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3) 向量AB(x2-x1,y2-y1,z2-z1),AC(x3-x1,y3-y1,z3-z1) AB、AC所在平面的法向量即ABAC(a,b,c),其中: a(y2-y1)(z3-z1)-(z2-z1)(y3-y1) b(z2-z1)(x3-x1)-(z3-z1)(x2-x1) c(x2-x1)(y3-y1)-(x3-x1)(y2-y1)…...

HTML

HTML 1.HTML结构 1.1认识HTML HTML是超文本标记语言&#xff0c;电脑上看到的所有网站都是html实现的 HTML代码是“标签”构成的&#xff0c;简单来说&#xff0c;html就是一堆标签的组合 形如 <body>hello</body>标签名 (body) 放到 < > 中 大部分标签成…...

Java手写最大子数组和算法(如Kadane算法)和最大子数组和算法(如Kadane算法)应用拓展案例

Java手写最大子数组和算法&#xff08;如Kadane算法&#xff09;和最大子数组和算法&#xff08;如Kadane算法&#xff09;应用拓展案例 1. 算法思维导图 以下是使用mermaid代码表示的Kadane算法的实现原理&#xff1a; #mermaid-svg-rI7hVAVsP1qtjZK7 {font-family:"tr…...

掌握NVM、NRM和NPM:Node.js开发的利器

**掌握NVM、NRM和NPM&#xff1a;Node.js开发的利器** 背景介绍&#xff1a;如何使用NVM&#xff1a;在Windows上安装NVM&#xff1a;在macOS上安装NVM&#xff1a;配置NVM&#xff1a;常用NVM命令&#xff1a; 如何使用NRM&#xff1a;安装NRM&#xff1a;配置全局NRM&#xf…...

Nacos 2.2.3 部署到linux

到https://github.com/alibaba/nacos/releases 下载编译后压缩包&#xff0c;如nacos-server-2.2.3.tar.gz这种&#xff0c;里面包含有nacos的jar包&#xff0c;不然启动不了 1.新建并初始化数据库 创建nacos数据库&#xff0c;执行mysql-schema.sql文件&#xff0c;这个文件…...

设计模式之十:状态模式

状态模式通过改变对象内部的状态来帮助对象控制自己的行为。 这是一张状态图&#xff0c;其中每个圆圈都是一个状态。 最简单&#xff0c;第一反应的实现就是使用一个变量来控制状态值&#xff0c;并在方法内书写条件代码来处理不同情况。 package headfirst.designpatterns.…...

Python 的运算符和语句(条件、循环、异常)基本使用指南

运算符的分类 算数运算符赋值运算符复合赋值运算符比较运算符逻辑运算符 算数运算符 运算符描述实例加1 1 输出结果为 2-减1 - 1 输出结果为 0*乘2 * 2 输出结果为 4/除10 / 2 输出结果为 5//整除9 // 4 输出结果为 2%取余9 % 4 输出结果为 1**指数2 ** 4 输出结果为 16&…...

文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题

三、用go语言&#xff0c;给出 RANDOMIZED-SELECT的一个基于循环的版本。 文心一言&#xff1a; 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示。这个版本使用 Go 语言编写&#xff0c;利用随机化来选择一个元素&#xff0c;并在循环中不断地调整选择的元素&#x…...

React中组件通信01——props

React中组件通信01——props 1. 父传子——props1.1 简单例子——props1.2 props 可以传递任何数据1.2.1 传递数字、对象等1.2.2 传递函数1.2.3 传递模版jsx 2. 子传父 子传子——props2.1 父传子——传递函数2.2 子传父——通过父传子的函数实现2.3 优化 子传子&#xff08;…...

接口测试——接口协议抓包分析与mock_L1

目录&#xff1a; 接口测试价值与体系常见的接口协议接口测试用例设计postman基础使用postman实战练习 1.接口测试价值与体系 接口测试概念 接口&#xff1a;不同的系统之间相互连接的部分&#xff0c;是一个传递数据的通道接口测试&#xff1a;检查数据的交换、传递和控制…...

四种常用的自动化测试框架

一直想仔细研究框架&#xff0c;写个流水账似的测试程序不难&#xff0c;写个低维护成本的测试框架就很难了&#xff0c;所以研究多种测试框架还是很有必要的&#xff0c;知道孰优孰劣&#xff0c;才能在开始编写框架的时候打好基础&#xff0c;今天读到了KiKi Zhao的翻译文章&…...

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具 1.概述2. 工具使用1.概述 Fuxploider是一款功能强大的开源渗透测试工具,该工具专门针对文件上传漏洞而设计,可以帮助广大研究人员以自动化的方式检测和利用目标站点文件上传表单中的安全问题 由于该工具基于Python 3…...

Unity 安装及运行MLAgents

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...