为什么是四次:全双工的独立关闭
TCP 连接是全双工的:客户端 → 服务端和服务端 → 客户端是两条独立的数据流。任何一方都可以先关闭自己这一侧的发送方向,而另一个方向还可以继续传数据(称为半关闭,对应 socket API 的 shutdown 调用)。
所以完整关闭需要「每个方向各关一次、各确认一次」:主动方发 FIN,被动方回 ACK;被动方处理完剩余数据后再发 FIN,主动方回 ACK。这就是四次挥手。如果被动方收到 FIN 时已经没有数据要发,它可以(通过延迟确认等机制)把 ACK 和自己的 FIN 合并,看起来就像三次挥手。