计算机网络:运输层 —— TCP 的拥塞控制

news2024/11/18 13:08:50

文章目录

    • TCP的拥塞控制
      • 拥塞控制的基本方法
        • 流量控制与拥塞控制的区别
        • 拥塞控制分类
          • 闭环拥塞控制算法
      • TCP的四种拥塞控制方法(算法)
        • 窗口
        • 慢开始门限
        • 慢开始算法
        • 拥塞避免算法
        • 快重传算法
        • 快恢复算法
      • TCP拥塞控制的流程
      • TCP拥塞控制与网际层拥塞控制的关系

TCP的拥塞控制

计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源。

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫作拥塞(congestion)。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。

![[拥塞控制.png]]

拥塞控制是 TCP 为了避免网络出现过载(拥塞)情况而采取的一种机制。在网络通信中,当发送的数据量超过网络的承载能力时,就会出现拥塞,导致数据包丢失、延迟增加等问题。

TCP 的拥塞控制机制通过动态地调整发送方的发送速率,使网络中的数据流量保持在一个合理的水平,以提高网络资源的利用率和数据传输的效率,同时保证数据传输的可靠性。

慢启动和拥塞避免

  • 在TCP建立连接之后,发送方会采用慢启动算法逐渐增加发送窗口的大小,以便测试网络的拥塞程度。

  • 如果网络出现拥塞,发送方会以指数增长的速度减小发送窗口的大小,从而减少发送速度,以避免网络拥塞的进一步加剧。

拥塞控制

  • TCP使用拥塞控制算法来检测网络拥塞并相应地减少发送速度。

  • 当网络出现拥塞时,发送方会采用拥塞避免算法,逐渐减小发送窗口的大小,以降低发送速度。

  • 通过监测丢包和延迟,发送方可以判断网络的拥塞情况并相应地调整发送速度。

衡量网络拥塞的指标包括:

  • 由于缓存溢出而丢弃的分组的百分比
  • 路由器的平均队列长度
  • 超时重传的分组数量
  • 平均分组时延和分组时延的标准差
  • ……

上述指标的上升,都标志着拥塞程度的增大

拥塞控制的基本方法

进行拥塞控制是需要付出代价的。可能需要在节点之间交换信息和各种命令,以便选择拥塞控制的策略并实施控制,这样会产生额外开销。还可能需要预留一些资源用于特殊用户或特殊情况,这样就降低了网络资源的共享程度。

然而,为了确保网络性能的稳定,不会因为输入负载的增长而导致网络性能的恶化甚至出现崩溃,使用拥塞控制而付出一定的代价是值得的。

流量控制与拥塞控制的区别

![[流量控制与拥塞控制的区别.png]]

  • 流量控制的主要任务是:解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题

  • 拥塞控制的主要任务是:防止过多的数据注入到网络中,使网络能够承受现有的网络负荷

拥塞控制分类

拥塞控制分为开环控制闭环控制

![[拥塞控制分类.png]]

  • 当网络的流量特征可以准确规定性能要求可以事先获得时,适合使用开环控制

  • 当网络的流量特征不能准确描述或者当网络不提供资源预留时,适合使用闭环控制。因特网采用的就是闭环控制方法。

闭环拥塞控制算法

根据拥塞信息的反馈形式,可将闭环拥塞控制算法分为显式反馈算法隐式反馈算法

![[闭环拥塞控制算法.png]]

  • 显式反馈算法:从拥塞节点(即路由器)向源点提供关于网络中拥塞状态的显式反馈信息。

  • 隐式反馈算法源点自身通过对网络行为的观察(例如超时重传或往返时间 RTT)来推断网络是否发生了拥塞。TCP 采用的就是隐式反馈算法

TCP的四种拥塞控制方法(算法)

TCP的四种拥塞控制方法分别为:

  • 慢开始 (slow-start)
  • 拥塞避免 (congestion avoidance)
  • 快重传 (fast retransmit)
  • 快恢复 (fast recovery)

