TCP 三次握手:详解与原理
无图、长文警告!!!!
文章目录
- 一、引言
- 二、TCP 三次握手的过程
- (一)第一次握手:SYN(同步序列号)
- (二)第二次握手:SYN-ACK(同步确认)
- (三)第三次握手:ACK(确认)
- 三、TCP 三次握手的原理
- (一)为什么需要三次握手?
- (二)三次握手中的序列号和确认号
- 四、TCP 三次握手的详细解析
- (一)第一次握手(SYN)
- (二)第二次握手(SYN-ACK)
- (三)第三次握手(ACK)
- 五、TCP 三次握手的图解
- 六、TCP 三次握手的常见问题
- (一)为什么不是两次握手?
- (二)为什么不是四次握手?
- (三)SYN 泛洪攻击(SYN Flood)
- 七、TCP 三次握手的优化
- (一)快速打开(TFO)
- (二)并行连接
- 八、总结
一、引言
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF(互联网工程任务组)的 RFC 793 定义。在 TCP 协议中,三次握手(Three-Way Handshake)是建立可靠连接的关键步骤。本文将详细解析 TCP 三次握手的过程、原理以及相关细节。
二、TCP 三次握手的过程
(一)第一次握手:SYN(同步序列号)
• 客户端发起请求:客户端(通常是浏览器或其他应用程序)向服务器发送一个 TCP 数据包,数据包中的 SYN(同步序列号)标志位被设置为 1,表示请求建立连接。同时,客户端会随机生成一个初始序列号(ISN,Initial Sequence Number),并将其放入 TCP 头部的序列号字段中。
• 数据包内容:
• SYN:1
• 序列号:客户端生成的随机初始序列号(ISN)
• 确认号:0(因为还没有收到服务器的任何数据)
• 其他字段:如窗口大小、最大报文段长度(MSS)等
(二)第二次握手:SYN-ACK(同步确认)
• 服务器响应:服务器收到客户端的 SYN 数据包后,会检查数据包的合法性。如果合法,服务器会发送一个 SYN-ACK 数据包作为响应。这个数据包包含两个标志位:
• SYN:1
• ACK:1
• 数据包内容:
• SYN:1
• ACK:1
• 序列号:服务器生成的随机初始序列号(ISN)
• 确认号:客户端的初始序列号+1(表示对客户端的 SYN 数据包的确认)
• 其他字段:如窗口大小、最大报文段长度(MSS)等
(三)第三次握手:ACK(确认)
• 客户端确认:客户端收到服务器的 SYN-ACK 数据包后,会发送一个 ACK 数据包作为确认。这个数据包包含:
• SYN:0
• ACK:1
• 数据包内容:
• SYN:0
• ACK:1
• 序列号:客户端的初始序列号+1
• 确认号:服务器的初始序列号+1(表示对服务器的 SYN-ACK 数据包的确认)
• 其他字段:如窗口大小等
• 连接建立:当服务器收到客户端的 ACK 数据包后,TCP 连接正式建立,双方可以开始传输数据。
三、TCP 三次握手的原理
(一)为什么需要三次握手?
• 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误:
• 在网络中,数据包可能会因为各种原因延迟到达。如果一个连接请求(SYN)在发送后因为网络延迟或其他原因没有得到及时响应,客户端可能会重新发送这个请求。如果没有三次握手,服务器可能会误以为这是一个新的连接请求,从而导致错误。
• 通过三次握手,服务器可以确保客户端确实收到了它的 SYN-ACK 响应,并且客户端仍然希望建立连接。
• 同步双方的初始序列号:
• TCP 是一个面向字节流的协议,数据的传输需要通过序列号来确保数据的顺序和完整性。在三次握手过程中,客户端和服务器分别生成并交换初始序列号(ISN),从而确保双方在数据传输过程中能够正确地识别和确认数据包。
(二)三次握手中的序列号和确认号
• 序列号(Sequence Number):
• 序列号是 TCP 头部的一个字段,用于标识发送方发送的数据包的顺序。在三次握手过程中,客户端和服务器分别生成一个初始序列号(ISN),并将其放入相应的数据包中。
• 客户端的初始序列号(ISN)在第一次握手(SYN)中发送给服务器。
• 服务器的初始序列号(ISN)在第二次握手(SYN-ACK)中发送给客户端。
• 确认号(Acknowledgment Number):
• 确认号是 TCP 头部的一个字段,用于标识接收方期望收到的下一个数据包的序列号。在三次握手过程中,确认号用于确认对方发送的数据包。
• 在第二次握手(SYN-ACK)中,服务器的确认号是客户端的初始序列号+1。
• 在第三次握手(ACK)中,客户端的确认号是服务器的初始序列号+1。
四、TCP 三次握手的详细解析
(一)第一次握手(SYN)
• 客户端发送 SYN 数据包:
• 源 IP 地址:客户端的 IP 地址
• 目的 IP 地址:服务器的 IP 地址
• 源端口号:客户端随机选择的端口号
• 目的端口号:服务器的监听端口号(如 HTTP 的 80 端口)
• SYN:1
• 序列号:客户端生成的随机初始序列号(ISN)
• 确认号:0
• 窗口大小:客户端的接收窗口大小
• 最大报文段长度(MSS):客户端支持的最大报文段长度
(二)第二次握手(SYN-ACK)
• 服务器发送 SYN-ACK 数据包:
• 源 IP 地址:服务器的 IP 地址
• 目的 IP 地址:客户端的 IP 地址
• 源端口号:服务器的监听端口号(如 HTTP 的 80 端口)
• 目的端口号:客户端随机选择的端口号
• SYN:1
• ACK:1
• 序列号:服务器生成的随机初始序列号(ISN)
• 确认号:客户端的初始序列号+1
• 窗口大小:服务器的接收窗口大小
• 最大报文段长度(MSS):服务器支持的最大报文段长度
(三)第三次握手(ACK)
• 客户端发送 ACK 数据包:
• 源 IP 地址:客户端的 IP 地址
• 目的 IP 地址:服务器的 IP 地址
• 源端口号:客户端随机选择的端口号
• 目的端口号:服务器的监听端口号(如 HTTP 的 80 端口)
• SYN:0
• ACK:1
• 序列号:客户端的初始序列号+1
• 确认号:服务器的初始序列号+1
• 窗口大小:客户端的接收窗口大小
五、TCP 三次握手的图解
客户端 服务器| || SYN (Seq=ISN1) ||------------------------------------>|| || <----------------------------------|| SYN-ACK (Seq=ISN2, Ack=ISN1+1) || || ACK (Seq=ISN1+1, Ack=ISN2+1) ||------------------------------------>|| || 连接建立,可以开始传输数据 || |
六、TCP 三次握手的常见问题
(一)为什么不是两次握手?
• 防止已失效的连接请求报文段突然又传送到了服务端:
• 如果只有两次握手,服务器在收到客户端的 SYN 数据包后,直接发送 ACK 数据包确认连接。如果客户端的 SYN 数据包因为网络延迟或其他原因重新发送,服务器可能会误以为这是一个新的连接请求,从而导致错误。
• 通过三次握手,客户端在收到服务器的 SYN-ACK 数据包后,会发送一个 ACK 数据包作为确认,确保服务器知道客户端仍然希望建立连接。
(二)为什么不是四次握手?
• 效率问题:
• 四次握手会增加连接建立的时间和网络开销。三次握手已经足够确保连接的可靠性和安全性,不需要额外的确认步骤。
(三)SYN 泛洪攻击(SYN Flood)
1.攻击原理
SYN 泛洪攻击是一种常见的拒绝服务攻击(DoS)手段。攻击者向服务器发送大量的 SYN 数据包,但不发送 ACK 数据包。服务器在收到 SYN 数据包后,会发送 SYN-ACK 数据包并等待客户端的 ACK 数据包确认,但客户端永远不会发送 ACK 数据包。这会导致服务器的连接队列被占满,无法处理新的连接请求,从而导致服务不可用。
2.防御措施
• SYN Cookie:
• 原理:SYN Cookie 是一种防御 SYN 泛洪攻击的技术。服务器在收到 SYN 数据包后,不立即分配资源,而是生成一个特殊的序列号(Cookie),并将这个 Cookie 放入 SYN-ACK 数据包中发送给客户端。当客户端发送 ACK 数据包时,服务器通过验证 Cookie 的合法性来确认客户端是否是合法的连接请求。
• 优点:不需要为每个 SYN 数据包分配资源,有效减少了资源消耗。
• 缺点:在高并发场景下,可能会导致合法连接的丢包率增加。
• 限制 SYN 数据包的速率:
• 原理:通过限制单位时间内接收的 SYN 数据包数量,可以有效缓解 SYN 泛洪攻击。如果单位时间内接收到的 SYN 数据包数量超过设定的阈值,服务器将丢弃多余的 SYN 数据包。
• 优点:简单易实现,对合法连接的影响较小。
• 缺点:在高并发场景下,可能会误判合法连接。
• 使用防火墙和入侵检测系统(IDS):
• 原理:防火墙可以设置规则,限制来自特定 IP 地址或网络的 SYN 数据包数量。IDS 可以检测到异常的 SYN 数据包流量,并及时发出警报或采取措施。
• 优点:可以有效识别和阻止恶意攻击,保护服务器的安全。
• 缺点:需要专业的设备和人员进行配置和维护,成本较高。
• 增加服务器资源:
• 原理:通过增加服务器的资源(如内存、CPU 等),可以提高服务器处理 SYN 数据包的能力,从而在一定程度上缓解 SYN 泛洪攻击。
• 优点:简单直接,对合法连接的影响较小。
• 缺点:成本较高,且不能从根本上解决问题。
七、TCP 三次握手的优化
(一)快速打开(TFO)
• 原理:TCP 快速打开(TCP Fast Open,TFO)是一种优化技术,允许客户端在第一次握手(SYN)中携带数据,从而减少连接建立的时间。TFO 通过在 SYN 数据包中携带加密的 Cookie 来实现,服务器在收到 SYN 数据包后,可以直接处理数据,而不需要等待第三次握手完成。
• 优点:显著减少了连接建立的时间,提高了应用的响应速度。
• 缺点:需要客户端和服务器都支持 TFO,且安全性需要通过加密机制来保证。
(二)并行连接
• 原理:在某些场景下,客户端可以同时发起多个连接请求,从而提高数据传输的效率。例如,浏览器在加载网页时,可以并行发起多个 HTTP 请求,提高页面加载速度。
• 优点:提高了数据传输的效率,适用于高并发场景。
• 缺点:增加了服务器的负载,需要合理控制并发数量。
八、总结
TCP 三次握手是建立可靠连接的关键步骤,通过同步序列号、确认号和状态机的配合,确保了连接的可靠性和数据的完整性。三次握手不仅防止了已失效的连接请求报文段突然又传送到了服务端,还同步了双方的初始序列号,为后续的数据传输奠定了基础。
在实际应用中,三次握手可能会面临 SYN 泛洪攻击等安全威胁,通过 SYN Cookie、限制 SYN 数据包速率、使用防火墙和 IDS 等技术,可以有效防御这些攻击。此外,通过优化技术如 TCP 快速打开(TFO)和并行连接,可以进一步提高连接建立的效率和数据传输的性能。
理解 TCP 三次握手的原理和机制,有助于我们更好地设计和优化网络应用,提高系统的可靠性和性能。
相关文章:

