【探索Linux】P.39(传输层 —— TCP的三次 “握手” 和四次 “挥手” )

在这里插入图片描述

阅读导航

  • 引言
  • 一、TCP的三次握手
    • 1. 简介
    • 2. 图解三次握手
    • 3. 名词解释
      • (1)SYN(同步序列编号)包
      • (2)SYN-ACK(同步确认)包
      • (3)ACK(确认)包
    • 4. 三次握手的步骤总结
    • 5. 为什么要三次握手,两次或者四次可以吗?
      • (1)为什么要三次握手?
        • ⭕防止旧的重复连接请求
        • ⭕确保连接的双向性
        • ⭕确保双方的初始序列号同步
        • ⭕避免不必要的连接建立和SYN洪泛攻击
      • (2)为什么两次握手不适用?
        • 🚩无法确认接收能力
        • 🚩无法防止重复连接
        • 🚩序列号同步问题
        • 🚩无法避免资源浪费
        • 🚩安全性问题
        • 🚩无法确认双方状态
      • (3)为什么四次或多次握手不适用?
        • 🍟效率降低
        • 🍟资源浪费
        • 🍟复杂性增加
        • 🍟无额外好处
  • 二、TCP的四次挥手
    • 1. 简介
    • 2. 图解四次挥手
    • 3. 名词解释
    • 4. 四次挥手的特点
    • 5. 为什么 TCP 关闭连接为什么要四次挥手而不是三次挥手?
  • 温馨提示

引言

在网络通信的世界里,TCP协议以其可靠性和效率而闻名。今天,我们将更进一步,揭开TCP协议中的两个核心过程:三次握手和四次挥手。这两个过程不仅确立了数据传输的开始和结束,而且确保了连接的稳定性和数据的有序交换。让我们开始这段探索之旅,深入了解TCP协议如何通过这三个简单的步骤来建立一个稳固的通信桥梁,以及如何通过四个优雅的步骤来优雅地结束通信会话。

一、TCP的三次握手

1. 简介

为了确保客户端与服务器之间能够建立一个稳定且可靠的连接,TCP协议在连接建立阶段实施了三次握手过程。这个过程至关重要,因为它通过三次交互来验证双方的发送和接收功能是否正常工作。简而言之,三次握手确保了以下两点:

  1. 客户端能够发送数据给服务器,并且服务器能够成功接收这些数据
  2. 服务器能够发送数据给客户端,并且客户端能够成功接收这些数据

通过这种确认机制,TCP协议能够建立一个双向通信的可靠通道,为数据传输的稳定性和效率打下基础。

✅举一个生活中的例子大家会更好理解一点,场景:小杨想要将一批文件递交给经理,于是发生了以下对话:

小杨:“经理,您现在有空吗?我这里有一些文件需要您审阅。”(这相当于TCP的第一次握手,小杨询问经理是否准备好接收文件。)

经理:“有空,我在办公室,你可以直接过来。”(这相当于TCP的第二次握手,经理确认自己已经准备好,并且告知小杨可以开始递交文件。)

小杨:“明白了,我马上过来。”(这相当于TCP的第三次握手,小杨确认了经理的回复,并告知自己即将开始递交文件的动作。)

通过这样的对话,双方确认了彼此都准备好进行文件的递交和接收,确保了信息的顺利传递。这个过程与TCP三次握手的原理相似,都是通过一系列的确认来建立一个可靠的通信过程。

2. 图解三次握手

在这里插入图片描述

3. 名词解释

(1)SYN(同步序列编号)包

⭕客户端选择一个初始序列号(ISN)并发送一个SYN包到服务器。这个包中,SYN标志位被设置为1,表示希望建立连接,同时客户端的ISN被发送给服务器。

(2)SYN-ACK(同步确认)包

⭕服务器接收到客户端的SYN包后,如果同意建立连接,会发送一个SYN-ACK包作为响应。服务器同样选择一个初始序列号,并在包中设置SYN和ACK标志位为1。ACK标志位表示这是一个对客户端SYN包的应答,并且包含了服务器的确认序列号(ACK),通常是客户端ISN加1。

(3)ACK(确认)包

