TCP协议通讯流程

文章目录:

  • 通讯流程全过程浏览
  • 建立连接过程
  • 数据传输过程
  • 断开连接问题

通讯流程全过程浏览

下图是基于TCP协议的客户端/服务器程序的一般流程:
在这里插入图片描述
上图就是TCP协议的通信流程,接下来认识初步认识以下TCP建立连接(三次握手)和断开连接(四次挥手),以及建立连接和断开连接与各个网络接口之间的对应关系。

建立连接过程

在这里插入图片描述

服务器初始化包括以下步骤:

  • 调用 socket 函数创建一个文件描述符,用于后续的网络通信。
  • 调用 bind,将当前的文件描述符与指定的IP地址和端口号绑定在一起。如果指定的端口被其它的进程占用,则 bind 操作会失败。
  • 调用 listen 函数,声明当前这个文件描述符作为一个服务器的文件描述符,为后面的 accept 做好准备。
  • 调用 accept 函数,并阻塞等待客户端的连接请求。当有客户端连接请求达到时,accept 函数会返回一个新的文件描述符,用于与该客户端进行通信。

通过上述步骤,服务器完成了初始化并准备好接收客户端的连接请求。在调用 accept 函数时,服务器将会阻塞,直到有客户端连接请求达到为止。这样,服务器可以与客户端建立连接,并进行后续的数据交换和处理。

建立TCP连接的过程:

  • 调用 socket 函数创建一个文件描述符,用于后续网络通信。
  • 调用 connect 函数,向服务器发起连接请求。connect 函数会发送一个 SYN(同步)段,并阻塞等待服务器的应答。
  • 服务器收到客户端发送的 SYN 段后,会向客户端发送一个 SYN-ACK(同步 - 确认)段,表示同意客户端的连接。服务器为该连接分配一个新的序列号,并等待客户端的确认。
  • 客户端收到服务器发送的 ACK 段后,会从 connect() 函数返回,同时发送一个 ACK 段作为确认。客户端也会为连接分配一个新的序列号。
  • 服务端收到客户端发送的 ACK 段后,确认连接成功。此时,客户端和服务器已经成功建立连接,可以进行数据的传输了。

这个建立连接的过程,通常被称为 “三次握手”,双方确认了连接,开始进行数据交换。需要注意的是,连接并不是调用函数后立即建立成功的,由于TCP是属于传输层协议,在建立连接时双方的操作系统会自主进行三次握手协商,协商完成之后,才可以连接成功。

数据传输过程

在这里插入图片描述

TCP协议负责处理数据的可靠传输和流量控制等底层细节,使得应用程序可以通过 read 和 write 函数进行数据的读写操作,而无需关系具体的数据传输细节。这样,应用程序可以方便地进行数据交互,而底层的TCP协议确保了数据的可靠传输和顺序保证。

数据传输的过程如下:

  • 建立连接后,TCP协议提供全双工的通信服务;所谓全双工的意思是,在同一条连接中,同一时刻,通信双方可以同时进行数据的读写操作;相对的概念叫做半双工,同一条连接在同一时刻,只能由一方来写数据。
  • 服务器从 accept() 函数返回后,立即调用 read() 来读取数据,读 socket 就像管道一样,如果没有数据到达就阻塞等待。
  • 此时,客户端调用 write() 函数向服务器发送请求,服务器收到请求后,从 read() 函数返回并开始处理客户端的请求。在此期间,客户端调用 read() 函数阻塞等待客户端的应答。
  • 服务器调用 write() 函数将处理结果发送给客户端,再次调用 read() 函数阻塞等待下一条请求。
  • 客户端收到服务器的应答后,从 read() 函数返回,并发送下一条请求。这样循环往复,实现了双方之间的数据传输。

断开连接问题

在这里插入图片描述

当双方通信结束后,通过四次挥手的方案进行连接的断开。在TCP协议中,每个端需要发送一个 FIN 段来表示自己不再需要发送数据,而对方需要发送一个 ACK 段进行确认。因此,客户端和服务端双方 close() 操作最终对应的就是四次挥手过程。

