TCP 为什么是 3 次握手 4 次挥手?

news2024/12/15 4:17:10

前言:

TCP 的 3 次握手 4 次挥手是一个非常经典的问题,相信各位从事 Java 的朋友在职业生涯中没少被问到这个问题,本篇我们就展开分析一下 TCP 为什么是 3 次握手 4 次挥手。

TCP 协议

要搞清楚 TCP 为什么是 3 次握手 4 次挥手我们需要先搞清楚 TCP 协议,TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host(从一台主机发送数据给另外一台主机) 数据的可靠传输,支持全双工,是一个连接导向的协议。

TCP/IP 协议

我们上面提到了 TCP 协议提供 Host-To-Host 的数据可靠传输,也就是主机到主机的数据可靠传输,也可以说是从一台设备到另外一台设备,因为不仅仅是主机还有手机、平板等,所以说 TCP 是设备到设备之间的通讯协议,而设备是应用的载体,设备上安装了应用,例如微信、微博、百度等应用,因此 TCP 的上层是应用,而应用间有对应的传输协议,但应用需要依赖设备,因此需要用到设备的 TCP 协议,需要告诉 TCP 使用的是哪个应用,也就是对应的端口号。

TCP 要实现设备到设备的通讯,就需要知道设备的网络 IP 地址,但 TCP 协议不负责网络 IP 地址之间的数据传输,TCP 把网络地址之间的数据传输交给底层的网络层处理,网络层之间的通讯协议就是 IP 协议,网络层解决了解决了数据在两个网络 IP 地址之间的传输,但是网络层不处理数据在设备之间的传递,因此又有了数据链路层和物理层。

在这里插入图片描述

以上就是 TCP/IP 协议的 5 层模型。

TCP 协议的 3 次握手和 4 次挥手

TCP 协议的 3 次握手示意图如下:

在这里插入图片描述

我们来分析三次握手的过程,如下:

  • 第一次握手:客户端发送 SYN(Synchronization)信号给服务端,请求建立连接。
  • 第二次握手:服务端收到客户端的 SYN 信号后,响应客户端,同时服务端也发送一个 SYN 信号给客户端,这一步也叫 SYN-AKC(同步和确认),表示服务端准备好了并且也想和客户端建立连接。
  • 第三次握手:客户端收到服务端的 SYN 后,给服务端发送一个 ACK,表示自己也准备好了。

以上就是三次握手的过程。

为啥是 3 次握手?2 次握手可以吗?

我们从 3 次握手的作用来分析为什么需要三次握手,如下:

  • 第一次握手:客户端发送 SYN 到服务端,这可以证明客户端的发送能力是正常的。
  • 第二次握手:服务端发送 SYN 和 ACK 到客户端,到此时就可以证明客户端的发送能力、服务端的接受能力和发送能力是正常的。
  • 第三次握手:客户端响应 ACK 到服务端,证明客户端端的接受能力是正常的。
  • 我们发现只有经过三次握手,才可以证明客户端和服务端的发送接受能力都正常,只有客户端和服务端的发送接受能力都正常,才可以进行数据的可靠性传输。

假设只有两次握手会有什么情况?

如果只有两次握手,服务端无法确定客户端是否已经收到自己发送的报文,如果第二次握手报文丢失,那么客户端就无法知道服务端的初始序列号,那么 TCP 的可靠性就无从谈起了。

TCP 协议的 4 次挥手示意图如下:

在这里插入图片描述
我们来分析 4 次挥手的过程,如下:

  • 第一次挥手:客户端要求断开连接,发送一个断开的请求(FIN)。
  • 第二次挥手:服务端收到请求后,给客户端一个 ACK 信号,表示自己收到了客户端的断开信号。
  • 第三次挥手:服务端给客户端一个 FIN 信号,告诉客户端可以断开了。
  • 第四次挥手:客户端收到了服务端的 FIN 信号,再给服务端一个 ACK 信号。

以上就是四次挥手的全过程。

为啥需要四次挥手?可以三次挥手吗?

前面我们提到 TCP 协议是全双工的,客户端要求断开发送 FIN 后,服务端还可以向客户端发送数据,服务端收到客户端的 FIN 请求后,可能还有一些数据需要处理响应,因此不能马上向客户端响应 FIN,只能向客户端发送一个 ACK,等服务端把剩余的数据处理完成之后,再向客户端发送一个 FIN 信号,服务端需要知道客户端是否收到了自己发送的 FIN 信号,因此还需要客户端向服务端发送一个 ACK 信号。

总结:本篇简单分享了 TCP 协议的 3 次握手 4 次挥手,并从协议交互的层面上分析了为什么是 3 次握手 4 次挥手,希望可以帮助到有需要的小伙伴。

如有不正确的地方欢迎各位指出纠正。

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

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

相关文章

智能客户服务:科技赋能下的新体验

在当今这个数字化时代,客户服务已经不仅仅是简单的售后服务,它已竞争的关键要素之一。随着人工智能、大数据、云计算等技术的飞速发展,智能客户服务正逐步改变着传统的服务模式,为企业和消费者带来了前所未有的新体验。 一、智能客…

C++ 内存管理和模板与STL

此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…