为了集中精力讨论用塞控制算法的基本原理,假定如下条件:

  • 数据是单方向传送的,而另一个方向只传送确认。

  • 接收方总是有足够大的接收缓存空间,因而发送方的发送窗口的大小仅由网络的拥塞程度来决定,也就是不考虑接收方对发送方的流量控制

  • TCP 最大报文段 MSS(即 TCP 报文段的数据载荷部分)的个数作为讨论问题的单位,而不是以字节为单位(尽管TCP是面向字节流的)。

窗口

TCP 发送方要维护一个叫作发送窗口的状态变量 swnd,还要维护一个叫作拥塞窗口的状态变量 cwnd

TCP 接收方要维护一个叫作接收窗口的状态变量 rwnd

发送窗口 swnd 的取值为 s w n d = m i n ( c w n d , r w n d ) swnd=_{min}{(cwnd,rwnd)} swnd=min(cwndrwnd),发送方可将序号落入发送窗口 swnd 的数据连续发送出去。

  • 拥塞窗口 cwnd:取决于网络的拥塞程度和发送方所采用的 TCP 拥塞控制算法

  • 接收窗口 rwnd:取决于接收方可用的接收缓存的大小

![[窗口.png]]

  • cwnd 的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些,但只要网络出现拥塞,拥塞窗口就减少一些。

  • 判断网络出现拥塞的依据:没有按时收到应当到达的TCP确认报文段而产生了超时重传

慢开始门限

发送方还需要维护一个叫作慢开始门限的状态变量 ssthresh

  • cwnd < ssthresh 时,使用慢开始算法。

  • cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

  • cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

慢开始算法

在 TCP 双方建立连接时,拥塞窗口 cwnd 的初始值被设置为 1(初始为 1 个最大报文段长度 MSS),这是因为主机刚开始发送数据时,完全不知道网络的拥塞情况,如果立即把大量的数据都注入网络中,就有可能引起网络拥塞。

较好的方法是由小到大逐渐增大发送方的拥塞窗口 cwnd 的数值,直到发生拥塞。发送方每收到一个对新发送报文段的确认(ACK),就会将拥塞窗口大小增加 1 个 MSS,即拥塞窗口呈指数增长

本例情况不考虑 TCP 流量控制的情况,假设慢开始门限 ssthresh 为 16。

![[慢开始算法.png]]

拥塞避免算法

当发送方当前拥塞窗口 cwnd 的值,已经增大到了慢开始门限 ssthresh 的值,因此要改用拥塞避免算法,也就是每个传输轮次结束后,cwnd的值只能线性加 1

![[改用拥塞避免算法.png]]

发送过程中部分报文段发生了丢失,重传计时器超时,拥塞发送方以此判断网络可能出现了拥塞,需要调整自己的拥塞窗口 cwnd 的值和慢开始门限 ssthresh 的值。

慢开始门限 ssthresh 的值调整为拥塞开始时拥塞窗口 cwnd 的值的一半,将拥塞窗口 cwnd 的值减小为 1,并重新开始执行慢开始算法。当拥塞窗口 cwnd 的值,增大到了慢开始门限 ssthresh 的值,又重新改用拥塞避免算法

![[重新改用拥塞避免算法.png]]

绘制出本例的拥塞窗口 cwnd 的值随传输轮次 RTT 的变化关系图:

![[拥塞窗口cwnd的值随传输轮次RTT的变化关系图.png]]

  • 慢开始”是指一开始向网络注入的报文段少,而并不是指拥塞窗口 cwnd 的值增长速度慢。

  • 拥塞避免”也并非指完全能够避免拥塞,而是指在拥塞避免阶段将cwnd值控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传算法

有时,个别 TCP 报文段会在网络中丢失,但实际上网络并未发生拥塞,这将导致发送方超时重传,并误认为网络中发生了拥塞。

![[误认为网络中发生了拥塞.png]]

采用快重传算法可以让发送方尽早知道发生个别TCP报文段的丢失

“快重传”是指使发送方尽快(尽早)进行重传,而不是等重传计时器超时再重传,这就要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认

a c k n ack_n ackn 表明序号到 n 为止的数据已正确接收,现在期望收到序号为 n+1 的数据

发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的重传计时器超时再重传。

![[快重传算法.png]]

