计算机网络---TCP流量控制和拥塞控制

news2024/11/28 22:38:19

(一) TCP 流量控制


        TCP提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此 流量控制是一个速度匹配服务让发送方慢一点,要让接收方来得及接收,实现匹配发送方的发送速率与接收方的读取速率)。

 
    TCP提供一种基于滑动窗口协议的流量控制机制,那TCP如何使用窗口机制来实现流量控制?
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd,即调整 TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。
       例如,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时B可以通过设置确认报文段首部的窗口字段来将rwnd 通知给A。rwnd 即接收方允许连续接收的最大能力,单位是字节。发送方A总是根据最新收到的rwnd 值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwnd 大小之内,保证A不会使B的接收缓存溢出。A的发送窗口的实际大小取rwnd 和cwnd 中的最小值。图中的例子说明了如何利用滑动窗口机制进行流量控制。设A向B发送数据,在连接建立时,B告诉A:“我的接收窗口rwnd=40”。接收方主机B进行了三次流量控制,这三个报文段都设置了ACK=1,只有在ACK=1时确认号字段才有意义。第一次把窗口减小到rwnd =300,第二次又减到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据。这使得发送方暂停发送的状态将持续到B重新发出一个新的窗口值为止。

 注意:
传输层和数据链路层的流量控制的区别是:传输层定义端到端用户之间的流量控制数据链路层定义两个中间的相邻结点的流量控制数据链路层的滑动窗口协议的窗口大小不能动态变化传输层的则可以动态变化。

 (二) TCP 拥塞控制


     拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时
端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。
    拥塞控制与流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端),它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。拥塞控制和流量控制也有相似的地方,即它们都通过控制发送方发送数据的速率来达到控制效果。
    例如,某个链路的传输速率为10Gb/s,某大型机向一台PC以1Gb/s的速率传送文件,显然网络的带宽是足够大的,因而不存在拥塞问题,但如此高的发送速率将导致PC可能来不及接收,因此必须进行流量控制。但若有100万台PC在此链路上以1Mb/s的速率传送文件,则现在的问题就变为网络的负载是否超过了现有网络所能承受的范围。
       因特网建议标准定义了进行拥塞控制的4种算法慢开始拥塞避免快重传快恢复
         发送方在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网
络发生拥塞。所以TCP协议要求发送方维护以下两个窗口:

  •   接收窗口rwnd:接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量。
    由接收方根据其放在TCP报文的首部的窗口字段通知发送方。

  •  拥塞窗口cwnd:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络的当前容量。只要网络未出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但

       只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络的分组数。发送窗口的上限值应取接收窗口rwnd 和拥塞窗口cwnd 中较小的一个,即发送窗口的上限值=min[rwnd,cwnd]

注:这里假设接收方总是有足够大的缓存空间,因发送窗口大小由网络的拥塞程度决定,即可将发送窗口等同为拥塞窗口。
      接收窗口的大小可根据TCP报文首部的窗口字段通知发送方,而发送方如何维护拥塞窗口呢?这就是下面讲解的慢开始和拥塞避免算法。

1   慢开始&拥塞避免算法


 Ⅰ  慢开始算法
       在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS。每收到一个对新报文段的确认后,将cwnd 加1,即增大一个 MSS。用这样的方法逐步增大发送方的cwnd,可使分组注入网络的速率更加合理。
       如,A向B发送数据,发送方先置拥塞窗口cwnd=1,A发送第一个报文段,A收到B对第一个报文段的确认后,把cwnd从1增大到2;于是A接着发送两个报文段,A收到B对这两个报文段的确认后,把cwnd 从2增大到 4,下次就可一次发送4个报文段。
       慢开始的“慢”并不是指拥塞窗口cwnd 的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd,这对防止网络出现拥塞是一个非常有力的措施。使用慢开始算法后,每经过一个传输轮次(即往返时延 RTT),cwnd 就会加倍,即cwnd 的值随传输轮次线性增长。 慢开始一直把cwnd 增大到一个规定的慢开始门限 ssthresh(阈值),后改用拥塞避免算法。


