跳到主要内容

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

本附录详细展示 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 |
+---------+

Simultaneous Close: Passive Close:
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

状态说明 (State Descriptions)

CLOSED

  • 表示不存在 TCB (Transmission Control Block) 因而不存在连接的虚拟状态.
  • 这是所有连接的起点和终点.

LISTEN

  • 服务器等待来自任意远端 TCP 的连接请求.
  • 被动打开 (passive open) 状态.

SYN-SENT

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

SYN-RECEIVED

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

ESTABLISHED

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

FIN-WAIT-1

  • 主动关闭方等待远端的 ACK 或 FIN.
  • 连接终止过程的第一个状态.

FIN-WAIT-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. 防止旧报文段干扰新连接.

关键状态转换 (Key State Transitions)

连接建立 (三次握手)

CLOSED --> (active open) --> SYN-SENT
SYN-SENT --> (receive SYN-ACK) --> ESTABLISHED

CLOSED --> (passive open) --> LISTEN
LISTEN --> (receive SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (receive ACK) --> ESTABLISHED

连接关闭 (四次握手)

Active Close:
ESTABLISHED --> (send FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (receive ACK) --> FIN-WAIT-2
FIN-WAIT-2 --> (receive FIN) --> TIME-WAIT
TIME-WAIT --> (2MSL timeout) --> CLOSED

Passive Close:
ESTABLISHED --> (receive FIN) --> CLOSE-WAIT
CLOSE-WAIT --> (application close) --> LAST-ACK
LAST-ACK --> (receive ACK) --> CLOSED

同时打开 (Simultaneous Open)

CLOSED --> (send SYN) --> SYN-SENT
SYN-SENT --> (receive SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (receive ACK) --> ESTABLISHED

同时关闭 (Simultaneous Close)

ESTABLISHED --> (send FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (receive FIN) --> CLOSING
CLOSING --> (receive ACK) --> TIME-WAIT
TIME-WAIT --> (2MSL timeout) --> 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 的主体规范.