跳到主要内容

TCP 三次握手的工作流程

· 阅读需 4 分钟
素明诚
Full stack development

工作流程

SYN:客户端发送一个 SYN(同步序列编号)包到服务器,并进入 SYN_SEND 状态,等待服务器确认。

SYN-ACK:服务器接收到 SYN 包,必须确认客户的 SYN(ACK)并同时自己也发送一个 SYN 包,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。

ACK:客户端收到服务器的 SYN+ACK 包后,向服务器发送确认包 ACK,此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

详解

同步序列编号(SYN)

同步序列编号(SYN)是在 TCP 协议中用来标识数据包序列的数字,它是三次握手过程的一部分。在 TCP 连接的初始化阶段,SYN 标志被设置为 1,以表明一个连接请求或连接接受。序列编号是随机产生的,用于标记传输的数据包的顺序,确保数据的有序和完整性。

术语描述
SYN标志位,用于启动一个新连接,同时携带一个随机的序列号作为开始。

ESTABLISHED 状态

ESTABLISHED 状态表示 TCP 连接已经成功建立,两端的设备可以开始数据传输。在三次握手过程中,当双方交换完所有必要的确认消息后,连接状态就会变为 ESTABLISHED。这个状态是双向的,即数据可以从任一端向另一端发送。

打电话类似三次握手

  1. 拨打电话:当你拨打电话给某人时,你的电话会向对方的电话发送一个信号,请求建立连接(相当于发送 SYN)。
  2. 响铃并接听:对方的电话响铃,当他们接听时,他们的电话会发送一个信号回到你的电话,表明他们已准备好接受通话(相当于发送 SYN-ACK)。
  3. 开始通话:你听到对方接听的声音或信号后,通话开始(相当于发送 ACK),此时双方都知道连接已建立,可以开始通话了。

为什么是三次?两次不行吗?

在两次握手的情况下

  • 客户端发送一个带有 SYN 的数据包到服务器,请求建立连接。
  • 服务器返回一个带有 SYN 和 ACK 的数据包,表示接受连接请求。

这里的问题是,虽然服务器知道客户端能够接收数据(因为客户端收到了服务器的响应),但服务器没有确切的方式来确认客户端是否还在继续能够发送数据。如果在服务器响应之后,客户端发生故障或连接中断,服务器可能会在不知情的情况下保持一个无效的连接,这会浪费服务器资源。

防止旧连接请求的执行

三次握手的设计还可以防止已经失效的连接请求被错误地建立为新的连接。考虑这样一个场景

  • 客户端之前发送了一个连接请求(SYN),但因为某种原因(如网络延迟),这个请求在很长时间后才到达服务器。
  • 在两次握手的协议中,服务器会立即接受这个迟到的连接请求并发送确认(SYN-ACK),然后认为连接已建立。

在这种情况下,如果没有第三次握手(客户端的 ACK),服务器无法确定客户端是否真的还想建立连接或者是否已经接收到了它的 SYN-ACK 响应。这样可能导致服务器开启一些根本不需要的连接。

所以如果是两次握手存在导致资源浪费的风险