课程名称:计算机网络应用 核心摘要:本节课讲解 TCP 连接释放的四次挥手全过程,包括 FIN 报文的作用、四次挥手各步骤的报文字段与状态变迁、半关闭状态的概念,以及 TIME_WAIT 状态下等待 2×MSL 的机制。
- 四次挥手(Four-Way Handshake):TCP 释放连接的过程,通过四次报文交互完成
- FIN 报文:释放连接报文,
FIN=1 表示请求关闭连接(与 SYN 的"建立连接"相反) - 半关闭状态(Half-Close):客户端已无数据发送,但服务端仍可继续发送数据,客户端仍可接收
- MSL(Maximum Segment Lifetime,最大报文段寿命):一个 TCP 报文在网络中的最大存活时间
- TIME_WAIT 状态:客户端第四次挥手后进入的等待状态,需经过 2×MSL 才进入 CLOSED
| 角色 | 状态 | 说明 |
|---|
| 客户端 | ESTABLISHED | 连接已建立,可主动释放 |
| 服务端 | ESTABLISHED | 连接已建立,可主动释放 |
| 步骤 | 方向 | 报文内容 | 发送方状态变化 | 接收方状态变化 | 说明 |
|---|
| 第一次挥手 | Client → Server | FIN=1, SEQ=u | ESTABLISHED → FIN_WAIT_1 | — | 客户端请求关闭连接 |
| 第二次挥手 | Server → Client | ACK=1, ack=u+1, SEQ=v | — | — | 服务端确认收到关闭请求 → 进入 CLOSE_WAIT |
| 第三次挥手 | Server → Client | FIN=1, ACK=1, SEQ=w, ack=u+1 | — | CLOSE_WAIT → LAST_ACK | 服务端请求关闭连接 |
| 第四次挥手 | Client → Server | ACK=1, ack=w+1, SEQ=u+1 | → TIME_WAIT | LAST_ACK → CLOSED | 客户端确认收到服务端关闭请求 |
客户端在 TIME_WAIT 状态等待 2×MSL 后,撤销 TCB,进入 CLOSED 状态。 服务端收到最终 ACK 后立即进入 CLOSED 状态。
| 状态 | 所属方 | 含义 |
|---|
| FIN_WAIT_1 | 客户端 | 第一次挥手后,等待服务端确认 |
| FIN_WAIT_2 | 客户端 | 第二次挥手后(收到服务端 ACK),等待服务端发送 FIN |
| CLOSE_WAIT | 服务端 | 第二次挥手后,等待关闭(通知应用进程,可能仍有数据要发送) |
| LAST_ACK | 服务端 | 第三次挥手后,等待客户端最终确认 |
| TIME_WAIT | 客户端 | 第四次挥手后,等待 2×MSL 确保报文消亡 |
| CLOSED | 双方 | 连接完全释放 |
| 规则 | 说明 |
|---|
| 不能携带数据 | 与 SYN 报文类似 |
| 必须消耗一个序列号 | FIN=1 的报文段必须带序列号 |
第一次挥手 + 第二次挥手后:
客户端 → 服务端方向:已释放(客户端无数据发送)
服务端 → 客户端方向:仍可传输(服务端可继续发送数据,客户端可接收)
此时服务端处于 CLOSE_WAIT 状态,通知高层应用进程
Client Server
|--- FIN ---> | ① 客户端请求关闭
|<-- ACK ----- | ② 服务端确认
|<-- FIN ----- | ③ 服务端请求关闭
|--- ACK ---> | ④ 客户端确认
本节为纯理论讲解,无配置命令操作。
- FIN 与 SYN 的对称性:SYN 建立连接,FIN 释放连接,二者均不能携带数据但必须消耗序列号
- 半关闭状态:四次挥手中间存在半关闭阶段,服务端仍可向客户端发送数据——重要概念
- TIME_WAIT 等待 2×MSL:第四次挥手后连接未立即释放,必须等待 2×MSL——高频面试题
- 服务端 vs 客户端关闭速度:服务端收到最终 ACK 立即 CLOSED,客户端需等待 2×MSL
- CLOSE_WAIT 状态:服务端在此状态通知应用进程,等待应用层决定是否还有数据要发送
- 为什么客户端要等待 2×MSL 才关闭?(下一讲详细解答)
- 为什么建立连接是三次而释放连接是四次?(下一讲详细解答)