跳到主要内容

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 的主体规范.