一、先记两个核心前提
- TCP 是可靠、面向连接、全双工协议
- 全双工:双方可以同时、独立收发数据,就像打电话,两边都能说、也能听。
- 通信靠几个关键标志位
SYN:同步(建连接用)ACK:确认收到FIN:结束(断连接用)seq:本方发出去的序列号ack:我收到了你上一条,希望你下次发这个号
二、TCP 三次握手(建立连接)
1. 一句话目的
确认客户端 & 服务器双方的:发送能力、接收能力都正常,并同步初始序列号。
2. 角色
- 客户端:C
- 服务端:S
3. 标准流程(可以自己推理)
-
第一次握手:C → S
- 内容:
SYN=1, seq=x - 含义:“我想连你,这是我的起始号 x”
- 能证明:
- C 的发送能力正常
- S 的接收能力正常
- 内容:
-
第二次握手:S → C
- 内容:
SYN=1, ACK=1, seq=y, ack=x+1 - 含义:
- ACK/x+1:“我收到你了,下次请发 x+1”
- SYN/y:“我也告诉你我的起始号 y”
- 能证明:
- S 的发送、接收都正常
- C 的接收、发送都正常
- 内容:
-
第三次握手:C → S
- 内容:
ACK=1, seq=x+1, ack=y+1 - 含义:“我收到你的 SYN 了,下次你发 y+1”
- 能证明:
- S 能确认:C 的接收能力正常
- 内容:
推理:为什么是 3 次,不是 2 次或 4 次?
- 2 次:服务端无法确认 **“客户端能不能收到我发的消息”**,不可靠。
- 4 次:多余,3 次已经把双方收发能力全验证完了。
4. 三次握手特性
- 可靠建立连接,同步序列号
- 防止 “过期的连接请求” 重复建立连接
- 服务端会有半连接队列,可能遭受 SYN 洪水攻击
- 握手完成后双方进入
ESTABLISHED(已连接)状态
三、TCP 四次挥手(断开连接)
1. 一句话目的
因为是全双工,两边各有一条独立的 “发送通道”,要分别关闭,所以需要 4 步。
2. 推理核心
一方说 “我发完了” ≠ 另一方也发完了。必须:
- 先关 A → B 的方向
- 再关 B → A 的方向
3. 标准流程(假设客户端主动断开)
-
第一次挥手:C → S
FIN=1, seq=u- 含义:“我数据发完了,我要关闭我的发送通道”
- C 进入
FIN_WAIT1
-
第二次挥手:S → C
ACK=1, ack=u+1, seq=v- 含义:“收到你关发送的请求,我确认了”
- S 进入
CLOSE_WAIT - C 收到后进入
FIN_WAIT2 - 注意:此时 S 可能还有数据要发,所以不能直接发 FIN!
-
第三次挥手:S → C
FIN=1, ACK=1, seq=w, ack=u+1- 含义:“我也发完了,我也要关闭我的发送通道”
- S 进入
LAST_ACK
-
第四次挥手:C → S
ACK=1, ack=w+1, seq=u+1- 含义:“收到你的关闭,确认”
- C 进入
TIME_WAIT,等待 2MSL 后彻底关闭 - S 收到 ACK 后直接关闭
推理:为什么是 4 次?因为第二步和第三步不能合并:服务器收到 FIN 后,只能先 ACK,不能立刻 FIN,因为它可能还有业务数据要发。等发完了,才能发自己的 FIN。中间这一步延迟,就把 3 次变成了 4 次。
4. 四次挥手特性
- 优雅关闭:保证数据传输完毕再断开
- 全双工独立关闭,一方关完不影响另一方
TIME_WAIT等待 2MSL:- 确保最后一个 ACK 被对方收到
- 防止旧连接的数据包干扰新连接
- 常见问题:
CLOSE_WAIT过多 = 代码没正常调用 close
四、最简单记忆口诀(顺着推理就能背)
- 建连接:C发同步 → S确认C + S回同步→ C确认S → 通了(3 次)
- 断连接:C关 → S收到 → S也关 → C收到(4 次)
五、快速对比总结
| 行为 | 次数 | 核心目的 | 关键标志 |
|---|---|---|---|
| 三次握手 | 3 | 验证双方收发能力,建立可靠连接 | SYN、ACK |
| 四次挥手 | 4 | 分别关闭两个全双工通道 | FIN、ACK |

2804

被折叠的 条评论
为什么被折叠?



