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 包,导致服务端资源浪费。网络延迟时,服务端可能长期等待无效连接。