【网络原理】TCP提升效率机制(二):流量控制和拥塞控制
目录
一. 前言
二. 流量控制
三. 拥塞控制
一. 前言
TCP的可靠传输依靠确认应答机制,超时重传机制是对确认应答的一种补充,解决了丢包问题
为了提高传输效率,避免大量的时间都浪费在等待应答的过程,故引入了滑动窗口机制,将等待策略进行调整,一次性发送多个数据然后等待,滑动窗口的窗户大小决定了传输效率
通过流量控制和拥塞控制机制,共同决定窗口的大小
二. 流量控制
众所周知,窗口越大,一次携带的数据就越多,传输效率就越高,但是窗口不能无限增大,如果窗口过大,可能会影响传输的可靠性(TCP中可靠性最重要)
窗口过大
- 窗口过大,传输效率太快,可能会出现接收方处理不过来,那么可能会出现丢包问题
- 如果接收方缓冲区,已经满了,仍然传入数据,那么多出来的数据就会丢掉
- 丢包数据即使重传,依然没有意义,因为缓冲区还是满的
如果出现缓冲区满的问题,那就只能停下,等接收方处理一些数据之后,再发数据
这种缓冲区满了,就停下来的行为,肯定是不可取的,不如控制传输速度
只需要让发送方发送速度和接收方处理速度,步调一致即可,这个过程肯定不是静态的,是一直在变化的
让接收方反过来影响发送方的发送速度即可(流量控制)
接收方如何影响发送方?
接收方在返回ACK报文的时候,在报头中,有一个16位窗口大小,通过这个字段,反馈给发送方将窗口大小设置为多大合适
窗口大小的设置
接收方会根据自己接收缓冲区剩余的大小,作为ACK报文中的窗口大小数值,接收方拿到这个数值进行调整窗口大小
窗口大小最大不是65535字节(16位),可以通过TCP选项中的参数(窗口扩展因子),扩展窗口大小,通常窗口的大小为16位窗口大小*2^窗口扩展因子
接收方如何得知缓冲区满了?
如果接收方收到的ACK报文中,窗口大小为0,则表示接受缓冲区满了,需要停止发送
如何恢复发送?
发送方会周期性的发送窗口探测包(不携带载荷),只是为了触发ACK报文,如果报文中窗口大小不是0,说明又可以发送了
三. 拥塞控制
流量控制关注的是接收方的缓冲区,拥塞控制关注的是传输路况
接收方处理数据的速度很快,但是这会双方通信路况不好,数据不能到达,发送方发送再多的数据也没有用
如果根据某个窗口大小发送数据,但是出现了丢包问题,那么就可以认为通信路径发送了问题,那么就减少窗口大小,如果正常,那么就可以适当放大窗口
由于网络的复杂性和随机性,无法确定什么时候路况好,什么时候不好,窗口大小是一直变化的
经典版本
拥塞控制中如何得知窗口大小?(一个字“试!”)
- 慢启动:由于刚刚开始传输数据,无法准确判断传输的路况,不适合发送大量数据,也有可能传输路况很好,那么通过指数增长窗口大小,可以保证传输的效率
- 拥塞避免:指数增长达到一定的阈值,就会转变为线性增长
- 拥塞处理:这里涉及两种策略:超时重传/快速恢复
为什么指数增长变为线性增长?
一开始使用指数增长,可以让窗口大小快速变大,可以保证传输速率,到达一定的阈值(会变化),如果保持指数增长,会增长太快,可能导致网络拥堵,使用线性增长,可以使窗口持久保持在一个比较高的速率,并且也不容易丢包
为什么会产生拥塞?
线性增长也是一种增长,时间长了,也是会引起丢包问题,一旦出现丢包,就会直接将窗口大小设为较小的值,重新开始,也会重新设置指数增长的阈值
全新版本
这个全新的版本,相比经典版本,更适合现在的网络环境,现在网络环境相比之前不管是网络带宽还是通信质量都有很大的进步
当网络拥堵时,发生数据丢包情况,则会触发快速重传机制,TCP会立即重传丢失的数据包,而无需等待,窗口的大小会变为拥塞时的一半,后续就没有指数增长的过程,一直都是线性增长,下一次拥塞时,在变为原来的一半,线性增长,一直循环
好处
-
避免从慢启动开始,减少吞吐量波动。
-
更平滑地恢复传输速率。
滑动窗口的大小是依靠拥塞控制和流量控制共同实现的,取其中的的最小值
点赞的宝子今晚自动触发「躺赢锦鲤」buff!
相关文章:

【网络原理】TCP提升效率机制(二):流量控制和拥塞控制
目录 一. 前言 二. 流量控制 三. 拥塞控制 一. 前言 TCP的可靠传输依靠确认应答机制,超时重传机制是对确认应答的一种补充,解决了丢包问题 为了提高传输效率,避免大量的时间都浪费在等待应答的过程,故引入了滑动窗口机制&…...

