TCP的滑动窗口和拥塞控制
目录
滑动窗口
1.发送窗口和接收窗口
2.滑动窗口的分类
停止等待协议:发送窗口大小 = 1, 接收窗口大小= 1
后退N帧协议(GBN):发送窗口大小 > 1,接收窗口大小 = 1
选择重传协议(SR) :发送窗口大小 > 1, 接收窗口大小 > 1
拥塞控制
慢开始算法和拥塞避免:
快重传和快恢复:
滑动窗口
滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包(称窗口尺寸)。
TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据包,但有两种情况除外:
•一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。
•另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
1.发送窗口和接收窗口
发送窗口(swnd):
假设发送方可连续发送帧,那么发送窗口为发送方已发送但待确认帧的最大个数。
比如发送窗口为8,那么发送方如果已经有8个帧没有得到确认,就必须等待某个确认帧到达后才可以继续往下发送帧。
接收窗口(rwnd):
它是TCP接收缓冲区,用于尚未由应用程序处理的传入数据。使用TCP头的窗口大小字段将TCP接收窗口的大小传达给发送方。该字段告诉发送方在接收到确认之前可以在线路上发送多少数据。如果接收器无法尽快处理数据,则接收缓冲区将逐渐填充,并且确认数据包中的TCP窗口将减少。这将警告发送方它需要减少发送的数据量或让接收方有时间清除缓冲区。
2.滑动窗口的分类
滑动窗口分为三类:停止等待、后退N帧、选择重传。他们之间主要的区别就是:发送窗口和接收窗口大小的区别。
停止等待协议:发送窗口大小 = 1, 接收窗口大小= 1
发送方 A 发送数据, 每发送一帧就停止发送。并等待接收方 B 发送确认, 收到确认后 A 就发送下一帧。
在传输时, 数据往往会出现差错, 对以下差错, 该协议会进行不同的处理。
(1)超时重传(针对 A 的差错情况)
若在发送过程中数据帧出现丢失或差错, 此时 B 不会收到数据帧或者丢弃收到的数据帧, 总之,B 不会发送确认。此时 A 会一直等待, 但不会超过设置的等待时间(通常会设置一个超时计时器)。 A 重传该数据帧。
(2)确认丢失和确认迟到(针对 B 的出错情况)
确认丢失: 若 B 在回复确认时确认出现丢失, 则 A 也会一直等待, 也不会超过设置的等待时间。 A 重传该数据帧。且B 会丢掉重复的数据帧。重传确认。
确认迟到: 若 B 在回复确认时确认很久才到, 则 A 也会一直等待, 同样也不会超过设置的等待时间。 A 重传该数据帧。且B 也会丢掉重复的数据帧。重传确认。于是 A 正常收到来自重传的确认, 但是后面又收到迟到的相同的确认,A 收下但什么也不做。
后退N帧协议(GBN):发送窗口大小 > 1,接收窗口大小 = 1
停止等待协议发一次就等待确认, 这样会使信道利用率太低, 于是, 我们可以让发送方连续分送多个协议。不用发一次帧就等待依次确认, 采用如下的流水线传输。
为了让流水线传输可维持可靠传输的特性, 于是让发送方与接收到都维护一个滑动窗口。
发送窗口:在发送窗口内发送连续帧
发送窗口所遇事件:
1.收到
动作:发送方收到累计确认并前移: 收到ACK,发送方会认为接收方已经收到n号帧和它前面的那些帧,发送窗口前移至下界到n下一格的位置
2.已发送数据帧(上图标橙部分)等待收到确认时间超时
动作:发送方重传已发送但未被确认的帧
3.数据帧全部发送(橙色部分全部占满窗口)
动作:发送方将数据返回给上层,过一会儿在发送
4.数据帧未全部发送(橙色部分未占满窗口)
动作:发送方按序拷贝一份数据并发送给接收方
这里需要注意的是累计确认与超时重传,重传需要重传所有未被确认的帧。(这也是后退N帧协议名称的由来)主要是因为接收方累计确认的原因, 发送方不知道哪些帧被接收方收到了,具体细节在接收方窗口中细讲。
接收窗口:
后退N帧协议中位于接收窗口内的序号是接收方希望收到的下一个帧,(注: 后退N帧协议的接收窗口大小 =1 ,即只有窗口内只有 1 个数据)
接收窗口所遇事件:
1.收到位于窗口内的帧
动作:接收窗口前移一格,数据交付上层
2.按序(接收窗口收到希望收到的帧,窗口前移,下一个帧又是窗口希望收到的帧)
动作:收到几个帧后,对按序到达的最后一个帧发送确认(累积确认)
3.未按序收到帧
动作:丢弃该帧,并为最近按序收到的帧重发ACK
累计确认:
若未按序收到帧, 则丢弃该帧, 并且要重传最近按序收到的帧的ACK。这就是累计确认。因此发送方的某帧超时未收到确认, 代表该帧出现问题, 后面的帧已经被丢掉了, 需要再传。
累计确认的确认方式为若有 发送, 则 n号帧和前面所有帧均已按序接收。(或:接收窗口停在 n 处, 则n−1 号帧和前面所有帧均已按序接收)
后退N帧协议滑动窗口大小
•首先需要明确的是,GBN协议中接收窗口的大小 =1
•其次,GBN协议中,对发送窗口的大小也有要求,若采用 n 比特编号,发送窗口的大小应满足:
,这是因为发送窗口过大,会使得接收方无法区别新帧和旧帧。
选择重传协议(SR) :发送窗口大小 > 1, 接收窗口大小 > 1
后退N帧协议由于采取累计确认的方式, 重传所有未被确认的帧, 这样做在某些质量差的信道中会极大降低信道利用率。于是我们想只重传出错的帧, 这时我们需要加大接收窗口的长度, 缓存乱序到达的帧, 这就是选择重传协议(SR)。
发送窗口:位于发送窗口内的帧都可以连续发送出去
发送窗口所遇事件:
1.收到
动作:若n不为窗口下界(最左),则SR发送方将n窗口(n窗口为橙色)标记为已发送(图中为涂上黄色)。若n为窗口下界,则窗口下界移动至最左边未被确认的帧(橙色)处。
2.已发送数据帧(上图标橙部分)等待收到确认时间超时
动作:发送方重传该帧。(每个帧都有自己的超时器,一个帧超时只重传那一个帧)
3.数据帧全部发送(橙色部分全部占满窗口)
动作:发送方将数据返回给上层,过一会儿再发送
4.数据帧未全部发送(橙色部分未占满窗口)
动作:发送方按序拷贝一份数据并发送给接收方
如图所示:假设 2 号帧超时, 只用重传 2 号帧。其他帧都收到确认了就不用重传了。
接收窗口:位于接收窗口内的帧都可以被接收并发送确认, 而不会被丢弃。
接收窗口所遇事件:
1.收到位于窗口内的帧
动作:标记为已收到(黄色)并返回该顺的确认
2.从下界开始有连续被标记的帧
动作:向前滑动至没有被标记的帧处
3.接收到了小于窗口下界的帧
动作:返回一个ACK(注:接收方发送的 ACK 失,需要重传 ACK,其他情况忽略该帧)
总之, 这样设置滑动窗口可以不必重传所有帧, 只需重传已超时的帧即可。
滑动窗口协议的大小:
对于所有的滑动窗口协议,为了让窗口能区别新和旧,发送窗口同样有
对接收窗口而言,至少为 1,则
两不等式联立得
SR协议的滑动窗口的大小:
因为,对于所有的滑动窗口协议都存在
但是,对SR协议而言,接收窗口与接收窗口长度都不固定,当限制 时,且
时,两者之和绝对不超过
且对SR协议,为提高传输效率,滑动窗口长度等于接收窗口长度,这样不会造成溢出(即发送了大于对方窗口上界的帧或 ACK),于是是最好的值,并且在实际应用中,最好有
=
=
参考: 可靠传输协议—停止等待、后退N帧、选择重传 - 知乎 (zhihu.com)
拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏
这种情况就叫做拥塞(congestion)。
在计算机网络中的链路容量 (即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降
慢开始算法和拥塞避免:
发送方维护一个叫做拥塞窗口cwnd的状态变量其值取决于网络的拥塞程度,并且动态变化
•拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些
•判断出现网络拥塞的依据: 没有按时收到应当到达的确认报文 (即发生超时重传)
发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd
维护一个慢开始门限ssthresh状态变量:
•当cwnd<ssthresh时,使用慢开始算法;
•当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
•当cwnd=ssthresh时,既可以使用慢开始算法,也可以拥塞避免算法;
(1)在TCP双方建立逻辑连接关系时,拥塞窗口的值被设置为1,并设置慢开始门限的初始值,这里采用16。
(2)在进行慢开始算法时,发送方每接收到一个对新报文段的确认时,就把拥塞窗口值加1,并开始下一轮的传输。
(3)当拥塞窗口值增长到慢开始门限值时,就改用拥塞避免算法,由于发送方当前的拥塞窗口值是1,而发送窗口值=拥塞窗口值,因此发送方此时只能发送一个TCP报文段。即,拥塞窗口值是几,就能发送几个数据报文段。
现在我们通过展现拥塞窗口随传输轮次的变化来理解:
传输轮次:
发送方给接收方发送数据报文后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间其实就是往返时间。
注:往返时间并非是恒定的数值,使用传输轮次是为了强调把拥塞窗口所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认。
步骤一:
发送方到收到确认后,将拥塞窗口值+1(此时窗口值为2),这样拥塞窗口就可以发送2个数据报文段,当发送方收到2个报文段的确认后,将窗口值+2(2+2=4),接下来就可以发送4个数据报文段,以此类推....即拥塞窗口值为2,4,8,16
步骤二:
现在增大到了慢开始门限值,改用拥塞避免算法:
每个传输轮次结束后,拥塞窗口值只能线性+1,发送方给接收方发送17个数据报文段,若收到接收方返回的确认后,继续线性+1
如图所示:
步骤三:
当拥塞窗口为24时,若发送的数据报部分丢失,发送方就会对这些报文段进行超时重传,
并且确定网络出现拥塞,做一下操作:
1.ssthresh值更新为发生拥塞时cwnd值的一半,如图则为12
2.将拥塞窗口值减小为1,并重新开始慢开始算法,当拥塞窗口达到新的门限值时,则改用拥塞避免算法
注:
1.慢开始是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢
2.“拥塞避免”并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
快重传和快恢复:
有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞这将导致发送方超时重传,并误认为网络发生了拥塞。于是发送方将拥塞窗口减少为1,并错误地启动慢开始算法,因而降低了传输效率。
快重传:
所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传,采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。
这就要求接收端:
•接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认;
•即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
•发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。
这样就不会造成对报文3的超时重传,而是提早进行了重传,对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%
快恢复:
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法。
•发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半; 开始执行拥塞避免算法•也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3。既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络;这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中;可见现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些。
例题:
一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16KB时发生了超时,如果接下来的4个RTT(往返时间)内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是(9KB)
注:题目未给出初始“慢开始门限值”,如图的传输轮次只是便于理解。
相关文章:

TCP的滑动窗口和拥塞控制
目录 滑动窗口 1.发送窗口和接收窗口 2.滑动窗口的分类 停止等待协议:发送窗口大小 1, 接收窗口大小 1 后退N帧协议(GBN):发送窗口大小 > 1,接收窗口大小 1 选择重传协议(SR…...

零信任网络:一种全新的网络安全架构
随着网络技术的不断发展,网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证,但这种信任策略存在一定的局限性。为了解决这一问题,零信任网络作为一种全新的网络安全架构,逐渐受到人们的关注。本文将对零信任网络的概念…...

基于单片机的智能拐杖软件设计
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、整体设计方案2.1本设计设计原理2.1.1单片机基本介绍 二、本设计方案选择三、软件设计AD原理图:原理图…...

小程序如何设置自动预约快递
小程序通过设置自动预约功能,可以实现自动将订单信息发送给快递公司,快递公司可以自动上门取件。下面具体介绍如何设置。 在小程序管理员后台->配送设置处,选择首选配送公司。为了能够支持自动预约快递,请选择正常的快递公司&…...

STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)
STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式) 一、所用材料: STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 示波器或者逻辑分析仪 二、所学内容: 通过定时器TIM的输出比较模式得到预…...

【数据结构】深入浅出讲解计数排序【图文详解,搞懂计数排序这一篇就够了】
计数排序 前言一、计数排序算法核心思路映射 概念补充绝对映射相对映射 二、计数排序算法核心实现步骤三、码源详解四、效率分析(1)时间复杂度 — O(Max(N,range))(2)空间…...

Canvas制作喷泉效果示例
Canvas能制作出很多动画效果,下面是一个制作喷泉效果的示例 效果图 源代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1 ,user-…...

什么是NPM(Node Package Manager)?它的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

oracle如果不适用toad或者plsql工具如何获取索引建表语句
select dbms_lob.substr(dbms_metadata.get_ddl(INDEX,INDEX_NAME,DIXON))||; from dba_indexes where ownerDIXON这个语句可以获取dixon用户的所有索引创建语句,sql脚本形式呈现 点开一个语句查看 如果不使用dbms_lob.substr这个函数最后得到是一个clob selec…...

某大厂伺服驱动器量产方案
本文介一款大厂量产伺服驱动器方案!带2500线省线式编码器,17位增量编码器,20位绝对值编码器!标配CANopen、高精度运动控制,高速总线通讯,主芯片28335FPGA,已验证过,带can和485通讯&a…...

【计算机网络】网络层:数据平面
一.网络层概述 每台路由器的数据平面的主要功能时从其输入链路向其输出链路转发数据报,控制平面的主要功能是协调这些本地的每路由转发动作,使得数据报沿着源和目的地主机之间的路由器路径最终进行端到端传送。 网络层不运行运输层和应用层协议。 转发是…...

Path with “WEB-INF“ or “META-INF“: [webapp/WEB-INF/NewFile.html]
2023-11-04 01:03:14.523 WARN 10896 --- [nio-8072-exec-6] o.s.w.s.r.ResourceHttpRequestHandler : Path with "WEB-INF" or "META-INF": [webapp/WEB-INFNewFile.html] spring.mvc.view.prefix:/webapp/WEB-INF/...

百度OCR 接口调用 提示 216101:param image not exist 问题解决
百度提供的文档并没有描述如何解决,例子也是,用工具请求可以通 axios 请求 需要用FormData 传参 let token await getAccessToken() //官网案例那个 请求token// console.log(token, "token");var formData new FormData();// imageBase64 :Base64 图片数据formD…...

1-10 HTML中input属性
HTML中input属性 text:用于接受单行文本输入password:用于密码输入,输入字符会被掩盖radio:用于单选按钮,用户可以在一组选项中选择一个checkbox:用于复选框,用户可以选择多个选项number&#…...

共焦显微镜使用
x.1 细胞培养 x.2 样品制备 以细菌为例,我们使用荧光染色细菌,静置15分钟。 15分钟后我们使用实验室的专用培养皿,选择吸收100uL的溶液滴在在培养皿中心。 x.3 显微镜使用 我们按照1, 2, 3, 4的顺序打开显微镜, 打开电脑&…...

