TCP连接建立和终止过程中的状态变化

通常情况下,建立一个 TCP 连接需要三次握手,连接建立好之后可以双向同时发送数据。正常断开一个 TCP 连接需要四次挥手。在 TCP 连接建立到断开的过程中,连接双方的状态会发生变化。

状态变化

下图展示了 TCP 连接建立和终止时发送的报文段类型以及连接双方状态的变化。

TCP正常建立连接和终止客户端客户端服务端服务端三次握手LISTEN(被动打开)SYN J主动打开 SYN_SENTSYN_RCVDSYN K, ack J+1ESTABLISHEDack K+1ESTABLISHED四次挥手FIN M主动关闭 FIN_WAIT_1CLOSE_WAIT(被动关闭)ack M+1FIN_WAIT_2FIN NTIME_WAITLAST_ACKack N+1CLOSED

连接建立的过程

  1. 服务端监听指定端口,进入 LISTEN 状态,等待客户端的连接
  2. 客户端执行主动打开,向服务端的指定端口发送 SYN 报文段,状态变为 SYN_SENT
  3. 服务端收到客户端的 SYN 请求后,状态变为 SYN_RCVD,同时向客户端回复 ack 和发送自己的 SYN
  4. 客户端收到服务端的 SYN 后,状态变为 ESTABLISHED,同时回复 ack 进行确认
  5. 服务端收到 ack 后,状态变为 ESTABLISHED

连接断开的过程

  1. 客户端执行主动关闭,发送 FIN 报文段,状态变为 FIN_WAIT_1
  2. 服务端收到 FIN 后,状态变为 CLOSE_WAIT,同时回复一个 ack 确认报文段
  3. 客户端收到 ack 后,状态变为 FIN_WAIT_2
  4. 服务端还可以继续发送剩余数据。若数据已发送完,则可以直接发送 FIN 报文段,同时状态变为 LAST_ACK
  5. 客户端收到 FIN 后,状态变为 TIME_WAIT,同时回复一个 ack 报文段
  6. 服务端收到 ack 后,连接关闭

参考

TCP/IP 详解 卷1:协议