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

TCP为什么握手是三次,而挥手是四次

TCP(传输控制协议)使用三次握手(3WHS)来建立一个可靠的连接,并使用四次挥手(4WHS)来终止连接。以下是每个步骤的详细解释:

三次握手(3WHS)建立连接:

  1. SYN(同步序列编号)

    • 客户端选择一个初始序列号x,并发送一个带有SYN标志的TCP段给服务器,请求建立连接。此时,TCP段的序列号字段设置为x。
  2. SYN-ACK(同步-确认)

    • 服务器收到客户端的SYN段后,如果同意建立连接,则会发送一个SYN-ACK段作为响应。服务器选择自己的初始序列号y,并在ACK(确认)字段中确认客户端的序列号x+1(期望接收到的第一个字节的序列号)。同时,SYN标志位也被设置。
  3. ACK(确认)

    • 客户端收到服务器的SYN-ACK段后,发送一个带有ACK标志的TCP段给服务器,确认服务器的初始序列号。客户端在ACK字段中填入y+1。

完成这三个步骤后,TCP连接就成功建立,客户端和服务器可以开始发送数据。

为什么需要三次握手:

  • 防止已失效的连接请求报文段突然传到服务器,因而产生错误:如果使用两次握手,服务器端收到一个旧的连接请求并响应,可能会导致服务器错误地建立一个新连接。
    例子:
  • 允许双方确认彼此的初始序列号:三次握手确保了客户端和服务器都能够确认对方的接收能力和发送能力。

四次挥手(4WHS)终止连接:

  1. FIN(结束)

    • 当一方完成数据传输并希望关闭连接时,它发送一个带有FIN标志的TCP段,表示已经没有数据要发送了。
  2. ACK(确认)

    • 对方收到FIN段后,发送一个ACK段确认这个FIN。
  3. FIN(结束)

    • 对方完成数据传输后,也发送一个带有FIN标志的TCP段。
  4. ACK(确认)

    • 最初发送FIN的一方收到这个FIN段后,发送最后一个ACK段确认。

完成这四个步骤后,TCP连接被关闭。

为什么需要四次挥手:

  • TCP连接是全双工的:意味着数据可以在两个方向上独立传输。因此,每个方向上的连接都需要单独关闭。
  • 确保数据传输完成:四次挥手允许一方在关闭自己的发送部分后,仍然接收来自对方的剩余数据。

上述为什么要三次握手第一个原因的理解

为什么TCP连接建立需要三次握手,而两次握手可能不足以防止"已失效的连接请求"的问题。

假设场景:

假设客户端A想要与服务器B建立TCP连接,但是客户端A发送的第一个连接请求(SYN)在网络中延迟了,没有立即到达服务器B。

第一次握手(SYN):
  • 客户端A发送一个SYN报文(假设序列号为1000)给服务器B,请求建立连接。
网络延迟:
  • 这个SYN报文在网络中延迟,没有立即到达服务器B。
第二次握手(SYN+ACK,如果是两次握手):
  • 假设我们只使用两次握手,客户端A在发送第一个SYN报文后,由于没有收到响应,会重新发送另一个SYN报文(假设序列号为2000)。
第三次握手(ACK,如果是两次握手):
  • 服务器B最终收到了第二个SYN报文(序列号2000),并发送了一个SYN+ACK报文作为响应,同意建立连接。
延迟的报文到达:
  • 此时,客户端A收到了服务器B的SYN+ACK报文,并发送了一个ACK报文确认,完成了两次握手过程。但是,之前延迟的第一个SYN报文(序列号1000)现在终于到达了服务器B。
问题出现:
  • 如果服务器B在两次握手后没有收到客户端A的最终ACK确认,它可能会认为连接没有成功建立。因此,当服务器B收到延迟的SYN报文(序列号1000)时,它可能会错误地认为客户端A又发送了一个新的连接请求,并尝试重新建立一个新的连接。
三次握手的作用:
  • 通过三次握手,即使客户端A的第一个SYN报文(序列号1000)延迟到达,服务器B也不会错误地建立一个新的连接。这是因为:
    • 服务器B在收到第一个SYN(1000)后,会发送一个SYN+ACK(期望收到1000+1=1001),等待客户端的确认。
    • 客户端A收到这个SYN+ACK后,会发送一个ACK(确认1001),但由于客户端A实际上发送的是序列号2000,所以这个ACK不匹配服务器B的期望。
    • 服务器B收到不匹配的ACK后,会知道这不是对它发出的SYN+ACK的响应,因此不会错误地建立一个新的连接。

通过这个例子,你可以看到三次握手如何确保即使在网络延迟或重传的情况下,连接的建立也是可靠和有序的。它防止了因为旧的或延迟的连接请求而导致的不必要的连接建立,确保了服务器不会对已经失效或过时的连接请求做出响应。

相关文章:

TCP为什么握手是三次,而挥手是四次