Ⅱ  拥塞避免算法
   拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,具体做法是:每经过一个往返时延RTT就把发送方的拥塞窗口cwnd 加1,而不是加倍,使拥塞窗口cwnd 按线性规律缓慢增长(即加法增大),这比慢开始算法的拥塞窗口增长速率要缓慢得多。
根据cwnd的大小执行不同的算法,可归纳如下:

  •  当cwnd<ssthresh 时,使用慢开始算法。

  •  当cwnd> ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

  • 当cwnd= ssthresh 时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)。


Ⅲ   网络拥塞的处理
       无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方的cwnd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。 

 慢开始和拥塞避免算法如图所示:

一次传输轮次:发送了一批报文段并收到它们的确认的时间。,即一个往返时延RTT 。

即开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内的报文段的时间。

 过程分析:

  •  初始时,拥塞窗口置为1,即cwnd=1,慢开始门限置为16,即 ssthresh =16。

  •  慢开始阶段,cwnd的初值为1,以后发送方每收到一个确认ACK,cwnd值加1,也即经过每个传输轮次(RTT),cwnd 呈指数规律增长。当拥塞窗口cwnd 增长到慢开始门限ssthresh 时(即当 cwnd=16时),就改用拥塞避免算法,cwnd 按线性规律增长。

  • 假定cwnd=24时网络出现超时,更新 ssthresh 值为12(即变为超时时cwnd 值的一半,24/2)cwnd 重置为1,并执行慢开始算法,当cwnd=12时,改为执行拥塞避免算法。 

        注意:在慢开始(指数级增长)阶段,若2cwnd > ssthresh,则下一个RTT后的cwnd等于ssthresh,而不等于 2cwnd,即 cwnd 不能跃过 ssthresh 值。如上图1所示,在第16个轮次时cwnd=8、ssthresh=12,在第17个轮次时cwnd=12,而不等于16。
        在慢开始和拥塞避免算法中使用了“乘法减小”和“加法增大”方法。“乘法减小”是指不论是在慢开始阶段还是在拥塞避免阶段,只要出现超时(即很可能出现了网络拥塞),就把慢开始门限值ssthresh 设置为当前拥塞窗口的一半(并执行慢开始算法)。当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入网络的分组数。 加法增大”是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个RTT),就把拥塞窗口 cwnd 增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
       拥塞避免并不能完全避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

2     快重传和快恢复


快重传和快恢复算法是对慢开始和拥塞避免算法的改进。
Ⅰ   快重传
       在TCP可靠传输机制中,快重传技术使用了冗余ACK来检测丢包的发生。同样,冗余ACK 也用于网络拥塞的检测(丢了包当然意味着网络可能出现了拥塞)。快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。
      当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。


Ⅲ  快恢复
       快恢复算法的原理如下:当发送方连续收到三个冗余 ACK(即重复确认)时,执行“乘法减小”算法,把慢开始门限 ssthresh 设置为此时发送方cwnd 的一半。这是为了预防网络发生拥塞。但发送方现在认为网络很可能没有发生(严重)拥塞,否则就不会有几个报文段连续到达接收方,也不会连续收到重复确认。因此与慢开始不同之处是它把cwnd 值设置为慢开始门限 ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
由于跳过了拥塞窗口cwnd从1起始的慢开始过程,所以被称为快恢复。快恢复算法的实现过程如图 所示,作为对比,虚线为慢开始的处理过程。

 
      在流量控制中,发送方发送数据的量由接收方决定,而在拥塞控制中,则由发送方自己通过检测网络状况来决定。实际上,慢开始、拥塞避免、快重传和快恢复几种算法是同时应用在拥塞控制机制中。四种算法使用的总结:在 TCP 连接建立和网络出现超时时,采用慢开始和拥塞避免算法;当发送方接收到冗余ACK时,采用快重传和快恢复算法。
   :接收方的缓存空间总是有限的。因此,发送方发送窗口的实际大小由流量控制和拥塞控制共同决定。当题目中同时出现接收窗口(rwnd)和拥塞窗口(cwnd)时,发送方实际的发送窗口大小是由rwnd 和cwnd 中较小的那一个确定的,即发送窗口的上限值=min[rwnd,cwnd]

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

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

