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

说说 TCP 的三次握手:为什么是三次而不是两次或四次?

说说 TCP 的三次握手为什么是三次而不是两次或四次01. 前言TCP 连接的“破冰仪式”02. 三次握手的完整流程2.1 流程图2.2 三个报文详解2.3 状态变化追踪03. 为什么需要三次握手核心问题3.1 问题一确认双方的收发能力正常3.2 问题二同步初始序列号ISN3.3 问题三防止历史连接的延迟包干扰04. 为什么不是四次握手05. 序列号的秘密为什么不是从 0 开始5.1 初始序列号ISN的选择5.2 防止历史包干扰06. 三次握手的细节深入6.1 SYN 洪水攻击SYN Flood6.2 同时打开Simultaneous Open6.3 第三次握手丢失怎么办07. 三次握手的抓包分析7.1 使用 tcpdump 抓包7.2 抓包输出示例7.3 序列号变化08. 三次握手的性能影响8.1 一个完整的 TCP 连接建立需要多少 RTT8.2 TLS 叠加HTTPS8.3 优化手段09. 常见面试追问Q1第三次握手可以携带数据吗Q2如果客户端发完 SYN 就挂了服务器怎么办Q3什么是半连接队列和全连接队列Q4为什么 TIME_WAIT 出现在四次挥手而不是三次握手10. 完整状态机中的三次握手11. 总结The Begin点点关注收藏不迷路01. 前言TCP 连接的“破冰仪式”TCP 是面向连接的协议通信双方在传输数据之前必须先建立一个连接。这个建立过程就是著名的三次握手Three-Way Handshake。三次握手是 TCP 协议中最经典、也最容易在面试中被问倒的知识点。很多人能背出 SYN、SYNACK、ACK 的顺序但说不清为什么是三次——这个问题才是真正的考点。本文从握手流程、状态变化、序列号同步、历史包防重等角度彻底讲透三次握手。02. 三次握手的完整流程2.1 流程图客户端主动打开 服务器被动打开 状态CLOSED 状态LISTEN │ │ │ 1. SYN (seqx) │ │─────────────────────────────────────→│ │ │ 状态SYN_RCVD │ 2. SYNACK (seqy, ackx1) │ │←─────────────────────────────────────│ 状态ESTABLISHED │ │ │ │ 3. ACK (acky1) │ │─────────────────────────────────────→│ │ │ 状态ESTABLISHED │ │ │◄ 数据传输开始 ►│2.2 三个报文详解步骤方向报文类型关键字段作用1客户端→服务器SYNSYN1, seqx客户端请求建立连接告知初始序列号2服务器→客户端SYNACKSYN1, ACK1, seqy, ackx1服务器确认收到并告知自己的初始序列号3客户端→服务器ACKACK1, seqx1, acky1客户端确认收到服务器的序列号2.3 状态变化追踪客户端状态流转 CLOSED → SYN_SENT → ESTABLISHED 服务器状态流转 CLOSED → LISTEN → SYN_RCVD → ESTABLISHED03. 为什么需要三次握手核心问题这是面试中最常追问的问题。三次握手要解决三个核心问题3.1 问题一确认双方的收发能力正常┌─────────────────────────────────────────────────────────────────┐ │ 三次握手验证的能力 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 第1次握手SYN客户端证明自己能发服务器证明自己能收 │ │ 第2次握手SYNACK服务器证明自己能发客户端证明自己能收 │ │ 第3次握手ACK客户端确认服务器的发送能力并告知服务器自己收到了│ │ │ │ 结果双方都确认了对方的收发能力正常 │ │ │ └─────────────────────────────────────────────────────────────────┘如果只有两次握手客户端发 SYN服务器回 SYNACK → 服务器认为连接已建立但客户端可能根本没收到 SYNACK丢包客户端不认为连接建立服务器白白浪费资源3.2 问题二同步初始序列号ISNTCP 的可靠传输依赖序列号每个字节都有编号。通信前需要同步双方的初始序列号。为什么需要同步序列号 • 数据按序号排序解决乱序 • 重复包去重根据序号判断 • 确认机制ACK 下一个期望的序号 三次握手完成的序列号同步 客户端告诉服务器我的初始序列号是 x 服务器告诉客户端我的初始序列号是 y并且确认收到 x 客户端确认收到 y如果只有两次握手服务器无法确认客户端是否收到了自己的 SYNACK如果服务器发的 SYNACK 丢了客户端不知道服务器的序列号后续无法通信3.3 问题三防止历史连接的延迟包干扰这是为什么不是两次握手的最根本原因。场景客户端曾经发送过一个 SYNseq100但由于网络延迟这个包很久才到达 情况1三次握手 客户端收到服务器的 SYNACK 后检查 ack 值 如果 ack 与当前期望的不匹配 → 发送 RST 拒绝连接 情况2两次握手 服务器收到延迟的 SYN直接回复 SYNACK 并进入 ESTABLISHED 服务器认为连接已建立等待数据 但客户端根本没有要发数据 → 服务器资源浪费04. 为什么不是四次握手理论上三次已经能解决所有问题四次是多余的三次握手 SYN SYNACK 合并了 SYN 和 ACK ACK 如果拆成四次 SYN ACK单独确认 SYN SYN服务器单独发自己的 SYN ACK客户端确认 多了一次往返效率更低没有任何好处。TCP 的设计原则能合并的报文尽量合并SYN 和 ACK 在同一报文。05. 序列号的秘密为什么不是从 0 开始5.1 初始序列号ISN的选择ISN 不是固定值比如 0而是 • 基于时钟的随机值 • 每 4 微秒左右加 1 • 防止历史连接的包干扰新连接 示例 客户端 ISN 12345678 服务器 ISN 876543215.2 防止历史包干扰假设连接 A 使用 seq100-200关闭后 新连接 B 如果也从 seq100 开始 网络中残留的连接 A 的包可能被连接 B 误认为是有效数据 如果 ISN 是随机大数历史包序列号落在这个范围内的概率极低06. 三次握手的细节深入6.1 SYN 洪水攻击SYN Flood攻击者发送大量 SYN 包但不完成第三次握手导致服务器维护大量半连接SYN_RCVD 状态耗尽资源。正常连接 SYN → SYNACK → ACK SYN 洪水 SYN → SYNACK 服务器等待 ACK SYN → SYNACK SYN → SYNACK ... 服务器一直等资源被占满 防御措施 • SYN Cookie不分配资源用 cookie 验证 • 缩短 SYN_RCVD 超时时间 • 增大半连接队列6.2 同时打开Simultaneous Open两台主机同时向对方发起连接请求会形成四次握手客户端A 客户端B │ │ │────── SYN (seqx) ──────────────────→│ │←───── SYN (seqy) ───────────────────│ │────── SYNACK (acky1) ────────────→│ │←───── SYNACK (ackx1) ─────────────│ │ │ ▼ ▼ ESTABLISHED ESTABLISHED这种情况很少见但 TCP 规范支持。6.3 第三次握手丢失怎么办客户端发完 ACK 后进入 ESTABLISHED 如果 ACK 丢失 服务器还在 SYN_RCVD等待 ACK 超时后服务器重发 SYNACK 客户端收到重发的 SYNACK重新发送 ACK 最终仍能建立连接只是多了一次重传。07. 三次握手的抓包分析7.1 使用 tcpdump 抓包tcpdump-ieth0-ntcp port 8080-c37.2 抓包输出示例1. 10:00:01.123456 IP 192.168.1.100.54321 93.184.216.34.8080: Flags [S], seq 12345678, win 65535, length 0 2. 10:00:01.123789 IP 93.184.216.34.8080 192.168.1.100.54321: Flags [S.], seq 87654321, ack 12345679, win 65535, length 0 3. 10:00:01.123801 IP 192.168.1.100.54321 93.184.216.34.8080: Flags [.], ack 87654322, win 65535, length 0字段解读[S] SYN[S.] SYNACK[.] ACKseq 序列号ack 确认号期望的下一个序列号7.3 序列号变化客户端 seq 12345678 服务器 ack 12345679 客户端 seq 1确认收到 服务器 seq 87654321 客户端 ack 87654322 服务器 seq 1确认收到08. 三次握手的性能影响8.1 一个完整的 TCP 连接建立需要多少 RTTTCP 三次握手1.5 RTT RTT 往返时间 示例RTT 50ms 客户端发送 SYN → 25ms → 服务器收到 服务器发送 SYNACK → 25ms → 客户端收到第一次往返完成1 RTT 客户端发送 ACK → 25ms → 服务器收到第二次往返0.5 RTT 总计1.5 RTT 75ms8.2 TLS 叠加HTTPSTCP 三次握手1.5 RTT TLS 1.3 握手1 RTT 2.5 RTT RTT50ms → 125ms 才能开始发送 HTTP 请求8.3 优化手段手段效果TCP Fast Open (TFO)允许在 SYN 包中携带数据节省 1 RTT连接池/Keep-Alive复用连接避免重复握手HTTP/2 多路复用减少连接数降低握手开销09. 常见面试追问Q1第三次握手可以携带数据吗可以。第三次握手的 ACK 包理论上可以携带数据因为此时客户端已经知道服务器的序列号可以开始发送数据。但实际实现中大多数协议栈不会这么做。Q2如果客户端发完 SYN 就挂了服务器怎么办服务器收到 SYN 后进入 SYN_RCVD等待 ACK。超时后默认 1 秒左右服务器重发 SYNACK重试多次通常 5 次最终超时关闭连接。Q3什么是半连接队列和全连接队列半连接队列SYN Queue 存放收到 SYN 但未完成三次握手的连接SYN_RCVD 状态 全连接队列Accept Queue 存放已完成三次握手但未被应用层 accept 取走的连接ESTABLISHED 状态 当队列满时 半连接队列满 → 丢弃 SYN 全连接队列满 → 根据 tcp_abort_on_overflow 决定行为Q4为什么 TIME_WAIT 出现在四次挥手而不是三次握手TIME_WAIT 是主动关闭方在四次挥手最后阶段的状态用于确保最后一个 ACK 能到达对方和三次握手无关。10. 完整状态机中的三次握手客户端 服务器 │ │ CLOSED CLOSED │ │ │ │ listen() │ ▼ │ LISTEN │ │ 主动打开 connect() │ │ │ │ │ ▼ │ │ SYN_SENT │ │ │ │ │ │────── SYN ────│────────────────────────→│ │ │ │ │ │ ▼ │ │ SYN_RCVD │ │ │ │←──── SYNACK ─│─────────────────────────│ │ │ │ ▼ │ │ ESTABLISHED │ │ │ │ │ │────── ACK ────│────────────────────────→│ │ │ │ │ │ ▼ │ │ ESTABLISHED │ │ │ │◄ 数据传输 ►│11. 总结┌─────────────────────────────────────────────────────────────────┐ │ TCP 三次握手核心要点 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 1. 流程SYN → SYNACK → ACK │ │ │ │ 2. 三个目的 │ │ • 确认双方收发能力正常 │ │ • 同步初始序列号ISN │ │ • 防止历史延迟包干扰新连接 │ │ │ │ 3. 为什么是三次不是两次 │ │ • 两次无法确认客户端的接收能力 │ │ • 两次无法防止历史 SYN 包干扰 │ │ • 两次无法可靠同步双方序列号 │ │ │ │ 4. 为什么不是四次 │ │ • SYN 和 ACK 可以合并四次浪费一次往返 │ │ │ │ 5. 记忆口诀 │ │ 客户端我要连接SYN │ │ 服务器好的我也要连接SYNACK │ │ 客户端好的开始传输ACK │ │ │ └─────────────────────────────────────────────────────────────────┘面试回答模板三次握手是 TCP 建立连接的过程客户端发 SYN 告知自己的初始序列号服务器回复 SYNACK告知自己的序列号并确认收到客户端的 SYN客户端回复 ACK 确认收到服务器的 SYN。三次握手解决了三个问题确认双方收发能力、同步初始序列号、防止历史连接包干扰。之所以不是两次握手是因为两次无法确认客户端的接收能力也无法防止延迟的 SYN 包误建连接。之所以不是四次是因为 SYN 和 ACK 可以合并不需要单独发送。The End点点关注收藏不迷路

