首页 > 其他分享 >TCP连接的状态

TCP连接的状态

时间:2024-10-25 11:45:54浏览次数:8  
标签:状态 ACK FIN TCP 发送 +---------+ 连接 WAIT

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 连接的状态可以通过一个状态机来描述,这个状态机定义了 TCP 连接从建立到关闭过程中可能经历的各种状态。

一、状态

状态名称描述触发条件
CLOSED 表示没有连接。这是初始状态。
LISTEN 服务器端等待客户端连接请求的状态。 服务器启动并调用 listen() 函数后进入此状态。
SYN_SENT 客户端发送 SYN 请求后的状态。 客户端调用 connect() 函数后发送 SYN 包,进入此状态。
SYN_RECEIVED 服务器端收到 SYN 请求,并发送 SYN+ACK 响应后的状态。 服务器在 LISTEN 状态下收到 SYN 包后,发送 SYN+ACK 包,进入此状态。
ESTABLISHED 连接已经建立,双方可以进行数据传输的状态。 客户端收到服务器的 SYN+ACK 后,发送 ACK 包,双方都进入 ESTABLISHED 状态。
FIN_WAIT_1 主动关闭方发送 FIN 包后的第一个等待状态。 任一方调用 close() 函数后发送 FIN 包,进入此状态。
FIN_WAIT_2 主动关闭方收到对方的 ACK 后的第二个等待状态。 在 FIN_WAIT_1 状态下收到对方的 ACK 包后,进入此状态。
CLOSING 双方同时关闭连接时的状态。 在 FIN_WAIT_1 状态下收到对方的 FIN 包,发送 ACK 后进入此状态。
TIME_WAIT 主动关闭方在收到被动关闭方的 FIN 包并发送 ACK 后的状态。 在 FIN_WAIT_2 或 CLOSING 状态下收到对方的 FIN 包,发送 ACK 后进入此状态。
CLOSE_WAIT 被动关闭方收到 FIN 包并发送 ACK 后的状态。 在 ESTABLISHED 状态下收到对方的 FIN 包,发送 ACK 后进入此状态。
LAST_ACK 被动关闭方发送 FIN 包后的最后一个等待状态。 在 CLOSE_WAIT 状态下调用 close() 函数后发送 FIN 包,进入此状态。

 

二、详细说明

  1. CLOSED

    • 初始状态,表示没有任何连接。
  2. LISTEN

    • 服务器端等待客户端连接请求的状态。服务器通过调用 listen() 函数进入此状态。
  3. SYN_SENT

    • 客户端发起连接请求,发送 SYN 包给服务器,然后进入此状态。
  4. SYN_RECEIVED

    • 服务器收到客户端的 SYN 包,发送 SYN+ACK 包作为响应,然后进入此状态。
  5. ESTABLISHED

    • 客户端收到服务器的 SYN+ACK 包,发送 ACK 包确认,双方都进入此状态,表示连接已建立,可以开始数据传输。
  6. FIN_WAIT_1

    • 任一方调用 close() 函数后,发送 FIN 包给对方,然后进入此状态。
  7. FIN_WAIT_2

    • 在 FIN_WAIT_1 状态下,发送方收到对方的 ACK 包,确认 FIN 包已收到,进入此状态。
  8. CLOSING

    • 在 FIN_WAIT_1 状态下,发送方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。
  9. TIME_WAIT

    • 在 FIN_WAIT_2 或 CLOSING 状态下,发送方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。在此状态下,发送方等待一段时间(通常是 2MSL,即两倍的最大报文段生存时间),确保对方收到 ACK 包。
  10. CLOSE_WAIT

    • 在 ESTABLISHED 状态下,接收方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。此时,接收方需要调用 close() 函数来关闭连接。
  11. LAST_ACK

    • 在 CLOSE_WAIT 状态下,接收方调用 close() 函数,发送 FIN 包给对方,然后进入此状态。等待对方的 ACK 包确认。

三、状态转换

+---------+
          |  CLOSED |
          +---------+
               |
               v
          +---------+
          |  LISTEN |
          +---------+
               |
               v
          +---------+
          | SYN_RCVD|
          +---------+
               |
               v
          +---------+
          |  ESTAB  |
          +---------+
               |
               v
          +---------+
          | FIN_WAIT1|
          +---------+
               |
               v
          +---------+
          | FIN_WAIT2|
          +---------+
               |
               v
          +---------+
          |  CLOSING|
          +---------+
               |
               v
          +---------+
          | TIME_WAIT|
          +---------+
               |
               v
          +---------+
          |  CLOSED |
          +---------+

          +---------+
          |  ESTAB  |
          +---------+
               |
               v
          +---------+
          |  CLOSE_WAIT|
          +---------+
               |
               v
          +---------+
          |  LAST_ACK|
          +---------+
               |
               v
          +---------+
          |  CLOSED |
          +---------+

