计算机网络:运输层 - TCP 流量控制 拥塞控制

计算机网络:运输层 - TCP 流量控制 & 拥塞控制

    • 滑动窗口
    • 流量控制
    • 拥塞控制
      • 慢开始算法
      • 拥塞避免算法
      • 快重传算法
      • 快恢复算法


滑动窗口

如图所示:

在这里插入图片描述

TCP首部中有一个窗口字段,该字段就基于滑动窗口来辅助流量控制拥塞控制。所以我们先讲解滑动窗口。

首先,发送方会维护一个发送缓存

在这里插入图片描述

应用程序会把想要发送的数据写入到发送缓存中,而在发送缓存内部,维护一个发送窗口

发送窗口将发送缓存分为四个部分:

在这里插入图片描述

当发送方发送数据后,就要等待对方确认,粉色区域就是发送了但是没有收到确认的区域。当粉色区域的字节收到确认后,就会离开滑动窗口,进入绿色区域。

蓝色区域的字节,是可以发送的但是还没有发送,一旦发送了就进入粉色区域,等待确认。黄色区域处于发送缓存但不处于发送窗口,此时是待发送的数据,但是还不能发送。

接收方也会维护一个接收缓存

在这里插入图片描述

接收缓存也被接收窗口划分为了三个部分:

在这里插入图片描述

接收窗口内部的数据,是允许接收的,当接收到一个数据接收到后,接收方对其发出确认,随后该数据变成绿色部分,即已经确认接收的部分。黄色部分则是不允许接收的部分,就算收到这个区域的数据,也会被丢弃。

滑动窗口的运行模式如下:

一开始A发送了313233这三个报文,但是31丢失了:

在这里插入图片描述

由于3233在接收窗口内,可以正常接收,但是由于31没有收到,此时接收窗口不能往后移动。

随后B发送确认报文,确认号为31,表示当前收到的最后一个连续报文是31,虽然3334也收到了,但是不连续

在这里插入图片描述

由于一直没收到31的确认报文,A超时重传31

在这里插入图片描述

随后B就收到了这三个连续的报文,于是接收窗口向后滑动:

在这里插入图片描述

B又发送确认号为34的报文,表示33之前的所有报文都收到了,此时A的发送窗口也向后移动:

在这里插入图片描述


流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。其本质是通过控制滑动窗口的大小来实现的。

每个TCP数据报发送时,都会在窗口字段填入自己的接收窗口值,从而告诉对方最多传送多少数据。

如下,一开始B的接收窗口为400

在这里插入图片描述

随后A连续发送了三个报文,分别是[1, 100][101, 200][201, 300]。而第三个报文丢失了。

随后B发送了一个确认报文,此时rwnd就是窗口字段的值,表明当前自己的接收窗口是多少Brwnd控制为300并告知A

在这里插入图片描述

随后A发送了[301, 400][401, 500]并重传了[201, 300]

在这里插入图片描述

此时A计算出到已经发送到对方接收窗口的最大值了,不会再发送数据了。

直到BA发送新的报文,将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 = 12cwnd = 1,并重新执行慢开始算法。

随后当慢开始执行到cwnd = 12时,cwnd = sstresh,由执行拥塞避免了。


慢开始拥塞避免1988年提出的TCP拥塞控制算法,在1990年由增加了两个算法:快重传快恢复算法。

快重传算法

为了避免单个报文段的意外丢失被发送方误认为网络产生了拥塞,同时为了让发送方尽早知道有个别报文段没有按序到达接收方,需要应用快重传算法。

快重传算法首先要求接收方每收到一个失序的报文段就立即发出对已收到的报文段的重复确认。当发送方连续收到三个重复的确认时,就执行快重传,这样就不会出现超时,发送方也就不会误认为网络出现了拥塞。

如图:

在这里插入图片描述

发送方发送M3丢失了,如果按照以前的算法,此时M3超时重传就会把cwnd = 1,就要从头开始增长了,导致传输效率降低。

于是当接收方收到M4M5M6时,都发送M3的确认报文,此时发送方连续收到三个M2确认报文,立刻重传M3,这个重传不算超时重传,不会触发网络拥塞的判断条件,后续就可以正常传输了。


