三次握手四次挥手

三次握手和四次挥手是什么

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的,断开连接是通过四次挥手来进行的。

建立连接:三次握手

关于下方用到的SYN ACK标志位,请点击此处了解
关于下方用到的客户端和服务器用到的各种状态,请点击此处了解
三次握手是用来建立连接的过程,确保通信的双方都准备好数据传输。以下是三次握手的步骤:

  • 一开始,客户端和服务端都处于 CLOSE 状态(即未建立连接),但服务端开启了监听,处于 LISTEN 状态
  1. 第一次握手(SYN):

    • 客户端结束 CLOSE 状态,向服务器发送一个连接请求报文,其中标志位设置为 SYN(同步),并且初始化了一个随机的序列号用于数据传输。之后客户端为 SYN_SENT 状态。
  2. 第二次握手(SYN + ACK):

    • 服务器收到客户端的连接请求,回复一个确认报文,其中设置自己的标志位为 SYN 和 ACK(确认),并且初始化了一个随机的序列号,并将客户端发来的的序列号加一,用于后续数据传输。服务器此时处于 SYN_RCVD 状态。
  3. 第三次握手(ACK):

    • 客户端收到服务器的确认报文,向服务器发送一个确认报文,其中标志位设置为 ACK。客户端确认收到服务器的连接确认,同时确认序列号。客户端进入 ESTABUSHED 状态。
    • 服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。
      在这里插入图片描述

连接已经建立,双方可以开始进行数据传输

在这里插入图片描述

终止连接:四次挥手

在数据传输完毕后,TCP 通过四次挥手来终止连接,确保数据传输的完整性。双方都可以主动断开连接,断开连接后主机中的资源将被释放。以下是四次挥手的步骤:

  1. 第一次挥手:主动关闭方(一般是客户端)发送一个FIN(Finish)报文,表示不再发送数据。此时,主动关闭方进入FIN_WAIT_1状态。
  2. 第二次挥手:被动关闭方(一般是服务器)收到第一个FIN后,发送一个ACK(Acknowledgment)报文,确认收到了关闭请求。被动关闭方进入CLOSE_WAIT状态。客户端收到ACK后进入FIN_WAIT_2状态。
  3. 第三次挥手:被动关闭方发送自己的关闭请求,也就是发送一个FIN报文。此时,被动关闭方进入LAST_ACK状态。
  4. 第四次挥手:主动关闭方收到被动关闭方的关闭请求后,发送一个ACK报文作为确认。当被动关闭方收到这个ACK后,连接正式关闭,主动关闭方进入TIME_WAIT状态。被动关闭方在收到ACK后也会进入CLOSED状态。主动关闭方2MSL后进入CLOSED状态。

在这里插入图片描述

关于3次握手的疑问

为什么是3次握手呢?2,4,5可以吗?

在这里插入图片描述首先我们要清楚,建立连接意味着OS需要把这些已经建立好的连接管理起来。要管理!就要先描述,在组织! OS内为了管理连接就要创建数据结构 struct tcp_linki{...}
所以说,创建维护连接是有成本的! ! !即 内存+CPU

2次为什么不可以

  • 2次握手—SYN洪水,非常容易收到攻击,大量的SYN请求,导致服务器OS只要收到SYN就开始维护链接,导致内存和CPU的高负荷。
    - 如果仅 SYN - SYN/ACK,那就不能判断服务器到客户端的SYN/ACK是否丢失,从而导致服务器处于一直处于ESTABLISHED状态,但客户端没有成功建立连接。因为此时服务器已经认为自己建立连接了,就不会有所谓的重传了。
    - 3次
    • 保证双发连接建立的可靠性
    • 避免引入不必要的延迟和开销
    • 对网络实时性需求进行平衡考虑
  • 4次
    • 四次握手可以增加可靠性,但需要额外的RTT(从发送方发送数据到接收方,再从接收方发送确认到发送方,所花费的时间)。考虑到网络实时性需求,引入额外延迟是不可取的。三次握手已经可以满足需求。
  • 5次
    • 五次握手更加冗余,会引入更多不必要的延迟和开销。并且没有明显的技术优势。
  1. 3次握手的本质
    • 本质就是在赌最后一次握手报文不会丢失,这种情况是小概率事件,如果丢失,客户端此时是认为已经连接成功的,当直接发送数据给服务器时,服务器此时是没有正常建立连接的,所以服务器会设置RST控制位发送给客户端,进行重连。
  2. 总而言之
  • 奇数次握手必然是客户端最后发送ACK,肯定是客户端先开始维护连接,而不是服务器
  • 偶数次握手必然是服务器发送ACK,肯定是服务器先开始维护连接,这会导致安全性的降低,容易被SYN攻击
  • 如果偶数次发送ACK,则服务器可能承担大量的维护连接的成本,因为服务器最后一次发送ACK时,已经确认连接成功,OS必然会创建数据结构维护连接,与2次握手类似会发生SYN洪水,而客户端则不需要成本,因为不需要维护连接,因为客户端此时并没有确认连接。
  • 再多次了没有必要,因为TCP握手并不是用来解决安全问题的,只是为了自己不要有明显的漏洞,所以SYN洪水肯定是会存在的,越多次的握手效率越低,3次就够了,没有明显的漏洞,可以缓解SYN洪水问题,使得攻击方成本变高,因为想要建立连接必然需要客户端先维护连接。
  1. 进一步总结
    • 3次握手没有明显的设计漏洞,一旦建立连接出现异常,成本嫁接到client,server端成本较低
    • 验证双方通信信道的通畅情况——三次握手是验证全双工通信信道通畅的最小成本!

