标准答案
- 主动关闭方先发送 FIN,表示自己不再发送数据;对方返回 ACK 后,这个方向的关闭被确认。
- 被动关闭方仍可能有待发送数据,完成后再发送自己的 FIN;主动关闭方再返回最后一个 ACK。
- TCP 是全双工连接,两个方向可以独立结束,因此常见过程是四个报文,而不是一次性断开。
- 主动关闭方进入 TIME_WAIT,等待足够时间以便重发最后 ACK,并避免旧连接的延迟报文干扰后续同四元组连接。
- 服务端大量主动关闭短连接时,TIME_WAIT 可能增加端口和连接表压力;应优先复用连接、调整业务关闭策略和排查异常短连接,而不是直接关闭协议保护。
题目解析
TIME_WAIT 本身不是错误,它是 TCP 正确关闭的一部分。需要关注的是数量是否持续异常、是否由连接池失效、代理配置或请求模式导致。
连接关闭问题还要与 FIN_WAIT、CLOSE_WAIT 区分。CLOSE_WAIT 长期堆积通常意味着应用没有及时关闭已被对端关闭的连接。
常见误区
- 把四次挥手说成固定四个独立网络包,忽略 ACK 和 FIN 在某些情况下可以合并。
- 认为 TIME_WAIT 可以无条件关闭或缩短,不考虑旧报文和最终 ACK 丢失。
- 只看服务器端口占用,不检查谁主动关闭、连接是否被正确复用。