[网络工程师]-传输层协议-TCP拥塞控制

news2025/7/11 15:09:36

        TCP拥塞控制的概念是:每个源端判断当前网络中有多少可用容量,从而知道它可以安全完成传送的分组数。拥塞控制解释防止过多的数据注入网络,避免网络中间设备(路由器、交换机等)过载而发生拥塞。拥塞控制是一个全局性的过程,与流量控制不同,流量控制仅指点对点通信量的控制。

        TCP拥塞控制机制包括慢启动、拥塞避免、快重传、快恢复、RED等。

1、慢启动与拥塞避免

        慢启动又称慢开始。发送方维持的拥塞窗口是一个状态变量,网络拥塞程度动态决定cwnd(congestion windows)的值(网络出现拥塞,则cwnd值会调小些;反之则调大些),发送方的发送窗口等于拥塞窗口,考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。

        慢启动的策略是:主机一开始发送大量数据,有可能引发网络拥塞,因此较好的方法是先探测一下,由小到大逐步增加拥塞窗口cwnd的大小。通常,在刚开始发送报文段时,可将cwnd设置为一个最大报文段MSS的数值。而在每收到一个对新报文段的确认后,将拥塞窗口增加至多一个报文(严格来说是增加一个MSS大小的字节)。这种方式下,cwnd的值是逐步增加的,下图描述了慢启动的过程:

        具体过程如下:

        第一步:发送方设置cwnd=1,并发送报文段M1,接收方接收后确认M1;

        第二步:依据慢启动算法,发送方每收到一个新的报文确认(不计重传),则cwnd加1。所以发送方接收M1确认后,cwnd由1变为2,并发送报文段M2和M3。接收方接收后发回对M2和M3的确认;

        第三步:发送方接收M2和M3的确认后,cwnd由2变为4,并可以发送报文段M4~M7。由此可见,每经过1轮(就是一个往返时间RTT),cwnd值翻倍。

        慢启动的“慢”是指初始值小,但其cwnd是成倍增加的。由于cwnd倍增速度过快,因此需要使用一个慢启动门限ssthresh状态变量限制cwnd倍增。

        (1)当cwnd<ssthresh时,使用慢启动算法;

        (2)当cwnd>ssthresh时,改用拥塞避免算法。拥塞避免算法就是每经过1轮(1个往返时间RTT),cwnd值加1,而不是倍增;

        (3)当cwnd=ssthresh时,可任选慢启动与拥塞避免算法。

        下图为慢启动与拥塞避免示例,描述了控制cwnd的增长、设定sshresh阈值的过程和策略:

                 

        (1)TCP连接初始化,cwnd设为1。设置cwnd增长的阈值ssthresh=16;

        (2)当cwnd<ssthresh时,执行多轮慢启动算法;

        (3)当cwnd=ssthresh=16时,执行拥塞避免算法。拥塞窗口cwnd值呈线性增长;

        (4)当cwnd=24时,突遇网络拥塞,出现超时。设置拥塞窗口cwnd=1,增长的阈值ssthresh=12(执行"乘法减少”,即出现超时的拥塞窗口值24的一半),并开始执行多轮慢启动算法;

        (5)当cwnd=ssthresh=12时,执行拥塞避免算法。拥塞窗口cwnd值呈线性增长。

2、快重传与快恢复

        快重传额快恢复是TCP拥塞控制机制中,为进一步提高网络性能而设置的两个算法。

        快重传规定:(1)接收方在收到一个失序的报文段后立即发出重复确认,该目的是使发送方及早知道有报文段没有到达对方;(2)发送方只要收到三个连续重复确认,就应当立即重传对方尚未收到的报文段,而无须等待设置的重传计时器的时间到期。

        快重传如下所示:

                   

        图中,接收方没有收到M3而接收到了M4,出现了失序,因此重复发送三个M2确认;发送方接收到三个确认后,立刻重传报文M3。

        

        快恢复算法是与快重传算法搭配使用的算法。快恢复算法的要点为:当发送方连续收到三个重复的报文段确认时,慢启动阈值ssthresh减半,但之后并不执行慢启动算法,而是执行拥塞避免算法(拥塞窗口cwnd值呈线性增加)。执行过程如下所示:

             

        快重传后使用快恢复的方式为“TCP Reno版本”;而快重传后使用慢启动的方式为“TCP Tahoe版本”,现已废弃不用。

3、随机早期检测RED

        另一种TCP拥塞控制的方法是预防性分组丢弃,即检测到网络拥塞的早起征兆时(路由器的平均队列长度超过了一定的门限值),就用一定的概率p丢弃个别分组,从而避免网络全局拥塞,改进网络的性能。

        早期路由器采用尾部丢弃策略,但是会出现连个问题:(1)丢失分组必须重传,增加网络负担,导致TCP传输延时明显;(2)全局同步现象。路由器的丢弃数据行为导致发送方吹安超时重传,TCP进入慢启动状态,这样一段时间内,网络通信量急剧下降;又因为许多TCP连接在大约同一时刻进入慢启动,它们将在大约同一时刻脱离慢启动,而这将引起网络通信量的急剧上升。这种情况陈伟TCP的“全局同步”。

        为了避免出现”全局同步“现象,路由器采用随机早期检测(Random Early Detection,RED)算法。路由器在输出缓存完全装满之前,就随机丢弃一个或多个分组,避免发生全局性拥塞的现象,使得拥塞控制只是在个别的TCP连接上进行。RED算法中,路由器的队列维持两个参数,即队列长度最小门限TH{min}和最大门限TH{max}。RED对每一个到达的数据报都先计算平均队列长度L{AV}

        (1)若L{AV}<TH{min},则将新到达的数据报放入队列进行排队;

        (2) 若L{AV}>TH{max},则将新到达的数据报丢弃;

        (3)若TH{min}<L{AV}<TH{max},则按照某一概率P,将新到达的数据报丢弃。

4、TCP协议的重传时间

        TCP可靠的一个保证机制就是超时重传,而超时重传的核心是重传超时时间的计算。计算超时重传时间的参数如下:

        (1)往返时间(Round Trip Time,RTT):发送端发送一个数据包给对端,然后接收端返回一个ACK。发送端计算出这个包来回所需的时间就是RTT。

RTT=链路层的传播时间+端点协议栈的处理时间+中间设备的处理时间

        RTT的前两个部分值相对固定,而中间设备处理时间会随着网络拥塞程度的变化而变化,所以RTT的变化在一定程度上反应了网络的拥塞程度。

        (2)加权平均往返时间(Smoothed RTT,RTTS):又称平滑往返时间,该时间是通过多次RTT的杨根本多次测量的结果。

RTTS的初始值=计算出来的第一个RTT

        RTTS的计算公式如下:

新的RTTS=(1-\alpha)*(旧的RTTS)+\alpha*(新的RTT样本)

        根据RFC推荐,\alpha值为1/8,这样计算的RTTS更加平滑。

        (3)重传超时时间(Retransmission TimeOut,RTO):基于RTT计算出的一个定时器超时时间。RTO的作用是:没发送一个TCP报文段,就开启一个重传计时器。当计时器超时,还没有收到接收方的确认,就重传该报文段。RTO的计算公式为:

RTO=RTTS+4*RTTD

        式中:RTTD的初始值=1/2*RTT样本值。

        RTTD的计算公式为:

新的RTTD=(1-\beta)*(旧的RTTD)+\beta*|RTTS-新的RTT样本|

        根据RFC推荐,\beta值为1/4。

 

 

 

 

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

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

相关文章

数据结构系列学习(九) - 循环队列(Circular_Queue)

目录 引言&#xff1a; 学习&#xff1a; 循环队列设计背景&#xff1a; 利用顺序表的思维对队列进行探讨&#xff1a; 解决方案的思考&#xff1a; 循环队列中循环的体现&#xff1a; 循环队列的要点&#xff1a; 第一个难点&#xff1a; 第二个难点&#xff1a; 第三…

Verilog 显示任务($display, $write, $strobe, $monitor)

Verilog 中主要用以下 4 种系统任务来显示&#xff08;打印&#xff09;调试信息&#xff1a;$display, $write, $strobe, $monitor。 $display $display 使用方法和 C 语言中的 printf 函数非常类似&#xff0c;可以直接打印字符串&#xff0c;也可以在字符串中指定变量的格…

7. 微服务之Docker自动化部署

7.1 Docker 介绍 Docker 是一个快速交付应用、运行应用的技术&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通过一行命令完成&#xff…

华清远见:驱动点灯第N回目

1.在串口工具进行输入&#xff1a; echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ---->led1灯点亮 ec…

力扣刷题day52|84. 柱状图中最大的矩形

文章目录84. 柱状图中最大的矩形思路动态规划单调栈84. 柱状图中最大的矩形 力扣题目链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: …

空间域图像增强处理-含Labview程序

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、领域图像增强实例分析✳️ 2.1 线性滤波实例分析✳️ 2.2 非线性滤波实例分析✳️ 2.3 Canny边缘检测✳️ 三、Labview程序获取✳️ 一、引言 图像在其采集或传递过程中常会受到各种噪声的影响&#xff0c;这会导致其中包含的重要信息很…

忘机工尺谱 - 快速打谱软件

引言 为了实现高效快速打谱&#xff0c;我实现了一种词谱分离的输入方案&#xff0c;解决了当前工尺谱平台打谱过程频繁切换输入法和频繁点击鼠标等问题&#xff0c;大大提高了打谱效率。同时借鉴了Markdown编辑器”所见即所得“的思想&#xff0c;输入的同时可以见到排版后的…

java线程控制

java线程控制的语法很多 这里我们主要说以下三个方法 我们先新建一个包 包下建立两个类 customException 线程类 参考代码如下 public class customException extends Thread {public String name;public customException(){}public void run(){for(int i 0;i < 100;i)…

逆变器电力计量仪表可安装在分布式光伏运维云平台、光伏变电站

安科瑞 李可欣 1、概述 AcrelCloud-1200分布式光伏运维云平台通过监测光伏站点的逆变器设备&#xff0c;气象设备以及摄像头设备、帮助用户管理分散在各地的光伏站点。主要功能包括&#xff1a;站点监测&#xff0c;逆变器监测&#xff0c;发电统计&#xff0c;逆变器一次图&…

解决找不到依赖项的问题(根源直接解决)

&#xff08;文章最后&#xff0c;我会介绍一个万能解决方法&#xff09; 问题&#xff1a; 原因&#xff1a; &#xff08;1&#xff09;可能是你的本地仓库里没有该依赖项。 &#xff08;2&#xff09;如果有的话&#xff0c;可能是没有更新同步到idea 解决方法&#xff1…

基于Springboot+mybatis+mysql+html教育培训中心教学系统

基于Springbootmybatismysqlhtml教育培训中心教学系统一、系统介绍二、功能展示1.用户登陆2.用户注册3.个人中心4.人员信息管理5.课程管理6.缴费管理7.学生考勤管理8.器材管理9.问题管理&#xff08;学生、老师&#xff09;一、系统介绍 系统主要功能&#xff1a; 管理员&…

第五届“传智杯”全国大学生计算机大赛(练习赛)[传智杯 #5 练习赛] 时钟

[传智杯 #5 练习赛] 时钟 题目描述 你有一个电子钟&#xff0c;可以显示 0:00 到 23:59 之间的所有时间&#xff0c;以数字的形式显示。其中小时是 0 到 23&#xff08;0 时会显示一个 0&#xff0c;而 1 到 9 时不会显示前导 0&#xff09;&#xff0c;分钟是 00 到 59&…

矩阵分析与计算学习记录-矩阵函数

本章重点内容&#xff1a; 矩阵函数的定义和计算 矩阵函数的导数和积分&#xff1a;导数定义和性质、对矩阵变量的导数、矩阵函数的积分及其性质 利用矩阵函数求解线性常系数微分方程&#xff1a;一阶线性常系数微分方程、n阶线性常系数微分方程 1. 矩阵函数的定义和计算 1…

前端面试总结

自我检查&#xff1a; 1、 vue有哪些常用的指令 2、 v-if和v-show的区别? v-show 控制的哪个css元素?v-if和v-show初始条件都为false的时候哪个会加载? 3、 3.Vue常用的修饰符? .sync 怎么在子组件触发修改父组件属性的值?具体是$emit哪个事件触发修改? .sync 的原理有了…

栈的应用----括号匹配问题

1.题目 括号匹配 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合…

Linux常见指令与shell理解

Linux常用指令与shell理解 文章目录Linux常用指令与shell理解1. ls指令2. cd指令3. pwd命令4. touch指令5. mkdir指令6. rmdir和rm指令7. man指令8. cp指令9. mv指令10. cat与tac指令11. more指令12. less指令13. head指令14. tail指令15. 时间指令16. Cal指令17. find指令18. …

[附源码]SSM计算机毕业设计置地房屋租赁信息系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2E服务-WriteDataByIdentifier

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;本文介绍数据传输服务下的2E服务WriteDataByIdentifier&#xff0c;允许客户端在通过提供的dataidentifier数据标识符指定的内部位置将信息写入服务器。 参考文章&#xff1a; 数据传输功能单元——DID参数定义 2…

汇编语言与微机原理 期末复习题整理(大题)

写出实现下列计算的指令序列。&#xff08;假定X、Y、Z、W、R都为有符号字变量&#xff09; Z 2*&#xff08;W-X&#xff09;/&#xff08;5*Y&#xff09; ;因为(5*Y)会出现32位变量&#xff0c;32位变量不能作为除数&#xff0c;所以需要改变运算顺序 MOV AX,W ;AX←W S…

【算法05】合并两个有序链表

目录 问题 思路 版本一 版本二 答案 版本一 版本二 问题 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例二&a…