TCP 三次握手 为什么不是两次?TIME_WAIT 的意义是什么?
为什么 TCP 要三次握手,不是两次?
三次握手的目标是:双方都确认“我能发、我能收”,并且同步各自初始序号。
流程是:
- 客户端发
SYN(seq=x) - 服务端回
SYN+ACK(seq=y, ack=x+1) - 客户端再回
ACK(ack=y+1)
如果只有两次,会有两个问题:
- 服务端无法确认客户端是否收到了第 2 步(
SYN+ACK)。 - 旧的、延迟到达的
SYN可能让服务端误建连接(“幽灵连接”)。
第 3 次 ACK 本质上是客户端给服务端的“确认回执”,证明这次连接是有效且双向可用的。
TIME_WAIT 的意义是什么?
TIME_WAIT 出现在主动关闭连接的一方,停留约 2MSL(实现相关,通常几十秒到几分钟)。
主要有两大作用:
-
保证连接可靠结束
如果最后一个 ACK 丢了,对方会重发 FIN;TIME_WAIT期间还能再回 ACK。 -
防止旧报文污染新连接
等旧连接中的延迟包在网络中自然过期,避免和同四元组(源/目的 IP+端口)的新连接混淆。
所以 TIME_WAIT 是 TCP 为了“正确性和安全性”付出的必要代价,不是无意义等待。