TCP连接为什么是三次握手,而不是两次和四次

news2025/2/25 16:32:52

答案

  • 阻止重复的历史连接
  • 同步初始序列号
  • 避免资源浪费

原因

阻止重复的历史连接(首要原因)

考虑这样一种情况:


客户端现在要给服务端建立连接,向服务端发送了一个SYN报文段(第一次握手),以表示请求服务端连接,但是该SYN报文段由于网络拥塞原因阻塞在了网络中迟迟没有到达服务端,故而在触发超时重传机制后,客户端又发生了一个新的SYN报文段给服务端以表示请求连接。

假如过了一段时间之后,旧的SYN报文段与新的SYN报文段都到达了服务端,此时服务端该如何区分新旧报文段,又或者说服务端该如何拒绝旧的SYN报文段而只响应新的SYN报文段呢(因为对新的连接请求进行响应才是客户端需要的,但是服务端该如何拒绝旧的响应)

接下来我们来针对这种情况进行分析,来说明三次握手为什么可以拒绝旧的历史请求(也就是上述所说的,旧的SYN报文段)

第一种情况

超时后client收到了旧的SYN报文段响应,但是新的SYN报文段已经发送了,此时client收到旧的SYN报文段响应,发现与期望的不对应(client期望收到新的SYN报文段ack,而不是旧的ack),于是向server发生一个RST报文段,目的是告诉server旧的SYN报文是错的,让server释放掉它

第二种情况

超时后,新旧SYN报文段都到达了server端,且client端并未收到server端的回复

此时由于第三次握手的存在,server端并不立即分配资源,而是发现新旧两个SYN报文段的seq序号是失序的(旧的seq是90,而新的seq是100),由于tcp在面对失序报文段情况下,只对连续收到的最新序号进行回应,因此server端将回复client一个序号为91的ack,同样client端收到这个ack序号时发现跟自己期望的不一样(期望的是101),于是给server发送一个RST,让server释放掉序号为91的SYN报文段。

由上可见,正是由于第三次握手的存在,使得sever端在收到旧的历史连接之后,得以不立即分配资源,且可以等待client的回复以发现这是一个旧的SYN,从而拒绝掉它。

反过来,假如只有两次握手,那么server端将无法得知client发送过来的两次连接请求到底哪一个才是client需要的。

同步初始序列号

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

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

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

避免资源浪费

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

如果客户端发送的 SYN 报文在网络中阻塞了,重复发送多次 SYN 报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。

为什么不是四次握手

上述提到,三次握手可以同步双方的初始序号,其实四次握手也可以,但是在四次握手的过程可以完全优化为三次握手,如下图所示,因此就成了三次握手

参考:

4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com)

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

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

相关文章

Oracle(2-10) User-Managed Backups

文章目录 一、基础知识1、Terminology 术语2、User-Managed Backup/Recovery 用户管理的备份/恢复3、Get DB File Information 获取数据库文件信息4、Consistent Whole DB Backup 一致的整个数据库备份冷备份热备份 二、基础操作1、查找需要备份的各种文件2、整备操作冷备份热备…

【Element-ui】Link 文字链接 与 Radio 单选框

文章目录 前言一、Link 文字链接1.1 基础用法1.2 禁用状态1.3 下划线1.4 图标 二、Radio 单选框2.1 基础用法2.2 禁用状态2.3 单选框组2.4 按钮样式2.5 带有边框2.6 Radio Eventsinput事件 2.7 Radio-group Attributes 总结 前言 在前端开发中,用户界面的元素设计和…

Certum SSL证书

为了确保在线交易的安全性,以及保护敏感信息免受网络威胁,使用SSL(Secure Socket Layer)证书成为了必要选择。其中,波兰认证机构Certum提供的SSL证书以其高度的安全性和可信赖性,得到了全球用户的广泛认可。…

基于运算放大器的电压采集电路

一、运算放大器 运放推导的两个重要概念:虚短、虚断。 1、差分放大器 以差分放大器为例进行推导分析。 虚断–运放的"-“端、”“端的引脚电流接近为0; 根据基尔霍夫电流定律可知:iR1iRF,iR2iR3; iR1(Ui1-(V-…

二分查找边界问题——排序数组找元素第一次出现和最后一次出现

二分查找的边界逼近问题: 下面的代码,第一个函数会向左边界逼近,第二个函数会像右边界逼近! 考虑left5,right6这种情况,如果5,6的值都是满足的条件的怎么办? 如果mid(leftright1)/2,…

Qt将打印信息输出到文件

