Linux网络编程(TCP状态转换关系)
文章目录
- 前言
- 一、TCP状态转换图
- 二、TCP连接状态转换解析
- 三、TCP断开状态转换解析
- 四、为什么需要有2MLS时长
- 总结
前言
本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。
一、TCP状态转换图

二、TCP连接状态转换解析
客户端状态转换:
1.CLOSED -> SYN-SENT:当客户端尝试与服务器建立连接时,客户端从CLOSED状态转换到SYN-SEND状态。此时客户端发送SYN(同步)包,表示请求建立连接,并等待服务器的确认。
2.当服务器确认后,发送SYN(同步)包和ACK(确认包)给客户端,客户端依然保持SYN-SEND状态,当客户端接收确认后会发送ACK(确认包)给服务器。
3.服务器接收到ACK(确认包)后就可以进行数据的通信了。此时客户端和服务器都进入了ESTABLISHED状态。
服务器状态转换:
1.CLOSED -> LISTEN:当服务器开始监听传入的连接请求时,服务器从CLOSED状态转换到LISTEN状态。此时服务器准备接收客户端的连接请求。
2.LISTEN -> SYN-RECEIVED:当服务器接收到客户端的连接请求后,服务器从LISTEN状态转换到SYN-RECEIVED状态。服务器发送确认(ACK)包给客户端,并等待客户端确认。
3.SYN-RECEIVED -> ESTABLISHED:当服务器收到客户端的确认(ACK)后,服务器从SYN-RECEIVED状态转换到ESTABLISHED状态。此时连接已经建立,双方可以开始进行数据传输。

三、TCP断开状态转换解析

