详解TCP的三次握手和四次挥手

文章目录

      • 1. TCP报文的头部结构
      • 2. 三次握手的原理与过程
        • 三次握手
        • 连接建立过程解析
      • 3. 四次挥手的原理与过程
        • 四次挥手
        • 连接关闭过程的解析
      • 4. 常见面试题


深入理解TCP连接:三次握手和四次挥手

在网络通信中,TCP(传输控制协议)扮演着重要的角色。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它在发送数据前,通信双方必须在彼此间建立一条连接。本文将深入探讨TCP连接的建立和断开过程,着重关注三次握手和四次挥手的原理和过程。

1. TCP报文的头部结构

在了解TCP连接之前,先来了解一下TCP报文的头部结构。TCP报文头部包含了多个字段,其中包括序号、确认序号、标志位等。这些字段在TCP连接的建立和断开过程中起着重要作用。
在这里插入图片描述

  • 序号(Seq Number):占32位,用于标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  • 确认序号(Ack Number):占32位,只有ACK标志位为1时,确认序号字段才有效。确认序号通常等于对方发送的序号加一,表示已经成功接收到了这个序号之前的所有数据。
  • 标志位:共6个,包括:
    • ACK:确认序号有效。
    • FIN:释放一个连接。
    • PSH:接收方应该尽快将这个报文交给应用层。
    • RST:重置连接。
    • SYN:发起一个新连接。
    • URG:紧急指针(urgent pointer)有效。

2. 三次握手的原理与过程

三次握手的本质是确认通信双方收发数据的能力首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。连接阶段通过三次握手建立,退出阶段通过四次挥手来关闭。

三次握手

举个栗子先吧

想象一下,有两位朋友,小明和小红,他们之间需要通过写信来进行交流。这个过程就像是建立TCP连接的三次握手。

  1. 第一次握手:小明发出邀请

    小明向小红写了一封信,表达了与她建立联系的意愿,并附上了自己的联系方式。这相当于客户端向服务器发送连接请求报文,带有一个序列号和请求信息,并携带了 SYN 标志。

  2. 第二次握手:小红确认邀

    小红收到了小明的信后,理解了他想要与她通信的意图,并写了回信给小明,确认了自己的联系方式,并附上了自己的联系方式。这封回信相当于服务器对客户端的回应,其中包含了确认信息和服务器的序列号,并带有 SYN 和 ACK 标志。

  3. 第三次握手:小明回复确认

    小明收到了小红的回信后,确认了小红的联系方式,并回复了一封信给小红,表明自己已经收到了小红的回信,并准备好开始正式的通信。这封回复信相当于客户端对服务器的确认,其中包含了确认信息,并带有 ACK 标志。

通过这样的三次交流,小明和小红建立了可靠的通信连接,并可以开始进行进一步的交流。

连接建立过程解析

img

在TCP连接建立的过程中,这三次握手实际上包含了以下步骤:

  1. 第一次握手:客户端发送连接请求

    客户端向服务器发送一个带有SYN标志的连接请求报文,其中包含了一个随机生成的序列号。

  2. 第二次握手:服务器确认连接请求

    服务器收到连接请求后,发送一个带有SYN和ACK标志的确认报文,其中包含了确认号(客户端序列号+1)和服务器自己的随机生成的序列号。

  3. 第三次握手:客户端确认连接

    客户端收到服务器的确认后,发送一个带有ACK标志的确认报文,其中包含了确认号(服务器序列号+1)。

通过这三次握手,客户端和服务器建立了可靠的通信连接,可以开始进行数据传输。

3. 四次挥手的原理与过程

在TCP(Transmission Control Protocol)连接中,四次挥手是用于关闭连接的过程。尽管这个过程相对于三次握手来说更为复杂,但通过详细的解析,我们可以更好地理解其中的每个步骤和顺序。

四次挥手

为了更好地理解TCP四次挥手的过程,我们可以用一个简单的比喻来解释:

