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

TCP三次握手四次挥手详解

TCP三次握手建立连接的过程:

  • 一次握手:客户端发送带有 SYN(seq=x)标志的数据包到服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认。
  • 二次握手:服务端收到 SYN 包后,发送带有 SYN+ACK(seq=y,ack=x+1)标志的数据包到客户端,然后服务器进入 SYN_RECV 状态。
  • 三次握手:客户端收到 SYN+ACK 包后,发送带有 ACK(ack=y+1)标志的数据包到服务端,然后客户端和服务端都进入ESTABLISHED状态,连接完成。

SYN 指同步序列号,只有在第一次和第二次发起连接请求和连接接受的情况下置为1,seq为随机取值。

seq 指初始化序列号,用于标识客户端将要发送的数据包顺序。确保建立的连接是可靠的传输,不会造成数据丢失和失序。

第一次握手和第二次握手不发送数据,只有第三次握手时才发送数据。


TCP四次挥手释放连接的过程:

  • 第一次挥手:客户端发送一个 FIN(seq=x)标志的数据包到服务端,用来关闭客户端到服务端的数据传送,然后客户端进入 FIN-WAIT-1状态。
  • 第二次挥手:服务端收到这个 FIN(seq=x)标志的数据包,它发送一个 ACK(ack=x+1)标志的数据包到客户端,然后服务端进入 CLOST-WAIT状态,客户端进入 FIN-WAIT-2状态。
  • 第三次挥手:服务端发送一个 FIN(seq=y)标志的数据包到客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
  • 第四次挥手:客户端发送 ACK(ack=y+1)标志的数据包到服务端,然后客户端进入 TIME-WAIT状态,服务端在收到ACK(ack=y+1)标志的数据包后进入CLOSED状态,此时如果客户端等待2MSL后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

1.1. 为什么要三次握手?

        三次握手的目的是建立可靠的通信信道,确保客户端和服务端发送及接收数据都是正常的。

  1. 第一次握手:服务端确认客户端发送正常,服务端接收正常。
  2. 第二次握手:客户端确认接收发送正常,服务端接收发送正常。
  3. 第三次握手:服务端确认服务端发送正常,客户端接收正常。

        其次是为了防止“已失效的连接请求报文段”被服务器误接收。当网络情况比较复杂的情况下,发送方第一次发送请求后,由于网络原因发生了阻塞,此时客户端会超时重传再次发送请求。如果握手只有两次,那么当连接释放后,之前阻塞的请求到达服务端,服务端此时以为与客户端建立了连接,会分配资源保持这个连接,一直监听等待客户端发送数据,但客户端不会发送请求,造成了服务端资源的浪费。

        因此需要服务端发送请求后,客户端响应了服务端的请求进行三次握手后,才算建立了连接,可以发送请求。

1.2. 为什么要四次挥手?

        因为TCP通过三次握手建立的是全双工通信,任何一方都可以在数据传送结束后发出连接释放的通知, 当一方想要关闭连接时,不能直接断开,因为另一方可能还有数据需要发送。 某一方发出释放连接请求时,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放的通知,对方确认后完全关闭TCP连接。因此四次挥手保证了双方都确认断开连接,有效防止了未传输完的数据丢失

  1. 第一次挥手:客户端发送 FIN,表示它不再发送数据。
  2. 第二次挥手:服务端收到 FIN,回复 ACK,确认不再接收客户端数据。
  3. 第三次挥手:服务端发送 FIN,表示它的数据也发送完毕,不再发送数据,请求释放连接。
  4. 第四次挥手:客户端收到服务端的 FIN,发送 ACK,确认连接关闭。

1.3. 为什么不能把服务端发送的ACK和FIN合并起来,变成三次挥手?

        因为服务端收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示服务端收到了客户端发送的断开连接的请求,不再接收客户端发送的数据,但服务端此时仍可以向客户端发送数据,等到数据发完之后再发送 FIN 给客户端,断开服务端到客户端的数据传送。

