TCP连接建立与释放连接——>三次握手和四次挥手

1.三次握手的概述

我们在学网络的概念时,每当讲到TCP都会听到三次握手和四次挥手,一直以来可能都对这个概念模糊不清,那么什么是三次握手和四次挥手呢?简单的举一个例子,如果我们和朋友打游戏,我们要和朋友往往都是连麦打游戏,那么我们和朋友之间需要相互确认我们都开麦了。这个过程我会发出一个信号说我开麦了,与此同时呢,朋友会确认他能够听到我的说话声,同时给我发一个信号,让我能够知道他开麦了,最后我也返回一个信号说好的我能听到你也开麦了。其实这个过程就与三次握手的过程类似,主要是进行一个测试的操作,对连麦进行一个测试,而不是在打游戏,可以说不涉及到核心业务的操作,不携带业务数据的数据报,只是用来“打个招呼”。这里的确认能听到就类似于TCP传输过程中的确认应答的特性,能够保证TCP的可靠传输,我们的相互回答就对应了TCP传输过程中的ACK标志位设置为1。

2.三次握手的讲解

三次握手就是建立连接的过程:其实就是通信双方,各自保存对端的信息

具体完成上述过程需要经过三次网络的交互。

这里 SYN代表同步报文,而ACK是应答报文。

三次握手的第一次,一定是由客户端先发起的,谁先发起谁就是客户端。

SYN数据报的一些作用

SYN数据报不携带任何业务数据。在网络通信中,SYN(Synchronize)是TCP三次握手中的第一步,用于建立TCP连接。SYN数据报仅包含TCP头部,用于在客户端和服务器之间进行连接的初始化。它不携带任何实际的业务数据,只包含一些必要的控制信息,如源端口、目的端口、序号等。SYN数据报的目的是在发送端和接收端之间同步序号和其他连接参数,以确保双方能够正确地建立连接并开始数据传输。一旦建立了连接,后续的数据传输将使用带有有效业务数据的数据报。因此,SYN数据报本身不携带任何业务数据。 

实质上三次握手第二步合并了客户端所发来的信息,本来是四次传输,但是三次传输能带来更高的效率,因此把接收方的回复合并在一起。而我也用一个暗恋对象的例子帮助大家理解这个过程

 

这真是个悲伤的故事😭

 总结:三次握手的时候,通信双方让各自对方保存好自己的信息,得是两边都把对方的信息保存好,连接才算是真正建立完成!而上述操作其实就是把第二步的ACK和SYN合并成一个网络数据!三次握手相当于投石问路,在正式传输业务数据之前,先确认一下通信链路是否畅通。相当于TCP可靠传输的一种保证方式,但是这只是辅助机制,最核心的还是确认应答和超时重传。与此同时,TCP三次握手的过程中,还需要协商一些必要的参数,比如说TCP通信时使用的序号,可能序号不是从0或1开始。发送序号还会有一个确认序号,这个确认序号和序号之间往往不会差很多,因为是一个连接过程,如果差的多说明出现了异常。

3.经典面试题

为什么TCP要进行三次握手?两次行不行,四次行不行?

两次:不行,因为服务器这边对于通信双方的发送能力和接收能力的验证还没有完成。

四次:行,但是没有必要,拆开中间的这次交互,虽然不影响TCP的正常功能,但是性能会有所损失。

如果在服务器这边见到了大量的CLOSE_WAIT状态说明了什么?说明代码大概率有bug了,代码很有可能忘记调用socket.close了 或则说socket.close调用的不够及时

4.TCP常见状态

Listen状态

listen:是服务器出现的状态,当服务器绑定端口成功后,就会进入到listen状态。这时候就意味着随时可以有客户端可以过来连接。这里类比接电话的过程,就是手机开机了,信号还不错,随时可以有人打电话过来了。

Established状态

Established:客户端喝服务器都会出现的状态,表示建立完成,可以随时进行后续的通信了。

