原力注入

快速了解 TCP 连接的 11 种状态及其转换

本文意在用简短的文字总结一下 TCP 的 11 种状态及其转换过程。

Image

相关文章

图解 TCP 连接生命周期

TCP 的 11 种状态

1. CLOSED

  • • 表示连接处于关闭状态。

  • • 这是 TCP 连接的初始状态或连接终止后的状态。

  • • 常见场景:服务端程序尚未启动监听,或者客户端和服务端都已完成连接释放。

2. LISTEN

  • • 服务器端状态,表示服务器在监听某个端口,等待客户端发起连接。

  • • 常见于服务端主动调用 listen() 函数时。

3. SYN-SENT

  • • 客户端发起连接请求后进入此状态。

  • • 表示已经发送了 SYN(同步序号)包,等待服务器的响应。

  • • 常见于客户端调用 connect() 函数后。

4. SYN-RECEIVED

  • • 服务端收到客户端的 SYN 包后,回复 SYN+ACK(同步序号+确认)包,并进入此状态。

  • • 等待客户端的最终确认(ACK)。

5. ESTABLISHED

  • • 表示连接已成功建立,客户端和服务端可以正常发送和接收数据。

  • • 这是 TCP 连接的稳定状态,也是数据传输的主要阶段。

6. FIN-WAIT-1

  • • 主动关闭连接的一方进入此状态,表示发送了 FIN(结束)包,等待对方的 ACK。

  • • 常见于调用 close() 函数的程序。

7. FIN-WAIT-2

  • • 主动关闭的一方收到对方的 ACK 后进入此状态,等待对方发送 FIN。

  • • 表示本方已完成数据发送。

8. CLOSE-WAIT

  • • 被动关闭的一方收到对方的 FIN 后进入此状态,表示对方已关闭数据发送。

  • • 等待本方处理完剩余任务并发送 FIN。

9. CLOSING

  • • 当双方几乎同时发起关闭请求时会进入此状态。

  • • 表示双方都发送了 FIN,但尚未收到对方的 ACK。

  • • 此状态比较少见。

10. LAST-ACK

  • • 被动关闭的一方发送 FIN 后进入此状态,等待对方的 ACK。

  • • 收到 ACK 后即可进入 CLOSED 状态。

11. TIME-WAIT

  • • 主动关闭的一方在收到对方的 FIN 和 ACK 后进入此状态。

  • • 等待一段时间(通常是 2MSL,两个最大报文段生存时间),以确保对方收到 ACK,防止旧数据包干扰。

TCP 状态转换流程

三次握手(连接建立)

TCP 通过三次握手建立可靠连接,具体流程如下:

  1. 1. CLOSED → SYN-SENT(客户端发起连接)

  • • 客户端发送 SYN 包,并进入 SYN-SENT 状态。

  • 2. LISTEN → SYN-RECEIVED(服务器接收连接请求)

    • • 服务器收到 SYN 包后,回复 SYN+ACK,并进入 SYN-RECEIVED 状态。

  • 3. SYN-SENT → ESTABLISHED(客户端确认连接)

    • • 客户端收到 SYN+ACK 后,回复 ACK,进入 ESTABLISHED 状态。

  • 4. SYN-RECEIVED → ESTABLISHED(服务器确认连接)

    • • 服务器收到 ACK 后,进入 ESTABLISHED 状态。

    此时连接建立完成,双方可以开始数据通信。

    四次挥手(连接释放)

    TCP 通过四次挥手确保连接安全关闭,具体流程如下:

    1. 1. ESTABLISHED → FIN-WAIT-1(主动关闭方发送 FIN)

    • • 主动关闭的一方发送 FIN 包,进入 FIN-WAIT-1 状态。

  • 2. ESTABLISHED → CLOSE-WAIT(被动关闭方收到 FIN)

    • • 被动关闭的一方收到 FIN 包后,回复 ACK,进入 CLOSE-WAIT 状态。

  • 3. FIN-WAIT-1 → FIN-WAIT-2(主动关闭方收到 ACK)

    • • 主动关闭的一方收到对方的 ACK 后进入 FIN-WAIT-2 状态。

  • 4. CLOSE-WAIT → LAST-ACK(被动关闭方发送 FIN)

    • • 被动关闭的一方完成必要的任务后,发送 FIN,进入 LAST-ACK 状态。

  • 5. FIN-WAIT-2 → TIME-WAIT(主动关闭方收到 FIN)

    • • 主动关闭的一方收到对方的 FIN 后,回复 ACK,进入 TIME-WAIT 状态。

  • 6. LAST-ACK → CLOSED(被动关闭方收到 ACK)

    • • 被动关闭的一方收到 ACK 后,进入 CLOSED 状态。

  • 7. TIME-WAIT → CLOSED(主动关闭方等待超时)

    • • 主动关闭的一方等待 2MSL 后,进入 CLOSED 状态。

    特殊状态转换

    1. 1. CLOSING

    • • 当双方几乎同时发起关闭时,会进入此状态,表示双方都发送了 FIN,但还在等待对方的 ACK。

    • • 状态转换较快,最终会进入 TIME-WAIT 或 CLOSED。

  • 2. TIME-WAIT

    • • 确保延迟的数据包不会干扰后续连接。

    • • 等待时间通常是两个最大报文段生存时间(2MSL)。