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

TCP四次挥手过程详解

TCP四次挥手全过程

在这里插入图片描述

有几点需要澄清:

1.首先,tcp四次挥手只有主动和被动方之分,没有客户端和服务端的概念

2.其次,发送报文段是tcp协议栈的行为,用户态调用close会陷入到内核态

3.再者,图中的情况前提是双方程序正常运行,程序在挥手过程中崩溃的情况后面会讲到

过程详解(时间顺序)

1.A程序调用close关闭连接,陷入到内核态,tcp协议栈发送fin报文段,此时A进入fin_wait1状态,等待B的ack回复

2.B的tcp协议栈接收到fin报文,回复ack,进入close_wait状态,等待B的用户态程序调用close

3.A的tcp协议栈接收到ack,进入半关闭状态(B->A的单向通信)

4.A进入半关闭的同时,进入fin_wait2状态,等待B发送fin报文

分析B程序的状态:A发送fin报文(将标志位fin置1),B的协议栈接收并判断为fin报文,向该条连接的tcp控制块的接收缓冲区(在内核)写入EOF结束符,B程序调用recv返回0,判断对方断开连接

5.B程序判断A请求断开连接,正常的逻辑是B也调用close断开连接

6.B调用close,陷入到内核态,tcp协议栈发送fin报文,B进入last_ack状态,等待A的ack

7.A收到B的fin报文,结束fin_wait2状态,回复ack,进入time_wait状态

8.B收到A的ack后,断开连接

9.A在time_wait规定的2MSL时间到期时断开连接

状态详解

1.close_wait状态:被动断开方发送ack回复主动方的fin后进入close_wait状态,因为对方已经请求断开连接,本端也要进入断开连接的流程,而断开连接是由用户态程序控制的,在这个状态下,等待程序调用close陷入到内核态,协议栈才能发送本方的fin报文

如果被动方程序一直不调用close,该tcp连接会处于半关闭状态

2.fin_wait1和fin_wait2:1是主动方发送fin后等待ack的状态,2是等待对方发送fin的状态

重点!

3.time_wait状态:主动断开连接方在发送ack回复被动方的fin后进入time_wait状态,这个状态的内容就是等待2MSL的时间,随后关闭连接。

MSL是最大报文生存时间,在传输中超过此时间的报文会失效

等待2MSL时间的原因:

a.在进入time_wait前,有延迟未到达A的报文,最晚会在1MSL后到达,而在A进入time_wait状态时,B已经发送fin,不会在time_wait后有新的来自B的报文,第一个MSL可以确保网络中所有滞留的报文正确A被接收

b.在A向B发送fin后进入time_wait状态,如果该fin丢失或超时导致B没有收到fin,B会重传一个fin报文,告诉A需要重发fin报文。

最坏情况:在B重传fin时,过去了1MSL,A最晚接收到该fin并重发ack的时间是在B重传fin的1MSL后

所以,第二个MSL保证了最坏情况下A可以重发第二个ack给B,以处理B没有收到第一次ack的情况,大部分情况下,A可以处理并重发B的多个重发的fin

time_wait状态通过等待2MSL确保了:

1.所有在网络中滞留的旧报文段在此期间会被自然丢弃。

2.确保重传机制有足够的时间处理任何潜在的重传报文,如FIN和ACK报文。

3.防止旧的报文段干扰未来的连接。

特殊情况

一、A处于time_wait状态时,当B没有接收到第一次的ack时重发fin,A会在2MSL内收到这个重发的fin并重发ack,如果B一直没收到ack怎么办?

Q:如果B没有接收到A重发的ack怎么办?此时A已经关闭连接,B不会再接收到ack,那么B该怎么关闭连接?

A:如果主机B没有收到主机A的ACK,它会继续按照TCP的重传机制定期重传FIN报文,直到重传次数达到设定的上限(通常是TCP实现中的一个参数,RFC 1122规定是最多重传4次,每次重传都会等待一个时间间隔。这个时间间隔通常会指数增长(即所谓的“指数退避”))

