【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

引言

想象一下,如果没有可靠的数据传输机制,我们的网络世界将会怎样?信息可能会丢失,邮件可能无法送达,在线交易可能无法完成。幸运的是,TCP协议为我们提供了一种确保数据完整性和顺序的通信方式。它不仅确保了数据的准确传输,还通过一系列核心机制优化了网络性能。

目录

  1. 延时应答

  2. 捎带应答

  3. 面向字节流

  4. 异常情况处理

一. 延时应答

1. 延时应答的初识

小伙伴应该知道,确认应答是返回一个 ACK = 1 , 且带有 确认序号没有载荷 的报文。

而延时应答则是在 确认应答流量控制 的基础上, 进行了 优化了

之前是一收到发送方发来的数据, 就立即 返回 ACK

但是延时应答的是: 等待一段时间 ,等 应用程序 消耗了 接收缓冲区 一定的数据之后, 再返回 ACK

2. 延时应答的大体流程

在这里插入图片描述

如上图:

上面是一个 接收缓冲区

假设这个缓冲区的空间为 100KB , 原有数据 40KB, 然后新发送(写) 缓冲区数据 20KB, 还剩下 40KB空间大小

如果说,按照 确认应答机制实施 , 接收方一收到这个 20KB数据ACK 就返回接收缓冲区剩余40KB数据的信息 , 这样的话,

从上一篇我们学习过的 流量控制的角度 , 我们知道滑动窗口的窗口大小就是根据接收缓冲区的剩余大小来衡量的, 如果接收缓存区 剩余空间越小, 发送方 设置的窗口就越小发送速度就越低, 效率就越低效

但是我们假设设置一个 100ms 的等待时间

让应用程序在这 100 ms 内尽可能的消耗 尽可能的消耗接收缓冲区 的数据, 可能 消耗了20KB

ACK 等待了100ms 后返回, 就会从之前返回剩余40KB 变成 返回60KB 的信息。

同时发送方就会调整为 更大的窗口大小 , 从而 加快传输速度

可能小伙伴们还听的不是很清楚吧

下面小编举个栗子说明一下吧

小编是在一所高校上学的, 可能平常又很懒,几乎不写作业~

然后老师也 看不下去 了,就发个消息提醒我。

老师: 同学, 你作业好多没写, 快把你作业补一补吧!

这时小编有两种策略:

策略一: 小编立即回复

我: 老师, 最近有点忙,抱歉哦, 我尽快把作业补完。

这时我就指不定什么时候能够补完了, 说是马上去补,肯定是去哈皮咯, 好比 确认应答机制

策略二: 小编先 不急着回复老师消息 , 而是先一顿 狂补八九次作业 , 最后只 剩下两次 , 然后我再去回复老师。

我: 老师, 我这个作业已经快写完了, 我只剩下两次作业了,分分钟搞定了。 就好比: 延时应答机制

这上面的两次策略就对应两种不同的应答, 确认应答机制延时应答机制

我们就可以看出, 我 立即补作业过会再写作业 的方案的效率是 不一样 的,过会写作业还 指不定什么时候开始补 呢, 但是现在开始补就相当于 延时一点时间 , 让我不断 消耗现有作业的量, 从中体现 延时应答机制 更能体现出 提高效率

鱼式疯言

总结补充:

  1. 延时应答其实本质上就是 多消耗接收缓冲区数据多加快传输速率提高效率减少Tcp因可靠传输而造成的性能的影响

如果要保证在延时应答的机制下, 缓冲区的数据是 尽可能被消耗而不是增加 的, 就要确保以下两点

  1. 应用程序 是不断 源源不断的消耗着缓冲区的数据的
  1. 发送方不会有 新的数据 发送过来 。

二. 捎带应答

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. 发送方先发完数据掉电

  2. 接收方接收完就掉电

<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用于减少 可靠传输 带来的损耗的一种机制, 消耗一定时间尽可能的 消耗接收缓冲区中已有的数据,
    提高效率。

  • 捎带应答: 将两次或两次以上的发送 合并成一次一起发送 ,提高效率, 并可能会利用 延时应答机制 来配合使用。

  • 面向字节流:面向字节流的常见问题就是 粘包问题 , 常用的解决方案: 使用 分隔符 和 固定数据长度

  • 异常情况处理:介绍多次异常的情况, 同时 重置连接 或者 心跳包 确定是否存活, 如果对端不存活就会 单方面的释放连接

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

[数据集][目标检测]无人机识别检测数据集VOC+YOLO格式6986张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6986 标注数量(xml文件个数)&#xff1a;6986 标注数量(txt文件个数)&#xff1a;6986 标注…

‌内网穿透技术‌总结

内网穿透是一种网络技术&#xff0c;通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下&#xff0c;内网是无法直接访问的&#xff0c;因为它位于一个封闭的局域网中&#xff0c;无法从外部访问。而通过内网穿透&#xff0c;可以将内部网络中的设备和服务暴露在…

数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例

时间序列概况在日常生活和专业研究中都很常见。简而言之,时间序列概况是一系列连续的数据点 y(0), y(1), …, y(t) ,其中时间 t 的点依赖于时间 t-1 的前一个点(或更早的时间点)。 在许多应用中,研究者致力于预测时间序列概况的未来行为。存在各种建模方法。这些模型通常基于过…

Unity让摄像机跟随物体的方法(不借助父子关系)

在Unity中&#xff0c;不使用子对象的方式让相机跟随物体移动&#xff0c;我们通过编写脚本来实现。下面放一个从工程中摘出来的的C#脚本示例&#xff0c;用于将相机绑定到一个Target对象上并跟随其移动&#xff1a; using UnityEngine; public class FollowCamera : MonoBeh…

