当前位置: 首页 > 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...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...