Linux:TCP协议的三次握手和四次挥手

文章目录

  • 三次握手
  • 四次挥手
  • 为什么要进行三次握手?
  • 三次握手也不安全

本篇解析的主要是TCP的三次握手和四次挥手的过程

三次握手

在这里插入图片描述
如图所示,在TCP要进行链接的时候,其实是要进行三次握手的

在这里插入图片描述

第一次握手是指,此时客户端要给服务器发送一个SYN的标记位,服务器收到这个标记位后,回返回客户端一个SYN和ACK,表示的是对于上一个报文的确认,同时SYN也表示服务端允许和客户端建立链接,那么接下来客户端继续给服务器发送ACK进行确认,此时就建立好了三次握手的过程

在建立好握手之后,之后进行数据传输的时候就只需要传一个数据,应答一次,传一个数据,应答一次

在这里插入图片描述
如何理解connect和accept呢?

在进行网络套接字的过程中,使用TCP协议就用过这两个函数,在客户端向服务端建立链接的时候,首先要调用connect来建立链接的请求,本质上就是会要求客户端构建一个SYN报文推送给服务端,那最终是否会成功呢?就会看的是connect的返回值

connect函数只是负责发起三次握手,至于对于三次握手的细节并不过多参与,这个握手的过程是由操作系统自主完成的,至于其中内部的细节,可以理解为在调用了connect之后,就进入了阻塞的状态,只有在我握手完成后才会返回establish,表示的是返回

第二个函数是accept,它叫做是获取链接,这个函数本身不参与三次握手,它只会把获取好的链接直接拿上来,如果底层没有建立好的链接,那么这个函数就会一直阻塞住,因此我们说,当通信的双方在经过三次握手之后,对应的操作系统的链接状态就会发生变化,这个就叫做是同步发送

此时如果要是服务端收到了一个SYN,那么就表示要进行同步,所以就会返回一个ACK的报文,只要收到了这个ACK的报文,对应的客户端就会再发出去一个ACK的报文,随之就会把状态更换为establish,表示已经建设完毕了,对于服务端来讲,只有第三个报文回来了,它才能进行establish,换句话说,双方建立establish的时间是有一定的时间差的,而同时客户端和服务端双方在进行三次握手期间对应的连接状态是会发生变化的,而这个状态的变化都是由操作系统本身来进行自主维护的

理解write和read

那之后再对于数据通信的时候,就涉及到了read和write的问题,如果read当中没有数据,那么就默认进行阻塞,本质上就是缓冲区当中没有数据

接下来就是最后一个状态,断开连接的状态

四次挥手

如果客户端和服务器此时已经建立好了链接,但是现在要进行断开连接了,那么该如何进行呢?

首先在要进行断开连接的时候,对应的应用层就要进行的是进程退出,具体的可以使用的是在上层调用对应的close来关闭链接,所以会在网络中发送一个FIN的报文,表示的是要进行断开连接了

但是TCP协议当中可以看出,建立链接必定是一方主动一方被动,然后进行三次握手,建立成功,那么反之对于断开连接呢?客户端说我要和你断开连接,就可以真的断开了吗?如果服务端还有信息要进行传递呢?所以在断开连接这个过程中,需要服务端也发送一个FIN的报文,表示我也没有什么要给你发送了,此时就发送一个FIN的报文,表示要和客户端断开连接了

在这里插入图片描述
TCP的通信是基于链接的,也就是说在TCP建立通信之前就要确认好链接,在断开连接之后此时也是需要进行四次挥手的,这都体现来了TCP的通信要给予链接

为什么要进行三次握手?

这个问题看似简单,实际上背后可描述的内容还是比较多的

在TCP进行建立链接的时候,真的是三次握手吗?其实这三次握手是算上捎带应答才是三次握手,同样的道理,在进行四次挥手的时候也是有捎带应答,才能被压缩为是四次挥手,本质上这种三次握手和四次挥手都是体现了这种一来一回的可靠性,将来如果要是进行发送消息,一端发消息一端收消息,本质上至少可靠的要给对方发送一次消息,对于客户端和服务端都是如此,两个方向的应答都要可靠,这个道理是比较朴素的

这里我再给出一个对应的理由:

1. 验证全双工

