【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!
本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
引言
想象一下,如果没有可靠的数据传输机制,我们的网络世界将会怎样?信息可能会丢失,邮件可能无法送达,在线交易可能无法完成。幸运的是,TCP协议为我们提供了一种确保数据完整性和顺序的通信方式。它不仅确保了数据的准确传输,还通过一系列核心机制优化了网络性能。
目录
-
延时应答
-
捎带应答
-
面向字节流
-
异常情况处理
一. 延时应答
1. 延时应答的初识
小伙伴应该知道,确认应答是返回一个
ACK = 1
, 且带有 确认序号 , 没有载荷 的报文。
而延时应答则是在
确认应答
和流量控制
的基础上, 进行了 优化了 。
之前是一收到发送方发来的数据, 就立即
返回 ACK
。
但是延时应答的是: 等待一段时间 ,等 应用程序 消耗了
接收缓冲区
一定的数据之后, 再返回ACK
。
2. 延时应答的大体流程
如上图:
上面是一个 接收缓冲区
假设这个缓冲区的空间为 100KB
, 原有数据 40KB
, 然后新发送(写) 缓冲区数据 20KB
, 还剩下 40KB空间大小 。
如果说,按照 确认应答机制实施 , 接收方一收到这个 20KB数据 , ACK
就返回接收缓冲区剩余40KB数据的信息 , 这样的话,
从上一篇我们学习过的 流量控制的角度 , 我们知道滑动窗口的窗口大小就是根据接收缓冲区的剩余大小来衡量的, 如果接收缓存区 剩余空间越小
, 发送方 设置的窗口就越小 , 发送速度就越低, 效率就越低效。
但是我们假设设置一个 100ms 的等待时间 ,
让应用程序在这 100 ms
内尽可能的消耗 尽可能的消耗接收缓冲区 的数据, 可能 消耗了20KB
当 ACK 等待了100ms 后返回, 就会从之前返回剩余40KB 变成
返回60KB
的信息。
同时发送方就会调整为
更大的窗口大小
, 从而 加快传输速度 。
可能小伙伴们还听的不是很清楚吧
下面小编举个栗子说明一下吧
小编是在一所高校上学的, 可能平常又很懒,几乎不写作业~
然后老师也 看不下去
了,就发个消息提醒我。
老师: 同学, 你作业好多没写, 快把你作业补一补吧!
这时小编有两种策略:
策略一: 小编立即回复:
我: 老师, 最近有点忙,抱歉哦, 我尽快把作业补完。
这时我就指不定什么时候能够补完了, 说是马上去补,肯定是去哈皮咯, 好比 确认应答机制 。
策略二: 小编先 不急着回复老师消息 , 而是先一顿 狂补八九次作业 , 最后只 剩下两次 , 然后我再去回复老师。
我: 老师, 我这个作业已经快写完了, 我只剩下两次作业了,分分钟搞定了。 就好比: 延时应答机制
这上面的两次策略就对应两种不同的应答, 确认应答机制 和 延时应答机制
我们就可以看出, 我
立即补作业
和 过会再写作业 的方案的效率是不一样
的,过会写作业还指不定什么时候开始补
呢, 但是现在开始补就相当于 延时一点时间 , 让我不断消耗现有作业的量
, 从中体现 延时应答机制 更能体现出 提高效率 。
鱼式疯言
总结补充:
- 延时应答其实本质上就是 多消耗接收缓冲区数据, 多加快传输速率 ,
提高效率
, 减少Tcp因可靠传输而造成的性能的影响。
如果要保证在延时应答的机制下, 缓冲区的数据是 尽可能被消耗而不是增加 的, 就要确保以下两点
应用程序
是不断 源源不断的消耗着缓冲区的数据的
- 发送方不会有 新的数据 发送过来 。
二. 捎带应答
1. 捎带应答的初识
捎带应答是什么?
捎带应答可以认为就是 在原本是 三次握手中中间一次的发送过程 , SYN
和 ACK
同时合并 捎带一起发送
, 也是 一种提高效率 , 减少Tcp可靠传输的对性能的损耗 。
鱼式疯言
捎带应答不用可以是 同一个源头发送的数据合并, 也可以是 不同的源头发送的数据合并 。
下面我们以四次挥手合并成三次挥手为栗子来说明:
2. 捎带应答的大体流程
在之前的文章中, 小编讲过 四次挥手
的全过程, 如果还有点模糊的小伙伴记得回顾哦 ❣️ ❣️ ❣️ ❣️
三次握手, 四次挥手详解
这次从四次挥手的中间两次来介绍捎带应答的大体流程
首先, 按照一般的情况来说, 中间两次挥手是不能合并的, ACK是系统内核返回到,只要一收到发送方发送FIN 就会立即返回 ACK, 而 FIN
是 应用程序 发送的, 只要执行到 close()
才会发送。
从正常情况考虑, 两个报文的发送时间是 不同的 , 所以很难 同时一起发送
。
但是因为Tcp有 延时应答的机制,就可以让 快一点的ACK 经可能的 慢点发送, 直到应用程序执行到
close()
方法后 , ACK 就和 FIN 一起同时发送, 从而提高效率
, 这就是 捎带应答机制。
什么是捎带应答机制, 可能主编这边讲的还不是很通俗易懂, 下面来举个小栗子吧 ❣️ ❣️ ❣️ ❣️
比如我室友是特别懒的一位, 就在我旁边的床位, 平常要不是上课就根本不想动, 就整天躺在床上刷视频。
他经常看着看着就口渴了, 这时他因为太懒了, 根本不想动, 那么他就会等等…
等到什么时候呢?
等到他要上厕所了, 就会 下床先去上厕所 , 然后就 顺便去喝水
。
我室友的这种方式就完美的诠释了什么叫做
捎带应答
, 他等的过程就相当于ACK
等待FIN 相似
, 直到 FIN 需要发送了 然后再 顺便发送ACK ,从而 提高传输的效率 。
鱼式疯言
总结补充:
对于 相同的发送源头 ,
Tcp
可以直接实现使用 捎带应答 ;
对于 不同的发送源头 ,
TCP
就需要在 延时应答 的基础上使用捎带应答
。
三. 面向字节流
1. 黏包问题
在前面的文章中, 谈及Tcp 必然谈及Tcp 的特点之一——面向字节流
关于前面Tcp 面向字节流的特点还有不清楚的, 小伙伴们可以重新巩固下哦 ❤️ ❤️ ❤️ ❤️
面向字节流博客详解
而在本篇中就需要给小伙伴们介绍Tcp 在面向字节流进行网络通信时, 所可能产生的黏包问题
什么是黏包问题?
入上图:
就是当发送方发送几段数据后, 这些数据就会在接收缓冲区中连成一片, 相互黏合。
而当 主机B 从接收缓冲区中读取数据 , 就有可能会出现:
aa , abbb , ccc
aaab, bbc, cc
aa,abb,bccc 等… 各种读取情况, 就会出现实际数据信息读取错误, 这样的情况称之为: 黏包问题
。
如何解决黏包问题呢?
下面提供两种方案 🤔 🤔 🤔 🤔 🤔
2. 黏包问题的解决方案
<1>. 使用分隔符
使用分隔符 例如
\n
换行来 分隔每一个数据包 的信息。
比如当
主机A
写出一段数据, 就使用nextLine()
方法, 只要 换行了就说明写出完毕 。
而
主机B
读入一段数据 , 就使用println
来读取, 代表 一行一行的来读取 。
<2>. 使用固定长度来分隔
使用固定长度这个方案, 我们就可能参考UDP 的报头结构,
从载荷(应用层数据包)的首部开始分配一个 2/ 4字节
长度的空间, 用一段固定的空间来作为 每个数据包与数据包的边界 , 如此用一个 固定的长度来分隔数据 ,就很难出现 黏包问题 。
鱼式疯言
关于这种黏包问题, 小编这里只是举例 两种常用的方案 , 其实解决黏包问题的方案是 很多种的
。
四. 异常情况处理
对于异常情况的可能性很多, 下面小编就一一来为小伙伴们讲解 💞 💞 💞 💞
1. 进程崩溃
对于Java来说, 当进程崩溃时, 就会抛出异常, JVM
就会来处理 , 这时就会使 整个程序结束 。
但实际上, 操作系统就进行 善后工作 , 自动回收 PCB 的文件描述符表 , 并且会对 每一个PCB 中的 文件描述符表 的每一个
Socket 对象
进行释放。
针对
Socket文件
进行释放, 也就是进行四次挥手
的 断开连接操作。
2. 主机正常关机
对于主机正常关机,会出现两种情况:
1. 四次挥手 先完成 ,正常断开连接后, 主机正常关机
<2>. 四次挥手还没完成, 主机就已经断开连接
如上图 ,还没来得及完成四次挥手, 主机 A就先关机 , 此时主机B 没有收到ACK
而且 不能感知到主机A 已经关机了, 所以主机B 就会 一直进行超时重传 , 当主机B 超时重传一定次数后,就 不会进行超时重传 , 主机B 就会
自动一方断开连接
, 也就是 删除对方的信息。
3. 主机意外掉电
对于主机意外掉电的情况, 就有分为
-
发送方先发完数据掉电
-
接收方接收完就掉电
<1>. 发送方掉电
当A 发送了两段报文后, A 就直接掉电, 掉电之后B返回两个ACK
但从B 的角度来看, 不知道 A
是 掉电了 还是 休息一会再发 。
所以这时B 就会发送一个 探测报文 , 来 检查A 是嘎了 还是 想歇会 。
如果B 接收到
了 A 返回的ACK 就说明, A 想休息会。
如果发送了多次探测报文都 没有接收到了ACK , 就说明 A已经嘎了 。
这时B 就会 单方面释放连接 。
鱼式疯言
补充说明:
探测报文是一种 不携带载荷, 为了 触发ACK
的一种 特殊报文
就是用来探测对方
生死
的一种数据包, 该数据包我们称之为心跳包
心跳包是一种为了 触发ACK 而周期性发送的一种探测报文 , 在Tcp配置中, 探测报文的周期是 秒/ 分钟来衡量的。
应用程序 则这一层会 自动生成 一些心跳包 , 来达到更快的
保活机制
。
<2>. 接收方断电
如果
A 发送多段数据包
, 没有接收到 ACK , 就会超时重传, 但 重传达到一定的上限, A 就会重置连接, 如果 重置连接失败 , A 就会单方面的释放连接。
4. 网线断开
如果网线断开了, 也就意味着网络通信瘫痪了, 那么 A 无法发送数据给B , 同时
B也无法接收到 A 发送过来的数据
。
从 A 的角度来看, A 发送数据后, 没有接收到ACK , 就会超时重传 , 超时重传达到
一定的上限
那么就会 重置连接 , 那么 A 这边就会单方面的释放连接 。
从 B 的角度来看, B未接收到数据, 就会
周期性的发送心跳包
, 如果发送 一定次数的心跳包都没有接收到 ACK , 同时也会但 方面释放连接 。
鱼式疯言
总结补充 :
从 发送方
的探测方式: 重置连接
接收方
的探测方式: 心跳包
总结
-
延时应答: Tcp用于减少 可靠传输 带来的损耗的一种机制, 消耗一定时间尽可能的
消耗接收缓冲区中已有的数据
,
提高效率。 -
捎带应答: 将两次或两次以上的发送 合并成一次一起发送 ,提高效率, 并可能会利用
延时应答机制
来配合使用。 -
面向字节流:面向字节流的常见问题就是 粘包问题 , 常用的解决方案: 使用 分隔符 和 固定数据长度 。
-
异常情况处理:介绍多次异常的情况, 同时
重置连接
或者 心跳包 确定是否存活, 如果对端不存活就会 单方面的释放连接 。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖
相关文章:

【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!
本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…...

Scratch教学案例 —— 制作生日蛋糕
小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 简介 在这个教学案例中,我们将使用Scratch制作一个简单而有趣的生日蛋糕动画。通过这个项目,学生可以学习到如何使用Scratch中的基本编程块进行角色控制、造型切换、舞台背景设置以…...

【深度学习】搞懂卷积神经网络(一)
卷积神经网络是一种具有局部连接,权重共享等特性的深层前馈神经网络。一般是由卷积层,池化层,全连接层交叉堆叠而成,使用反向传播算法进行训练。卷积神经网络具有一定程度上的平移,缩放和旋转不变性,较前馈…...

VisionPro - 基础 - 00 模板匹配技术和在VP中的使用 - PMAlign - PatMax - (上)
前言 模板匹配是机器视觉领域,尤其是工业视觉领域内,自动化经常要使用的一个视觉算法应用模式。在VP里面,有几种简单的模版匹配的算子,这里大致介绍一下VP的PatMax。 在视觉应用领域,搜索匹配的特征是经常要用到的方…...

容器镜像同步工具image-migrator
1 概述 image-migrator是一个用于容器镜像同步的可执行二进制命令行工具(不依赖于docker命令),能够自动将基于Docker Registry v2镜像仓库(registry、云厂商容器镜像服务、docker hub、Quay、Harbor )中的镜像迁移到基…...

