5.8.1、TCP的连接建立

news2025/1/15 19:31:55

TCP 是面向连接的协议,它基于运输连接来传送 TCP 报文段。

TCP 运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。

TCP 运输连接有以下三个阶段

  • 建立 TCP 连接:通过 “三报文握手” 建立 TCP 连接
  • 数据传送:也就是基于已建立的 TCP 连接建立可靠的数据传输
  • 释放 TCP 连接:也就是数据传输结束后还要通过 “四报文挥手” 来释放 TCP 连接

image-20230107183245122

TCP 的运输连接管理就是使运输连接的建立和释放都能正常地进行


TCP 的连接建立要解决以下三个问题:

  • 使 TCP 双方能够确知对方的存在;

  • 使 TCP 双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等);

  • 使 TCP 双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。


1、TCP 使用 “三报文握手” 建立连接的具体过程

具体流程图

image-20230107192546849


如下所示

  • TCP 客户:其中一台主机中的某个应用进程主动发起 TCP 连接的建立
  • TCP 服务器:另一台主机被动等待建立 TCP 连接的应用进程

image-20230107183735255

可以将 TCP 建立连接的过程比喻为 “握手”

“握手” 需要在 TCP 客户和服务器之间交换三个 TCP 报文段


最初,两端的 TCP 进程都处于 关闭状态 \color{blue}关闭状态 关闭状态

image-20230107184052427

一开始,TCP 服务进程首先创建传输控制块

  • 用来存储 TCP 连接中的一些重要信息。

    例如:TCP 连接表,指向发送和接收缓存的指针,指向重传队列的指针,当前的发送和接收序号等

image-20230107184116134

之后,就准备接收 TCP 客户进程的连接请求

  • 此时,TCP 服务器就进入 监听状态 \color{blue}监听状态 监听状态,等待 TCP 客户进程的连接请求

TCP 服务器进程是被动等待来自 TCP 客户进程的连接请求,而不是主动发起

  • 因此,被称为被动打开连接

image-20230107184438454


TCP 服务进程也是首先创建传输控制块

image-20230107184555081

然后再打算建立 TCP 连接时,向 TCP 服务器进程发送 TCP 连接请求报文段

  • 并进入 同步已发送状态 \color{blue}同步已发送状态 同步已发送状态

TCP 连接请求报文段首部中的同步位 SYN 被设置为 1 1 1

  • 表明这是一个 TCP 连接请求报文段

序号字段 seq 被设置了一个初始值 x x x

  • 作为 TCP 进程所选择的初始序号

注意TCP 规定 SYN 1 1 1 的报文段不能携带数据,但要消耗掉一个序号

image-20230107185110221

由于 TCP 连接建立是由 TCP 客户主动发起的

  • 因此称为主动打开连接

TCP 服务器进程收到 TCP 请求报文段后

  • 若同意建立连接,则向 TCP 客户进程发送 TCP 连接请求确认报文段,并进入 同步已接受状态 \color{blue}同步已接受状态 同步已接受状态

该报文段首部中的同步位 SYN 和确认位 ACK 都设置为 1 1 1

  • 表明这是一个 TCP 连接请求确认报文段

序号字段 seq 被设置为初始值 y y y

  • 作为 TCP 服务器进程所选择的初始序号

确认号字段 ack 的值被设置为 x + 1 x + 1 x+1

  • 这是对 TCP 客户进程所选择的初始序号的确认

image-20230107185713691

注意:该报文段也不能携带数据,因为它是 SYN 被设置为 1 1 1 的报文段

  • 但同样要消耗掉一个序号

TCP 客户进程收到 TCP 连接请求确认报文后

  • 还要向 TCP 服务器进程发送一个普通的 TCP 确认报文段

  • 并进入 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态

该报文段首部中的确认位 ACK 设置为 1 1 1

  • 表明这是一个不同的 TCP 确认报文段

序号字段 seq 被设置为初始值 x + 1 x + 1 x+1

  • 这是因为 TCP 客户进程发送的第一个 TCP 报文段的序号为 x x x,并且不携带数据
  • 因此,第二个报文段的序号为 x + 1 x + 1 x+1

注意TCP 规定普通的 TCP 确认报文段可以携带数据

  • 但若不携带数据,则不消耗序号

    在这种情况下,所发送的下一个数据报文段的序号仍是 x + 1 x+1 x+1

确认号字段 ack 的值被设置为 y + 1 y + 1 y+1

  • 这是对 TCP 服务器进程所选择的初始序号的确认

image-20230107190305100


TCP 服务器进程收到该确认报文段后

  • 也进入 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态

现在 TCP 双方都进入了连接已建立状态,它们可以基于已建立好的 TCP 连接进行可靠的数据传输了

image-20230107190433081


