当前位置: 首页 > 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篇笔记中生成子群的定…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

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…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...