标准答案
- 第一次握手由客户端发送 SYN,表示希望建立连接,并携带客户端的初始序列号。
- 第二次握手由服务端返回 SYN 和 ACK,确认收到了客户端的 SYN,同时告知自己的初始序列号。
- 第三次握手由客户端发送 ACK,确认收到了服务端的 SYN;至此双方都知道对方具备收发能力。
- 初始序列号可以避免旧连接中的延迟报文被误认为新连接的数据,也为后续可靠传输建立序号空间。
- 如果只有两次握手,服务端在发出 SYN-ACK 后无法知道客户端是否真正收到;旧的重复 SYN 还可能让服务端错误保留无效连接。
题目解析
握手的重点不是机械背 SYN、ACK,而是确认双向通信能力和序列号状态。客户端最后一次 ACK 同时证明它收到了服务端的响应。
高并发场景中,半连接队列、SYN flood 防护、握手超时和负载均衡转发都会影响建连成功率,因此连接问题不能只靠应用日志排查。
常见误区
- 只记住报文顺序,却说不清每一步确认了什么。
- 认为两次握手已经足够,因为服务端已经收到了客户端请求。
- 把 TCP 握手和 HTTPS 的 TLS 握手混成同一个过程。