对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞而错误地把拥塞窗口 cwnd 的值减为1。实践证明,使用快重传可以使整个网络的吞吐量提高约20%

快恢复算法

与快重传算法配合使用的是快恢复算法,发送方一旦收到 3 个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而是执行快恢复算法

发送方将慢开始门限 ssthresh 的值和拥塞窗口 cwnd 的值,都调整为当前 cwnd 值的一半,并开始执行拥塞避免算法

也有的快恢复实现是把快恢复开始时的 cwnd 值再增大一些,即 cwnd = 新ssthresh + 3

  • 既然发送方收到了 3 个重复的确认,就表明有 3 个数据报文段已经离开了网络。

  • 这 3 个报文段不再消耗网络资源,而是停留在接收方的接收缓存中。

  • 可见现在网络中不是堆积了报文段而是减少了 3 个报文段,因此可以适当把 cwnd 值增大一些。

本例的拥塞窗口 cwnd 的值随传输轮次 RTT 的变化关系图:

![[拥塞窗口cwnd的值随传输轮次RTT的变化关系2.png]]

TCP拥塞控制的流程

![[TCP拥塞控制的流程.png]]

TCP 拥塞控制仍然是计算机网络中的一个研究热点,TCP 拥塞控制算法也还在不断地发展和变化。

TCP拥塞控制与网际层拥塞控制的关系

路由器的输入缓存(可看作缓存队列,以下简称为队列)通常都按照先进先出 FIFO 的规则来处理到达的IP数据报。由于队列长度总是有限的,因此当队列已满时,之后再到达的所有IP数据报都将被丢弃,这就叫作 尾部丢弃策略

![[全局同步问题.png]]

为了避免网络中出现全局同步问题,在1998年提出了主动队列管理(Active Queue Management,AQM)所谓“主动”,就是在路由器的队列长度达到某个阈值但还未满时就主动丢弃IP数据报,而不是要等到路由器的队列已满时才不得不丢弃后面到达的IP数据报,这样就太被动了。

应当在路由器队列长度达到某个值得警惕的数值时,也就是网络出现了某些拥塞征兆时,就主动丢弃到达的IP数据报来造成发送方的超时重传,进而降低发送方的发送速率,因而有可能减轻网络的拥塞程度甚至不出现网络拥塞。

主动队列管理 AQM 可以有不同的实现方法,其中曾流行多年的就是随机早期检测(Random Early Detection,RED),也称为随机早期丢奔(Random Early Drop,RED或 Random Early Discard,RED)。

路由器需要维护两个参数来实现RED:队列长度最小门限和最大门限。当每一个IP数据报到达路由器时,RED就按照规定的算法计算出当前的平均队列长度。

  • 平均队列长度小于最小门限,则把新到达的IP数据报存入队列进行排队。

  • 平均队列长度大于最大门限,则把新到达的IP数据报丢弃

  • 若平均队列长度在最小门限和最大门限之间,则按照某一丢弃概率p把新到达的IP数据报丢弃(这体现了丢弃IP数据报的随机性)

但使用 RED 机制效果并不理想,已被列为废弃。

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

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

相关文章

如何在Mysql中生成0-23完整的小时数据

目录 1. 创建表2. 插入0-23小时的数据3. 查询并合并数据 在数据分析中&#xff0c;我们经常需要对特定时间段内的数据进行统计和分析。 例如&#xff0c;在名片进线的场景中&#xff0c;我们可能需要了解一天内每小时的名片进线数量。 然而&#xff0c;由于某些时间点可能没有数…

【GeekBand】C++设计模式笔记12_Singleton_单件模式

1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题&#xff0c; 但是必不可免地要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…

架构篇(理解架构的模式2)

目录 一、管理和监控 大使模式&#xff1a;创建代表消费者服务或应用程序发送网络请求的帮助服务 反腐模式&#xff1a;在现代应用程序和遗留系统之间实现装饰或适配器层 外部配置存储&#xff1a;将应用程序部署包中的配置信息移动到中心化的位置 网关聚合模式&#xff1…

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起&#xff1a;最近需要通过iperf3打流&#xff0c;因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常&#xff0c;ubuntu20.04服务器上发送的流量过大…

