标准答案

  1. 服务端监听 socket 接收连接请求,完成握手后把连接放入 accept 队列,应用再通过 accept 取得连接 fd。
  2. 主动关闭的一方通常进入 TIME_WAIT,以处理延迟报文和避免旧连接混淆;大量短连接会增加端口和内核资源压力。
  3. CLOSE_WAIT 表示本端已经收到对端关闭但应用尚未关闭自己的 fd,持续增长常指向应用连接泄漏。
  4. SYN_RECV 增多要结合半连接队列、攻击流量、客户端重试和服务端处理能力判断,不能只调大 backlog。

题目解析

TCP 状态描述连接当前处于握手、数据传输或关闭的哪个阶段。TIME_WAIT 通常是主动关闭一方为处理延迟报文而保留的正常状态;CLOSE_WAIT 表示本地已经收到对端 FIN,但应用尚未关闭自己的 fd,长期增长更常指向应用释放问题。大量 SYN-RECV、ESTABLISHED 或 LAST-ACK 则对应不同排查方向。

排查应把 ss 的状态、监听队列、连接池借出、请求超时、负载均衡行为和应用 close 路径放在同一时间线上。内核参数可以缓解合法的短期峰值,但不能替代连接超时、半关闭处理、异常路径释放和客户端重试治理。

常见误区

  • 误区:看到 TIME_WAIT 就直接 kill。改正:先判断主动关闭方和端口复用压力,TIME_WAIT 本身通常不能被 kill。
  • 误区:把 CLOSE_WAIT 归因于客户端。改正:CLOSE_WAIT 表示本地应用尚未关闭已收到 FIN 的连接,应检查 close 路径。
  • 误区:只调整内核参数。改正:先修复连接生命周期和重试,再根据证据调整队列或端口范围。

作者信息