嵌入式系统中的u-boot、kernel、rootfs的区别与关系
嵌入式系统中的u-boot、kernel、rootfs的区别与关系 1. 总览 在嵌入式Linux系统中,软件架构通常分为四个层次,从低到高依次为: 引导加载程序 (Bootloader):固化在硬件Flash中的引导代码,用于硬件基本配置和内核引导…...

K8s1.28 部署Dashboard获取登录信息
Kubernetes Dashboard 是一个基于 Web 的用户界面,用户可以通过它管理和监控 Kubernetes 集群。它提供了对容器化应用程序的概览、集群资源的状态查看、以及对服务和容器的简单操作管理。 配置 Dashboard 访问的方式: Kubernetes 中的服务类型默认是 C…...

智能化大数据平台引领企业迈向精准决策时代
随着科技的飞速发展,大数据平台正逐步迈向更加智能化和自动化的未来趋势。未来的数据平台不仅仅是一个简单的存储和处理数据的工具,而是一个能够自主学习、优化和做出决策的智能系统。这一转变将极大地改变企业处理数据的方式,提高决策的速度…...

1.3 计算机网络的分类
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型,本章从分布…...
深入剖析protobuf.js之Field类:内部机制、使用实践与高级应用指南
引言 在protobuf.js库中,Field类扮演着极其重要的角色,它定义了消息(Message)中每个字段的元数据和行为。Field类不仅包含字段的类型、编号、规则等基本信息,还负责字段的序列化和反序列化逻辑。本文将对protobuf.js的…...
docker挂载宿主机文件run命令启动报错
背景 使用docker安装mysql8,docker run 命令提示报错 命令: docker run -d \ -p 3306:3306 \ -v ~/docker/mysql8/log/mysqld.log:/var/log/mysqld.log \ -e MYSQL_ROOT_PASSWORD=123456 \ --name mysql8 mysql:8.0.36 报错信息 docker: Error response from daemon: fai…...
Python实现 Socket.IO 的在线游戏场景
博客:Python 实现 Socket.IO 的在线游戏场景 目录 引言 什么是 Socket.IO?Socket.IO 的应用场景Socket.IO 在在线游戏中的优势本文案例概述 Socket.IO 的工作原理 Socket.IO 的事件驱动机制WebSocket 与 Socket.IO 的比较Socket.IO 的握手和连接机制 …...
A+B P1001 A+B Problem
P1001 AB Problem #include <bits/stdc.h> using namespace std; int main(){int a,b;std::cin>>a>>b;std::cout<<ab; }...