2、为什么要 “三报文握手”

思考?为什么 TCP 客户进程最后还要发送一个普通的 TCP 确认报文段呢?

  • 这是否多余?
  • 即:能否使用 “两报文握手” 建立连接呢?

image-20230107190608123

否定的!


假设 TCP 客户进程发出一个 TCP 连接请求报文段。

  • 但该报文段再某些网络节点长时间滞留了

    这必然会造成该报文段的超时重传

假设重传的报文段被 TCP 服务进程正常接收

TCP 服务进程给 TCP 客户进程发送一个 TCP 连接请求确认报文段

  • 并进入 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态

image-20230107191001335

注意:由于改为两报文握手,TCP 服务器进程发送 TCP 连接请求确认报文段后进入 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态

  • 而不像 “三报文握手” 那样进入 同步已接受状态 \color{blue}同步已接受状态 同步已接受状态,并等待 TCP 客户进程发来针对 TCP 连接请求确认报文段的普通确认报文段

TCP 客户进程收到 TCP 连接请求确认报文后,进入 TCP 连接已建立状态

  • 但不会给 TCP 服务器进程发送针对该报文段的普通确认报文段

image-20230107191422353


现在 TCP 双方都处于 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态,他们可以相互传输数据,之后可以通过 “四报文挥手” 来释放连接

TCP 双方都进入了 关闭状态 \color{blue}关闭状态 关闭状态

image-20230107191617407


一段时间后,之前滞留在网络中的那个失效的 TCP 连接请求报文段到达了 TCP 服务器进程

TCP 服务器进程会误认为这是 TCP 客户进程又发起了一个TCP 连接请求

  • 于是TCP 服务进程给 TCP 客户进程发送一个 TCP 连接请求确认报文段,并进入 连接已建立状态 \color{blue}连接已建立状态 连接已建立状态

该报文段到达 TCP 客户进程并没有发起新的 TCP 连接请求,并且处于关闭状态

  • 因此,不会理会该报文

TCP 服务器进程已进入已连接状态,它认为新的 TCP 已建立好了

  • 并一直等待 TCP 客户进程发来数据,这将白白浪费 TCP 服务器进程所在主机的很多资源

image-20230107192402540

综上: 这是为了防止已失效的连接请求报文段又传送到了 TCP 服务器,因而导致错误 \color{red}这是为了防止已失效的连接请求报文段又传送到了\texttt{TCP}服务器,因而导致错误 这是为了防止已失效的连接请求报文段又传送到了TCP服务器,因而导致错误

3、习题

image-20230107192901108

4、小结

image-20230107192944114

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

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

相关文章

【PostgreSQL】手把手教学PostgreSQL

目录 1、PostgreSQL介绍 2、在ubuntu上通过命令安装 3、进入postgres用户 4、查看所有数据库 5、创建数据库 6、删除数据库 7、查看版本号(注意:在sudo su - postgres下) 8、远程连接 1、PostgreSQL介绍 官网:PostgreSQL: T…

SiC碳化硅功率器件测试哪些方面?碳化硅功率器件测试系统NSAT-2000

SiC碳化硅功率半导体器件具有耐压高、热稳定好、开关损耗低、功率密度高等特点,被广泛应用在电动汽车、风能发电、光伏发电等新能源领域。 近年来,全球半导体功率器件的制造环节以较快速度向我国转移。目前,我国已经成为全球最重要的半导体功率器件封测基…

wndows平台VS2019+OpenCV+cmake简单应用

wndows平台VS2019OpenCVcmake简单应用1.下载并解压文件2.结合人脸检测demo在vs中进行配置2.1 人脸检测代码2.2 在VS项目—属性中配置2.2.1 配置包含目录2.2.2 配置库目录2.2.3 配置链接器附加依赖项2.3 通过cmake进行配置与编译2.3.1 添加CMakeLists.txt文件2.3.2 cmake命令行执…

普中学习板准备工作

目录 1.1 ch341驱动安装 1. 目标板上的usb-串口模块插上 2. 按下目标板上的上电按钮 3. 打开ch341驱动程序,点击安装,等待结果 1.2 使用自动下载软件 1. 使用普中的自动下载软件 2. 串口号处选择安装好的驱动端口 3. 打开文件选择编译好的程序 …

2023 RealWorldCTF “Ferris proxy”逆向题分析(不算wp)

这题第二天才开始做,结果到比赛后4个小时才做出来,真是老了,不过也算有收获,对rust的程序更熟悉了~ client编译后的代码有41M,WTF 主函数入口 根据main函数找到两个入口 第二个函数很明显是主入口,不过…

数字图像相关系列笔记:DuoDIC

