主动关闭方状态迁移为ESTABLISHED→FIN_WAIT_1→FIN_WAIT_2→TIME_WAIT→CLOSED;被动关闭方为ESTABLISHED→CLOSE_WAIT→LAST_ACK→CLOSED,核心对应四次挥手的FIN与ACK交互,TIME_WAIT等待2MSL确保可靠终止。

Linux TCP 连接结束阶段的状态迁移路径分为主动关闭方和被动关闭方两条主线,核心是“四次挥手”过程,每一步对应明确的状态切换和报文交互。
主动关闭方(如客户端)状态迁移路径
主动发起关闭的一端经历完整四次挥手,最终进入 TIME_WAIT 等待期:
-
ESTABLISHED → FIN_WAIT_1:调用
close()或shutdown(SHUT_WR),发送 FIN 报文,等待对方 ACK - FIN_WAIT_1 → FIN_WAIT_2:收到对端发来的 ACK,表示 FIN 已被确认;此时连接半关闭,仍可接收数据
- FIN_WAIT_2 → TIME_WAIT:收到对端发来的 FIN 报文,立即回复 ACK,进入 TIME_WAIT 状态
- TIME_WAIT → CLOSED:等待 2MSL(Maximum Segment Lifetime,默认通常为 60 秒,即 2×30s)后自动关闭;该等待确保最后的 ACK 被对方收到,防止旧连接的延迟报文干扰新连接
被动关闭方(如服务器)状态迁移路径
被动响应关闭请求的一端不经历 TIME_WAIT,由对端承担可靠终止责任:
- ESTABLISHED → CLOSE_WAIT:收到主动方的 FIN,回复 ACK 后进入此状态;此时应用层需决定是否还有数据要发送,不能直接关闭
-
CLOSE_WAIT → LAST_ACK:应用层调用
close(),发送自身 FIN 报文,等待对方最后的 ACK - LAST_ACK → CLOSED:收到主动方对本端 FIN 的 ACK,连接彻底释放,状态归零
特殊状态说明
以下状态虽不常出现,但在异常或并发关闭场景下可能触发:
- CLOSING:双方几乎同时发送 FIN,且未先收到对方 ACK —— 即 FIN 与 FIN/ACK 交错到达,跳过 FIN_WAIT_2 直接进入该状态,随后转 TIME_WAIT
- FIN_WAIT_1 直接到 TIME_WAIT:若在 FIN_WAIT_1 阶段同时收到对方的 FIN+ACK(即对方也正主动关闭),可跳过 FIN_WAIT_2,直接发 ACK 进入 TIME_WAIT
实际观测与排查提示
可通过命令快速查看当前连接所处状态:
-
ss -tnt(推荐,比 netstat 更快更准确) netstat -tna | grep :端口号- 重点关注大量 TIME_WAIT(通常无害,但过多可能需调优
net.ipv4.tcp_tw_reuse)、CLOSE_WAIT(若长期堆积,大概率是服务端未及时调用 close())


















