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

news2026/4/5 23:58:23
说说 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点点关注收藏不迷路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2487278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…