关于四次挥手的疑问

四次挥手的设计是为了确保双方都有足够的时间来处理未完全传输的数据,以及确认对方收到了关闭请求和确认。这样可以保证数据的可靠传输和连接的正常关闭。

为什么握手要三次,挥手却要四次呢?

那是因为握手的时候并没有数据传输,所以服务端的 SYN 和 ACK 报文可以合并一起发送,但是挥手的时候有数据在传输,所以 ACK 和 FIN 报文不能同时发送,需要分两步,所以会比握手多一步。

为什么客户端在第四次挥手后还会等待 2MSL?

等待 2MSL 是因为保证服务端接收到了 ACK 报文,因为网络复杂了,很有可能 ACK 报文丢失了,如果服务端没接收到 ACK 报文的话,会重新发送 FIN 报文,只有当客户端等待了 2MSL 都没有收到重发的 FIN 报文时就表示服务端是正常收到了 ACK 报文,那么这个时候客户端就可以关闭了。
TCP规定,MSL应大于最大报文段在网络中存在的时间,以确保网络中不会存在旧的重复报文段。

2MSL是多少?

MSL 是 IP 协议中的一个时间间隔,表示一个数据包在网络中的最大生存时间。在 IPv4 中,MSL 通常被设置为 2 分钟(120 秒),而在 IPv6 中可能会有所不同。其具体时间取决于实现和配置。

因此,2MSL 通常等于 4 分钟(240 秒)。

什么情况会出现三次挥手?

当被动关闭方(上图的服务端)在 TCP 挥手过程中,没有数据要发送并且开启了 TCP 延迟应答机制,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统安全——NAT(SNAT、DNAT)

目录 NAT SNAT SNAT实际操作 DNAT DNAT实际操作 NAT NAT: network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链 请求报文:修改源/目标IP, 响应报文:修改源/目标…

数学建模之“层次分析法”原理和代码详解

一、层次分析法简介 层次分析法(Analytic Hierarchy Process,AHP)是一种用于多准则决策分析和评估问题的定量方法,常用于数学建模中。它是由数学家托马斯赛蒂(Thomas Saaty)开发的。 层次分析法将复杂的决…

什么是负载均衡

前提概述 关于负载均衡,我会从四个方面去说 1. 负载均衡产生的背景 2. 负载均衡的实现技术 3. 负载均衡的作用范围 4. 负载均衡的常用算法 负载均衡的诞生背景 在互联网发展早期,由于用户量较少、业务需求也比较简单。对于软件应用,我们只需要…

coco数据集制作-多文件夹

背景:标准的coco格式数据集需要把所有图片放到一个文件夹里,而很多情况下,会有很多个文件夹,我们并不想把所有图片放到一起。 本文把多个文件夹下的yolov8(5)的txt标签转换至coco标签,转换标签代码如下: …

React+Typescript 状态管理

好 本文 我们来说说状态管理 也就是我们的 state 我们直接顺便写一个组件 参考代码如下 import * as React from "react";interface IProps {title: string,age: number }interface IState {count:number }export default class hello extends React.Component<I…

Maven 配置文件修改及导入第三方jar包

设置java和maven的环境变量 修改maven配置文件 &#xff08;D:\app\apache-maven-3.5.0\conf\settings.xml&#xff0c;1中环境变量对应的maven包下的conf&#xff09; 修改131行左右的mirror&#xff0c;设置阿里云的仓库地址 <mirror> <id>alimaven</id&g…

设计模式-简单工厂模式

