TCP 三次握手图解:为什么不是两次、四次?面试与排障都该懂
TCP 三次握手是网络面试的必考题,但很多人只会背「SYN、SYN+ACK、ACK」,不理解为什么必须是三次。这篇用抓包视角讲清楚握手过程,以及为什么两次、四次都不行。
握手过程:客户端发 SYN(seq=x)请求建立连接;服务端回 SYN+ACK(seq=y, ack=x+1),表示收到并同意;客户端再回 ACK(ack=y+1),连接建立。抓包工具(如 tcpdump、Wireshark)里能看到这三步,缺一步连接都建立不起来。
为什么不能是两次?如果只有两次握手,服务端发出 SYN+ACK 后就认为连接建立。但这个 ACK 可能在网络中丢失或延迟——客户端早已放弃,服务端却一直维护连接等待数据,大量这样的「半连接」会耗尽服务端资源(历史上的 SYN Flood 攻击正是利用这一点)。
为什么不需要四次?服务端的 SYN 和 ACK 可以合并成一个 SYN+ACK 包发送(TCP 的设计允许),三次已经是最少的可靠握手次数。第四次「确认收到确认」在 TCP 里是隐式的,发出去也是冗余信息。
实际排障应用:连接超时多为网络不通或安全组未放行(客户端收不到 SYN+ACK);connection reset 多为服务端拒绝(收到 RST);握手成功但传输卡顿则是带宽/拥塞问题。抓包定位问题比猜要高效得多。
配置建议:华为云 ECS 上排查看安全组规则(入方向 22/80/443 端口)、内核参数 somaxconn(半连接队列上限)、ss -s 命令查看连接统计。理解了三次握手,这些配置项背后的含义就都清楚了。
- 点赞
- 收藏
- 关注作者
评论(0)