3、TCP状态

news2024/11/18 8:28:00

TCP状态

1、TCP通信时序

在这里插入图片描述

三次握手成功后,服务器和客户端进入了状态ESTABLISHED

当处于Time_WAIT状态后,不会马上变成CLOSE状态,会经历2MSL(约40秒),之后才会进入CLOSE状态。

总结:

主动发起请求连接端:

发送SIN
接收ACK\SYN
发送ACK
即为
CLOSE
SYN_SENT
SYN_SEND1
ESTABLISHED
数据通信状态

主动关闭连接请求端:

发送SIN
接收ACK
接收FIN
发送ACK
ESTABLISHED
FIN_WAIT1
半关闭
TIME_WAIT
2MSL
CLOSE

主动端只有发出信号或接收ACK状态才会发生变化

被动接收连接请求端:

程序启动
接收SYN
发送SYN和ACK
接收ACK
CLOSE
LISTEN
SYN_RCVD
ESTABLISHED

如果没有收到ACK应答,就会抑制发送SYN_RCVD状态

被动端关闭连接:

接收FIN
发送ACK
发送FIN
接收ACK
ESTABLISHED
CLSOE_WAIT
LAST_ACK
CLOSE

被动端直接进入CLOSE,不需要2MSL等待时间

2MSL时长存在的意义:

​ 保证最后一个ACK能够被对端接收,如果在等待期间对端没收到我发的ACK,对端会再次发送FIN请求。其只会出现在主动连接请求端。

2、端口复用

​ 当服务器进入2MSL时,客户端不能在绑定服务器了。此时需要用端口复用,让客户端可以在2MSL绑定服务器。

setsockopt:设置端口选择。

setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optname);
/*
int opt = 1;//设置端口复用
int opt = 0;//设置端口不可复用
optname:
SO_REUSEADDR 重用本地地址
SO_REUSEPORT 重用本地端口
setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(void *)&opt,sizeof(opt));
返回值:
成功为0;
失败为1;
*/

​ 这行代码的作用是启动端口复用,跳过2MSL。

​ 这行代码应该插入到bind之前。

3、半关闭总结

​ 通信双方中,只有一端关闭通信 。 FIN_WAIT_2

close(cfd);
shutdown(int sockfd, int how);//特殊的半关闭,只关闭读缓冲或者写缓冲或者都关。
//SHUT_WR SHUT_RD SHUT_RDWR
//shutdown在关闭多个文件描述符应用的文件时,采用全关闭方法,而close只关闭一个

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

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

相关文章

主动配电网故障恢复的重构与孤岛划分matlab程序

微❤关注“电气仔推送”获得资料(专享优惠) 参考文档: A New Model for Resilient Distribution Systems by Microgrids Formation; 主动配电网故障恢复的重构与孤岛划分统一模型; 同时考虑孤岛与重构的配电网故障…

java 电动车销售管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 电动车销售管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

深度学习_2_数据处理

import os是一个Python的内置模块,用于与操作系统进行交互。通过导入os模块,你可以使用其中提供的函数和方法来执行各种与操作系统相关的任务。 import osos.makedirs(os.path.join(.., date), exist_okTrue)##将创建一个名为date的文件夹,位…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要: 生物系统有大量的视觉运动检测神经元,其中一些神经元可以优先对特定的视觉区域做出反应。然而,关于如何使用它们来开发用于全向碰撞检测的神经网络模型,很少有人做过工作。为此&#…

相同的 key, Nacos 配置一定会覆盖 application.yaml 吗?

一,背景: 之前在使用 Nacos 的时候有个疑问,同样的 key,在 Nacos 配置了,在 application 也配置了,到底会有哪个呢?一直没空查,后来在网上看到过文章,说 Nacos 是在 app…

【Redis】Hash 哈希相关的命令

命令 HSET 设置hash中指定的字段(field)的值(value)。 HSET key field value [field value ...]HGET 获取hash中指定字段的值。 HGET key fieldHEXISTS 判断hash中是否有指定的字段。 HEXISTS key fieldHDEL 删除hash中指定…

第十一章-用户进程

Ⅰ.为什么需要任务状态段TSS 1.LDT简介 已经不使用LDT加载任务了。因为当前运行的任务,其 LDT 位于 LDTR 指向的地址,这样 CPU 才能从中拿到任务运行所需要的资源(指令和数据)。因此,每切换一个任务时,需…

Android Jetpack Compose之生命周期与副作用

文章目录 1.概述2.Composeable生命周期3.Compose副作用及API3.1.Compose副作用API3.1.1 DisposableEffect3.1.2 SideEffect 3.2 Compose异步处理副作用API3.2.1 LaunchedEffect3.2.2 rememberCoroutineScope3.2.3 rememberUpdateState3.2.4 snapshotFlow 3.3 状态创建副作用API…

什么是C++?

1.什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object o…

一种管理KEIL工程输出文件的方法

开发语言:python; 针对工程:适配ARM公司的KEIL-V5软件的工程 管理的输出文件类型:BIN文件、HEX文件 脚本使用方法:直接放置到keil的设置项下; 脚本执行位置:程序编译之后 脚本功能&#xff1a…

C++智能指针(一)——shared_ptr初探

文章目录 1. 普通指针存在的问题2. Class shared_ptr2.1 使用 shared_ptr2.1.1 初始化 shared_ptr2.1.2 reset2.1.3 访问数据2.1.4 use_count() 3. Deleter3.1 定义一个 Deleter3.2 处理数组 1. 普通指针存在的问题 智能指针的引入,是为了解决普通指针在使用过程中…

Android 13.0 SystemUI修改状态栏电池图标样式为横屏显示

1.概述 在13.0的产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: 2.SystemUI…

区块链金融的开发流程

区块链金融应用的开发流程与一般的软件开发流程有许多相似之处,但它还涉及到智能合约的编写、区块链网络集成和加密货币处理等特定方面的工作。以下是一般区块链金融应用的开发流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

如何查自己名下有多少个微信号?

99%的人都不知道微信有这个功能通过微信可以查自己名下绑定了多少个微信账号再也不担心身份证被别人用来绑定微信了姐妹们快去查一下吧! ①打开微信,点击【我】→点击【设置】 ②点击【通用】→ 点击【辅助功能】→ 点击【微信支付】 ③点击【帮助中心】…

MDK自动生成带校验带SVN版本号的升级文件

MDK自动生成带校验带SVN版本号的升级文件 获取SVN版本信息 确保SVN安装了命令行工具,默认安装时不会安装命令行工具 编写一个模板头文件 svn_version.temp.h, 版本号格式为 1_0_0_SVN版本号 #ifndef __SVN_VERSION_H #define __SVN_VERSION_H#define SVN_REVISIO…

性能分析工具的使用(超详细)

数据库服务器的优化步骤 整个流程划分成了观察(Show status)和行动(Action)两个部分。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行…

Linux下设备树、pinctrl和gpio子系统、LED灯驱动实验

文章目录 设备树常用的of函数pinctrl子系统gpio子系统LED灯驱动实验修改设备树文件编写驱动代码执行结果在LED驱动代码中加入内核定时器 设备树 描述设备树的文件叫做DTS(Device Tree Source),这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备…

NEFU离散数学实验1-排列组合

相关概念 在离散数学中,组合数是一种用于计算从n个不同元素中选取m个元素的方式。以下是一些与组合数相关的概念: 排列:从n个不同元素中选取m个元素进行排列,排列数用P(n, m)表示,计算公式为P(n, m) n! / (n - m)! …

springboot篮球论坛系统springboot034

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

渗透测试怎么入门?(超详细解读)

1. 什么是渗透测试 渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估,与黑客攻击不一样的是,渗透测试的目的是尽可能多地发现安全漏洞,而真实黑客攻击只要发现一处入侵点即可以进入目标系统。 一名优秀的渗透测试工程…