【计算机网络】TCP原理 | 可靠性机制分析(四)

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】
本专栏旨在分享学习计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌

这里写目录标题

  • 🐬一、延时应答
  • 🐬二、捎带应答
  • 🐬三、面向字节流
    • 🏀粘包问题
  • 🐬四、TCP异常情况的处理

🐬一、延时应答

接收方在接收到数据后并不立即发送ACK报文,而是等待一定的延迟时间,以查看是否有更多的数据到达。如果在延迟时间内收到了更多的数据,接收方可以将多个ACK合并为一个ACK,从而减少ACK报文的发送次数。另外,这种延迟的时间可以给应用程序更多的空间来消费数据,从而避免数据积压和溢出的问题。

举个例子:比如说现在接收方接收数据后,接受区缓存(一共10kb)使用了6kb,所以剩余空间大小就是4kb,此时如果立即返回ACK的话,窗口大小就是4kb;但是如果延时返回ACK的话,假设延时500ms的话,那么应用程序就可以利用这延时的500ms来进行数据的消费,假设又消费了2kb数据的话,返回ACK后窗口大小就是6kb。接收方通过延时应答机制能为数据传输提高多少效率还是要取决于接收方处理数据的能力。

简单来说TCP延时应答可以让ACK的反馈时机变迟。

🐬二、捎带应答

捎带应答则是基于延时应答的基础上让数据进行合并。

下面捎带应答的控制图,请看

在这里插入图片描述

很多情况下,客户端服务器在应用层也是 “一发一收” 的。

在这里插入图片描述如上图:四次挥手也有可能是三次挥手,其实就是延时应答和捎带应答起到的作用。中间的两个数据包合并成一个数据包之后,数据传输的效率就会提高,因为每次数据的传输都是需要封装分用的。
为什么中间的两次挥手能够进行合并:一方面是延时应答中的延时时间允许ACK和响应合并在一起发送出去;另一方面就是ACK数据本身不需要携带载荷,同时不和其它数据发送冲突。所以我们可以让一个数据包既携带载荷数据,又能带有ACK的信息(有ACK标志位、窗口大小、确认序号其实就够了)。

🐬三、面向字节流

TCP使用了多种机制来保证数据的可靠性,其中之一就是面向字节流。通过将数据拆分成字节流,TCP可以跟踪和管理每个字节的传输状态。TCP会对每个字节进行编号,以便在传输过程中检测和纠正任何丢失、重复、失序或损坏的字节。
面向字节流的特性使得TCP能够提供可靠的数据传输,确保数据按照发送的顺序和准确的内容被接收方接收到。

🏀粘包问题

面向字节流的情况下可能出现粘包问题:粘包粘的是应用层数据包

通过TCP的read/write的数据,都是TCP报文的载荷(也就是应用层数据),发送方一次性是可以发送多个应用层数据的。但是在接收的时候,是要对这些应用层数据进行区分,区分从哪里到哪里是一个数据报。如果我们没有设计到的就就有可能出现发送了2个包,但是只读取了1.5个包的bug。

在这里插入图片描述
针对上述的问题在传输层中并没有很好的解决办法;我们只能通过合理地设计应用层协议来解决上述问题。

应用层的解决方式:

  • 引用分隔符来区分包和包之间的边界。
  • 引用包长度来区分包和包之间的边界。

方式一:使用分隔符来区分在这里插入图片描述
接收方的应用程序就可以通过\n来对数据包进行区分。
关于之前写的EchoServer回显服务器就是这样来进行设定的:
发送数据报的时候使用println来进行发送。接收数据报的时候使用scanner.next进行解析,遇到\n就返回。如下图所示:
在这里插入图片描述
在这里插入图片描述

方式二:使用包长度来进行区分
在这里插入图片描述

