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,一经查实,立即删除!

相关文章

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

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

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

【JUC】八、阻塞队列

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

【机器学习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(开源社联合创始人、前华为开源专家)…

如何构建风险矩阵?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要…

ATE测试工程师的薪资前景如何?能转DFT工程师吗?

在芯片行业,ATE测试工程师扮演着至关重要的角色。他们不仅需要理解电路和芯片内部的工作原理,还需要利用各种测试工具和方法对芯片进行精确的测试和分析。那么ATE测试工程师前景如何?需要具备哪些技能要求呢? 首先来了解什么是AT…

【技巧】Windows 11 如何安装日文语言包和日文系统

Windows 11 如何安装日文语言包和日文系统 安装日语语言第一步:打开系统设置第二步:选择【时间和语言】选项第三步:点击【添加语言】按钮第四步:输入语言,并选择第五步:安装输入法/语言包第六步&#xff1a…

电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning

昇科能源、清华大学欧阳明高院士团队等的最新研究成果《动态深度学习实现锂离子电池异常检测》,用已经处理的整车充电段数据,分析车辆当前或近期是否存在故障。 思想步骤: 用正常电池的充电片段数据构造训练集,用如下的方式构造…

php在线审稿系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 php在线审稿系统是一套完善的web设计系统mysql数据库 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php在线审稿系统 代码 https://download.csdn.net/download/qq_41221322/885…

【python】Django——django简介、django安装、创建项目、快速上手

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——django安装、创建django项目、dj…

字母不重复的子串-第15届蓝桥第二次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第158讲。 第15届蓝桥第2次STEMA测评已于2023年10月29日落下帷幕,编程题一共有6题,分别如下&am…