🤝 TCP 三次握手:连接是怎么建立的
发 SYN → 收 SYN+ACK → 回 ACK。为什么是三次?每一步在确认什么?一次讲透。
三次握手在干什么
🎯 建立可靠连接
TCP 三次握手是建立可靠连接的过程。
核心目的:确认双方都具有收发数据的能力,并同步初始序列号(ISN)。
为后续的可靠传输打基础。
🔑 记忆口诀
发 SYN → 收 SYN+ACK → 回 ACK
三次直连稳如山。
每次握手都在确认对方某一方向的收发能力。
完整流程
每一步在确认什么
1️⃣ 第 1 次:客户端→服务端
客户端确认:自己发送能力正常。
服务端收到 SYN,知道客户端能发。
2️⃣ 第 2 次:服务端→客户端
服务端确认:自己能收、能发。
客户端收到 SYN+ACK,也确认自己能收(收到服务端回复了)。
3️⃣ 第 3 次:客户端→服务端
服务端收到 ACK,确认:客户端能收(收到了自己的回复)。
至此双方收发能力都确认了。
为什么要三次?因为只有经过三次,双方才能都确认对方「能收也能发」。
用一次/两次都做不到同时确认双方双向能力(详细原因看下节)。
为什么是三次,不是两次
⚠️ 防止失效连接请求
核心原因:防止已失效的连接请求到达服务器。
如果只有两次握手:客户端发的 SYN 在网络中延迟,客户端超时重发并建立了连接;结果延迟的旧 SYN 又到了服务器,服务器误以为要建新连接而分配资源 → 浪费资源。
🔐 同步初始序列号
三次握手还用于协商初始序列号(ISN)。
ISN 是随机生成的,防止旧连接报文干扰新连接。
双方通过握手互相确认对方的序列号起点。
高频追问 & 攻击
第三次能带数据吗
第一、二次(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 耗尽半连接队列)。
第一次客户端发 SYN 报文,带上自己的初始序列号 client_isn,进入 SYN_SENT 状态,主要确认自己发送能力正常;第二次服务端收到后回 SYN+ACK,带上自己的序列号 server_isn 和对客户端 SYN 的确认号 client_isn+1,进入 SYN_RCVD,确认自己能收能发;第三次客户端回 ACK,确认号 server_isn+1,双方进入 ESTABLISHED。三次之后双方收发能力都确认了,也同步了初始序列号。
核心是为了防止失效的连接请求到达服务器。假如只有两次握手:客户端发一个 SYN 在网络中延迟了,客户端超时重发并建立了连接,结果延迟的旧 SYN 又到了服务器,服务器误以为客户端要建新连接就分配了资源,白白浪费。三次握手靠第三次 ACK 让服务器能确认客户端确实收到了自己的回复,从而避免误建连接。同时三次也能同步初始序列号。
第一、二次握手不能携带数据,因为此时连接还没真正建立,服务端还没确认客户端能收。但第三次握手可以携带数据,因为客户端已经确认服务端能收能发了,这时候发数据是安全的。这也是第三次握手的一个细节考点。