TCP的“可靠性”(下)——三次握手四次挥手
目录
- 建立连接(三次握手)
- 为啥要进行握手??意义何在??
- 常见面试题:为啥必须是三次握手?
- 断开连接(四次挥手)
- 三次握手和四次挥手的相同点和不同点
- 连接过程中涉及到的TCP状态转换
上一篇【TCP的“可靠性”(上)-CSDN博客】我们用金角大王和银角大王的例子讲到了TCP的可靠性依靠了:确认应答、超时重传这两个机制。
TCP的可靠性还离不开三次握手四次挥手机制
连接管理(重点)
建立连接(三次握手)
建立连接: 客户端执行 :socket=new Socket(serberIp,serverPort)这个操作就是在建立连接
上述只是调用 socket API ,真正连接建立的过程,是在操作系统内核完成的
此处的连接是“虚拟的,抽象的”连接,目的是让通信双方都能保存对方的相关信息
第一次交互,一定是客户端主动发起的
所谓的syn是一个特殊的TCP数据报
1.没有载荷,是一个特殊的TCP数据报
2六个标志位中的第五位,为1
虽然syn不带有应用层载荷,但是也是会带有IP报头/以太网数据帧帧头…更会有TCP报头
TCP报头中就包含了客户端自己的端口
IP报头中就包含了客户端自己的IP(这个过程,也是客户端在告诉服务器 我是谁)
上述流程,是有四次交互,但是实际过程中,其中的两次交互,能够合二为一!最终就形成了 “三次握手”。
所谓的建立连接过程,本质上就是通信双方各自给对方发起一个 syn,各自给对方回应一个 ack。
(这里 客户端 的信息告知服务器
这个操作实际上在第一次握手的时候就完成了,但是最终确立出这个连接要建立,确立出后续要进行通信,还是得所有的流程都走完)
虽然第一次握手,客户端已经把自己的信息告诉服务器了,但是服务器具体是否要确定存储这个信息还得再观望。
两种可能性:
- 服务器同意了,服务器表示我也愿意和你建立连接
- 服务器没同意。(一般来说这种情况比较少见,就是出现服务器负载极高的情况下,服务器完全无法响应,客户端太多了) 没有下文了。
服务器收到 syn 之后,会返回 ack(确认应答)
语义就是:收到!!
接下来服务器还会再返回 syn,这个 syn 意思就是
我接收你的连接(我也愿意和你建立连接)
等到所有的握手环节完成,服务器才会最终保存客户端的相关信息。
上述的过程中,画了四次交互,实际上中间两次可以合并。
syn 就是第五位为 1
ack 就是第二位为 1
完全可以有一个数据包,第五位和第二位都是 1,此时这个数据包就同时起到了两个作用,既能够应答上个请求,也能发起 syn。
网络传输过程中要涉及到多次的封装和分用。 两个包就封装分用两次。合并成一个包,就可以减少一次封装分用的过程。
整体的效率就提升了,成本就降低了。
详细版本的三次握手:
为啥要进行握手??意义何在??
- 三次握手,可以先针对通信路径,进行投石问路,初步的确认一下通信链路是否畅通。(可靠性的前提条件)
- 三次握手,也是在验证通信双方,发送能力和接收能力是否正常。[关注点在两端]
- 三次握手的过程中也会协商一些必要的参数。
通信是客户端服务器两方的事情,要配合,其中的有些内容要保持一致
最少 0 字节
最多 40 字节(TCP 报头总长度最多 60,去掉前面固定的 20,还剩 40)
其中有一个信息是挺关键的,TCP 通信的序号,起始值。 TCP 一次通信过程中,序号不是从 0 或者从 1 开始计算的。
而是先选择一个比较大的数字,以这个数字开头来继续计算~~
即使是同一个客户端和服务器,每次连接,开始的序号都不同。设计 TCP 的大佬是这样考虑:避免出现一个情况——【前朝的剑,斩本朝的官】
【前朝的剑,斩本朝的官】:
第一次连接的过程中,传输的有一个数据包,在路上堵车了,迟迟没有到达对端。
等到终于到了对端的时候,已经改朝换代了,之前的连接早都没了,现在是新的连接了!!
此时,这份数据,就应该被丢弃!!
数据报时按照 ip + 端口进行识别的。 第一个连接,是用客户端 A 来连的,第二个连接用客户端 B
来连的。(恰好是同一个端口的话,客户端概率是比较低,服务器概率很大)此时数据到达这一边,早已物是人非,这个时候的话,再来进行处理这个数据就不合适了。 此时,丢弃这个数据包是一个上策。
如何识别出,当前的数据是 “前朝” 的数据包呢?? 就可以通过序号来区分!!
前朝的包,序号就会和本朝的包序号差异非常大,很容易一眼识别出来。
常见面试题:为啥必须是三次握手?
分四次握手,是否可以? 行,但是没必要。
分两次握手,是否可以? 肯定不行!!
服务器这边是无法确认自己的发送能力对端的接收能力是否正确的!!
服务器不知道这个结论,此时就缺少了 “可靠传输” 前提。
因此必须得客户端再来一次握手,把上述信息同步给服务器。
断开连接(四次挥手)
四次挥手是正常情况下,但是断开连接不一定非得是【四次挥手】
四次挥手,不一定非得是客户端先发 fin,服务器也可能先发 fin。 和三次握手不一样,三次握手,一定是客户端主动。
四次挥手能否像三次握手一样,把中间两次互动合二为一呢?
看情况
有的时候能合并,有的时候不能合并(不像三次握手,100%会合并)
如果实际通信过程中,ack 和第二个 fin 时间间隔比较长,此时就无法进行合并了,就分成两次来传输。
如果当前时间间隔很小,是有可能会合并的。 TCP 还有机制,延时应答和捎带应答。(后面我会再发一篇【TCP提高传输效率的机制】里面会讲)
三次握手和四次挥手的相同点和不同点
相似之处:
都是通信双方各自给对方发起一个 syn/fin,各自给对方返回 ack
数据传输的顺序,syn/ack/syn/ack, fin/ack/fin/ack
不同之处:
三次握手中间两次一定能合并,四次挥手则不一定。
三次握手,必须是客户端主动,四次挥手,客户端 / 服务器都可以主动。
连接过程中涉及到的TCP状态转换
在我的上一篇有讲:TCP连接过程中涉及到的状态转换-CSDN博客
客官请留步
我的其他TCP相关文章:初识TCP(编写回显服务器)
相关文章:
TCP的“可靠性”(下)——三次握手四次挥手
目录 建立连接(三次握手)为啥要进行握手??意义何在??常见面试题:为啥必须是三次握手? 断开连接(四次挥手)三次握手和四次挥手的相同点和不同点连接过程中涉及…...
【笔记2-5】ESP32:freertos消息队列
主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发…...
java操作doc(二)——java利用Aspose.Words动态创建自定义doc文档
有关java动态操作word文档,上一篇写了如何使用模板动态设置对于内容以及相关单元格的动态合并问题,详细请参看如下文档: java利用Aspose.Words操作Word动态模板文档并动态设置单元格合并 这篇文档说说,如何利用Aspose.Words动态…...
计算机光电成像理论基础
一、透过散射介质成像 1.1 光在散射介质中传输 光子携带物体信息并进行成像的过程是一个涉及光与物质相互作用的物理现象。这个过程可以分为几个步骤来理解: 1. **光的发射或反射**: - 自然界中的物体可以发射光(如太阳)&am…...
【Qt中实现屏幕录制】
在Qt中实现屏幕录制可以通过使用QScreen和QVideoEncoder类来完成。以下是一个简单的示例代码,演示如何捕获屏幕并将其保存为视频文件。请确保已经安装了Qt Multimedia模块,因为我们将使用其中的类来处理视频编码。 下面是一个基本的实现步骤:…...
repo仓库转移到自己本地的git服务器
前提条件:搭建好gitolite 以转移正点原子rk3568_linux工程为例子,将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...
java操作文件(一)——java如何实现多文件打包压缩并下载
在实际开发项目过程中,文件下载是异常频繁的操作,但是多文件zip打包下载并非常见使用场景,本文介绍如何使用io流操作多文件实现压缩并下载。 特别说明: 无需依赖任何第三方包或者拆件 一、效果展示: 1.打包前文件列…...
Git仓库移除文件的暂存和修改
在使用Git进行版本控制时,有时需要移除文件的暂存状态或者撤销对文件的修改。根据不同的需求和场景,可以采取不同的命令来完成这些操作。下面将详细介绍如何在Git中移除文件的暂存以及撤销文件的修改。 请注意,在执行这些命令之前࿰…...
Kube-Prometheus-Stack安装时初始化导入自定义Grafana dashboards
获取Grafana dashboards的JSON文件 这里是获取已经编辑好的Grafana dashboards的JSON文件;以便内置到Kube-Prometheus-Stack的helm charts的安装zip文件中。 编辑自定义dashboards JSON文件 获取dashboards JSON文件模板 其实Kube-Prometheus-Stack内部本身已经内…...
2024-12-05OpenCV高级-滤波与增强
OpenCV高级-滤波与增强 文章目录 OpenCV高级-滤波与增强1-OpenCV平滑滤波1. 均值滤波 (cv2.blur())2. 高斯滤波 (cv2.GaussianBlur())3. 中值滤波 (cv2.medianBlur())4. 双边滤波 (cv2.bilateralFilter())总结 2-OpenCV边缘检测1. Sobel算子 (cv2.Sobel())2. Canny边缘检测 (cv…...
taro小程序进入腾讯验证码
接入原因 昨天突然晚上有人刷我们公司的登录发送短信接口,紧急将小程序的验证码校验更新上去了 接下来就是我们的接入方法,其实很简单,不过有时候可能大家着急就没有仔细看文档,腾讯验证码文档微信小程序地址,注意这里…...
微信小程序怎么实现非tabbar页面显示tabbar,自定义组件实现
微信小程序没有发现可以实现非tabbar页面显示tabbar的方法,但是可以在tabbar页面当中隐藏tabbar,使用wx.hideTabBar()方法就可以实现,在非tabbar页面调用wx.showTabBar()方法却会显示失败,不能显示tabbar onLoad() {wx.showTabBar…...
001集—— 创建一个WPF项目 ——WPF应用程序入门 C#
本例为一个WPF应用(.NET FrameWork)。 首先创建一个项目 双击xaml文件 双击xaml文件进入如下界面,开始编写代码。 效果如下: 付代码: <Window x:Class"WpfDemoFW.MainWindow"xmlns"http://schema…...
【LeetCode: 316. 去除重复字母 + 栈 + 哈希表】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
基于Python的Selenium详细教程
一、PyCharm安装配置Selenium 本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术:Python、HTML、CSS、JavaScript 1.Seleium安装: 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…...
金仓KDTS迁移工具报错ERROR: 对访问方法 “btree“ 数据类型 unknown 没有默认的操作符表
ERROR: 对访问方法 "btree" 数据类型 unknown 没有默认的操作符表 查看错误日志 com.kingbase8.util.KSQLException: ERROR: 对访问方法 "btree" 数据类型 unknown 没有默认的操作符表Hint: 你必须指定一个操作符表给索引或定义一个默认的操作符表给数据…...
前端开发入门指南Day 17:TypeScript高级类型(泛型,类型守卫,Partial<T>和 Required<T>等)
泛型:代码的"变色龙" 🦎 为什么需要泛型? 想象一个快递员,每天要处理不同类型的包裹。如果为每种类型的包裹都写一套处理程序,那会很麻烦。泛型就像是一个"通用的包裹处理系统",它能…...
数据链路层(四)---PPP协议的工作状态
1 PPP链路的初始化 通过前面几章的学习,我们学了了PPP协议帧的格式以及组成,那么对于使用PPP协议的链路是怎么初始化的呢? 当用户拨号上网接入到ISP后,就建立起了一条个人用户到ISP的物理链路。这时,用户向ISP发送一…...
EasyNVR中HTTP-FLV协议无法播放怎么解决?
在科技日新月异的今天,摄像头作为公共安全领域的重要一环,其技术的不断提升正显著地改变着社会的安全格局。从最初的简单监控到如今的高清智能分析,我们可以对特定区域进行实时监控和记录,为社会的安全稳定提供了强有力的保障。 问…...
微服务监控prometheus+Grafana
目录 Prometheus 概述 核心组件 特点 使用场景 Grafana 概述 功能特点 使用场景 PrometheusGrafana组合 部署和配置 一、准备工作 二、部署Prometheus 三、部署Grafana 四、创建监控仪表盘 五、验证和调优 总结 微服务监控是确保微服务架构稳定运行的关键环节…...
C++编程:模拟实现CyberRT的DataVisitor和DataDispatcher
文章目录 0. 引言1. 设计概要1.1 主要组件1.2 类关系图1.3 工作流程 2. 代码实现2.1. 定义数据结构2.2. 实现 DataVisitor2.3. 实现 DataDispatcher2.4. 实现 Receiver2.5. 实现具体的 DataVisitor2.6. 示例主程序2.7. 编译和运行 0. 引言 使用 C 实现一个类似CyberRT 架构的 …...
TongRDS分布式内存数据缓存中间件
命令 优势 支持高达10亿级的数据缓冲,内存优化管理,避免GC性能劣化。 高并发系统设计,可充分利用多CPU资源实现并行处理。 数据采用key-value多索引方式存储,字段类型和长度可配置。 支持多台服务并行运行,服务之间可互…...
银河麒麟v4/v10 Ubuntu上添加服务过程-以编译postgressql数据库为例
1 首先联网安装依赖 apt-get install build-essential zlib1g-dev libssl-dev libreadline-dev libxml2-dev python-setuptools 2 下载安装包 下载地址:https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz 3 编译安装 mkdir -p /data/pgsql…...
电子商务人工智能指南 1/6 - 搜索、广告和发现
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...
JAVA面试基础(总结了很多)
最近帮整理了一份JAVA的面试基础,不过很基础后面还回继续更新。 java的专业技能 2.1 java的基础部分 2.1.1 简单讲一下java的跨平台原理 由于各操作系统(windows,liunx等)支持的指令集,不是完全一致的。就会让我们的程序在不同的操…...
PPT怎样做的更加精美
目录 PPT怎样做的更加精美 3D的GIF图片 3维空间图编辑 结果有明显的对比 阅读高质量文献,采用他们的图 PPT怎样做的更加精美 3D的GIF图片 3维空间图 结果有明显的对比...
postgresql与pgvector安装与使用
环境变量修改 打开 .bashrc 文件进行编辑: vim ~/.bashrc在文件的末尾添加上面的环境变量配置 # 添加 PostgreSQL 可执行文件路径到系统 PATH export PATH/home/....../pg/postgresql-12.4/bin:$PATH# 设置 PostgreSQL 数据目录 export PGDATA/home/....../pg/pos…...
Tomcat,javaweb, servlet , springBoot
在server.xml里配置服务器 <scope>provided</scope>打包的时候,这个jar包不会被打进去,因为tomcat已将封装了这个jar包,没必要要这个...
vue 通过 image-conversion 实现图片压缩
简介 vue项目中,上传图片时如果图片很大,通过 image-conversion 压缩到指定大小 1. 安装依赖 npm i image-conversion --save2. 引用 import * as imageConversion from image-conversion3. 使用 const newFile new Promise((resolve) > {// 压…...
自由学习记录(27)
event委托在类内可完全修改 (前提为该event在类中的声明为public,外部可访问,然后外部访问的时候不能直接改) 下面这段代码是在 类的内部 访问事件 void ClearAllListeners() {MyEvent null; }event 修饰的委托字段 在类内部没…...
MATLAB数学建模之画图汇总
MATLAB是一种强大的数学软件,广泛应用于工程计算、控制设计、信号处理等领域。在数学建模中,MATLAB的绘图功能可以帮助我们直观地展示数据和模型结果。 1. 二维数据曲线图 1.1 绘制二维曲线的基本函数 plot函数用于绘制二维平面上的线性坐标曲线图&am…...
UML箭线图的理解和实践
在软件开发的世界里,UML(统一建模语言)作为一种标准化的建模语言,扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具,它不仅能帮助开发者明确系统中的类及其关系,还能为后续的代码实现…...
最新AI问答创作运营系统(SparkAi系统),GPT-4.0/GPT-4o多模态模型+联网搜索提问+问答分析+AI绘画+管理后台系统
目录 一、人工智能 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复总结 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自…...
C#中的多态
多态(Polymorphism)是面向对象编程中的核心概念之一,它允许对象在不同的上下文中表现出不同的行为。简单来说,多态使得相同的方法调用可以表现出不同的行为,这使得代码更加灵活、可扩展和可维护。 在 C# 中࿰…...
【SQL】实战--组合两个表
题目描述 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主键(具有唯一值的列)…...
Unity 的介绍
Unity是一款功能强大的跨平台游戏开发引擎,以下是关于它的详细介绍: 一、概述 Unity由Unity Technologies公司开发,它提供了一个直观的开发环境,用于创建2D、3D游戏、模拟、虚拟现实(VR)、增强现实&#…...
深度学习的进展
深度学习新纪元 引言 你是否曾想过,为什么智能助手能理解你的指令,数字图像能够被准确分类,甚至疾病能被更早地诊断?这些现代奇迹背后都有一个共同的驱动力——深度学习。它不仅是当今人工智能领域的闪亮明星,更是一…...
vue中实现数字滚动效果
安装vue-count-to npm install vue-count-to引入 vue-count-to <template><div><count-to :start-val"startVal" :end-val"endVal" :duration"duration" :decimals"decimals" :separator"separator" :pref…...
Python的textwrap库:文本包装的艺术
目录 一、初识textwrap 二、textwrap的核心函数 1. fill 2. wrap 3. dedent 4. indent 5. shorten 三、高级用法与技巧 1. 处理特殊字符 2. 自定义断行逻辑 3. 自定义缩进和前缀 四、实战案例 五、总结 在Python编程中,处理文本是一项基础且常见的任务…...
linux 系列服务器 高并发下ulimit优化文档
系统输入 ulimit -a 结果如下 解除或提高 Linux 系统的最大进程数 在高并发场景中,合理设置 Linux 系统的最大进程数对于提升服务器性能至关重要。以下是具体步骤: 临时修改 ulimit 设置 可以通过 ulimit 命令临时调整当前会话的最大进程数。 查看当前…...
Spring03——基于xml的Spring应用
Spring开发中主要对Bean的配置 Bean的常用配置一览如下: Xml配置方式功能描述<bean id"" class"">Bean的id和全限定名配置<bean name"">通过name设置Bean的别名,通过别名也能直接获取到Bean实例<bean sc…...
IDEA 鼠标悬浮显示方法注释 javaDoc 及配置遇到的问题
方法详情: 鼠标悬浮时的效果: 设置方法: File -> Settings -> Editor -> Code Editing -> Quick Documentation,勾选红框中的选项 可能会遇到的问题: 如果不能选中,如下图 把下图的位置的选中项取消掉 选…...
openstack创建浮动IP全过程
1、创建外部网络,即是provider网络,有关provider网络的详细解释请参见我之前的文章openstack中的self-service和provider网络_openstack provider网络不能创建vlan吗-CSDN博客 network create --share --external --provider-physical-network physnet1…...
利用空闲主机进行Nmap隐匿扫描:IP伪造与空闲扫描技术
IP伪造与空闲扫描技术 在网络安全领域,扫描和识别目标主机的开放端口是攻击者获取目标信息的重要手段。传统的扫描方法可能会暴露扫描者的真实IP地址,从而引起目标主机的警觉。然而,IP地址伪造是一种巧妙的方式,可以帮助攻击者在…...
vue聊天对话语音消息播放动态特效
vue2写法,vue3也能用,粘之即走: 示例: <template><div class"voice-hidden"><divclass"voice-play-chat":class"[className, { animate-stop: !isPlaying }]"><div class&q…...
流媒体之linux下离线部署FFmpeg 和 SRS
前言 用户对网络做了限制,只能访问指定的网址,和没网没啥区别,导致无法连接外网,无法获取安装包,还有一些编译需要的开源工具 用户需要用平台查看库房的海康摄像头实时监控,只能在库房里一台纯净的ubantu…...
C/C++内存管理
1. C/C内存分布 我们先来看下面的一段代码和相关问题 const int a(此时an存放在栈上)char char2[] "abcd"(此时是在栈上创建5个char类型大小的数组,并让用常量字符串来初始化数组内的内容,*char2就是数组…...
xiaolin coding 图解 MySQL笔记——锁篇
1. 全局锁是怎么用的? flush tables with read lock 执行以后,整个数据库就处于只读状态了,这时其他线程执行对数据的增删改操作(insert、delete、update);对表结构的更改操作(alter table、dr…...
node.js实现分页和jwt鉴权机制
const express require(express); const jwt require(jsonwebtoken); const app express(); // 模拟数据库 const db { users: [ { id: 1, username: user1, email: user1example.com }, // ...更多用户 ], // ...其他数据模型 }; // 应用中间件 app.use(express.json…...
Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest
AndroidManifest.xml 配置文件中,对 activity 组件进行声明的时候,独立应用在 IDE 显示 intent-filter 报错,但不影响实际编译,因为是系统应用,肯定会有此 URL 的存在。 AOSP 源码: <activity android:…...