深入解析 TCP 连接状态与进程挂起、恢复与关闭

文章目录

  • 深入解析 TCP 连接状态与进程挂起、恢复与关闭
    • 一、TCP 连接的各种状态
      • 1. **`LISTEN`**(监听)
      • 2. **`SYN_SENT`**(SYN 已发送)
      • 3. **`SYN_RECEIVED`**(SYN 已接收)
      • 4. **`ESTABLISHED`**(已建立)
      • 5. **`FIN_WAIT_1`**(关闭等待1)
      • 6. **`FIN_WAIT_2`**(关闭等待2)
      • 7. **`CLOSE_WAIT`**(关闭等待)
      • 8. **`CLOSING`**(关闭中)
      • 9. **`LAST_ACK`**(最后确认)
      • 10. **`TIME_WAIT`**(时间等待)
      • 11. **`CLOSED`**(关闭)
    • 二、TCP 连接的建立与关闭流程
      • 1. **连接建立流程**(三次握手)
        • 1) **客户端发送 SYN**
        • 2) **服务端发送 SYN-ACK**
        • 3) **客户端发送 ACK**
      • 2. **连接关闭流程**(四次挥手)
        • 1) **第一次挥手:客户端发送 FIN**
        • 2) **第二次挥手:服务端确认 ACK**
        • 3) **第三次挥手:服务端发送 FIN**
        • 4) **第四次挥手:客户端确认 ACK**
    • 三、进程挂起、恢复与关闭
      • 1. **进程挂起(Ctrl+Z)**
      • 2. **进程恢复与关闭**
      • 3. **进程关闭与 TCP 连接关闭**
    • 四、总结
      • 1. **TCP 连接状态**
      • 2. **连接建立与关闭**
      • 3. **进程挂起、恢复与关闭**

深入解析 TCP 连接状态与进程挂起、恢复与关闭

在网络编程中,TCP(传输控制协议)是广泛使用的协议,负责确保数据从客户端到服务器的可靠传输。要有效地管理和调试网络应用,理解 TCP连接的各种状态连接的建立与关闭过程 至关重要。同时,理解 进程的挂起、恢复与关闭 机制也有助于提高网络编程的效率与可靠性。

本文将详细讲解 TCP 连接的各种状态连接建立与关闭的流程,并且分析 进程的挂起、恢复和关闭 机制,帮助你全面理解 TCP 的工作原理及其在实际应用中的应用。

一、TCP 连接的各种状态

在 TCP 协议中,连接的生命周期通过一系列的状态来描述。每个状态代表了连接的不同阶段,从初始的连接请求到最终的连接关闭。以下是 TCP 状态 的详细说明:

1. LISTEN(监听)

LISTEN 状态表示服务端正在等待客户端的连接请求。服务端通过调用 listen() 函数进入此状态。此时,服务端并不与客户端直接交互,而是处于 监听端口 的状态,等待客户端发起连接。

  • 场景:服务端调用 bind() 绑定端口后,调用 listen() 开始监听端口,准备接受客户端的连接请求。

2. SYN_SENT(SYN 已发送)

当客户端想要建立连接时,它会发送一个 SYN(同步)包,这个包表示客户端发起连接请求。此时,客户端进入 SYN_SENT 状态,表示客户端已经发送了连接请求,并等待服务端的回应。

  • 场景:客户端调用 connect() 发起连接,发送 SYN 包,并进入 SYN_SENT 状态,等待服务端的响应。

3. SYN_RECEIVED(SYN 已接收)

当服务端收到客户端的 SYN 请求后,服务端会返回一个 SYN-ACK 包,这表示服务端同意连接并准备好响应。此时,服务端进入 SYN_RECEIVED 状态,等待客户端的确认。

  • 场景:服务端收到客户端的 SYN 包后,服务端响应一个 SYN-ACK 包,进入 SYN_RECEIVED 状态,等待客户端的 ACK 包。

4. ESTABLISHED(已建立)

ESTABLISHED 是 TCP 连接中的 核心状态,表示连接已成功建立并且双方可以开始数据交换。当客户端和服务端都成功完成三次握手时,连接进入 ESTABLISHED 状态,双方就可以进行双向数据传输。

  • 场景:客户端收到服务端的 SYN-ACK 包后,发送 ACK 包确认连接建立。此时,客户端和服务端都进入 ESTABLISHED 状态,开始数据交换。

5. FIN_WAIT_1(关闭等待1)

FIN_WAIT_1 状态表示连接的一方已经发送了关闭连接的请求(FIN 包),并等待对方确认。此时,这一方完成了数据传输,并希望结束连接。

  • 场景:客户端调用 close(),向服务端发送 FIN 包,请求关闭连接,进入 FIN_WAIT_1 状态。

