TCP 流量控制 - 滑动窗口和拥塞控制算法解析
滑动窗口主要管理数据流动的速率,对单个连接较好,拥塞控制则防止网络出现过载,对提高整体的网络通畅较好。下面详细解析两者的原理和作用。
1. TCP 滑动窗口算法
TCP 使用滑动窗口机制来控制数据的发送和接收,以实现流量控制,避免接收方被数据淹没。该算法的核心是让发送方根据接收方的接收能力来调整数据发送速率。
a) 基本概念
- 发送窗口:发送方可以连续发送的数据量,由 TCP 头部的
Window字段确定,是接收方能够处理的最大数据量。 - 接收窗口:接收方能够处理的最大数据量,告诉发送方当前自己能接收多少数据。
- 已确认区间:发送方已发送并收到确认的数据部分。
- 未确认区间:发送方已发送但还未收到确认的数据部分,仍在等待 ACK。
- 可发送区间:发送方可以发送的新的数据,这个区间是由接收窗口决定的。
b) 滑动窗口的工作机制
滑动窗口通过控制数据发送的字节数量来实现流量控制。当发送方发送了数据,它可以在未收到 ACK 的情况下继续发送数据,只要这些数据在窗口大小内:
- 发送数据:发送方根据接收方的窗口大小,持续发送数据。
- 等待确认:接收方收到数据后,返回 ACK 确认已接收的数据。
- 窗口滑动:当接收方确认某些数据后,窗口就向前滑动,允许发送更多数据。
c) 窗口调整
- 接收方可以在任何时候调整窗口大小。如果接收方缓存满了,它会将窗口大小设置为 0,告诉发送方停止发送;当接收方有更多空间时,会增大窗口。
d) 流量控制
滑动窗口机制的主要作用是流量控制,确保发送方不会因为过快发送数据而导致接收方处理不过来。这种机制对于防止接收方过载和避免数据丢失至关重要。
2. TCP 拥塞控制算法
拥塞控制的主要目的是防止网络拥塞,即避免由于过多的数据流导致网络资源(如带宽、路由器缓冲区等)耗尽。TCP 使用四种核心算法来动态调整数据发送速率,以适应网络的拥塞情况。
a) 拥塞窗口( cwnd)
拥塞窗口是 TCP 的一个动态变量,表示网络上当前可安全发送的数据量。发送方根据拥塞窗口的大小来调整发送数据的速率,避免网络出现拥塞。
b) 四大拥塞控制算法
1) 慢启动
- 目的:防止网络初期拥塞,逐步增加数据发送速率。
- 工作原理:每当一个新的连接建立时,TCP 会以较小的拥塞窗口开始发送数据(通常是 1 个 MSS,最大报文段),然后每次成功收到 ACK,窗口大小就会指数级增长(每收到一个 ACK,拥塞窗口大小加倍)。
- 慢启动门限(ssthresh):当拥塞窗口增长到达一定阈值(ssthresh)时,TCP 就会停止慢启动阶段,进入拥塞避免阶段。
2) 拥塞避免
- 目的:防止网络拥塞加剧,窗口增速从指数级变为线性。
- 工作原理:在进入拥塞避免阶段后,每收到一个 ACK,窗口大小只增加一个 MSS(线性增长),确保不会因为过快增长导致拥塞。
3) 快速重传
- 目的:在发生数据包丢失时快速重传丢失的数据包。
- 工作原理:当发送方收到三个重复的 ACK 时,认为有数据包丢失,立即重传丢失的数据包,而不等待超时。
4) 快速恢复
- 目的:避免慢启动重新开始,提升恢复效率。
- 工作原理:与快速重传配合,重传丢失的数据包后,不进入慢启动,而是根据网络状况直接调整拥塞窗口大小。
c) 拥塞控制的过程
拥塞控制过程包括以下四个阶段:
- 慢启动阶段:窗口从一个小值(通常 1 个 MSS)开始,指数级增长,直到达到慢启动门限(ssthresh)。
- 拥塞避免阶段:当窗口大小超过 ssthresh 后,窗口以线性速度增长,防止拥塞。
- 快速重传阶段:检测到数据包丢失时,快速重传丢失的数据包,尽量减少等待时间。
- 快速恢复阶段:快速恢复后,窗口不会回到 1,而是调整到适当大小,继续线性增长。
3. 滑动窗口与拥塞控制的区别与联系
- 滑动窗口主要用于流量控制,防止发送方发送数据太快导致接收方无法处理,更多是关注接收方的处理能力。
- 拥塞控制则是用于防止网络拥塞,通过调整拥塞窗口的大小,动态调整发送速率,更多是关注网络的承载能力。
两者可以结合起来使用:滑动窗口控制的是接收方的接收能力,而拥塞窗口控制的是网络的可承载能力。实际的发送窗口是滑动窗口和拥塞窗口的最小值,确保既不超过接收方能力,也不让网络过载。
4. 总结
- TCP 滑动窗口算法通过动态调整窗口大小,确保发送方不会超过接收方的处理能力,避免过多数据导致接收方处理过载,实现流量控制。
- TCP 拥塞控制算法通过动态调整拥塞窗口,防止网络拥塞。包括慢启动、拥塞避免、快速重传和快速恢复四种机制,分别用于不同的网络状态和阶段。
- 两者共同作用,确保 TCP 在传输数据时既能高效利用网络资源,又能保证数据可靠传输。
相关文章:
TCP 流量控制 - 滑动窗口和拥塞控制算法解析
滑动窗口主要管理数据流动的速率,对单个连接较好,拥塞控制则防止网络出现过载,对提高整体的网络通畅较好。下面详细解析两者的原理和作用。 1. TCP 滑动窗口算法 TCP 使用滑动窗口机制来控制数据的发送和接收,以实现流量控制&…...
MongoDB聚合操作及索引底层原理
目录 链接:https://note.youdao.com/ynoteshare/index.html?id=50fdb657a9b06950fa255a82555b44a6&type=note&_time=1727951783296 本节课的内容: 聚合操作: 聚合管道操作: 编辑 $match 进行文档筛选 编辑 将筛选和投影结合使用: 编辑 多条件匹配: …...
C++ | Leetcode C++题解之第454题四数相加II
题目: 题解: class Solution { public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {unordered_map<int, int> countAB;for (int u: A) {for (int v: B) {count…...
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
目录 stm32cubemx配置芯片选择工程配置stm32基础配置SPI的配置定时器的配置ADC的配置中断优先级的配置生成工程 工程代码编写FOC代码结构搭建电机编码器角度读取PWM产生FOC开环代码编写确定电机正负旋转方向电机旋转速度计算多圈逻辑角度电流采样极对数转子角度确定 闭环控制控…...
谷歌收录查询工具,谷歌收录查询工具的使用指南
谷歌收录查询工具是网站管理员和SEO专业人士用于检查网站是否被谷歌搜索引擎收录及其收录情况的重要辅助手段。以下是一些常用的谷歌收录查询工具及其详细使用指南: 一、Google Search Console(谷歌搜索控制台) 简介: Google Sea…...
vue3 拖拽插件(drag)
前端vue项目中,经常会有弹框拖拽的需求,下面介绍常用方法: 1.如果你使用的是elementPlus插件的el-dialog组件,只需要增加draggable属性即可,代码如下: <el-dialogv-model"showDiloag"width"500&quo…...
数据结构--线性表(顺序结构)
1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 (1)n(>0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。 (2)…...
面试准备111
Java基础 反射 集合 多线程 Synchronized/volatile 线程池 cas atomic 网络 tcp 三次握手/四次挥手 流量控制 拥塞控制 数据结构 算法 Spring 循环依赖 Mybatis 如何防止sql注入 Mysql 索引 索引分类 索引设计原则 事务 四种隔离级别 MVCC 日志 Binlog…...
Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
在现代Java开发中,Spring框架几乎是不可或缺的存在。它不仅简化了开发过程,还提高了软件的灵活性和可维护性。今天,我们要深入探讨Spring中的两个核心概念:IOC(控制反转)和AOP(面向切面编程&…...
第二百六十四节 JPA教程 - JPA查询日期参数示例
JPA教程 - JPA查询日期参数示例 我们可以在查询中使用日期类型值。 以下代码使用EntityManager创建具有两个参数的查询。 然后它传递两个日期类型值。 em.createQuery("SELECT e " "FROM Professor e " "WHERE e.startDate BETWEEN :start AND :en…...
Spring MVC的运行流程详解
Spring MVC作为一个广泛使用的框架,提供了灵活且强大的MVC架构支持。尤其在业务系统中,Spring MVC能够有效地处理大量并发请求,提供良好的用户体验。本文将详细讲解Spring MVC的运行流程,以电商交易系统为案例,帮助读者…...
判断有向图是否为单连通图的算法
判断有向图是否为单连通图的算法 算法描述伪代码C语言实现解释在图论中,单连通图(singly connected graph)是指对于图中的任意两个顶点 m 和 v,如果存在从 m 到 v 的路径,则该路径是唯一的。为了判断一个有向图是否为单连通图,我们需要确保从任意顶点出发,到任意其他顶点…...
php与python建站的区别有哪些
php与Python建站的区别: 1、语言层面Python的特性比php好,更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码,在php里每个请求都会被执行一次,Python不需要。虽然php可以通过缓存缩短这方面的差距…...
模型评估与验证:确保模型在未知数据上的表现----示例:使用K折交叉验证评估分类模型、房价预测问题使用K折交叉验证来评估一个线性回归模型的性能
模型评估与验证是机器学习流程中的关键步骤,它帮助我们了解模型在未见过的数据上的泛化能力。交叉验证(Cross-Validation, CV)是一种常用的技术,通过将数据集划分为多个子集并进行多次训练和测试来估计模型的性能。此外࿰…...
awd基础学习
一、常用防御手段 1、改ssh密码 passwd [user] 2、改数据库密码 进入数据库 mysql -uroot -proot 改密码 update mysql.user set passwordpassword(新密码) where userroot; 查看用户信息密码 select host,user,password from mysql.user; 改配置文件 (否则会宕机…...
C#基于SkiaSharp实现印章管理(10)
向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。 最初的想法是使用PDF浏览控件在线打开PDF文件,然后在控件中实现鼠标移动时动态显示印章,点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目,选…...
通过栈实现字符串中查找是否有指定字符串的存在
题目示例: 分析 由与没有给出字符串的长度,所以只能通过getline一次性处理,而在输入后恰好能倒序处理字符串,以标点符号为分界点,将数字当成字符放到栈里,遇到下一个标点符号时执行查找操作,…...
MongoDB伪分布式部署(mac M2)
1. 序言 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集? …...
Golang | Leetcode Golang题解之第454题四数相加II
题目: 题解: func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }...
[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷
在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