A在TIME_WAIT状态下会处理这些重传的FIN报文,并每次都重新发送ACK报文(1-4个,最坏情况下只能重发一次ack)

B在重传次数耗尽之后,如果仍未收到ACK报文,它会认为连接已经关闭并释放资源

二、在四次挥手过程中发生:1.主动断开方的程序崩溃 2.被动断开方的程序崩溃

一言以蔽之:协议栈会关闭该程序所有套接字并发送RST(reset)报文给对方,表示连接非正常关闭,收到RST报文的一方会通过recv和errno获知

前置细节

1.在关闭TCP连接时,如果操作系统检测到连接正在进行中(比如在ESTABLISHEDFIN_WAITCLOSE_WAIT等状态),它会发送RST报文给对方,通知对方连接被异常终止

2.对端在接收到RST报文后,会在后续的网络操作中感知到连接被重置:

  • 对端的系统调用错误
    • 对端的应用程序如果尝试在接收到RST报文后继续进行网络操作,会在相应的系统调用中收到错误。
    • 这些系统调用会返回错误,并设置errno。例如,如果对端调用recv,会返回-1,并设置errnoECONNRESET,表示连接被重置。
详细分析

1. 主动断开方的程序崩溃

情景:
  • 主动断开方(主机A)发送了FIN报文,进入FIN_WAIT_2状态,等待被动断开方(主机B)发送FIN报文来完成连接的关闭。
  • 主机A的程序在此时崩溃。
结果:
  • 主机A的TCP连接关闭:
    • 主机A的程序崩溃导致操作系统关闭该程序相关的所有套接字,包括处于FIN_WAIT_2状态的套接字。
    • 主机A的TCP栈会发送RST(Reset)报文给主机B,表示连接已被非正常关闭。
  • 主机B的处理:
    • 主机B收到RST报文后,立即终止连接并释放相关资源。
    • 任何在此连接上的未完成数据传输都将被终止,应用程序将收到错误通知,表明连接被重置。

2. 被动断开方的程序崩溃

情景:
  • 被动断开方(主机B)在接收到主机A的FIN报文后,发送ACK并进入CLOSE_WAIT状态,等待应用程序调用close以发送FIN报文。
  • 主机B的程序在此时崩溃。
结果:
  • 主机B的TCP连接关闭:
    • 主机B的程序崩溃导致操作系统关闭该程序相关的所有套接字,包括处于CLOSE_WAIT状态的套接字。
    • 主机B的TCP栈会发送RST(Reset)报文给主机A,表示连接已被非正常关闭。
  • 主机A的处理:
    • 主机A收到RST报文后,立即终止连接并释放相关资源。
    • 主机A的应用程序会收到错误通知,表明连接被重置。

总结:

无论是主动断开方还是被动断开方的程序崩溃,最终结果都是TCP连接被非正常关闭,两者的TCP栈会发送RST报文给对方,通知对方连接已被重置。收到RST报文的一方会立即终止连接并释放相关资源。应用程序会收到相应的错误通知,表明连接被异常终止。

点击获取更多Linux C/C++开发学习资料

相关文章:

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清: 1.首先,tcp四次挥手只有主动和被动方之分,没有客户端和服务端的概念 2.其次,发送报文段是tcp协议栈的行为,用户态调用close会陷入到内核态 3.再者,图中的情况前提是双…...

在 MySQL 中处理和优化大型报告查询经验分享

在 MySQL 数据库的使用过程中,我们经常会遇到需要生成大型报告的情况,这些查询可能涉及大量的数据和复杂的计算,对数据库的性能提出了很高的要求。 一、问题背景 大型报告查询通常具有以下特点: 数据量大:涉及大量的…...

数字图像处理:空间域滤波

1.数字图像处理:空间域滤波 1.1 滤波器核(相关核)与卷积 图像上的邻域计算 线性空间滤波的原理 滤波器核(相关核)是如何得到的? 空间域的卷积 卷积:滤波器核与window中的对应值相乘后所有…...

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理: Cannot add merged region …...

