三次握手四次挥手

news/2024/5/2 14:52:51/文章来源:https://blog.csdn.net/Aen_hen/article/details/132396034

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

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 延迟应答机制,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。

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

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

相关文章

算法通关村十二关 | 字符串经典题目

字符串问题&#xff0c;大家记得模板思路即可&#xff0c;一个类型的题目有很多种。 1. 字符串反转的问题 1.1 反转字符串 题目&#xff1a;LeetCode344: 思路 还是我们常见的双指针问题&#xff0c; left字符数组头部指针&#xff0c;right字符数组尾部指针。当left < r…

Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

Netty入门代码示例(基于TCP服务) Server端 package com.bierce.io.netty.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGro…

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进&#xff0c;城市基础设施的安全和可靠性变得愈发重要&#xff0c;城市窨井盖作为城市基础设施重要组成部分之一&#xff0c;其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来&#xff0c;各地都在加强城市窨井盖治理…

前端工程化概述

软件工程定义&#xff1a;将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段&#xff0c;随着前端技术的不断演进和互联网应用的复杂化&#xff0c;前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

Shiro学习总结

第一章 入门概述 1.概念 shiro是一个Java安全框架&#xff0c;可以完成&#xff1a;认证、授权、加密、会话管理、与web集成、缓存… 2.优势 ● 易于使用&#xff0c;构建简单 ● 功能全面 ● 灵活&#xff0c;可以在任何应用程序环境中工作&#xff0c;并且不需要依赖它们…

TCP半连接队列和全连接队列

目录 什么是 TCP 半连接队列和全连接队列&#xff1f; TCP 全连接队列溢出 如何知道应用程序的 TCP 全连接队列大小&#xff1f; 如何模拟 TCP 全连接队列溢出的场景&#xff1f; 全连接队列溢出会发生什么 ? 如何增大全连接队列呢 ? TCP 半连接队列溢出 如何查看 TC…

数据结构入门 — 顺序表详解

前言 数据结构入门 — 顺序表详解 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 文章目录 前言一、顺序表1. 顺序表是什么2. 优缺点 二、概念及结构…

【Midjourney电商与平面设计实战】创作效率提升300%

不得不说&#xff0c;最近智能AI的话题火爆圈内外啦。这不&#xff0c;战火已经从IT行业燃烧到设计行业里了。 刚研究完ChatGPT&#xff0c;现在又出来一个AI作图Midjourney。 其视觉效果令不少网友感叹&#xff1a;“AI已经不逊于人类画师了!” 现如今&#xff0c;在AIGC 热…

ubuntu18.04复现yolo v8之CUDA与pytorch版本问题以及多CUDA版本安装及切换

最近在复现yolo v8的程序&#xff0c;特记录一下过程 环境&#xff1a;ubuntu18.04ros melodic 小知识&#xff1a;GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA&#xff0c;不必删除之前的CUDA&#xff0c;…

【AndroidStudio】java.nio.charset.MalformedInputException: Input length = 1

java.nio.charset.MalformedInputException: Input length 1 可以参考这个文章处理下编码格式&#xff1a;https://blog.csdn.net/twotwo22222/article/details/124605029java.nio.charset.MalformedInputException: Input length 1是因为你的配置文件里面有中文或者是你的编…

Ansible 自动化安装软件

例子如下&#xff1a; 创建一个名为/ansible/package.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 --- - name:…

自定义滑动到底部触发指令,elementUI实现分页下拉框

在 main.js 中添加 // 自定义滑动到底部指令 Vue.directive(selectLoadMore, {bind(el, binding) {// 获取element-ui定义好的scroll盒子const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap)SELECTWRAP_DOM.addEventListener(scroll, fun…

MyBatis动态语句且如何实现模糊查询及resultType与resultMap的区别---详细介绍

前言 前面我们学习了如何使用Mybatis实现简单的增删改查。今天我们来学习如何使用动态语句来根据不同的条件生成不同的SQL语句。这在实际开发中非常有用&#xff0c;因为通常查询条件是多样化的&#xff0c;需要根据实际情况来拼接SQL语句&#xff0c;那什么是MyBatis动态语句呢…

JW0818近电报警芯片

JW0818 市电感应报警电路适用于电业人员和电信行业施工人员的安全保护用品–近电预警器 报警电路。 特别注意芯片引脚6&#xff0c;输出信号是方波&#xff0c;而不是高低电平&#xff1b;在产品开发过程遇到这个坑。

Vue+Axios搭建二次元动态登录页面(mp4视频格式)

最近想做一个前端登录页面&#xff0c;背景好看的&#xff0c;格式中规中矩的&#xff0c;这么难&#xff1f;我自己创一个吧&#xff01; 效果图如下&#xff1a; 源码可以参考我的github&#xff0c;复制源码即可用&#xff1a;gym02/loginPage_Vue: 使用VueAxios搭建的动态…

DataLoader

机器学习的五个步骤&#xff1a; 数据模块——模型——损失函数——优化器——训练 在实际项目中&#xff0c;如果数据量很大&#xff0c;考虑到内存有限、I/O 速度等问题&#xff0c;在训练过程中不可能一次性的将所有数据全部加载到内存中&#xff0c;也不能只用一个进程去加…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求&#xff0c;我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试&#xff0c;该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性&#xff1a; 1.全面性校对&#xff1a;工具支持…

Unity血条制作

一、使用UGUI制作血条 我一般使用image制作血条&#xff0c;当然&#xff0c;也可以使用滑动组件Slider。image的具体操作步骤如下 普通血条 1、在Hierarchy面板中&#xff0c;创建两个image组件&#xff0c;将其中一个设置为另外一个的子节点 2、在Inspector面板中&#…

操作教程|通过1Panel开源Linux面板快速安装DataEase

DataEase开源数据可视化分析工具&#xff08;dataease.io&#xff09;的在线安装是通过在服务器命令行执行Linux命令来进行的。但是在实际的安装部署过程中&#xff0c;很多数据分析师或者业务人员经常会因为不熟悉Linux操作系统及命令行操作方式&#xff0c;在安装DataEase的过…

【学会动态规划】最长递增子序列的个数(28)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…