TCP状态转换/ 半连接/ 端口复用代码实现

        三次挥手的时候的状态转换

        TCP(Transmission Control Protocol)的三次握手是建立TCP连接的过程。在三次握手中,涉及到的状态转换如下:

  1. Closed(关闭状态): 初始状态,表示没有任何连接。

  2. SYN_SENT(同步已发送状态): 客户端发送一个TCP报文,其中包含SYN(同步)标志位,表示请求建立连接。

  3. LISTEN(监听状态): 服务器在被动打开的套接字上等待连接请求,准备接受客户端的连接。

  4. SYN_RECEIVED(同步已接收状态): 服务器收到客户端的SYN报文,会回应一个包含SYN和ACK(确认)标志位的报文,表示同意建立连接。

  5. ESTABLISHED(已建立连接状态): 客户端收到服务器的SYN-ACK报文后,发送一个包含ACK标志位的报文,连接建立成功。

        以上是正常的三次握手过程。在三次握手中,如果某一阶段出现问题,可能会触发状态的不同转换。例如,如果客户端发送SYN后,长时间没有收到服务器的响应,可能触发超时,客户端会重新发送SYN,从而导致状态的转换。

        在实际网络中,可能还涉及到一些其他状态,例如超时、重传等,这取决于网络的具体情况和TCP协议的实现。但总体上,TCP的三次握手过程涉及到以上描述的状态转换。

 

        TCP的四次挥手是终止TCP连接的过程。在四次挥手中,涉及到的状态转换如下:

  1. ESTABLISHED(已建立连接状态): 双方的数据传输已完成,开始关闭连接。

  2. FIN_WAIT_1(等待对方的FIN报文状态): 主动关闭方发送一个FIN(结束)标志的报文,表示不再发送数据,但可以接收数据。

  3. CLOSE_WAIT(等待被动关闭状态): 被动关闭方接收到FIN报文,通知应用层停止发送数据。

  4. FIN_WAIT_2(等待对方的确认状态): 主动关闭方等待被动关闭方发送完毕数据后,发送一个带有ACK标志位的报文,确认收到了对方的FIN报文。

  5. TIME_WAIT(等待足够的时间以确保被动关闭方收到了ACK): 主动关闭方等待足够的时间,确保被动关闭方已经收到了对FIN的ACK,并且该ACK不会在网络中丢失。这个状态的目的是为了处理可能出现的延迟的报文,以防止新的连接中出现旧的数据。

  6. CLOSING(等待对方的确认状态): 被动关闭方在发送完ACK后,等待对方的确认,确认收到了自己的ACK。

  7. LAST_ACK(等待对方的最后的ACK状态): 主动关闭方等待最后一个ACK,表示对方已经收到了主动关闭方的确认。

  8. CLOSED(关闭状态): 双方的连接都已关闭。

        以上是正常的四次挥手过程。在四次挥手中,如果某一阶段出现问题,可能会触发状态的不同转换。例如,如果一方在发送FIN后,长时间没有收到对方的确认,可能会触发超时,重新发送FIN,从而导致状态的转换。

 

2MSL Maximum Segment Lifetime
主动断开连接的一方, 最后进出入一个 TIME_WAIT状态, 这个状态会持续: 2msl
msl: 官方建议 : 2 分钟 , 实际是 30s
        当 TCP 连接主动关闭方接收到被动关闭方发送的 FIN 和最终的 ACK 后,连接的主动关闭方 必须处于TIME_WAIT 状态并持续 2MSL 时间。
        这样就能够让 TCP 连接的主动关闭方在它发送的 ACK 丢失的情况下重新发送最终的 ACK 。 主动关闭方重新发送的最终 ACK 并不是因为被动关闭方重传了 ACK (它们并不消耗序列号, 被动关闭方也不会重传),而是因为被动关闭方重传了它的 FIN 。事实上,被动关闭方总是 重传 FIN 直到它收到一个最终的 ACK