补充一点:粘包问题不仅仅是在TCP协议中存在,只要是面向字节流的机制(比如说文件)都存在粘包这样的问题。解决方式可以是使用分隔符的方式,也可以是使用长度的方式,无论是哪种方式,本质上都是为了区分包和包之间的边界。我们在自定义应用层协议的时候可以使用这样的思想来解决问题。

🐬四、TCP异常情况的处理

网络有时候不稳定,会有很多种情况导致网络出现故障,这很有可能会导致TCP连接不能正常工作。

  • 情况一:进程崩溃

如果进程崩溃或异常终止,操作系统会检测到该进程的退出,并释放该进程相关的资源,包括进程控制块(PCB)和文件描述符(这相当于调用了socket.close(),注意socket在系统内核中也是一个文件,也会被放到文件描述符表中),崩溃这一方就会发送FIN,然后进一步三次握手四次挥手,之后连接就正常释放了。此时TCP的处理和进程正常退出没有什么太大区别。

  • 情况二:主机关机(正常步骤的关机)

主机正常关机的话就会尝试终止所有进程(这是一个强制终止进程的过程),这和情况一的进程崩溃处理方式是一样的。当然主机关机的时候,会有一定的关机时间,在这个时间内,四次挥手有没有完成我们是不确定的,可能挥完也可能没有挥完,如果四次挥手没有完成的话也没关系。(如下图:)
在这里插入图片描述

  • 情况三:主机掉电(突发的,比如说拔电源,根本没有反应时间)

在这里插入图片描述

TCP协议中虽然已经有了心跳包的支持,但是我们作为开发者往往需要在应用程中重新实现心跳包。因为TCP协议中的心跳包周期太长了,在高并发的场景下我们甚至是需要毫秒级别的心跳包,以便我们能够在更短的时间内发现某个服务器的问题。

  • 情况四:网线断开

这里发生的情况和情况三(即主机掉电)是类似的。网线断开之后,这里假设A是发送方的话,A发生的情况和上述主机掉电的第一种情况(即没有ACK->超时重传->复位报文以重置连接->释放连接);而B发生的情况是主机掉电的第二种情况(B这边会通过发送心跳包发现A已经没法建立通信了,进一步的就会释放连接)。

本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!

在这里插入图片描述

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

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

相关文章

C函数详解 | 函数的作用、定义与声明、函数的调用、函数与指针

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

RISC-V是如何与X86、ARM三分天下

目录 1.行业CPU指令集格局 2.汽车中的RISC-V进展 2.1 国际进展 2.2 国内进展 3.小结 2023年3月2日,在平头哥牵头举办的玄铁RISC-V生态大会上,工程院院士倪光南表示,基于RISC-V模块化、可扩展、容易定制、不受垄断制约等优势,…

电商API接口|Javascript抓取京东、淘宝商品数据

“ 不知怎么建站?就找怎么建站! ” 背景: EDI许可证网站和ICP许可证网站需要有丰富的商品数据来应付EDI、ICP许可证下证审核。下面介绍的这种方法是我之前主要的抓取数据的方法,大概用了一年多。这几天又对这个方法进行了一些优…

11.云原生分布式数据库之TIDB

云原生专栏大纲 文章目录 为什么使用TIDB后端视角运维视角基础架构视角 TiDB Operator 简介软件版本要求部署tidbTIDB工具helm常用命令TIDB学习推荐资料 为什么使用TIDB 从后端视角、运维视角和基础架构视角来看,使用 TiDB 作为数据库系统可以获得分布式架构、高可…

学习Java API(二):基础知识点一文通✅

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读正则表达式正则表达式语法捕获组和分组matches 和 lookingAt 方法split方法r…

LeeCode前端算法基础100题(20)找出字符串中第一个匹配项的下标

一、问题详情: 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystack = "sadbutsad", needle = "s…

安全生产管理平台——革新传统安全生产管理方式,重塑企业安全文化

安全生产管理在现代企业中占据着至关重要的地位。传统的安全生产管理方式虽然在一定程度上能够保障企业的生产安全,但随着企业规模的不断扩大和生产环境的日益复杂,其局限性也愈发凸显。而安全生产管理平台的出现,正是为了解决这一问题。 平台…