相关文章:

说说 TCP 的三次握手:为什么是三次而不是两次或四次?

说说 TCP 的三次握手:为什么是三次而不是两次或四次?01. 前言:TCP 连接的“破冰仪式”02. 三次握手的完整流程2.1 流程图2.2 三个报文详解2.3 状态变化追踪03. 为什么需要三次握手?(核心问题)3.1 问题一&am…...

一台服务器最多能建立多少 TCP 连接:从理论极限到实际瓶颈

一台服务器最多能建立多少 TCP 连接:从理论极限到实际瓶颈01. 前言:一个经典却容易被答错的问题02. 核心原理:什么唯一标识一个 TCP 连接?03. 服务端 vs 客户端:限制完全不同3.1 服务端视角(如 Nginx、Tomc…...

TCP 是用来解决什么问题:从 IP 的不可靠到可靠的端到端通信

TCP 是用来解决什么问题:从 IP 的不可靠到可靠的端到端通信01. 前言:为什么有了 IP 还不够?02. IP 协议的四大先天缺陷03. TCP 要解决的六大核心问题04. 问题一:丢包 → 确认 超时重传4.1 问题描述4.2 TCP 的解决方案05. 问题二&…...

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机01. 前言:每天都在用,却说不清它是什么02. 一句话定义03. TCP 连接不是物理的,而是逻辑的04. TCP 连接的核心标识:四元组05. TCP 连接在内核中…...

Python @contextmanager 装饰器完全指南

在Python编程实践中,资源管理是一个永恒的话题。无论是文件句柄、数据库连接还是临时状态变更,我们都需要确保资源被正确分配并在使用后得到妥善清理。虽然传统的try...finally语句可以解决这个问题,但Python提供了更加优雅的解决方案——上下…...

EC数据下载和可视化产品python实现

欧洲中期天气预报中心(ECMWF,European Centre for Medium-Range Weather Forecasts)是全球顶尖的气象研究和业务预报中心之一。其发布的数据,常被业内简称为“EC数据”,因高精度与高稳定性,是全球气象预报、…...

数据集成与 ETL 实践:从设计到优化

数据集成与 ETL 实践:从设计到优化 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据集成和 ETL(Extract, Transform, Load)在企业数据管理中的重要性。随着数据量的爆炸式增长和数据来源的多样化,数据集…...

数据治理与数据质量:从策略到实践

数据治理与数据质量:从策略到实践 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据治理和数据质量在企业数据管理中的重要性。随着数据量的爆炸式增长和数据类型的多样化,数据治理和数据质量已经成为企业数据管理的核心挑战。今…...

云原生数据库的设计与实践:从架构到部署

云原生数据库的设计与实践:从架构到部署 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知云原生技术对数据库的影响。随着云计算的快速发展,云原生数据库已经成为数据库技术的重要发展方向。今天,我就来聊聊云原生数据库…...

网络协议封神考点:TCP协议是如何保证可靠传输的?原理+流程图+硬核详解

网络协议封神考点:TCP协议是如何保证可靠传输的?原理流程图硬核详解一、前言二、基础定义:什么是TCP可靠传输?三、TCP保证可靠传输的6大核心机制(必考)3.1 机制1:面向连接(三次握手 …...

Spring-AI 第 13 章 - 多模态消息处理详解

📚 理论基础 什么是多模态 AI? 多模态 AI(Multimodal AI) 是能够同时处理和生成多种类型数据(文本、图像、音频等)的人工智能系统。 多模态模型架构 ┌──────────────┐ ┌──────────────┐ │ 图像输入 │ │ 文本输入 …...

**发散创新:基于Go语言实现的Raft共识算法实战解析**在分布式系统中,**一

发散创新:基于Go语言实现的Raft共识算法实战解析 在分布式系统中,一致性是核心挑战之一。而Raft共识算法因其简洁性和可理解性,已成为当前主流的分布式一致性协议(如etcd、Consul均采用Raft)。本文将带你深入用Go语言从…...

# 发散创新:基于Python与Stable Diffusion的AI绘画自动化流程设计与实践

发散创新:基于Python与Stable Diffusion的AI绘画自动化流程设计与实践 在人工智能技术飞速发展的今天,AI绘画已从实验室走向大众创作场景。如何将这一前沿能力融入开发者工作流?本文以 Python Stable Diffusion API(如InvokeAI或…...

**发散创新:基于 Rust的微服务生态构建与性能优化实战**在现代云原生架构中,**Rust语言正迅速成为构建高并发、低延迟微服

发散创新:基于 Rust 的微服务生态构建与性能优化实战 在现代云原生架构中,Rust 语言正迅速成为构建高并发、低延迟微服务的首选工具之一。它不仅提供了媲美 C/C 的性能,还通过所有权机制彻底避免了内存安全问题。本文将围绕 Rust 在微服务生态…...

2026届最火的六大降重复率神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 目前人工智能生成内容大范围运用的情形下,致使 AIGC 检测识别率降低的工具适时出…...

场效应管MOS

场效应管 场效应管又称场效应晶体管(Field Effect Transistor,缩写为FET),它与三极管一样,具有放大能力。场效应管有漏极(D极)、栅极(G极)和源极(S极&#xf…...

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 副标题:如何通过用户态Hook技术实现游戏帧率自由…...

新手福音:在快马平台用AI生成openclaw命令实操案例,轻松入门运维自动化

作为一个刚接触运维的新手,第一次看到openclaw这个命令时确实有点懵。不过最近在InsCode(快马)平台上发现了一个超实用的功能,可以通过AI直接生成可运行的openclaw示例代码,还能实时测试效果,简直是新手福利!下面我就用…...

保姆级教程:在Quartus Prime 18.0中手把手配置NCO IP核并完成Modelsim仿真

保姆级教程:在Quartus Prime 18.0中手把手配置NCO IP核并完成Modelsim仿真 数字信号处理是FPGA开发中的核心技能之一,而数控振荡器(NCO)作为生成精确频率信号的关键IP核,在通信系统、雷达信号处理等领域有着广泛应用。…...

C语言三大控制结构:零基础学循环与选择

C语言编程里,控制结构用以构架程序逻辑,是新手入门的关键要点,掌握顺序、选择、循环这三大基本控制结构,可使你脱离单纯顺序代码编写,达成更复杂、更灵活的程序逻辑,本文会将C语言控制结构的核心知识点讲解…...

【深度解析】Hermes Agent:具备学习循环的开源 AI 代理如何落地到你的开发工作流?

摘要 Hermes Agent 是 News Research 推出的开源 AI Agent 系统,不只是“聊天包装器”,而是带有持久化记忆、自我技能学习与多通道接入的完整代理运行环境。本文从架构原理到落地实践,系统解析 Hermes 的学习循环、模型接入方式(云…...

CEEMDAN-VMD-Transformer-GRU二次分解+编码器+门控循环单元多元时间序列预测

一、研究背景 实际工程与科学数据(如振动信号、电力负荷、金融时序)常呈现非线性、非平稳特征,单一预测模型难以充分提取多尺度信息。为此,结合自适应信号分解(CEEMDAN、VMD)与深度学习(Transfo…...

针对波动计算复杂性的吸收边界条件(PML 用于一般波动方程)附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...

【LeetCode 刷题日】19.删除链表的倒数第n个节点

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者评论和 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可…...

【AI实战项目】项目六:知识图谱构建与应用实战

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter 项目背景: 在当今信息爆炸的时代,精准理解和应…...

人流后多久干净才算正常?行业洞察与科学修护指南

人工流产后,出血排净时间是判断身体恢复状态的核心指标,也是女性关注的首要问题。结合行业研究与临床实践,本文将深入解析人流后出血的正常范围、异常信号,同时结合行业修护标准,为女性提供科学、实用的恢复指引&#…...

宫外孕打掉需要住院吗?术后修护核心指南

宫外孕作为妇科高发急腹症,不少女性存在认知误区,疑惑“宫外孕打掉是否需要住院”。事实上,宫外孕绝非普通流产,其处理必须住院,且术后修护直接影响女性后续生殖健康。本文结合行业洞察,围绕宫外孕住院必要…...

告别繁琐手工操作:工资条生成器使用指南

对于许多财务人员来说,每月制作工资条都是一项让人头疼的工作。 手工制作不仅要花费大量时间,还容易出现各种错误,影响工作效率和准确性。 今天,我们就来详细介绍一款能够彻底改变这种状况的工具——工资条生成器。 工资条生成…...

工资条生成器:财务人员的高效办公利器

在企业财务管理工作中,工资条的制作与发放是一项既繁琐又重要的任务。 传统的手工制作方式不仅耗时耗力,还容易出现数据错误和格式不统一的问题。 工资条生成器的出现,为财务人员带来了全新的解决方案。 这款软件专门针对财务工作场景设计…...

龙迅LT9211D芯片解析:如何实现MIPI与双端口LVDS的高效转换

1. 龙迅LT9211D芯片的核心价值 第一次接触龙迅LT9211D芯片是在一个车载显示项目上,当时客户要求实现4K视频从主控芯片到双屏显示的无损传输。这个看似简单的需求背后,其实隐藏着MIPI和LVDS两种信号标准的转换难题。LT9211D的出现完美解决了这个问题&…...