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的三次握手只能保证在逻辑上没有出现明显的漏洞,而实际上也依然会存在一些问题,所以才会产生了有对应的网络安全的公司有防火墙这样的策略等等

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

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

相关文章

【Qt】QMainWindow

目录 一、概念 二、菜单栏 2.1 创建菜单栏 2.2 在菜单栏中添加菜单 2.3 创建菜单项 2.4 在菜单项之间添加分割线 三、工具栏 3.1 创建工具栏 3.2 设置停靠位置 3.3 设置浮动属性 3.4 设置移动属性 四、状态栏 4.1 状态栏的创建 4.2 显示实时消息 4.3 显示永久消…

Vue性能优化--gZip

一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器)必须共同支持gzip。目前主流的浏览器,Chro…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

python习题小练习(挑战全对)

1. (单选题)Python 3.0版本正式发布的时间? A. 1991B. 2000C. 2008D. 1989 2. (单选题)以下关于Python语言中“缩进”说法正确的是: A. 缩进在程序中长度统一且强制使用B. 缩进是非强制的,仅为了提高代码可读性C. 缩进可以用在任何语句之后…

超文本传输协议HTTP

HTTP协议 在网络通信中,我们可以自己进行定制协议,但是也有许多已经十分成熟的应用层协议,比如我们下面说的HTTP协议。 HTTP协议简介 HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一…

带你学习现代C++并发编程

通过对C并发编程的理解,我总结了相关的文档,有需要的可以关注我公众号,并给我留言! 这是目录

专升本-现代通信技术5G

现代通信技术 什么是通信: 人与人,人与自然之间通过某种行为或者媒体介质进行信息交流和传递 通信的基本要素: 信源 ----信道(噪音-干扰)-----信宿 通信技术是什么? 研究从信息的源头到信息的目的地整…

Cookie/Session

1.Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二…

创建数据库管理账户以及授权

一、创建数据酷管理账户命令 为了保障数据库系统的安全性,以及让 其他用户协同管理数据库,可以在MariaDB数据库管理系统中为他们创建多个专用的数据库管理账户,然后再分配合理的权限,以满足他们的工作需求. 使用root管理员 登录…

机器学习模型——SVM(支持向量机)

基本概念: Support Vector Machine (支持向量机): 支持向量:支持或支撑平面上把两类类别划分开来的超平面的向量点。 机:一个算法 SVM是基于统计学习理论的一种机器学习方法。简单地说,就是将数据单元…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起,想写两篇文章来拿个卷吧,今天也是又来写一篇博客了,也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.30 小闭…

Mybatis在SpringBoot中是如何被加载执行

首先依赖于springboot的自动装配EnableAutoConfiguration注解,这个注解最终帮助我们读取mybatis-spring-boot-autoconfigure-x.x.x.jar中的META-INF\spring.factories配置类: org.springframework.boot.autoconfigure.EnableAutoConfiguration\ org.myb…

Mysql数据库——阻塞语句查询与分析

目录 前言 阻塞语句查询与分析 Show Processlist——查看每个与数据库连接的session状态 非Sleeping状态进程数 执行时间较长进程号 查看当前运行的所有事务 当前锁 被blocking阻塞的事务数 数据库连接数 查看锁状态 正在被使用的表 前言 MySQL阻塞是指并发访问时&…

LInux|命令行参数|环境变量

LInux|命令行参数|环境变量 命令行参数main的参数之argc&#xff0c;argv几个小知识<font color#0099ff size 5 face"黑体">1.子进程默认能看到并访问父进程的数据<font color#4b0082 size 5 face"黑体">2.命令行创建的程序父进程都是bash 环…

微分方程错题本

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

【图像超分】论文精读:Image Super-Resolution Using Dense Skip Connections(SRDenseNet)

第一次来请先看这篇文章:【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等) 文章目录 前言Abstract1. Introduction2. Related work2.1. S…

解释TCP和UDP之间的区别

解释TCP和UDP之间的区别 TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种在网络中广泛使用的传输层协议&#xff0c;它们各自具有独特的特点和适用场景。下面将详细解释TCP和UDP之间的区别&#xff0c;并从多个维度进行对比。 连…

设计模式(4):建造者模式

一.场景 我们要建造一个复杂的产品,比如手机、电脑、汽车。这个复杂的产品的创建。有这样一个问题需要处理&#xff1a; 装配这些子组件是不是有个步骤问题&#xff1f; 实际开发中&#xff0c;我们所需要的对象构建时&#xff0c;也非常复杂&#xff0c;有很多步骤需要处理时…

【Qt】:信号与槽(二)

信号与槽 一.带参数的信号和槽二.信号与槽的多对多连接三.信号与槽的断开四.lamda表达式定义槽函数 一.带参数的信号和槽 Qt的信号和槽也⽀持带有参数,同时也可以⽀持重载.此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致.&#xff08;一致指的是类型一致&a…

【算法笔记】 树形DP算法总结

定义&#xff1a;树形DP也叫树状DP&#xff0c;即在树上进行的DP&#xff0c;是DP中较为复杂一类 1&#xff1a;主体 即like拓扑排序&#xff0c;从叶子节点向上更新其父节点&#xff0c;从而进行dp&#xff0c;确保先更新的子节点去更新其父节点&#xff0c;一般使用dfs形式…