1.4. 如果第二次挥手时服务端的 ACK 没有送达客户端,会怎样?

        客户端在发送 FIN 给服务端后,没有收到服务端发送到 ACK,会重新发送 FIN 请求。

1.5. 为什么要有第四次挥手?

        第四次挥手客户端发送 ACK 给服务端的目的是确保服务端知道客户端已经收到关闭请求,服务端可以安全的释放资源并结束连接。否则如果不进行第四次挥手的话,服务端发送 FIN给客户端后,无法知道客户端是否接收到了自己释放连接的请求,导致客户端一直进行等待。如果客户端不发送 ACK,服务端会一直保持 LAST-ACK状态,直至超时或重发 FIN。

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

        因为第四次挥手时,客户端发送给服务端的 ACK 有可能丢失,如果服务端因为某些原因没有接收到 ACK 的话,服务端就会重发 FIN ,如果客户端在 2*MSL的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止服务端没有收到 ACK 而不断重发 FIN。

        MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

相关文章:

TCP三次握手四次挥手详解

TCP三次握手建立连接的过程: 一次握手:客户端发送带有 SYN(seqx)标志的数据包到服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认。二次握手:服务端收到 SYN 包后,发送带有 S…...

了解 如何使用同快充充电器给不同设备快速充电

在这科技发展迅速的时代,快充技术已经走进了我们生活,不得不说有了快充技术的对比,传统的充电模式已经满足不了人们对充电速度的要求。就比如用华为输出100 W快充充电器为手机充电大概需要23分钟充满100%电量,而传统的充电器则需要…...

AGI interior designer丨OPENAIGC开发者大赛高校组AI创作力奖

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...

Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!

🧸本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻 📜后续会退出ububtu安装docker教程,敬请期待 📜作者首页&…...

QT day01

自定义实现登录界面&#xff1a; #include "widget.h" #include "ui_widget.h" #include<QPushButton> #include<QLineEdit> #include<QLabel>Widget::Widget(QWidget *parent) //定义有参构造函数: QWidget(parent), ui(new Ui::Widge…...

如何从飞机、电报中提取数据

电报&#xff0c;通常简称TG&#xff0c;是一个跨平台的即时通讯软件。客户端是开源的&#xff0c;而服务器是专有的。用户可以交换加密的、自毁的信息&#xff08;类似于“阅读后烧伤”&#xff09;&#xff0c;并共享各种文件&#xff0c;包括照片和视频。它的安全性很高&…...

【算法篇】二叉树类(2)(笔记)

目录 一、Leetcode 题目 1. 左叶子之和 &#xff08;1&#xff09;迭代法 &#xff08;2&#xff09;递归法 2. 找树左下角的值 &#xff08;1&#xff09;广度优先算法 &#xff08;2&#xff09;递归法 3. 路径总和 &#xff08;1&#xff09;递归法 &#xff08;2…...

Flask学习之项目搭建

一、项目基本结构 1、 exts.py 存在的目的&#xff1a;在Python中&#xff0c;如果两个或更多模块(文件)相互导入对方&#xff0c;就会形成导入循环。例如&#xff0c;模块A导入了模块B&#xff0c;同时模块B又导入了模块A&#xff0c;这就会导致导入循环。 比如在这个项目中…...

**CentOS7安装Maven**

CentOS7安装Maven 首先先解压压缩包apache-maven-3.9.9-bin.tar.gz tar -xvf apache-maven-3.9.9-bin.tar.gz解压完毕后配置环境变量 vim /etc/profile在环境变量配置文件中加入这句话 #Maven export MAVEN_HOME/opt/soft/maven362 //换成自己的路径 export PATH$PATH:$JAVA…...

(undone) MIT6.824 Lecture1 笔记

参考1MIT课程视频&#xff1a;https://www.bilibili.com/video/BV16f4y1z7kn/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考2某大佬笔记&#xff1a;https://ashiamd.github.io/docsify-notes/#/study/%E5%88%86%E5%B8%83%…...