⭕客户端接收到服务器的SYN-ACK包后,会发送一个ACK包来完成握手过程。这个包中,ACK标志位被设置为1,并且包含服务器ISN加1的确认序列号,表明客户端已经接收到并确认了服务器的SYN-ACK包。

4. 三次握手的步骤总结

  • 客户端 发送一个SYN包,告诉服务器:“我准备好了,你可以给我发送数据了。”
  • 服务器 收到SYN包后,回复一个SYN-ACK包,表示:“我准备好了,你可以给我发送数据了,这是我的初始序列号。”
  • 客户端 收到SYN-ACK包后,发送一个ACK包,表示:“我收到了你的初始序列号,现在我们可以开始通信了。”

5. 为什么要三次握手,两次或者四次可以吗?

(1)为什么要三次握手?

⭕防止旧的重复连接请求

如果网络延迟导致旧的连接请求在新的连接请求之后到达,三次握手可以确保旧的连接请求由于序列号不匹配而被忽略,从而避免建立不必要的连接。

⭕确保连接的双向性

三次握手确保了连接是双向的,即客户端可以向服务器发送数据,服务器也可以向客户端发送数据。

⭕确保双方的初始序列号同步

TCP通信依赖于数据包的序列号来保证数据的顺序和完整性。三次握手过程中,客户端和服务器交换初始序列号,确保双方对数据传输的起始点达成共识:

  • 序列号同步:通过三次握手,双方可以确认对方的序列号,保证数据传输的正确性和顺序性。
⭕避免不必要的连接建立和SYN洪泛攻击

TCP的三次握手还有助于避免不必要的连接建立,节约资源,并防止SYN洪泛攻击:

  • 资源节约:三次握手确保只有在双方都准备好时才建立连接,避免了因误判而创建的不必要连接。
  • 防止SYN洪泛攻击:通过确保连接请求的有效性,三次握手机制减少了服务器资源的不必要消耗,提高了安全性。

(2)为什么两次握手不适用?

两次握手不足以建立一个稳定和可靠的TCP连接,因为它不能确保双方的接收和发送能力,也不能有效防止重复连接和资源浪费,同时还增加了受到网络攻击的风险。

🚩无法确认接收能力
  • 在两次握手中,客户端发送SYN包以发起连接请求,服务器响应SYN-ACK包以确认接收到请求并准备好发送数据。然而,这个过程并没有给服务器一个机会来确认客户端是否已经准备好接收数据。
🚩无法防止重复连接
  • 如果客户端的连接请求因为网络延迟而没有及时到达服务器,客户端可能会重新发送一个SYN包。如果两次握手,服务器可能会对每个SYN包都建立一个连接,导致多个不必要的连接建立。
🚩序列号同步问题
  • TCP使用序列号来确保数据包的顺序和完整性。三次握手允许客户端和服务器交换各自的初始序列号,而两次握手则无法完成这一同步过程。
🚩无法避免资源浪费
  • 如果服务器在两次握手后开始发送数据,但客户端由于某些原因(如网络问题或客户端故障)未能接收到这些数据,服务器可能会浪费资源在无效的连接上。
🚩安全性问题
  • 两次握手可能使服务器更容易受到SYN洪泛攻击,攻击者可以发送大量的SYN包,使服务器创建大量半开放连接,消耗服务器资源。
🚩无法确认双方状态
  • 两次握手无法确保双方都处于活跃状态并准备好进行通信。三次握手提供了双方确认对方状态的机会。

(3)为什么四次或多次握手不适用?

🍟效率降低
  • 增加握手次数会延长连接建立的时间,导致通信效率降低。TCP协议追求的是快速建立连接并开始数据传输。
🍟资源浪费
  • 每次握手都需要消耗网络资源和处理能力。额外的握手会增加服务器和客户端的负载,尤其是在高并发场景下,这可能导致资源的不必要浪费。
🍟复杂性增加
  • 增加握手次数会使得协议更加复杂,这不仅增加了实现的难度,也增加了出错的可能性。
🍟无额外好处
  • 三次握手已经能够确保双方的接收和发送能力,以及序列号的同步,额外的握手步骤并不会带来额外的好处。

