【网络原理】Tcp 常用提升效率机制——滑动窗口,快速重传,流量控制, 拥塞控制, 建议收藏 !!!

news2024/9/20 8:11:47

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

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

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

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

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

在这里插入图片描述

引言

在当今这个信息爆炸的时代,网络通信的效率和稳定性对于我们日常生活的重要性不言而喻。想象一下,当你在浏览网页、视频通话或者在线游戏时,突然间网络卡顿,那种焦急和无奈的感觉是多么令人沮丧。幸运的是,有一项技术一直在幕后默默工作,确保我们的网络体验尽可能流畅——这就是TCP滑动窗口机制。本文将深入探讨这一机制的原理、作用以及它如何影响我们的网络生活。

目录

  1. 滑动窗口

  2. 快速重传

  3. 流量控制

  4. 拥塞控制

一. 滑动窗口

1. 滑动窗口的初识

有小伙伴肯定在算法的章节听过 滑动窗口 这个名词, 那么和我们今天是讲的 滑动窗口的Tcp的机制 是否相同呢?

其实啊, 是 算法的滑动窗口 是来自于我们 Tcp 机制的滑动窗口 的。

那么 滑动窗口到底是什么呢?

滑动窗口就是把 一组数据包裹成一个整体 , 而这个 整体的数据规模 称为 窗口 , 我们通过 数据的输入和输出 来进行 入窗口和出窗口 的实现, 从而保证这个窗口在 每个数据中移动。 故我们称之为 滑动窗口

2. 滑动窗口的传输流程

在这里插入图片描述

对于上面的流程:

首先假设窗口大小为 4 个数据, 先从1001~5001 开始传输。

当传输到 4001 ~ 5001 这段数据时, 已经到达窗口大小了, 这时就需要等待前面三个ACK 都接收到再传输下一个数据, 还是一有ACK 返回就立刻传输呢 ?

其实是后者, 只要有一个ACK返回, 就立刻 传输下一个数据

如上图, 当传输到4001~ 5001 数据时, 发现 对端返回一个为3001的确认序号 , 于是就立刻发送 5001 ~ 6001 这样序号的数据, 所以不必等待对端 返回 5001 的确认序号

这样以此往复, 就可以看到 窗口左端的数据在出窗口窗口右端的数据在入窗口 , 从而出现窗口就开始在 数据和数据之间移动 , 故称为 滑动窗口

3. 滑动窗口的优势

在Tcp中, 我们之前是 先发送一个数据, 然后再接收一个 应答报文ACK , 再发 下一个数据 ,就会浪费 等待ACK的时间 , 这样的效率就会 明显降低
在这里插入图片描述

在这里插入图片描述

而在 滑动窗口的机制 下, 我们是 每发送一批数据 接收 一批应答报文 ACK

通过上面这样发送 一批数据 接收一批ACK 的方式就可以 有效提高数据传输的效率

虽然有了滑动窗口的机制, 但是 滑动窗口不是大幅度的提高传输的效率, 对于Tcp 本身来说, 是可靠传输的机制,就会有大量时间能耗

而滑动窗口的这个机制, 不是真正加快效率, 而是减少因为可靠传输造成的时间都消耗, 相当于 亡羊补牢 , 并不能做到像 Udp 的协议 那么快的传输效率

对于 滑动窗口批量发送和接收 , 窗口大小决定着传输的速度, 也就是说窗口越大, 传输的速度越快, 窗口越小, 传输的速度越慢, 但是窗口大小并不是可以无限增大的, 也需要考虑主机和主机之间 数据处理的快慢 , 否则会因为 窗口太大,传输的过快 ,从而 造成数据丢包现象

所以定义一个 合适的窗口大小 是很重要的。

鱼式疯言

补充总结

  1. 滑动窗口的本质作用是尽可能的减少因为 Tcp 的可靠传输 而造成的 时间的损耗
  1. 想要提高可靠性, 就需要 消耗一定的时间, 想要 速度快 , 就需要 消耗一定的可靠性

