Skip to main content

Appendix A. TCP Connection State Diagram (TCP 连接状态图)

本附录提供了 TCP 连接状态转换的详细图示.

TCP 状态转换图

                              +---------+
| CLOSED |
+---------+
|
(passive OPEN)
|
v
+---------+
| LISTEN |
+---------+
(rcv SYN) | ^ (CLOSE)
| |
v |
+---------+
|SYN RCVD|
+---------+
(rcv ACK)|
|
(active OPEN) v
+---------+ +---------+
|SYN SENT |<---->| ESTAB |
+---------+ +---------+
| |
| (CLOSE/FIN)
| |
| v
| +---------+
| |FIN WAIT1|
| +---------+
| (rcv ACK) |
| |
| v
| +---------+
| |FIN WAIT2|
| +---------+
| (rcv FIN) |
| |
| v
| +---------+
| |TIME WAIT|
| +---------+
| (timeout) |
| |
| v
| +---------+
+---------->| CLOSED |
+---------+

同时关闭路径: 连接被动关闭路径:
FIN WAIT1 --rcv FIN--> CLOSING ESTABLISHED --rcv FIN--> CLOSE WAIT
CLOSING --rcv ACK--> TIME WAIT CLOSE WAIT --CLOSE--> LAST ACK
LAST ACK --rcv ACK--> CLOSED

状态说明

CLOSED (关闭)

  • 虚构状态, 表示没有 TCB (传输控制块), 因此没有连接
  • 这是所有连接的起点和终点

LISTEN (监听)

  • 服务器等待来自任何远程 TCP 的连接请求
  • 被动打开状态

SYN-SENT (SYN 已发送)

  • 客户端发送 SYN 后等待匹配的连接请求
  • 主动打开状态

SYN-RECEIVED (SYN 已接收)

  • 服务器接收到 SYN 并发送 SYN-ACK 后等待 ACK
  • 三次握手的中间状态

ESTABLISHED (已建立)

  • 连接已建立, 可以进行数据传输
  • 这是数据传输阶段的正常状态

FIN-WAIT-1 (FIN 等待 1)

  • 主动关闭方发送 FIN 后等待 ACK 或对方的 FIN
  • 连接终止的第一个状态

FIN-WAIT-2 (FIN 等待 2)

  • 收到对方对 FIN 的 ACK 后等待对方的 FIN
  • 表示本方不再发送数据, 但仍可接收数据

CLOSE-WAIT (关闭等待)

  • 被动关闭方收到对方的 FIN 后等待本地应用程序关闭
  • 此时仍可发送数据

CLOSING (正在关闭)

  • 双方同时关闭时的状态
  • 等待对方对 FIN 的 ACK

LAST-ACK (最后确认)

  • 被动关闭方发送 FIN 后等待 ACK
  • 收到 ACK 后直接进入 CLOSED

TIME-WAIT (时间等待)

  • 主动关闭方收到对方 FIN 并发送 ACK 后进入此状态
  • 等待 2MSL (Maximum Segment Lifetime) 时间
  • 目的:
    1. 确保最后的 ACK 到达对方
    2. 防止旧连接的段干扰新连接

关键状态转换

连接建立 (三次握手)

CLOSED --> (主动打开) --> SYN-SENT
SYN-SENT --> (收到 SYN-ACK) --> ESTABLISHED

CLOSED --> (被动打开) --> LISTEN
LISTEN --> (收到 SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (收到 ACK) --> ESTABLISHED

连接关闭 (四次挥手)

主动关闭:
ESTABLISHED --> (发送 FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (收到 ACK) --> FIN-WAIT-2
FIN-WAIT-2 --> (收到 FIN) --> TIME-WAIT
TIME-WAIT --> (2MSL 超时) --> CLOSED

被动关闭:
ESTABLISHED --> (收到 FIN) --> CLOSE-WAIT
CLOSE-WAIT --> (应用程序关闭) --> LAST-ACK
LAST-ACK --> (收到 ACK) --> CLOSED

同时打开

CLOSED --> (发送 SYN) --> SYN-SENT
SYN-SENT --> (收到 SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (收到 ACK) --> ESTABLISHED

同时关闭

ESTABLISHED --> (发送 FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (收到 FIN) --> CLOSING
CLOSING --> (收到 ACK) --> TIME-WAIT
TIME-WAIT --> (2MSL 超时) --> CLOSED

TIME-WAIT 状态的重要性

为什么需要 TIME-WAIT?

  1. 确保可靠关闭:

    • 如果最后的 ACK 丢失, 对方会重发 FIN
    • TIME-WAIT 状态确保能够响应重发的 FIN
  2. 防止旧连接干扰:

    • 网络中可能存在延迟的旧段
    • 等待 2MSL 确保旧段在网络中消失
    • 防止旧段被新连接误认为是有效数据

2MSL 时间:

  • MSL (Maximum Segment Lifetime): 段在网络中的最大生存时间
  • 通常 MSL = 2 分钟
  • 因此 TIME-WAIT = 2MSL = 4 分钟
  • 某些实现使用更短的时间 (如 30 秒或 60 秒)

注意: 完整的状态转换逻辑和边界情况处理请参阅 RFC 9293 的完整规范.