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) 时间
- 目的:
- 确保最后的 ACK 到达对方
- 防止旧连接的段干扰新连接
关键状态转换
连接建立 (三次握手)
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?
-
确保可靠关闭:
- 如果最后的 ACK 丢失, 对方会重发 FIN
- TIME-WAIT 状态确保能够响应重发的 FIN
-
防止旧连接干扰:
- 网络中可能存在延迟的旧段
- 等待 2MSL 确保旧段在网络中消失
- 防止旧段被新连接误认为是有效数据
2MSL 时间:
- MSL (Maximum Segment Lifetime): 段在网络中的最大生存时间
- 通常 MSL = 2 分钟
- 因此 TIME-WAIT = 2MSL = 4 分钟
- 某些实现使用更短的时间 (如 30 秒或 60 秒)
注意: 完整的状态转换逻辑和边界情况处理请参阅 RFC 9293 的完整规范.