深入理解 CSS 文本换行: overflow-wrap 和 word-break

前言 正常情况下,在固定宽度的盒子中的中文会自动换行。但是,当遇到非常长的英文单词或者很长的 URL 时,文本可能就不会自动换行,而会溢出所在容器。幸运的是,CSS 为我们提供了一些和文本换行相关的属性;今…

Polars数据聚合与旋转实战教程

在这篇博文中,我们的目标是解决数据爱好者提出的一个常见问题:如何有效地从Polars DataFrame中创建汇总视图,以便在不同时间段或类别之间轻松进行比较。我们将使用一个实际的数据集示例来探索实现这一目标的各种方法。 Polars简介 Polars 是…

STM32CUBEMX+STM32F4+IAP串口升级应用,亲测可用,带详解

一、IAP的基本概念 IAP,全名为in applacation programming,即在应用编程。 也就是在应用程序中升级。好处就太多了,比如远程在线升级,不用人到现场拆开,用烧写器连接升级。 实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程…

CTFHub 命令注入-综合练习(学习记录)

综合过滤练习 命令分隔符的绕过姿势 ; %0a %0d & 那我们使用%0a试试,发现ls命令被成功执行 /?ip127.0.0.1%0als 发现一个名为flag_is_here的文件夹和index.php的文件,那么我们还是使用cd命令进入到文件夹下 http://challenge-438c1c1fb670566b.sa…

深入探索 JVM:原理、机制与实战

一、JVM 概述 JVM(Java Virtual Machine)是 Java 程序运行的核心组件,它提供了一个独立于硬件和操作系统的执行环境,使得 Java 程序能够在不同平台上具有跨平台的特性。 JVM 主要由以下几部分组成: 类装载器&#xf…

视频推拉流EasyDSS无人机直播技术巡查焚烧、烟火情况

焚烧作为一种常见的废弃物处理方式,往往会对环境造成严重污染。因此,减少焚烧、推广绿色能源和循环经济成为重要措施。通过加强森林防灭火队伍能力建设与长效机制建立,各地努力减少因焚烧引发的森林火灾,保护生态环境。 巡察烟火…

挺详细的记录electron【V 33.2.0】打包vue3项目为可执行程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、直接看效果 二、具体步骤 1.安装配置electron 1.将 electron 包安装到应用的开发依赖中。 2.安装electron-packager依赖(打包可执行文件&#…

基本分页存储管理

一、实验目的 目的:熟悉并掌握基本分页存储管理的思想及其实现方法,熟悉并掌握基本分页存储管理的分配和回收方式。 任务:模拟实现基本分页存储管理方式下内存空间的分配和回收。 二、实验内容 1、实验内容 内存空间的初始化——可以由用户输…

Vue Web开发(五)

1. axios axios官方文档 异步库axios和mockjs模拟后端数据,axios是一个基于promise的HTTP库,使用npm i axios。在main.js中引入,需要绑定在Vue的prototype属性上,并重命名。   (1)main.js文件引用 imp…

论文概览 |《IJAEOG》2024.08 Vol.132(下)

本次给大家整理的是《International Journal of Applied Earth Observation and Geoinformation》杂志2024年08月第132期的论文的题目和摘要,一共包括88篇SCI论文!由于论文过多,我们将通过两篇文章进行介绍,本篇文章介绍第45--第8…

「数据结构详解·十五」树状数组

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步「数据结构…

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…

电机驱动模块L9110S详解

电机驱动模块是一种用于控制和驱动电机的设备&#xff0c;它能够将控制信号转化为适合电机操作的电流和电压。通过电机驱动模块&#xff0c;可以实现对电机的速度、方向等参数进行精确控制。 今天我们要介绍的 L9110S 电机驱动适合大学生、工程师、个人DIY、电子爱好者们学习和…

Unity 获取鼠标点击位置物体贴图颜色

实现 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) {textureCoord hit.textureCoord;textureCoord.x * textureMat.width;textureCoord.y * textureMat.height;textureColor textureMat.GetPixel(Mathf.Flo…

openlayers+vite+vue3实现在地图上画线(四)

在前几期实现离线地图初始化以及规划某一特定区域、打点、出现弹窗的基础上&#xff0c;本文主要阐述如何实现在所规划的区域地图上画线&#xff0c;如果你实现了打点的效果&#xff0c;其实这个相对来说还是算比较简单的&#xff0c;因为和打点的代码大差不差。使用openlayers…

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…

类与对象以及ES6的继承

认识class定义类 类的声明用的比较多 类与构造函数的异同 类的构造函数 类的实例方法 类的访问器方法 在类里面写拦截方法 类的静态方法 通过类名直接访问 es6类的继承-extends super关键字 子类可以重写父类方法包括父类的静态方法也可以继承父类的静态方法 babel可以将新的代…

通过IKE协商方式建立IPSec隧道

我们前面学习了H3C的IPsec VPN配置&#xff08;为什么IPsec两端内网的网段能不能重复&#xff1f;分明可以实现&#xff01;&#xff09;&#xff0c;学习了Juniper的IPsec VPN配置&#xff0c;学习了Windows的IPsec VPN配置&#xff08;配置Juniper虚墙vSRX基于策略的IPsec VP…