当前位置: 首页 > news >正文

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协议中的确认超时时长应该不会超过“最大报文周期”,而重发的网络请求的传输时间也不超过“最大报文周期”,这样正常情况下,重发的请求在两个“最大报文周期”内应该能够到达客户端,客户端每次在收到服务端的“关闭请求”后又会重新开始计时两个“最大报文周期”,又会重复前面的过程。
这样,可以很大限度上保障服务端能收到一次确认包。(当然会有收不到的情况,所以应该会有别的超时机制来兜底。)

相关文章:

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

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。 四次挥手&…...

OceanBase X Flink 基于原生分布式数据库构建实时计算解决方案

摘要:本文整理自 OceanBase 架构师周跃跃,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 分布式数据库 OceanBase 关键技术解读 生态对接以及典型应用场景 OceanBase X Flink 在游戏行业实践 未来展望 点击…...

600V EasyPIM™ IGBT模块FB30R06W1E3、FB20R06W1E3B11、FB20R06W1E3降低了系统成本和损耗,可满足高能效要求。

EasyPIM™ IGBT模块是一种三相输入整流器PIM IGBT模块,采用TRENCHSTOP™ IGBT7、发射器控制7二极管和NTC/PressFIT技术。该模块具有增强的dv/dt可控性、改进的FWD软度、优化的开关损耗以及8μs短路稳定性。EasyPIM(功率集成模块)外形非常小巧…...

form 表单恢复初始数据

写表单的时候&#xff0c;想做到&#xff0c;某个操作时&#xff0c;表单恢复初始数据 this.$options.data().form form 是表单的对象 <template><div><el-dialog title"提示" :visible.sync"dialogVisible"><el-form :model"…...

MySQL—索引

这里写目录标题 索引是什么? 索引优缺点?MySQL索引类型索引底层实现? 为什么使用B树, 而不是B树, BST, AVL, 红黑树等等?什么是聚簇索引和非聚簇索引?非聚簇索引一定会回表吗?什么是联合索引?为什么需要注意联合索引中的字段顺序?什么是最左前缀原则?什么是前缀索引?…...

Android图形-合成与显示-概论

目录 引言 概念与理解 SurfaceFlinger Surface HWC Fence&#xff1a; Gralloc&#xff1a; DisplayDevice 引言 Activity是Android的主要UI相关组件。通过View的相关类和接口实现&#xff0c;在WMS的管理下&#xff0c;进行窗口和控件的测量&#xff0c;布局和绘制&am…...

Swift 5 数组如何获取集合的索引和对应的元素值

Swift 5 数组如何获取集合的索引和对应的元素值 在Swift 5中&#xff0c;你可以使用enumerated()方法来获取集合的索引和对应的元素值。这个方法会返回一个包含索引和元素的元组数组。以下是使用enumerated()方法来获取一个数组的索引和元素的示例&#xff1a; let array [1…...

计算 Nginx 日志的PV和UV

计算 Nginx 日志的 PV&#xff08;页面浏览量&#xff09;和 UV&#xff08;独立访客数&#xff09;&#xff0c;你需要使用一些工具和技术。 PV&#xff08;页面浏览量&#xff09;是指网站的所有页面被访问的总次数&#xff0c;而 UV&#xff08;独立访客数&#xff09;则是指…...

Spring中常用的注解

1.声明Bean的注解(标注在类上) Component&#xff1a;表示普通的组件&#xff0c;也可泛指下面三种组件。Controller&#xff1a;控制层。Service&#xff1a;业务逻辑层。Repository&#xff1a;数据访问层。 2.Bean的生命周期的注解 Scope表示设置Spring是如何创建Bean的…...

Plugin 插件

Plugin 插件 插件是 webpack 的支柱功能。插件目的在于解决 loader 无法实现的其他事。Webpack 提供很多开箱即用的插件。 常用插件 clean-webpack-plugin 自动清理输出目录 html-webpack-plugin 自动生成使用 bundle.js 的 HTML copy-webpack-plugin 拷贝文件到输出目…...

Structure needs cleaning fsimage文件系统损坏修复

最近清除数据的时候发现有些文件无法rm [rootnode101 application_1691504014432_0002]# rm -rf ls:* [rootnode101 application_1691504014432_0002]# ls ls: 无法访问flink-dist-cache-8f72398e-9254-42d4-a14d-a0def99b493d: Structure needs cleaning以下操作可能会删除文件…...

MATLAB|信号处理的Simulink搭建与研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

LinuxC编程——线程

目录 一、概念二、进程与线程的区别⭐⭐⭐三、线程资源四、函数接口4.1 线程创建4.2 线程退出4.3 线程回收4.3.1 阻塞回收4.3.2 非阻塞回收 4.4 pthread_create之传参4.5 练习 一、概念 是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 进程与线程都参与cpu的统一…...

使用fetch调用fastapi接口(post)的实例

前端代码 //定义函数 async function sendRequest(data) {let myurl"http://127.0.0.1:8848/get_student_info"const response await fetch(myurl, {method: POST,mode: cors, // 执行跨域请求headers: {Content-Type: application/json, },body: JSON.st…...

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…...

Django-------自定义命令

每次在启动Django服务之前&#xff0c;我们都会在终端运行python manage.py xxx的管理命令。其实我们还可以自定义管理命令&#xff0c;这对于执行独立的脚本或任务非常有用&#xff0c;比如清除缓存、导出用户邮件清单或发送邮件等等。 自定义的管理命令不仅可以通过manage.p…...

【Linux】在浏览器输入网址后发生了什么事情?

在浏览器输入网址后发生了什么事情&#xff1f; 1.域名解析2.建立TCP连接3.发出HTTP请求4.响应请求5.TCP断开连接6.解析资源和布局渲染 其实我们在浏览器输入网址后&#xff0c;发生了如下的事情 1.域名解析 由于计算机是无法识别我们输入的地址的&#xff0c;那么就需要将当前…...

推荐两本书《JavaRoadmap》、《JustCC》

《JavaRoadmap》 前言 本书的受众 如果你是一名有开发经验的程序员&#xff0c;对 Java 语言语法也有所了解&#xff0c;但是却一直觉得自己没有入门&#xff0c;那么希望这本书能帮你打通 Java 语言的任督二脉。 本书的定位 它不是一本大而全的书&#xff0c;而是一本打通、…...

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具&#xff0c;是Java方法级别的mock&#xff0c;操作就是监听指定方法&#xff0c;返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术&#xff0c;将原始方法…...

[HDLBits] Mt2015 q4b

Circuit B can be described by the following simulation waveform: Implement this circuit. module top_module ( input x, input y, output z );//001 100 010 111assign z(xy); endmodule...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...