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连接时,如果操作系统检测到连接正在进行中(比如在ESTABLISHED、FIN_WAIT、CLOSE_WAIT等状态),它会发送RST报文给对方,通知对方连接被异常终止
2.对端在接收到RST报文后,会在后续的网络操作中感知到连接被重置:
- 对端的系统调用错误
- 对端的应用程序如果尝试在接收到RST报文后继续进行网络操作,会在相应的系统调用中收到错误。
- 这些系统调用会返回错误,并设置
errno。例如,如果对端调用recv,会返回-1,并设置errno为ECONNRESET,表示连接被重置。
详细分析
1. 主动断开方的程序崩溃
情景:
- 主动断开方(主机A)发送了FIN报文,进入
FIN_WAIT_2状态,等待被动断开方(主机B)发送FIN报文来完成连接的关闭。 - 主机A的程序在此时崩溃。
结果:
- 主机A的TCP连接关闭:
- 主机A的程序崩溃导致操作系统关闭该程序相关的所有套接字,包括处于
FIN_WAIT_2状态的套接字。 - 主机A的TCP栈会发送RST(Reset)报文给主机B,表示连接已被非正常关闭。
- 主机A的程序崩溃导致操作系统关闭该程序相关的所有套接字,包括处于
- 主机B的处理:
- 主机B收到RST报文后,立即终止连接并释放相关资源。
- 任何在此连接上的未完成数据传输都将被终止,应用程序将收到错误通知,表明连接被重置。
2. 被动断开方的程序崩溃
情景:
- 被动断开方(主机B)在接收到主机A的FIN报文后,发送ACK并进入
CLOSE_WAIT状态,等待应用程序调用close以发送FIN报文。 - 主机B的程序在此时崩溃。
结果:
- 主机B的TCP连接关闭:
- 主机B的程序崩溃导致操作系统关闭该程序相关的所有套接字,包括处于
CLOSE_WAIT状态的套接字。 - 主机B的TCP栈会发送RST(Reset)报文给主机A,表示连接已被非正常关闭。
- 主机B的程序崩溃导致操作系统关闭该程序相关的所有套接字,包括处于
- 主机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 计算机网络发展的第三个阶段ÿ…...
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 系统࿰…...
构建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…...
libpcap BPF过滤器完全指南:构建高效网络数据包过滤系统
libpcap BPF过滤器完全指南:构建高效网络数据包过滤系统 【免费下载链接】libpcap the LIBpcap interface to various kernel packet capture mechanism 项目地址: https://gitcode.com/gh_mirrors/li/libpcap libpcap是一款强大的网络数据包捕获库ÿ…...
Realistic Vision V5.1 惊艳作品集:基于卷积神经网络的人像摄影风格迁移
Realistic Vision V5.1 惊艳作品集:基于卷积神经网络的人像摄影风格迁移 你有没有想过,自己随手拍的一张普通自拍照,也能变成一张充满电影感、艺术气息的专业级人像作品?这听起来像是专业摄影师和后期修图师的专属魔法࿰…...
Cursor AI模型切换指南:从ChatGPT换到Gemini,这几步千万别做错
Cursor AI模型切换指南:从ChatGPT换到Gemini,这几步千万别做错 在当今快速迭代的AI开发领域,多模型协作已成为提升生产力的关键策略。作为一款深度整合AI能力的智能编辑器,Cursor允许开发者在不同AI模型间灵活切换,但…...
哔咔漫画下载器:多线程极速下载完整指南
哔咔漫画下载器:多线程极速下载完整指南 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器,带图形界面 带收藏夹,已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh_mirrors/pi/pi…...
深度解析DeepMIMO:毫米波大规模MIMO信道建模的5个架构设计决策
深度解析DeepMIMO:毫米波大规模MIMO信道建模的5个架构设计决策 【免费下载链接】DeepMIMO-matlab DeepMIMO dataset and codes for mmWave and massive MIMO applications 项目地址: https://gitcode.com/gh_mirrors/de/DeepMIMO-matlab 在5G/6G通信系统演进…...
AI Infra 架构全景介绍
AI Infra 架构全景 一、什么是 AI Infra AI Infra(AI 基础设施)是支撑大模型从开发到落地全过程的软件栈。它解决的核心问题是:如何让模型在有限的硬件资源上跑得更快、更大、更稳。 从抽象的视角看,整个 AI Infra 可以划分为三个…...
Claude Code助手对比:百川2-13B在代码生成与解释方面的能力展示
Claude Code助手对比:百川2-13B在代码生成与解释方面的能力展示 最近和几个做开发的朋友聊天,大家讨论最多的就是AI编程助手到底哪个更好用。Claude Code的名气确实很大,很多技术社区都在讨论它。不过,除了这些“明星”选手&…...
Maven Shade Plugin实战:解决Spring Boot胖JAR打包中的5个常见坑
Maven Shade Plugin实战:解决Spring Boot胖JAR打包中的5个常见坑 Spring Boot开发者们对"胖JAR"(fat JAR)应该都不陌生——这种将所有依赖打包进单个可执行文件的方式,极大简化了部署流程。但当你真正使用Maven Shade P…...
【通信】基于matlab MC-CDMA系统仿真【含Matlab源码 15245期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
告别数据打架:手把手教你用Python+Seurat整合单细胞数据,无缝衔接scVelo做RNA速率分析
告别数据打架:手把手教你用PythonSeurat整合单细胞数据,无缝衔接scVelo做RNA速率分析 单细胞测序技术的快速发展为生物医学研究带来了前所未有的分辨率,但不同分析工具之间的数据格式壁垒常常让研究者头疼。特别是当我们需要在R语言的Seurat和…...
