| HowItWorksLab · Systems
简体中文

TCP 三次握手如何运转

在传输任何数据之前,TCP 先用三条消息打开连接。跟着 SYN、SYN-ACK 与 ACK 走过两条生命线,看客户端与服务器如何商定各自数据流的起点。

TCP 三次握手 · 时序 SYN → SYN-ACK → ACK · 三条消息在传输数据前打开连接 时间 ↓ 客户端 服务器 关闭 SYN 已发送 监听 已收到 SYN 已建立 已建立 SYN · seq = x SYN-ACK · seq = y,ack = x + 1 ACK · ack = y + 1 连接已建立——数据可以开始流动 双方已就彼此的起始序号达成一致 蓝色 = SYN · 橙色 = SYN-ACK · 绿色 = ACK / 已建立
握手的顺序 客户端发出 SYN → 服务器回 SYN-ACK → 客户端回 ACK → 双方已建立 → 数据流动
显示模式

详细说明

什么是 TCP 三次握手?

三次握手是 TCP 打开连接的方式。在客户端与服务器交换任何真实数据之前,它们先互发三条短消息——SYN、SYN-ACK 与 ACK——来商定起始序号,并确认彼此都能到达对方。

TCP 是可靠、有序的协议:它承诺数据完整、按序到达。握手正是让这个承诺成为可能的第一步,它把对话的两个方向同步起来。

为什么要画成时序图?

握手是时间上的一段过程,而不是某台设备的形状。两条竖直生命线加三支箭头,正好说明谁在什么时候说了什么、每条消息从哪来——这是阅读协议交互最自然的方式。

部件及其作用

1. 客户端发出 SYN

客户端随机挑一个起始序号 x,放进 SYN 里发出。它不是来索要数据,而是在提议:“我的数据流将从 x 开始,我们能通信吗?”随后客户端进入“SYN 已发送”状态等待。

2. 服务器回以 SYN-ACK

一直在监听的服务器作出回复。这条消息同时干两件事:用 ack = x + 1 确认客户端,并给出自己的起始序号 y。因为它既同步又确认,所以叫 SYN-ACK。

3. 客户端发出 ACK

客户端用 ack = y + 1 确认服务器的序号。这第三条消息告诉服务器“我收到了你的回复”,于是这条链路双向都被确认可用。

4. 双方进入“已建立”

随着消息来回传递,每个端点都会经过自己的状态——关闭、SYN 已发送、监听、已收到 SYN——直到双方都进入“已建立”。状态让每一方知道自己正处在握手的哪一步。

5. 此时数据才能流动

只有在第三条消息之后,应用数据才开始传输。从这时起,每个字节都被编号并确认,接收方因此可以重新排序、发现缺口。握手本身已经完成,不会每个数据包都重复。

为什么是三条消息而不是两条?

两条只能让客户端确认服务器可达,却无法让服务器知道客户端收到了它的回复。第三条消息告诉服务器“我听到了”,于是双方都确认这条通道双向可用,才会开始发送数据。

SYN 和 ACK 分别是什么意思?

SYN 意为“同步”:它携带一个起始序号,用来对齐两条数据流。ACK 意为“确认”:它表示发送方已收到此前的全部内容,并期待下一个编号。一条消息可以同时承担两者,这就是 SYN-ACK。

序号有什么用?

TCP 给每个字节编号,接收方据此把数据重新排好、并发现缺口。握手先商定起始序号,这样双方都知道该期待什么,一旦有缺失就能请求重传。

如果握手消息丢了会怎样?

会重发。SYN 没有回应,客户端超时后会重试;最后一条 ACK 丢了,服务器会重发它的 SYN-ACK。握手本身是可靠的,丢一条消息只会多花一点时间。

每个数据包都要握手吗?

不用。握手只在连接打开时发生一次。之后数据包可以直接传输,不必重复握手,直到连接在结束时被关闭。

常见误区

握手本身就在传页面数据。 看起来三支箭头已经把内容发过去了。
它只是把连接建起来。 第三条消息完成之前,不传输任何应用数据。
两条消息就能打开 TCP 连接。 既然双方都要回复,两条应该就够了。
两条只能确认一个方向。 第三条告诉服务器客户端听到了它的回复,两个方向才都被验证。
TCP 连接是一条实体线路。 感觉两台机器之间被接通了一根专用电线。
它是逻辑上的约定。 两个端点就序号与端口号达成一致;网络里并没有保留专用通道。
免责声明:本图解为教学目的做了大幅简化,真实系统变量与复杂度远超此处。不可用于工程生产用途,也不构成金融、政治或专业建议。