客户端状态转换:
1.ESTABLISHED -> FIN-WAIT-1:当客户端决定终止连接时,客户端从ESTABLISHED状态转换到FIN-WAIT-1状态。客户端发送FIN(终止)包,表示请求终止连接,并等待服务器的确认。
2.FIN-WAIT-1 -> FIN-WAIT-2:当客户端收到服务器的确认(ACK)后,客户端从FIN-WAIT-1状态转换到FIN-WAIT-2状态。此时客户端等待服务器发送确认终止连接的请求。
3.FIN-WAIT-2 -> TIME-WAIT:当客户端收到服务器的确认终止连接的请求后,客户端从FIN-WAIT-2状态转换到TIME-WAIT状态。此时客户端进入等待状态,等待一段时间后才进入CLOSED状态。
4.TIME-WAIT -> CLOSED:经过一段时间的等待后,客户端从TIME-WAIT状态转换到CLOSED状态,表示连接彻底关闭。
服务器状态转换:
1.ESTABLISHED -> CLOSE-WAIT:当服务器决定终止连接时,服务器从ESTABLISHED状态转换到CLOSE-WAIT状态。服务器发送FIN(终止)包给客户端,并等待客户端确认。
2.CLOSE-WAIT -> LAST-ACK:当服务器收到客户端的确认(ACK)后,服务器从CLOSE-WAIT状态转换到LAST-ACK状态。此时服务器等待客户端发送确认终止连接的请求。
3.LAST-ACK -> CLOSED:当服务器收到客户端的确认终止连接的请求后,服务器从LAST-ACK状态转换到CLOSED状态。表示连接彻底关闭。
四、为什么需要有2MLS时长
2MSL(Maximum Segment Lifetime)是指TCP连接在关闭时,需要等待2倍的报文段最大存活时间,即两倍的报文最长生存时间来回收相关资源。这是TCP协议中设定的一个等待时间,用于确保连接双方都收到彼此的终止请求。
2MSL的存在是为了处理网络上可能存在的延迟、重传和乱序等问题,以确保连接的可靠关闭。在TCP连接关闭过程中,双方会交换终止连接的请求和确认,以保证数据传输的完整性和正确性。2MSL的设定时间可以确保在该时间段内,网络中所有与这个连接相关的报文段都能够被丢弃。
具体原因如下:
1.确保彻底关闭连接:2MSL的存在可以确保客户端和服务器都能收到对方的终止请求和确认,避免由于网络上的延迟或乱序等问题导致连接没有完全关闭。在2MSL的时间内,任何已失效的报文段都会被丢弃,从而确保连接彻底关闭。
2.确保旧连接不与新连接冲突:在TCP连接关闭后的一段时间内,可能会出现与之前关闭的连接相关的延迟报文段。如果新的连接使用了之前关闭连接时所用的端口号,这些延迟报文段可能会被错误地接收和处理。通过等待2MSL的时间,确保了旧连接中的所有报文段都已过期,不会与新的连接发生混淆。
3.防止延迟报文段对新连接的影响:在TCP连接关闭后,可能会出现延迟到达的报文段,这些报文段可能是在连接关闭前的最后一瞬间被发送出去的。如果新的连接使用的端口号与这些延迟报文段的源端口号冲突,可能导致报文段被误认为是新连接的一部分而产生错误。2MSL的等待时间可以确保所有延迟报文段都被丢弃,不会对新的连接产生干扰。
总结
本篇文章就讲解到这里,这部分的知识需要大家好好理解和消化。
相关文章:
Linux网络编程(TCP状态转换关系)
文章目录 前言一、TCP状态转换图二、TCP连接状态转换解析三、TCP断开状态转换解析四、为什么需要有2MLS时长总结 前言 本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 一、TCP状态转换图 二、TCP连接状态转换…...
tauri-vue:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果
Tauri Vue Typescript 一个使用 taurivuets 开发跨平台软件的模板,支持窗口头部自定义 UI 和拖拽和窗口阴影,不用再自己做适配了,拿来即用,非常 nice。而且已经封装好了 tauri 的 http 请求工具,省去很多弯路。开源…...
做好以下几点,可以让我们延长周末体验感,好好放松!!!
工作以后常常容易感到疲于奔命,让我们找到适合自己方式,来让我们度过一个充实放松的周末! 方向一:分享你周末的时间规划 我们可以把每个月当做一个周期,制定一个简单的计划,如:第一周,锻炼身体…...
Python 学习笔记——代码基础
目录 Python基础知识 变量 赋值 数据类型 print用法 print格式化输出 运算符 if-else 数据结构 元组 in运算符 列表 切片 [ : ] 追加 append() 插入 insert() 删除 pop() 字典 循环 for循环 for循环应用——遍历 for循环应用——累加…...
Android Studio 无法正常导入项目
Android Studio 无法正常导入 model,运行按钮边出现“Add Configuration”,可进行以下方法处理: 解决办法: 1、点击Run三角按钮左边紧挨的下拉按钮,选择Edit Configuration,选择 Default 新建一个Android…...
Grafana+Prometheus技术文档-进阶使用-监控spring-boot项目
阿丹: 之前已经实现了使用Prometheus来对服务器进行了监控和仪表盘的创建,现在就需要对这些监控方法使用在spring-boot中去。 实现思路: 1、集成Actuator 2、加入Prometheus的依赖 3、配置开放端口、以及开放监控 4、配置Prometheus中的配置…...
PG常用SQL
数据库 创建数据库 PostgreSQL 创建数据库可以用以下三种方式: 1、使用 CREATE DATABASE SQL 语句来创建。2、使用 createdb 命令来创建。3、使用 pgAdmin 工具。 CREATE DATABASE 创建数据库 CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行࿰…...
分模块开发的意义及开发步骤
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Maven进阶 一、分模块开发1.1分模块开发的意义1.2分模块开…...
vue-router中的一些 API
在Vue.js的vue-router中,一些重要api 1、RouterHistory:这是 vue-router 提供的路由历史记录对象。它可以跟踪当前页面的路由历史,并提供一些方法和属性来管理导航和历史记录。在 vue-router 中,有两种类型的路由历史记录对象&…...
go-zero 是如何实现令牌桶限流的?
原文链接: 上一篇文章介绍了 如何实现计数器限流?主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了 go-zero 采用固定窗口方式实现的源码。 但是采用固定窗口实现的限流器会有两个问题: 会出现请求量超出限…...
Oracle/PL/SQL奇技淫巧之ROWNUM伪列
ROWNUM伪列 ROWNUM是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行ROWNUM为1,第二行ROWNUM为2,以此类推。 注意1: ROWNUM伪列是在WHERE子句之…...
“MongoDB基础知识【超详细】
"探索MongoDB的无边之境:沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界!在这个博客中,我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者,MongoDB都将为您带来一场令人心动…...
腾讯24届校招内推
校招开始啦~有兴趣的话可以扫我的码投,也可以分享给身边找工作的同学~ ❤投递攻略 1️⃣腾讯校招步骤,先微信扫码绑定内推关系,后在电脑上上传更改简历和部门投递 2️⃣投递时将选择投递部门,投递后将在…...
星际争霸之小霸王之小蜜蜂(二)--类的使用
目录 前言 一、将设置内容写在一个类里 二、设置小蜜蜂的造型 三、设置猫蜜蜂的参数 四、绘制猫蜜蜂到窗口 总结 前言 昨天我们设置好了窗口,下面我们需要向窗口中添加元素了。 一、将设置内容写在一个类里 我个人理解书上的意思是要创建一个类,将所有需…...
AndroidStudio升级Gradle之坑
最近在做旧工程的升级,原来的Gradle版本是4.6的,需要升级到7.6,JDK从8升级到17,一路淌了很多坑,逐个记录下吧 1、Maven仓库需要升级到https 你会遇到这个报错 Using insecure protocols with repositories, without …...
C# int ? 关键字使用方法
使用C#的时间也不算短。 但是今天看到了一个从来没有见过的写法 Int ?这是个什么写法,没见过啊,百度了查一下,也在这里记录一下。 1、int? 关键字说明 (1)、int? 表示一个int类型,且该int类型可空,如果不加?的话,那么int类…...
Redis_主从复制
8. 主从复制 8.1 简介 主从库采用读写分离的方式 读操作:主库、从库都可以处理写操作:首先写到主库执行,然后再将主库同步给从库。 实现读写分离,性能扩展 容灾快速恢复 8.2 主从复制步骤 创建一个目录 ,在root下创建一个m…...
Postman 的 Pre-request Script 使用RSA加解密
文章目录 一、概述 一、概述 Postman内置的Js不支持进行RSA加解密,所以需要引入forgeJS来实现。在 Pre-request Script使用以下脚本: // ------ 导入RSA ------ if (!pm.globals.has("forgeJS")) {pm.sendRequest("https://raw.githubu…...
【Swagger】只需要3步搭建Swagger环境,就可以让你的项目实现Swagger在线文档,实时浏览,修改展示
目录 1. pom.xml文件中添加Swagger的jar包 2. 配置Swagger 3. 项目启动中加入Swagger注解的开关,启动Swagger功能 4. 启动项目,查看效果 Swagger 的功能这里就不多说明了,相信大家都懂的,好奇多问一句,大家有知道其…...
pytest运行时参数说明,pytest详解,pytest.ini详解
一、Pytest简介 1.pytest是一个非常成熟的全功能的Python测试框架,主要有一下几个特点: 简单灵活,容易上手,支持参数化 2.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium、appium等自动化测试…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