TCP(传输控制协议)使用三次握手(3WHS)来建立一个可靠的连接,并使用四次挥手(4WHS)来终止连接。以下是每个步骤的详细解释: 三次握手(3WHS)建立连接&#xff…...

前端面试题大合集9----TypeScript

目录 一、TypeScript 中静态类型的概念及其好处 二、如何在 TypeScript 的接口中定义可选属性? 三、解释 TypeScript 中联合类型的概念并提供示例 四、TypeScript 中的类型断言是什么? 五、TS中泛型是什么? 六、解释 TypeScript 中的“…...

Linux:动态库和静态库的编译与使用

目录 1.前言 2.静态链接库 3.静态链接库生成步骤 4.静态链接库的使用 5.动态链接库 6.动态链接库生成步骤 7.动态链接库的使用 8.动态链接库无法加载 9.解决动态链接库无法加载问题 前言 在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库…...

【Pyqt6 学习笔记】DIY一个二维码解析生成小工具

文章目录 Pycharm 配置QtDesignerPyUIC基本模板 代码示例依赖包main.pyscreen_shot_module.pyuntitled.pyuntitled.ui Pycharm 配置 摘自PyQT6的从零开始在Pycharm中配置与使用——蹦跑的蜗牛 pip install PyQt6 PyQt6-toolsQtDesigner File -> Settings -> External …...

关于xilinx srio ip复位问题

关于xilinx srio ip复位问题 语言 :Verilg HDL 、VHDL EDA工具: Vivado 关于xilinx srio ip复位问题一、引言二、FPGA 之间 srio通信复位处理复位时序不同步:SRIO 模块未正确初始化:等待复位完成的时间不足:SRIO 配置…...

04 uboot 编译与调试

新手不需要详细掌握 uboot,只需要知道它是一个什么东西即可,工作中也只是改一些参数而已。 1、uboot 是什么 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内…...

【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索

文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…...

在线OJ项目测试(selenium+Junit5)

目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一:检查未登录时的页面访问以及一些未登录时的非法操作 测试二:测试注册界面 测试三:测试登录界面 测试四:测试题目列表界面 测试五:测试题目详情界面…...

计算机系统基础笔记(12)——控制

前言 在持续输出ing 一、条件码 1.处理器状态(x86-64,部分的) 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置(栈顶) ◼ 当前代码控制点的位置(即将要执行的指令地址) ◼ 最近一次指令执…...

使用RedissonClient的管道模式批量查询key

1.场景 遇到了一个场景,在客户给我们推送的数据中,咋1分钟左右,会有相同车辆vehicle 和时间 gpstime一样的数据,这类数据呢,我们认为是重复数据,需要过滤的 把相同 vehicle 和 gpstime 作为key存入到redis中…...

UR机器人通信汇总

文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口(502端口)3.2 Dashboard端口(29999端口)3.3 上位机编程端口(30001/30002/30003端口)3.3.1 URS…...

AI学习指南机器学习篇-使用ID3算法构建决策树

AI学习指南机器学习篇-使用ID3算法构建决策树 介绍ID3算法 ID3(Iterative Dichotomiser 3)是一种用于构建决策树的经典机器学习算法。它是由Ross Quinlan于1986年提出的,是一种基于信息论的算法,用于从一组特征中选择最佳特征来…...

React实战(一)初始化项目、配置router、redux、axios

(一)初始化项目 1.安装项目 npx create-react-app 项目名 编译报错: 解决办法:安装最新的babel-preset-react-app npm install babel-preset-react-applatest 2.配置项目 (1)配置文件目录 (2)使用craco配置webpack.config npm install craco/crac…...

高质量 HarmonyOS 权限管控流程

高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中,往往会涉及到敏感数据和硬件资源的调动和访问,而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解,才可以在应用开发中提高效率和避免踩坑。 权限管控了…...

java里面封装https请求工具类2

其他写法 https://blog.csdn.net/weixin_44372802/article/details/132620809?spm1001.2014.3001.5501 encodeJson 是请求参数的密文格式(大公司都是要对请求参数加密的) ResponseBean 是自己或者对方定义的返回内容参数 public ResponseBean sendByEnc…...

前端面试题日常练-day59 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. 在PHP中,以下哪个符号用于比较两个值的相等性? a) b) c) d) ! 2. PHP中的预定义变量$_POST用于获取什么类型的数据? a) 用户的输入数据 b) 浏览器发送的请…...

计算机小问题(4)--关闭联想电脑的小组件

打开联想软件管家,关闭即可 (今天弄了好久才找到,记录一下)...

mac无法读取windows分区怎么办 苹果硬盘怎么读取

对于Mac电脑用户但有Windows系统使用需求的,我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决,不过因为两个系统的磁盘格式不同,相应的也会产生一些问题,例如无法正常读取windows分区。下面本文就详细说明mac无法…...

【设计模式】JAVA Design Patterns——State(状态模式)

🔍目的 允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。 🔍解释 真实世界例子 当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的…...

Docker搭建可道云

Docker搭建可道云(存储) 文章目录 Docker搭建可道云(存储)介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...