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

tcp链接中的三次挥手是什么原因

一、tcp链接中的正常四次挥手过程?

在这里插入图片描述

刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下:

1、客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。2、接着,当服务端在 read 数据的时候,最后⾃然就会读到 EOF,接着 read() 就会返回 0,这时服务端应⽤程序如果有数据要发送的话,就发完数据后才调⽤关闭连接的函数,如果服务端应⽤程序没有数据要发送的话,可以直接调⽤关闭连接的函数,这时服务端就会发⼀个 FIN 包,这个 FIN 报⽂代表服务端不会再发送数据了,之后处于 LAST_ACK 状态;。
3、客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
4、等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
5、客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
6、服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
7、客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。
你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。

这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。

二、为什么挥手需要四次

服务器收到客户端的 FIN 报⽂时,内核会⻢上回⼀个 ACK 应答报⽂,但是服务端应⽤程序可能还有数据要发送,所以并不能⻢上发送 FIN 报⽂,⽽是将发送 FIN 报⽂的控制权交给服务端应⽤程序

1、关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
2、服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上⾯过程可知,是否要发送第三次挥⼿的控制权不在内核,⽽是在被动关闭⽅(上图的服务端)的应⽤程序,因为应⽤程序可能还有数据要发送,由应⽤程序决定什么时候调⽤关闭连接的函数,当调⽤了关闭连接的函数,内核就会发送 FIN 报⽂了,所以服务端的 ACK 和 FIN ⼀般都会分开发送。

FIN 报⽂⼀定得调⽤关闭连接的函数,才会发送吗?不一定

如果进程退出了,不管是不是正常退出,还是异常退出(如进程崩溃),内核都会发送 FIN 报⽂,与对⽅完成四次挥⼿。

三、粗暴关闭 vs 优雅关闭

前⾯介绍 TCP 四次挥⼿的时候,并没有详细介绍关闭连接的函数,其实关闭的连接的函数有两种函数:

  • close 函数,同时 socket 关闭发送⽅向和读取⽅向,也就是 socket 不再有发送和接收数据的能⼒。如果有多进程/多线程共享同⼀个 socket,如果有⼀个进程调⽤了 close 关闭只是让 socket 引⽤计数-1,并不会导致 socket 不可⽤,同时也不会发出 FIN 报⽂,其他进程还是可以正常读写该 socket, 直到引⽤计数变为 0,才会发出 FIN 报⽂。
  • shutdown 函数,可以指定 socket 只关闭发送⽅向⽽不关闭读取⽅向,也就是 socket 不再有发送数据的能⼒,但是还是具有接收数据的能⼒。如果有多进程/多线程共享同⼀个 socket,shutdown 则不 管引⽤计数,直接使得该socket 不可⽤,然后发出 FIN 报⽂,如果有别的进程企图使⽤该 socket, 将会受到影响。

如果客户端是⽤ close 函数来关闭连接,那么在 TCP 四次挥⼿过程中,如果收到了服务端发送的数据,由于客户端已经不再具有发送和接收数据的能⼒,所以客户端的内核会回 RST 报⽂给服务端,然后内核会释放连接,这时就不会经历完成的 TCP 四次挥⼿,所以我们常说,调⽤ close 是粗暴的关闭。
在这里插入图片描述
当服务端收到 RST 后,内核就会释放连接,当服务端应⽤程序再次发起读操作或者写操作时,就能感知到连接已经被释放了:

  • 如果是读操作,则会返回 RST 的报错,也就是我们常⻅的Connection reset by peer。
  • 如果是写操作,那么程序会产⽣ SIGPIPE 信号,应⽤层代码可以捕获并处理信号,如果不处理,则默 认情况下进程会终⽌,异常退出。

相对的,shutdown 函数因为可以指定只关闭发送⽅向⽽不关闭读取⽅向,所以即使在 TCP 四次挥⼿过程中,如果收到了服务端发送的数据,客户端也是可以正常读取到该数据的,然后就会经历完整的 TCP 四次挥⼿,所以我们常说,调⽤ shutdown 是优雅的关闭。

在这里插入图片描述
但是注意,shutdown 函数也可以指定「只关闭读取⽅向,⽽不关闭发送⽅向」,但是这时候内核是不会发送 FIN 报⽂的,因为发送 FIN 报⽂是意味着我⽅将不再发送任何数据,⽽ shutdown 如果指定「不关闭发送⽅向」,就意味着 socket 还有发送数据的能⼒,所以内核就不会发送 FIN。

四、什么情况会出现三次挥⼿?

当被动关闭⽅(上图的服务端)在 TCP 挥⼿过程中,「没有数据要发送」并且「开启了 TCP 延迟确认机制」,那么第⼆和第三次挥⼿就会合并传输,这样就出现了三次挥⼿