上面是滑动窗口传输成功的流程, 但是在网络传输过程, 存在着大量的不确定性, 比如我们上篇谈及过的有:
比特翻转, 数据高峰期丢失等… 都是有可能的。

一. 快速重传

为了应对进行 滑动窗口传输数据的过程中会出现 数据丢包问题 , Tcp 又采取了一套 配合滑动窗口 的机制—— 快速重传

1. 滑动窗口数据丢包的两种情况

在滑动窗口也存在两种数据丢包的情况:

一种是 数据包丢失 , 一定是 应答报文 ACK 丢失

<1>. ACK丢失

在这里插入图片描述

如上图, 主机A的数据包是 正常发送给对端主机B 的, 但是 主机B在确认应答 时,返回给 主机A的ACK 出现了丢包。

首先当主机A 发送 1~1000 的数据 时, 返回 1001ACK 丢包了, 这时主机A 继续发送 1001~6000 的数据, 并不会重新发送 1~1000 的数据。

因为ACK 的确认序号是 有顺序返回的当返回了1001 就会继续返回 2001 , 即使 1001 没有收到 , 但是一旦主机A 接收到了 后面的2001 的数据 时, 就会可以认为 前面的1~ 2000 的数据 是接收到的。

当上述 一批一批的发送ACK 时, 即使丢失了前面的部分ACK, 后面一旦 有ACK的返回 , 就说明 前面的数据是接收到的

所以我们 不需要做任何处理 即可。

鱼式疯言

总结提炼

确认序号是 有序的,当 收到后面的序号 ,说明 前面的序号的数据发送成功的

<2>. 数据包丢失

在这里插入图片描述

如上图, 主机A的数据包在传输主机B 的过程中 出现了丢失 , ACK是 正常返回的

首先主机A 发送了 1~1000 的数据, 然后正常应答, 然后再发送1001 ~2000 的数据,结果数据包丢失了,

这时主机B是意识到还没接收到 1001~2000 的数据的, 就会 返回1001 的确认序号

但由于是 批量发送的 , 主机A 是继续发送2001 ~ 7000 的数据, 这时 主机A还没有意识到前面有数据丢失了 , 这时主机B就会一直 返回 1001 的数据

最后当主机A 发送完 2001 ~7000 的数据时, 就会意识到了 数据1001 ~ 2000 的数据 没有发送成功 ,所以就会

重新发送这段数据。 并且 后面数据由于确认序号是升序的 , 已经 接收到后面的数据了 , 就不需要重新发送后面的数据。

相当于 一个萝卜一个坑 , 前面的坑虽然没有补上, 会 一直响应需要补上前面的坑 , 后面的 坑如果被被补上了就不需要再补了

而上诉这种重传的方式, 我们就称之为: 快速重传机制

2. 快速重传的栗子说明

比如有一天女神要去参加闺蜜的婚礼,但是路上车打不上火, 这时她就问小编

女神: 我车打不着火了。

我: 检查一下车是不是没电了

女神: 我要是去迟了怎么办?

我: 检查一下车是不是没电了

女神: 我要是不能及时的话, 会耽误人家的大事的

我: 快检查一下车是不是没电了

女神: 我该怎么办,5555~~~

最后发现女神终于发现真的是电动车没电了

我一直说 检查一下车是不是没电了 , 就好比主机B一直 返回序号为 1001 的报文。

要求 主机A 重新发送 , 但是后面 女神的消息 是收到的, 所以不需要再重新发送

鱼式疯言

总结补充

确认应答——超时重传

滑动窗口——快速重传

他们的使用场景就相当于牛顿的经典力学和爱因斯坦的相对论

当需要传输的 数据很多很庞大 时, Tcp一般采取 滑动窗口——快速重传 的相关机制。

当需要传输的 数据并没有那么多 时, Tcp一般采取 确认应答——超时重传 的相关机制。


我们提及滑动窗口,会想到窗口的大小会影响 传输的速度, 所以选择 合适的窗口大小 是很有必要的

选择合适的窗口大小的意义就在于: 既要保证 数据包的不被丢失 , 也要保证传输的速度尽可能的快

