tcp连接的11种状态及常见问题。
tcp链接整体流程,如下图所示:
TCP协议在连接的建立和终止过程中涉及11种状态,这些状态反映了连接的不同阶段。以下是每种状态的详细说明:
1. CLOSED
- 初始状态,表示没有活动的连接或连接已完全关闭。
- 当应用程序关闭连接或终止后进入此状态。
2. LISTEN
- 服务器端状态,表示正在等待客户端的连接请求(SYN报文)。
- 服务器通过调用
listen()
进入此状态,准备接受新的连接。
3. SYN_SENT
- 客户端状态,客户端发送SYN报文后进入此状态,等待服务器的SYN-ACK响应。
- 触发条件:客户端调用
connect()
发起连接。
4. SYN_RECEIVED (SYN_RCVD)
- 服务器端状态,服务器收到客户端的SYN报文后,发送SYN-ACK并等待客户端的ACK确认。
- 若未收到ACK,服务器可能重传SYN-ACK。
5. ESTABLISHED
- 连接已建立,双方可以自由传输数据。
- 客户端收到服务器的SYN-ACK后进入此状态;服务器收到客户端的ACK后也进入此状态。
6. FIN_WAIT_1
- 主动关闭方(如客户端) 发送FIN报文后进入此状态,等待对方的ACK或FIN响应。
- 可能直接进入
FIN_WAIT_2
(收到ACK)或CLOSING
(同时收到FIN)。
7. FIN_WAIT_2
- 主动关闭方 已收到对FIN的ACK,等待对方发送FIN报文以终止连接。
- 此时仍可能接收数据,但不再发送数据。
8. CLOSE_WAIT
- 被动关闭方(如服务器) 收到对方的FIN报文后进入此状态,发送ACK确认,并等待应用程序关闭连接。
- 应用程序需调用
close()
发送FIN以进入后续状态。
9. CLOSING
- 罕见状态,双方同时发起关闭(均发送FIN报文),等待对方的ACK。
- 当双方同时处于
FIN_WAIT_1
并交换FIN时进入此状态。
10. LAST_ACK
- 被动关闭方 发送自己的FIN报文后进入此状态,等待对方的最终ACK确认。
- 收到ACK后进入
CLOSED
状态。
11. TIME_WAIT
- 主动关闭方 收到对方的FIN并发送ACK后进入此状态,等待2MSL(最大报文生存时间)以确保所有报文消失。
- 防止旧连接的延迟报文干扰新连接。
状态转换图
-
连接建立(三次握手)
CLOSED → SYN_SENT → ESTABLISHED
(客户端)
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED
(服务器) -
连接终止(四次挥手)
ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
(主动关闭方)
ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
(被动关闭方)
关键点
- TIME_WAIT 是主动关闭方的最终状态,确保可靠终止。
- CLOSING 和 LAST_ACK 处理异常关闭场景。
- 实际应用中,可通过
netstat
命令查看TCP连接状态。
理解这些状态有助于诊断网络问题(如连接泄漏、端口占用等)。