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

news2024/11/27 12:55:28

文章目录

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

本篇解析的主要是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.coloradmin.cn/o/1556912.html

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

相关文章

启信宝商业大数据助力全国经济普查

近日,合合信息旗下启信宝收到中国青年创业就业基金会感谢信,对启信宝协同助力全国经济普查和服务青年创业就业研究表达感谢。 第五次全国经济普查是新时代新征程上一次重大国情国力调查,是对国民经济“全面体检”和“集中盘点”,…

Solo 开发者周刊 (第9期):Dawwin首位人工智能编程师或将改变未来?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿,每周五发布。在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解。本杂志开源,欢迎投稿。 好文推荐 Dawwin首位人工智能编程师&#…

综合实验配置

1,配置IP地址 R1: [R1]dis ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 192.168.1.254/24 up up Serial4/0/0 15.1.1…

OpenHarmony OpenCV应用样例开发

背景 OpenCV 介绍 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的 C 函数和少量 C 类构成,同时提供 Python、Java 和 MATLAB 等语言的接口,实现了图像处理和计算机视觉方面…

四轴飞行器玩具软件技术服务

广东四轴飞行器玩具软件技术服务。 东莞市酷得智能科技有限公司成立于广东省东莞市松山湖高新产业园区,我们专注于电子类方案开发设计,提供多类型的IC采购服务。 酷得的益智玩具软件方案定制服务旨在为客户提供一站式的解决方案,帮助其在竞争…

【AcWing】蓝桥杯集训每日一题Day9|区间合并|1343.挤牛奶(C++)

1343.挤牛奶 1343. 挤牛奶 - AcWing题库难度:简单时/空限制:1s / 64MB总通过数:4627总尝试数:13242来源:usaco training 1.3算法标签区间合并差分 题目内容 每天早上 5 点,三名农夫去牛场给奶牛们挤奶。 …

ROS 2边学边练(6)-- 何为参数(parameters)

概念 这一知识点,应该很好理解,参数就是节点的属性,比如猫科动物,它所拥有的属性(参数)有胡子、能伸缩的爪子、随光线缩放自如的瞳孔、夜视能力、优秀的弹跳力、萌等等。ROS节点中参数支持的数据类型有整型…

分治实现快速排序和归并排序

本文用于记录个人算法竞赛学习,仅供参考 一.快速排序(升序为例) 思想:确定分界点x,将小于分界点的值放在分界点的左边,将大于分界定的值放在分界点的右边,再递归处理两边的左右区间。 步骤&am…

1、Cocos Creator 基础入门

目录 Cocos Creator 是什么? 语言支持 功能特性 工作流程 功能模块 相关游戏 参考 Cocos Creator 是什么? Cocos Creator 既是一款高效、轻量、免费开源的跨平台 2D&3D 图形引擎,也是一个实时 2D&3D 数字内容创作平台。拥有…

Java研学-SpringBoot(四)

六 SpringBoot 项目搭建 1 创建项目 spring2.X版本在2023年11月24日停止维护&#xff0c;而Spring3.X版本不支持JDK8&#xff0c;JDK11&#xff0c;最低支持JDK17&#xff0c;目前阿里云还是支持创建Spring2.X版本的项目 2 修改所需依赖版本 – pom <?xml version&quo…

从0开始打架基于VUE的前端项目

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(@vue/cli 5.0.8) ,参考(https://cli.vuejs.org/zh/)vue版本(2.7.16),vue2的最后一个版本初始化项目 创建一个git项目(可以去gitee/github上创建),注意创建一个空项目创建项目vue create mvp-admin-vue-ui删除自己创建的gi…

如何制作Word模板并用Java导出自定义的内容

1前言 在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。 2制作word模板 2.1 新建word文档 新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。…

50 基于 provide/inject 属性的模型视图不同步问题

前言 这是一个之前 2023年12月月底碰到的一个问题 这个问题还是 比较复杂, 呵呵 这个在当时 看来 我甚至觉得 我可能搞不定这个问题 但是 当时出现了一些 其他的可以临时解决这个问题的方式, 因此 当时就没有深究 然后 过了两天 重新复现了一下 问题, 重新看了一下 这个问题…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

CVE-2023-38408漏洞修复 - 升级openssl和openssh

CVE-2023-38408 OpenSSH 代码问题漏洞修复 - 升级openssl和openssh ※ 重要说明&#xff1a; 1、升级后会导致无法用ssh远程登录&#xff0c;提示“Permission denied, please try again.” 2、解决方案请查看本章节【三、解决升级后无法用ssh远程登录】 目录 CVE-2023-38408 O…

集合(ArrayList,HashMap,HashSet)详解+ entrySet的应用

集合 例题引入——直线题意分析根据下面的参考代码&#xff0c;自己模仿的参考代码&#xff08;加一点点我的小tips&#xff09; 1.java集合引入2.为什么要使用集合&#xff1f;3.List、Set、Queue和Map的区别4.ListList——ArrayList&#xff08;&#xff01;&#xff01;实用…

武汉星起航:跨境电商获各大企业鼎力支持,共筑繁荣生态

随着全球化和数字化的深入发展&#xff0c;跨境电商行业逐渐成为连接国内外市场的重要桥梁。在这一进程中&#xff0c;各大企业纷纷加大对跨境电商行业的支持力度&#xff0c;通过投资、合作与创新&#xff0c;共同推动行业的繁荣与发展。武汉星起航将探讨各大企业对跨境电商行…

图片标注编辑平台搭建系列教程(6)——fabric渲染原理

原理 fabric的渲染步骤大致如下&#xff1a; 渲染前都设置背景图然后调用ctx.save()&#xff0c;存储画布的绘制状态参数然后调用每个object自身的渲染方法最后调用ctx.restore()&#xff0c;恢复画布的保存状态后处理&#xff0c;例如控制框的渲染等 值得注意的是&#xff0…

Verilog语法之case语句学习

case分支语句是一种实现多路分支控制的分支语句。与使用if-else条件分支语句相比&#xff0c;采用case分支语句来实现多路控制会变得更加的方便直观。 case分支语句通常用于对微处理器指令译码功能的描述以及对有限状态机的描述。Case分支语句有“case”、“casez”、“casex”…