TCP 状态转换以及半关闭

TCP 状态转换:

 上图中还没有进行握手的时候状态是关闭的。

三次握手状态的改变:

客户端发起握手。

调用 connect() 函数时状态转化为:SYN_SENT。调用 listen() 函数时状态转换为:LISTEN。ESTABLISHED是被连接的状态。

四次挥手状态的改变:

谁发起挥手都可以。上图是客户端发起的挥手。

客户端调用close()函数时状态转化为:FIN_WAIT_1,接收到请求后服务端状态转换为:CLOSE_WAIT(等待关闭)。第二次挥手客户端状态转化为:FIN_WAIT_2。第三次挥手,服务端状态转化为:LAST_ACK,客户端状态转换为:TIME_WAIT。最后就都变为关闭状态。

 上图黑线是特殊的情况,红线是客户端,绿色虚线是服务端。

等待2MSL的原因是保证TCP的可靠性。因为在进行第四次挥手的时候,对方没有收到应答(不能是发送ACK就断开连接,还需确保对方接收到了信息)。所以对方再次发送断开请求,本机应答,对方收到应答。

2MSL:

上图中 TIME_WAIT 定时经过两倍报文段寿命:

2MSLMaximum Segment Lifetime): 

主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl
(1)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 给 AA 方处于半连接状态(半开关),此时 A 可以接收 B
送的数据,但是 A 已经不能再向 B 发送数据。也就是一方发送 FIN 请求,另一方没有发送。
但是为什么第四次挥手的时候A还能发送ACK,这是因为 发送ACK是协议的行为,不能发送的是 数据
注意:不能使用close()函数来关闭,因为close()函数会关闭套接字,使得A不能正常接收数据了。
关闭套接字会导致与 套接字相关的缓冲区被释放,但并不会直接关闭这些缓冲区。 操作系统负责管理缓冲区的分配和 释放
从程序的角度,可以使用 API 来控制实现半连接状态:
#include <sys/socket.h>
int shutdown(int sockfd, int how);
sockfd: 需要关闭的socket的描述符
how: 允许为shutdown操作选择以下几种方式:SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。该套接字不再接收数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。SHUT_WR(1): 关闭sockfd的写功能,此选项将不允许sockfd进行写操作。进程不能在对此套接字发
出写操作。SHUT_RDWR(2):关闭sockfd的读写功能。相当于调用shutdown两次:首先是以SHUT_RD,然后以
SHUT_WR。
使用 close 中止一个连接,但它只是 减少描述符的引用计数,并不直接关闭连接只有当描述符的引用计数为 0 时才关闭连接shutdown 不考虑描述符的引用计数, 直接关闭描述符。也可选择中止一个方向的连接,只中止读或只中止写。
注意:
1. 如果有多个进程共享一个套接字,close 每被调用一次,计数减 1 ,直到计数为 0 时,也就是 所用进程都调用了 close,套接字将被释放
     2. 在多进程中如果 一个进程调用了 shutdown(sfd, SHUT_RDWR) 后, 其它的进程将无法进行通信。但如果一个进程 close(sfd) 将不会影响到其它进程。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++核心编程:C++ 中的引用 笔记

2.引用 2.1 引用的基本使用 - 作用&#xff1a;给变量起别名 - 语法&#xff1a;数据类型 &别名 原名 #include<iostream> using namespace std; int main() {// 引用基本语法// 数据类型 &别名 原名int a 10;// 创建引用int &ref_a a;cout<<&qu…

代码随想录刷题笔记 DAY15 | 翻转二叉树 No.226 | 对称二叉树 No.101

Day 15 01. 翻转二叉树&#xff08;No. 226&#xff09; 题目链接 代码随想录题解 1.1 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9…

PCB制板基础知识

一、PCB概念 PCB&#xff08;PrintedCircuitBoard&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷电路板、印刷线路板&#xff0c;是重要的电子部件&#xff0c;是电子元器件的支撑体&#xff0c;是电子元器件电气连接的提供者。由于它是采用电子印刷术制作…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

Python open函数

在Python编程中&#xff0c;open()函数是一个重要的文件操作函数&#xff0c;用于打开文件并进行读取、写入、追加等操作。本文将深入探讨open()函数的用法、语法、文件模式、示例代码&#xff0c;并探讨其在实际编程中的应用场景。 什么是open()函数&#xff1f; open()函数…

机房及设备安全智慧监管AI+视频方案的设计和应用

一、背景分析 随着互联网的迅猛发展&#xff0c;机房及其配套设施的数量持续攀升&#xff0c;它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石&#xff0c;机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营&#xff0c;同时也…

《WebKit技术内幕》学习之十五(3): Web前端之未来

3 Web应用和Web运行环境 3.1 Web应用 HTML5提供了强大的能力&#xff0c;而不是支持Web网页这么简单。就目前而言&#xff0c;它已经初步提供了支持Web网页向Web应用方向发展的能力。相对于本地应用&#xff08;Native Application&#xff09;&#xff0c;Web前端领域也能够…

Android Gradle Sync Task list is empty

问题 有时候 Android studio 打开项目&#xff0c;可能会遇到构建没有明显报错&#xff0c;但是 Gradle 却没有 Task list&#xff0c;或者 Task list 不完整只有零星几个配置项。连打包任务都没有&#xff0c;我怎么打包&#xff01; 异常情况&#xff1a; 正常情况&#xf…

IDEA jdk版本切换问题

打开 IntelliJ IDEA 的 Project Structure&#xff08;快捷键通常是 Ctrl Alt Shift S&#xff09;。 转到 Project Settings > Modules。 选择相应的模块&#xff0c;然后在 Sources 标签页下&#xff0c;查看 Language level 是否设置为 自己需要的jdk版本语言。 接…

Kotlin Multiplatform项目推荐 | 太空人分布图

Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术&#xff0c;它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架&#xff0c;并且使…

C# 设置一个定时器函数

C#中&#xff0c;创建设置一个定时器&#xff0c;能够定时中断执行特定操作&#xff0c;可以用于发送心跳、正计时和倒计时等。 本文对C#的定时器简单封装一下&#xff0c;哎&#xff0c;以方便定时器的创建。 定义 using Timer System.Timers.Timer;class SetTimer {Timer …

【C++】list讲解及模拟

目录 list的基本介绍 list模拟实现 一.创建节点 二.迭代器 1.模版参数 2.迭代器的实现&#xff1a; a. ! b. c. -- d. *指针 e.&引用 整体iterator (与const复用)&#xff1a; 三.功能实现 1.模版参数 2.具体功能实现&#xff1a; 2.1 构造函数 2.2 begi…