3.tcp 四次挥手

书诚小驿2024/10/01前端面经Http

tcp 四次挥手

题目描述:四次挥手流程

参考答案

DETAILS

假设 客户端(Client)主动关闭连接,服务端(Server)被动关闭:

步骤报文类型标志位序列号(Seq)确认号(Ack)
第一次FINFIN=1Client_Last_Seq + 1
第二次ACKACK=1Server_Last_SeqClient_Last_Seq + 2
第三次FINFIN=1Server_Last_Seq + 1Client_Last_Seq + 2
第四次ACKACK=1Client_Last_Seq + 2Server_Last_Seq + 2

第一次挥手:FIN(客户端 → 服务端)

  1. 客户端行为:
  • 发送 FIN 包(FIN=1),序列号 Seq=Client_Last_Seq + 1(基于最后发送的数据包序列号)。

  • 进入 FIN_WAIT_1 状态,等待服务端确认。

  1. 服务端状态:收到 FIN 后进入 CLOSE_WAIT 状态。

第二次挥手:ACK(服务端 → 客户端)

  1. 服务端行为:
  • 发送 ACK 包(ACK=1),确认号 Ack=Client_Last_Seq + 2(FIN 占 1 个序列号)。

  • 服务端仍可向客户端发送未完成的数据(半关闭状态)。

  1. 客户端状态:收到 ACK 后进入 FIN_WAIT_2 状态,等待服务端的 FIN 包。

第三次挥手:FIN(服务端 → 客户端)

  1. 服务端行为:
  • 完成数据发送后,发送 FIN 包(FIN=1),序列号 Seq=Server_Last_Seq + 1。

  • 进入 LAST_ACK 状态,等待客户端最后的 ACK。

  1. 客户端状态:收到 FIN 后进入 TIME_WAIT 状态。

第四次挥手:ACK(客户端 → 服务端)

  1. 客户端行为:
  • 发送 ACK 包(ACK=1),确认号 Ack=Server_Last_Seq + 2。

  • 客户端在 TIME_WAIT 状态等待 2MSL(Maximum Segment Lifetime,报文最大生存时间,通常 1-2 分钟)后关闭连接。

  1. 服务端状态:收到 ACK 后立即关闭连接。

题目描述:为什么需要四次挥手?

参考答案

DETAILS
  1. 全双工特性:TCP 连接是全双工的,双方需独立关闭各自的发送通道。
  • 客户端发送 FIN → 关闭客户端 → 服务端的数据流。

  • 服务端发送 FIN → 关闭服务端 → 客户端的数据流。

  1. 确保数据完整性:服务端可能仍有数据待发送,需在第二次挥手后继续传输。
最后更新时间' 2025/3/5 20:36:04