标签:状态,ACK,FIN,TCP,发送,+---------+,连接,WAIT
From: https://www.cnblogs.com/auv2009/p/18502197

相关文章

  • CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)
    最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比,还是有一定难度的。与现在网上的大多数所谓CodeQL教程不同,本系列基于......
  • Linux_进程理解、状态与优先级(详细版)
    Linux_进程理解、状态与优先级(详细版)1.进程的概念课本概念:程序的一个执行实例,正在执行的程序等。内核观点:担当分配系统资源(CPU时间,内存)的实体。其实:进程=内核的相关管理数据结构(task_struct、页表等)+程序的代码和数据task_struct:是描述进程的结构体,是Linux内核的一种数据......
  • 织梦数据库连接失败的常见原因及解决方法
    织梦数据库连接失败的常见原因及解决方法1. 数据库服务未启动原因:MySQL服务没有运行。解决方法:Linux:使用命令 sudosystemctlstartmysql 或 sudoservicemysqlstart 启动MySQL服务。Windows:打开“服务”管理器,找到MySQL服务并启动。2. 数据库连接信息错误......
  • 织梦数据库保存文件在哪里?织梦数据库怎么连接
    不同版本的织梦CMS数据库连接文件的位置和内容有所不同。以下是各版本的具体位置和配置文件内容:各版本数据库连接文件位置织梦CMSV5.1:include/config_base.php织梦CMSV5.3:data/common.inc.php织梦CMSV5.5:data/common.inc.php织梦CMSV5.6:data/common.inc.php数据库连接......
  • 鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题
    1.TCP数据传输粘包简介在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中,我们演示了TCP数据粘包的表现,如图所示:随后解释了粘包背后的可能原因,并给出了解决TCP传输粘包问题的两种思路,其中一种就是指定数据包结束标志,本节将通过一个示例演示这种思路......
  • Windows 11 查看已连接 WiFi 的全流程
    Windows11查看已连接WiFi的全流程以下是通过命令行查看已连接WiFi信息的完整操作流程。1.打开命令提示符(CommandPrompt)按Win+S,在搜索框中输入cmd,点击“命令提示符”以管理员身份运行。2.查看已连接的WiFi网络信息在命令提示符中输入以下命令,按下回......
  • SQLite 数据库如何多行数据连接成字符串
    在使用SQLite数据库进行数据处理时,常常会遇到需要将多行数据连接成一个字符串的需求。举例来说,假设我们有一个存储用户名的表,想将这些用户名用逗号分隔组合成一个字符串,以便展示或进一步处理。SQLite本身不像某些其他数据库系统(如MySQL、PostgreSQL)那样原生支持直接的字符串聚......
  • 要使用 netsh 命令更新以太网连接的 IPv6 DNS 服务器地址,可以通过以下步骤进行操作。
    要使用netsh命令更新以太网连接的IPv6DNS服务器地址,可以通过以下步骤进行操作。以下是设置IPv6DNS的命令示例。使用 netsh 设置以太网的IPv6DNS打开命令提示符:以管理员身份运行命令提示符。输入以下命令:bashCopyCodenetshinterfaceipv6setdnsname......
  • 【保姆级IDF】ESP32使用WIFI作为AP模式TCP通信:连接客户端+一对多通信
    #1024程序员节|征文#Tips:抛砖引玉,本文记录ESP32学习过程中遇到的收获。如有不对的地方,欢迎指正。1.前言    关于ESP32的WIFI这部分基础知识,在网上可以找到许多,包括TCP协议、套接字等等,博主之前的文章也有介绍,在此本文不再赘述,直接讲清楚标题功能如何实现,并说明......
  • 10月24日连接数据库前期准备工作
    今天说一下数据库连接准备工作同时也是给自己做个记录:首先需要准备的是:IDEA专业版、jdbc、Tomcat、MySQL、也可以准备MySQL可视化工具DG。其中的逻辑是IDEA通过jdbc链接数据库MySQL,书写HTML语言加上css和JavaScript,完成网页前端的绘制,再通过Tomcat服务器部署到本地8080端口的网......