在互联网的底层通信中,TCP(传输控制协议) 是确保数据可靠传输的核心协议。它通过一套精巧的机制,在不可靠的网络环境中建立起一条有序、稳定的数据传输通道。而这一切的起点,便是著名的三次握手(Three-way Handshake)。
一、为什么需要三次握手?
TCP协议是面向连接的,这意味着通信双方必须在传输数据前确认彼此的通信能力和协商初始参数。试想两个人打电话的场景:当A拨打B的电话时,B接听并说“喂”,A再回应“你好”,双方才能确认通话链路畅通。三次握手正是为了解决以下关键问题:
- 防止历史连接的干扰
网络中存在延迟的数据包(如之前未完成的连接请求)。三次握手确保客户端能够识别并拒绝旧的重复连接请求。 - 同步双方的初始序列号(ISN)
TCP通过序列号标识数据包的顺序,而双方需要协商一个随机的初始值,避免预测序列号导致的安全风险。 - 验证双向通信能力
确保客户端和服务器均具备发送和接收数据的能力,避免单向通信的无效连接。
二、三次握手的具体过程
- 第一次握手:SYN(Synchronize)
- 客户端向服务器发送一个SYN报文(标志位SYN=1),并随机生成一个初始序列号
seq=x
,进入SYN-SENT
状态。 - 目的:告知服务器“我想建立连接,我的初始序列号是x”。
- 第二次握手:SYN-ACK
- 服务器收到SYN后,若同意连接,则回复SYN-ACK报文(SYN=1, ACK=1),携带自己的初始序列号
seq=y
,并确认客户端的序列号ack=x+1
,进入SYN-RECEIVED
状态。 - 目的:回应客户端“我收到你的请求了,同意连接,我的序列号是y”。
- 第三次握手:ACK(Acknowledgment)
- 客户端收到SYN-ACK后,发送ACK报文(ACK=1),确认服务器的序列号
ack=y+1
,进入ESTABLISHED
状态。 - 服务器收到ACK后,同样进入
ESTABLISHED
状态,连接正式建立。 - 目的:客户端确认服务器已准备好,双方开始传输数据。
三、三次握手的核心意义
- 资源分配的时机
服务器在第三次握手完成后才分配连接资源(如缓冲区、端口),避免了因客户端不响应而导致的资源浪费。 - 双重确认机制
通过客户端和服务器各自发送一次SYN并得到对方的ACK,确保双向通信能力均有效。两次握手只能验证单向通信,无法排除服务器响应能力异常的情况。 - 抵御网络中的异常包
若客户端收到一个陈旧的SYN-ACK(来自之前未完成的连接),会发送RST(复位)报文终止无效连接,避免数据混乱。