刚学网络的人几乎都会问同一个问题:三次握手能不能省成两次?明明第二次应答已经包含了确认,第三次看起来像是多余的客套——走代理IP链路时,每一段的连接建立都绕不开这个疑问。
答案藏在网络的一个老难题里:报文可能会迟到、会重复。第三次握手防的,正是这类「幽灵报文」造成的串扰。
问题场景:迟到的旧请求
假设只有两次握手:发起方发出 SYN,接收方应答 SYN-ACK,双方就当连接建立了。假如第一份 SYN 在路上堵了很久,发起方等不及重发了一份,接收方回应的是新的这份,旧的却还在路上。
更麻烦的是极端情况:旧的 SYN 在网络里滞留很久后才到达接收方,接收方误以为又有新连接要建立,应答之后进入等待状态,白白占用资源,还可能把后续数据张冠李戴。
现实里这类「幽灵请求」并不罕见:网络抖动、路由重排都可能让报文在队列里滞留很久,晚到的旧报文和新请求混在一起。没有第三道确认关卡,接收方根本分不清哪个该信。
第三次握手怎么解围
第三次 ACK 的隐藏作用是「最后把关」:接收方建立连接前,必须等发起方再确认一次。如果发起方根本没想连(旧报文作祟),自然不会回这第三次,接收方等不到就放弃,不会空耗资源。
也就是说,第三次握手把「建立连接的最终决定权」交给了发起方,让接收方不必仅凭一份可能过期的报文就进入连接状态。多这一步,堵住了旧包串扰的洞。
这也解释了为什么连接建立看似简单,协议设计却如此谨慎——每一步都是拿历史上的真实故障换来的经验。少一步看似省事,代价却是把系统暴露在已知的风险里。
少一次和多次又会怎样
少于三次,上面说的串扰问题无解,这是历史教训换来的结论。多于三次呢?理论上更保险,但收益递减——三次已经足够确认双向状态,再加次数只增加延迟,不增加安全。
所以三次是可靠与效率的平衡点:比两次多一次解决串扰,比四次少一次省下往返时间,代理IP链路每一段都按这个平衡执行。
如果还想再往深想一步:三次握手本身有没有代价?有,每次建连都要多花一轮确认的往返时间。所以协议层面没有让所有连接都从头握手——复用已有连接的机制就是为了让「已经确认过的关系」持续生效,代理IP链路上同样如此。
代理IP链路里的三次发生在哪里
走代理IP时,三次握手在你的本机和转发层之间完整发生一次,转发层和目标站之间又完整发生一次,两段互不共享握手状态。
所以「为什么是三次」的答案,在代理IP链路的每一段都适用:每一段都要防自己的旧包串扰,每一段都独立完成三次,两段加起来是六次动作,但规则不变。
换到使用视角:如果连接总在第三次握手附近出问题,多半不是协议的问题,而是网络路径上的丢包——第三次 ACK 丢了,接收方会一直等,直到超时。看抓包数一数有没有「三缺一」,排查方向就有了。
回到开头的问题:三次能省成两次吗?不能——省掉的那一次,恰好是防止「以为你在、其实你没在」的关键确认。
