TCP连接的状态

卡米i / 2024-12-14 / 原文

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 |
          +---------+