文章目录概述Algorithms and workflowStep 1: Stereo camera calibrationStep 2: Image cross-correlation (2D-DIC)Step 3: 3D reconstructionStep 4: Post processingValidation using a rigid body motion (RBM) testLimitations遗留问题参考资料附录概述 3D-DIC is a non-…

【C++、数据结构】AVL树 模拟实现

文章目录📖 前言1. AVL树的概念1.1 二叉搜索树的缺点:1.2 AVL树的引入:1.2 AVL树的性质:2. AVL树的模拟实现2.1 AVL树结点的定义:2.2 AVL树的插入:(重点)2.2.1 插入结点后平衡因子的…

【前端】Vue项目:旅游App-(14)home+search:搜索按钮及其路由跳转、分组数据的网络请求request、数据存储store和动态显示

文章目录目标过程与代码搜索部分:搜索按钮点击搜索按钮路由跳转并传数据search页面隐藏TabBar分类部分:数据请求:request、store显示数据分类的样式总代码修改或添加的文件common.cssrouter的index.jsservice的home.jsstore的home.jshome-cat…

Windows系统下 pyinstaller将python文件打包成可执行文件exe的方法

使用环境为Windows10系统(64),Python版本为3.11.1。 1.将pip加入环境变量 (1)右击此电脑点击"属性",点击高级系统设置, (2)选择最下面的环境变量&#xff1b…

C++之继承

文章目录一、继承的基本理解1.继承的概念2.继承的定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承1.继承关系2.菱形继承存在数据冗余和二义性的问题3.虚拟继承可以解决菱形继承…

前端优化原理篇(生命周期)

1, 性能评估模型 对于前端的性能的评判 主要是以下四个方面: 2,性能测量工具 1,浏览器的performarce功能 指路可看链接 2,lighthouse工具 3,生命周期 网站 页面的整个生命周期,通俗的讲&a…

移动端App 页面秒开优化总结

前言 App优化,是一个工作、面试或KPI都绕不开的话题,如何让用户使用流畅呢?今天谨以此篇文章总结一下过去两个月我在工作中的优化事项到底有那些,优化方面还算小白,有不对的地方还望指出海涵, 该文章主要通过讲述Nati…

CSS入门三、盒子模型

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

力扣sql基础篇(四)

力扣sql基础篇(四) 1 每位学生的最高成绩 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # rank()函数间隔排序 若前两个字段值相同且都是并列的第一名,那么后面的一个非连续数字就是第三名 如 1 1 3 SELECT e.student_id,e.course_id,e.grade FROM…

ISO12233分辨率测试卡分类及功能说明

概述相机图像分辨率的测试,依据的标准是ISO 12233. 目前分为 ISO12233:2000 ,ISO12233:4000, ISO12233:2014.目前很多厂家已经开始使用新的ISO标准,淘汰了十几年前的“落伍”标准,而更新成了ISO12233:2014。新的分辨率测试标板是由…

代码随想录算法训练营第四期第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 # 给定两个单词word1和word2,返回使得word1和word2相同所需的最小步数。 # 每步可以删除任意一个字符串中的一个字符。 # # 示例 1: # 输入: word1 "sea", word2 "eat" # 输出: 2 # 解释: 第一步将 &…

安顺控股冲刺A股上市:拟募资6.5亿元,九成收入来自天然气销售

近日,安顺控股股份有限公司(下称“安顺控股”)递交招股书,准备在上海证券交易所主板上市。本次冲刺上市,安顺控股计划募资6.50亿元,将用于溧阳市城镇燃气高压管网二期项目、溧阳市美丽乡村天然气利用项目一…

openstack私有网络

1.前情回顾 目前环境使用的是Provider网络现在需要将其修改为Self-service网络,类似于公有云的vpc网络 2.流程 1.控制节点配置修改 1.修改/etc/neutron/neutron.conf的[DEFAULT]区域 # 原来的配置 # core_plugin ml2 # service_plugins # # 修改后的配置 c…

GitHub Enterprise Server 存在授权不当漏洞(CVE-2022-46258)

漏洞描述 GitHub Enterprise Server 是一个面向开源及私有软件项目的托管平台,GitHub scope 用于限制 OAuth token 的访问范围。 在 GitHub Enterprise Server 中,除非提交位于同一存储库的不同分支中且和 Workflow files 内容相同的 Workflow 文件 &a…

【学习】Reptile、梯度下降的LSTM、Siamese Network、原型网络、匹配网络、关系网络

文章目录ReptileRNNLSTM梯度下降的LSTM基于度量的方法Siamese NetworkN-way Few/One-shot Learning原型网络匹配网络关系网络虚拟数据的少量学习Train Test as RNNReptile RNN LSTM RNN的变形 加入门 梯度下降的LSTM GD看似像简化的LSTM 可以让机器自动学习这些zf和zi …