DDOS攻击会对网站服务器造成哪些影响?

DDOS攻击作为日常生活正比较常见的网络攻击类型,可以让多台计算机在同一时间内遭受到攻击,下面小编就带领大家一起来了解一下DDOS攻击会对网站服务器造成哪些影响吧! 首先DDOS攻击在进行攻击的过程中,可以对源IP地址进行伪造&…...

linux基础指令的认识

在正式学习linux前,可以简单认识一下linux与win的区别 win:是图形界面,用户操作更简单;在刚开始win也是黑屏终端 指令操作,图形界面就是历史发展的结果。Linux:也存在图形界面比如desktop OS;但…...

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式(是否倾斜)1.4 常见字体系列(了解)1.5 字体系列拓展-层叠性font复合属性文本…...

828华为云征文|部署个人文档管理系统 Docspell

828华为云征文|部署个人文档管理系统 Docspell 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Docspell3.1 Docspell 介绍3.2 Docspell 部署3.3 Docspell 使用…...

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数 4.1.2 激活函数ReLU 函数参数化 ReLU Sigmoid 函数背景绘制 sigmoid 函数Sigmoid 函数的导数 Tanh 函数Tanh 函数的导数总结 4.1.2 激活函数 激活函数(activation function)用于计算加权和…...

对于基础汇编的趣味认识

汇编语言 机器指令 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 电子计算机的机器指令是一列二进制数字 (计算机将其转变为一列高低电平,使得计算机的电子器件受到驱动,进行运算 寄存器:微处理器…...

网络基础知识笔记(一)

什么是计算机网络 1.计算机网络发展的第一个阶段:(60年代) 标志性事件:ARPANET 关键技术:分组交换 计算机网络发展的第二个阶段:(70-80年代) 标志性事件:NSFNET 关键技术:TCP/IP 计算机网络发展的第三个阶段&#xff…...

fatal: urdf 中的 CRLF 将被 LF 替换

git add relaxed_ik_ros2 fatal: relaxed_ik_ros2/relaxed_ik_core/configs/urdfs/mobile_spot_arm.urdf 中的 CRLF 将被 LF 替换 这个错误信息表示 Git 在处理文件 mobile_spot_arm.urdf 时发现它使用了 CRLF(回车换行符,常见于 Windows 系统&#xff0…...

构建electron项目

1. 使用electron-vite构建工具 官网链接 安装构建工具 pnpm i electron-vite -g创建electron-vite项目 pnpm create quick-start/electron安装所有依赖 pnpm i其他 pnpm -D add sass scss1. 启动项目 2. 配置 package.json "dev": "electron-vite dev --…...

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」: 下方「运动」Tab 会有一系列参数: 以下4个参数,只有「动画模式」选择「2D」才会生效,可忽略: 运动 平移 X 让镜头左右移动: 大于0&a…...

STM32中断——外部中断

目录 一、概述 二、外部中断(Extern Interrupt简称EXTI) 三、实例-对射式红外传感器 1、配置中断: 2 、完整代码 一、概述 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当…...

LeetCode78 子集

题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[…...

《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学

希望这个下集里能有完整的代码 一、containsPoint实现 先从网上找一下Statement expected, found Py:DEDENTTAB还是空格呢??小小总结如何拆分矩形的四个点呢.我们来小小的测试一下这个函数结果出在哪里呢???修改完成variable in function should be lowercase 函数变量应该…...

【C++】入门基础介绍(上)C++的发展历史与命名空间

文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …...

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…...

SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间,ABAP调用MMPV/MMRV来批量更新会计期间(TODO)

之前用MMRV,MMPV来一次一个月来修改会计期间。 如果是老的测试机,可能是10几年前的,一次1个月,更新到当前期间,搞个100多次,手都抖。 SAP MM学习笔记 - 错误 M7053 - Posting only possible in periods 2…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...