小白投资理财 - 开篇

小白投资理财 - 开篇 第一健身第二提升工作技能第三理财自律和规划 我认为的人生三件大事值得投资&#xff0c;一是强身健体&#xff0c;有个好身体&#xff1b;二是提升工作技能&#xff0c;不断学习工作领域里的新知识&#xff1b;三是投资理财&#xff0c;确保资产不贬值。 …...

高中还来得及选择信息学奥赛赛道吗?

随着信息学奥赛&#xff08;NOI&#xff09;在升学中的重要性日益凸显&#xff0c;越来越多的学生和家长将其视为进入顶尖高校的一个重要途径。然而&#xff0c;很多学生可能直到高中阶段才意识到信息学奥赛的重要性&#xff0c;或者才开始对编程产生兴趣。于是问题出现了&…...

01_OpenCV图片读取与展示

import cv2 img cv2.imread(夕阳.jpg, 1) #cv2.imshow(image, img) #此行只能命令行处py文件执行&#xff0c;会弹出一个视频窗口 #cv2.waitKey (0)以下会在jupyter Lab控件中显示读取的图像 #bgr8转jpeg格式 import enum import cv2def bgr8_to_jpeg(value, quality75):ret…...

C语言中的输入控制重要基础

在C语言编程中&#xff0c;处理输入数据是一个常见的任务。根据不同的情况&#xff0c;我们可以采用不同的输入控制方法。本文将介绍三类输入控制方式&#xff0c;分别是已知数据组数的输入、以特定符号结束的输入&#xff0c;以及以EOF结束的输入。 1. 已知数据组数的输入 在…...

Vue 学习

使用 vue 创建一个项目 检查是否已经安装了 npm 和 node npm --version node --version 使用 npm 安装 vue npm install -g vue/cli 检查 vue 工具是否安装成功 vue --version 使用 vue 工具创建一个名为 vue-router-syntax 的项目 这是命令行的创建方式 vue create vu…...

Redis集群的两种方式

1.Redis集群 1.1 搭建主从集群 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写的分离。一般情况下&#xff0c;主节点负责写操作&#xff0c;从节点负责读操作。而从节点如何得知数据呢&#xff…...

QT--基础

将默认提供的程序都注释上意义 0101.pro QT core gui #QT表示要引入的类库 core&#xff1a;核心库 gui&#xff1a;图形化界面库 #如果要使用其他库类中的相关函数&#xff0c;则需要加对应的库类后&#xff0c;才能使用 greaterThan(QT_MAJOR_VERSION, 4): QT wid…...

一、前后端分离及drf的概念

1.1什么是前后端分离 程序角度 前后端不分离&#xff1a;一个程序&#xff08;如django),接收请求处理HTML模版用户返回 前后端分离&#xff1a;两个程序 --前端&#xff1a;vue.js/react.js/angular.js --后端&#xff1a;Django drf(django rest framework) 2.专业角度 --…...

AI垃圾溢出识别摄像机

随着城市化进程的加快&#xff0c;垃圾处理成为城市管理中的一项重要工作。然而&#xff0c;垃圾桶溢出现象经常发生&#xff0c;给城市环境卫生和市民生活带来不便。为了解决这一问题&#xff0c;AI垃圾溢出识别摄像机 应运而生&#xff0c;利用人工智能技术&#xff0c;实现对…...

【抽代复习笔记】29-群(二十三):生成子群的两道例题及子群陪集的定义

例1&#xff1a;取S3的子集S {(12),(123)}&#xff0c;S的生成子群包含哪些元&#xff1f;一个群的两个不同的子集会不会生成相同的子群&#xff1f; 解&#xff1a;&#xff08;1&#xff09;S的生成子群就是S3。证明[有不理解之处可以回头看看第27篇笔记中生成子群的定…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...