通信双方断开连接的过程:

  • 当客户端没有请求需要发送时,客户端调用 close() 函数关闭连接,客户端会向服务器发送一个 FIN 段作为请求关闭连接的信号(第一次挥手)。
  • 服务器收到 FIN 段后,回应一个 ACK 段,表示已经收到关闭请求,同时服务器调用 read() 函数会返回0(第二次挥手)。
  • 当服务器收到客户端的 ACK 段并且 read() 函数返回0后,服务器就直到客户端关闭了连接。这时如果服务端也没有数据发送给客户端了,也调用 close() 函数关闭连接,并向客户端发送一个 FIN 段(第三次挥手)。
  • 客户端收到 FIN 段后,会回应一个 ACK 段,表示收到关闭请求(第四次挥手)。
  • 此时,通信双方都关闭并收到了对方的响应。此时断开连接成功。

这个断开连接的过程,通常称为 “四次挥手”。

在学习 socket API 时要注意应用程序和TCP协议层是如何交互的:

  1. 应用程序调用某个 socket 函数时TCP协议层完成什么动作,比如调用 connect() 会发出 SYN 段。
  2. 应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的 socket 函数返回就表明TCP协议收到了某些段,再比如 read() 返回0就表明了收到 FIN 段。

应用程序通过 socket API 调用不同的函数与TCP协议层进行交互。TCP协议层负责处理底层的连接建立、数据传输和连接关闭等细节。通过阻塞式的 Socket API 函数,应用程序可以触发TCP协议层的操作并等待相应的响应,以实现数据的读写和连接状态的变化通知。

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

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

相关文章

vue实现上传文件到七牛云

第一步:安装插件 npm install qiniu-js 第二步,页面中引入插件 import * as qiniu from qiniu-js 第三步,调用方法 // 必须手动上传文件async onChangeFile() {let that this;let file this.$refs.uploadfile.files[0];if (file) {let …

Notion汉化

Notion真无语,汉化版都没有。真的无力吐槽。 2023.11.7汉化经历 教程链接:github Reamd7/notion-zh_CN at 2.4.20-handmade (github.com) 网页版: 油猴下载插件。 Notion中文汉化 浏览器插件下载 windows: github realse 这…

【带头学C++】----- 六、结构体 ---- 6.7 共用体以及枚举类型

6.7 共用体以及枚举类型 结构体:结构体用于组合不同类型的数据,每个字段占用独立的内存空间。 共用体:共用体也组合不同类型的数据,但所有字段共享同一块内存。 因此,结构体适合表示具有多个属性的对象,而共用体适合表示可以具…

力扣labuladong——一刷day32

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣654. 最大二叉树二、力扣105. 从前序与中序遍历序列构造二叉树三、力扣106. 从中序与后序遍历序列构造二叉树四、力扣889. 根据前序和后序遍历构造二叉…

Linux 命令:lsof(列出打开的文件)

1. 写在前面 本文主要介绍:Linux “lsof” 命令; 公众号: 滑翔的纸飞机 2. lsof 命令 lsof 命令是 "List Open Files(列出打开的文件)"的缩写,用于显示打开的文件以及使用这些文件的进程。 在…

vite 样式按需加载

用于按需引入组件库样式的插件。 vite-plugin-impvite-plugin-style-import 以上两个插件可以实现按需引入组件库样式,尝试后发现vite-plugin-imp这个插件目前有个问题是,它支持按照组件动态引入组件内部的样式,但是antd还定义了一些全局样…

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

一、拜耳阵列的来源 图像传感器将光线转化成电流,光线越亮,电流的数值就越大;光线越暗,电流的数值就越小。图像传感器只能感受光的强弱,无法感受光的波长。由于光的颜色由波长决定,所以图像传播器无法记录…

【JUC】八、阻塞队列

