(考研湖科大教书匠计算机网络)第五章传输层-第五节:TCP拥塞控制
- 获取pdf:密码7281
- 专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航
文章目录
- 一:拥塞控制概述
- 二:拥塞控制四大算法
- (1)慢开始和拥塞避免
- A:慢启动(slow start)
- B:拥塞避免(congestion avoidance)
- C:总结
- (2)快重传和快恢复
- A:快重传(fast retransmit)
- B:快恢复(fast recovery)
- (3)总结
本节对应视频如下
- 【计算机网络微课堂(有字幕无背景音乐版)】:TCP拥塞控制
一:拥塞控制概述
拥塞控制:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞。在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降,这便是拥塞控制的作用如下图,横坐标是输入负载,代表单位时间内输入给网络的负载数量,纵坐标是吞吐量,代表单位时间内从网络输出的分组量
具有理想拥塞控制的网络
- 在吞吐量达到饱和之前,网络吞吐量应该等于所输入的负载,故吞吐量是45度的斜线
- 当输入负载超过某一限度时,由于网络资源受限,吞吐量就不再增长而保持水平,也就是吞吐量达到饱和,这就表明输入的负载中有一部分损失掉了,例如输入到网络中的某些分组被某个结点丢弃了

对于实际情况中的网络
- 随着输入负载的增大,网络吞吐量的增长率逐渐减小,也就是在网络吞吐量还未达到饱和之前,就已经有一部分输入分组被丢弃了
- 当网络吞吐量明显小于理想吞吐量时,网络就进入了轻度拥塞状态
- 当输入负载达到某一数值时,网络吞吐量反而随输入负载的增大而减小,这时网络就进入了拥塞状态
- 当输入负载继续增大到某一数值时,网络的吞吐量就减小为0,此时网络便瘫痪了

因此进行拥塞控制是非常有必要的,实际的拥塞控制曲线应该尽量接近理想的拥塞控制曲线

二:拥塞控制四大算法
下面我们介绍四种拥塞控制算法的基本原理,假定如下条件
- 数据是单方向传送,而另一个方向只传送确认
- 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定
- 以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位
如下图,发送方向接收方发送TCP数据报文段,接收方收到后给发送方发送TCP确认报文段

(1)慢开始和拥塞避免
发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化
- 拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;只要网络出现拥塞,拥塞窗口就减少一些
- 判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)
发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd。同时还需要维护一个慢开始门限ssthresh状态变量
- 当
cwnd < ssthresh时:使用慢开始算法; - 当
cwnd > ssthresh时:停止使用慢开始算法而改用拥塞避免算法; - 当
cwnd = ssthresh时:既可使用慢开始算法,也可使用拥塞避免算法
为了更清晰地展示出拥塞控制过程,我们还可以绘制出一副拥塞窗口随传输轮次变化的图
- 横坐标为传输轮次:是指发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间其实就是往返时间(并非固定)。使用传输轮次是为了强调把拥塞窗口所允许发送的报文段都连续发送出去并收到了对已发送的最后一个报文段的确认
- 纵坐标是拥塞窗口:它会随网络拥塞程度以及所使用拥塞控制算法动态变化

在TCP双方建立连接逻辑关系时,拥塞窗口的值会设置为1,另外还需要设置ssthresh初始值为16

A:慢启动(slow start)
慢启动:发送方每收到一个对新报文段的确认时就把拥塞窗口值+1,然后开始下一轮传输,当拥塞窗口值增长到慢开始门限时就改为执行拥塞避免算法
如下图,发送刚当前拥塞窗口值为1,而发送窗口等于拥塞窗口,因此发送方当前只能发送一个TCP数据报文段
- 发送方发送0号数据报文段
- 接收方收到后,给发送方发回对0号报文段的确认报文段
- 发送方收到该确认报文段后,将拥塞窗口值+1变为2
- 这意味着发送方现在可以发送1-2号共两个数据报文段
- 接收方收到后,给发送方发回对1-2号报文段的确认报文段
- 发送方收到该确认报文段后,将拥塞窗口值+2变为4
- 这意味着发送方现在可以发送3-6号共三个数据报文段
- 接收方收到后,给发送方发回对3-6号报文段的确认报文段
- 发送方收到该确认报文段后,将拥塞窗口值+4变为8
- 这意味着发送方现在可以发送7-14号共八个数据报文段
- 接收方收到后,给发送方发回对7-14号报文段的确认报文段
- 发送方收到该确认报文段后,将拥塞窗口值+8变为16

发送方当前的拥塞窗口值已经增大到了慢开始门限值,之后需要启动拥塞避免算法
B:拥塞避免(congestion avoidance)
拥塞避免:和慢启动不同,拥塞避免在每个传输轮次结束后,拥塞窗口只能线性+1
如下图
- 发送方现在可以发送15-30号共16个数据报文段
- 接收方收到后,给发送方发回对15-30号报文段的确认报文段
- 发送方收到该确认报文段后,将拥塞窗口值+1变为17
- 发送方现在可以发送31-47号共17个数据报文段
- 接收方收到后,给发送方发回对31-47号报文段的确认报文段
- 发送方收到该确认报文段后,将拥塞窗口值+1变为18

重复上述过程很多次,发送方将171-194号共24个数据报文段发送后,其中有些报文段丢失了,这必然会造成发送方对这些丢失报文段的超时重传,发送方判断网络可能出现了堵塞,进行以下工作
-
将慢开始门限更新为发生拥塞时的一半,对于本例更新为12
-
将cwnd值减少为1,并重新开始执行慢开始算法

-
当慢开始执算法执行到拥塞窗口值增大到新的慢开始门限时,就停止使用慢开始算法,转而执行拥塞避免算法

C:总结
TCP发送方一开始使用慢开始算法,让拥塞窗口值从1开始按指数规律增大,当拥塞窗口值增大到慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口按线性+1的规律增大。当发生超时重传时,就判断网络很可能发生了拥塞,于是采取相应措施
- 将慢开始门限更新为发生拥塞时的一半
- 将cwnd值减少为1,并重新开始执行慢开始算法
拥塞窗口值又从1开始按指数规律增大,当增大到新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口按线性+1的规律增大

(2)快重传和快恢复
慢开始和拥塞避免算法是1988年提出的TCP拥塞控制算法(TCP Tahoe版本)。1990年又增加了两个新的拥塞控制算法(改进TCP的性能),这就是快重传和快恢复(TCP Reno版本) 。这是因为个别报文段会在网络中丢失,但实际上网络并未发生拥塞
- 这将导致发送方超时重传,并误认为网络发生了拥塞;
- 发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率
A:快重传(fast retransmit)
快重传:使发送方尽快进行重传,而不是等超时重传计时器超时再重传。采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。具体来说
- 要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
- 即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
- 发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传
对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%
如下图
-
发送方发送1号数据报文段
-
接收方收到后给发送方发回对1号报文段的确认
-
在该确认报文段到达发送方之前,发送方还可以将发送窗口内的2号数据报文段发送出去
-
接收方收到后给发送方发回对2号报文段的确认
-
在该确认报文段到达发送方之前,发送方还可以将发送窗口内的3号数据报文段发送出去,但是该报文丢失了
-
接收方自然不会给发送方发回针对该报文段的确认

-
发送方还可以将发送窗口内的4号数据报文段发送出去
-
接收方收到后发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认,表明现在希望收到的是3号报文段但是未收到,而是收到了未按序到达的报文段

-
发送方还可以将发送窗口内的5号数据报文段发送出去
-
接收方收到后发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认

-
发送方还可以将发送窗口内的6号数据报文段发送出去
-
接收方收到后发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认
-
至此,发送方会收到3个连续的对2号报文段的重复确认,就立即重传3号报文段

-
接收方收到后给发送方发回针对6号报文段的确认,表明序号到6为止的报文段都正确接收了,这样就不会造成对3号报文段的超时重传,而是提早进行了重传

B:快恢复(fast recovery)
快恢复:发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法
- 发送方将慢开始J限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半; 开始执行拥塞避免算法
- 也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3
- 既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络;
- 这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中;
- 可见现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些
(3)总结

