glownight

返回

为什么 TCP 要三次握手,不是两次?

三次握手的目标是:双方都确认“我能发、我能收”,并且同步各自初始序号
流程是:

  1. 客户端发 SYN(seq=x)
  2. 服务端回 SYN+ACK(seq=y, ack=x+1)
  3. 客户端再回 ACK(ack=y+1)

如果只有两次,会有两个问题:

  1. 服务端无法确认客户端是否收到了第 2 步(SYN+ACK)。
  2. 旧的、延迟到达的 SYN 可能让服务端误建连接(“幽灵连接”)。

第 3 次 ACK 本质上是客户端给服务端的“确认回执”,证明这次连接是有效且双向可用的。


TIME_WAIT 的意义是什么?

TIME_WAIT 出现在主动关闭连接的一方,停留约 2MSL(实现相关,通常几十秒到几分钟)。

主要有两大作用:

  1. 保证连接可靠结束
    如果最后一个 ACK 丢了,对方会重发 FIN;TIME_WAIT 期间还能再回 ACK。

  2. 防止旧报文污染新连接
    等旧连接中的延迟包在网络中自然过期,避免和同四元组(源/目的 IP+端口)的新连接混淆。

所以 TIME_WAIT 是 TCP 为了“正确性和安全性”付出的必要代价,不是无意义等待。

TCP 三次握手 为什么不是两次?TIME_WAIT 的意义是什么?
作者 glownight
发布于 2025年4月9日