TCP 连接管理:深入分析四次握手与三次挥手
TCP 连接管理:深入分析四次握手与三次挥手
一、TCP 连接建立:四次握手(Four-Way Handshake)
核心目标:可靠地协商初始序列号(ISN),确保双方具备双向通信能力,防止历史连接混淆。
工作流程与报文详解:
-
SYN(Client → Server)
- 标志位:
SYN=1
,ACK=0
- 序列号(Seq):随机值
X
(Client ISN) - 作用:请求建立连接,声明初始序列号。
- 标志位:
-
SYN-ACK(Server → Client)
- 标志位:
SYN=1
,ACK=1
- 序列号(Seq):随机值
Y
(Server ISN) - 确认号(Ack):
X+1
(确认收到Client的SYN) - 作用:同意建立连接,提供自身ISN,确认客户端SYN。
- 标志位:
-
ACK(Client → Server)
- 标志位:
ACK=1
- 序列号(Seq):
X+1
(延续Client序列号) - 确认号(Ack):
Y+1
(确认收到Server的SYN) - 作用:确认服务端的SYN,连接正式建立。
- 标志位:
-
(可选)ACK + Data
- 实际中,此报文常携带应用层数据(如HTTP请求)。
为什么需要四次握手?
- 两次握手缺陷:若失效的SYN(因延迟超时)到达服务端,服务端会错误建立连接。
- 三次握手解决:Client通过第三次ACK拒绝历史连接(若收到旧SYN的ACK,则发送RST重置)。
内核实现关键点:
- 半连接队列(SYN Queue):存储收到SYN但未完成握手的连接。
- 全连接队列(Accept Queue):存储完成握手等待
accept()
的连接。 - SYN Flood防御:使用
SYN Cookies
(如Linux)避免资源耗尽。
二、TCP 连接终止:三次挥手(Three-Way Handshake)
核心目标:双方独立关闭双向数据流,确保数据完整传输。
工作流程与报文详解:
-
FIN(主动关闭方 → 被动方)
- 标志位:
FIN=1
,ACK=1
- 序列号(Seq):当前已发送数据的下一序号
M
- 作用:声明发送通道关闭(仍可接收数据)。
- 标志位:
-
ACK(被动方 → 主动方)
- 标志位:
ACK=1
- 确认号(Ack):
M+1
- 作用:确认收到FIN,通知应用层关闭。
- 标志位:
-
FIN(被动方 → 主动方)
- 标志位:
FIN=1
,ACK=1
- 序列号(Seq):
N
(可能携带最后数据) - 确认号(Ack):
M+1
(保持对FIN的确认) - 作用:通知主动方自身发送通道关闭。
- 标志位:
-
ACK(主动方 → 被动方)
- 标志位:
ACK=1
- 确认号(Ack):
N+1
- 作用:确认被动方的FIN,连接完全关闭。
- 标志位:
为什么是三次挥手?
- 被动方的
ACK
和FIN
不能合并发送:因应用层可能需要时间处理剩余数据(CLOSE_WAIT
状态)。
三、关键状态与异常处理
状态 | 触发条件 | 意义 |
---|---|---|
SYN_SENT | 发送SYN后 | 等待SYN-ACK |
SYN_RECEIVED | 收到SYN并回复SYN-ACK | 等待最终ACK |
ESTABLISHED | 完成握手 | 数据可双向传输 |
FIN_WAIT_1 | 主动方发送FIN | 等待ACK或FIN |
CLOSE_WAIT | 被动方收到FIN | 等待应用层关闭 |
LAST_ACK | 被动方发送FIN | 等待最终ACK |
TIME_WAIT | 主动方收到FIN并发送ACK | 确保被动方收到ACK(2MSL) |
TIME_WAIT 的重要性:
- 持续时间:
2 * MSL
(MSL通常为30s/60s)。 - 作用:
- 确保被动方重传的FIN能被响应(若ACK丢失)。
- 防止相同四元组(源IP/端口 + 目标IP/端口)的新连接收到旧连接的延迟报文。
四、流程图解
连接建立(四次握手)
Client Server| ||-------- SYN (Seq=X) -------->| → Server: SYN_RCVD| ||<----- SYN-ACK (Seq=Y, Ack=X+1) --| → Client: ESTABLISHED| ||------ ACK (Ack=Y+1) -------->| → Server: ESTABLISHED| |
连接终止(三次挥手)
Client (主动关闭) Server| ||---------- FIN (Seq=M) ------>| → Server: CLOSE_WAIT| ||<------- ACK (Ack=M+1) -------| | ||<------- FIN (Seq=N) ---------| → Server: LAST_ACK| ||------ ACK (Ack=N+1) -------->| → Client: TIME_WAIT (2MSL)| | Server: CLOSED
五、总结
特性 | 四次握手 | 三次挥手 |
---|---|---|
核心目的 | 协商初始序列号,防止历史连接 | 独立关闭双向数据流 |
关键状态 | SYN_SENT, SYN_RCVD | FIN_WAIT, CLOSE_WAIT, TIME_WAIT |
设计难点 | SYN Flood攻击防御 | TIME_WAIT优化与端口复用 |
合并报文 | ACK与数据合并常见 | ACK与FIN不可合并(需等待应用层) |
实际意义:
- 握手:确保通信双方具备可靠传输的基础能力。
- 挥手:优雅终止连接,避免数据丢失与资源泄漏。
- TIME_WAIT:TCP可靠性设计的最后防线,牺牲短期资源换取协议健壮性。
补充:在极端优化场景(如HTTP/1.1 Keep-Alive)中,一个连接可处理多次请求,减少握手/挥手开销。但底层机制仍是TCP可靠性的基石。