想象一下,有两位朋友,小明和小红,他们之间通过书信往来进行交流。这个过程就像是TCP连接的四次挥手。

  1. 第一次挥手:小明发出告别

    当小明觉得与小红的交流结束时,他首先向小红发送一封告别信,表明自己不再需要继续通信。这封信中包含了一个**FIN**标志位,表示告知对方已经不会再发送数据了,以及一个序列号,表示最后一个已发送的数据的序列号。

  2. 第二次挥手:小红确认告别

    小红收到了小明的告别信后,确认了小明不再需要继续通信,并向小明回复了一封确认信,表示自己已经知道了小明的意图。这封确认信中包含了一个**ACK**标志位和一个确认号,确认了小明的序列号,并且也包含了小红自己的序列号。

  3. 第三次挥手:小红告别

    小红在确认了小明的告别后,也觉得不再需要继续通信,于是她向小明发送了一封告别信,表示自己不会再发送数据了。这封信中包含了一个**FIN**标志位和一个序列号,表示告知小明自己不会再发送数据了。

  4. 第四次挥手:小明确认告别

    小明收到小红的告别信后,确认了小红的意图,并向小红回复了一封确认信,表示自己已经知道了小红不再发送数据的意图。这封确认信中包含了一个**ACK**标志位和一个确认号,确认了小红的序列号,并且表示自己不会再发送数据了。

通过这四次挥手,小明和小红完成了通信的结束,彼此知道对方不再发送数据,并且关闭了连接。

连接关闭过程的解析

img

接下来,我们来详细分析每个步骤中的具体内容和顺序:

  1. 第一次挥手:客户端发送连接释放报文

    客户端在确定不再发送数据后,向服务器发送一个带有**FIN**标志的连接释放报文,其中包含了一个序列号,表示客户端最后一个已发送的数据的序列号。

  2. 第二次挥手:服务器确认连接释放报文

    服务器收到客户端发送的连接释放报文后,回复一个带有**ACK**和确认号的确认报文,表示已经收到了客户端的连接释放请求,并且确认了客户端的序列号。

  3. 第三次挥手:服务器发送连接释放报文

    服务器在确定不再发送数据后,向客户端发送一个带有**FIN**标志的连接释放报文,其中包含了一个序列号,表示服务器最后一个已发送的数据的序列号。

  4. 第四次挥手:客户端确认连接释放报文

    客户端收到服务器发送的连接释放报文后,回复一个带有**ACK**和确认号的确认报文,表示已经收到了服务器的连接释放请求,并且确认了服务器的序列号。

通过这四次挥手,客户端和服务器完成了连接的关闭,彼此确认不再发送数据,并且释放了连接资源。

4. 常见面试题

为什么TCP连接的时候是3次?2次不可以吗?

  • 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

为什么TCP连接的时候是3次,关闭的时候却是4次?

  • 因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

  • 这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

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

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

相关文章

人才推荐 | 材料化学博士,热衷于创新且可扩展的电池技术开发

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态,用科技解决职业领域问题,提升行业数字化服务水平,提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

java多线程——概述,创建方式及常用方法

前言: 学习到多线程了,整理下笔记,daydayup!!! 多线程 什么是线程 线程(Thread)是一个程序内部的一条执行流程。若程序只有一条执行流程,那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

【AIGC】如何在Windows/Linux上部署stable diffusion