综上所述,TCP的三次握手是一个经过精心设计和优化的过程,它平衡了效率、可靠性和安全性,而四次或多次握手则会带来不必要的复杂性和资源消耗,没有明显的益处。

二、TCP的四次挥手

1. 简介

🚨建立TCP连接需要三次握手,终止TCP连接需要四次挥手,连接的终止通常需要四次握手,这个过程被称为TCP的"四次挥手"。

  1. 第一次挥手:主动关闭方(可以是客户端或服务器)发送一个FIN(结束)标志位被设置为1的TCP段,用来关闭主动方到被动方的数据传输。这表示主动方已经没有数据要发送了,但仍然可以接受数据。

  2. 第二次挥手:被动关闭方接收到FIN后,发送一个ACK(确认)标志位被设置为1的TCP段,作为对FIN的确认。这表示被动方已经知道主动方没有数据要发送了。

  3. 第三次挥手:被动关闭方发送一个FIN标志位被设置为1的TCP段,请求关闭其到主动方的数据传输。

  4. 第四次挥手:主动关闭方接收到这个FIN后,发送一个ACK标志位被设置为1的TCP段作为对被动方FIN的确认。至此,TCP连接被完全关闭。

在整个过程中,每个FIN和ACK都需要被对方确认,确保双方都清楚连接即将关闭。这个过程确保了TCP连接的可靠性和数据传输的完整性。四次挥手是TCP协议的一个重要特性,它允许双方在关闭连接时都能清楚地知道对方的意图,从而避免数据丢失或错误。

✅举一个生活中的例子大家会更好理解一点,场景:小杨已经将一批文件递交给经理准备辞职离开公司的时候,发生了以下对话:
小杨的辞职意向(第一次挥手):
小杨对经理说:“经理,这些文件的内容您也已经看完了,我决定离开公司。” 这相当于TCP连接中的主动方发送一个FIN(结束)标志位,表示小杨已经完成了他的工作,并且希望结束与公司的联系。

经理的初步回应(第二次挥手):
经理回答:“好的,我知道了,你离开吧。” 这相当于TCP连接中的被动方发送一个ACK(确认)标志位,表示经理已经收到了小杨的辞职意向,并同意结束当前的工作关系。

经理的再次考虑请求(第三次挥手):
经理随后说:“你不再考虑一下吗?” 这相当于TCP连接中的被动方发送另一个FIN标志位,表示经理希望重新评估当前的情况,可能是出于对小杨离职可能带来的影响的考虑。

小杨的最终决定(第四次挥手):
小杨坚定地回答:“我已经考虑好了。” 这相当于TCP连接中的主动方发送最后一个ACK标志位,表示小杨已经坚定了自己的决定,双方都同意结束工作关系,可以正式关闭连接。

2. 图解四次挥手

在这里插入图片描述
四次挥手的目的是确保双方都能完全接收到对方的数据,并且在双方都准备好关闭连接时,才正式关闭TCP连接。这个过程中,每个FIN都需要一个ACK作为确认,确保了连接的可靠关闭。

3. 名词解释

  1. 第一次挥手(FIN)

    • 客户端完成数据发送后,决定关闭连接,并向服务器发送一个FIN(结束)标志位被设置为1的TCP段。这表示客户端已经完成发送数据,请求关闭连接。
  2. 第二次挥手(ACK)

    • 服务器接收到客户端的FIN后,发送一个ACK(确认)标志位被设置为1的TCP段作为响应。这个ACK是对客户端FIN的确认,表示服务器已经知道客户端准备关闭连接。
  3. 第三次挥手(FIN)

    • 服务器在发送完剩余数据后,也决定关闭连接,向客户端发送一个自己的FIN标志位被设置为1的TCP段。这表示服务器也完成了数据发送,请求关闭连接。
  4. 第四次挥手(ACK)

    • 客户端接收到服务器的FIN后,发送最后一个ACK标志位被设置为1的TCP段作为响应。这个ACK是对服务器FIN的确认,表示客户端已经知道服务器准备关闭连接,并且双方都同意关闭连接。