6. FIN_WAIT_2(关闭等待2)

FIN_WAIT_2 状态表示发送方已经收到对方的确认(ACK 包)并等待对方发送自己的 FIN 包。这个状态确保发送方等待对方也完成数据发送并关闭连接。

  • 场景:在接收到对方的确认包后,发送方进入 FIN_WAIT_2,等待对方发送 FIN 包。

7. CLOSE_WAIT(关闭等待)

CLOSE_WAIT 状态表示接收方已经收到关闭请求(FIN 包),并准备关闭连接。此时,接收方必须调用应用层的 close() 来完成连接的关闭。

  • 场景:服务端收到客户端的 FIN 包后,进入 CLOSE_WAIT 状态,并等待应用层关闭连接。

8. CLOSING(关闭中)

CLOSING 状态表示双方都已经发送了关闭请求,但连接尚未完全关闭。这个状态通常出现在双方都发送了 FIN 包时,但尚未完全确认。

  • 场景:客户端和服务端都已发送 FIN 包,进入 CLOSING 状态,等待对方确认。

9. LAST_ACK(最后确认)

LAST_ACK 状态表示接收方已发送自己的 FIN 包,等待对方的确认包(ACK 包)。这是连接关闭的最后一步,表示接收方已经完成关闭过程。

  • 场景:服务端发送 FIN 包后,进入 LAST_ACK 状态,等待客户端的确认包。

10. TIME_WAIT(时间等待)

TIME_WAIT 状态表示连接已关闭,但仍保留一段时间,以确保对方接收到最后的确认(ACK 包)。此状态通常会持续 2 倍的最大段生存时间(MSL),用于确保双方都成功关闭连接,并避免重复的数据包干扰。

  • 场景:一方关闭连接后进入 TIME_WAIT,确保数据包已完全传输,并防止老的包干扰新连接。

11. CLOSED(关闭)

CLOSED 状态表示连接完全关闭,所有的资源都已释放,不再进行任何数据传输。

  • 场景:连接生命周期结束后,进入 CLOSED 状态。

二、TCP 连接的建立与关闭流程

1. 连接建立流程(三次握手)

TCP 连接的建立是通过 三次握手(Three-Way Handshake)实现的。下面是每一阶段的详细过程:

1) 客户端发送 SYN
  • 客户端向服务端发送一个 SYN 包,表示发起连接请求。此时,客户端进入 SYN_SENT 状态。
2) 服务端发送 SYN-ACK
  • 服务端收到客户端的 SYN 包后,返回一个 SYN-ACK 包,表示同意连接。此时,服务端进入 SYN_RECEIVED 状态。
3) 客户端发送 ACK
  • 客户端接收到服务端的 SYN-ACK 包后,向服务端发送 ACK 包,确认连接建立。此时,客户端和服务端都进入 ESTABLISHED 状态,数据交换开始。

2. 连接关闭流程(四次挥手)

TCP 连接的关闭通过 四次挥手(Four-Way Handshake)实现。每一方都会发送一个 FIN 包,表示自己已经完成数据传输,准备关闭连接。

1) 第一次挥手:客户端发送 FIN
  • 客户端完成数据发送后,向服务端发送 FIN 包,表示请求关闭连接。客户端进入 FIN_WAIT_1 状态。
2) 第二次挥手:服务端确认 ACK
  • 服务端收到客户端的 FIN 包后,发送一个 ACK 包表示确认。此时,服务端进入 CLOSE_WAIT 状态。
3) 第三次挥手:服务端发送 FIN
  • 服务端在关闭连接之前,向客户端发送 FIN 包,表示服务端也完成了数据发送。服务端进入 LAST_ACK 状态。
4) 第四次挥手:客户端确认 ACK
  • 客户端接收到服务端的 FIN 包后,发送 ACK 包进行确认。客户端进入 TIME_WAIT 状态,确保对方收到了最后的确认包。

三、进程挂起、恢复与关闭

在操作系统中,进程的 挂起、恢复与关闭 是非常常见的操作,尤其在涉及到网络编程时,管理进程资源和连接的状态非常重要。

1. 进程挂起(Ctrl+Z)

当用户按下 Ctrl+Z 时,当前进程会被暂停,并被放入 后台。该进程不会完全结束,而是处于 停止 状态,仍然占用系统资源,诸如端口、内存等。

  • 恢复挂起的进程:可以通过 fg 恢复进程到前台执行,或使用 bg 将其放回后台继续执行。

    fg  # 恢复进程到前台
    bg  # 将进程放回后台继续执行
    
  • 终止挂起的进程:使用 kill 命令来结束进程,释放占用的端口资源。

    kill -9 <PID>  # 强制终止进程
    

