TCP三次握手、四次握手过程,以及原因分析

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。

三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

四次挥手:即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

首先,要明白握手的目的是什么
可以将TCP双向通信的过程,看成两个单向通信过程的组合:
一次 “请求连接——确认”操作,可以确保一方做好了发送准备,另一方做好了接收准备,因此可以建议一个单向的连接;
一次 “请求关闭——确认”操作,可以确保一方发完了数据希望关闭发送,另一方收到请求关闭接收,最后关闭掉一个单向的连接。

在建立连接时,是为了判断双方是否能够正常建立连接,即客户端—>服务端、服务端->客户端两个单向的收发都是正常的。

而在关闭连接时,是为了判断双方是否应该关闭连接,即客户端—>服务端、服务端->客户端两个单向的收发是否应该关闭。

在握手过程中,每一端自己当然清楚自己这边的状态,关键是从过程中判断对方的状态。

一、建立TCP连接:三次握手协议

在这里插入图片描述
客户端:我要对你讲话,你能听到吗;
服务端:我能听到;而且我也要对你讲话,你能听到吗;
客户端:我也能听到。
…….
互相开始通话

过程分析:
第一步,客户端向服务端发送请求;服务端收到了客户端请求,因此服务端可以判断: 客户端—>服务端单向收发正常。
第二步,服务端向客户端发送确认;客户端收到了确认,因此客户端可以判断:服务端正常收到了自己刚才的请求,所以, 客户端—>服务端单向收发正常、服务端—>客户端单向收发正常。于是客户端为连接分配相关资源,开始监听端口。     
第三步,客户端针对刚才收到的包发送确认;服务端收到了这个确认包,因此服务端可以判断: 客户端—>服务端单向收发正常、服务端—>客户端单向收发正常     于是服务端未连接分配相关资源,开始监听端口。

为何要分三步握手,而不能是两步握手?

其实在理想的网络环境下,只需要两次握手就行了,在上面第二步之后,客户端已经知道两个方向收到都是正常的了,它的确可以发送数据了。
但问题在于,网络环境并不总是理想的,在第一步客户端发送请求的过程有可能出现发送后迟迟收不到确认包而重发请求,如果之前已经过时的这个请求包真得彻底消散在网络传输中倒也罢了,但有时候它只是因为网络延迟到达服务端比较晚,过了一阵子时间后,可能又到达服务端了。如果这个旧的请求包到达的时间是在正常请求包到达之前,或者是在整个连接关闭之后才到达,那么服务端是无法判断这是过时请求的,服务端会正常发送确认,需要客户端来验明其过期的身份,然后告知服务端。
那么,如果是两次握手的话,一旦出现这种情况,服务端在第一步就会为连接分配资源,开始监听端口。但这是个过时的无效请求,客户端会抛弃掉,不会做对应的连接处理,也不会去发送数据。服务端会一直耗费资源傻等着。
如果是三次连接的话,多了客户端验证这一步,服务端能判断出这是一个无效请求,因此不会去做对应的资源分配。

在这里插入图片描述
SYN:该字段被设置为1(即true),表示请求建立连接
FIN:该字段被设置为1(即true),表示请求关闭连接
seq:该字段为请求序列号,譬如为seq=x, 能够标示一个请求包,在众多包种区分其身份
ack:该字段为确认字段,譬如ack=x+1,表示已经收到对方发来的seq=x的请求包。
客户端通过ack可以判断,当前确认包是针对哪个请求包在做确认。

二:关闭TCP连接:四次握手协议
客户端:我说完了,我要闭嘴了;
服务端:我收到请求,我要闭耳朵了;
(客户端收到这个确认,于是安心地闭嘴了。)
…….
服务端还没倾诉完自己的故事,于是继续唠唠叨叨向客户端说了半天,直到说完为止
…….
服务端:我说完了,我也要闭嘴了;
客户端:我收到请求,我要闭耳朵了;(事实上,客户端为了保证这个确认包成功送达,等待了两个最大报文生命周期后,才闭上耳朵。)
(服务端收到这个确认,于是安心地闭嘴了。)
(发送方之所以要收到确认后才关闭发送,是怕接收方没收到自己的请求,避免自己关闭了发送,而接收方还一直傻等着去接收。)
在这里插入图片描述
客户端收到请求包后,为什么要等待两个最大报文生命周期后,才闭上耳朵呢?
为了以防万一,因为最后一个发往服务端B的确认包有可能丢失,等待两个最大报文生命周期是为了尽可能保障服务端能够收到一次确认包,避免服务单始终处在等待关闭发送的状态。
分析:
一个“最大报文时长”是TCP数据包在网络中存在的最长时间,超过这个时间报文会被丢弃掉。
客户端每次在收到服务端的“关闭请求”后开始计时,服务端一旦超时收不到客户端的确认包就会重发请求,而TCP协议中的确认超时时长应该不会超过“最大报文周期”,而重发的网络请求的传输时间也不超过“最大报文周期”,这样正常情况下,重发的请求在两个“最大报文周期”内应该能够到达客户端,客户端每次在收到服务端的“关闭请求”后又会重新开始计时两个“最大报文周期”,又会重复前面的过程。
这样,可以很大限度上保障服务端能收到一次确认包。(当然会有收不到的情况,所以应该会有别的超时机制来兜底。)

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

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

相关文章

Mysql in 查询的奇怪方向

