TCP 连接建立和终止过程中的状态变化
通常情况下,建立一个 TCP 连接需要三次握手,连接建立好之后可以双向同时发送数据。正常断开一个 TCP 连接需要四次挥手。在 TCP 连接建立到断开的过程中,连接双方的状态会发生变化。
状态变化
下图展示了 TCP 连接建立和终止时发送的报文段类型以及连接双方状态的变化。
连接建立的过程
- 服务端监听指定端口,进入 LISTEN 状态,等待客户端的连接
- 客户端执行主动打开,向服务端的指定端口发送 SYN 报文段,状态变为 SYN_SENT
- 服务端收到客户端的 SYN 请求后,状态变为 SYN_RCVD,同时向客户端回复 ack 和发送自己的 SYN
- 客户端收到服务端的 SYN 后,状态变为 ESTABLISHED,同时回复 ack 进行确认
- 服务端收到 ack 后,状态变为 ESTABLISHED
连接断开的过程
- 客户端执行主动关闭,发送 FIN 报文段,状态变为 FIN_WAIT_1
- 服务端收到 FIN 后,状态变为 CLOSE_WAIT,同时回复一个 ack 确认报文段
- 客户端收到 ack 后,状态变为 FIN_WAIT_2
- 服务端还可以继续发送剩余数据。若数据已发送完,则可以直接发送 FIN 报文段,同时状态变为 LAST_ACK
- 客户端收到 FIN 后,状态变为 TIME_WAIT,同时回复一个 ack 报文段
- 服务端收到 ack 后,连接关闭
参考
TCP/IP 详解 卷 1:协议
相关文章
- 2021-09-08
通过 netstat 命令查看网络状态,其中有一列展示的是 socket 的状态,熟练掌握这些状态的含义有助于连接状态的分析与问题排查。
预览: