← 返回软件技术总览 软件技术 · 知识点深化 · TCP 三次握手四次挥手:序列号/状态机/挥手
知识点深化 · 网络 · TCP

TCP 三次握手四次挥手:序列号/状态机/挥手

TCP 是可靠传输,建立连接要三次握手,断开要四次挥手。为什么是三次不是两次?为什么挥手要四次?TIME_WAIT 又是什么?这一页把序列号、状态机、握手挥手讲透。

① 小白第一课怎么学(4 步走,约 60 分钟)

别急着背代码,先按这四步建立直觉:

1看图建立直觉(10 分钟)
读②③:客户端和服务器怎么建立信任。
2记状态机(15 分钟)
读④:握手挥手每步谁发什么。
3手推过程(20 分钟)
精读⑤。
4刷题纠错(15 分钟)
做⑦⑩,错题回⑥。
本课小目标学完你要能:① 画出三次握手和四次挥手;② 解释为什么三次;③ 说 TIME_WAIT 的作用。

② 一图看懂:TCP 连接全地图

TCP 连接 三次握手 SYN→SYN+ACK→ACK 四次挥手 FIN→ACK→FIN→ACK 序列号/确认号 可靠传输基础 TIME_WAIT 等 2MSL 可靠:序号+确认+重传 全双工 易错:SYN 攻击/2MSL 握手为什么三次
读法:中心是 TCP,左握手右挥手,下是状态与易错。

③ 本质直觉:三次握手像打电话:喂、能听到吗、能听到请讲

三次握手:① 客户端发 SYN(我想连,序号 x);② 服务端回 SYN+ACK(我收到了,我序号 y,确认你 x+1);③ 客户端发 ACK(收到你 y+1)。双方都确认了收发能力正常,连接建立。

为什么三次:要双方都确认"我能发、能收"。两次只能确认客户端的发和服务端的收,服务端的发客户端还没确认。

四次挥手:TCP 全双工,两个方向要分别关。主动方发 FIN(我没数据了),被动方回 ACK;等被动方也发完数据,再发 FIN,主动方回 ACK,等 2MSL 关闭。

三次握手 客户端 服务端 1.SYN, seq=x 2.SYN+ACK, seq=y,ack=x+1 3.ACK, ack=y+1 四次挥手同理 FIN/ACK 分开发 TIME_WAIT 等 2MSL 确保最后 ACK 到达
SYN 洪水攻击攻击者发大量 SYN 但不回第三次 ACK,服务端半连接队列被占满。Linux 有 syncookies 应对。

④ 完整体系与对比表

握手挥手对照

方向报文序号/确认号
C→SSYNseq=x
S→CSYN+ACKseq=y, ack=x+1
C→SACKack=y+1
主动→被动FINseq=u
被动→主动ACKack=u+1
被动→主动FINseq=v
主动→被动ACKack=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 题

基础1TCP 建立连接几次握手?
三次。
基础2断开连接几次挥手?
四次。
基础3第一次握手发什么?
SYN。
基础4第二次握手发什么?
SYN+ACK。
基础5TIME_WAIT 等多久?
2MSL。
基础6谁进 TIME_WAIT?
主动关闭方。

▍中档 6 题

中档7为什么是三次不是两次?
要双方确认收发能力,且防旧 SYN 误建连。
中档8为什么挥手四次?
全双工,被动方 ACK 和 FIN 不能合并。
中档9MSL 是什么?
报文最大生存时间。
中档10SYN 标志位作用?
同步序列号建连。
中档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 天合上书默画握手挥手不看资料全默对

← 返回软件技术总览