将打印信息&#xff08;qDebug、qInfo、qWarning、qCritial等&#xff09;输出到指定文件来以实现简单的日志功能。 #include "mainwindow.h" #include <QApplication> #include <QLoggingCategory> #include <QMutex> #include <QDateTime>…

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.MySQL的主从复制 MySQL的主从复制是什么&#xff1f;MySQL主从复制是一种常见的…

Hdoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Java语法之字符串类型

String类 在Java中&#xff0c;使用String类定义字符串类型&#xff0c;如下&#xff1a; String s1"hello";System.out.println(s1); 字符串拼接 只要s1s2即可 在字符串中&#xff0c;如果俩个字符串进行相加&#xff0c;那他就是字符串拼接的意思 补充 如上&am…

Leetcode—704.二分查找【简单】

2023每日刷题&#xff08;四十七&#xff09; Leetcode—704.二分查找 实现代码 int lower_bound(int* arr, int numsSize, int tar) {int left 0, right numsSize;int mid left (right - left) / 2;while(left < right) {mid left (right - left) / 2;if(arr[mid] …

网页开发 JS基础

目录 JS概述 基本语法 数据类型内置方法 DOM对象 查找标签 绑定事件 操作标签 jQuery 查找标签 绑定事件 操作标签 Ajax请求 数据接口 前后端分离 ajax的使用 JS概述 一门弱类型的编程语言,属于基于对象和基于原型的脚本语言. 1 直接编写<script>console…

基于SpringBoot的旅游信息网【源码好优多】

简介 旅游信息网是一款介绍旅游相关内容的网站&#xff0c;分为前台和后台部分&#xff0c;其中前台用户注册以后可以浏览景点、景点详情、预订景点、酒店、车票、保险、以及浏览旅游攻略、个人信息修改、在线留言等&#xff0c;管理员在后台对景点、攻略、订单信息、酒店信息、…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、springboot分层架构、IDEA修改快捷键、vue代码风格

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、sp…

mysql手动事务

目录 &#x1f680;&#x1f680; 简要 手动事务使用案例 事务的特性 事务的隔离级别 脏读 不可重复读 幻读 查看事务隔离级别 设置隔离级别 &#x1fae1;&#x1fae1; 简要 mysq事务是自动提交的, 例如insert, update语句等 如下: 想要手动设置mysql事务就需…

SmartSoftHelp8,Web前端性能提升,js,css,html 优化压缩工具

Web前端js&#xff0c;css&#xff0c;html 优化压缩工具 提高web 前端性能&#xff0c;访问速度优化专业工具 CSS&#xff0c;js&#xff0c;html 单文件&#xff0c;多文件 单个&#xff0c;批量压缩优化 web前端优化&#xff1a;减少空格&#xff0c;体积压缩&#xff0…

一文通关物理机Ubuntu22.04融合部署OpenStack

前言 因为博主笔记本是amd的&#xff0c;就最近搞了个小主机&#xff0c;就想装个云平台玩玩&#xff0c;搞了三四天才正儿八经弄完&#xff0c;摸了一大堆错误出来&#xff0c;在文章前面我会将这些需要注意的点列举出来。 环境 物理环境&#xff1a; i5 12450H 32G内存 无线…

Windows微软常用运行库合集2023

微软常用运行库合集适用于Windows系统的运行库合集包&#xff0c;基于微软官方的运行库而制作的&#xff0c;包括了常用的vb&#xff0c;vc2005/2008/2010/2012/2013/2017/2019/2005-2022&#xff0c;Microsoft Universal C Runtime&#xff0c;VS 2010 Tools For Office Runti…

实用工具网站合集值得收藏![搜嗖工具箱]

最近一段时间有点忙&#xff0c;一直没有更新在此给大家说声抱歉哈&#xff0c;有些小伙伴儿私信说想要用到的工具&#xff0c;茶壶儿也会尽可能满足大家&#xff01;今天我们要分享的工具主要有以下几款&#xff0c;我们来一起看一下吧&#xff1f; 一帧秒创 https://aigc.y…

ctfhub技能树_web_web前置技能_HTTP

目录 一、HTTP协议 1.1、请求方式 1.2、302跳转 1.3、Cookie 1.4、基础认证 1.5、响应包源代码 一、HTTP协议 1.1、请求方式 注&#xff1a;HTTP协议中定义了八种请求方法。这八种都有&#xff1a;1、OPTIONS &#xff1a;返回服务器针对特定资源所支持的HTTP请求方法…

jsp 管理员登录界面与登录验证

验证分两种情况 &#xff0c;成功&#xff0c;进入管理员页&#xff0c;可以看信息和删记录 失败&#xff0c;直接给出登录失败&#xff0c;然后重新登录 login.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF…