计算机网络:运输层 - TCP 流量控制 拥塞控制
计算机网络:运输层 - TCP 流量控制 & 拥塞控制
- 滑动窗口
- 流量控制
- 拥塞控制
- 慢开始算法
- 拥塞避免算法
- 快重传算法
- 快恢复算法
滑动窗口
如图所示:
在TCP
首部中有一个窗口
字段,该字段就基于滑动窗口来辅助流量控制
和拥塞控制
。所以我们先讲解滑动窗口。
首先,发送方会维护一个发送缓存
:
应用程序会把想要发送的数据写入到发送缓存
中,而在发送缓存
内部,维护一个发送窗口
。
发送窗口将发送缓存分为四个部分:
当发送方发送数据后,就要等待对方确认,粉色区域就是发送了但是没有收到确认的区域。当粉色区域的字节收到确认后,就会离开滑动窗口,进入绿色区域。
蓝色区域的字节,是可以发送的但是还没有发送,一旦发送了就进入粉色区域,等待确认。黄色区域处于发送缓存
但不处于发送窗口
,此时是待发送的数据,但是还不能发送。
接收方也会维护一个接收缓存
:
而接收缓存
也被接收窗口
划分为了三个部分:
在接收窗口
内部的数据,是允许接收的,当接收到一个数据接收到后,接收方对其发出确认,随后该数据变成绿色部分,即已经确认接收的部分。黄色部分则是不允许接收的部分,就算收到这个区域的数据,也会被丢弃。
滑动窗口的运行模式如下:
一开始A
发送了31
,32
,33
这三个报文,但是31
丢失了:
由于32
和33
在接收窗口内,可以正常接收,但是由于31
没有收到,此时接收窗口不能往后移动。
随后B
发送确认报文,确认号为31
,表示当前收到的最后一个连续报文是31
,虽然33
和34
也收到了,但是不连续:
由于一直没收到31
的确认报文,A
超时重传31
:
随后B
就收到了这三个连续的报文,于是接收窗口向后滑动:
B
又发送确认号为34
的报文,表示33
之前的所有报文都收到了,此时A
的发送窗口也向后移动:
流量控制
流量控制
就是让发送方的发送速率不要太快,要让接收方来得及接收。其本质是通过控制滑动窗口的大小来实现的。
每个TCP
数据报发送时,都会在窗口
字段填入自己的接收窗口值,从而告诉对方最多传送多少数据。
如下,一开始B
的接收窗口为400
:
随后A
连续发送了三个报文,分别是[1, 100]
,[101, 200]
,[201, 300]
。而第三个报文丢失了。
随后B
发送了一个确认报文,此时rwnd
就是窗口
字段的值,表明当前自己的接收窗口是多少。B
将rwnd
控制为300
并告知A
:
随后A
发送了[301, 400]
,[401, 500]
并重传了[201, 300]
。
此时A
计算出到已经发送到对方接收窗口
的最大值了,不会再发送数据了。
直到B
给A
发送新的报文,将rwnd = 100
,表示可以再发送100
个数据:
最后B
又发送一个rwnd = 0
的报文,表示接下来A
不要发送任何数据了:
通过这样一个控制接收窗口
的过程,你会发现A
想要发多少数据,都由B
来控制了,这就是流量控制
。
拥塞控制
在某段时间内,若对网络中某资源(带宽、缓存、处理机等)的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况称为拥塞 (congestion)。
拥塞控制
就是防止过多的数据注入到网络中,以防网络中的路由器或链路过载。它是一个全局性的过程,涉及到所有的主机和路由器。
为了进行拥塞控制
,发送方维持一个叫做拥塞窗口 cwnd
的状态变量。发送窗口
的值是拥塞窗口
和接收窗口
的较小值。本博客为了方便理解,假设接收窗口的值一直大于拥塞窗口,也就是说发送窗口的值一直和拥塞窗口保持一致。
发送方控制拥塞窗口的原则是:
- 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,提高网络的利用率。
- 但只要网络出现拥塞(依据就是出现了超时),拥塞窗口就减小一些,以减少注入到网络中的分组数,缓解网络出现的拥塞。
TCP
进行依赖四种算法:满开始
,拥塞避免
,快重传
和快恢复
。
慢开始算法
慢开始算法的思路是:
当主机在刚建立的 TCP 连接上发送数据时,并不清楚网络当前的状况,不宜把大量的数据注入网络,而是应当由小到大逐渐增大注入到网络中的数据量,即由小到大逐渐增大拥塞窗口的数值。
慢开始算法的规则是:
每收到一个确认报文,就把
cwnd
的值增大1
如图所示:
首先明确轮次
的概念:发送方把拥塞窗口所允许发送的报文段都连续发送出去,并收到对这些报文段的确认所经历的时间,就叫一个轮次。
第一轮次cwnd = 1
,只能发送一个数据,接收方收到这个数据后回应一个确认报文。发送方接收到一个回应报文,cwnd = cwnd + 1
。
第二轮次发送窗口
和cwnd
就变成了2
,此时发送方就可以一次发送两个数据报,接收方就回应两个确认报文。发送方接收到两个回应报文,cwnd = cwnd +2
。
第三轮次发送窗口
和cwnd
就变成了4
,此时发送方就可以一次发送四个数据报,接收方就回应四个确认报文。发送方接收到四个回应报文,cwnd = cwnd +4
。
于是发送窗口
和cwnd
变为8
,以此类推。
你会发现:处于慢开始
阶段,cwnd
呈指数级增长。为了控制拥塞窗口
增加过快,此时会设置一个慢开始门限 sstresh
- 当
cwnd < ssthresh
时,使用慢开始
算法。 - 当
cwnd > ssthresh
时,停止使用慢开始
算法而改用拥塞避免
算法。 - 当
cwnd = ssthresh
时,既可使用慢开始
算法,也可使用拥塞避免
算法。
接下来我们就讲解拥塞避免
算法。
拥塞避免算法
拥塞避免算法的思路是让拥塞窗口 cwnd
缓慢地增大,规则如下:
每经过一个轮次,把拥塞窗口
cwnd
值加1
拥塞避免
并非完全避免拥塞,而是让拥塞窗口增长得缓慢些,使网络不容易出现拥塞。
如图所示:
横坐标为轮次
,纵坐标为cwnd
值。当cwnd < sstresh
时,执行慢开始
算法,此时cwnd
呈指数级增长。当cwnd = 16 = sstresh
时,改用拥塞避免
算法,每个轮次cwnd = cwnd + 1
,此时呈现线性增长。
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,此时就会重新调整cwnd
,和sstresh
规则如下:
把
ssthresh
设置为出现拥塞时的拥塞窗口
值的一半。然后把拥塞窗口cwnd
重新设置为1
,并执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间处理队列中积压的分组。
如图:
等到第13
个轮次,此时某个报文超时重传了,于是主机认为此时网络拥塞了,于是sshtresh = cnwd / 2 = 12
,cwnd = 1
,并重新执行慢开始
算法。
随后当慢开始
执行到cwnd = 12
时,cwnd = sstresh
,由执行拥塞避免
了。
慢开始
和拥塞避免
时1988
年提出的TCP
拥塞控制算法,在1990
年由增加了两个算法:快重传
和快恢复
算法。
快重传算法
为了避免单个报文段的意外丢失被发送方误认为网络产生了拥塞,同时为了让发送方尽早知道有个别报文段没有按序到达接收方,需要应用快重传算法。
快重传算法首先要求接收方每收到一个失序的报文段就立即发出对已收到的报文段的重复确认。当发送方连续收到三个重复的确认时,就执行快重传
,这样就不会出现超时,发送方也就不会误认为网络出现了拥塞。
如图:
发送方发送M3
丢失了,如果按照以前的算法,此时M3
超时重传就会把cwnd = 1
,就要从头开始增长了,导致传输效率降低。
于是当接收方收到M4
,M5
,M6
时,都发送M3
的确认报文,此时发送方连续收到三个M2
确认报文,立刻重传M3
,这个重传不算超时重传
,不会触发网络拥塞的判断条件,后续就可以正常传输了。
快恢复算法
发送方在收到三个连续确认报文,执行快重传
丢失的报文段的同时,执行快恢复
算法:
令拥塞窗口
cwnd
减半,并设置慢开始门限ssthresh
为同样的数值,然后开始执行拥塞避免
算法,使拥塞窗口缓慢地线性增大
如图:
这是在,没有快恢复
和快重传
的时候,遇到报文丢失后超时重传
触发的机制。
而现在如果报文丢失,执行快恢复
和快重传
,那么整体恢复速度就很快了:
执行快重传
的时候,sstresh = cwnd = cwnd / 2 = 12
,然后立刻执行拥塞避免
,此时就可以在很短的时间内恢复到之前的状态了。
相关文章:
![](https://img-blog.csdnimg.cn/direct/9c7ca58a94ac4f2ba22629f70a485a41.png)
计算机网络:运输层 - TCP 流量控制 拥塞控制
计算机网络:运输层 - TCP 流量控制 & 拥塞控制 滑动窗口流量控制拥塞控制慢开始算法拥塞避免算法快重传算法快恢复算法 滑动窗口 如图所示: 在TCP首部中有一个窗口字段,该字段就基于滑动窗口来辅助流量控制和拥塞控制。所以我们先讲解滑…...
![](https://img-blog.csdnimg.cn/direct/de0f055dff674b18a38930d4877094b9.png#pic_center)
Python学习打卡:day10
day10 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day1073、文件的读取操作文件的操作步骤open()打开函数mode常用的三种基础访问模式读操作相关方法read()方法readlines()方法readline()方法for循…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
新书速览|Ubuntu Linux运维从零开始学
《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。《Ubuntu Linux运…...
![](https://img-blog.csdnimg.cn/direct/825be5f6888f4ef5b2bc85c8ee73a3c7.png)
[Qt的学习日常]--窗口
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、窗口的分…...
![](https://img-blog.csdnimg.cn/direct/50163b081011470cadd3e5325925f206.png)
Vue发送http请求
1.创建项目 创建一个新的 Vue 2 项目非常简单。在终端中,进入您希望创建项目的目录(我的目录是D:\vue),并运行以下命令: vue create vue_test 2.切换到项目目录,运行项目 运行成功后,你将会看到以下的编译成功的提示…...
![](https://img-blog.csdnimg.cn/direct/61c1179ec27a4fb99eaf3a0d97cf0ea5.gif)
学习使用js和jquery修改css路径,实现html页面主题切换功能
学习使用js和jquery修改css路径,实现html页面主题切换功能 效果图html代码js切换css关键代码jquery切换css关键代码 效果图 html代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>修改css路径</title&g…...
![](https://www.ngui.cc/images/no-images.jpg)
(转)请介绍一下Redis的数据淘汰策略
1. **NoEviction(不淘汰)**:当内存不足时,直接返回错误,不淘汰任何数据。该策略适用于禁止数据淘汰的场景,但需要保证内存足够。 2. **AllKeysLFU(最少使用次数淘汰)**:…...
![](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=ui%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596%25E6%25B5%258B%25E8%25AF%2595day09%2Fimage-20200703114715829.png&pos_id=iT1hkITA)
APP自动化测试-Appium常见操作之详讲
一、基本操作 1、点击操作 示例:element.click() 针对元素进行点击操作 2、初始化:输入中文的处理 说明:如果连接的是虚拟机(真机无需加这两个参数,加上可能会影响手工输入),在初始化配置中…...
![](https://img-blog.csdnimg.cn/img_convert/f89dd3a71cc840704064c7800011477f.png)
写给大数据开发:谈谈数仓建模的反三范式
在数仓建设中,我们经常谈论反三范式。顾名思义,反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。简单来说,就是浪费存储空间,节省查询时间。用行话讲,这就是以空间换时间。听起来像是用大炮打蚊子&#…...
![](https://img-blog.csdnimg.cn/img_convert/e00b962332b5742bf2e9f872b74ed2f6.png)
Stable diffusion 3 正式开源
6月12日晚,著名开源大模型平台Stability AI正式开源了,文生图片模型Stable Diffusion 3 Medium(以下简称“SD3-M”)权重。 SD3-M有20亿参数,平均生成图片时间在2—10秒左右推理效率非常高,同时对硬件的需求…...
![](https://img-blog.csdnimg.cn/direct/e358f888d4384c9e83981b49c05d5341.png)
如何配置node.js环境
文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址:node.js…...
![](https://www.ngui.cc/images/no-images.jpg)
python tensorflow 各种神经元
感知机神经元(Perceptron Neuron): 最基本的人工神经元模型,用于线性分类任务。 import numpy as npclass Perceptron:def __init__(self, input_size, learning_rate0.01, epochs1000):self.weights np.zeros(input_size 1) #…...
![](https://www.ngui.cc/images/no-images.jpg)
Gone框架介绍27 - 再讲 Goner 和 依赖注入
gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档地址:https://goner.fun/zh/ 文章目录 Goner 和 依赖注入Goner的定义依赖标记Goners 注册Priest函数 Goner 和 依赖注入 Gone 作为一个依赖注入框架&am…...
![](https://img-blog.csdnimg.cn/direct/9dd9736f8ecc4507a0df3bd0b5a630a8.png#pic_center)
【Python/Pytorch 】-- 滑动窗口算法
文章目录 文章目录 00 写在前面01 基于Python版本的滑动窗口代码02 算法效果 00 写在前面 写这个算法原因是:训练了一个时序网络,该网络模型的时序维度为32,而测试数据的时序维度为90。因此需要采用滑动窗口的方法,生成一系列32…...
![](https://www.ngui.cc/images/no-images.jpg)
Clickhouse集群create drop database可删除集群数据库或只删除本地数据库
集群环境下,在任意一个节点创建数据库,如果加上了ON CLUSTER clustername,则在集群环境的所有节点上都创建了该数据库,并在集群环境的所有节点上都创建了该数据库对应的目录,且数据库的metadata_path对应的目录路径在所…...
![](https://img-blog.csdnimg.cn/direct/95b3e2a4c15448f69f613766d925a639.jpeg)
【docker】adoptopenjdk/openjdk8-openj9:alpine-slim了解
adoptopenjdk/openjdk8-openj9:alpine-slim 是一个 Docker 镜像的标签,它指的是一个特定的软件包,用于在容器化环境中运行 Java 应用程序。 镜像相关的网站和资源: AdoptOpenJDK 官方网站 - AdoptOpenJDK 这是 AdoptOpenJDK 项目的官方网站&…...
![](https://www.ngui.cc/images/no-images.jpg)
Vscode interaction window
python 代码关联到 jupyter 模式 在代码前添加: # %%print("hellow wolrd!") 参考文档链接: https://code.visualstudio.com/docs/python/jupyter-support-py...
![](https://img-blog.csdnimg.cn/direct/18cbe72d494a42f9802847bafa44ca50.png)
后端数据null前端统一显示成空
handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…...
![](https://img-blog.csdnimg.cn/direct/03ddffa0ff4a481ebe02b565cf52f5c1.png)
【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解
👈️上一篇:备忘录模式 | 下一篇:状态模式👉️ 设计模式-专栏👈️ 文章目录 访问者模式定义英文原话直译如何理解呢? 访问者模式的角色类图代码示例 访问者模式的应用优点缺点使用场景 示例解析:博物馆的导览员代码示例 访问…...
Salesforce‘s 爱因斯坦机器人助手引领工业聊天机器人时代
CRM的对话式人工智能助手,根据公司数据提供可靠的人工智能响应及日本工业聊天机器人现状 【前言】 爱因斯坦助手(Einstein Copilot)提供可靠的响应,因为它基于公司独特的数据和元数据,使其能够深入了解公司的业务和客…...
![](https://img-blog.csdnimg.cn/direct/a00d7d3c496a4814bc40c15d4bc87003.png)
Day7—zookeeper基本操作
ZooKeeper介绍 ZooKeeper(动物园管理员)是一个分布式的、开源的分布式应用程序的协调服务框架,简称zk。ZooKeeper是Apache Hadoop 项目下的一个子项目,是一个树形目录服务。 ZooKeeper的主要功能 配置管理 分布式锁 集群管理…...
![](https://img-blog.csdnimg.cn/direct/b73584e7b91d42f9a36f7cff587d1c72.png)
计算机组成原理---Cache的基本工作原理习题
对应知识点: Cache的基本原理 1.某存储系统中,主存容量是Cache容量的4096倍,Cache 被分为 64 个块,当主存地址和Cache地址采用直接映射方式时,地址映射表的大小应为()(假设不考虑一致维护和替…...
![](https://www.ngui.cc/images/no-images.jpg)
springboot项目中切数据库(mysql-> pg)带来的适配问题:typeHandler
一、数据表中有一张表,名为role_permission,DDL如下: CREATE TABLE "public"."role_permission" ( "role_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, "permiss…...
![](https://img-blog.csdnimg.cn/direct/3f0d5ea0e1224227a3c4c699fa7eb412.png)
从零开始的<vue2项目脚手架>搭建:vite+vue2+eslint
前言 为了写 demo 或者研究某些问题,我经常需要新建空项目。每次搭建项目都要从头配置,很麻烦。所以我决定自己搭建一个项目初始化的脚手架(取名为 lily-cli)。 脚手架(scaffolding):创建项目时…...
![](https://img-blog.csdnimg.cn/direct/faeebf13c425431a8554088114a97d9d.png)
Hadoop升级失败,File system image contains an old layout version -64
原始版本 Hadoop 3.1.3 升级版本 Hadoop 3.3.3 报错内容如下 datasophon 部署Hadoop版本 查看Hadoop格式化版本 which hadoop-daemon.sh/bigdata/app/hadoop-3.1.3/sbin/hadoop-daemon.sh删除原来的旧版本 rm -rf /bigdata/app/hadoop-3.1.3查看环境变量 env|grep HADOOPHAD…...
![](https://img-blog.csdnimg.cn/direct/a532fe7466664f8ab129d0b58734aab2.png)
[机器学习算法]决策树
1. 理解决策树的基本概念 决策树是一种监督学习算法,可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征,节点之间的分支表示特征的可能取值,叶节点表示分类或回归结果。 2. 决策树的构建…...
![](https://img-blog.csdnimg.cn/direct/f0fec57891a84120960b1b7baeee1320.png)
springboot应用cpu飙升的原因排除
1、通过top或者jps命令查到是那个java进程, top可以看全局那个进程耗cpu,而jps则默认是java最耗cpu的,比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号,查询进程里那个线程最占用cpu,发…...
![](https://img-blog.csdnimg.cn/direct/1fcac917900a43d28c67e67571dfee81.png)
反激开关电源EMI电路选型及计算
EMI :开关电源对电网或者其他电子产品的干扰 EMI :传导与辐射 共模电感的滤波电路,La和Lb就是共模电感线圈。这两个线圈绕在同一铁芯上,匝数和相位都相 同(绕制反向)。 这样,当电路中的正常电流(差模&…...
![](https://img-blog.csdnimg.cn/img_convert/955f69abc133f70439df17b54fcfb577.png)
vue3前端对接后端的图片验证码
vue3前端对接后端的图片验证码 <template> <image :src"captchaUrl" alt"图片验证码" click"refreshCaptcha"></image> </template><script setup>import {ref} from "vue";import {useCounterStore} …...
![](https://img-blog.csdnimg.cn/direct/f47666aec6714778bc8be89a10a024b9.png)
【Unity】RPG2D龙城纷争(四)要诀、要诀数据集
更新日期:2024年6月20日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介要诀数据集(AbilityDataSet)一、定义要诀数据集类二、要诀属性1.要诀类型2.攻击距离3.基础命中、暴击率4.基础属性加成5.…...
![](https://images2017.cnblogs.com/blog/1057181/201708/1057181-20170808162106120-1373832724.png)
只买域名可以做自己的网站嘛/友链交换不限内容
首先,需要回到最原始的地震矩的表达式: 已知strike,dip,rake 根据strike和dip可以求出v,根据strike,dip,rake,可以求出u。 把求出来的v和u互换,相当于原来的位错矢量变成法向量,而法向量知道了,面也就知道了࿰…...
![](/images/no-images.jpg)
建设银行锦州分行网站/江苏建站
GitHub:https://github.com/JDawnF/learning_note 一、简介 1.类比小区门禁 小区中有门禁,出入需要输入密码,但快递人员等非小区用户进入时,需要先申请小区用户授权方可进入。 授权机制如下: 第一步,门…...
![](/images/no-images.jpg)
房建设计网站好/刷神马seo排名首页排名
使用技术: VuePress - Vue 驱动的静态网站生成器仓库地址:https://github.com/yinian-R/v... 全局安装 ## 安装 yarn global add vuepress # 或者:npm install -g vuepress 现有项目 如果你想在一个现有项目中使用 VuePress,同时想…...
![](https://img-blog.csdnimg.cn/img_convert/7a45a43dd9bdcffb3cb171fceeee3b6d.png)
廊坊建站服务/新媒体营销案例分析
最近遇到一个有意思的bug,是关于VSCode编辑器插件的,赶项目时间非常紧,说实话在这时平常用的顺手的IDE出问题非常影响心情。「这就像是你开在高速路上,吃着火锅唱着歌,突然轮胎爆了,你说气不气人」。不过在…...
![](/images/no-images.jpg)
哈尔滨最新/关键词优化如何
new Date(str)MM-dd-yyyy yyyy/MM/dd MM/dd/yyyy MMMM dd, yyyy MMM dd, yyyy dd MMM yyyydd MMMM yyyyMMM dd yyyyMMMM dd yyyy转载于:https://www.cnblogs.com/qinghao/archive/2010/01/18/1651145.html...
![](/images/no-images.jpg)
做网站收费吗/网络卖货平台有哪些
#第一种方法 s1 “k:1|k1:2|k2:3|k3:4” d {} print(s1) s2 s1.split(’|’) print(s2) for n in s2: n1 n.split("? d[str(n1[0])] n1[1] print(d) #第二种方法 s1 “k:1|k1:2|k2:3|k3:4” d {} print(s1) s2 s1.split(’|’) print(s2) for n in s2: n1 …...