DPDK基础入门(十):虚拟化

I/O虚拟化 全虚拟化&#xff1a;宿主机截获客户机对I/O设备的访问请求&#xff0c;然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明&#xff0c;无需考虑底层硬件的情况&#xff0c;不需要修改操作系统。 半虚拟化&#xff1a;通过前端驱动/后端驱动模拟实现I/O虚拟…

【STM32】CAN总线基础入门

CAN总线基础入门 一、CAN简介二、主流通信协议对比三、CAN物理层1、CAN硬件电路2、CAN电平标准3、CAN收发器 – TJA1050&#xff08;高速CAN&#xff09;4、CAN物理层特性 四、帧格式1、CAN总线帧格式2、数据帧&#xff13;、数据帧各部分用途简介&#xff14;、数据帧的发展历…

大模型参数高效微调技术原理综述(八)-MAM Adapter、UniPELT

MAM Adapter 背景 近年来提出了多种参数高效的迁移学习方法&#xff0c;这些方法仅微调少量&#xff08;额外&#xff09;参数即可获得强大的性能。虽然有效&#xff0c;但人们对为什么有效的关键要素以及各种高效微调方法之间的联系知之甚少。 下图展示了不同的微调方法&am…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言&#xff1a;本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday&#xff0c;作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整&#xff0c;总文数大量下降&#xf…

ACM模式下算法题输入输出攻略【C++】

文章目录 [TOC] 1. 核心代码模式与ACM模式1.1 ACM模式介绍1.2 注意事项 2. C常用的输入输出方法2.1 输入2.1.1 cin注意事项2.1.2 getline()注意事项2.1.3 getchar()注意事项 2.2 输出 3. 案例3.1 一维数组输入3.1.1 固定长度的一维数组3.1.2 不固定长度的一维数组 3.2 二维数组…

使用ddns-go实现自动配置IPv6的DDNS

正文共&#xff1a;888 字 17 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面说到通过PPPoE拨号获取到的IPv6地址没有发生变化&#xff08;企业路由器配置IPv6家用宽带的PPPoE拨号示例&#xff09;&#xff0c;结果说完就打脸了。中间家里停了一次电&#xff0c;路由器重新…

Transformer模型详细步骤

Transformer模型是nlp任务中不能绕开的学习任务&#xff0c;我将从数据开始&#xff0c;每一步骤都列举出来&#xff0c;然后对应重点的代码进行讲解 ------------------------------------------------------------------------------------------------------------- Trans…

物品识别——基于python语言

目录 1.物品识别 2.模型介绍 3.文件框架 4.代码示例 4.1 camera.py 4.2 interaction.py 4.3 object_detection.py 4.4 main.py 4.5 运行结果 5.总结 1.物品识别 该项目使用Python&#xff0c;OpenCV进行图像捕捉&#xff0c;进行物品识别。我们将使用YOLO&#xff08…

re题(23)BUUFCTF-[FlareOn4]login

BUUCTF在线评测 (buuoj.cn) 下载后打开看到是一个txt和一个html 分别打开看看&#xff0c;txt是提示&#xff0c;html应该就是要破解的网页 打开网页&#xff0c;查看源代码 找到程序&#xff0c;变灰的部分是关键&#xff0c;是指如果是前13个字母就加13&#xff0c;如果是…

小程序开发设计-第一个小程序:注册小程序开发账号②

上一篇文章导航&#xff1a; 小程序开发设计-小程序简介①-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142217803?sharetypeblogdetail&sharerId142217803&sharereferPC&sharesourceqq_60872637&spm1011.2480.3001.8118 须知&#xff1a;不…

C++设计模式——Prototype Pattern原型模式

一&#xff0c;原型模式的定义 原型模式是一种创建型设计模式&#xff0c;它允许通过克隆已有对象来创建新对象&#xff0c;从而无需调用显式的实例化过程。 原型模式的设计&#xff0c;使得它可以创建一个与原型对象相同或类似的新对象&#xff0c;同时又可以减少对象实例化…

Rust Windows下编译 静态链接VCRuntime140.dll

Rust 编译出来的exe默认动态链接VC运行库&#xff0c;分发电脑上需要安装有Microsoft Visual C Redistributable for Visual Studio 2015运行库。 编译时能静态链接进去&#xff0c;就省去客户端未安装运行库的问题。方法如下: 只需在当前根目录下新建.cargo\config.toml&#…

【可视化大屏系列】数据列表自动滚动效果

要实现列表的自动滚动效果&#xff0c;这里提供两种解决方案&#xff1a; 1.vue插件 官方文档&#xff1a;链接: vue-seamless-scroll &#xff08;1&#xff09;安装依赖 npm install vue-seamless-scroll --save&#xff08;2&#xff09;全局注册&#xff08;main.js中&a…

【CTF Web】BUUCTF BUU UPLOAD COURSE 1 Writeup(文件上传+PHP+文件包含漏洞)

BUU UPLOAD COURSE 1 1 上课用~ 点击启动靶机。 解法 疑似存在文件包含漏洞。 http://15a5666e-1796-4f76-b892-0b69cf97df8e.node5.buuoj.cn:81/index.php?fileupload.php查看网页源代码。判断是后端检查。 <!DOCTYPE html> <html lang"zh-cn"> &…

多目标优化算法求解LSMOP(Large-Scale Multi-Objective Optimization Problem)测试集,MATLAB代码

LSMOP&#xff08;Large-Scale Multi-Objective Optimization Problem&#xff09;测试集是用于评估大规模多目标优化算法性能的一组标准测试问题。这些测试问题通常具有大量的决策变量和目标函数&#xff0c;旨在模拟现实世界中的复杂优化问题。 LSMOP测试集包含多个子问题&am…