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.mfbz.cn/a/153575.html

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

相关文章

React函数组件状态Hook—useState《进阶-对象数组》

React函数组件状态-state 对象 state state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新⼀个对象时,你需要创建⼀个新的对象(或者将其拷⻉⼀…

(C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)

链栈是运算受限的单链表、只能在链表头部进行操作 1.链表的头指针就是栈顶,链头为栈顶,链尾为栈底 2.栈的链式存储不需要附设头节点 3.基本不存在栈满的情况,不需要判断栈满,但要判空 4.空栈相当于头指针指向空 5.插入和删除仅在栈顶处执行 6.因为是动态…

ncbi-datasets-cli-高效便捷下载NCBI数据

文章目录 简介安装datasets download下载基因组/基因序列按照GCA list文件编号下载下载大基因组genome完整参数gene参数 datasets summary下载元数据dataformat将json转换成表格格式通过json文件解析其他字段问题 简介 NCBI Datasets 可以轻松从 NCBI 数据库中收集数据。使用命…

牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)

目录 1. 思路1:倒数第K个节点,就是整数第N-K1的节点 2. 思路2:快慢指针 1. 思路1:倒数第K个节点,就是整数第N-K1的节点 链表中,一共有N个节点,如果我们想要得出倒数第K个节点,我们…

windows server 华夏ERP部署手册

软件包准备: .安装MySql 找到mysql程序双击进行安装,进入这个页面 选择Server only点击Next 进入到下图,点击execute,等待完成,点击下一步 点击install安装插件 安装完插件点击下一步 等待程序加载完成,点击下一步 继续下一步 进行下一步 进行…

不加家长好友,如何私密发成绩?

身为老师的你,是否经常收到家长们的询问,要求你告知他们孩子的成绩?而你却因为规定,不能直接将成绩公布?那么,如何解决这个问题呢? 成绩查询系统。是专门为学生和家长提供成绩查询服务的系统。可…

智慧农业新篇章:拓世法宝AI智能直播一体机助力乡村振兴与农业可持续发展

随着乡村振兴战略的深入推进,农业发展日益成为国家关注的焦点。在这一大背景下,助农项目的兴起成为支持乡村振兴的一项重要举措。 乡村振兴战略的实施,得益于《关于推动文化产业赋能乡村振兴的意见》、《关于全面推进乡村振兴加快农业农村现…

vscode Prettier配置

常用配置项: .prettierrc.json 是 Prettier 格式化工具的配置文件 {"printWidth": 200, // 指定行的最大长度"tabWidth": 2, // 指定缩进的空格数"useTabs": false, // 是否使用制表符进行缩进,默认为 false"singl…

Behave介绍和快速示例

Behave是一个用于行为驱动开发 (Behavior-Driven Development, BDD) 的 Python 库。使用 Behave,可以编写自然语言格式的使用场景来描述软件的行为,然后用 Python 实现这些场景下的步骤,形成可直接运行的测试。 Behave的目标是帮助用户、开发…

RT-DETR算法优化改进:自研独家创新BSAM注意力 ,基于CBAM升级 | 注意力机制大作战

💡💡💡本文全网首发独家改进:提出新颖的注意力BSAM(BiLevel Spatial Attention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的 BiLevel Attention+Spartial Attention 1)作为注意力BSAM使用; 推荐指数:…

B/S麻醉临床信息系统(手麻系统)源码

手术麻醉系统是一套以数字形式与医院信息系统(如HIS、EMR、LIS、PACS等)和医疗设备等软、硬件集成并获取围手术期相关信息的计算机系统,其核心是对围手术期患者信息自动采集、储存、分析并呈现。该系统通过整合围手术期中病人信息、人员信息、…

DBeaver还原mysql数据库

DBeaver还原mysql数据库 DBEaver还原mysql数据库新建一个要还原的数据库选择工具》恢复数据库 DBEaver还原mysql数据库 新建一个要还原的数据库 选中数据库,右键新建一个数据库,字符集和排序规则默认的即可 选择工具》恢复数据库 选中刚刚创建好的数据库&#x…

springboot326校园体育场馆(设施)使用管理网站

交流学习: 更多项目: 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示: ————————————————

Garmin佳明发布quatix 7 Pro航海商务智能腕表,于陆地之外乘风破浪

全新航海商务智能腕表,专为水上活动爱好者设计 搭载1.3英寸AMOLED屏幕,内置LED手电筒,长达16天电池续航 【2023年11月16日】今日,专业运动智能可穿戴设备及创新航海设备品牌佳明(纽交所代码:GRMN&#xff…

Linux/麒麟系统上部署Vue+SpringBoot前后端分离项目

目录 1. 前端准备工作 1.1 在项目根目录创建两份环境配置文件 1.2 环境配置 2. 后端准备工作 2.1 在项目resources目录创建两份环境配置文件 2.2 环境配置 3. 前后端打包 3.1 前端打包 3.2 后端打包 4、服务器前后端配置及部署 4.1 下载、安装、启动Nginx 4.2 前端项目部署…

学而优则“创”西电学子助力openGauss教学“破圈”,一举斩获金奖

在你的大学生涯,是否有过发现某本教材作者就是本校老师的经历?是否曾经为在课堂上见到作者本人而感到些许骄傲?实际上,这样的巧合在很多专业领域常有发生,因为一线教师往往既是知识的传道者,也是知识的生产…

Kafka 集群如何实现数据同步?

哈喽大家好,我是咸鱼 最近这段时间比较忙,将近一周没更新文章,再不更新我那为数不多的粉丝量就要库库往下掉了 T﹏T 刚好最近在学 Kafka,于是决定写篇跟 Kafka 相关的文章(文中有不对的地方欢迎大家指出)…

简单高效的定制移动固态硬盘,稳定易用的办公小助手

我在平时的工作中,常常需要处理各种大文件和数据,如果硬盘速度跟不上,那工作效率就会大幅降低。今年固态硬盘的价格大幅下降,有很多国产品牌加入其中,很容易找到一款性价比高的固态硬盘,搭配硬盘盒使用&…

EV代码签名证书

为了增强软件的安全性和可信度,EV代码签名证书(Extended Validation Code Signing Certificate)成为了一种具有最高级别保障的关键工具。 EV代码签名证书是一种由受信任的证书颁发机构(CA)或证书供应商提供的高级别代…

免费最强下载工具IDM,没有之一

IDM(Internet Download Manager)下载工具是我见过的最强下载工具,没有之一。主要以下特点: 下载程度超快实时检测下载行为下载任何文件探测视频下载地址,几分钟下载高清视频可多进程下载,可多线程下载 IDM官网地址:下…
最新文章