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).
- 目的:
- 确保最终 ACK 到达远端.
- 防止旧报文段干扰新连接.
关键状态转换 (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?
-
确保可靠关闭:
- 如果最终 ACK 丢失, 远端会重传 FIN.
- TIME-WAIT 状态确保仍有能力响应重传的 FIN.
-
防止旧连接干扰:
- 网络中可能存在延迟到达的旧报文段.
- 等待 2MSL 可确保旧报文段从网络中消失.
- 防止旧报文段被新连接误认为有效数据.
2MSL 时间:
- MSL (Maximum Segment Lifetime): 报文段在网络中可存活的最长时间.
- 通常 MSL = 2 分钟.
- 因此 TIME-WAIT = 2MSL = 4 分钟.
- 一些实现使用更短时间, 例如 30 或 60 秒.
完整状态转换逻辑和边界情形处理见 RFC 9293 的主体规范.