当客户端要给服务端发送一个报文的时候,无论是客户端还是服务端,在双方进行通信之前,都至少要保证进行过一次收和发的工作,由于是三次握手,所以能够可靠的保证客户端和服务端至少进行过一次收和发,这样的就代表的是,验证了通路是否顺畅,换句话说就是验证全双工

建立链接的本质,就是要测试网络状态是否适合通信,所以在双方进行三次握手的时候,就要保证通信的双方都能进行收合法的工作,否则就不能保证基于TCP协议的全双工来进行通信了

那此时可能会出现的问题是,两次握手难道不可以吗?问题在于,此时对于客户端来讲,两次握手确实可以保证它发了一个报文,收了一个报文,但是对于服务端来讲,只能验证它可以收报文,但是至于它发出去的报文对方能不能收到,这是无法进行保证的,所以说两次握手是不能保证全双工的

如果是一次握手呢?那就更不能验证了,所以最少是要进行三次握手,验证全双工

2. 奇数次握手,可以保证一般情况下握手失败的连接成本是嫁接在client端的

如果现在是一次握手,我们画出下面这张图:

在这里插入图片描述
如果客户端给服务端发送了一个SYN请求,那么服务端就会认为此时链接已经建立好了,那么服务端就会对应的创建维护链接的结构体,而创建链接的结构体是有成本的,换句话说就是会占据对应的内存资源,对应维护的这个链接,不管怎么样都会占据在这里消耗内存,那么假设服务端收到了大量的SYN请求,那么就会建立大量的没用的结构体对象,那么很容易就会出现内存被充满的情况

随之而来的就是可能会出现被攻击的现象,一次握手这样的场景有明显的逻辑漏洞,因此是不能被采纳的

为什么不是四次握手,五次握手甚至更多呢?

经过前面的验证,其实三次握手是验证全双工的最小次数,在验证可以了之后就不必进行额外的验证了,过多的验证反而会建立额外的链接,增加更多的成本

三次握手也不安全

即便是三次握手,也可能会出现漏洞,下面给出一个可能的例子

假设现在有一个服务器,如果存在恶意分子把一批特定群体的客户端,在他们内部植入对应的病毒信息,这些病毒就要求它们要在特定的时间向一个服务器发送请求,即便是正常的三次握手,也可能会把服务器的链接资源消耗结束,这种情况就叫做是肉机,问题就相当于TCP可以解决这样的问题吗?答案是不能的,TCP的三次握手只能保证在逻辑上没有出现明显的漏洞,而实际上也依然会存在一些问题,所以才会产生了有对应的网络安全的公司有防火墙这样的策略等等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI学习-Pandas数据处理分析

文章目录 1. Pandas概述2. Series用法2.1 Series的创建2.2 Series的取值2.3 Series的相关方法 3. DataFrame用法3.1 DataFrame创建3.2 DataFrame取值3.3 DataFrame相关方法 1. Pandas概述 ​ Pandas 是一个开源的数据分析处理库,它应用在数据科学、统计分析、机器学…

python中的deque详解

文章目录 摘要示例1:基本使用示例2:使用maxlen限制队列长度示例3:使用deque实现滑动窗口算法示例 4: 使用 deque 实现旋转数组示例 5: 使用 deque 实现最大/最小栈示例 6: 使用 deque 实现广度优先搜索(BFS) 摘要 deq…

力扣56. 合并区间

Problem: 56. 合并区间 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.将数组按内部的一维数组的第一项按从小到大的顺序排序; 2.创建二维结果数组merged,并将排序后的数组中的第一个一维度数组存入到merged中; 3.从后面的一…

理解游戏服务器架构-部署架构

目录 前言 我所理解的服务器架构 什么是否部署架构 部署架构的职责 进程业务职责 网络链接及通讯方式 与客户端的连接方式 服务器之间连接关系 数据落地以及一致性 数据库的选择 数据访问三级缓存 数据分片 读写分离 分布式数据处理 负载均衡 热更新 配置更新 …

express实现用户登录和注册接口

目录 1 创建数据库2 连接数据库3 集成ORM库4 创建业务逻辑5 创建路由7 测试接口总结 我们在编写后端接口的时候操作数据库是一种常见的功能需求,express本身并不提供直接操作数据库的能力,需要借助第三方库来操作数据库,本篇讲解一下软件开发…