在这里插入图片描述
然后因为 TCP 延迟确认机制是默认开启的,所以导致我们抓包时,看⻅三次挥⼿的次数⽐四次挥⼿还多。

什么是 TCP 延迟确认机制?

当发送没有携带数据的 ACK,它的⽹络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报⽂。为了解决 ACK 传输效率低问题,所以就衍⽣出了 TCP 延迟确认。

TCP 延迟确认的策略:

  • 当有响应数据要发送时,ACK 会随着响应数据⼀起⽴刻发送给对⽅
  • 当没有响应数据要发送时,ACK 将会延迟⼀段时间,以等待是否有响应数据可以⼀起发送
  • 如果在延迟等待发送 ACK 期间,对⽅的第⼆个数据报⽂⼜到达了,这时就会⽴刻发送 ACK

在这里插入图片描述

相关文章:

tcp链接中的三次挥手是什么原因

一、tcp链接中的正常四次挥手过程? 刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下: 1、客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文…...

运维相关知识

一、运维需要关注 服务器的哪些数据? 1. CPU 1.1 CPU使用率: top,vmstat (1) 用户CPU使用率:用户态程序的使用率。top 命令 us 字段和 nice字段 (低优先级) (2) 系统CPU使用率:内核态程序的使用率。top 命令 sy 字…...

网络安全基础技术扫盲篇名词解释之“证书“

用通俗易懂的话说: 证书就好比是一张身份证(类似,但不完全相同),用来证明一个网站的身份是否可信。就像你要确认一个陌生人的身份需要看他的身份证一样,电脑在连接一个网站时,也会查看网站的证…...

[数据集][目标检测]老鼠检测数据集VOC+YOLO格式4107张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4107 标注数量(xml文件个数):4107 标注数量(txt文件个数):4107 标注…...

12 FreeRTOS 调试与优化

