3.tcp 四次挥手
tcp 四次挥手
题目描述:四次挥手流程
参考答案
DETAILS
假设 客户端(Client)主动关闭连接,服务端(Server)被动关闭:
步骤 | 报文类型 | 标志位 | 序列号(Seq) | 确认号(Ack) |
---|---|---|---|---|
第一次 | FIN | FIN=1 | Client_Last_Seq + 1 | 无 |
第二次 | ACK | ACK=1 | Server_Last_Seq | Client_Last_Seq + 2 |
第三次 | FIN | FIN=1 | Server_Last_Seq + 1 | Client_Last_Seq + 2 |
第四次 | ACK | ACK=1 | Client_Last_Seq + 2 | Server_Last_Seq + 2 |
第一次挥手:FIN(客户端 → 服务端)
- 客户端行为:
发送 FIN 包(FIN=1),序列号 Seq=Client_Last_Seq + 1(基于最后发送的数据包序列号)。
进入 FIN_WAIT_1 状态,等待服务端确认。
- 服务端状态:收到 FIN 后进入 CLOSE_WAIT 状态。
第二次挥手:ACK(服务端 → 客户端)
- 服务端行为:
发送 ACK 包(ACK=1),确认号 Ack=Client_Last_Seq + 2(FIN 占 1 个序列号)。
服务端仍可向客户端发送未完成的数据(半关闭状态)。
- 客户端状态:收到 ACK 后进入 FIN_WAIT_2 状态,等待服务端的 FIN 包。
第三次挥手:FIN(服务端 → 客户端)
- 服务端行为:
完成数据发送后,发送 FIN 包(FIN=1),序列号 Seq=Server_Last_Seq + 1。
进入 LAST_ACK 状态,等待客户端最后的 ACK。
- 客户端状态:收到 FIN 后进入 TIME_WAIT 状态。
第四次挥手:ACK(客户端 → 服务端)
- 客户端行为:
发送 ACK 包(ACK=1),确认号 Ack=Server_Last_Seq + 2。
客户端在 TIME_WAIT 状态等待 2MSL(Maximum Segment Lifetime,报文最大生存时间,通常 1-2 分钟)后关闭连接。
- 服务端状态:收到 ACK 后立即关闭连接。
题目描述:为什么需要四次挥手?
参考答案
DETAILS
- 全双工特性:TCP 连接是全双工的,双方需独立关闭各自的发送通道。
客户端发送 FIN → 关闭客户端 → 服务端的数据流。
服务端发送 FIN → 关闭服务端 → 客户端的数据流。
- 确保数据完整性:服务端可能仍有数据待发送,需在第二次挥手后继续传输。