4. 四次挥手的特点

  • 不同步关闭:客户端和服务器可以几乎同时开始关闭连接,但这不是必须的。一方可能在另一方发送FIN之前就已经准备好发送自己的FIN。

  • TIME_WAIT状态:在客户端发送最后一个ACK之后,它会进入TIME_WAIT状态,等待足够的时间以确保服务器接收到最终的ACK。这是为了防止服务器由于网络延迟而未能接收到最终的ACK,导致它重新发送FIN。

  • 半关闭状态:在服务器接收到客户端的FIN但还没有准备好发送自己的FIN时,连接会进入半关闭状态。在这种状态下,客户端已经不能发送数据,但服务器仍然可以发送数据。

5. 为什么 TCP 关闭连接为什么要四次挥手而不是三次挥手?

当TCP服务器接收到来自客户端的FIN(结束)报文段时,它可能还有剩余的数据需要发送给客户端。因此,服务器不能立即关闭连接。作为对客户端FIN报文的响应,服务器首先会发送一个ACK(确认)报文段,表示它已经接收到了客户端的关闭请求。

尽管已经开始关闭过程,服务器仍然可以继续向客户端发送任何剩余的数据。在所有待发送的数据都成功传输之后,服务器会向客户端发送自己的FIN报文段,这表明服务器已经完成数据传输,并准备关闭它的发送通道。

客户端接收到服务器的FIN报文后,会发送一个ACK报文作为应答,确认它已经接收到服务器的关闭请求。这个过程确保了客户端有机会接收和确认服务器发送的所有数据。

总结来说,TCP连接的关闭需要四次挥手,以确保数据的完整传输和确认,以及连接的有序关闭。这个过程允许服务器在关闭连接之前完成数据的发送,同时允许客户端确认接收到所有数据,并最终同意关闭连接。

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

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

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

相关文章

基于matlab的SVR回归模型

1 原理 SVR(Support Vector Regression)回归预测原理,基于支持向量机(SVM)的回归分支,其核心思想是通过寻找一个最优的超平面来进行回归预测,并处理非线性回归问题。以下是SVR回归预测原理的系统…

浪潮天启防火墙TQ2000远程配置方法SSL-V偏、L2xx 配置方法

前言 本次设置只针对配置V偏,其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行V偏配置。 其他配置可参考:浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

面试内容集合

用例设计方法 (一)等价类划分  常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理…

智慧校园毕业管理:全面解读毕业批次功能

在智慧校园的毕业管理系统中,毕业批次模块通过其精心设计的毕业批次功能,为即将离校的学子们提供了一个高效、便捷的过渡平台。这一特色功能聚焦于特定时间段内的毕业生群体,巧妙融合数字技术,从信息核实到最终的离校程序&#xf…

代码随想录二刷7.22|977.有序数组的平方

暴力解法: ——如果想暴力解决这个问题的话,可以像题目那样,先将每一个元素平方,然后再排序 双指针: ——从题目中找到的信息:这是一个非递减顺序的整数数组,从例子中,可以容易看…

西邮计科嵌入式复习

西邮嵌入式复习 一、第一章复习二、第二章复习三、第三章复习四、第四章复习 一、第一章复习 二、第二章复习 三、第三章复习 四、第四章复习

内网服务器通过squid代理访问外网

一、背景 现在要对172.16.58.158服务器进行openssh升级操作,我用之前写好的升级脚本执行后,发现没有备份旧的ssh程序文件,然后还卸载了oenssl-devel,然后我发现其他服务器ssh该服务器失败。同时脚本执行时报错“ configure: error: *** zlib.h missing - please install first …

无人驾驶大热,新能源汽车智能化中的算网支持

来源新华社:百度“萝卜快跑”全无人驾驶汽车行驶在路上 当前,新能源汽车产业数智化已成为全球汽车产业数字化转型的焦点。一方面,随着人工智能、大数据、云计算等技术的深度融合,新能源汽车在自动驾驶、智能互联、能源管理等方面…

xmind梳理测试点,根据这些测试点去写测试用例

基本流(冒烟用例必写) 备选流 公共测试点:

【题解】42. 接雨水(动态规划 预处理)

