四次挥手过程:

  1. 主动关闭方发送 FIN,进入 FIN_WAIT_1(表示自己不再发数据,但还能收)。
  2. 被动方回 ACK,进入 CLOSE_WAIT;主动方收到后进入 FIN_WAIT_2。此时连接处于半关闭状态。
  3. 被动方数据发完后也发 FIN,进入 LAST_ACK。
  4. 主动方回 ACK,进入 TIME_WAIT;被动方收到 ACK 即关闭。主动方等待 2MSL 后才真正关闭。

为什么四次:TCP 全双工,两个方向要独立关闭;被动方收到 FIN 时可能还有数据没发完,ACK 和 FIN 无法合并。

TIME_WAIT 等 2MSL 的原因:一是保证最后一个 ACK 能到达——若 ACK 丢失,对方会重发 FIN,2MSL(报文最大生存时间的两倍)足以等到重传的 FIN 并重发 ACK;二是让本次连接的所有报文在网络中消亡,防止旧报文干扰相同四元组的新连接。

工程问题:高并发短连接下大量 TIME_WAIT 会占用端口,可通过长连接、连接池缓解;tcp_tw_reuse 可在特定条件下复用(现代内核 timestamp 机制下相对安全),但不建议盲目开启。追问方向:CLOSE_WAIT 堆积(代码没 close)、RST 的场景。