相关文章

Qt编写物联网管理平台(支持win/linux/mac/嵌入式linux/modbus等)

一、前言 这个物联网综合管理平台前后迭代了五年&#xff0c;一点一滴慢慢积累起来&#xff0c;从最开始的只有modbus串口协议解析以及简单的表格显示数据&#xff0c;慢慢的逐渐增加了tcp_rtu支持&#xff0c;用户管理模块&#xff0c;地图监控模块&#xff0c;而后为了拓展性…

消息队列 RabbitMQ入门:Linux(Docker)中安装和卸载RabbitMQ服务

文章目录前言一、Linux中安装RabbitMQ下载Erlang下载RabbitMQ进入Linux进行安装启动RabbitMQ二、RabbitMQ Web管理页面安装RabbitMQ Web管理页面访问管理页面三、使用Docker安装RabbitMQ安装Docker安装启动RabbitMQ访问管理页面四、Linux卸载RabbitMQ相关卸载RabbitMQ卸载Erlan…

第41讲:MySQL内置的QL性能分析工具

文章目录1.SQL性能分析的概念2.分析数据库中SQL的执行频率3.数据库中的慢查询日志3.1.开启慢查询日志功能3.2.模拟慢SQL查询观察日志内容4.Profile查看SQL每个阶段的耗时4.1.开启Profile操作4.2.随便执行一些查询语句4.3.查询执行SQL的耗时4.4.查询某一条SQL每个阶段的耗时4.5.…

【ASM】字节码操作 工具类与常用类 InstructionAdapter 介绍

文章目录 1.概述1.1 为什么会有 InstructionAdapter类?2. InstructionAdapter2.1 class info2.2 fields2.3 构造方法2.4 methods3.示例3.1预期目标4.总结1.概述 在上一节:【ASM】字节码操作 工具类与常用类 AnalyzerAdapter 工作原理 我们学习了AnalyzerAdapter类的工作原理…

【OpenCV 例程 300篇】246. 特征检测之ORB算法

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】246. 特征检测之ORB算法 特征检测与匹配是计算机视觉的基本任务&#xff0c;包括检测、描述和匹配三个相互关联的步骤。广泛应用于目标检测、图像检索、视频跟踪和三维重建等诸多领域。 6.9.1 ORB 算…

【Hack The Box】linux练习-- SneakyMailer

HTB 学习笔记 【Hack The Box】linux练习-- SneakyMailer &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月23日&#x1f334; &…

函数调用在嵌入式架构设计中的应用

函数调用很好理解&#xff0c;即使刚学没多久的朋友也知道函数调用是怎么实现的&#xff0c;即调用一个已经封装好的函数&#xff0c;实现某个特定的功能。 把一个或者多个功能通过函数的方式封装起来&#xff0c;对外只提供一个简单的函数接口&#xff0c;然后在其他地方调用即…

SpringCloud - Config分布式配置中心

文章目录一.概述1. 分布式系统面临的配置问题2. 什么是配置中心3. 配置中心怎么用4. 配置中心能做什么二.Config服务端配置与测试1. 搭建1.1 在github上创建一个springcloud_config的新仓库1.2 获得新仓库的地址&#xff1a;1.3 本地硬盘目录上新建git仓库并clone1.4 创建文件1…

设置一个不能被继承的类

小屋杂谈&#xff0c;记录日常 方法1&#xff1a; 如果想让这个类不能被继承&#xff0c;可以把这个类的构造函数设置成私有&#xff0c;这样子类去继承他构造就会报错&#xff0c;这样的话这个类就是不能被继承的&#xff0c;如果需要用这个类的对象的话&#xff0c;在基类里…