windows + Mingw32-make 编译 PoDoFo库,openssl, libjpeg, Msys2工具的使用
参考: https://blog.csdn.net/sspdfn/article/details/104244306 https://blog.csdn.net/yaoyuanyylyy/article/details/17436303 https://blog.csdn.net/wxlfreewind/article/details/106492253 前期进行了各种摸索,由于Podofo依赖库比较多,…...

C++中图的存储
文章目录 0. 实例图1. 邻接矩阵2. 邻接矩阵2.1 链表数组2.2 链式前向星 3. 参考 0. 实例图 考虑下面这样一个图 1. 邻接矩阵 vis[i][j] 表示从i 到j有一条边。直接用二维数组就可以了。 using namespace std; int vertex_num 5; vector<vector<int>> graph(v…...

西瓜书读书笔记整理(七)—— 第七章 贝叶斯分类器
第七章 贝叶斯分类器 7.1 贝叶斯决策论(Bayesian Decision Theory)7.1.1 先验概率(Prior Probability)7.1.2 后验概率(Posterior Probability)7.1.3 似然度(Likelihood)7.1.4 决策规…...

C#WPF嵌套布局实例
本文演示C#WPF嵌套布局实例。演示了不同布局的简单用法,便于快速应用和掌握。 <Windowx:Class="LayoutDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/x…...

Spring和SpringMVC总结
一、Spring IoC(Inversion of Control)中文名称:控制反转(对象的创建交给Spring管理)。DI(dependency injection )依赖注入。容器(Container):放置所有被管理的对象。beans:容器中所有被管理的对…...

C++标准模板(STL)- 类型支持 (类型属性,is_abstract,is_signed,is_unsigned)
类型特性 类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…...

前端复制带上版权信息
前端复制带上版权信息 当用户复制内容时,自动添加版权信息。 HTML内容 <body><h1 inputmode"text">复制我</h1> </body>Js内容 document.addEventListener("copy", (event) > {event.preventDefault(); // 阻止…...

【ArcGIS微课1000例】0077:ArcGIS生成经纬网(shp格式)
使用ArcGIS制图的时候,可以很方便的生成经纬网、方里网及参考格网,但是在需要shp格式的经纬网,进一步在南方cass中使用经纬网的时候,就需要单独生成了。 如下图所示为全球大陆矢量数据,我们基于该数据来生成全球指定间距的经纬网数据。 在ArcGIS中,生成经纬网和方里网均…...

读程序员的制胜技笔记04_有用的反模式(下)
1. 重新发明轮子 1.1. 发明家的特质就是要用质疑的心态对待所有事物,你从未停下质疑,那你将不可避免地成为一个发明家 1.2. 并非所有的事情都有现成的轮子可以拿来用 1.3. 自己重新写一个新的API,最终调用你使用的库 1.3.1. 你的API应该是…...

linux驱动开发环境搭建
使用的是parallel 创建的ubuntu 16.04 ubuntu20.04虚拟机 源码准备 # 先查看本机版本 $ uname -r 5.15.0-86-generic# 搜索相关源码 $ sudo apt-cache search linux-source [sudo] password for showme: linux-source - Linux kernel source with Ubuntu patches linux-sourc…...

Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR
文章目录 1. 开发平台2. 下载文件2.1 下载安装 OpenCV 库2.2 下载安装 Tesseract-OCR库2.3 下载训练好的语言包 3. CMakeLists.txt 内容4. Main.cpp4.1 中英文混合OCR 5. 在Qt Creator 中设置 CMake vcpkg5.1 在初始化配置文件里修改5.2 在构建配置里修改 说明:在Q…...

Day20力扣打卡
打卡记录 数组中两个数的最大异或值(位运算) 链接 二进制位上从高位向低位进行模拟,看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…...

设计模式之两阶段终止模式
文章目录 1. 简介 2. 常见思路3. 代码实战 1. 简介 两阶段终止模式(Two-Phase Termination Pattern)是一种软件设计模式,用于管理线程或进程的生命周期。它包括两个阶段:第一阶段是准备阶段,该阶段用于准备线程或进程…...

Dubbo捕获自定义异常
一.问题描述 Dubbo远程服务提供者抛出的自定义异常无法被消费方正常捕获,消费方捕获的自定义异常全部变成RuntimeException,使用起来很不方便。 二.原因分析 相关源码 /** Licensed to the Apache Software Foundation (ASF) under one or more* con…...

Leetcode刷题详解——求根节点到叶节点数字之和
1. 题目链接:129. 求根节点到叶节点数字之和 2. 题目描述: 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1…...