(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?

news2024/11/25 22:52:38

常规回答:“因为三次握手才能保证双方具有接收和发送的能力”


原因一:避免历史连接

三次握手的首要原因是为了防止旧的重复连接初始化造成混乱

假设:客户端先发送了SYN(seq=90)报文,然后客户端宕机了,而且这个SYN报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了SYN(seq=100)报文。(这里不是重传,而是重新发送请求)

三次握手避免历史连接

 客户端连续发送多次SYN(都是同一个四元组)建立连接的报文,在网络拥堵的情况下:

  • 一个[旧的SYN报文]比[最新的SYN]报文早到达了服务端,那么此时服务端就回一个SYN+ACK报文给客户端,此报文中的确认号是91(90+1)
  • 客户端收到后,发现自己期望收到的确认号应该是100+1,而不是90+1,于是就会回RST报文
  • 服务端收到RST报文后,就会释放连接。
  • 后续最新的SYN抵达了服务端,客户端与服务端就可以正常的完成三次握手了。

上述中的「旧 SYN 报文」称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止「历史连接」初始化了连接

 TIP

如果服务端在收到 RST 报文之前,先收到了「新 SYN 报文」,也就是服务端收到客户端报文的顺序是:「旧 SYN 报文」->「新 SYN 报文」,此时会发生什么?

当服务端第一次收到 SYN 报文,也就是收到 「旧 SYN 报文」时,就会回复 SYN + ACK 报文给客户端,此报文中的确认号是 91(90+1)。

然后这时再收到「新 SYN 报文」时,就会回 Challenge Ack (opens new window)报文给客户端,这个 ack 报文并不是确认收到「新 SYN 报文」的,而是上一次的 ack 确认号,也就是91(90+1)。所以客户端收到此 ACK 报文时,发现自己期望收到的确认号应该是 101,而不是 91,于是就会回 RST 报文。

如果是两次握手连接,就无法阻止历史连接,那为什么TCP两次握手就无法阻止历史连接呢?

因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。

在两次握手的情况下,服务端在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而两次握手而服务端在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。

 可以看到,如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。

因此,要解决这种现象,最好就是在服务端发送数据前,也就是在建立连接前,要阻止掉历史连接,这样就不会造成资源浪费,所以需要三次握手。

所以TCP使用三次握手建立连接的最主要原因是防止[历史连接]初始化了连接


原因二:同步双方初始序列号

TCP协议的通信双方,都必须维护一个[序列号],序列号是可靠传输的一个关键因素,它的作用:

  • 接收方可以去除重复数据
  • 接收方可以根据数据包的序列号按序接收
  • 可以标识发送出去的数据包中,哪些是已经被对方收到的(通过ACK报文中的序列号知道)

可见,序列号在TCP连接中占据着非常重要的作用,所以当客户端发送携带[初始序列号]的SYN报文的时候,需要服务端回一个ACK应答报文,表示客户端的SYN报文已被服务端成功接收,那么当服务端发送[初始序列号]给客户端的时候,依然也要得到客户端的应答,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了[三次握手]。

 两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。


原因三:避免资源浪费

如果只有[两次握手],当客户端发生的SYN报文在网络中阻塞,客户端没有收到ACK报文,就会重新发送SYN由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的ACK报文,所以服务端每收到一个SYN就只能先主动建立一个连接,这会造成什么情况呢?

如果客户端发送的SYN报文在网络中阻塞了,重复发送多次SNY报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成资源浪费。(因为两次握手的情况下,服务端在接收到SYN报文后就会建立连接)

这里两次握手是假设「由于没有第三次握手,服务端不清楚客户端是否收到了自己发送的建立连接的 ACK 确认报文,所以每收到一个 SYN 就只能先主动建立一个连接」这个场景。


结论

TCP建立连接时,通过三次握手能够防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用两次握手和四次握手的原因:

  • 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,无法可靠的同步双方序列号
  • 四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

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

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

相关文章

七夕杯—密码签到

0x00 前言 CTF 加解密合集:CTF 加解密合集 0x01 题目 大牛在今年的hvv过程中,渗透进某业务系统,发现了密文,可是不知道如何解出明文,你能帮他找出来吗?已知密文由两部分组成,后面的推测为秘钥密文如下&a…

nginx基本2——配置文件详解(网页配置篇)

文章目录 一、基本了解二、nginx.conf配置参数2.1 调试参数2.2 必配参数2.3 优化性能参数2.4 event{}段配置参数2.5 网络连接参数2.6 fastcgi配置参数2.7 总结常配参数 三、http{}段配置参数3.1 配置结构3.2 精简配置网页3.3 location定义网页3.3.1 root path用法3.3.1 alias p…

编码器旋转圈数和单圈计数值计算功能块(SMART PLC梯形图)

有关 PLC的编码器更多应用请参看专栏其它文章,常用链接如下: 西门子SMART PLC高速脉冲计数采集编码器速度(RC滤波)_编码器频率采集计算速度采用什么滤波方法_RXXW_Dor的博客-CSDN博客这篇文章主要讲解西门子 SMART PLC高速计数采集编码器脉冲信号计算速度,根据编码器脉冲数…

数据结构--时间复杂度与空间复杂度

数据结构–时间复杂度与空间复杂度 文章目录 数据结构--时间复杂度与空间复杂度时间复杂度一、什么是时间复杂度二、具体实例1.大O的渐进表示法2.二分查找的时间复杂度 空间复杂度一、什么是空间复杂度二、具体实例总结 时间复杂度 一、什么是时间复杂度 在计算机科学中&…

字符串相加(力扣)

Problem: 415. 字符串相加 文章目录 思路Code复杂度运行结果 思路 创建一个StringBuilder对象使用append方法追加每位数字相加,使用双指针的方式,指针i,j分别指向num1和num2的每位数字,从后往前,进位用carry存储着。 …

什么是DevOps监控以及如何在组织中实施?

如今的软件开发商经常面临两大挑战——快速交付和大规模创新。DevOps通过在软件开发生命周期(SDLC)中引入自动化来开发和交付高质量的软件,从而帮助解决这些挑战。 持续集成(CI)/持续部署(CD)是DevOps实践中自动化的关键组件。它可以自动化代码构建、测试…

【UE4 塔防游戏系列】06-炮塔发射子弹攻击敌人

效果 步骤 1. 新建一个Actor蓝图类,命名为“TotalBulletsCategory”,用来表示子弹蓝图总类,后面会有很多不同类型的子弹会继承该类 打开“TotalBulletsCategory”,添加粒子系统组件、盒体碰撞组件和发射物移动组件 调整发射物重力…

GitHub上整理的一些实用的工具

1. Visual Studio Code 简称VScode,是一个轻量且强大的跨平台开源代码编辑器(IDE),支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装…

【明解STM32】一文读懂STM32芯片总线

目录 一、前言 二、总线基础知识概述 (1)、总线在芯片中的角色 (2)、总线的类型 (3)、总线的指标 (4)、AHB和APB 三、总线框架结构 (1)、结构类型 (2)、总线模块 (3)、总线交互 四、总结 一、前言 本篇介绍STM32芯片内部的总线系统结构,嵌入式芯片内部的…

Unity自定义后处理——Vignette暗角

大家好,我是阿赵。   继续说一下屏幕后处理的做法,这一期讲的是Vignette暗角效果。 一、Vignette效果介绍 Vignette暗角的效果可以给画面提供一个氛围,或者模拟一些特殊的效果。 还是拿这个角色作为底图 添加了Vignette效果后&#xff0…

网络安全(黑客)万字自学笔记

目录 特别声明: 一、前言 二、定义 三、分类 1.白帽黑客(White Hat Hacker) 2.黑帽黑客(Black Hat Hacker) 3.灰帽黑客(Gray Hat Hacker) 四、黑客文化 五、伦理问题 六、黑客的作用 …

论文--高通量田间植物表型:一种用于分割重叠植物的自监督序列CNN方法

Title: High-Throughput Field Plant Phenotyping: A Self-Supervised Sequential CNN Method to Segment Overlapping Plants Abstract: High-throughput plant phenotyping—the use of imaging and remote sensing to record plant growth dynamics—is becoming more wide…

为什么企业需要集中采购?

大多数企业在寻找合适的采购系统时都会遇到困难。尤其是大多数 CPO 和 CFO ,他们在集中采购系统与分散采购系统之间难以选择。如果你的企业尚未建立集中采购,那么将会失去集中采购系统所能实现的杠杆定价。 什么是集中采购? 集中采购可定义…

cookie 生命周期和cookie有效路径超级详细讲解

文章目录 cookie 生命周期和cookie有效路径超级详细讲解cookie 生命周期介绍代码示例完成测试 , 注意抓包看数据 cookie 有效路径有效路径规则规则如下:代码示例完成测试 , 注意抓包看创建 Cookie 时,返回的数据完成测试 , 注意抓包看读取 Cookie 时,返回的数据 代码示例html页…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

Failed to start File System Cehck on Root Device

偶遇服务器异常断电,Ubuntu后无法启动,出现如标题所示提示信息,详细内容出下图: 解决办法:将系统磁盘更换至另一台Ubuntu服务器中,对sda3分区中的ubuntu--vg-root分区进行修复后即可,操作内容如…

【UE4 塔防游戏系列】08-敌人到达终点对玩家造成伤害

目录 效果 步骤 一、敌人到终点时扣除玩家生命值 二、显示玩家生命值 效果 可以看到敌人进入终点后,左上角的玩家生命值会减少。 步骤 一、敌人到终点时扣除玩家生命值 新建一个Actor蓝图类,命名为“BP_EnemyEndPlace”,用来表示终点…

(学习笔记)TCP基础知识

什么是TCP? TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一定是[一对一]才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论网络链路中出现了…

spring复习:(38)ProxyFactoryBean中使用jdk动态代理生成代理对象时,业务方法调用时的执行流程

当调用代理对象的业务方法时,会直接执行JdkDynamicAopProxy类的invoke方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object oldProxy null;boolean setProxyContext false;TargetSource targetSource this.advised…

Matter初探

这是运行gn_build.sh之后输出的日志 Script started on 2023-07-17 09:39:460800 ]0;userubuntu: ~/Matter/connectedhomeip[01;32muserubuntu[00m:[01;34m~/Matter/connectedhomeip[00m$ source gn_build.sh [0;33m.--------------------------------[0m [0;33m-- Environmen…