TCP 三次握手四次挥手:面试官到底想听什么?

TCP 的连接建立和释放是计算机网络面试的核心。

三次握手

客户端                          服务端
  |                               |
  |----SYN(seq=x)---------------->|  ① 客户端:我要连接
  |                               |
  |<---SYN+ACK(seq=y,ack=x+1)----|  ② 服务端:收到,我准备好了
  |                               |
  |----ACK(seq=x+1,ack=y+1)----->|  ③ 客户端:收到,开始传数据

为什么三次而不是两次?

两次握手的问题:如果客户端的第一个 SYN 在网络中滞留后重新到达,服务端会错误地建立连接。

三次握手的第三个 ACK 让服务端确认客户端确实收到了自己的 SYN+ACK,避免了历史连接被错误建立。

为什么不是四次?

服务端可以把 SYN 和 ACK 合并在一个包里发送(SYN+ACK),不需要分开。所以三次就够了。

四次挥手

客户端                          服务端
  |                               |
  |----FIN(seq=u)---------------->|  ① 客户端:我没数据了
  |                               |
  |<---ACK(seq=v,ack=u+1)--------|  ② 服务端:知道了
  |                               |
  |<---FIN(seq=w,ack=u+1)--------|  ③ 服务端:我也没数据了
  |                               |
  |----ACK(seq=u+1,ack=w+1)----->|  ④ 客户端:知道了

为什么挥手要四次?

因为 TCP 是全双工的——双方都可以独立地发送和接收数据。一方说「我没数据了」(FIN),另一方可能还有数据要发。所以 FIN 和 ACK 不能合并。

客户端的最后一个 ACK 发完后进入 TIME_WAIT(2MSL,约 60 秒),是为了: 1. 确保最后一个 ACK 能到达服务端 2. 让旧连接的所有报文在网络中消失

面试话术

三次握手本质上是在不可靠的网络上建立可靠的连接。两次不够(历史连接问题),四次浪费。四次挥手是因为 TCP 是全双工,双方需要各自确认关闭。

能讲清楚「为什么三次四次」的人比只会背流程的人少得多。

关于 Zihao Zhang

后端开发工程师。关注 Java/Spring Boot/Redis/MySQL 技术栈,分布式系统,OLAP 数据库,AI Agent 开发与应用。

评论

评论已关闭。