当前位置: 首页 > news >正文

深入解析 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.lryc.cn/news/585666.html

相关文章:

  • Elasticsearch 滚动(Scroll)用法、使用场景及与扫描(Scan)的区别
  • 常见的数集 N,Z,R,Q,C
  • 微积分核心考点全解析
  • 二维数组打乱元素
  • 【环境配置】KAG - Windows 安装部署
  • 开源界迎来重磅核弹!月之暗面开源了自家最新模型 K2
  • 从代码学习深度学习 - 针对序列级和词元级应用微调BERT PyTorch版
  • T16IZ遥控器教程__遥控器与无人机对频
  • spring-boot项目集成spring-ai
  • 基于k8s环境下pulsar高可用测试和扩缩容(下)
  • Web攻防-SSTI服务端模版注入利用分类语言引擎数据渲染项目工具挖掘思路
  • 华为认证笔试考试中心/VUE考场考试规则与环境欣赏
  • 智慧水文站系统:实时监控、全要素监测与AI辅助
  • 爬虫练习1
  • 数据库报错:Column ‘xxx‘ in field list is ambiguous
  • pyQt基础4(对话框)
  • JAX study notes[16]
  • Java项目中图片加载路径问题解析
  • Python Day10
  • LLM场景下的强化学习【GRPO】
  • Spring Boot整合MyBatis+MySQL实战指南(Java 1.8 + 单元测试)
  • 上位机知识篇---端口
  • latex格式中插入eps格式的图像的编译命令
  • 异步复习(线程)
  • 【第四节】ubuntu server安装docker
  • 从0开始学习R语言--Day44--LR检验
  • 文章发布易优CMS(Eyoucms)网站技巧
  • 企业IT管理——医院数据备份与存储制度模板
  • Linux自动化构建工具(一)
  • 多表查询-2-多表查询概述