计网第五章.运输层—TCP的拥塞控制

news2024/11/19 14:44:50

以下来自湖科大计算机网络公开课笔记及个人所搜集资料

目录

      • 一、拥塞控制与流量控制
        • 1.1 拥塞控制的目的
        • 1.2 区分拥塞控制与流量控制
      • 二、四种拥塞控制算法
        • 2.1 慢开始和拥塞避免
        • 2.2 快重传
        • 2.3 快恢复

一、拥塞控制与流量控制

1.1 拥塞控制的目的

先看一下什么是拥塞:
在这里插入图片描述
上图中,绿线理想的拥塞控制,在吞吐量达到饱和之前,网络吞吐量应等于所输入的负载,那么随着输入负载逐渐增大,吞吐量也等比增大。但当输入负载超过某一限度时,由于网络资源受限,吞吐量就不再增长,而保持水平线,也就是吞吐量达到饱和,这就表明输入的负载中有一部分损失掉了——即理想的拥塞控制也一样会损失负载,毕竟网络的可用资源是固定的。

先看红线无拥塞控制,则不会是等比的45度斜线,而是在网络吞吐量还未达到饱和时,就已经有一部分的输入分组被丢弃了;当网络的吞吐量明显的小于理想的吞吐量时,网络就进入了轻度拥塞的状态;当输入负载到达某一数值时,网络的吞吐量反而随输入负载的增大而减小,这时网络就要进入了拥塞状态,当输入负载继续增大到某一数值时,网络吞吐量减小为零,此时网络就要无法工作了,这就是所谓的死锁!!!

实际的拥塞控制效果应该接近理想的,因此得到中间蓝色线

即我们需要对红色线往下掉的位置进行控制,使其达到蓝色线的效果。

为什么无拥塞控制会出现输入负载增大而网络吞吐量减小的现象?(上图红色线)
试想一下,在网络已经出现轻度拥塞时,如果依然发送大量的数据包,那么数据到达时延和丢失的概率就会增大,这个时候由于超时重传机制,发送方需要重传没有按期达到的数据,这样网络上的数据就更多了,网络的负担也就增大了(拥塞程度增加),而更大的拥塞程度又使得数据更容易延时达到或丢失,从而进入恶性循环:
延时/丢失 ——> 重传——>延时/丢失——>重传

1.2 区分拥塞控制与流量控制

流量控制解决的是TCP收发双方速度不同而导致的数据丢失问题,流量控制要达到的目的是让接收方不会来不及处理;而拥塞控制是防止发送方这边把过多数据输送到网络。

直观的区别是:
两者的窗口控制都是针对数据的发送方,但是流量控制是为了接收方,而拥塞控制是为了网络

两者都是基于滑动窗口实现的,但流量控制的窗口调整是由接收方来对发送方进行调控的;拥塞控制的窗口调整是由拥塞控制算法来对发送方进行调控的。

两者的联系:
前面在流量控制那节说过:
发送方的发送窗口 = min(自身拥塞窗口,TCP接收方的接收窗口)

二、四种拥塞控制算法

前面讨论流量控制时不考虑拥塞控制,那么下面讨论拥塞控制时也不考虑流量控制

四种算法:
慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)

2.1 慢开始和拥塞避免

这两个是最早的算法,被称为TCP Tahoe版本;后面又增加了快重传和快恢复进行改进,称为TCP Reno版本。

有几点注意:

  1. 拥塞窗口控制值cwnd是多少,就能一次性发送多少数据报文段(即多少个TCP数据报文),在讨论拥塞控制中,发送方仅将拥塞窗口作为发送窗口,动态变化。
    在讨论流量控制时,我们用的单位是字节,而讨论拥塞控制时用的单位是MSS,这个其实后者可以转换成字节,比如这篇帖子里,说一个MSS大约是1KB(即使局域网和internet中的MSS不一样大),因此它的拥塞控制示意图里是以1KB为单位。

  2. 从慢开始算法到拥塞避免算法。其实大致原理就是:TCP不是每次都发送一样数量的报文,而是逐渐增多的,这样才是有对拥塞进行控制。一开始发送方能发的报文段数量都比较小(这个是慢开始的含义,开始可发送报文数量少,而不是增长慢),这个时候可以按照慢开始算法,以指数增长(比如翻倍)来主键增大cwnd,也是一次能发送的报文段数量;当数量达到设置的慢开始门限值cwnd 16时候,认为这个时候一次发送的报文数量有点大了,就要注意了,此时换拥塞避免算法,不再成倍增长每次发送的数据报文段(这个是通过调整cwnd),而是比如每次增加1个,上次可以发16,下次可以发17……

  3. 在本例中,如果cwnd=24,即每次可发送的报文段数量达到24时,有些报文丢失了,接收方没收齐。那么发送方就会对这些丢失报文段开启超时重传(这个数据链路都有的协议),并且判断这个时候出现网络拥塞了。这个时候就要做两件事:

  • 将慢开始门限减小为此时cwnd的一半,即24/2 == 12
  • 将cwnd直接减小为1(此时一次只能发1个TCP报文段了),重新开始慢开始算法