git编译安装报错
编译安装步骤 卸载旧的 yum -y remove gitcd /usr/local/src/wget https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.xztar -vxf git-2.15.1.tar.xzcd git-2.15.1make prefix/usr/local/git allmake prefix/usr/local/git installecho "export PATH$PATH:/usr…...

知识|智能网联汽车多域电子电气架构会如何发展?
摘要:随着汽车智能化和网联化技术的快速发展,传统的电子电气架构已经无法满足未来车路云网一体化发展的新需求。本文聚焦于未来智能网联汽车的多域电子电气架构,并从总体设计、硬件系统、通信系统和软件系统四个方面对现有技术进行了详细的综…...

【C++算法】位运算
位运算基础知识 1.基础运算符 << : 左移 >> : 右移 ~ : 取反 & : 按位与,有0就是0 I : 按位或,有1就是1 ^ : 按位异或,(1)相同为0,相异为1(2)无进位相加 2.…...

PMP--一模--解题--101-110
文章目录 11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、 [单选] 在项目即将进入收尾阶段时,项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生,可能给最终的可交付成果带来重要…...
为了有了ReentrantLock还需要ReentrantReadWriteLock?
ReentrantLock 和 ReentrantReadWriteLock 是 Java 中的两种不同实现的锁,它们各自适用于不同的应用场景。以下是为什么需要 ReentrantReadWriteLock 的几个原因: 1. 读写分离 ReentrantLock 是一种独占锁,适用于任何线程操作共享资源的场景…...
Vite打包zip并改名为md5sum哈希案例
通常在DevOps CICD流水线部署前端项目时,一般默认都要将dist资源打包为zip,并且把zip名称改为md5sum哈希值(用于文件完整性验证)。 md5sum是什么? md5sum 是一个在 Unix 和类 Unix 系统(如 Linux)中广泛使用的命令行…...
并行编程实战——TBB中节点的数据结构
一、节点的定义 在前面分析过了节点相关的应用和功能,也在其中分析过一些节点的数据定义情况。本文就对节点的数据定义进行一个更详细具体的分析说明,特别是对一些应用上的细节展开说明一下。知其然,然后知其所以然。 节点的定义,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...