快恢复算法

发送方在收到三个连续确认报文,执行快重传丢失的报文段的同时,执行快恢复算法:

令拥塞窗口 cwnd 减半,并设置慢开始门限 ssthresh 为同样的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大

如图:

在这里插入图片描述

这是在,没有快恢复快重传的时候,遇到报文丢失后超时重传触发的机制。

而现在如果报文丢失,执行快恢复快重传,那么整体恢复速度就很快了:

在这里插入图片描述

执行快重传的时候,sstresh = cwnd = cwnd / 2 = 12,然后立刻执行拥塞避免,此时就可以在很短的时间内恢复到之前的状态了。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark Core内核调度机制详解(第5天)

系列文章目录 如何构建DAG执行流程图 (掌握)如何划分Stage阶段 (掌握)Driver底层是如何运转 (掌握)确定需要构建多少分区(线程) (掌握) 文章目录 系列文章目录引言一、Spark内核调度&#xff08;掌握&#xff09;1.1、内容概述1.2、RDD的依赖1.3、DAG和Stage1.4、Spark Shuffl…

Flink 1.19.1 standalone 集群模式部署及配置

flink 1.19起 conf/flink-conf.yaml 更改为新的 conf/config.yaml standalone集群: dev001、dev002、dev003 config.yaml: jobmanager address 统一使用 dev001&#xff0c;bind-port 统一改成 0.0.0.0&#xff0c;taskmanager address 分别更改为dev所在host dev001 config.…

M1失效后,哪个是观察A股的关键新指标?

M1失效后&#xff0c;哪个是观察A股的关键新指标&#xff1f; 央地支出增速差&#xff08;地方-中央支出增速的差值&#xff09;或许是解释沪深300定价更有效的前瞻指标。该数值扩张&#xff0c;则有利于大盘指数&#xff0c;反之亦然&#xff0c;该指标从2017年至今对大盘指数…

网络程序通信的流程---socket与TCP的简单认识

网络程序通信的流程 网络程序通信的流程&#xff1a; 1.通过ip地址找到网络中的设备 2.通过端口号找到对应进程的端口 3.传输数据时还需要使用传输协议&#xff08;TCP&#xff09;&#xff0c;保证数据的可靠性 4.socket完成进程之间网络数据的传输 ip地址的介绍 IP地址…

在小程序wxml中截取字符串

在微信小程序的WXML中直接进行字符串截取是不被支持的&#xff0c;因为WXML主要负责布局和渲染&#xff0c;不包含数据处理逻辑。 但你可以通过使用微信小程序提供的wxs&#xff08;WeiXin Script&#xff09;来实现字符串的截取。 wxs是一种运行在客户端的脚本语言&#xff…

LeetCode 算法:删除链表的倒数第 N 个结点 c++

原题链接&#x1f517;&#xff1a;删除链表的倒数第 N 个结点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a…

opencascade AIS_InteractiveContext源码学习相关枚举 AIS_SelectionScheme AIS_StatusOfPick

AIS_SelectionScheme 枚举 AIS_SelectionScheme 设置交互上下文中的选择方案。 枚举值&#xff1a; AIS_SelectionScheme_UNKNOWN 未定义的方案 AIS_SelectionScheme_Replace 清除当前选择并选择检测到的对象 AIS_SelectionScheme_Add 将检测到的对象添加到当前选择 AIS_…

Artalk-CORS,跨域拦截问题

今天重新部署Artalk之后&#xff0c;遇到了CORS——跨域拦截的问题&#xff0c;卡了好一会记录一下。 起因 重新部署之后&#xff0c;浏览器一直提示CORS&#xff0c;之前在其他项目也遇到过类似的问题&#xff0c;原因就在于跨域问题。

功能测试 之 单模块测试----添加会员

1.需求分析 点击【添加会员】按钮后&#xff0c;页面跳转至添加会员详细页面。 说明&#xff1a; 会员昵称&#xff1a;必填&#xff0c;长度在20个字符&#xff08;除去空格&#xff09;以内&#xff0c;&#xff08;会员昵称&#xff09;可以重复&#xff1b;登录密码&#x…