【Java】LinkedList模拟实现

目录 整体框架IMyLinkedList接口IndexNotLegalException异常类MyLinkedList类成员变量(节点信息)addFirst(头插)addLast(尾插)在指定位置插入数据判断是否存在移除第一个相等的节点移除所有相等的节点链表的长度打印链表释放回收链表 整体框架 IMyLinkedList接口 这个接口用来…

2006-2023年2月各地级市城投债详细数据

2006-2023.2各地级市城投债详细数据 1、时间:2006-2023.2 2、来源:深圳证券交易所和上海证券交易所官网、人民银行、证券监督管理委员会等金融监管机构等官网 3、指标:省份、城市、证券代码、证券简称、债券简称、证券全称、债券初始面值单…

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…

使用pdf表单域填充pdf内容

需要引用如下包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency>1、预先准备一个pdf模板&#xff0c;并在指定位置添加…

创建一个vue3 + ts + vite 项目

vite 官网&#xff1a; https://cn.vitejs.dev/guide/ 兼容性注意 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 安装项目 1. 使用n…

政安晨:【Keras机器学习实践要点】(五)—— 通过子类化创建新层和模型

目录 介绍 安装 层级&#xff1a;状态&#xff08;权重&#xff09;与某些计算的组合 层可以有不可训练的重量 最佳实践&#xff1a;推迟权重的创建&#xff0c;直到输入的形状已知。 层可以递归组合 后端不可知层和特定后端层 add_loss()方法 可以选择在您的层上启用…

【DETR系列目标检测算法代码精讲】01 DETR算法01 DETR算法框架和网络结构介绍

为什么要有DETR 总所周知&#xff0c;传统的目标检测算法非常依赖于anchor和nms等手工设计操作&#xff0c;非常费时费力&#xff0c;自然而然的就产生了取消这些操作的想法。但是我们首先需要思考的是&#xff0c;为什么我们需要anchor和nms&#xff1f; 因为我们是没有指定…

3D汽车模型线上三维互动展示提供视觉盛宴

VR全景虚拟看车软件正在引领汽车展览行业迈向一个全新的时代&#xff0c;它不仅颠覆了传统展览的局限&#xff0c;还为参展者提供了前所未有的高效、便捷和互动体验。借助于尖端的vr虚拟现实技术、逼真的web3d开发、先进的云计算能力以及强大的大数据处理&#xff0c;这一在线展…

Docker Swarm安装部署应用

一、Docker Swarm核心概念 1、什么是Docker Swarm GitHub地址 Docker Swarm 是 Docker 官方推出的容器集群管理工具&#xff0c;基于 Go 语言实现。使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Docker Swarm 是生产…

Java线程池工作原理浅析

为什么要用线程池&#xff1f; 1、线程属于稀缺资源&#xff0c;它的创建会消耗大量系统资源 2、线程频繁地销毁&#xff0c;会频繁地触发GC机制&#xff0c;使系统性能降低 3、多线程并发执行缺乏统一的管理与监控 线程池的使用 线程池的创建使用可通过Executors类来完成…

【网站项目】泉文化管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Vue2(十二):Vuex环境搭建、Vuex工作原理、几个配置项、多组件共享数据、Vuex模块化

一、Vuex 1.概念 专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff08;use引入&#xff09;&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读&#xff0f;写&#xff09;&#xff0c;也是一种组件间通信的方式&…

String,StringBuffer,StringBuilder 的区别【大白话Java面试题】

String&#xff0c;StringBuffer&#xff0c;StringBuilder 的区别【大白话Java面试题】 大白话回答 1、可变/不可变类 String是不可变类。他被被final修饰&#xff0c;所以每一次的创建修改删除都要重新分配内存创建新的对象。 StringBuilder和StringBuffer是可变类&#xff…

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录&#xff0c;并且进行解压3. 配置文件/etc/profile&#xff0c;配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…

ssm框架笔记-maven

html是骨头 css使皮肤 js是你能做的动作 MAVEN 依赖管理&#xff1a;1.声明dependenciys标签 2.maven search3。 版本号提取 3.$引用 3.2依赖传递和冲突 依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B&#xff0c;而 B 又依赖于模块或库 C&#xff0c;那么 A 会间…