知识点深化 · 网络 · TCP
TCP 三次握手四次挥手:序列号/状态机/挥手
TCP 是可靠传输,建立连接要三次握手,断开要四次挥手。为什么是三次不是两次?为什么挥手要四次?TIME_WAIT 又是什么?这一页把序列号、状态机、握手挥手讲透。
① 小白第一课怎么学(4 步走,约 60 分钟)
别急着背代码,先按这四步建立直觉:
1看图建立直觉(10 分钟)
读②③:客户端和服务器怎么建立信任。
2记状态机(15 分钟)
读④:握手挥手每步谁发什么。
3手推过程(20 分钟)
精读⑤。
4刷题纠错(15 分钟)
做⑦⑩,错题回⑥。
本课小目标学完你要能:① 画出三次握手和四次挥手;② 解释为什么三次;③ 说 TIME_WAIT 的作用。
② 一图看懂:TCP 连接全地图
读法:中心是 TCP,左握手右挥手,下是状态与易错。
③ 本质直觉:三次握手像打电话:喂、能听到吗、能听到请讲
三次握手:① 客户端发 SYN(我想连,序号 x);② 服务端回 SYN+ACK(我收到了,我序号 y,确认你 x+1);③ 客户端发 ACK(收到你 y+1)。双方都确认了收发能力正常,连接建立。
为什么三次:要双方都确认"我能发、能收"。两次只能确认客户端的发和服务端的收,服务端的发客户端还没确认。
四次挥手:TCP 全双工,两个方向要分别关。主动方发 FIN(我没数据了),被动方回 ACK;等被动方也发完数据,再发 FIN,主动方回 ACK,等 2MSL 关闭。
SYN 洪水攻击攻击者发大量 SYN 但不回第三次 ACK,服务端半连接队列被占满。Linux 有 syncookies 应对。
④ 完整体系与对比表
握手挥手对照
| 方向 | 报文 | 序号/确认号 |
| C→S | SYN | seq=x |
| S→C | SYN+ACK | seq=y, ack=x+1 |
| C→S | ACK | ack=y+1 |
| 主动→被动 | FIN | seq=u |
| 被动→主动 | ACK | ack=u+1 |
| 被动→主动 | FIN | seq=v |
| 主动→被动 | ACK | ack=v+1 |
为什么三次/四次
核心原因握手要双方都确认收发能力 = 至少 3 次;挥手时 TCP 全双工,被动方可能还有数据要发,ACK 和 FIN 不能合并,所以是 4 次
TIME_WAIT:主动关闭方发完最后 ACK 后等 2MSL(最大报文生存时间×2),确保最后 ACK 到达对方,且让本次连接的旧报文在网络中消失。
⑤ 用法场景与典型例题
例1(为什么三次)两次握手为什么不行?
两次无法确认服务端的发送能力。
若客户端发的 SYN 滞留,客户端误以为超时重发,服务端却为旧 SYN 建了连接白白等待。三次能让客户端否决无效连接。
例2(挥手为什么四次)挥手能不能像握手三次?
全双工,ACK 和 FIN 不能合并。
被动方收到 FIN 时可能还有数据要发,先回 ACK 告诉对方,等数据发完再发 FIN。所以 ACK 和 FIN 分开 = 4 次。
例3(TIME_WAIT)谁进入 TIME_WAIT?
主动关闭方。
主动发起关闭的一方发完最后 ACK 后进入 TIME_WAIT,等 2MSL 后 CLOSED。
做题心法握手记 SYN/SYN+ACK/ACK;挥手记 FIN/ACK/FIN/ACK。问为什么就答全双工和收发确认。
⑥ 高频错误诊断(4 条)
错误1:把挥手记成三次挥手是四次(FIN/ACK/FIN/ACK),因为全双工两个方向分别关。
错误2:以为 TIME_WAIT 在被动方TIME_WAIT 在主动关闭方。
错误3:握手次数记反是客户端先 SYN,不是服务端先发。
错误4:SYN 和 ACK 混淆SYN 是同步序列号(建连),FIN 是结束(关连)。
⑦ 考点真题演练(4 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 握手 | 三次报文 | SYN/SYN+ACK/ACK |
| 挥手 | 四次报文 | FIN/ACK/FIN/ACK |
| 为什么 | 三次/四次原因 | 收发确认/全双工 |
| TIME_WAIT | 谁等多久 | 主动关闭方 2MSL |
真题基础1. TCP 建立连接需要几次握手?
真题中档2. TCP 四次挥手比握手多一次,主要因为?
真题中档3. TIME_WAIT 状态出现在哪一方?
真题拔高4. 建立连接时第二次握手报文是?
⑧ 必背知识点卡
握手:SYN→SYN+ACK→ACK 三次
挥手:FIN→ACK→FIN→ACK 四次
为什么三次双方确认收发能力
为什么四次全双工 ACK/FIN 分开
TIME_WAIT:主动关闭方等 2MSL
SYN 攻击:半连接队列占满 syncookies
可靠:序号+确认+重传
⑨ 应用输出:排查大量 TIME_WAIT
场景:服务器 netstat 发现几十万 TIME_WAIT 连接,端口快耗尽。
① 原因:服务端作为主动关闭方,短连接多导致大量 TIME_WAIT。
② 对策一:用长连接(KeepAlive),减少频繁建连断连。
③ 对策二:开启 tcp_tw_reuse 让 TIME_WAIT 端口可复用出去。
④ 对策三:调大本地端口范围、缩短 tw_timeout。
⑤ 本质:短连接高并发场景 TIME_WAIT 是正常现象,复用即可。
口述思路合上书说:"TIME_WAIT 多说明短连接频繁,用长连接或端口复用解决。"
⑩ 分层练习(基础 + 中档 + 拔高)
▍基础 6 题
▍中档 6 题
中档7为什么是三次不是两次?
要双方确认收发能力,且防旧 SYN 误建连。
中档8为什么挥手四次?
全双工,被动方 ACK 和 FIN 不能合并。
中档11三次握手后双方进入什么状态?
ESTABLISHED。
中档12TCP 和 UDP 哪个面向连接?
TCP 面向连接,UDP 无连接。
▍拔高 6 题
拔高13什么是半连接队列?
收到 SYN 回 SYN+ACK 后等待第三次 ACK 的队列。
拔高14什么是全连接队列?
完成三次握手等待 accept 的队列。
拔高15SYN cookies 解决什么?
防 SYN 洪水攻击,不占半连接队列。
拔高16为什么 TIME_WAIT 是 2MSL?
确保最后 ACK 到达 + 旧报文消失。
拔高17tcp_tw_reuse 原理?
允许 TIME_WAIT 端口用于新的出站连接。
拔高182MSL 过长会怎样?
端口占用久,高并发短连接下端口耗尽。
⑪ 记忆口诀 + 7 天复习计划
三句口诀① 握手三次 SYN/SYN+ACK/ACK,挥手四次 FIN/ACK/FIN/ACK。② 三次为收发确认,四次因全双工。③ TIME_WAIT 主动方等 2MSL。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③④,画握手挥手 | 报文顺序对 |
| 第 2 天 | 背状态 + 基础 1-6 | 谁发什么对 |
| 第 3 天 | 做中档 7-12,讲为什么三次 | 能说清 |
| 第 4 天 | 做拔高 13-18,讲半连接队列 | 能讲清 |
| 第 5 天 | 做⑦真题 4 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合上书默画握手挥手 | 不看资料全默对 |
← 返回软件技术总览