半关闭
TCP 链接中 A B 发送 FIN 请求关闭,另一端 B 回应 ACK 之后( A 端进入 FIN_WAIT_2 状态),并没有立即发送 FIN A A 方处于半连接状态(半开关),此时 A 可以接收 B 发 送的数据,但是 A 已经不能再向 B 发送数据。

 从程序的角度,可以使用 API 来控制实现半连接状态:

netstat参数:

-a所有的socket

-p显示正在使用socket的程序的名称

-n直接使用IP地址,而不通过域名服务器 

 端口复用:

端口复用是指在一个网络应用程序中允许多个套接字共享同一个端口的能力。端口复用通常是通过设置套接字选项来实现的。在网络编程中,两个主要的套接字选项用于端口复用:

  1. SO_REUSEADDR: 允许多个套接字绑定到相同的IP地址和端口号,即使先前的套接字仍然处于 TIME_WAIT 状态。这个选项通常用于服务器程序,以便更快地重新启动服务器。

  2. SO_REUSEPORT: 允许多个套接字绑定到相同的IP地址和端口号。与 SO_REUSEADDR 不同的是,SO_REUSEPORT 允许多个套接字在同一台计算机上同时监听相同的 IP 地址和端口号,而不需要等待 TIME_WAIT。

端口复用最常用的用途是:

1.·防止服务器重启时之前绑定的端口还未释放·

2. 程序突然退出而系统没有释放端口

#include <sys/types.h>
#include <sys/socket.h>//设置套接字的属性(不仅仅能设置端口复用)int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);//参数:
-sockfd:要操作的文件描述符
-1eve1:  级别-S0L_S0cKET(端口复用的级别)
-optname: 选顶的名称 SO_REUSEADDR  -SO_REUSEPORT
-optva1:端口复用的值(整形)-1:可以复用-0:不可以复用-opt1en:optval:参数的大小setsockopt () bind();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2659663.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【没有哪个港口是永远的停留~论文简读】Panoptic SegFormer

Panoptic SegFormer 原文&#xff1a;https://arxiv.org/pdf/2109.03814.pdf 代码&#xff1a;GitHub - zhiqi-li/Panoptic-SegFormer: This is the official repo of Panoptic SegFormer [CVPR22] 在全景分割中&#xff0c;图像内容可分为things和stuff两类。 things是可计…

Flink1.17实战教程(第七篇:Flink SQL)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

根据commitID删除某一次提交

1.查看提交历史 git log --prettyoneline2.找到需要删除的那个commit,然后找到上次提交的commitID 比如想要删除下面这一条 我们找到上次提交的commitID 3.执行rebase git rebase -i efa11da0a684977bf8ac047ebb803e2ded2063a4 进入编辑状态显示如下 将需要删除的那个提交前…

汇编语言学习中的Dosbox自动配置方法

学到期末才发现可以自动配置 一、先找到dosbox的下载/安装路径 二、打开其下的Dosbox *.**(这里是版本号) Options.bat 三、在其打开的文件的最下面输入你经常打开dosbox要输入的内容 例如&#xff1a; mount c e:\masm c:

强化学习与推荐系统结合

强化学习与推荐系统结合&#xff0c;是在智能体的学习过程中&#xff0c;会根据外部反馈信息&#xff0c;改变自身状态&#xff0c;在根据自身状态进行决策&#xff0c;就是行动反馈&#xff0c;状态更新&#xff0c;在行动的循环。 深度强化学习推荐系统框架是基于强化学习的…

Github项目推荐:KaTeX

项目地址 GitHub - KaTeX/KaTeX: Fast math typesetting for the web. 项目描述 这是一个渲染公式的JavaScript库。有时候可能网页中需要写一些公式&#xff0c;但html本身并没有提供相应的标签。这个时候这个库就能派上用场了。 项目截图

MyBatis的基本使用及常见问题