相关文章:
(考研湖科大教书匠计算机网络)第五章传输层-第五节:TCP拥塞控制
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:拥塞控制概述二:拥塞控制四大算法(1)慢开始和拥塞避免A:慢启动(slow start)…...
13.使用自动创建线程池的风险,要自己创建为好
自动创建线程池就是直接调用 Executors去new默认的那几个线程池,但是会出现一定的风险,线程池里面会用到队列,也会跟线程池自身有关,所以要从队列和线程池两个方面去解析。 1.了解线程池的队列 线程池的内部结构主要由四部分组成…...
【项目设计】—— 负载均衡式在线OJ平台
目录 一、项目的相关背景 二、所用技术栈和开发环境 三、项目的宏观结构 四、compile_server模块设计 1. 编译服务(compiler模块) 2. 运行服务(runner模块) 3. 编译并运行服务(compile_run模块) 4…...
Docker学习笔记
1:docker安装步骤Linux 2:docker安装步骤Windows 3:docker官方文档 4:docker官方远程仓库 docker常用命令 1: docker images----查看docker中安装的镜像 2: docker pull nginx------在docker中安装Nginx镜…...
【爬虫理论实战】详解常见头部反爬技巧与验证方式 | 有 Python 代码实现
以下是常见头部反爬技巧与验证方式的大纲: User-Agent 字段的伪装方式,Referer 字段的伪装方式,Cookie 字段的伪装方式。 文章目录1. ⛳️ 头部反爬技巧1.1. User-Agent 字段&User-Agent 的作用1.2. 常见 User-Agent 的特征1.3. User-Age…...
基于SpringBoot+Vue的鲜花商场管理系统
【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、…...
华为OD机试 - 静态扫描最优成本(JS)
静态扫描最优成本 题目 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为 N ,则扫描成本为 N 个金币扫描报告的缓存成本和文件大小无关,每缓存一个报告需要 M 个金币扫描报告缓存后,后继再碰到该文件则不…...
多层感知机
多层感知机理论部分 本文系统的讲解多层感知机的pytorch复现,以及详细的代码解释。 部分文字和代码来自《动手学深度学习》!! 目录多层感知机理论部分隐藏层多层感知机数学逻辑激活函数1. ReLU函数2. sigmoid函数3. tanh函数多层感知机的从零…...
python在windows调用svn-pysvn
作为EBS开发人员,开发工具用的多,部署代码类型多,管理程序麻烦,操作繁琐,一直是我最讨厌的事情。部署一次程序要使用好几个工具,改来改去,上传下载,实在难受。 扣了一下python&#…...
office365 word 另存为 pdf 的注意事项和典型设置
0. 操作环境介绍 Office 版本:Office 365 版本 不同版本的操作可能有所不同 1. 基本操作 – 另存为 pdf 【文件】 --> 【另存为】,选择适当的文件路径、文件名保存类型选择【PDF】点击【保存】 1. 导出的pdf包含目录标签 word中,可使用…...
Spring IoC容器之常见常用注解以及注解编程模型简介
一、全文概览 本篇文章主要学习记录Spring中的核心注解,罗列常见常用的注解以及Spring中的注解编程模型介绍 二、核心注解 1、Spring模式注解 常用注解场景描述Spring起始支持版本Component通用组件模式注解,是所有组件类型注解的元注解Spring 2.5Repo…...
超详细讲解文件函数
超详细讲解文件函数!!!!字符输入/输出函数fgetcfputc文本行输入/输出函数fgetsfputs格式化输入/输出函数fscanffprintf二进制输入/输出函数freadfwrite打开/关闭文件函数fopenfclose字符输入/输出函数 fgetc fgetc函数可以从指定…...
【挣值分析】
名称解释 拼写解释PV计划费用,预估预算EV挣值,实际预估预算AC实际费用,实际花费CV成本偏差 (EV - AC)SV进度偏差(EV - PV)CPI成本绩效指数 (EV / AC)SPI进度绩效指数 &a…...
Python3-基础语法
Python3 基础语法 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&…...
【计算机网络】数据链路层(下)
文章目录媒体接入控制媒体接入控制-静态划分信道随机接入 CSMACD协议随机接入 CSMACA协议MAC地址MAC地址作用MAC地址格式MAC地址种类MAC地址的发送顺序单播MAC地址广播MAC地址多播MAC地址随机MAC地址IP地址区分网络编号IP地址与MAC地址的封装位置转发过程中IP地址与MAC地址的变…...
系统分析师考试大纲
系统分析师考试大纲 1.考试目标 通过本考试的合格人员应熟悉应用领域的业务,能分析用户的需求和约束条件,写出信息系统需求规格说明书,制订项目开发计划,协调信息系统开发与运行所涉及的各类人员;能指导制…...
2023上半年软考报名时间已定,你准备好了吗?
港城软考公众号于2023年2月17日发布了2023年度计算机软考工作计划,从该计划内容得知,2023年计算机软考上半年报名3月13日开始,请相关报考人员提前做好报名准备工作。 其他各省市还暂未公布2023上半年软考报名时间,每年都有很多…...
DPDK — Userspace PMD 源码分析
目录 文章目录目录PMD driver 通过 IGB_UIO 与 UIO 进行交互注册一个 UIO 设备PMD 的应用层实现PMD 同样支持中断处理方式PMD driver 通过 IGB_UIO 与 UIO 进行交互 IGB_UIO 内核模块的另一个主要功能就是让用于态的 PMD 网卡驱动程序得以与 UIO 进行交互。对于 PMD 的实现来说…...
javase基础学习(终)
9、网络通信协议 /* InetAddress类的常用方法 1、getLocalHost()public static InetAddress getLocalHost() throws UnknownHostException返回本地主机的地址。 这是通过从系统检索主机的名称,然后将该名称解析为InetAddress 。2、getByName()public static InetAd…...
Scala
1、Scala语言有什么特点?什么是函数式编程?有什么优点? 1、scala语⾔集成⾯向对象和函数式编程 2、函数式编程是⼀种典范,将电脑的运算视作是函数的运算 3、与过程化编程相⽐,函数式编程⾥的函数计算可以随时调⽤&…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
