TCP 三次握手过程详解
TCP 三次握手过程详解
一、TCP握手基础概念
1.1 什么是TCP握手
TCP三次握手是传输控制协议(Transmission Control Protocol)在建立连接时的标准过程,目的是确保通信双方具备可靠的双向通信能力。
关键结论:三次握手的本质是通过序列号同步和能力协商建立可靠的逻辑连接。
1.2 握手必要性
- 解决网络延迟导致的重复分组问题
- 确认双方的发送/接收能力正常
- 协商初始序列号(Sequence Number)
- 避免历史连接造成的资源浪费
二、三次握手详细过程
2.1 第一次握手(SYN)
客户端发送:
- SYN=1(同步标志位)
- 随机生成初始序列号(seq=x)
- 不携带应用层数据
Client -> Server: [SYN] Seq=x
2.2 第二次握手(SYN-ACK)
服务器响应:
- SYN=1 + ACK=1
- 确认号ack=x+1
- 随机生成服务端序列号seq=y
Server -> Client: [SYN, ACK] Seq=y, Ack=x+1
2.3 第三次握手(ACK)
客户端确认:
- ACK=1
- seq=x+1
- ack=y+1
- 可开始携带应用层数据
Client -> Server: [ACK] Seq=x+1, Ack=y+1
关键结论:第三次握手解决了"延迟的SYN包"可能导致的连接冲突问题。
三、技术深度解析
3.1 序列号机制
- 初始序列号(ISN)采用基于时钟的随机算法
- 32位循环序列号空间处理序列号回绕
- 严格递增机制防止报文重放攻击
3.2 状态机变迁
3.3 内核实现要点
-
半连接队列(SYN Queue)
- 存储未完成握手的连接
- 受
tcp_max_syn_backlog
参数控制
-
全连接队列(Accept Queue)
- 存储已完成握手的连接
- 受
somaxconn
参数限制
四、常见面试问题
4.1 为什么不是两次握手?
关键结论:两次握手无法防止失效的连接请求突然到达服务端,可能导致资源浪费和错误连接建立。
4.2 SYN Flood攻击原理
- 攻击者发送大量SYN包但不完成握手
- 耗尽服务端的半连接队列资源
- 防御方案:
- SYN Cookie机制
- 增加队列容量
- 启用
tcp_syncookies
4.3 握手阶段的超时控制
- 首次SYN超时:
tcp_syn_retries
(默认6次) - SYN-ACK重传:
tcp_synack_retries
(默认5次) - 半连接存活时间:
tcp_synack_retries * 3s
五、性能优化实践
5.1 减少握手延迟
- TCP Fast Open(TFO)
- TCP_DEFER_ACCEPT选项
- 调整
tcp_syn_retries
值
5.2 内核参数调优
# 查看当前配置
sysctl -a | grep tcp
# 修改半连接队列大小
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
六、WireShark抓包分析
典型握手报文特征:
- 第一次握手:Flags [S]
- 第二次握手:Flags [S.]
- 第三次握手:Flags [.]
关键结论:通过Sequence/Ack Number的递增关系可以验证握手过程的正确性。
这份文档涵盖了从基础概念到内核实现的完整知识体系,建议面试者结合具体网络环境理解握手过程的动态特性。实际面试中可配合画图说明各阶段状态变化。