当前位置: 首页 > news >正文

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 状态机变迁

发送SYN
收到SYN+ACK并发送ACK
收到ACK
CLOSED
SYN_SENT
ESTABLISHED
SYN_RCVD

3.3 内核实现要点

  1. 半连接队列(SYN Queue)

    • 存储未完成握手的连接
    • tcp_max_syn_backlog参数控制
  2. 全连接队列(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抓包分析

典型握手报文特征:

  1. 第一次握手:Flags [S]
  2. 第二次握手:Flags [S.]
  3. 第三次握手:Flags [.]

关键结论:通过Sequence/Ack Number的递增关系可以验证握手过程的正确性。


这份文档涵盖了从基础概念到内核实现的完整知识体系,建议面试者结合具体网络环境理解握手过程的动态特性。实际面试中可配合画图说明各阶段状态变化。

http://www.xdnf.cn/news/661411.html

相关文章:

  • 【Java学习笔记】抽象类
  • 时间的基本概念及相关技术
  • 通用寄存器 专用寄存器
  • 大模型训练中的GPU作用解析
  • 项目三 - 任务8:实现词频统计功能
  • 基于Geotools的Worldpop世界人口tif解析-以中国2020年数据为例
  • 北京大学肖臻老师《区块链技术与应用》公开课:02-BTC-密码学原理
  • Excel快捷键大全
  • 深入理解Java装饰器模式:动态扩展对象功能的优雅之道
  • USB设备状态
  • pyhton基础【5】循环
  • uniapp 小说成品源码
  • Python爬虫实战:研究Selenium框架相关技术
  • NAT、代理服务、内网穿透
  • Python训练营打卡Day37
  • 经典文献阅读之--RT-Grasp(通过MLLM进行推理调优的机器人抓取)
  • 如何设计ES的冷热数据分离架构?Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?
  • 6.1 Q1|广州医科大学GBD发文 | 良性前列腺增生与合并症之间的相关性
  • mysql ACID 原理
  • OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()
  • 高并发下使用防重表做防重案例
  • Linux 常用操作步骤
  • ubantu给github配置ssh
  • Unity—lua基础语法
  • MyBatis-Plus 中 的动态SQL 片段(sqlSegment)讲解
  • 速卖通,国际站测评补单,如何平衡效率和安全
  • C++ ——new和malloc的区别(详细)
  • GROMACS 本地部署教程:模拟生命密码,解码科学未来!
  • 力扣面试150题--二叉搜索树迭代器
  • Spring参数解析异常:Name for argument of type [java.lang.String] not specified 深度解析