计算机网络 | 谈谈TCP的流量控制与拥塞控制

news2024/12/23 10:08:42

文章目录

  • 一、TCP的流量控制
    • 1、利用滑动窗口实现流量控制【⭐⭐⭐】
    • 2、如何破解【死锁】局面❓
  • 二、TCP的拥塞控制
    • 1、拥塞控制的一般原理
      • ① 解决网络拥塞的误区
      • ② 拥塞控制与流量控制的关系【重点理解✔】
    • 2、TCP的拥塞控制方法
      • ① 接收窗口【rwnd】与拥塞窗口【cwnd】
      • ② 慢开始和拥塞避免算法
      • ③ 快重传和快恢复算法
  • 三、总结与提炼

一、TCP的流量控制

1、利用滑动窗口实现流量控制【⭐⭐⭐】

对于滑动窗口,在上面也提到过了,在流量控制这一块,就要利用到这个滑动窗口的机制去实现两个主机之间的通信

[流量控制的目的]:让发送方的发送速率不要太快,要让接收方来得及接收

然后来说一下很重要的例子,要注意理解,与后面的三次握手紧密度非常之大

  • 首先在建立连接的时候B就告诉了A:“我的接收窗口rwnd = 400”。表示主机B的接受窗口最多可以接收400B的大小,然后设置了一个100字节长的报文段,即DATA = 100,数据报文段序号的初始值设置为1,即seq = 1
  • 然后一开始主机A就向B发送了100B的大小,第一个字节序号为1

在这里插入图片描述

  • 然后再发100B,第一个字节序号为为101

在这里插入图片描述

  • 但是在接下来的数据接收中,A主机继续向B主机发送了从[201]开始的数据,但在途中丢失了。此时主机B发现主机A没有再发送数据过来了,因此向它发送过去一个确认报文段
  • 【ACK】是一个确认字段,我们在TCP的首部格式中有说到过,只有当ACK = 1 时ack才有效
  • 【ack】是表示当前主机希望收到的下一个数据的首字节号,即确认字段的值
  • 【rwnd】表示接收窗口,接收方主机B将此窗口设置为300,表示它只能接收300大小的数据字节,而且是从201开始到500的这段范围,也就限定了主机A的发送窗口从400->300

  • 因为前200个字节的数据主机B已经完全接收了,所以主机A将其发送窗口向前滑动200字节⛸,将首字节号设置为201B,窗口大小设置为300B。
  • 但是因为主机A没有接收到主机B从201~300字节的数据的回应,便开始启动这一块的超时计时器

在这里插入图片描述

  • 接下去主机A就向主机B分别发送了301B - 400B以及401B - 500B的数据,此时接收窗口就满了。

在这里插入图片描述

  • 但此时主机A发现前面201~300B的超时计时器时间到了,但是主机B还是没有发来相关的响应,于是重新发送了一次从201开始的这100个数据报文段,这也就是我们在上面讲到过的【超时重传】

  • 然后接下去主机B就发送了一条确认说“前面的500B我已经全部收到,现在我的接受窗口大小变为100,下一次希望收到501B为初始字节的数据”那此时主机A就可以确认主机B已经全部收到了500B之前的所有数据,于是便会将自己的发送窗口后移300个B,到501B的位置

在这里插入图片描述

  • 接下去主机A又发送过来符合的100B数据,于是主机B的接受窗口就满了。此时主机B就发送回一个确认报文说“前面的600B我已经全部收到,现在把你的发送窗口变为0,不要再发送数据了

从上面就可以看出主机B实现了三次流量控制,第一次将主机A的发送窗口大小从400->300,第二次从300->100,第三次就是从100->0,通过【rwnd】这个接收窗口的控制,就使得主机A的发送窗口呈现出一个动态变化的趋势,也就是我们前面在讲到窗口值是在动态变化的

