一文详解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 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础入门·File类的使用

前言 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ File类的创建方法 File类介绍 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ …

docker 数据持久化

文章目录 定制镜像持久化需求实现 数据卷持久化数据卷简介数据卷的特性创建读写数据卷停止容器后的操作查看数据卷详情 创建只写数据卷查看数据卷详情 创建共享数据卷 Dockerfile持久化创建Dockerfile、构建和运行镜像查看宿主机端的目录 在容器层的 UnionFS(联合文…

笔记1.2 计算机网络结构

网络边缘 主机、网络应用 接入网络,物理介质 有线或无线通信链路 网络核心(核心网络): 互联的路由器(或分组转发设备) 网络之网络 一、网络边缘 主机(端系统): 位…

vue3+ts+uniapp小程序封装获取授权hook函数

vue3tsuniapp小程序封装获取授权hook函数 小程序授权的时候,如果点击拒绝授权,然后就再也不会出现授权了,除非用户手动去右上角…设置打开 通过uni官方api自己封装一个全局的提示: uni.getSetting :http://uniapp.dcloud.io/api/other/settin…

Java操作Influxdb2.x

本片文章不讲怎么安装,只讲安装后如何用JAVA代码操作库表 1.创建数据库2.为bucket添加TELEGRAF配置3.TELEGRAF配置参数说明4.配置数据库的访问权限API TOKENS5.JAVA代码操作库表5.1 yaml5.2 pom依赖5.3 config5.4 controller5.5 查询方法、结果集提取方法 1.创建数据…

SpringBoot-插件化以及springboot扩展接口

插件化常用的实现思路 spi机制,Service Provider Interface ,是JDK内置的一种服务发现机制,SPI是一种动态替换扩展机制约定配置和目录,利用反射配合实现springboot中的Factories机制Java agent(探针)技术S…

JavaScript中的Generator函数及其使用方式

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Generator函数⭐ 创建Generator函数⭐ 调用Generator函数⭐ Generator函数的应用1. 异步编程2. 生成器(Generator) ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧…

老板要我开发一个简单的工作流引擎-读后感与补充

概述 最近读了一篇《老板要我开发一个简单的工作流引擎》 幽默风趣,干货较多,作为流程引擎的设计者、开发者、探索者,写的很好,合计自己的理解,对每个功能补充说明,对于流程引擎的应用场景,做出…

vue中slot,slot-scope,v-slot的用法和区别

slot用于设置标签的属性值(slot“title”)slot-scopev-slot slot <el-menu-item v-if"!navMenu.children" :key"navMenu.id" :index"navMenu.id " click"itemClick(navMenu)" ><span slot"title">{{ navMenu.…

无涯教程-JavaScript - N函数

描述 N函数返回一个转换为数字的值。 语法 N (value) 争论 Argument描述Required/OptionalValue 要转换的值或对值的引用。 N转换下表中列出的值。 Required 值 N的返回值一个数字那个数字日期,采用Microsoft Excel中可用的内置日期格式之一该日期的序列号 TRUE 1 FALSE…

大数据课程L3——网站流量项目的系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的运行环境; ⚪ 了解网站流量项目的日志采集系统搭建; ⚪ 了解网站流量项目的离线业务系统搭建; ⚪ 了解网站流量项目的Hive做离线数据处理; ⚪ 了解网站流量项目的…

Java笔记:Java线程Dump分析

1 Thread Dump介绍 1.1 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力&#xff0c;虽然各个 Java虚拟机打印的thread dump略有不同&#xff0c;但是 大多都提供了当前活动线程的快…

【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 3. 散点矩阵图&#xff08;Scatter Matrix Plot&#xff09; 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于…

Web服务器解析:从基础到高级的全面指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 Web服务器是现代互…

前端实现符合Promise/A+规范的Promise

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 介绍&#xff1a; Promise/A规范简介 1. Promise的三种状态&#xff1a; 2. 状态转换&#xff1a; 3. Promise的…

盘点11种高效改进卷积神经网络(CNN)的优化方法【核心代码下载】

卷积作为神经网络的核心计算之一&#xff0c;在CV领域有着诸多突破性进展&#xff0c;因而近年来关于卷积神经网络的研究不断。由于卷积的计算十分复杂&#xff0c;而且神经网络运行时很大一部分时间都会耗费在计算卷积上&#xff0c;因此优化卷积计算就显得尤为重要。 那么如…

2023谷歌开发者大会直播详细脚本

主播:三掌柜 设备:手机+直播云台 平台:CSDN 角度:对Google技术感兴趣的人、技术爱好者 画风:言简意赅、通俗易懂,将难懂的内容转化为简洁的描述,旨在让每一位观众都能有所收获。 形式:直播互动,提高受众人群的范围,包括但不限于对Google感兴趣的任何人,以及对G…

【LeetCode-简单题】剑指 Offer 58 - II. 左旋转字符串

文章目录 题目方法一&#xff1a;连续双指针翻转 题目 方法一&#xff1a;连续双指针翻转 class Solution {public String reverseLeftWords(String s, int n) {StringBuffer sb new StringBuffer(s);reverseWord(sb,0,n-1);reverseWord(sb,n,sb.length()-1);return sb.revers…

OLED透明屏触控:引领未来科技革命的创新力量

OLED透明屏触控技术作为一项颠覆性的创新&#xff0c;正在引领新一轮科技革命。它将OLED显示技术与触摸技术相结合&#xff0c;实现了透明度和触控功能的完美融合。 在这篇文章中&#xff0c;尼伽将通过引用最新的市场数据、报告和行业动态&#xff0c;详细介绍OLED透明屏触控…

hutool的HttpRequest.post的使用-包括上传文档等多个传参【总结版本】

首先hutool已经为我们封装好了远程调用的接口&#xff0c;我们只要将对应的传参和方式对应填写即可 hutool官方文档 1实际应用 post 常见的使用json传参&#xff0c;contend type为application/json RequestMapping("login") ResponseBody public static String s…