机器学习中的交叉熵

文章目录一、背景二、概率论基础知识三、熵≈信息熵&#xff08;应用领域不同&#xff09;、相对熵KL散度、交叉熵、softmax、sigmoid、交叉熵损失图像分割如何理解CrossEntropyLoss()参考资料一、背景 学习机器学习过程中&#xff0c;总是会遇到交叉熵这个名词。通过交叉熵损…

SpringBoot整合knife4j

1.1 Swagger 前后端分离开发&#xff1a;前端和后端分开进行开发&#xff0c;2个项目&#xff0c;一个是前端项目&#xff0c;一个是后端项目 目前基本上很多小项目都是前后端分离&#xff0c;除了后台管理系统 前后端分离开发&#xff0c;前端(app、小程序、智能硬件等)怎么…

栈(C语言实现)

文章目录&#xff1a;1.栈的概念2.栈的结构3.接口实现3.1初始化栈3.2判断栈是否为空3.3压栈&#xff08;入栈&#xff09;3.4出栈3.5查看栈顶元素3.6统计栈内元素个数3.7销毁栈1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操…

Credly 数字证书

Credly 数字证书 Credly 简介 通过 Credly 颁发的徽章是对学习成果、经验或能力的数字表述。Credly 数字证书包括常见的组织徽章&#xff0c;如&#xff1a;AWS, Adobe, Autodesk, Certiport, Microsoft, CISCO, IBM 等等&#xff0c;以一种简单和安全的方式在线分享和验证&a…

基于改进人工蜂群算法的K均值聚类算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

基于SEIRD和元胞自动机(CA)模型的传染病发展趋势预测

目录前言一、模型假设二、符号说明三、SEIRD模型1. 模型求解四、元胞自动机&#xff08;CA)模型1. 模型求解2. 城市居民减少外出对疫情发展的影响3. 城市间人口流动对疫情发展的影响五 基于防疫政策的修正模型2 “全民戴口罩”“早发现&#xff0c;早隔离”“全民打疫苗”总结前…

Jsonp跨域的坑,关于jsonp你真的了解吗

先来介绍Jsonp跨域 Jsonp全称是Json with Padding&#xff0c;和Json没有关系 Json是一种数据交换格式&#xff0c;而Jsonp是一种依靠开发人员聪明才智创造出的一种费官方跨域数据交换协议。json是描述信息的格式&#xff0c;jsonp是信息传输的协议 在页面上直接发送一个跨域的…

树莓派之树莓派系统安装

树莓派系统安装 概述 树莓派(是为学习计算机编程教育而设计)&#xff0c;只有信用卡大小的微型电脑&#xff0c;其系统基于Linux。随着Windows 10 IoT的发布&#xff0c;我们也将可以用上运行Windows的树莓派。2014年刚知道有树莓派的时候好奇买了一块&#xff0c;型号&#x…

DSP-IIR滤波器设计

目录 滤波器的性能指标&#xff1a; 常用的模拟滤波器&#xff1a; 巴特沃斯滤波器&#xff1a; 巴特沃斯滤波器设计——一般已知Ωp及其衰减指标,Ωs及其衰减指标求得A&#xff0c;ε&#xff0c;N&#xff0c;Ωc&#xff1a; 巴特沃斯滤波器设计例题&#xff1a; 切比…

Python系列-Django

文章目录Python系列-Django用django实现社交媒体 social_book基本演示&#xff0c;点击可查看视频整体项目的创建数据库设计&#xff0c;基本用户创建表的设计 models.py创建用户查看数据库插件 database navigator登录、注册的实现用djangovue实现社交媒体 social_bookPython系…

【Java集合】Collection接口常用方法

文章目录Collection接口和常用方法> Collection接口常用方法> Collection接口遍历元素&#xff1a;使用Iterator&#xff08;迭代器&#xff09;> Collection接口遍历元素&#xff1a;增强 for 循环Collection接口和常用方法 Collection接口实现类的特点&#xff1a;…