TCP 三次握手:详解与原理
无图、长文警告!!!! 文章目录 一、引言二、TCP 三次握手的过程(一)第一次握手:SYN(同步序列号)(二)第二次握手:SYN-ACK(同…...

LabVIEW累加器标签通道
主要展示了 Accumulator Tag 通道的使用,通过三个并行运行的循环模拟不同数值的多个随机序列,分别以不同频率向累加器写入数值,右侧循环每秒读取累加器值,同时可切换查看每秒内每次事件的平均值,用于演示多线程数据交互…...
在 Unity 中,Start 方法直接设置 RectTransform 的位置,时出现问题,与预计位置不匹配。
改动之前的源代码:发现组件的位置,与设计的位置不一样,但是如果把这段代码,交给一个按钮按下回调,就不会出现问题。 void Start(){//初始化Text 行//读取配置文件;StaticDataObj obj Resources.Load<St…...

永磁同步电机控制算法--IP调节器
一、基本原理 在电机控制领域,现今普遍使用的是比例-积分(PI)控制器。然而,PI控制器有一些缺点,可能会在某些应用中产生一些问题,例如:一个非常快的响应,也同时具有过大的超调量。虽然设计PI控制器时,可以…...

Ubuntu 25.04 锁屏不能远程连接的解决方案
最近安装了一个 Ubuntu 25.04,偶然发现可以通过 windows 自带的 rdp 远程工具进行连接,内心狂喜。此外,还支持启动 VNC 协议,也就是默认支持了 rdp 和 vnc 连接。 看了以下,ubuntu 在用户级别下创建了一个远程桌面服务…...

Java 自动装箱和拆箱还有包装类的缓存问题
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5 后, Java 引入了自动装箱(autoboxing)/拆箱(unboxing)。 自动装箱: 基本类型的数据处于需要对象的环境中时,会自动转为“对象”。 我们以 Integer 为例:…...

java-jdk8新特性Stream流
一、Stream流 是专业用于对集合或者数组进行便捷操作的。 1.1 Stream流的创建 主要分为Collection(List与Set)、Map、数组三种创建方式: //1.Collection集合的创建List<String> names new ArrayList<>();Collections.addAll(…...

大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码
MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

QNAP NEXTCLOUD 域名访问
我是用docker compose方式安装的,虽然不知道是不是这么个叫法,废话不多说。 背景:威联通container station安装了nextcloud和lucky,lucky进行的域名解析和反代 先在想安装的路径、数据存储路径、数据库路径等新建文件夹。再新建…...
Spring MVC深度解析:控制器与视图解析及RESTful API设计最佳实践
引言 在现代Java Web开发领域,Spring MVC框架凭借其优雅的设计和强大的功能,已成为构建企业级Web应用的首选框架。本文将深入探讨Spring MVC的核心机制——控制器与视图解析,并详细讲解如何设计符合RESTful风格的API。无论你是刚接触Spring …...

华为OD机试真题——信道分配(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

比亚迪“双剑”电池获中汽中心权威认证,堪称“移动安全堡垒”。
在新能源汽车发展中,电池安全是重中之重。比亚迪的刀片电池与闪充刀片电池提前通过电池新国标全项检测,获中汽中心权威认证,堪称“移动安全堡垒”。 传统电池极端条件下易热失控,而刀片电池独特长条形设计,似刀片般&am…...

【mysql】mysql的高级函数、高级用法
mysql是最常用的数据库之一,常见的函数用法大家应该都很熟悉,本文主要例举一些相对出现频率比较少的高级用法 (注:需注意mysql版本,大部分高级特性都是mysql8才有的) 多值索引与虚拟列 主要是解决字符串索引问题,光说…...
了解一下C#的SortedSet
基础概念 SortedSet 是 C# 中的一个集合类型,位于 System.Collections.Generic 命名空间下。它是一个自动排序的集合,用于存储不重复的元素,并且会根据元素的自然顺序(默认排序)或自定义比较器进行排序,内…...

【平面波导外腔激光器专题系列】用于光纤传感的低噪声PLC外腔窄线宽激光器
----翻译自Mazin Alalusi等人的文章 摘要 高性价比的 1550 nm DWDM平面外腔 (PLANEX) 激光器是干涉测量、布里渊、LIDAR 和其他光传感应用的最佳选择。其线宽<3kHz、低相位/频率噪声和极低的RIN。 简介 高性能光纤分布式传感技术是在过去几年中开发…...

Pytorch里面多任务Loss是加起来还是分别backward? | Pytorch | 深度学习
当你在深度学习中进入“多任务学习(Multi-task Learning)”的领域,第一道关卡可能不是设计网络结构,也不是准备数据集,而是:多个Loss到底是加起来一起backward,还是分别backward? 这个问题看似简单,却涉及PyTorch计算图的构建逻辑、自动求导机制、内存管理、任务耦合…...
K8S Pod调度方法实例
以下是一篇面向企业用户、兼具通俗易懂和实战深度的 Kubernetes Pod 调度方法详解博文大纲与正文示例。全文采用“图文(代码块)并茂 问答穿插 类比”方式,模拟了真实终端操作及输出,便于读者快速上手。 一、引言 为什么要关注 P…...
【mindspore系列】- 算子源码分析
本文会介绍mindspore的算子源码结构、执行过程以及如何编写一个自定义的mindspore算子。 源码介绍 首先,我们先从https://gitee.com/mindspore/mindspore/ 官网中clone源代码下来。 clone好代码后,可以看到源码的文件夹结构如下(只列出比较重要的文件夹): docsmindspore…...
学习日记-day17-5.27
完成目标: 知识点: 1.日期相关类_Calendar日历类 常用方法:int get(int field) ->返回给定日历字段的值void set(int field, int value) :将给定的日历字段设置为指定的值void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或…...

一种比较精简的协议
链接地址为:ctLink: 一个比较精简的支持C/C的嵌入式通信的中间协议。 本文采用的协议格式如下 *帧头 uint8_t 起始字节:0XAF\ *协议版本 uint8_t 使用的协议版本号:当前为0X01\ *负载长度 uint8_t 数据段内容长…...

网络常识:网线和光纤的区别
网络常识:网线和光纤的区别 一. 介绍二. 网线2.1 什么是网线?2.2 网线的主要类别2.3 网线的优势2.4 网线的劣势 三. 光纤3.1 什么是光纤?3.2 光纤的主要类别3.3 光纤的优势3.4 光纤的劣势 四. 网线 vs 光纤:谁更适合你?…...

OpenCV CUDA模块图像过滤------创建一个 Scharr 滤波器函数createScharrFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于创建一个 Scharr 滤波器(基于 CUDA 加速),用于图像的一阶导数计算。它常用于边缘检测任务中&#…...

html css js网页制作成品——HTML+CSS+js醇香咖啡屋网页设计(5页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
[特殊字符] 构建高内聚低耦合的接口架构:从数据校验到后置通知的分层实践
在现代企业系统开发中,接口结构设计的质量直接影响系统的稳定性、扩展性与可维护性。随着业务复杂度上升,单一层次的接口实现往往难以应对功能膨胀、事务一致性、后置扩展等需求。因此,我们提出一种面向复杂业务场景的接口分层模型࿰…...

brep2seq 源码笔记2
数学公式是什么def forward(self, noise_1, noise_2, real_z_pNone): if(real_z_p): z_p_ self.downsample(real_z_p) input_2 z_p_ noise_2 z_f self.gen_z_f(input_2) output real_z_p z_f else: …...

UE5 蓝图,隐藏一个Actor,同时隐藏它的所有子物体
直接用actor.sethideningame是不行的 要先找到根组件,这样就有覆盖子物体的选项了...

人工智能AI之机器学习基石系列 第 2 篇:数据为王——机器学习的燃料与预处理
专栏系列:《人工智能AI之机器学习基石》② 高质量的数据是驱动机器学习模型的强大燃料 🚀 引言:无米之炊与数据的重要性 在上一篇文章《什么是机器学习?——开启智能之门》中,我们一起揭开了机器学习的神秘面纱&…...

代码随想录算法训练营 Day58 图论Ⅷ 拓扑排序 Dijkstra
图论 题目 117. 软件构建 拓扑排序:给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。 当然拓扑排序也要检测这个有向图是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。所以拓扑排序也是图论中判断有向…...

实现单例模式的6种方法(Python)
目录 一. 基于模块的实现(简单,易用) 二. 重新创建时报错(不好用) 三. 只靠方法获取实例(不好用) 四. 类装饰器 五. 重写__new__方法 六. 元类 七. 总结 单例模式(Singleton Pattern)是一种设计模式,其核心目标是确保一个类…...
基于 STM32 的智慧农业温室控制系统设计与实现
摘要 本文提出一种基于 STM32 微控制器的智慧农业温室控制系统设计方案,通过集成多类型环境传感器、执行机构及无线通信模块,实现对温室内温湿度、光照、土壤湿度等参数的实时监测与自动调控。文中详细阐述硬件选型、电路连接及软件实现流程,并附关键代码示例,为智慧农业领…...