注意下图中,横坐标是传输轮次,即发送方发了多少次TCP报文

图中的纵坐标1,24这些数字是MSS的数量,即TCP最大报文段的数量;

横坐标每个传输轮次是指一个来回,发送出去并且得到了对方的确认报文。

所以下图每个点就是一个轮次传输多少个TCP分段。
在这里插入图片描述
调控后如下:
在这里插入图片描述
整个过程如下图:
在这里插入图片描述
上面的漏洞就是,报文丢失就说明网络拥塞了????

显然不是,有时候丢失了个别报文段,但实际上网络并未发生拥塞!而且这种把窗口又改为1的行为,大大降低了传输效率

2.2 快重传

这个对上面的改进在于,别等超时重传计时器超时再重传,而是尽快重传。因为之前等超时重传,会误以为是网络发生了拥塞,而快重传就不会触发超时重传,就不会误认为是发生了拥塞(说明发生拥塞的判断是触发了超时重传)

需要接收方发送3次重复确认,发送方再立即重传。这个重复确认是说我收到了报文,并不是说收到了准确的报文,不然也不需要重传了,比如收到的是乱序的,就给发送方说我收到报文,但是不是我要的3号报文段(这说明3号报文段丢失了)。
在这里插入图片描述

2.3 快恢复

不止快重传加入了,快恢复算法也同时起作用。它是将慢开始门限和拥塞窗口cwnd都调整为当前拥塞窗口的一半,然后执行拥塞避免算法,而不是重新搞慢开始算法直接掉到1——不搞慢开始了,直接拥塞避免,1个字节

也有的快恢复实现,是把快恢复开始时的拥塞窗口值再增大一些,等于新的慢开始门限值+3。这样做的理由是:

  • 既然发送方收到三个重复的确认,就要表明有三个数据报文段已经离开了网络,
  • 这三个报文段不再消耗网络资源,而是停留在接收方的接收缓存中。
  • 可见现在网络中不是堆积的报文段,而是减少了三个报文段,因此可以适当把用塞窗口值扩大一些。

最后,TCP拥塞控制算法作用过程如下:

主要看右边第二个绿色框开始:

在这里插入图片描述

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

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

相关文章

AVL树介绍

AVL树AVL树的概念AVL树结点的定义AVL树的插入AVL树的旋转(1)左单旋(2)右单旋(3)左右双旋(4)右左双旋AVL树的验证AVL树的性能AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率…

第三章 Linux实际操作——vi和vim编辑器

第三章 Linux实际操作——vi和vim编辑器3.1 vi和vim的基本介绍3.2 vi和vim常用的三种3.2.1 正常模式3.2.2 插入模式3.2.3 命令行模式3.3 vi和vim基本使用3.4 各种模式的相互切换3.5 vi和vim的快捷键3.1 vi和vim的基本介绍 Linux系统会内置 vi文本编辑器Vim具有程序编辑的能力&…

hadoop单机版安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 使用官方提供的jar包实现wordcount案例1. 将安装包hadoop-3.1.3.tar.gz上次至linux中 2. 进行解压操作 tar -zxvf hadoop-3.1.3.tar.gz -C /opt/softs/##tar: 解压打包的…

TikTok听证会后:走不出的隐私风暴和出不了的海

TikTok听证会结束一周。 这场来自大洋彼岸的漩涡紧扣着中国科技圈的心弦,这不是一场稀松平常的热点,而是一次样本实例的演绎,每一个企图出海,扩展生意版图的中国企业们,都在密切关注,希望在TikTok身上找到…

快排非递归/归并排序/排序总结