文章目录 1、阻塞队列概述2、阻塞队列分类3、 阻塞队列的四组核心方法4、Demo 队列,先进先出,类似排队栈,先进后出,用于要优先处理最近发生的事件的场景 1、阻塞队列概述 阻塞队列,一个生产消费模式,当&a…

LCD智能婴幼儿秤pcba方案

LCD智能婴幼儿秤采用SIC8833芯片开发设计,内置程序搭载称重算法,配合高精度传感器,能够准确测量出宝宝体重。并且秤台有身高标识,能够测量幼儿的身高。通过蓝牙上传云端APP,实时记录幼儿状态。 一、LCD智能婴幼儿秤方案…

【机器学习8】采样

1 均匀分布随机数 均匀分布是指整个样本空间中的每一个样本点对应的概率(密度) 都是相等的。 根据样本空间是否连续, 又分为离散均匀分布和连续均匀分布。编程实现均匀分布随机数生成器一般可采用线性同余法(Linear Congruential…

防爆五参数气象仪的科技力量

WX-FBQ2 随着科技的不断进步,气象监测设备也在不断升级和完善。 防爆五参数气象仪是一种可以同时监测温度、湿度、压力、风速和风向五个基本气象参数的仪器。它采用了气象监测技术,不仅可以实时监测气象数据,还可以对数据进行分析和处理。 …

所见即所得的动画效果:Animate.css

我们可以在集成Animate.css来改善界面的用户体验,省掉大量手写css动画的时间。 官网:Animate.css 使用 1、安装依赖 npm install animate.css --save2、引入依赖 import animate.css;3、在项目中使用 在class类名上animate__animated是必须的&#x…

轻松预览:Axure RP在线原型展示指南,快速掌握!

当UI设计师想要提供功能和细节丰富的原型时,可以使用原型设计工具预览Axure原型。原型设计工具Axurerp作为线框图和原型制作工具的创始人,功能非常强大。取代Axure的国产原型设计工具即时设计,界面布局清新,非常适合复杂的原型设计…

黑马程序员微服务 第五天课程 分布式搜索引擎2

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

【KCC@南京】KCC南京数字经济-开源行

一场数字经济与开源的视听盛宴,即将于11月26日,在南京举办。本次参与活动的有: 庄表伟(开源社理事执行长、天工开物开源基金会执行副秘书长)、林旅强Richard(开源社联合创始人、前华为开源专家)…

QtC++与QTableView详解

介绍 QTableView 是 Qt 框架中用于显示表格数据的视图控件,它是 QAbstractItemView 类的子类。QTableView 通常与 QStandardItemModel 或者自定义的数据模型一起使用,用于展示二维表格型数据。以下是对 QTableView 的详细讲解和在 Qt 中的作用&#xff…

如何构建风险矩阵?3大注意事项

风险矩阵法(RMA)是确定威胁优先级别的最有效工具之一,可以帮助项目团队识别和评估项目中的风险,帮助项目团队对风险进行排序,清晰地展示风险的可能性和严重性,为项目团队制定风险管理策略提供依据。 如果没…

Word或者WPS批量调整文中图片大小的快捷方法

文章目录 0、前言1、编写宏代码2、在文档中调用宏实现一键批量调整3、就这么简单! 0、前言 不知道大家是不是也和我一样,经常需要在编写的Word(或者WPS)文档里插入大量的图片,但是这些图片的尺寸大小一般都不一样&…

信创之路数据库人大金仓篇

概要 信创大势所趋,吾等上下求索 参考文档 Linux:人大金仓数据库-KingBaseES V8与 php7的连接配置 laravel9适配人大金仓(kingbase)数据库 thinkphp6适配人大金仓(Kingbase)数据库 数据库选型 目前比较…

Django(七、模型层)

文章目录 模型层模型层前期准备使用django ORM要注意 代码演示:切换MySQL数据库如何查看django ORM 底层原理? 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层 模型层前期准备 使用django ORM要…