Java零基础之多线程篇:线程生命周期

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

.net 6 api 修改URL为小写

我们创建的api项目&#xff0c;url是[Route(“[controller]”)]&#xff0c;类似这样子定义的。我们的controller命名是大写字母开头的&#xff0c;显示在url很明显不是很好看&#xff08;url不区分大小写&#xff09;。转换方式&#xff1a; var builder WebApplication.Crea…

【JS重点18】原型链(面试重点)

一&#xff1a;原型链底层原理 以下面一段代码为例&#xff0c;基于原型对象&#xff08;Star构造函数的原型对象&#xff09;的继承使得不同构造函数的原型对象关联在一起&#xff08;此处是最大的构造函数Object原型对象&#xff09;&#xff0c;并且这种关联的关系是一种链…

目标检测——YOLOv10算法解读

论文&#xff1a;YOLOv10: Real-Time End-to-End Object Detection (2024.5.23) 作者&#xff1a;Ao Wang, Hui Chen, Lihao Liu, Kai Chen, Zijia Lin, Jungong Han, Guiguang Ding 链接&#xff1a;https://arxiv.org/abs/2405.14458 代码&#xff1a;https://github.com/THU…

购物网站系统

摘 要 随着互联网的快速发展&#xff0c;不同的平台软件也不断涌出市场&#xff0c;在众多的平台中&#xff0c;购物网站深受人们的欢迎&#xff0c;也成为生活中不可缺少的一部分。经过对国内外购物情况的调查&#xff0c;社区购物在近几年来成为电商发展的新趋势&#xff0c…

Vue - 第3天

文章目录 一、Vue生命周期二、Vue生命周期钩子三、工程化开发和脚手架1. 开发Vue的两种方式2. 脚手架Vue CLI基本介绍&#xff1a;好处&#xff1a;使用步骤&#xff1a; 四、项目目录介绍和运行流程1. 项目目录介绍2. 运行流程 五、组件化开发六、根组件 App.vue1. 根组件介绍…

shell数组

shell数组 文章目录 shell数组数组数组遍历冒泡排序 数组 定义&#xff1a;在集合中指定多个元素&#xff1a;元素的类型&#xff1a;整数。字符串&#xff0c;可以是浮点 作用&#xff1a;一次性的定义多个元素&#xff0c;可以为变量赋值提供便利。 数组的定义方法 数组名…

富唯智能打造的AGV搬运机器人转运机器人

AGV搬运机器人&转运机器人 AGV搬运机器人&#xff0c;内部搭载ICD系列核心控制器&#xff0c;拥有不同的移载平台&#xff0c;负载最高可达 1000kq;重复精度高达5mm;支持 Wi-Fi漫游&#xff0c;实现更稳健的网络数据交互;无轨化激光 SLAM 导航&#xff0c;配合 3D 避障相机…

Flutter-无限循环滚动标签

1. 序章 在现代移动应用开发中&#xff0c;滑动视图是常见的交互模式之一。特别是当你需要展示大量内容时&#xff0c;使用自动滚动的滑动视图可以显著提升用户体验。在这篇文章中&#xff0c;我们将讨论如何使用 Flutter 实现一个自动滚动的列表视图。 2. 效果 3. 实现思路 …

[Linux] 历史根源

UNIX系统&#xff1a; 1969年&#xff0c;由贝尔实验室的K.Thompson和D.M.Ritchie为PDP-7机器编写的一个分时操作系统&#xff0c; 最初使用汇编语言编写&#xff0c; 后来1972年C语言出世以后&#xff0c;二人由使用C写了UNIX3&#xff0c; 此后UNIX大为流行开来 UNIX流派树&a…

凌凯科技冲刺上市:2023年业绩反弹,靠关联交易助推业务发展?

近日&#xff0c;上海凌凯科技股份有限公司&#xff08;下称“凌凯科技”&#xff09;向港交所递交上市申请&#xff0c;华泰国际担任其独家保荐人。 透过招股书不难看出&#xff0c;在化学合成一体化这个虹吸效应显著的细分赛道中&#xff0c;凌凯科技拥有头部玩家的先发优势…