MyBatis 前言MyBatis简介MyBatis快速上手Mapper代理开发增删改查环境准备配置文件完成增删改查查询添加修改删除 参数传递注解完成增删改查 前言 JavaWeb JavaWeb是用Java技术来解决相关Web互联网领域的技术栈。 MySQL数据库与SQL语言 MySQL&#xff1a;开源的中小型数据库。…

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言&#xff1a;定时器TIM的详细知识点见我的博文&#xff1a;11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释&#xff1a; ARR&#xff08;TIM_Period&#xff09;&#xff1a;自动重装载值&#xff0c;是定时器溢出前的计数值 PSC&#xff08;TIM_Prescaler&…

记chrome的hackbar无法post php://input的问题

尽管hackbar支持post请求体&#xff0c;但是当请求体里面没有等于号的时候&#xff0c;无法post出去&#xff0c;这样如果需要使用php://input绕过waf的时候就没法做。 在开发人员工具的网络里面可以看到不使用等于号的情况下没有荷载。 之后在这里看到了解决方法&#xff0c;…

五、Spring AOP面向切面编程

本章概要 场景设定和问题复现解决技术代理模式面向切面编程思维&#xff08;AOP&#xff09;Spring AOP框架介绍和关系梳理 5.1 场景设定和问题复现 准备AOP项目 项目名&#xff1a;spring-aop-annotation pom.xml <dependencies><!--spring context依赖--><…

关于“Python”的核心知识点整理大全45

目录 15.4.6 绘制直方图 die_visual.py 注意 15.4.7 同时掷两个骰子 dice_visual.py 15.4.8 同时掷两个面数不同的骰子 different_dice.py 15.5 小结 第 16 章 16.1 CSV 文件格式 16.1.1 分析 CSV 文件头 highs_lows.py 注意 16.1.2 打印文件头及其位置 highs_l…

linux ext3/ext4文件系统(part1格式化)

ext4文件系统结构 ext3的代码已经在v4.3被删除掉了&#xff08;ARM: tegra: Rebuild default configuration on v4.3-rc1 torvalds/linux241e077 GitHub&#xff09; ext4格式化的代码可以参考e2fsprogs的实现&#xff1a;mke2fs.c 格式化后的文件系统结构如下图&#xf…

yntax Error: Error: Cannot find module ‘imagemin-gifsicle’

问题 打包构建的时候遇到了这样一个报错&#xff0c;yntax Error: Error: Cannot find module ‘imagemin-gifsicle’&#xff0c;下面我总结了下解决的方案。 解决方案 在packgae.json 加上 “imagemin-gifsicle” &#xff1a;”^2.0.0″,再次运行时报错信息error:cannot f…

案例214:基于微信小程序的水果销售系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

windirstat磁盘管理工具,清理磁盘神器(附网盘链接)

Windirstat是一款用于可视化磁盘空间使用情况的开源工具。它允许用户以图形方式查看磁盘上的文件和文件夹&#xff0c;以便更容易地识别和理解哪些文件或文件夹占用了最多的磁盘空间。该工具通过在磁盘上创建一个可交互的树状图&#xff0c;以及颜色编码和图表&#xff0c;帮助…

echart地图的小demo12.27

图形&#xff1a; DataV.GeoAtlas地理小工具系列 点击以上链接进入--》 再点击箭头---》复制坐标到文件&#xff1a; 取名为 china.json中 &#xff08;文件名自定义&#xff09; <template><div class"map" ref"chartMap">地图</div>…

Python从入门到熟练

文章目录 Python 环境Python 语法与使用基础语法数据类型注释数据类型介绍字符串列表元组集合字典 类型转换标识符运算符算数运算符赋值运算符复合运算符 字符串字符串拼接字符串格式化 判断语句bool 类型语法if 语句if else 语句if elif else 语句 循环语句while循环for 循环r…

3D动态路障生成

3D动态路障生成 介绍设计实现1.路面创建2.空物体的创建3.Create.cs脚本创建 总结 介绍 上一篇文章介绍了Mathf.Lerp的底层实现原理&#xff0c;这里介绍一下跑酷类游戏的动态路障生成是如何实现的。 动态路障其实比较好生成&#xff0c;但是难点在哪里&#xff0c;如果都是平面…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# HeapingVS Stacking第一节 理解堆与栈 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.n…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…