CLOSE_WAIT状态

CLOSE_WAIT状态:被动一方进入的状态:等待代码调用close,代码中调用的越及时,越看不到这个状态。

5.四次挥手是为了释放资源

FIN结束报文就是finish的缩写。与三次握手不一样的是,三次握手一定是客户端第一次发起请求,而四次挥手就不一定了,有可能是客户端发起,也有可能是服务器发起请求。类比来说,谈恋爱之前,一般男追女,分手的时候双方都有可能提出。断开连接是客户端和服务器通信双方删除对方的信息。在实际的代码中,客户端可以调用socket.close方法或者客户端进程结束。

6. ACK、SYN、FIN和RST标识位

下面是对ACK、SYN、FIN和RST这些TCP标志的作用的简要总结:

  • ACK(Acknowledgment):用于确认接收方已经成功接收到数据。ACK标志在数据包中被设置为1时,表示该数据包是一个确认数据包,用于确认对方发送的数据已经成功接收。

  • SYN(Synchronize):用于建立连接的同步标志。当客户端希望与服务器建立连接时,它会发送一个带有SYN标志的数据包,其中包含自己选择的初始序列号。这样可以告知服务器客户端的初始序列号,并请求服务器分配自己的序列号。

  • FIN(Finish):用于结束连接的标志。当一方希望关闭连接时,它会发送一个带有FIN标志的数据包,表示它已经完成了数据传输,并要求对方确认关闭连接。

  • RST(Reset):用于重置连接的标志。当发生某种错误或异常情况时,一方可以发送一个带有RST标志的数据包,用于中断连接并强制对方重置连接。

这些TCP标志位在TCP协议中起着重要的作用,用于控制连接的建立、终止和异常情况处理。它们的正确使用和处理对于建立可靠的连接和确保数据传输的正确性至关重要。

 

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

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

相关文章

【class2】人工智能初步(自然语言处理)

要实现从评价中提取高频关键词,并判别其正负面性,其实是通过人工智能领域中的一个分支:自然语言处理。 在了解自然语言处理之前,我们先来说说,什么是自然语言(Natural Language)?自…

哔哩哔哩直播通用榜单系统

榜单系统的定位和业务价值 榜单遍布B站直播相关业务的各个角落,直播打赏、直播间互动、付费玩法、互动玩法、活动、主播PK、语聊房、人气主播排名、高价值用户排名、增值集卡、up主充电等等,在这众多的业务场景中,我们能看到各种各样的榜单。…

腐烂的橘子BFS

题目: 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子…

使用VSCode撰写Latex文档

参考资料: 如何使用VSCode编写Latex? 概要 先安装texlive,然后安装VSCode. 我这里步骤是全的,但说的不那么细。 只介绍VSCode中的配置方法。 VSCode配置步骤 1. 安装LaTex Workshop插件 2. 配置Latex编译环境 将下列配置粘入settings.j…

TNNLS:Fast Self-Supervised Clustering With Anchor Graph论文阅读

1 Abstract 由于避免了使用通常在现实世界中不足的标记样本,无监督学习被视为在聚类任务中的快速和强大策略。然而,直接从原始数据集进行聚类会导致高计算成本,这限制了其在大规模和高维问题上的应用。最近,基于锚点的理论被提出…

基于uniapp+vue3+ts小程序项目实战之项目初始化

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

长难句打卡5.14

This is now a question for Gloria Mackenzie, an 84-year-old widow who recently emerged from her small, tin-roofed house in Florida to collect the biggest undivided lottery jackpot in history. 翻译:这是84岁的孤寡老人歌莉娅 麦肯齐当前所面临的问题…

Linux系统搭建Gitlab开源仓库管理系统并实现公网环境访问本地私有库

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具&#xf…

geotrust ov泛域名证书2990