DevOps工程技术价值流:打造卓越项目协作的优化宝典

一、引言 解锁项目协作的无限潜力&#xff0c;覆盖全链路实现流畅高效。 在当今瞬息万变的商业环境中&#xff0c;项目协作的效率和效果直接关系到企业的竞争力和市场响应速度。DevOps工程技术价值流中的项目协作优化&#xff0c;不仅是技术层面的革新&#xff0c;更是团队协…

WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统

安装WSL命令 管理员打开PowerShell或Windows命令提示符&#xff0c;输入wsl --install&#xff0c;然后回车 注意&#xff1a;此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意&#xff1a;默认安装最新的Ubuntu发行版。 注意&#xff1a;默认安装路径是…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

简易实现自动签到并发送通知邮件

环境准备 Windows操作系统adbshell1.0.40pyhon3.7visual stdio code stableandroid手机数据线&#xff0c;并配置环境变量 打卡程序 需要定位屏幕坐标 import os import timea0os.popen("adb shell input keyevent 26") ##ba0.read() ##print(b) time.sleep(5) …

机器学习(贝叶斯算法,决策树)

朴素贝叶斯分类 贝叶斯分类理论 假设现有两个数据集&#xff0c;分为两类 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率&#xff0c;用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率&#xff0c;那么对于一个新数据点(x,y)…

[ACTF2020]Upload 1--详细解析

信息收集 题目告诉我们是一道upload&#xff0c;也就是文件上传漏洞题目。 进入界面&#xff0c;是一个灯泡&#xff0c;将鼠标放在图标上就会出现文件上传的相应位置&#xff1a; 思路 文件上传漏洞&#xff0c;先看看有没有前端校验。 在js源码中找到了前端校验&#xff…

网络常用特殊地址-127.0.0.1

借用Medium博客的一张图 经常在问题解答群里留意到如下关于127.0.0.1的消息 ”如果单机版&#xff0c;不需要配置IP&#xff0c;所有配置IP的地方都写死127.0.0.1就可以” “ip: 根据实际情况填写&#xff08;在 xxx-init.conf 里可以给一个默认值 127.0.0.1 &#xff0c;方便…

Scala-字符串(拼接、printf格式化输出等)-用法详解

Scala 一、 使用 号连接字符串 在 Scala 中&#xff0c; 运算符实际上会调用 String 类的 concat 方法或者使用字符串的加法操作&#xff0c;生成一个新的字符串。 字符串是不可变的&#xff0c;每次拼接都会创建一个新的字符串。 Mr. yuTips&#xff1a; 性能相对较差&…

软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型

4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障&#xff0c;网络安全单元按照一定的规则&#xff0c;相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制&#xff0c;通过各…

【数据库】如何保证数据库迁移过程中数据的一致性?

在数据库迁移过程中&#xff0c;保证数据的一致性是非常重要的&#xff0c;尤其是在涉及到多个表、多个数据库或分布式系统的情况下。以下是一些确保数据一致性的最佳实践和方法&#xff1a; 1. 备份数据 在开始迁移之前&#xff0c;进行全面的数据备份是确保数据一致性的第…

github 模型下载方法

github 模型权重&#xff0c;如果是项目下载&#xff0c;pth文件有时下载后只有1kb 本人测试ok下载方法&#xff1a; 点击view raw&#xff0c;然后可以下载模型权重文件了。

spring-data-elasticsearch 3.2.4 实现桶bucket排序去重,实现指定字段的聚合搜索

一、背景 es索引有一个文档CourseIndex&#xff0c;下面是示意: creatorIdgradesubjectnameno1002270英语听力课程一N00232DS91004380数学口算课程N00209DK71003480物理竞赛课程N00642XS21002280英语听力课程二N00432WS31002290英语听力课程三N002312DP5 在搜索的时候&#…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

快速搭建Android开发环境:Docker部署docker-android并实现远程连接

目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…

大麦抢票科技

仅供学习参考&#xff0c;切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉&#xff0c;于购票环节&#xff0c;大麦凭借恶意流量清洗技术&#xff0c;于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量&#xff0c;强化对刷票脚本、刷票软件以及…

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…