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四. 内存泄漏…

超文本传输协议HTTP

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

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

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

Cookie/Session

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

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

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

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

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

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

【Qt】:信号与槽(二)

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

mysql安装遇到的问题

最近mysql安装遇到了许多问题 这个界面是下载器界面&#xff0c;reconfigure是重新配置这个版本&#xff0c;要新安装要点add 进入这个界面选择对应的版本下载

MySQL 数据库基础操作详解

文章目录 MySQL 数据库基础操作详解1. 基本概念2. 库的操作3. 表的操作4. 数据操作5. 示例示例一&#xff1a;创建表和插入数据示例二&#xff1a;查询数据示例三&#xff1a;更新数据示例四&#xff1a;删除数据 MySQL 数据库基础操作详解 MySQL 是一种常用的关系型数据库管理…

【目录整理】(五)

​​​​​Git 基础 Git 详细安装教程文章浏览阅读10w次&#xff0c;点赞9.6k次&#xff0c;收藏1.7w次。Git 是个免费的开源分布式版本控制系统&#xff0c;下载地址为git-scm.com 或者 gitforwindows.org&#xff0c;本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…

python电商结合双轨制

最近又重新整合翻看以前的数据&#xff0c;图片&#xff0c;绘画&#xff0c;还有各种编程代码&#xff0c;python,leetcode,还有关于商业方面的一些见解,想起了大学时候和同学们并肩作战&#xff0c;熬夜编码的时光。还有大数据&#xff0c;八爪鱼爬虫。 下面是我的手稿电商打…

算法学习——LeetCode力扣动态规划篇9

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

JavaSE day16笔记 - string

第十六天课堂笔记 学习任务 Comparable接口★★★★ 接口 : 功能的封装 > 一组操作规范 一个抽象方法 -> 某一个功能的封装多个抽象方法 -> 一组操作规范 接口与抽象类的区别 1本质不同 接口是功能的封装 , 具有什么功能 > 对象能干什么抽象类是事物本质的抽象 &…

2536. 子矩阵元素加 1

跳转题目 本题暴力可以做&#xff0c;猜到用差分&#xff0c;但是不熟&#xff0c;不知道二维差分怎么用&#xff0c;碰到用差分的题目太少了。 暴力算法&#xff1a; class Solution { public:vector<vector<int>> rangeAddQueries(int n, vector<vector<…

Docker 部署 FRP 内网穿透 实现端口映射

Frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 官网地址&#xff1a;https://github.com/fatedier/frp 准备工作…

数据结构算法刷题笔记——题型解法

数据结构算法刷题笔记——题型解法 一、常用容器1.1 vector1.1.1 vector基本操作1.1.1.0 头文件#include<vector>1.1.1.1 构造一个vector容器1.1.1.2 元素访问1.1.1.3 元素个数 .size()1.1.1.4 最大容量 .capacity()1.1.1.5 改变容器有效元素个数 .resize(n)1.1.1.6 改变…