2、如何破解【死锁】局面❓

  • 但是主机A要何时才能继续向主机B发送数据呢❓也就是当主机B重新发出一个新的窗口值为止。B主机会在它的接收缓存中腾出一些地方,把缓存当中的数据[主机A发送过来的600B]上交给了应用层后,它的接收缓存中就又可以有一些存储空间了
  • 于是这个时候主机B就又会向主机A发送一个rwnd = 400的报文段,告诉它你现在可以将自己的发送窗口设置为400,并且开始发送数据了。但是这个报文段呢若是在传输的过程中丢失了(〃>目<),主机A就收不到,此时主机B一直在等待主机A发送新的数据过来,主机A呢也等待主机B发送一个报文段过来告诉自己可以发数据了,于是它们就开始了一段漫长的等待.<{=....
  • 以上这个局面叫做【死锁】,是双方在数据传输过程中很可能会出现的一个现象

在这里插入图片描述

那要怎么去解决这个局面呢?

  • TCP为每一个连接都设有一个【持续计时器】,当连接的一方收到对方的零窗口通知后,就会启动这个计时器。也就是当前的主机A,接下去呢它会发送一个【探测报文段】,这个报文段中会有1B的数据,发送过去之后若是接收方给出的窗口值依旧是0,那么主机A就会重新设置持续计时器。
  • 在这个时候呢主机B可能已经收到了应用层的通告,可以继续接收数据了;如果不是零,那么死锁的僵局就可以打破了。

  • 从上述流量控制就可以看出TCP真的是非常的严谨,很好得控制了每一次数据的传输o((>ω< ))o

二、TCP的拥塞控制

1、拥塞控制的一般原理

首先来看看什么叫做【拥塞】

【拥塞】:在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏 👉∑对资源的需求 > 可用资源

① 解决网络拥塞的误区

很多人就认为解决网络拥塞的问题只需要增加一些资源即可

  1. 把节点缓存的存储空间扩大❌
  2. 把链路更换为更高速率的链路 ❌
  3. 把节点处理机的运算速度提高 ❌
  • 其实对于上面的这几种做法,都是不可行的,网络拥塞并没有想象中的那么简单,可能你单纯地解决了某个表现的问题,但是会引发出一些其他层次的问题。
    • 例如说丢弃一些路由器分组时,这一分组的源点就会重传这一分组,但是这又会间接导致更多的分组流入网络和被网络中的路由器丢弃
  • 那其实我们可以看到,若只是采用一些简单的做法,在许多情况下,非但不能解决网络的拥塞问题,而且还可能使网络的性能更坏,所以我们要采取更加有效的方法

② 拥塞控制与流量控制的关系【重点理解✔】

在上一模块,我们讲到了流量控制,现在又说到了拥塞控制,那你可能会想它们之间会不会存在着什么关系呢?一起来看看🐎

在这里插入图片描述

  • 对于【拥塞控制】而言, 其实就是要防止过多的数据注入到网络,使得网络中的路由器或链路不至于过载,而且它是一个全局性的过程,会接收到不同主机、路由器所发送过来的数据,那么这个中心的交换节点就会同时被使用,从而到导致繁忙进而造成拥塞,可是呢接收方在这么繁忙的情况下又很难去知道、去查询是哪个主机出了问题
  • 对于【流量控制】而言,要做的就是抑制发送端发送数据的速率,以使接收端来得及接收。它是一个点对点通信量的控制,是个端到端的问题

可能在看了上面的叙述后依旧有点模糊,没关系,我通过一个生活中的小场景来叙述一下

  • 其实对于它们二者可以看作为一个水龙头通过管道向水桶放水。对图a来说,它只有一个很小的桶,因为来不及接收从水管中注入的水,因此就告知水龙头那边的人【将水龙头拧得小一些,以此来减缓放水的速率】,这种两端之间的通信就叫做流量控制
  • 相反,对图b来说,它拥有一个很大的桶,完全可以接得下从水管中流过来的水,但是呢水管中间可能因为一些内部的各种污垢造成了拥塞,然后可以看到水管的上方已经积蓄了很多的水,因此就需要和管水龙头一方的人说【将水龙头拧得小一些,以此来减少流入水管内部的水量】,这种内部的缓解就相当于是拥塞控制

在这里插入图片描述
👉对于同样的请求,都是将水龙头拧得小一些,但是目的却不一样。对照它们的原理之后,若是读者能明白,那也就懂了它们之间的区别

2、TCP的拥塞控制方法

了解了拥塞控制的一半原理,接下去我们来聊聊TCP面对这样的拥塞状况是如何应付的

为了集中讨论拥塞控制,假定:

  1. 数据是单方向传送的,对方只传送确认报文
  2. 接收方总是有足够大的缓存空间,因为发送窗口的大小由网络的拥塞程度来决定

① 接收窗口【rwnd】与拥塞窗口【cwnd】

  • 在流量控制中,我们提到了rwnd接收窗口,是由接收方维护的。表示接收方示意发送方自己可以接受的数据大小,以此来控制发送方发送数据的大小,
  • 在拥塞控制中我们再来聊聊一种窗口叫做cwnd拥塞窗口,它呢是由发送方维护的。它的大小取决于网络的拥塞程度,并且是动态变化着的。因为上面我们假定接收方的接收窗口足够大,因为发送方只需要考虑拥塞窗口的大小即可

【发送方控制拥塞窗口的原则】:

  1. 只要网络没有出现拥塞,拥塞窗口就可以增大一些,将更多的数据发送出去,以此来提高网络利用率
  2. 当网络出现拥塞或可能要出现拥塞时,就把拥塞窗口减小一点,减少注入到网络的分组数,以便缓解网络出现的拥塞

发送方如何知道网络出现了堵塞?

  • 没有按时收到对方的确认报文,超时重传计时器启动,便判断出网络出现了拥塞

来总结一下这两个窗口
👉【接受窗口 rwnd】:由接收方维护,会根据接收缓存设置的值,并告知给发送方,反映接收方容量

👉【拥塞窗口 cwnd】:由发送方维护,会根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量

② 慢开始和拥塞避免算法

接下去我们来介绍一下拥塞控制中的算法,首先是慢开始和拥塞避免算法这两种,它们是配合使用的

📚 【慢开始算法原理】:由小到大逐渐将数据字节注入到网络中,即逐渐增加拥塞窗口的数值

  • 接着你要知道一个东西叫做最大报文段SMSS,因为慢开始规定,每收到一个新的报文段后,可以把拥塞窗口增加最多一个SMSS的值。然后通过下面这个例子来介绍一下慢开始算法

在这里插入图片描述

  • 从上图可以看出,对于发送方它首先设置【cwnd = 1】,发送出第一个报文段,然后接收方确认了这个报文段再发送回一个确认报文段,这一点我们在前面TCP流量控制中也有说到过,这么一趟来回就叫做一个轮次,也可以叫做往返时延RTT
  • 经过了一个往返时延后,发送方便扩大拥塞窗口,令【cwnd = 2】,连续发出了两个报文段,然后接收方那个接收到之后就进行了返回确认,这是第二轮的RTT
  • 那发送方收到这两个确认报文段之后,便继续扩大自己的拥塞窗口,令【cwnd = 4】,一样,接收方接收到之后又会返回确认,这是第三轮的RTT
  • 依此类推。。。发送方若是试探到本网络的拥塞状况良好,就会不断地增加自己的拥塞窗口,尽快地将数据发送出去。这种慢开始的策略可以使得网络拥塞的概率减小

从上可以知道拥塞窗口在慢开始算法下会不断地增大,但是若是太大也不好,也会造成过多的数据涌入导致网络拥塞,因此便有了[慢开始门限ssthresh]这么一个状态变量,它的用法如下👇

  1. 当【cwnd < ssthresh】时,使用上述的慢开始算法
  2. 当【cwnd > ssthresh】时,停止使用慢开始算法而改用拥塞避免算法
  3. 当【cwnd = ssthresh】时,即可使用慢开始算法,也可使用拥塞避免算法

📚 【拥塞避免算法原理】:让拥塞窗口cwnd按线性规律缓慢增长,每个轮次RTT只加1

  • 然后我们便可以通过下面这张曲线图来看出TCP的拥塞窗口cwnd是如何变化的
    在这里插入图片描述

这一块可以听一听王道这个小姐姐讲的,还是蛮不错的👍

5.3.5 TCP拥塞控制

③ 快重传和快恢复算法

然后再来简单介绍一下快重传和快恢复这两个算法

📚 【快重传算法原理】:让发送方尽早知道发生了个别报文段丢失的情况,若发送发一连收到三个重复确认,便会立即重传接收方需要的报文段

  • 对于这三次报文的重复确认,就是我们前面介绍过的冗余ack

在这里插入图片描述
📚 【快恢复算法原理】:当发送端收到连续三个重复的确认时,不执行慢开始算法,而是执行快恢复算法算法

  • 对于慢开始算法而言,会使拥塞窗口降到1后再使用拥塞避免算法慢慢升回到调整后的慢开始门限值
  • 对于快恢复算法而言,不会使拥塞窗口降到最小值1,而是降到门限值ssthresh / 2的位置,然后再次执行拥塞避免算法,使拥塞窗口缓慢地线性增大

以下是【TCP拥塞控制】的整个流程图,可以再对照回顾一下

在这里插入图片描述

三、总结与提炼

来总结一下本文所学习的内容

  • 首先我们谈到了有关TCP的流量控制,在双方进行数据收发过程中,为了防止发送方发送的数据接收方无法接受或者是过载难以接受,于是便使用到了【滑动窗口】的机制去进行了一个收与发的限制,通过发送方和接收方不断地来回响应,以此让我们看出TCP协议的严谨性
  • 接着我们又谈到了有关TCP的阻塞控制。首先清楚了它与流量控制之间的区别,以及它们之间的联系,为了方便大家理解,我用到了水桶接水的案例对它们做了区分。最后我们又细细地谈了谈有关TCP如何去实现一个阻塞控制,清楚了两个窗口,分别是【rwnd】接受窗口和【cwnd】拥塞窗口,也见识了TCP在进行阻塞控制时使用到的【慢开始和拥塞避免算法】、【 快重传和快恢复算法】,湖不过只是浅浅地提了一下,没有非常深入,有兴趣的小伙伴可以再去多了解一些里面的细节

2023年2月20日随记✍

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

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

相关文章

BPE(Byte-Pair Encoding)简介

文章目录BPE简介Vocabulary构建Encoding and DecodingBPE简介 BPE是一种数据压缩算法的简单形式&#xff0c;数据中最常见的连续字节对被替换成该数据中不存在的字节。BPE的主要目标就是使用最少的token数目来表示一个corpus 在 A New Algorithm for Data Compression中首次提…

Spring IOC 容器 Bean 加载过程

Spring IOC 容器 Bean 加载过程 Spring 对于我们所有的类对象进行了统一抽象&#xff0c;抽象为 BeanDefinition &#xff0c;即 Bean 的定义&#xff0c;其中定义了类的全限定类名、加载机制、初始化方式、作用域等信息&#xff0c;用于对我们要自动装配的类进行生成。 Sprin…

新版本 | 异步复制、交易日历、自定义状态函数......请查收!

大家好~DolphinDB 最新版本近日已经发布&#xff0c;本次的 V2.00.9 与 V1.30.21 新版本推出了很多新功能&#xff0c;并对数据库做了全方位提升&#xff0c;是迄今为止新增功能最多的一次更新。新特性一览我们先来看一看新特性包含哪些方面&#xff1a;1、数据库针对数据安全和…

管理.模型.SWOT

1. SWOT 在企业战略规划中&#xff0c;通过辨析企业自身的竞争优势&#xff08;Strengths&#xff09;、劣势&#xff08;Weaknesses&#xff09;和外部环境为企业带来的机会&#xff08;Opportunities&#xff09;和威胁&#xff08; Threats&#xff09;&#xff0c;企业可制…

Interview系列 - 05 Java|Iterator迭代器|集合继承体系|Set List Map接口特性|List实现类区别

文章目录01. 迭代器 Iterator 是什么&#xff1f;02. 迭代器 Iterator 有什么特点&#xff1f;03. 迭代器 Iterator 怎么使用&#xff1f;04. 如何边遍历边移除 Collection 中的元素&#xff1f;05. Iterator 和 ListIterator 有什么区别&#xff1f;06. 数组和集合的区别&…

Alist ——本地网盘管理器

Alist ——本地网盘管理器 一、下载工具 Alist https://github.com/alist-org/alist二、启动登录 进入下载好的文件中&#xff0c;在地址栏输入cmd进入命令行启动 进入命令行输入 alist start启动 记住密码&#xff0c;和端口进入浏览器 输入 &#xff1a;127.0.0.1:5244用…

java final关键字 详解

概述&#xff1a;作用&#xff1a;细节&#xff1a;演示&#xff1a;总结&#xff1a;一、概述 : final [ˈ faɪnl]&#xff0c;最终的&#xff0c;最后的&#xff0c;决定性的&#xff0c;不可改变的。final作为Java中的一个关键字可以用来修饰类&#xff0c;方法&#xff0c…

【程序人生】从土木专员到网易测试工程师,薪资翻3倍,他经历了什么?

转行对于很多人来说&#xff0c;是一件艰难而又纠结的事情&#xff0c;或许缺乏勇气&#xff0c;或许缺乏魄力&#xff0c;或许内心深处不愿打破平衡。可对于我来说&#xff0c;转行是一件不可不为的事情&#xff0c;因为那意味着新的方向、新的希望。我是学工程管理的&#xf…

京东测试进阶之路:初入测试碎碎念篇

1、基本的测试用例设计方法 基本的测试用例设计方法&#xff08;边界值分析、等价类划分等&#xff09;。 业务和场景的积累&#xff0c;了解测试需求以及易出现的bug的地方。 多维角度设计测试用例&#xff08;用户、业务流程、异常场景、代码逻辑&#xff09;。 2、需求分析 …

idea自带maven位置、maven全局环境变量配置,安装jar到本地 mac

声明&#xff1a;本教程为mac版教程&#xff0c;Windows请路过 idea自带maven3配置全局环境变量 mac电脑maven3位置/Applications/IntelliJ\ IDEA.app/Contents/plugins/maven/lib/maven3配置全局变量,编~/.profile文件&#xff08;没有则新建&#xff09; export MAVEN/App…

JVM-JMM内存模型(happens-before、volatile)

前言 由于计算机的存储设备与处理器的运算速度有几个数量级的差距所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。 将运算需要使用到的数据复制到缓存中&#xff0c;让运算能快速进行&#xff0c;当运算…

Day895.MySql误删数据还原方案 -MySQL实战

MySql误删数据还原方案 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySql误删数据还原方案的内容。 传统的高可用架构是不能预防误删数据的&#xff0c;因为主库的一个 drop table 命令&#xff0c;会通过 binlog 传给所有从库和级联从库&#xff0c;进而导致整…

研报精选230220

目录 【行业230220国信证券】银行业行业专题&#xff1a;经济复苏中的优质中小银行【行业230220国信证券】汽车行业周报&#xff08;2023年第7周&#xff09;&#xff1a;吉利将发布新品牌“银河” &#xff0c;2022年宇通纯电动客车获欧洲销量冠军【行业230220开源证券】商贸零…

Java File相关操作

文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…

【Java期末复习】《面向对象程序设计》练习库

目录 一、单选题 二、填空题 三、程序填空题 1、 super使用--有如下父类和子类的定义&#xff0c;根据要求填写代码 2、简单加法计算器的实现 3、House类 4、矩形类 5、创建一个Box类&#xff0c;求其体积 四、函数题 6-1 求圆面积自定义异常类 6-2 判断一个数列是…

基于某业务单登陆场景并发测试实战

文章目录1 测试目的2 测试目标和测试对象3 名词解释4 测试说明5 测试环境和工具5.1 测试工具5.2 测试环境5.3 人力计划6 测试用例6.1 方案设计6.2 接口地址6.3 接口参数6.3.1 header参数6.3.2 请求参数7 脚本设计8 监控数据8.1 虚拟用户并发情况8.2 事务响应时间8.3 每秒点击次…

IP定位的具体网络应用

IP定位的原理是利用访问终端的注册信息和时延信息来估算现实中的地理位置&#xff0c;结合先进的定位算法服务&#xff0c;最高精确度能达到街道级&#xff0c;深受用户的喜爱。IP定位接口是一种通过IP地址来确定设备或用户位置的技术&#xff0c;主要应用于以下几个方面&#…

Windows平台上达梦数据库的ODBC安装与配置

文章目录概述安装包准备安装ODBC驱动配置ODBC数据源概述 最近很多公司都在响应信创&#xff0c;需要切换到国产数据库&#xff0c;然而很多数据库的一些基础组件的使用都没有一个很明确的官方文档。为了避免更多的人踩坑&#xff0c;本人将踩过的坑总结成博文&#xff0c;分享…

【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十四章SD卡读写…

网络小白入门之路--锐捷RGOS日常管理

锐捷作为网络界的一名重要成员&#xff0c;其设备的管理系统RGOS也是我们要学习的重要一环&#xff0c;那么今天我们就一起看下锐捷RGOS的日常管理。 锐捷设备日常登录方式&#xff1a; 本地登陆&#xff1a; Console登陆&#xff1a;全新或配置清空的设备&#xff0c;需要使…