详解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,所以需要等这么长时间来确认服务端确实已经收到了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在低成本loT mcu上实现深度神经网络端到端自动部署-深度神经网络、物联网、边缘计算、DNN加速——文末完整资料

目录 前言 DNN 量化神经网络 并行超低功耗计算范式 面向内存的部署 结果 原文与源码下载链接 REFERENCES 前言 在物联网极端边缘的终端节点上部署深度神经网络( Deep Neural Networks,DNNs )是支持普适深度学习增强应用的关键手段。基于低成本MCU的终端节点…

基于SpringBoot和Vue的房产销售系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的房产销售系统的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕&#x1f…

Vitest 单元测试方案

简介 Vitest 是一个面向 Vite 的极快的单元测试框架。它利用了 Vite 的优势,提供了一种全新的测试体验。本文将介绍如何在项目中集成和使用 Vitest 进行单元测试。 安装 Vitest npm install -D vitest 配置 Vitest 在项目根目录下创建 vitest.config.js 文件,用于配置 Vitest。…

AcWing-毕业旅行问题

731. 毕业旅行问题 - AcWing题库 所需知识:二进制状态压缩,dp 思路:Hamilton最小路径的变种,如果Hamilton最小路径不懂可以看看我这篇文章AcWing—最短Hamilton路径-CSDN博客 搞懂了Hamilton之后这题就很简单了,遍历…

【51单片机入门记录】Onewire单总线协议 温度传感器DS18B20概述

一、温度传感器DS18B20概述 (1)数字化温度传感器 美国DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建…

一、图片隐写[Stegsolve、binwalk、010editor、WaterMark、BlindWaterMark、文件头尾]

工具配置 1.Stegsolve 工具地址:http://www.caesum.com/handbook/Stegsolve.jar 解释:该工具需要安装jar包后才能配合使用,下面同时会给出快速打开工具的代码,需要两个文件,启动的时候启动vbs文件 start.bat java …

【笔记本开热点给手机用,手机一直显示正在获取ip地址,然后连接不上的解决方法】

解决方法 控制面板\网络和 Internet\网络连接 查看是否有设备是固定ip,将其改成自动获取ip地址 如果你还没有解决,那么继续看 肯定是你装了vmware,vmware会生成vmnet1和vmnet8两个网段,这两个网段和共享的网段冲突了,所以需要将这两个网段…

4T第十四届省赛模拟2

一、Seg 温度读取: ①温度 温度读他读出来就是有精度的所以自带小数 我们读取的时候直接强制类型转换读它的各个位也不会丢失精度 ②电压 电压是你人为的/51.0了,从char->float->char所以会有精度丢失 所以要用原始数据来换算 在原始数据上多…

qt窗口的应用与pyinstaller打包APP操作

3月29日 qt打包APP操作 1 先在windows shell 中下载打包软件Pylnstaller pip install pyinstaller2 先进入py项目所在的位置,再执行以下代码(我用的qt版本是PySide6可以根据自己的情况修改) pyinstaller s02.py --noconsole --hidden-import PySide6.QtXml3 因为…

GEE22:基于目视解译的土地利用分类(随机森林监督分类)

采样点信息: 设置一下采样点参数: 代码: //设置研究区位置 var table ee.FeatureCollection("users/cduthes1991/boundry/China_province_2019"); var roi table.filter(ee.Filter.eq(provinces,beijing)); Map.centerObjec…

Machine Learning机器学习之数据可视化

目录 前言 一、 数据预处理与清洗 二、常见可视化技术 三、可视化工具和平台 博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者…

MES系统怎么解决车间生产调度难的问题?

MES系统三个层次 1、MES决定了生产什么,何时生产,也就是说它使公司保证按照订单规定日期交付准确的产品; 2、MES决定谁通过什么方式(流程)生产,即通过优化资源配置,最有效运用资源; …

PCI总线管脚定义(引脚定义)

文章目录 1: 参考资料的链接2: 图片说明3:PCI文字说明每日好图 1: 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…

同事们希望我拥有博士学位,但资历并不是一切

罗伯特纽贝克 “你太聪明了!你为什么没有博士学位?这个熟悉的问题被当作赞美,但总感觉像是一记耳光。我已经在该组织工作了 2 周,每个人似乎都喜欢我正在做的工作、我带来的观点以及我为我的团队设想的方向。但只有一个小问题&am…

打PTA (15分)(JAVA)

目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 题解 题目描述 传说这是集美大学的学生对话。本题要求你做一个简单的自动问答机,对任何一个问句,只要其中包含 PTA 就回答 Yes!,其…

机器学习 - 手动实现 ReLU 和 Sigmoid

直接上代码 import torch import matplotlib.pyplot as pltA torch.arange(-10, 10, 1, dtypetorch.float(32)) def relu(x):return torch.maximum(torch.tensor(0), x) plt.plot(relu(A))结果如下: import torch import matplotlib.pyplot as pltA torch.aran…

FPGA Artix7 Bootloader App Python升级

文章目录 软硬环境复现官方 srec_spi_bootloader例子简介Vivado硬件部分存储划分Vitis 嵌入式 BootVitis 嵌入式 Appelf转换srec合并boot和app得到mcs文件下载测试过程分析 基础知识BIT MCS HEX BINBit SwappingSREC 文件格式Vivado约束 串口Boot地址划分链接脚本修改Github Li…

1.Netty介绍及NIO三大组件

Netty网络编程Netty的底层是NIO(非阻塞IO),常用的多线程和线程池使用的是阻塞IO,其效率并不高。支持高并发,性能好高性能的服务端程序、客户端程序 NIO三大组件 一、Channel 读写数据的双向传输通道 常见的传输通道…

Taskflow 简单使用

Hello World #include <taskflow/taskflow.hpp>int main() {tf::Executor executor; tf::Taskflow taskflow;// 返回一个std::tuple<tf::Task, tf::Task, tf::Task, tf::Task> auto [A, B, C, D] taskflow.emplace([](){std::cout<<"A"<<s…

金三银四面试题(六):对象大小知多少

对象和数组在JVM如何在堆中布局&#xff1f;更常见地问法就是对象头都包含哪些信息 在JVM中对象和数组尽管都是连续的内存块。但在堆内存中的布局方式有些不同。 对象的组成 对象在JVM中可以分为三个部分&#xff0c;对象头&#xff08;Header&#xff09;&#xff0c;实例数…