2.tcp 为什么三次握手,两次有什么问题,怎么防止
tcp 为什么三次握手,两次有什么问题,怎么防止
题目描述:三次握手流程
参考答案
DETAILS
假设 客户端(Client)尝试连接 服务端(Server)
| 步骤 | 报文类型 | 标志位 | 序列号(Seq) | 确认号(Ack) | 
|---|---|---|---|---|
| 第一次 | SYN | SYN=1 | Client_ISN | 无(未初始化) | 
| 第二次 | SYN-ACK | SYN=1, ACK=1 | Server_ISN | Client_ISN + 1 | 
| 第三次 | ACK | ACK=1 | Client_ISN + 1 | Server_ISN + 1 | 
1、第一次握手:SYN(Synchronize)
- 客户端行为:
- 发送一个 - SYN包(- TCP报文),设置标志位- SYN=1,随机生成初始序列号- Seq=Client_ISN。
- 进入 - SYN_SENT状态,等待服务端确认。
2、第二次握手:SYN-ACK
- 服务端行为:
- 收到 - SYN包后,若同意连接,发送- SYN-ACK包:
- 设置 - SYN=1和- ACK=1,确认号- Ack=Client_ISN + 1,并生成自己的初始序列号- Seq=Server_ISN。
- 进入 - SYN_RECEIVED状态,等待客户端确认。
3、第三次握手:ACK(Acknowledgment)
- 客户端行为:
- 收到 - SYN-ACK包后,发送- ACK包:
- 设置 - ACK=1,确认号- Ack=Server_ISN + 1,序列号- Seq=Client_ISN + 1。
- 进入 - ESTABLISHED状态,连接建立完成。
- 服务端行为:
- 收到 ACK包后,检查Ack是否为Server_ISN + 1,若正确则进入ESTABLISHED状态。
题目描述:为什么需要三次握手?
参考答案
DETAILS
- 防止历史连接干扰:若旧的重复 SYN 包到达服务端,客户端可通过第三次握手拒绝。 
- 双向能力验证: 
- 第一次握手 → 验证客户端发送能力。 
- 第二次握手 → 验证服务端收发能力。 
- 第三次握手 → 验证客户端接收能力。 
- 资源浪费规避:两次握手可能导致服务端长期等待无效连接。
题目描述:两次握手行不行?
参考答案
DETAILS
- 若服务端直接进入 ESTABLISHED 状态,客户端可能未收到 SYN-ACK 包,导致服务端资源浪费。网络延迟时,服务端可能长期等待无效连接。