https://leetcode.cn/problems/trapping-rain-water/description/ class Solution { public:int trap(vector<int>& height) {int n height.size();// 预处理数组vector<int> lefts(n, 0);vector<int> rights(n, 0);// 预处理记录左侧最大值lefts[0] …

GuLi商城-商品服务-API-品牌管理-OSS前后联调测试上传

服务端签名直传 这种方式文件上传不用走自己的服务器了 zhouyimo.oss-cn-beijing.aliyuncs.com 后端启动: nacos: 虚拟机启动:里面mysql自动启动 前端项目启动:npm run dev 单文件上传和多文件上传地址都要改成自己的外网访问地址

Minio搭建文件服务器的学习

MinIO是一个高性能的开源对象存储服务器&#xff0c;与Amazon S3兼容。它使用Go语言编写&#xff0c;可以在多种操作系统上运行&#xff0c;如Linux、MacOS和Windows等。MinIO的分布式特性使其能够轻松扩展存储容量和处理能力&#xff0c;满足大规模数据存储的需求。 使用Docke…

展望未来:在【PyCharm】中结合【机器学习】实现高效的图形化处理

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言一、PyCharm简介与配置1.1 PyCharm基础1.2 图形化库配置 二、机器学习项目中的数据可视化2.1 数据加载与预处理2.2 数据探索性可视化2.3 模型训练与结果可视化 三、PyCharm中的图形化调试四、高级…

JAVASE 重点基础语法 - JAVA基础知识点复习(1)

目录 一&#xff0c;关键字 定义&#xff1a;被JAVA语言赋予了特殊的含义&#xff0c;来用来做专门用途的单词 关键字分类&#xff1a; 1&#xff0c;用于定义数据类型的关键字 2,用于定义流程控制的关键字 3,用于定义访问权限修饰符的关键字 4&#xff0c;用于定义类&am…

C++从入门到起飞之——缺省参数/函数重载/引用全方位剖析!

目录 1.缺省参数 2. 函数重载 3.引⽤ 3.1 引⽤的概念和定义 3.2 引⽤的特性 3.3 引⽤的使⽤ 3.4 const引⽤ 3.5 指针和引⽤的关系 4.完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ C从入门到起飞 个人格言&#xff1a;悟已往之不谏…

MySQL学习笔记 下

MySQL学习笔记&#xff08;需接上篇&#xff09; 1. 通配符 用于替换字符串中的一个或多个字符&#xff1b;通配符常与LIKE关键字一起使用&#xff0c;用于搜索字段中的指定模式&#xff1b; 2. 别名 用于为表或表中的列提供临时名称&#xff1b; 别名用于为表或表中的字段…

【安装记录】:安装破解 ideaIU-2024.1.4

1、官网下载安装包&#xff1a; https://www.jetbrains.com/idea/download/?sectionwindows 2、按照下图操作&#xff1a; 然后&#xff0c;自定义重启即可 3、破解参考这篇文章&#xff1a;https://www.exception.site/article/1727

【QT】窗口MainWindow

目录 窗口的组成 菜单栏 图形化创建菜单栏 代码创建菜单栏 给菜单设置快捷键 添加子菜单 添加分割线 添加图标 创建menuBar的细节 工具栏 设置工具栏出现的初始位置&#xff08;上下左右&#xff09; 设置工具栏允许停靠的位置 设置不允许浮动 设置不允许移动…

提高使用安全,智慧校园在线用户功能概述

智慧校园系统融入了一个查看当前在线用户的功能&#xff0c;这一设计旨在为管理人员提供一个实时的窗口&#xff0c;洞悉校园平台的即时活跃情况&#xff0c;确保系统的高效运作与环境安全。通过这一功能&#xff0c;管理员能够一目了然地看到所有正活跃在平台上的用户群体&…

J026_统计投票人数

一、需求描述 统计投票人数 某个班级80名学生&#xff0c;现在需要组织秋游活动&#xff0c;班长提供了4个景点依次是&#xff08;A、B、C、D&#xff09;&#xff0c;每个学生只能选择一个景点&#xff0c;请统计出最终哪个景点想去的人数最多。 二、代码实现 package com…