而控制窗口大小的机制主要有两个: 流量控制拥塞控制

三. 流量控制

1. 流量控制的初识

如果说 滑动窗口比喻成踩油门 , 那么 流量控制就好比是踩刹车

我们知道在前面小编带着小伙伴们写过一个简易的Tcp 回显服务器, 其中没使用一个Socket 对象, 都存在一个 缓存区 的概念。

缓存区就是用来 防止数据传输过多 , 而 临时存放数据一个空间区域

流量控制 就是: 根据缓存区的 剩余空间的大小 , 来调整 滑动窗口的大小

2. 流量控制的大体流程

在这里插入图片描述

在这里插入图片描述

如上图第一张到第二张的变化:

假设缓存区大小为 100 byte

先是存放数据 60 byte, 还剩 40byte

然后通信了一段时间, 变成 80byte 数据 , 还剩 20 byte

这时我们就知道了, 发送方 传输的数据很快 ,但是接收方 处理数据很慢

这时由于传输的数据相对太快了, 我们就需要把 窗口调整的小一点 , 让传输的数据尽可能的慢一点, 让 接收方尽可能的能够处理数据

而如何让发送方知道 窗口大小需要传输小一点 呢?

在这里插入图片描述

如上图, 有一个 16位的窗口大小 , 当 Tcp 需要 调整窗口大小 时, 就需要由接收方感知 缓存区的大小 , 通过 ACK 报文 返回缓存区中剩余的空间大小, 从而让 发送方调整窗口大小控制传输的速率

鱼式疯言

总结补充:

  1. 窗口 不是固定不变 , 而是通过 缓存区的剩余空间进行调整 , 会 不断动态变化, 动态调整的
  1. 窗口扩展

16窗口大小 为 64 MB, 如果 实际所需要的窗口大小 > 64MB , 这时就会在 选项中扩展

其中有一个 扩展因子 , 就会让 窗口大小<< 扩展因子

也就是如下方法:

假如 扩展因子为 3

窗口大小 = 64MB * 2的3次方

四. 拥塞控制

1. 拥塞控制的引入

如果说 滑动窗口快速重传踩油门

那么 流量控制 和 拥塞控制 就是 踩刹车

所以说 拥塞控制和流量控制 都是 控制窗口大小 来调整 传输的速度

在这里插入图片描述

主机A 和 主机B 的网络通信中, 在 传输的链路的过程中 , 会经过大量的 交换机

如果传输的 数据量很大,速度很快 , 其中 一个交换机无法承受, 就会出现在 某个交换机中 出现 丢包现象

那么我们有什么解决方案吗?

是检查 某个链路是否出现丢包 , 还是 检查某个交换机出现丢包现象

其实上述的这两种方案都不可取, 所以Tcp 采取了 拥塞控制 的机制,来解决上述问题 。

下面让来看看吧 💞💞💞💞

2. 拥塞控制的大体流程

在这里插入图片描述

如上图:

我们程序猿不仅是技术人员,更有一个名字称为 工程师, 聪明的工程师们就会通过做实验的方式, 来动态 调整窗口的大小控制传输速率减少丢包问题 的发生。

首先, 设置 一个很小的窗口 , 以 一个很小的速度 传输数据

确保数据在 链路传输中通畅 , 再继续 加大窗口加快传输数据

传输速度达到一定 时, 再 增加数据

一旦出现 丢包 , 就慢慢 减少窗口 , 直到 不丢包

不丢包 的情况下, 继续加大窗口, 加快传输速率

以此 循环往复 ,让窗口处在一个 相对大小的幅度上波动

既让一定大小的传输速率能 提高一定的效率 , 也能 尽可能的不丢包

鱼式疯言

总之上诉过程就记住一句话:

面多加水, 水多加面

