TCP 三次握手(SYN、SYN-ACK、ACK)
⚡ 智能摘要
TCP 三次握手是每个 TCP 会话开始时的连接建立过程。客户端和服务器交换 SYN、SYN-ACK 和 ACK 数据包,以同步序列号并确认双方都已准备就绪,然后才能发送任何字节的应用数据。

什么是TCP三次握手?
此 TCP 三次握手 是客户端和服务器在某个平台上使用的过程。 TCP/IP 网络 在交换任何应用程序数据之前,需要建立可靠的连接。顾名思义,它包含三个步骤:双方交换同步 (SYN) 和确认 (ACK) 数据包,并商定他们将使用的初始序列号。
握手过程的设计使得双方可以对称地发起、协商和拆除 TCP 套接字。握手完成后,连接变为全双工——双方可以并行发送和接收数据,直到一方发出 FIN 信号关闭会话。
TCP消息类型
握手和拆卸过程中会反复出现四个控制标志。
| 留言 | 描述 |
|---|---|
| SYN | 建立连接并同步设备间的序列号。 |
| ACK | 向对方确认已收到上一节数据。 |
| 同步确认 | 组合消息——来自本地设备的 SYN 消息加上对端先前 SYN 消息的 ACK 消息。 |
| END | 用于优雅地终止连接。 |
TCP 三次握手过程
TCP通信总是以三次握手开始。客户端通过向服务器请求建立会话来发起通信。
三次握手示意图。
- 步骤 1 — SYN: 客户端发送一个设置了 SYN 标志的数据段。它告诉服务器“我想开始通信”,并提议一个初始序列号。
- 步骤 2 — 同步确认: 服务器会回复一个同时设置了 SYN 和 ACK 标志的数据段。ACK 确认客户端的 SYN 请求,而 SYN 则提出服务器自身的初始序列号。
- 步骤 3 — 确认: 客户端以最终的 ACK 确认服务器的 SYN-ACK。连接现已建立,双方均可开始通信。 transmit处理应用程序数据。
真实示例
以下是一个使用具体序列数字的示例。
- 主机 X 通过向服务器发送 TCP SYN 数据包来建立连接。该数据包携带一个随机的初始序列号——例如,
4321— 这标志着主机 X 将发送的字节流的开始。 - 服务器收到 SYN 消息后,会回复 SYN-ACK 消息。ACK 编号是主机 X 的序列号加 1(
4322),而 SYN 则提出服务器自身的初始序列号。 - 主机 X 回复最终 ACK,其确认号为服务器序列号加 1。
数据交换完成后,TCP 会通过四次 FIN/ACK 序列断开连接,以便两个端点可以干净利落地释放套接字。
为什么 TCP 需要三次握手
握手不仅仅是一种形式——它解决了可靠字节流传输中存在的三个具体问题:
- 序列号同步: 双方都会获知对方的初始序列号,TCP 正是利用该序列号来检测丢失或乱序的段。
- 连接状态协议: 第三个 ACK 确认服务器的 SYN-ACK 已到达,因此双方都不会开始发送数据,直到双方都收到第三个 ACK 为止。 成立 州。
- 重复数据包保护: 随机初始序列号和定时握手状态可防止错误地接受先前会话中的过期片段。
TCP握手常见问题
握手过程虽然稳定可靠,但也会以一些可识别的方式失效。网络工程师通常会遇到以下几种情况之一:
- SYN 洪水攻击: 恶意客户端会发送数千个 SYN 请求而不回复 SYN-ACK 请求,从而耗尽服务器的连接表。SYN cookie 是标准的防御措施。
- 半开放式连接: 当第三个 ACK 丢失时,连接会保持半开状态,最终因超时而被清除。
- 防火墙或NAT导致传输过程中数据丢失: 有状态的中间盒如果丢失状态,可能会丢弃 SYN-ACK 数据包,导致客户端重试。
- RST重置: 如果服务器没有监听请求的端口,它会用 RST 响应 SYN 请求,从而立即关闭该尝试。