核心理念 根据不同的参数返回不同的实例专门用一个类来创建其它类的实例创建的类都具用共同的父类 优缺点 优点 对象的创建和业务的处理分离开来&#xff0c;可以降低系统的耦合性新增业务只需新增处理类即可&#xff0c;不影响原来的业务处理类 缺点 工厂类需要根据参数判…

Docker容器监控系统

目录 简化描述 Cadvisor InfluxDBGrafana 监控组件架构图 部署 安装docker-ce 阿里云镜像加速器 下载组件镜像 创建自定义网络 创建influxdb容器 创建granafa容器 简化描述 Docker作为目前十分出色的容器管理技术&#xff0c;得到大量企业的青睐&#xff0c;在生产环…

MySQL的基础操作

前言 对MySQL的一些基础操作做一下学习性的总结&#xff0c;基本上是照着视频写的。 MySQL的安装 MySQL的下载 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 配置环境变量 下载之后直接解压&#xff0c…

OpenGL —— 2.2、Shader之间数据传输、向Shder传输数据

Shader OpenGL着色器&#xff08;shader&#xff09;是一种用于编写图形渲染代码的编程语言。它们在图形处理单元&#xff08;GPU&#xff09;上运行&#xff0c;用于控制渲染管线的不同阶段。 在OpenGL中&#xff0c;有两种主要类型的着色器&#xff1a;顶点着色器和片段着色器…

中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻

中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻&#xff1a; 乡村振兴战略下传统村落文化旅游设计 - 百度百科 https://baike.baidu.com/item/乡村振兴战略下传统村落文化旅游设计/62588677 概览 《乡村振兴战略下传统村落文化旅游…

宠物店小程序制作

随着移动互联网的快速发展&#xff0c;宠物店经营者们也纷纷意识到线上市场的潜力。通过开发一款宠物小程序&#xff0c;你可以将你的宠物店推向线上的新机遇&#xff01; 【乔拓云】是一个专业的小程序开发平台&#xff0c;它提供了一套简单易用的工具&#xff0c;帮助你快速创…

js使用for of遍历map

//使用for of遍历map console.log("---") console.log(odata.studentDetails) let obj odata.studentDetails[0].answerSituation for(let [key,value] of Object.entries(obj)){console.log(value) }

解决Pandas KeyError: “None of [Index([...])] are in the [columns]“问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

k8s集群生产环境的问题处理

2 k8s上的服务均无法访问 执行命令kubectl get pods -ALL,k8s集群中的服务均是running状态 1 kuboard 网页无法访问 kuboard无法通过浏览器访问&#xff0c;但是查看端口是被占用的

Hlang--用Python写个编程语言-变量的实现

文章目录 前言语法规则表示次幂实现变量实现优先级实现步骤解析关键字语法解析解释器总结前言 先前的话,我们终于是把我们整个架子搭起来了,这里重复一下我们的流程,那就是,首先,我们通过解析文本,然后呢遍历文本当中的我们定义的合法关键字,然后呢,把他们封装为一个T…

DataFrame.query()--Pandas

1. 函数功能 Pandas 中的一个函数&#xff0c;用于在 DataFrame 中执行查询操作。这个方法会返回一个新的 DataFrame&#xff0c;其中包含符合查询条件的数据行。请注意&#xff0c;query 方法只能用于筛选行&#xff0c;而不能用于筛选列。 2. 函数语法 DataFrame.query(ex…

星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速

目录 前言 一、思路 二、调整小蜜蜂的移速 三、限制活动范围 四、继续重构 总结 前言 前面我们已经让小蜜蜂左右移动起来了&#xff0c;而且是连续的左右移动&#xff0c;但是在使用的过程中&#xff0c;因为我使用的是笔记本电脑&#xff0c;所以屏幕比较小&#xff0c;设…

【数据库】表操作 习题总结

目录 关系建表 数据库sql的执行顺序 内外连接的写法 1.设计一张商品表 2.设计一张老师表 3.设计一张图书表 4.查询练习 5.查询练习 6.设计一个考勤系统 7.设计一个学校宿舍管理系统 8.设计一个车辆违章系统 9.设计一个学校食堂管理系统 10.有一张员工表emp&#xf…

OpenCV笔记之solvePnP函数和calibrateCamera函数对比

OpenCV笔记之solvePnP函数和calibrateCamera函数对比 文章目录 OpenCV笔记之solvePnP函数和calibrateCamera函数对比1.cv::solvePnP2.cv::solvePnP函数的用途和工作原理3.cv::solvePnP背后的数学方程式4.cv::SOLVEPNP_ITERATIVE、cv::SOLVEPNP_EPNP、cv::SOLVEPNP_P3P5.一个固定…