题目
简述TCP三次握手的过程及目的
信息
- 类型:问答
- 难度:⭐
考点
TCP连接建立,三次握手原理,网络基础协议
快速回答
TCP三次握手是建立可靠网络连接的过程:
- SYN:客户端发送SYN包(序列号=x)到服务器
- SYN-ACK:服务器回复SYN-ACK包(序列号=y,确认号=x+1)
- ACK:客户端发送ACK包(确认号=y+1)完成连接
核心目的:确保双方收发能力正常,同步初始序列号,防止历史连接错误。
解析
原理说明
TCP三次握手是面向连接的协议建立可靠通信的基础:
- 第一次握手 (SYN):客户端随机生成初始序列号(seq=x),发送SYN=1标志的数据包,进入SYN_SENT状态
- 第二次握手 (SYN+ACK):服务器收到SYN后,随机生成自己的序列号(seq=y),设置ACK=x+1(确认客户端序列号),SYN=1,进入SYN_RECEIVED状态
- 第三次握手 (ACK):客户端验证ACK值(x+1)正确后,发送ACK=y+1,服务器验证后双方进入ESTABLISHED状态
关键作用
- 可靠性验证:双向确认双方的发送和接收能力
- 序列号同步:交换初始序列号(ISN)保证数据有序传输
- 防历史连接干扰:通过序列号验证避免旧连接报文干扰新连接
报文结构示例
# 第一次握手 (客户端 → 服务器)
[SYN] Seq=0 (实际为随机值)
# 第二次握手 (服务器 → 客户端)
[SYN, ACK] Seq=0, Ack=1 (实际为随机值)
# 第三次握手 (客户端 → 服务器)
[ACK] Seq=1, Ack=1常见错误
- SYN Flood攻击:恶意客户端发送大量SYN不回复ACK,耗尽服务器资源
- 序列号预测风险:简单递增的序列号可能被劫持会话
- 连接超时:未收到SYN-ACK时客户端会重试(默认5-6次)
最佳实践
- 使用随机化初始序列号增强安全性
- 服务器配置SYN Cookie机制防御洪水攻击
- 合理设置TCP连接超时参数(Linux默认60秒)
扩展知识
- 四次挥手:连接终止需要FIN+ACK四次交互
- UDP对比:无连接协议无需握手,但不可靠
- TCP状态机:包含LISTEN、SYN_SENT、ESTABLISHED等11种状态
- Wireshark抓包:可通过过滤器
tcp.flags.syn==1 and tcp.flags.ack==0观察握手过程