语音合成之六端到端TTS模型的演进
端到端TTS模型的演进 引言Tacotron:奠基之作FastSpeech:解决效率瓶颈VITS:实现高保真和富有表现力的语音SparkTTS:利用LLM实现高效可控的TTSCosyvoice:一种可扩展的多语种TTS方法端到端TTS模型的演进与未来方向 引言 …...

Properties配置文件
Properties(是一个特殊的Map)默认键值都是String类型 备注:Properties能调用Map中的所有方法,但由于放入Properties中的key-value都是String类型,Properties中提供了特殊的存值和取值的方法,所以尽量不要用Map中的方法,如下 Properties的作用 A、将内存中的数据写入到…...
C#高级语法--接口
先引用一些通俗一点的话语说明 1. 接口就像“插座标准”(解耦) 🧩 场景: 你家的手机充电器(USB-C、Lightning)必须插进匹配的插座才能充电。问题:如果每个手机品牌插座都不一样,你换手机就得换充电器,太麻烦了!💡 接口的作用: 定义一个通用的充电口标准(比如U…...
5.6 Microsoft Semantic Kernel:专注于将LLM集成到现有应用中的框架
5.6.1 Semantic Kernel概述 Microsoft Semantic Kernel(以下简称SK)是一个开源的软件开发工具包(SDK),旨在帮助开发者将大型语言模型(LLM)无缝集成到现有的应用程序中。它支持C#、Python和Java…...

【尚硅谷Redis6】自用学习笔记
Redis介绍 Redis是单线程 多路IO复用技术(类似黄牛买票) 默认有16个库,用select进行切换 默认端口号为6379 Memcached:多线程 锁(数据类型单一,不支持持久化) 五大常用数据类型 Redis key …...

Vue里面elementUi-aside 和el-main不垂直排列
先说解决方法 main.js少导包 import element-ui/lib/theme-chalk/index.css; //加入此行即可 问题复现 排查了一个小时终于找出来问题了,建议导包去看官方的文档,作者就是因为看了别人的导包流程导致的问题 导包官网地址Element UI导包快速入门...

VS Code搭建C/C++开发环境
文章目录 一、VScode 是什么?二、VScode的下载和安装1、下载2、安装 三、环境介绍1、安装中文插件 四、VScode配置 C/C开发环境1、下载MinGW-w64 编译器套件2、配置MingGW643、验证4、安装C/C插件 五、在VSCode上编写C语言代码并编译成功1、打开文件夹2、新建C语言文件&#x…...
6.ArkUI Row的介绍和使用
ArkUI Row 组件介绍与使用指南 什么是 Row 组件? Row 是 ArkUI 中的基础布局容器组件,用于水平(横向)排列子组件。它与 Column 组件相对应,是构建用户界面最常用的布局方式之一,类似于其他UI框架中的水平…...

mysql 在 dbeaver中下载驱动失败处理
直接上解决方法 1. 在mysql官网下载驱动 2. 引入dbeaver中即可 3. 最后再双击即可...

Java 安全:如何防止 SQL 注入与 XSS 攻击?
Java 安全:如何防止 SQL 注入与 XSS 攻击? 在 Java 开发领域,安全问题至关重要,而 SQL 注入和 XSS 攻击是两种常见的安全威胁。本文将深入探讨如何有效防止这两种攻击,通过详细代码实例为您呈现解决方案。 一、SQL 注…...

fastbev mmdetection3D 角度和方向损失
角度/方向损失 sin(a−b)sinacosb−cosasinb config参数 dir_offset0.7854, # pi/4 dir_limit_offset0, box编解码 # Copyright (c) OpenMMLab. All rights reserved. import torchfrom mmdet.core.bbox import BaseBBoxCoder from mmdet.core.bbox.builder import BBOX_COD…...
力扣-hot100(滑动窗口最大值)
239. 滑动窗口最大值 困难 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums […...

一种专用车辆智能配电模块的设计解析:技术革新与未来展望
关键词:智能配电模块、STM32、CAN总线、电子开关、新能源汽车 引言:传统配电系统的痛点与智能化转型 传统配电系统依赖继电器和保险丝,存在体积大、寿命短、智能化低等缺陷(如图1)。而新能源汽车和无人驾驶技术对配电…...

《深入浅出ProtoBuf:从环境搭建到高效数据序列化》
ProtoBuf详解 1、初识ProtoBuf2、安装ProtoBuf2.1、ProtoBuf在Windows下的安装2.2、ProtoBuf在Linux下的安装 3、快速上手——通讯录V1.03.1、步骤1:创建.proto文件3.2、步骤2:编译contacts.proto文件,生成C文件3.3、步骤3:序列化…...

Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)
目录 一、国密标准中,关于SM2签名验签的定义二、SM2签名和验签的实现原理1. 前置知识2. 签名生成过程3. 验签过程4. 数学正确性证明5. 安全性与注意事项 三、带userId、不带userId的区别1. 核心区别2.算法区别(1) 哈希计算过程(2) 签名验签流程 四、Java代码实现1. …...

【华为HCIP | 华为数通工程师】821—多选解析—第十七页
多选835、IS-IS协议所使用的NSAP地址主要由哪几个部分构成? A、AREA ID B、SEL C、DSCp D、SYSTEM ID 解析:NSAP地址:网络服务访问点(Network Service Access Point)是 OSI 协议中用于定位资源的地址。NSAP 的地址结构如图所示,它由 IDP(Initial Domain …...

函数的定义与使用(python)
lst[:]是传入lst的拷贝。改变它对原始lst没有任何影响。 *list一个*的元素在函数体内会被当成一个元组。 以下是对图中 Python 代码的详细解释: 代码总体功能 这段代码定义了一个生成器函数 getItem ,用于依次返回多个列表中的元素。然后通过循环遍历…...

List findIntersection getUnion
List findIntersection & getUnion 求两个列表的交集和并集 package zwf;import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List;/*** 列表工具类* * author ZengWenFeng* date 2025.04.22* mobile 13805029595* email 117791303qq.com*/ p…...

乒乓操作(Ping-Pong)
乒乓操作 “ 乒乓操作” 是一个常常应用于数据流控制的设计思想, 典型的乒乓操作方法如下图 所示: T1周期,输入数据流1缓存到数据缓冲模块1中,如上图棕色;T2周期,输入数据流2缓存到数据缓冲模块2中&…...

微信小程序文章管理系统开发实现
概述 在内容为王的互联网时代,高效的文章管理系统成为各类平台的刚需。幽络源平台今日分享一款基于SSM框架开发的微信小程序文章管理系统完整解决方案,该系统实现了多角色内容管理、智能分类、互动交流等功能。 主要内容 一、用户端功能模块 多角…...

GrassRouter 小草MULE多5G多链路聚合通信路由设备在应急场景的聚合效率测试报告及解决方案
在应急通信场景中,快速、稳定、高效的通信链路是保障救援工作顺利开展的关键。MULE(Multi-Link Unified Link Enhancement)多链路聚合路由通信设备作为一种新型的通信技术解决方案,通过聚合多条通信链路(如4G/5G、卫星…...
筑牢数字防线:商城系统安全的多维守护策略
一、构建网络安全防护屏障 网络安全是商城系统安全的第一道防线。企业应采用先进的防火墙技术,实时监控和过滤进出网络的流量,阻止非法访问和恶意攻击。入侵检测与防御系统(IDS/IPS)也是不可或缺的安全组件,它能够及…...
Linux阻塞与非阻塞I/O:从原理到实践详解
Linux阻塞与非阻塞I/O:从原理到实践详解 1. 阻塞与非阻塞I/O基础概念 1.1 阻塞与非阻塞简介 在Linux系统编程中,I/O操作可以分为两种基本模式:阻塞I/O和非阻塞I/O。这两种模式决定了当设备或资源不可用时,程序的行为方式。 阻…...

【MySQL】MySQL索引与事务
目录 前言 1. 索引 (index) 1.1 概念 1.2 作用 1.3 使用场景 1.4 索引的相关操作 查看索引 创建索引 删除索引 2. 索引背后的数据结构 2.1 B树 2.2 B+树的特点 2.3 B+树的优势 3. 事务 3.1 为什么使用事务 3.2 事…...

华为网路设备学习-19 IGP路由专题-路由策略
一、 二、 注意: 当该节点匹配模式为permit下时,参考if else 当该节点匹配模式为deny下时: 1、该节点中的apply子语句不会执行。 2、如果满足所有判断(if-match)条件时,拒绝该节点并跳出(即不…...
力扣-234.回文链表
题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 class Solution { public:bool isPalindrome(ListNode* head) {//快慢指针找到中间结点p1(偶数个结点…...
Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战
本文基于 Spring Boot 2.7.x MyBatis Plus 3.5.9,演示如何通过 Lock4j 与 Redisson 实现高可靠的分布式锁方案,解决高并发场景下的资源竞争问题。 一、依赖配置关键点 1.1 Maven 依赖(pom.xml) <dependency><groupId&g…...

基于DrissionPage的表情包爬虫实现与解析(含源码)
目录 编辑 一、环境配置与技术选型 1.1 环境要求 1.2 DrissionPage优势 二、爬虫实现代码 三、代码解析 3.1 类结构设计 3.2 目录创建方法 3.3 图片链接获取 3.4 图片下载方法 四、技术升级对比 4.1 代码复杂度对比 4.2 性能测试数据 五、扩展优化建议 5.1 并…...
无限debugger实现原理
1. 直接调用 debugger 关键字 代码示例: debugger; // 手动触发调试器中断特点: 最简单的方式,直接插入 debugger 语句。若未在浏览器开发者工具中禁用断点,每次执行到此代码都会暂停。反制手段:可通过浏览器开发者…...