1. 引言

握手(Handshake)是一种常见的建立连接的行为。在现实生活中,它可能是两个商务人士开始交谈前的礼节性动作。在计算机网络中,设备或进程通过执行握手协议来建立连接,从而按照事先协商好的参数和规则进行通信。

本文将深入探讨两种常见的握手协议:两次握手(Two-Way Handshake)三次握手(Three-Way Handshake)。我们的目标是理解它们的工作机制、优缺点,以及为何三次握手成为主流标准。

2. 握手基础概念

握手本质上是通信双方在正式传输数据前进行的协商过程。它可以协商通信协议、数据编码方式、最大传输速率等参数。

以下是一些需要握手的常见场景:

  • TCP(传输控制协议):建立 TCP 连接时采用三次握手,确保通信双方同步序列号并建立可靠的连接。
  • TLS(安全传输层协议):客户端与服务端通过握手协商加密算法、交换密钥等安全参数。
  • SMTP(简单邮件传输协议):在建立 TCP 连接后,SMTP 客户端与服务器通过握手进行身份验证并协商通信参数,如加密方式和最大邮件大小。
  • 拨号上网:调制解调器通过握手协商通信协议、调制方式等,以优化连接质量。

3. 两次握手(Two-Way Handshake)

两次握手是一种较为简单的连接建立方式,通常涉及 SYN(同步)ACK(确认) 消息交互。

握手流程如下:

  1. 客户端发送 SYN 消息,携带一个初始序列号 X。
  2. 服务端收到后,发送 ACK 消息,携带自己的序列号 Y,并确认客户端的 X。

这样,连接就建立完成了。

流程图如下:

TWH

⚠️ 问题所在:

如果服务端的 ACK 消息在网络中延迟,客户端可能会超时并重新发送 SYN 消息。此时服务端可能已经处理过第一个 SYN,并发送了 ACK,但由于延迟,它会收到新的 SYN 消息。

此时,客户端使用新的序列号 Z 发送数据,但服务端却期望接收基于 X 的数据,导致序列号不一致,进而引发数据错乱。

流程示意如下:

TWHE-1

因此,两次握手存在连接同步失败的风险。

4. 三次握手(Three-Way Handshake)

三次握手在两次握手的基础上增加了一次确认步骤,确保双方都确认了彼此的序列号,从而避免了同步失败的问题。

具体流程如下:

  1. 客户端发送 SYN 消息,携带序列号 X。
  2. 服务端响应 SYN-ACK,携带自己的序列号 Y,并确认客户端的 X。
  3. 客户端发送 ACK 消息,确认服务端的 Y。

三次握手完成后,连接正式建立。

流程图如下:

ThreeWH

优势:

  • 双方都能确认对方的发送与接收能力
  • 避免了由于 ACK 延迟导致的序列号错乱
  • 提高了连接的可靠性

缺点:

  • 增加了一次通信开销,连接建立时间稍长
  • 在高并发场景下可能略微增加服务器负担

⚠️ 踩坑提醒:

某些新手开发者可能误以为两次握手就足够,但在实际网络环境中,丢包、延迟、重传是常态,两次握手很容易导致连接建立失败或数据混乱。

5. 总结

握手协议是网络通信中不可或缺的一环。两次握手虽然简单,但由于其潜在的同步问题,在实际应用中已被淘汰。三次握手通过增加一次确认机制,显著提升了连接的可靠性,因此被广泛应用于 TCP、TLS 等协议中。

关键点回顾:

项目 两次握手 三次握手
消息次数 2 3
是否可靠
是否存在序列号冲突风险
实际应用

总之,握手不仅是一种连接建立机制,更是保障通信可靠性的基石。理解其原理,有助于我们在网络编程中更好地设计和排查问题。


原始标题:Two-Way Handshake and Three-Way Handshake

« 上一篇: CPU 工作原理详解
» 下一篇: IPv4 数据报详解