总结

  • 滑动窗口: 从一个数据的传输到一批数据的传输, 从而经可能减少时间损耗, 提高时间效率的过程,以及滑动窗口的流程分析,只要一有ACK 返回, 就立即发送下一条的数据。

  • 快速重传: 当数据在进行滑动窗口时, 出现数据包丢失时,会一直返回发送方缺失的数据, 直到发送方重新发送丢失的数据。

  • 流量控制: 流量控制就是一种通过监测缓存区中数据剩余空间来控制窗口大小来控制数据传输的速率, 从而减少丢包问题的出现。

  • 拥塞控制: 在保证不丢包的情况下, 尽可能的加大窗口大小,加快传输速率,一旦丢包就减少窗口大小, 以此循环往复的进行动态调整。

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

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

在这里插入图片描述

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

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

相关文章

2024永久激活版 Studio One 6 Pro for mac 音乐创作编辑软件 完美兼容

Studio One 6是一款功能强大的音乐制作软件&#xff0c;由PreSonus公司开发。它提供了全面的音频录制、编辑、混音和母带处理工具&#xff0c;适用于音乐制作人、音频工程师和创作人员。 Studio One 6拥有直观的用户界面&#xff0c;使用户能够快速而流畅地进行音乐创作。它采…

MOE论文汇总

最近对MOE感兴趣&#xff0c;现汇总MOE无监督相关的文章&#xff0c;文章均为略读 文章 Self-Supervised Mixture-of-Experts by Uncertainty estimation 发表于:AAAI19 流程: 总体来说&#xff0c;当环境给出反馈&#xff0c;通过门控网络激活相应的专家去交涉。但是&…

LabVIEW减速机加载控制系统

为了保障减速机的产品质量&#xff0c;开发了一套基于LabVIEW的减速机加载控制系统。该系统利用先进的传感技术与自动化控制理念&#xff0c;实现了减速机性能的全面测试与分析&#xff0c;有效提升了生产线的自动化水平与检测效率。 项目背景 随着工业自动化水平的不断提高&a…

面试官问:请描述一次你成功解决问题的经历?

面试官为什么要这么问&#xff1f; 面试官问你描述一次成功解决问题的经历&#xff0c;主要是为了评估你的几个关键方面&#xff1a; 问题解决能力&#xff1a;了解你在面对挑战时的思维方式和应对策略。 决策能力&#xff1a;考察你在压力下做出明智决定的能力。 沟通技巧&am…

Linux实操笔记2 Ubuntu安装Nginx的不同方法

今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。 一、Nginx是什么&#xff1f; 以下是来自Nginx中文文档的内容。 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器&#xff1a;相比…

Matlab生成prbs7的代码

最近的一个客户需求&#xff0c;客户想看一下我们的产品产生的prbs并进行一些分析。 我在“”豆包“”这里找到了一个pbs的matlab的生成程序&#xff0c;效果就是连续生成prbs7&#xff0c;然后每次都在原来的基础之上添加。 生成的matlab的PRBS7代码修改如下&#xff1a; %…

深入了解字符函数和字符串函数

前言&#xff1a;今天给大家深入理解一下字符函数 和 字符串函数。通过使用 和 模拟实现 带大家加深理解&#xff0c;让大家灵活使用。 字符函数 在C语言中&#xff0c;有一系列函数是专门做字符分类的&#xff0c;也就是一个字符属于什么类型的字符。 这些函数的使用都要包含…

Redis embstr 编码

embstr 编码 是 Redis 中一种优化存储小型字符串的编码方式。它是 Redis 内部存储字符串的多种方式之一&#xff0c;特别适用于存储长度不超过 44 字节的小字符串。

java中Class文件的文件格式

无关性的基石 计算机底层只能识别二进制&#xff0c;由CPU直接处理二进制&#xff0c;在底层上面是操作系统&#xff0c;在操作系统上面就是虚拟机&#xff0c;java有一个口号&#xff0c;“一次编写&#xff0c;到处运行”这个不太可能在操作系统层面上实现&#xff0c;不同的…

SQL Server开启网络访问

目前工作中很少用到SQL Server了&#xff0c;最近需要测试几个表&#xff0c;需要搭建一个SQL Server数据库服务&#xff0c;这里做个总结吧。 安装这里就不做详细介绍了&#xff0c;本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…

