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等自动化测试…...

Matplotlib绘图知识小结--Python数据分析学习
一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行…...

mouseover、mouseout和mouseenter、mouseleave之间的区别(配对使用)
以上四个事件都是与鼠标相关的事件,其中mouseenter和mouseover均是鼠标移入时触发的事件,但是使用mouseover的时候会触发冒泡事件,也就是,当父元素和子元素均绑定mouseover事件的时候,如果触发子元素的mouserover事件&…...

【论文阅读】基于深度学习的时序预测——Autoformer
系列文章链接 论文一:2020 Informer:长时序数据预测 论文二:2021 Autoformer:长序列数据预测 论文三:2022 FEDformer:长序列数据预测 论文四:2022 Non-Stationary Transformers:非平…...

【AI】《动手学-深度学习-PyTorch版》笔记(十五):网络中的层、块和参数
AI学习目录汇总 1、什么是块? 在线性模型中,我们关注过单个神经元(单个神经网络的输入和输出); 在多层感知机中,我们关注过整层的神经元(前一层的输出作为后一层的输入); 如果将“多层感知机”视为一整体,称为“块”,可以将前一个块的输出作为后一个块的输入。 块…...

Flink之Task解析
Flink之Task解析 对Flink的Task进行解析前,我们首先要清楚几个角色TaskManager、Slot、Task、Subtask、TaskChain分别是什么 角色注释TaskManager在Flink中TaskManager就是一个管理task的进程,每个节点只有一个TaskManagerSlotSlot就是TaskManager中的槽位,一个TaskManager中可…...

计算机竞赛 python 爬虫与协同过滤的新闻推荐系统
1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python 爬虫与协同过滤的新闻推荐系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&…...

如何使用Kali Linux进行密码破解?
今天我们探讨Kali Linux的应用,重点是如何使用它来进行密码破解。密码破解是渗透测试中常见的任务,Kali Linux为我们提供了强大的工具来帮助完成这项任务。 1. 密码破解简介 密码破解是一种渗透测试活动,旨在通过不同的方法和工具来破解密码…...

【Freertos基础教程】任务管理之基本使用
文章目录 前言一、freertos任务管理是什么?二、任务管理涉及到的一些概念1.任务状态2.优先级3.栈(Stack)4.事件驱动5.协助式调度(Co-operative Scheduling) 二、任务的基本操作1.创建任务什么是任务 2.创建任务3.任务的删除4.任务的调度3.简单示例 总结 前言 本fre…...

VMware安装BC-linux-eluer 21.10,配置网络
参考配置:https://hiworld.blog.csdn.net/article/details/121608950 /etc/sysconfig/network-scripts/ifcfg-ens33 配置内容如下: TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_…...

2023最新Windows编译ffmpeg详细教程,附msys2详细安装配置教程
安装MSYS2 msys2是一款跨平台编译套件,它模拟linux编译环境,支持整合mingw32和mingw64,能很方便的在windows上对一些开源的linux工程进行编译运行。 类似的跨平台编译套件有:msys,cygwin,mingw 优势&…...