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 是全双工,双方需要各自确认关闭。
能讲清楚「为什么三次四次」的人比只会背流程的人少得多。
评论
评论已关闭。