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技术重现,包…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