从六西格玛到DFSS:提升企业创新能力的关键方法——张驰咨询

DFSS(Design for Six Sigma,即六西格玛设计)是一种结合了六西格玛思想和创新设计方法的质量管理方法。它的目标是在产品或服务的设计阶段,通过优化设计过程和减少变异性,以确保产品或服务达到高质量水平,满…

Linux多网卡绑定实现负载均衡详解

将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。 目录 1、bond的作用 2、Bonding聚合链路工作模…

反射助你无痛使用Semantic Kernel接入离线大模型

本文主要介绍如何使用 llama 的 server 部署离线大模型,并通过反射技术修改 Semantic Kernel 的 OpenAIClient 类,从而实现指定端点的功能。最后也推荐了一些学习 Semantic Kernel 的资料,希望能对你有所帮助。 封面图片: Dalle3 …

软信天成:数据安全管理解决方案分享

近年来,随着数据环境日趋复杂多变和潜在的数据隐私泄露风险潜伏,如何确保企业数据安全已成为众多企业亟待面对与妥善处理的重要问题。 为了应对这一严峻的现实挑战,软信天成凭借专业的知识体系和丰富的实战经验积累,总结出了一套…

Java多线程并发篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、ReadWriteLock 读写锁二、共享锁和独占锁三、重量级锁(Mutex Lock)四、轻量级锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给…

Spring MVC中的一些常用注解

目录 RequestMapping 实现路由映射 限制请求方式 PathVariable 从url中获取变量的值 更改绑定参数的名字 RequestParam 可以传递集合 更改绑定参数的名字 可修改是否为必传参数 RequestBody 获取请求正文的内容 可修改是否为必传参数 RequestPart 可以支持上传…

new mars3d.layer.GeoJsonLayer({实现图标点billboard贴模型聚合效果

说明: 1.【mars3d】的依赖库cesium本身是不支持贴地/贴模型操作的 2.sdk内部异步计算了数据的贴地/高度值之后,更新到图层上实现贴地/贴模型效果的 3.相关的示例链接: 1.功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 4.相关的计算…

【Python数据可视化】matplotlib之绘制三维图形:三维散点图、三维柱状图、三维曲面图

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现

这是《百图解码支付系统设计与实现》专栏系列文章中的第(15)篇,也是流量控制系列的第(2)篇。点击上方关注,深入了解支付系统的方方面面。 上一篇介绍了固定时间窗口算法在支付渠道限流的应用以及使用redis…

消息的发送与接收

消息的发送与接收 消息的发送与接收不仅仅是在于聊天功能的实现。其实还有很多种情况也算"消息的发送与接收"。而且我们还可以通过多种方法去实现。我们可以基于实际情况来选择。 WebSocket实现 node做后端。找了好多,前端页面总是用到了jQuery&#x…

lvgl简介

LVGL(Light and Versatile Graphics Library)是一个开源的图形用户界面库,旨在提供轻量级、可移植、灵活和易于使用的图形用户界面解决方案。 它适用于嵌入式系统,可以在不同的操作系统、微控制器和图形加速器上运行。LVGL的核心…

1.go安装及相关配置

目录 概述下载基本命令Go build环境设置 结束 概述 下载 官网速递 选择 1.20.x 一个是因为是次新版本,另一个,mac 系统是 10.13.6 ,1.20.x 是最后一个支持此版本的。 环境变量 GOROOT go的安装目录(将go安装到哪里 which go、cat /etc/p…

高并发IO底层原理

1 概述 IO底层原理是隐藏在Java编程知识之下的基础知识,是开发人员必须掌握的基本原理。本文从操作系统的底层原理入手,通过图文的方式为大家深入剖析高并发IO的底层原理,并介绍如何通过设置来让操作系统支持高并发。 2 IO读写的基本原理 为…