559 字
3 分钟
CLOSE-WAIT 和 TIME-WAIT 的状态和意义

CLOSE-WAIT 状态有什么意义?

服务端收到客户端关闭连接的请求并确认之后,就会进入 CLOSE-WAIT 状态。此时服务端可能还有一些数据没有传输完成,因此不能立即关闭连接,而 CLOSE-WAIT 状态就是为了保证服务端在关闭连接之前将待发送的数据处理完。

TIME-WAIT 有什么意义?

TIME-WAIT 状态发生在第四次挥手,当客户端向服务端发送 ACK 确认报文后进入 TIME-WAIT 状态。 它存在的意义主要是两个: image.png

  • 防⽌旧连接的数据包

如果客户端收到服务端的 FIN 报文之后立即关闭连接,但是此时服务端对应的端口并没有关闭,如果客户端在相同端口建立新的连接,可能会导致新连接收到旧连接残留的数据包,导致不可预料的异常发生。

  • 保证连接正确关闭

假设客户端最后一次发送的 ACK 包在传输的时候丢失了,由于 TCP 协议的超时重传机制,服务端将重发 FIN 报文,如果客户端没有维持 TIME-WAIT 状态而直接关闭的话,当收到服务端重新发送的 FIN 包时,客户端就会使用 RST 包来响应服务端,导致服务端以为有错误发生,然而实际关闭连接过程是正常的。

TIME_WAIT 状态过多会导致什么问题?怎么解决#

TIME_WAIT 状态过多会导致什么问题? 如果服务器有处于 TIME-WAIT 状态的 TCP,则说明是由服务器⽅主动发起的断开请求。 过多的 TIME-WAIT 状态主要的危害有两种: 第⼀是内存资源占⽤; 第⼆是对端⼝资源的占⽤,⼀个 TCP 连接⾄少消耗⼀个本地端⼝; 怎么解决 TIME_WAIT 状态过多?

  • 服务器可以设置 SO_REUSEADDR 套接字来通知内核,如果端口被占用,但是 TCP 连接位于 TIME_WAIT 状态时可以重用端口。
  • 还可以使用长连接的方式来减少 TCP 的连接和断开,在长连接的业务里往往不需要考虑 TIME_WAIT 状态。
CLOSE-WAIT 和 TIME-WAIT 的状态和意义
作者
强人自传
发布于
2025-10-06
许可协议
CC BY-NC-SA 4.0