📄 计算机基础 🟢 入门 ⏱ 8 分钟

🤝 TCP 三次握手:连接是怎么建立的

发 SYN → 收 SYN+ACK → 回 ACK。为什么是三次?每一步在确认什么?一次讲透。

1

三次握手在干什么

🎯 建立可靠连接

TCP 三次握手是建立可靠连接的过程。

核心目的:确认双方都具有收发数据的能力,并同步初始序列号(ISN)。

为后续的可靠传输打基础。

🔑 记忆口诀

发 SYN → 收 SYN+ACK → 回 ACK

三次直连稳如山。

每次握手都在确认对方某一方向的收发能力。

2

完整流程

① SYN客户端发 SYN + client_isn → SYN_SENT
➜
② SYN+ACK服务端回 SYN+ACK + server_isn → SYN_RCVD
➜
③ ACK客户端回 ACK(server_isn+1) → ESTABLISHED
🤝 三次后双方都进入 ESTABLISHED,连接建立
🎬 三次握手报文交换
① 客户端 → 服务端
SYN, seq=client_isn(自己的初始序列号)→ 客户端进入 SYN_SENT
② 服务端 → 客户端
SYN+ACK, seq=server_isn, ack=client_isn+1 → 服务端进入 SYN_RCVD
③ 客户端 → 服务端
ACK, ack=server_isn+1 → 双方进入 ESTABLISHED ✅
3

每一步在确认什么

1️⃣ 第 1 次:客户端→服务端

客户端确认:自己发送能力正常。

服务端收到 SYN,知道客户端能发。

2️⃣ 第 2 次:服务端→客户端

服务端确认:自己能收、能发。

客户端收到 SYN+ACK,也确认自己能收(收到服务端回复了)。

3️⃣ 第 3 次:客户端→服务端

服务端收到 ACK,确认:客户端能收(收到了自己的回复)。

至此双方收发能力都确认了。

为什么要三次?因为只有经过三次,双方才能都确认对方「能收也能发」。

用一次/两次都做不到同时确认双方双向能力(详细原因看下节)。

4

为什么是三次,不是两次

⚠️ 防止失效连接请求

核心原因:防止已失效的连接请求到达服务器。

如果只有两次握手:客户端发的 SYN 在网络中延迟,客户端超时重发并建立了连接;结果延迟的旧 SYN 又到了服务器,服务器误以为要建新连接而分配资源 → 浪费资源。

🔐 同步初始序列号

三次握手还用于协商初始序列号(ISN)。

ISN 是随机生成的,防止旧连接报文干扰新连接。

双方通过握手互相确认对方的序列号起点。

🎬 只有两次握手的坑
场景
客户端发 SYN(seq=100),网络延迟了
客户端
超时没收到回复 → 重发 SYN(seq=200) → 服务器回 SYN+ACK → 建立连接,通信正常
问题
但延迟的旧 SYN(seq=100) 又到了服务器 → 服务器误以为要建新连接,分配了资源 → 白白浪费
三次握手
靠第三次 ACK 确认,服务器能识别「这是不是我要的那个客户端」,避免误建连接
5

高频追问 & 攻击

📦
第三次能带数据吗

第一、二次(SYN/SYN+ACK)不能携带数据;第三次(ACK)可以携带数据。

🔁
第三次握手丢了

客户端以为建好开始发数据,服务端超时后重发 SYN+ACK,客户端回 ACK 后恢复。

⚔️
SYN Flood 攻击

攻击者发大量 SYN 但不回 ACK,耗尽服务器半连接队列。防御:SYN Cookie、加大半连接队列、缩短 SYN 超时。

🔢
为什么随机 ISN

防止旧连接报文干扰新连接,随机序列号让新旧连接能区分。

一句话总结

TCP 三次握手 = 发 SYN → 收 SYN+ACK → 回 ACK,三次确认双方收发能力都正常并同步随机初始序列号。核心是「防止失效的旧 SYN 导致服务器误建连接、浪费资源」。第一次不能带数据,第三次能带。注意 SYN Flood 攻击(发大量 SYN 不回 ACK 耗尽半连接队列)。

🎤 面试问答 · 口语化回答
三次握手是网络面试的入门必考题,面试官常连环追问:
面试官TCP 三次握手的过程是怎样的?
你

第一次客户端发 SYN 报文,带上自己的初始序列号 client_isn,进入 SYN_SENT 状态,主要确认自己发送能力正常;第二次服务端收到后回 SYN+ACK,带上自己的序列号 server_isn 和对客户端 SYN 的确认号 client_isn+1,进入 SYN_RCVD,确认自己能收能发;第三次客户端回 ACK,确认号 server_isn+1,双方进入 ESTABLISHED。三次之后双方收发能力都确认了,也同步了初始序列号。

💡 加分点:能同步说出状态变化(SYN_SENT → SYN_RCVD → ESTABLISHED)会很加分,说明你熟悉完整流程。
面试官为什么是三次握手,而不是两次?
你

核心是为了防止失效的连接请求到达服务器。假如只有两次握手:客户端发一个 SYN 在网络中延迟了,客户端超时重发并建立了连接,结果延迟的旧 SYN 又到了服务器,服务器误以为客户端要建新连接就分配了资源,白白浪费。三次握手靠第三次 ACK 让服务器能确认客户端确实收到了自己的回复,从而避免误建连接。同时三次也能同步初始序列号。

💡 加分点:能用「失效旧 SYN 导致资源浪费」这个具体例子讲清两次的坑,比笼统说「确保可靠」深刻得多。
面试官三次握手中能携带数据吗?
你

第一、二次握手不能携带数据,因为此时连接还没真正建立,服务端还没确认客户端能收。但第三次握手可以携带数据,因为客户端已经确认服务端能收能发了,这时候发数据是安全的。这也是第三次握手的一个细节考点。

💡 加分点:主动说出「第三次能带数据 + 为什么」,体现对握手语义的理解深度。
📝 读完打卡 · 写下你的收获 读完了?来打卡吧
用一句话写下你从这篇学到的最大收获,检验自己是否真的懂了 👇
⏱ 00:00 🔥0分