一、非递归实现快排 在某些情景下,递归可以利用分治思想,将一个问题转化为多个子问题,再转化为更多个最小规模的子问题。从而帮助我们解决问题。 但是,递归可能在效率和内存上产生问题。现如今,由于编译器的进一步优化…

图像分割中的混淆矩阵和利用混淆矩阵计算指标

目录 1. 介绍 2. 创建混淆矩阵 2.1 update 方法 2.2 compute 方法 2.3 str 方法 3. 测试 4. 完整代码 1. 介绍 语义分割中,性能指标可以利用混淆矩阵进行计算 这里实现的方法和图像分类中不一样,需要的可以参考:混淆矩阵Confusion M…

大数据技术——spark集群搭建

目录 spark概述 spark集群搭建 1.Spark安装 2.环境变量配置 3.Spark集群配置 4.启动Spark集群 存在问题及解决方案 请参考以下文章 spark概述 Spark是一个开源的大数据处理框架,它可以在分布式计算集群上进行高效的数据处理和分析。Spark的特点是速度快、易…

多路I/O转接 poll(了解)

poll() 的机制与 select() 类似,与 select() 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll() 没有最大文件描述符数量的限制(但是数量过大后性能也是会下降)。 p…

Java 进阶(8) 线程常用方法

常用方法 方法名 说明 public static void sleep(long millis) 当前线程主动休眠 millis 毫秒。 public static void yield() 当前线程主动放弃时间⽚,回到就绪状态,竞争下⼀次时间⽚。 public final void join() 允许其他线程加⼊到当前线程中。…

什么是缓存穿透、缓存雪崩、缓存击穿

缓存穿透 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存保护后端存储的意义。 解决方案 缓存空值 如果访问数据库后还未命中,则把一…

JVM OOM问题排查与解决思路

OOM原因 1. 堆溢出 报错信息: java.lang.OutOfMemoryError: Java heap space 代码中可能存在大对象分配,无法获得足够的内存分配 可能发生内存泄露,导致内存被无效占用以至于耗尽 2. 永久代/元空间溢出 报错信息: java.lang.O…

Python黑马程序员(Spark实战)笔记

1、基础准备 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创…

(十一)排序算法-选择排序

1 基本介绍 选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 动画展示: 选择排序思想: 选择排序(select sorting)也是一种简单的…

【刷题篇】栈和队列

目录 一.前言🌈 二.有效的括号✨ a.题目 b.题解分析 c.AC代码 三. 用队列实现栈📏 a.题目 b.题解分析(辅助队列法) c.AC代码(辅助队列法) d.题解分析(就地存储法) c.AC代…

全面带你了解AIGC的风口

前言 一、AIGC的介绍 二、AIGC 的几个主要作用 三、实现AIGC过程的步骤 四、科技新赛道AIGC开始火了 五、AIGC对世界产生广泛的影响 六、AIGC技术的主要风口 😘一、AIGC的介绍 AIGC (AI Generated Content) 是指通过人工智能技术生成的各种类型的内容,…

SpringBoot学习3

一、JSR303数据验证 使用Validated进行数据验证,如果数据异常则会统一抛出异常,方便异常中心统一处理。 空检查 Null 对象为null NotNull 对象不能为 null,但可以是 空字符串(无法检验长度为0的字符串) NotBlank 检查约束字符串是不是为nul…

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式 2023/4/3 15:50 最近向学习日语,找到日语发音的视频中,大多数是MP4格式,少量是WMV格式,PR2023貌似不能识别WMV格式。 于是:万能的ffmpeg上场了&…

使用GPT-4生成QT代码

一、概述最近ChatGPT火爆起来了,ChatGPT是一种基于GPT的自然语言处理模型,可以用于生成自然语言文本,例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor ,Cursor集成了 GPT-4 ,可以帮助你快速编写、编…

动态规划:状态机DP和买卖股票问题【零神基础精讲】

买卖股票的最佳时机:无限次/冷冻期/k次【基础算法精讲 21】 来自0x3f:https://www.bilibili.com/video/BV1ho4y1W7QK/ 介绍了【买卖股票系列问题】与【状态机 DP】,包括【至多/恰好/至少】的讲解。 文章目录买卖股票问题和状态机DP(无限次)[1…

【CocosCreator入门】CocosCreator组件 | DragonBones(骨骼动画)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中DragonBones,它可以帮助您创建出色的2D骨骼动画。在本文中,我们将探讨CocosCreator引擎的DragonBones组件,以及如何使用它来创建精美的动画。 目录 …