Geotrust是一家正规的CA证书颁发机构,致力于为个人以及企事业单位开发者提供安全可靠的数字证书产品,维护了个人博客网站、企业官网、商城网站以及银行等金融网站的数据安全,营造了一种健康的网络环境。今天就随SSL盾小编了解Geotrust旗下的O…

OSU micro-benchmarks安装测试指导

OSU micro-benchmarks安装测试指导 OSU micro-benchmarks工具介绍 OSU Micro benchmark工具是由Ohio State University提供的MPI(Message Passing Interface,消息传递接口)通信效率评测工具。该工具旨在通过执行不同模式的MPI操作&#xff…

linux fdisk 银河麒麟操作系统 v10 磁盘分区和挂载 详细教程

1查看 未加载的磁盘 fdisk -l 2 开始分区 fdisk /dev/vdb #查看分区 #新建分区和保存 3 格式化和挂载 fdisk -l mkfs.xfs /dev/vdb1 #查看uuid blkid /dev/vdb1 mkdir /data vi /etc/fstab UUID209daa-fb1c-48f2-bf5e-e63f38cb8a /data xfs defaults 0 0 #加载下 mo…

【bug记录】Vue3 Vant UI 中 van-popup 不弹出

原因:语法使用错误,使用了 Vue 2 的语法 Vue3语法: Vue2语法:

【JavaEE 初阶(六)】网络编程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多网络知识 目录 1.前言2.浅谈网络2.1基本知识2.2.OSI与TCP/IP 3.网络编程3.1TCP与UDP区别3.2UDP网路编程…

四川易点慧电商抖音小店:优势尽显,引领电商新潮流

在当下这个信息爆炸、消费模式日新月异的时代,电商行业正在经历一场前所未有的变革。四川易点慧电商抖音小店凭借其独特的优势,成功吸引了大量消费者的目光,成为电商领域的一股新势力。 四川易点慧电商抖音小店的最大优势在于其强大的品牌影…

Vue3实战笔记(19)—封装菜单组件

文章目录 前言一、封装左侧菜单导航组件二、使用步骤三、小彩蛋总结 前言 在Vue 3中封装一个左侧导航菜单组件是一项提升项目结构清晰度和代码可复用性的关键任务。这个过程不仅涉及组件的设计与实现,还需考虑其灵活性、易用性以及与Vue 3新特性的紧密结合。以下是…

如何恢复删除的文件?收好6个恢复策略!

“我经常在操作电脑时可能会有误删文件的情况发生,如果我不小心删除了重要的文件,应该使用什么方法来恢复它们呢?求解答!” 在使用电脑时,我们可能一个手滑就误删了重要的文件。当文件删除后,如果没有掌握相…

win10安装mysql8.0+汉化

一、官网安装 MySQL 1. 在mysql官网进行下载页面 2. 下滑页面,选择 MySQL community download 3.下载windows版本 4.选择第二个download 5.不用登陆,no thanks,just start my download. 6.下载 二、安装 1. 双击安装 2. 选 Full->next 3…

depcheck检查项目中未被使用的依赖

depcheck是一个用于分析项目中依赖项的工具,可以查看:每个依赖项是如何使用的,哪些依赖项是无用的,以及哪些依赖项在package.json 1、安装 npm install -g depcheck # 必须全局安装2、可配置文件.depcheckrc(不配置 直…

开源模型应用落地-CodeQwen模型小试-集成langchain(四)

一、前言 通过学习代码专家模型,开发人员可以获得高效、准确和个性化的代码支持。这不仅可以提高工作效率,还可以在不同的技术环境中简化软件开发工作流程。代码专家模型的引入将为开发人员带来更多的机会去关注创造性的编程任务,从而推动软件…

【轮转数组】力扣python

1.python切片 这里nums[:]代表列表 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)nums[:]nums[-k%n:]nums[:-k%n] 2.边pop边push 0代表插入的位置 class Solution:def rotate(self, nums: List[int], k: int) -> None:nlen(nums)fo…