文章目录 整体安装步骤windows10安装stable diffusion环境要求安装步骤注意事项参考博客其他事项安装显卡驱动安装cuda卸载cuda安装对应版本pytorch安装git上的python包Q&A linux安装stable diffusion安装anaconda安装cudagit 加速配置虚拟环境挂载oss(optional…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准,黑龙江日报报业集团主管主办,面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者,开展学术交流与研讨,汲取当今业界新鲜的…

RGB,深度图,点云和体素的相互转换记录

目录 1.RGBD2Point 1.2 步骤 2.Point2Voxel-Voxelization 2.1 原理 2.2 代码 3.Voxel2Point 4.Point2RGB 5.Voxel2RGB 1.RGBD2Point input:RGB D 内外惨 output:points cloud def depth2pcd(depth_img):"""深度图转点云数据图…

翻译 《The Old New Thing》 - Why is a registry file called a “hive“?

Why is a registry file called a “hive“?https://devblogs.microsoft.com/oldnewthing/20030808-00/?p42943 为什么注册表文件被称为‘蜂巢’? Raymond Chen 2003年8月8日 分享一个没用的知识: 话说有一位 Windows NT 的开发者十分讨厌蜜蜂。于是&a…

FLV流媒体封装格式

1、FLV 简介 FLV(Flash Video) 是 Adobe 公司推出的一种流媒体格式,由于其封装后的音视频文件体积小、封装简单等特点,非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用 FLV 格式封装的文件后缀为.flv。直播场景下拉流比较常见的是 http-…

计算机网络:现代通信的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

小白了解Pinia第2集 · 三大核心状态Getters、Actions以及Plugins 插件

三大核心状态 state 第1集有详细讲解:https://blog.csdn.net/qq_51463650/article/details/137137080?spm1001.2014.3001.5501 getters Getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个…

Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性

作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 8.13 的正式发布。 有什么新特性? 8.13 版本的三个最重要的组件包括 Elastic AI 助手中 Amazon Bedrock 支持的正式发布 (general availability - GA),新的向量…

汽车电子行业知识:什么是智能驾驶辅助系统(ADAS)

文章目录 1. 什么是智能驾驶辅助系统(ADAS)1.1 ADAS的功能1.2 ADAS的优势1.3 未来发展趋势 2. ADAS等级2.1. 0级驾驶辅助2.2. 1级驾驶辅助2.3. 2级驾驶辅助2.4. 3级驾驶辅助2.5. 4级和5级驾驶辅助 3. 智能车4. ADAS供应商 1. 什么是智能驾驶辅助系统&…

文章分享:协和文章《病原宏基因组高通量测序性能确认方案》

摘要:宏基因组学利用新一代高通量测序技术,以特定环境下病原体基因组为研究对象,在分析病原体多样性、种群结构、进化关系的基础上,进一步探究病原体的群体功能活性、相互作用及其与环境之间的关系,发掘潜在的生物学意…

STM32之HAL开发——串口配置(CubeMX)

串口引脚初始化(CubeMX) 选择RCC时钟来源 选择时钟频率,配置为最高频率72MHZ 将单片机调试模式打开 SW模式 选择窗口一配置为异步通信模式 点击IO口设置页面,可以看到当前使用的串口一的引脚。如果想使用复用功能,只需…

每天五分钟深度学习:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 :喂,你的页面白啦! 出现上线白屏的问题有很多,如:配置错误、缓存问题、浏览器兼容问题,根据不同情况去解决。 路由配置问题 问题描述: 在vue开发…

C语言中的联合体和枚举

联合体 联合体的创建 联合体的关键字是union union S {char a;int i; };除了关键字和结构体不一样之外,联合体的创建语法形式和结构体的很相似,如果不熟悉结构体的创建,可以看一下我上一篇的博客关于结构体知识的详解。 联合体的特点 联合…

HarmonyOS 应用开发之进程模型

系统的进程模型如下图所示。 应用中(同一Bundle名称)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在同一个独立进程(主进程)中,如下图中绿色部分的“Main Process”。应用中&#x…

matlab及其在数字信号处理中的应用001:软件下载及安装

目录 一,matlab的概述 matlab是什么 matlab适用于的问题 matlab的易扩展性 二,matlab的安装 1,解压所有压缩文件 2,解压镜像压缩文件 3,运行setup.exe 4,开始安装 5,不要运行软件…

Python环境下基于深度学习的旋转机械故障诊断及其权重可视化

随着神经网络所要完成的任务越来越智能化,其内部的结构也变得越来越复杂,神经网络学到的解题方法也越来越难以被人类所理解。神经网络的内部单元就好比一个“黑箱”,虽然这种处理方法能够在某种程度上达到非常不错的效果,但其原因…

同城外卖多商户点餐系统平台开发JAVA版源码跑腿小程序APP

项目背景 在快节奏的现代生活中,人们对于时间的需求愈发敏感。如何在忙碌中兼顾生活与工作,如何在繁杂琐事中找到一丝便利,这已然成为众多都市人共同关心的议题。在这样的背景下,同城外卖跑腿系统软件应运而生,以其高…