2. 进程恢复与关闭

  • Ctrl+C:终止正在运行的进程并释放资源。

  • kill:通过发送不同的信号来控制进程的结束。常见的信号有:

    • SIGTERM:正常终止进程。
    • SIGKILL:强制终止进程。

3. 进程关闭与 TCP 连接关闭

  • 当应用程序通过 close() 关闭 TCP 连接时,系统会释放所有与该连接相关的资源,例如套接字、端口号和内存等。
  • 进程退出时,会释放与连接相关的资源,确保不会有资源泄漏。

四、总结

1. TCP 连接状态

  • TCP 连接通过一系列状态(如 LISTENESTABLISHEDTIME_WAIT 等)来管理连接的生命周期。这些状态帮助确保连接在数据传输前建立,传输中保持可靠性,并在数据交换完成后优雅地关闭。

2. 连接建立与关闭

  • 连接的建立通过三次握手(Three-Way Handshake)确保双方准备好开始数据传输;连接的关闭通过四次挥手(Four-Way Handshake)确保双方都完成数据传输并释放资源。

3. 进程挂起、恢复与关闭

  • 进程通过 Ctrl+Z 被挂起,fg 恢复到前台,kill 强制终止。理解进程的挂起与关闭有助于我们正确管理进程,避免端口占用和资源泄漏等问题。

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

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

相关文章

在mac m1基于llama.cpp运行deepseek

lama.cpp是一个高效的机器学习推理库&#xff0c;目标是在各种硬件上实现LLM推断&#xff0c;保持最小设置和最先进性能。llama.cpp支持1.5位、2位、3位、4位、5位、6位和8位整数量化&#xff0c;通过ARM NEON、Accelerate和Metal支持Apple芯片&#xff0c;使得在MAC M1处理器上…

多模态大语言模型arxiv论文略读(154)

Visual-Oriented Fine-Grained Knowledge Editing for MultiModal Large Language Models ➡️ 论文标题&#xff1a;Visual-Oriented Fine-Grained Knowledge Editing for MultiModal Large Language Models ➡️ 论文作者&#xff1a;Zhen Zeng, Leijiang Gu, Xun Yang, Zhan…

Python PDF处理库深度对比:PyMuPDF、pypdfium2、pdfplumber、pdfminer的关系与区别

Python PDF处理库深度对比&#xff1a;PyMuPDF、pypdfium2、pdfplumber、pdfminer的关系与区别前言1. 库的基本介绍1.1 PyMuPDF (fitz)1.2 pypdfium21.3 pdfplumber1.4 pdfminer2. 关系图谱3. 核心区别对比3.1 性能对比3.2 功能对比4. 代码示例对比4.1 基本文本提取PyMuPDFpypd…

制作 ext4 文件系统

按以下步骤操作可以将一个文件夹制作成 Android 可用的 ext4 格式的 img 文件&#xff1a;方法 1&#xff1a;使用标准 Linux 工具&#xff08;推荐&#xff09; 步骤 1&#xff1a;安装必要工具 sudo apt update sudo apt install e2fsprogs android-sdk-libsparse-utils # 适…

Flink自定义函数

一、UDF 核心原理 Flink 自定义函数&#xff08;UDF&#xff09;是扩展 Table API/SQL 能力的核心机制&#xff0c;允许将自定义逻辑嵌入查询。其设计遵循以下原则&#xff1a; 1. 函数类型体系类型输入输出关系核心用途标量函数&#xff08;ScalarFunction&#xff09;0~N 个标…

【AI学习】大模型微调实践

参加了书生・浦语&#xff08;InternLM&#xff09;端侧小模型论文分类微调练习打榜赛 具体的实践教程在&#xff1a; https://aicarrier.feishu.cn/wiki/D7kZw9Nx4iMyDnkpL0Gc5giNn5g 折腾了十多天&#xff0c;各种尝试&#xff0c;AB榜单终于进入了前十都&#xff0c;累死 …

ElementUI:高效优雅的Vue.js组件库

Hi&#xff0c;我是布兰妮甜 &#xff01;在当今快节奏的前端开发领域&#xff0c;选择一个功能强大、设计优雅且易于使用的UI组件库至关重要。ElementUI作为基于Vue.js的知名组件库&#xff0c;凭借其丰富的组件体系、一致的设计语言和出色的开发体验&#xff0c;已成为众多企…

Java Stream流介绍及使用指南

背景在Java 8之前&#xff0c;处理集合数据&#xff08;如List, Set, Map&#xff09;通常意味着编写冗长的、以操作为中心的代码&#xff1a;创建迭代器、使用for或while循环遍历元素、在循环体内进行条件判断和操作、收集结果。这种方式虽然有效&#xff0c;但不够简洁、可读…

