2.tcp 为什么三次握手,两次有什么问题,怎么防止

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

tcp 为什么三次握手,两次有什么问题,怎么防止

题目描述:三次握手流程

参考答案

DETAILS

假设 客户端(Client)尝试连接 服务端(Server

步骤报文类型标志位序列号(Seq)确认号(Ack)
第一次SYNSYN=1Client_ISN无(未初始化)
第二次SYN-ACKSYN=1, ACK=1Server_ISNClient_ISN + 1
第三次ACKACK=1Client_ISN + 1Server_ISN + 1

1、第一次握手:SYN(Synchronize)

  1. 客户端行为:
  • 发送一个 SYN 包(TCP 报文),设置标志位 SYN=1,随机生成初始序列号 Seq=Client_ISN

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

2、第二次握手:SYN-ACK

  1. 服务端行为:
  • 收到 SYN 包后,若同意连接,发送 SYN-ACK 包:

  • 设置 SYN=1ACK=1,确认号 Ack=Client_ISN + 1,并生成自己的初始序列号 Seq=Server_ISN

  • 进入 SYN_RECEIVED 状态,等待客户端确认。

3、第三次握手:ACK(Acknowledgment)

  1. 客户端行为:
  • 收到 SYN-ACK 包后,发送 ACK 包:

  • 设置 ACK=1,确认号 Ack=Server_ISN + 1,序列号 Seq=Client_ISN + 1

  • 进入 ESTABLISHED 状态,连接建立完成。

  1. 服务端行为:
  • 收到 ACK 包后,检查 Ack 是否为 Server_ISN + 1,若正确则进入 ESTABLISHED 状态。

题目描述:为什么需要三次握手?

参考答案

DETAILS
  1. 防止历史连接干扰:若旧的重复 SYN 包到达服务端,客户端可通过第三次握手拒绝。

  2. 双向能力验证:

  • 第一次握手 → 验证客户端发送能力。

  • 第二次握手 → 验证服务端收发能力。

  • 第三次握手 → 验证客户端接收能力。

  1. 资源浪费规避:两次握手可能导致服务端长期等待无效连接。

题目描述:两次握手行不行?

参考答案

DETAILS
  • 若服务端直接进入 ESTABLISHED 状态,客户端可能未收到 SYN-ACK 包,导致服务端资源浪费。网络延迟时,服务端可能长期等待无效连接。
最后更新时间' 2025/3/5 20:36:04