三次握手过程:

  1. 客户端发送 SYN(seq=x),进入 SYN_SENT 状态。
  2. 服务器回复 SYN+ACK(seq=y, ack=x+1),进入 SYN_RCVD 状态。
  3. 客户端回复 ACK(ack=y+1),双方进入 ESTABLISHED,连接建立。

为什么不是两次:核心原因是 TCP 是全双工的,双方都需要确认"对方的发送能力和自己的接收能力正常",并同步各自的初始序列号(ISN)。两次握手只能让服务器确认客户端的发送能力,客户端无法确认服务器的发送能力,ISN 同步也不完整。另一个经典原因是防止历史重复连接:如果网络中滞留了客户端之前发出的旧 SYN 报文,两次握手下服务器收到就直接建立连接并分配资源,白白浪费;三次握手中客户端发现不是自己发起的连接会回 RST 终止。

易错点:四次握手机制上可行(SYN 和 ACK 分开发)但没意义,合并为三次最省。追问方向:半连接队列与全连接队列、SYN Flood 攻击与 SYN Cookie 防御、握手阶段能否携带数据(第三次可以,TCP Fast Open 允许第一次也带)。