JDK 1.7 vs JDK 1.8

JDK版本比较 Java平台的两次重大飞跃&#xff1a;JDK 7的稳定优化与JDK 8的革命性创新引言&#xff1a;Java的进化之路Java作为企业级开发的支柱语言&#xff0c;其版本更新直接影响着全球数百万开发者。JDK 1.7&#xff08;2011年发布&#xff09;和JDK 1.8&#xff08;2014年…

张量与维度

3x4x5的张量&#xff1a; x torch.tensor([[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]], [[21, 22, 23, 24, 25], …

智慧菜场系统(源码+文档+讲解+演示)

引言 在数字化浪潮的推动下&#xff0c;传统菜市场也在寻求创新与变革。智慧菜场系统作为一种新型的菜市场管理工具&#xff0c;通过数字化手段优化菜市场的全流程&#xff0c;提高运营效率&#xff0c;增强消费者体验&#xff0c;提升市场管理质量。本文将详细介绍智慧菜场系统…

【GESP】C++一级真题 luogu-B4355 [GESP202506 一级] 值日

GESP C一级&#xff0c;2025年6月真题&#xff0c;基础运算和循环语句&#xff0c;难度★☆☆☆☆。 题目题解详见&#xff1a;【GESP】C一级真题 luogu-B4355 [GESP202506 一级] 值日 | OneCoder 【GESP】C一级真题 luogu-B4355 [GESP202506 一级] 值日 | OneCoderGESP C一级…

【Linux应用】Ubuntu20.04 aarch64开发板一键安装ROS2(清华源)

【Linux应用】Ubuntu20.04 aarch64开发板一键安装ROS2&#xff08;清华源&#xff09; 文章目录相关资料更改UTF8执行更新一键安装ROS2验证配置环境变量附录&#xff1a;开发板快速上手&#xff1a;镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互&#xff08;RAD…

【HDLBits习题 2】Circuit - Sequential Logic(4)More Circuits

1. Rule90&#xff08;Rule 90&#xff09;方法1&#xff1a;module top_module (output reg [511:0] q,input clk,input load,input [511:0] data ); integer i;always (posedge clk) beginif (load 1b1) beginq < data;end else beginfor (i0; i<$bits(q);…

基于mysqlfrm工具解析mysql数据结构文件frm表结构和数据库版本信息

这里使用Linux系统上操作。win上搞了下 python报错。所以在这里记录一下推荐大家使用linux系统操作。 安装mysql utilswget https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5.tar.gztar -xf mysql-utilities-1.6.5.tar.gzcd mysql-utilities-1.6.5py…

【C++ 深入解析 C++ 模板中的「依赖类型」】

深入解析 C 模板中的「依赖类型」 依赖类型是 C 模板编程中的核心概念&#xff0c;特指那些依赖于模板参数的类型。迭代器是依赖类型的常见例子&#xff0c;但远不止于此。让我们全面解析这个重要概念&#xff1a; 依赖类型的本质定义 依赖类型是&#xff1a; 在模板中定义直接…

Telnet远程连接实验(Cisco)

Telnet远程连接实验&#xff08;Cisco&#xff09; 拓扑图一并实现DHCP服务、HTTP服务、FTP服务。 二层交换机配置&#xff1a; 交换机Switch0配置&#xff1a; vlan 10vlan 20int f0/1switchport mode accessswitchport access vlan 10int f0/2switchport mode accessswitchpo…

C++:非类型模板参数,模板特化以及模板的分离编译

目录 一、前言 二、非类型模板参数 三、模板的特化 3.1 类模板特化 3.11 全特化 3.12 偏特化 3.2 函数模板特化 3.3 注意 四、模板的分离编译 一、前言 前面的文章梳理了模板初阶的一些用法&#xff0c;在后面梳理了STL的一些容器的用法后&#xff0c;下面将用到含有S…

【Qt 学习之路】Qt Android开发环境搭建:Ubuntu的Vmware虚拟机中的踩坑实录

文章目录1、简介2、虚拟机内USB设备识别难题2.1、正确连接手机2.2、打开USB相关配置2.3、打开虚拟机中的手机设备3、Gradle下载速度缓慢之困3.1、下载 Gradle 镜像3.2、安放镜像位置3.3、修改项目中的gradle路径1、简介 许久未曾使用Qt进行Android开发&#xff0c;今日在Ubunt…

MySQL中使用group_concat遇到的问题及解决

在使用group_concat的过程中遇到个问题&#xff0c;这里记录一下&#xff1a;在MySQL中有个配置参数group_concat_max_len&#xff0c;它会限制使用group_concat返回的最大字符串长度&#xff0c;默认是1024。 查询group_concat_max_len大小&#xff1a; show variables like…