【计算机网络】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.hqwc.cn/news/411632.html

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

相关文章

解决springboot启动报Failed to start bean ‘subProtocolWebSocketHandler‘;

解决springboot启动报 Failed to start bean subProtocolWebSocketHandler; nested exception is java.lang.IllegalArgumentException: No handlers 问题发现问题解决 问题发现 使用springboot整合websocket,启动时报错,示例代码: EnableW…

pxe高效批量网络装机 以及安装教程

系统装机的三种引导模式 1.pe 2光驱 3.网卡 打开本机桌面 可以看见背景图片 查看配置文件内容 文件时引导选项的功能 pxe原理: 先根据dhcp找到IP地址、和引导程序的地址,还提供客户机tftp地址,因为tftp是小文件,容量小&#…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-1+2

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05-12 1. Recursive Algirithm 递归算法2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器 1. Recursive Algirithm…

kubernetes/k8s配置资源管理

配置资源管理 Secret Configmap*.1.2加入新特征 1.18 Secret:保存密码,token,敏感的k8s资源 这类数据可以存放在镜像当中,但是防止secret可以更方便的控制,减少暴漏风险。 保存加密的信息 Secret的类型: docker-registry:存…

【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据

一、前言 目的:借助虚拟串口软件(VSPD)模拟硬件串口发送数据,使用PHP语言实现接收硬件发送的数据。 我这里的需求是连接天平,把天平的称量数据实时的传送到PHP使用。 使用工具:vspd串口调试工具 使用语…

上海亚商投顾:沪指创三年半新低 全市场超5000只个股下跌

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大指数昨日全线调整,沪指全天低开低走,尾盘跌幅扩大至2%,创业板板跌3%。有…

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering

3DGS 其一:3D Gaussian Splatting for Real-Time Radiance Field Rendering 1. 预备知识1.1 球谐函数1.2 Splatting1.3 α \alpha α blending1.4 多维高斯的协方差矩阵1.4.1 高斯与椭球体的关系1.4.2 世界坐标系下的三维高斯到二维像素平面投影过程 2. 3D Gaussia…

在美丽的意外下诞生的冰酒

在美丽的意外下诞生的冰酒 一、霜害的命运与葡萄酒的邂逅 有人说,水酒的诞生是一场美丽的错误。两百年前的德国,葡萄园遭受到突然来袭的霜害。酒农为了挽救损失,只好将错就错,将冰冻的葡萄压榨,按照传统方式发酵酿酒。…

web系统设计安全性基本要求

接口设计安全 身份鉴别 独立的登录模块:为社会用户和平台运营管理用户提供独立的登录地址、登录界面和身份认证模块,通过防火墙等设备严格限制能够登录WEB应用的用户地址、身份; 双因素认证: 平台运营管理人员:采用用…

HTML(一)

作为一名教育工作者,总是想用尽量好的方法展示自己的想法。所以总是抑制不住要学习前端的诱惑。所以从现在开始,积跬步以致千里。每天半小时。主要采用思维导图的方式。 学习资源来自于MDN网站(MDN) 本文是HTML的第一个部分&#…

mybatis----小细节

1、起别名 在MyBatis中&#xff0c;<typeAliases>元素用于定义类型别名&#xff0c;它可以将Java类名映射为一个更简短的别名&#xff0c;这样在映射文件中可以直接使用别名而不需要完整的类名。 下面是一个示例&#xff1a; 在mybatis核心配置文件中配置typeAliases标…

【k8s】Kubernetes 声明式 API、命令式

1. 资源管理方式&#xff1a; 1>. 命令式对象管理∶直接使用命令去操作kubernetes资源 kubectl run nginx-pod --imagenginx:1.17.1 --port802>. 命令式对象配置∶通过命令配置和配置文件去操作kubernetes资源 kubectl create/patch -f nginx-pod.yaml3>. 声明式对…