Mysql in 查询的奇怪方向 关于表字段存储的数据为 num1,num2,num3时, 还要通过多个num1,num2入参针对该字段进行查询 建表语句 CREATE TABLE test (test_ids varchar(100) DEFAULT NULL COMMENT 保存ids 以逗号分隔 ) ENGINEInnoDB;数据项 查询语句 SELECT test_ids FROM t…

dotNet 之数据库sqlite

Sqlite3是个特别好的本地数据库,体积小,无需安装,是写小控制台程序最佳数据库。NET Core是同样也是.NET 未来的方向。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 D…

一文详解 DolphinDB SQL 标准化

为了提升用户体验,降低用户学习成本和脚本迁移复杂度,自 1.30.17 / 2.00.5 版本开始,DolphinDB 逐步支持了标准化 SQL 的书写方法;并于 1.30.22 / 2.00.10 版本起,对标准 SQL 的常用语法和关键字实现了兼容。 1. 与标…

HIVE语法优化之Join优化

桶用两表关联字段,MapJoin时需要将小表填入内存,这时候,分桶就起到了作用 一个stage阶段代表一个mr执行,好几个MR,会吧每一个MR的结果都压缩 Mysql 慢查询 如果sql语句执行超过指定时间,定义该sql为慢查询,存储日志, 查问题: SQL日志,模拟慢SQL 然后查询执行计划 分组聚合 就…

2. 软件需求 面向对象分析

目录 1. 软件需求 1.1 需求分类 1.2 需求获取 1.3 需求分析 2. 面向对象分析(OOA) 2.1 统一建模语言 UML 2.2 用例模型 2.2.1 用例图的元素 2.2.2 识别参与者 2.2.3 合并需求获得用例 2.2.4 细化用例描述 2.3 分析模型 2.3.1 定义概念类 …

SpringBoot多环境切换及JSR303数据校验

多环境切换 profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境; 多配置文件 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版…

【历史上的今天】8 月 10 日:“龙芯”点亮操作系统;谷歌宣布拆分;计算机先驱诞生日

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 8 月 10 日,在 2010 年 5 月,苹果公司市值超过微软,成为全球市值最高的 IT 企业;在此过程中,苹果公…

云安全攻防(八)之 Docker Remote API 未授权访问逃逸

Docker Remote API 未授权访问逃逸 基础知识 Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以…

YOLOX:2021年超越YOLO系列

论文链接如下: ReadPaperhttps://readpaper.com/pdf-annotate/note?pdfId4558468783967051777eId740712499546066944 作者信息如下: 图1:YOLOX和其他最先进的物体探测器在移动设备上的精确模型的速度-精度权衡(上)和尺寸-精度曲线(下)。 …

2023企业数智化转型的正确打开方式是什么?他这样说(二)

哈喽~又见面了大家!上期我们说到了数据在数智化转型中的重要性,戳这里↓↓↓,一键直达 2023企业数智化转型的正确打开方式是什么?他这样说(一) 这期我们将从监控的角度进一步跟大家分享数智化转型&#x…

Java # Spring(2)

一、Spring事物 一、分类 编程式事物:代码中硬编码(不推荐使用) 声明式事物:配置文件中配置(推荐使用) 分类: 基于xml的声明式事物基于注解的声明式事物 二、隔离级别 ISOLATION_DEFAULT&…

Kubernetes集群部署

环境 > 192.168.50.53 k8s-master > 192.168.50.51 k8s-node1 > 192.168.50.50 k8s-node2 必须不能少于两核两G 所有主机共同操作 主机初始化配置 所有主机配置禁用防火墙和selinux [rootserver ~]# setenforce 0 [rootserver ~]# iptables -F [rootserver ~]…

LeetCode150道面试经典题--罗马数字转整数(简单)

目录 1.题目 2.示例 3.思路 4.案例代码(Java) 1.题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L …

java Spring Boot yml多环境配置

我们项目 线上和线下 环境配置不是特别一样 例如 运行的URL 数据库地址 数据库的账号密码 这些经常是不一样的 如果每次上线钱改 也不是特别方便 甚至可能忘记 那么 进入我们代码中 所谓的多环境 就是在不同的环境下配置不同的值 终端还是在application配置文件中 多环境的话…

一、Kubernetes介绍与集群架构

Kubernetes介绍与集群架构 一、认识容器编排工具 docker machine 主要用于准备docker host现已弃用建议使用docker desktop docker compose Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。…

电源控制--对数与db分贝

在控制理论中,"db"通常表示分贝(decibel)的缩写。分贝是一种用于度量信号强度、增益或衰减的单位。 在控制系统中,分贝常用于描述信号的增益或衰减。通常,增益以正数的分贝值表示,而衰减以负数的…

分布式定时任务框架Quartz总结和实践(1)

一、概述 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或…

营收、净利同比微增,喜临门品牌升级“临门一脚”?

8月8日晚,喜临门发布2023上半年业绩报告。根据财报,2023年上半年,喜临门营业收入约38.05亿元,同比增加5.53%;归属于上市公司股东的净利润约2.22亿元,同比增加1.2%。 如果仅从这份财报看,喜临门…

解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题

目录 1、问题: 2、报错: 3、解决方案: 1、问题: 循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。 此时会遇到以下问题: 2、报错: 当启动项目时&…

Python AI 绘画

Python AI 绘画 本文我们将为大家介绍如何基于一些开源的库来搭建一套自己的 AI 作图工具。 需要使用的开源库为 Stable Diffusion web UI,它是基于 Gradio 库的 Stable Diffusion 浏览器界面 Stable Diffusion web UI GitHub 地址:GitHub - AUTOMATI…