时序最佳入门代码|基于pytorch的LSTM天气预测及数据分析

前言 在本篇文章&#xff0c;我们基于pytorch框架&#xff0c;构造了LSTM模型进行天气预测&#xff0c;并对数据进行了可视化分析&#xff0c;非常值得入门学习。该数据集提供了2013年1月1日至2017年4月24日在印度德里市的数据。其中包含的4个参数是平均温度&#xff08;meant…

【数字集成电路与系统设计】Chisel/Scala简介与Verilog介绍

目录 一、芯片前端设计开发背景知识 二、Verilog介绍 2.1 硬件设计一些重要概念 2.2 功能性仿真 2.3 简单的Verilog代码例子&#xff08;4-bit的加法器&#xff09; 三、Chisel简介 3.1 Chisel基本概念 3.2 Chisel代码展示 3.3 Chisel转成Verilog代码 四、Scala入…

数据清洗-缺失值填充-对XGBoost参数优化填充

目录 一、安装所需的python包二、采用XGboost算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1 代码运行过程截屏&#xff1a;2.2.2 填充后的数据截屏&#xff1a; 三、网格搜索&#xff08;Grid Search&#xff09;对 XGBoost 模型的超参数进行优化原理介…

Windows 上下载、编译 OpenCV 并配置系统环境变量的详细步骤

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 在 Windows 上下载并编译 OpenCV&#xff0c;然后配置系统环境变量的步骤如下&#xff1a; 1. 下载 OpenCV 打开 OpenCV 官方下载页面。找到最新的 Windows 版本&#xff0c;点击下载&…

初中生物--4.生物体的结构层次(二)

一、植物体的结构层次 1.绿色开花植物的六大器官 根、茎、叶、花、种子、果实 2.植物的组织 3.植物体的生长 植物体的生长是细胞分裂、生长和分化的综合结果。在植物体的生长过程中&#xff0c;细胞不断分裂产生新的细胞&#xff0c;新细胞不断生长使细胞体积增大&#xff…

数据结构 - 队列

一.队列的定义 1.队列的分类 队列根据存储结构可以分为 顺序队列 和 链式队列 2.队列的结构 ①.顺序队列 顺序队列的 front 指向队首元素的前一个下标 ②.链式队列 二.顺序队列的基本运算 0.顺序队列的结构体定义 typedef int data_t;typedef struct {data_t *data; …

stable diffusion 反推提示词插件 tagger 的安装,很详细

stable diffusion 反推提示词插件 tagger 的安装&#xff0c;很详细 一、前言二、下载1、方式一2、方式二 一、前言 最近想下载 stable diffusion 反推提示词插件 tagger &#xff0c;也是好一番折腾&#xff0c;这里做个记录。 在安装之前确保能正常访问 github &#xff0c…

图像增强技术分析

图像增强是一种图像处理技术&#xff0c;旨在改善图像的视觉质量&#xff0c;使其更适合显示或进一步分析。这种技术可以应用于多种场景&#xff0c;包括医学成像、卫星图像、视频处理以及文本到图像生成模型等领域。图像增强的目标通常是提高图像的某些视觉特征&#xff0c;如…

[内网渗透]---msf基础-永恒之蓝-ms17-010

what Metasploit&#xff08;通常简称为MSF&#xff09;是一个开源的渗透测试框架&#xff0c;包含大量的已知漏洞利用模块&#xff0c;可以用来攻击目标系统并获取控制权。 how 实验环境&#xff1a;Kali、带有永恒之蓝漏洞的虚拟机且开启445端口(两个虚拟机同一子网) 1.信…

FPGA-Vivado-IP核-虚拟输入输出(VIO)

VIO IP核 背景介绍 Vivado中的VIO&#xff08;Virtual Input/Output&#xff0c;虚拟输入/输出&#xff09; IP核是一种用于调试和测试FPGA设计的IP核。当设计者通过JTAG接口与FPGA芯片连接时&#xff0c;在Vivado的Verilog代码中添加VIO IP核&#xff0c;就可以让设计者与FPG…