1、调试 1.1 打印 在FreeRTOS工程中使用了microlib,里面实现了printf函数。 只需要实现一下以下函数即可使用printf。 int fputc(int ch; FILE *f); 假如要从串口实现打印函数: int fputc( int ch, FILE *f ) {//指定串口USART_TypeDef* USARTx USAR…...

【Qt秘籍】[009]-自定义槽函数/信号

自定义槽函数 在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤: 步骤 1: 定义槽…...

HTTPS加密

一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…...

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…...

SpringBoot如何使用日志Logback,及日志等级详解

Spring Boot默认已经集成了SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为日志的接口&#xff0c;以及Logback作为日志的实现。这意味着在大多数情况下&#xff0c;你无需做额外的配置即可开始记录日志。 下面是一个简要的指南&#xff0c;包括如何在Spring…...

若依启动run-modules-system.bat报错问题解决方案

在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…...

Aws CodeCommit代码仓储库

1 创建IAM用户 IAM创建admin用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...

PostgreSQL的内存参数

PostgreSQL的内存参数 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777PostgreSQL 提供了多种内存参数&#x…...

【教程】在CentOS上使用Docker部署前后端分离项目的完整指南

当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...

某公司新招了个牛逼的架构师后.....

网友评论&#xff1a; 架构师一个响指之后。第二天&#xff0c;老板不见了走走停停 回头已是数月图片是我的故事没错了&#xff0c;本来我们组有10个人&#xff0c;我把代码重构之后&#xff0c;只要半个人维护&#xff0c;于是老板要裁掉9个>人&#xff0c;于是我被搞走了图…...

云计算和雾计算

雾计算作为传统集中式数据存储系统&#xff08;云&#xff09;和边缘设备之间的中间层。雾扩展了云&#xff0c;使计算和数据存储更接近边缘。雾由多个节点&#xff08;雾节点&#xff09;组成&#xff0c;并创建一个本地网络&#xff0c;使其成为一个去中心化的生态系统——雾…...

正缘画像 api数据接口

测测正缘画像&#xff0c;相貌特征&#xff0c;高矮胖瘦&#xff0c;黑白美丑&#xff0c;对方何许人也&#xff0c;远嫁近娶&#xff0c;何方定居&#xff0c;家庭观&#xff0c;持家爱家&#xff0c;生活质量&#xff0c;富裕贫穷&#xff0c;健康情况&#xff0c;测算结果仅…...

Java 基础面试300题 (171- 200)

Java 基础面试300题 &#xff08;171- 200&#xff09; 171.什么是同步&#xff1f; 当多个线程试图同时访问共享资源时&#xff0c;那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…...

0基础学习Elasticsearch-使用Java操作ES

文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端&#xff08;获取ES连接&#xff09;3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start&#xff0c;随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…...

【Linux】GNU编译器基础

文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等&#xff0c;适用于C/C中&#xff0c;在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作&#xff0c;但在Linux系统中通常使用GNU编译器来进行&#xff0c;对于C/C等高级语言需要进行预编译、编…...

Linux 软件安装:从源码编译到包管理器安装

Linux 软件安装&#xff1a;从源码编译到包管理器安装 在 Linux 操作系统中&#xff0c;软件安装是一个非常重要的任务。不同的软件安装方式有不同的优缺点&#xff0c;本篇博客将介绍 Linux 软件安装的几种方式&#xff0c;包括从源码编译安装、使用包管理器安装和使用第三方…...

GA/T 1400视图库实战:从零部署Easy1400平台到设备级联全流程解析

1. 初识GA/T 1400与Easy1400平台 第一次接触GA/T 1400标准时&#xff0c;我完全被各种专业术语绕晕了。简单来说&#xff0c;这是一套专门针对视频监控领域的行业标准&#xff0c;规定了视频图像信息在采集、传输、存储等环节的技术要求。而Easy1400就是基于这个标准开发的一套…...

用Python复现FAST天眼数学建模:从坐标变换到促动器伸缩量计算(附完整代码)

用Python复现FAST天眼数学建模&#xff1a;从坐标变换到促动器伸缩量计算&#xff08;附完整代码&#xff09; 中国天眼FAST作为全球最大单口径射电望远镜&#xff0c;其主动反射面调节系统堪称现代工程奇迹。当观测不同方位天体时&#xff0c;需要通过促动器精确控制4450块反射…...

计算机科学第三难题:“树映射”问题在文件、写作、建筑、生物分类中无处不在!

计算机科学第三难题&#xff1a;将通用图映射到层次结构&#xff0c;“树映射”问题无处不在 根据一个归属于 菲尔卡尔顿 的 经典笑话&#xff0c;计算机科学只有两个难题&#xff1a;命名和缓存失效。这两个问题之所以难&#xff0c;是因为没有算法可以解决它们&#xff1a;好…...

如何在3分钟内为Photoshop安装AVIF插件:让你的图片体积减半的终极方案

如何在3分钟内为Photoshop安装AVIF插件&#xff1a;让你的图片体积减半的终极方案 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 还在为网站图片加载缓慢而烦恼…...

别再死记硬背了!用MATLAB手把手教你画根轨迹图(附代码与避坑指南)

MATLAB实战&#xff1a;从零绘制根轨迹图的完整指南与避坑技巧 在控制系统的设计与分析中&#xff0c;根轨迹图是理解系统动态特性的重要工具。传统教学中&#xff0c;学生往往被要求死记硬背绘制规则&#xff0c;却难以理解其实际应用价值。本文将彻底改变这一现状——通过MAT…...

基于Readability算法的网页内容提取服务:从原理到工程实践

1. 项目概述&#xff1a;一个为现代阅读而生的开源工具 最近在折腾个人知识库和稍后读系统时&#xff0c;我一直在找一个能完美解决“网页内容净化与结构化”痛点的工具。市面上的方案要么太重&#xff0c;要么太简陋&#xff0c;直到我遇到了 Cat-tj/web-reader 。这不仅仅是…...

Seraphine:英雄联盟智能BP助手与战绩查询工具完整指南

Seraphine&#xff1a;英雄联盟智能BP助手与战绩查询工具完整指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 在英雄联盟的对局中&#xff0c;BP&#xff08;禁选英雄&#xff09;阶段往往是决定胜负的关…...

Switch便携投影底座DIY:3D打印与硬件改造实战指南

1. 项目概述&#xff1a;当Switch遇上投影&#xff0c;一场桌面上的大屏革命作为一个折腾过不少游戏机外设的玩家&#xff0c;我一直在想&#xff0c;有没有办法让Switch的“便携”属性再进化一步&#xff1f;官方底座接电视固然爽&#xff0c;但总被一根线缆束缚在客厅。直到我…...

自主智能体框架构建指南:从LLM工具调用到多任务规划系统

1. 项目概述&#xff1a;一个能“开疆拓土”的智能体框架最近在开源社区里&#xff0c;一个名为njbrake/agent-of-empires的项目引起了我的注意。光看这个名字&#xff0c;就充满了野心和想象力——“帝国的代理人”。这可不是一个简单的脚本工具&#xff0c;而是一个旨在构建能…...

无代码物联网实战:基于ESP32与WipperSnapper的泳池水温监测方案

1. 项目概述&#xff1a;告别繁琐编程&#xff0c;用无代码方案守护泳池水温又到了打理泳池的季节&#xff0c;除了常规的清洁和化学平衡&#xff0c;水温其实是个挺关键的指标。水温不仅影响游泳的舒适度&#xff0c;也关系到泳池加热设备的能耗和泳池化学品的反应速率。以前想…...