TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)

2023-05-16

TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)

一、TCP拥塞控制的研究框架

二、现有TCP拥塞控制的算法(Reno、HSTCP、Vegas、Westwood)

三、参考文献


一、TCP拥塞控制的研究框架

注:

l  基于丢包反馈:通过ACK所带回来的丢包信息来调整源端的拥塞窗口。Reno等是针对ACK返回的丢包信息改进传统TCP协议。今年来,随着网络带宽的提高、传输延时的增大,针对提高TCP带宽利用率这点,出现HSTCPBIC-TCPSTCP协议。

l  基于路径延时反馈RTT相对于丢包信息反应更灵敏,更能及时反映出一般网络的拥塞情况。适用于小缓存的中间节点,效率较理想。但是对于路由器经常缓存数据促使RTT延长调节拥塞窗口,实际上没有发生拥塞情况。

l  基于显示拥塞反馈:典型的ECN利用中间节点自己检测本身的拥塞状态,如路由器的反馈状态,直接反馈给TCP源端,以此调节源端的窗口值和发送速率。



二、  重点TCP拓展算法

1.      基于丢包反馈的TCP协议(Tahoe、Reno、New Reno、SACK)

1988 V.Jacobson提出了,慢启动和拥塞避免的算法。后期对TCP传输协议算法不断优化改进。目前使用最广泛的TCP Reno拥塞控制主要分为4个阶段:

 

1慢启动阶段  cwnd呈现指数增长趋势

2拥塞避免阶段cwmd>ssthresh  呈现线性增长趋势

3快重传阶段发送方只要一连接收到三个重复确认就应该立即重传对方尚未的报文段,而不必等到重传计时器超时后发送。3个重复应答判断有包丢失,重新发送丢包的信息。

4快速恢复阶段:主要决定于收到的重复应答数据的初始门限值(一般为3

与慢启动不同,Reno的发送方用额外到达的应答为后续包定时。

发送方窗口的上限值=min【接收方窗口,拥塞窗口】

整个reno过程见下图:

 

 TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)

 

 

2.      基于延时反馈的TCP协议(Vegas、Westwood)

经典的Vegas算法的基本思路:RTT增加,拥塞窗口减小;RTT减少,拥塞窗口变大。

1重传机制Vegas采用更精确的RTT估计值在以下两种情形下决定是否重发:

- 当接受到重复ACK时,Vegas检查目前时间和记录的时间标签之差是否比超时值大,如果是,则立刻重发数据包,不必等第三个重复ACK。当接受重传数据包应答后,Vegas3/4而不是1/2因子降低拥塞窗口。

- 当接受到非重复的ACK时,如果它是重发之后的第一或是第二个确认,Vegas将再次检测数据发送时间间隔是否查过超时值。如果是,则重发。

2拥塞避免机制Vegas通过比较实际吞吐量和期望吞吐量来调节拥塞窗口的大小。

期望吞吐量:Expected=cwmd/BaseRTT

实际吞吐量:Actual=cwnd/RTT

计算差值:diff=Expected-Actual*BaseRTT

BaseRTT是所有观测来回响应时间的最小值,一般是建立连接后所发的第一个数据包的RTTcwnd是目前的拥塞窗口的大小。

定义阈值ab,当diff拥塞窗口增大,+1;当diff>b,拥塞窗口缩小,-1;当a<=diff<=b,拥塞窗口不变。通常a=1b=3,意味着该连接至少保留一个包在队列中。

3慢启动机制

由于一开始慢启动没有相关的传输数据和带宽速度等参数,需要设定慢启动门限。Vegas每经过两个RTT使cwnd拥塞窗口增加1倍。然后计算diff,当diff>a,则结束慢启动,转入拥塞避免。

 Vegas慢启动中,每经过两个 RTT使 W增加 1倍。其中前一个 RTT内是与 TCP Reno相同的指数增长,即每收到一个 ACK包就将加 1,同时发送出两个数据包,可称为增长期;后一个 RTT内保持不变以观测 RTT的变化,可称为观测期。Vegas的慢启动过程就是由一个增长期和一个观测期周期往复,在每个观测期结束时,计算新的 RTTdiff的值,以此决定是继续下一个周期还是结束慢启动。

这种慢启动事实严重降低了传输速率。有些学者提出了自适应慢启动算法,或是慢启动阶段采用Reno方法。

Vegas-A:主要思路是ab可以随着网络情况自动调节,初始值分别是13

 

 

无线传输中的Westwood算法

基本思路:发送端利用检测到的ACK的到达率来估测可使用的带宽。

1)快速恢复机制westwood算法重点放在出现报文丢失时候如何使用带宽估计值设定拥塞窗口的cwndssthresh。在收到了三个重复的ACK或是超时,具体算法:

TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)
其中,PacketSize 指分组大小,BWE 为带宽估计值(单位时间分组数目*分组大小),RTTmin 是测得的最小 RTT 值,理想情况下等于中间队列长度为零时测得的值。TCPW Reno的基础上,通过测量估算出网络的可用带宽,对拥塞窗口cwnd进行适当调整,实现更快速的恢复。这种机制尤其在无线网中非常有效,与Reno相比吞吐量成倍提高。

2)慢启动阶段

慢启动和加性递增阶段仍然采用Reno的增加机制。慢启动处于带宽探测阶段,慢启动时处于带宽探测阶段,cwnd呈指数增长,ssthresh如果定的过高,容易导致较多的分组重传,而如果ssthresh 定的过低,则会导致过早进入线性递增,降低带宽利用率。

由于westwood无法区分网络拥塞丢包和无线随机错误丢包,尤其是无线网络时延抖动和随机错误丢包会被westwood误认为是网络拥塞,大大降低网络带宽利用。

Westwood-v算法:在慢启动阶段, 改进算法对慢启动阶段的网络状态根据队列中的报文长度N 进行区分, 并把窗口调整与估计带宽紧密结合起来, 根据网络状况, 采用不同的窗口增加策略, 避免了原有 TCPW 中拥塞窗口的盲目增加导致的分组拥塞丢失。此外, 对于分段, 不是采用固定值ssthresh/2, 而是根据当前的拥塞窗口与预测到的下一时刻的可用带宽的关系来分段, 具有动态自适应性。简而言之,慢启动时,采用vegas的方法计算diffb比较,如果说明带宽还未充分利用,保持reno的指数和线性增加。当>b意味着带宽充分利用,但接近拥塞状态,如果还处于慢启动阶段,说明ssthresh偏大,需要更改,使TCP进入拥塞避免阶段。如果处于拥塞避免阶段,则降低窗口增加速率。


3、基于丢包反馈的高速带宽算法(HSTCP、STCP、BIC-TCP、CUBIC)

HSTCPSTCP的基本思想:当拥塞窗口>阈值时,窗口增加因子aw)与减少因子bw)成为窗口调节大小w的函数。

1.      HSTCP-high speed TCP高速传输协议 

适用于高速度、大时延网络  窗口快速增长,乘性缩小

该算法的根本思想是修改标准TCP协议的反应函数,受到窗口增长和丢包下降函数综合影响。重点介绍HSTCP的拥塞避免阶段窗口的调节算法。在拥塞避免阶段,接受一个ACK后,增长方式为:

线性增加  cwmd=cwmd+aw/cwmd

发生一次拥塞,拥塞窗口减少方式为:

乘性减少  cwnd=1-b(w)*cwnd

aw)和bw)的公式依次为:

w>WL

TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)
w<=WL时,aw=1  bw=0.5

 

2.      STCP- scable TCP

拥塞避免阶段受到ACKcwmd=cwmd+aw

拥塞发生时:cwnd=1-b(w)*cwnd

a=0.01  b=0.125参数固定不变。

 

3.    BIC-TCP

BIC将拥塞控制视为一个搜索问题,具有良好的拓展性、友好性和公平性。但是丢失率<1e-8其发送速率的增长不如HSTCPSTCP快。

BIC包括两部分:二分搜索增加(Binary Search increase+加性增加(additive increase

      二分搜索: TCP主动而非被动搜索一个处于丢包触发阈值的分组发送速率。

Wmin 快速恢复借宿后的拥塞窗口大小值

Wmax 快速恢复结束前的拥塞窗口大小值

首先设置目标窗口的大小为WminWmax的中间值。如果没有丢包,则当前窗口的值设为Wmin,拥塞窗口增加现在与Wmin差值的一半;如果丢包,当前窗口值为Wmax

加性增长:如果目前值与目标值差值太大,将拥塞窗口直接设置为目标值带来很大压力。此时设置一个Smax,按照Smax步长增长。

4.   CUBIC

BIC算法的简化,用三次项支配窗口扩充算法,新窗口的尺寸w为:

 

TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)



三、参考文献

http://blog.csdn.net/zhangskd/article/details/6715751

http://baike.baidu.com/view/1954873.htm

还有许多硕士、博士论文,就不一一列举了,一并感谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood) 的相关文章

  • mbim ndis ecm ncm之我的理解

    这几个问题困扰了我很长时间 xff0c 经过我不懈的努力 加上 我的悟性 xff0c 我自认为 理解了那么一点 ndis xff08 Network Driver Interface Specification xff09 网络驱动接口规范
  • RTK基站坐标,标定

    差分基站的经纬度是人为设定的 xff0c 一般来说 xff0c RTK差分定位是测试的相对值 xff0c 但前提是要给基站设置一个相对精确的经纬度 xff0c 之前没有意识到重要性 xff0c 这次出现的问题 xff0c 确认了这一点 公司
  • Codeblocks+vscode

    由于新买了电脑 xff0c 要重装好多东西 xff0c 简单记录一下 顺序 xff1a 先codeblocks xff0c 后vscode 第一步 xff1a Codeblocks安装 Binary releases Code Blocks
  • wifi 802.11 kvr 漫游

    802 11k 802 11k为无线局域网应该如何进行信道选择 漫游服务和传输功率控制提供了标准 他提供无线资源管理 xff0c 让频段 xff08 BAND xff09 通道 xff08 CHANNEL xff09 载波 xff08 CA
  • WIFI 常识

    DSSS Direct Sequence Spread Spectrum 直接序列扩频 FHSS xff0c 跳频技术 Frequency Hopping Spread Spectrum FHSS和DSSS比较 跳频扩频 xff08 FHS
  • vscode 增加includepath

    方法一 xff1a 按下ctrl 43 shift 43 p打开命令 xff0c 搜索下面关键字 c c 43 43 edit configration 修改下面includepath栏 xff0c 按上面的说明提示修改 34 config
  • STM32F437 CAN错误(一个不发送CAN数据的节点,是会影响CAN总线的)

    终于解决综合插件CAN导致 刷揭示错误的问题 xff0c 过程记录一下 xff0c 有的时候 xff0c 很多错误是可以避免的 xff0c 但是一旦出现 xff0c 解决 排查错误的过程会区级费很长时间 我们的产品有3 4个CAN节点 xf
  • stm32使用PWM播放音频

    我之前研究过STM32的DAC播放wav音频文件 xff0c 今天突然发现使用PWM也可以实现WAV文件的播放 xff0c 让在大开了眼界 xff0c 转载如下 xff1a stm32使用PWM播放音频 pwm stm32 dac pcm
  • uboot 增加硬件看门狗

    先说说uboot的编译过程 xff1a 1 make distclean 2 make defconfig 3 make 在执行上面之前 xff0c 还需要必要 的设置 xff0c 比如配置ARCH CROSS COMPILE 等等 xff
  • ALTRA FPGA程序移植到XILINX CPLD

    由于altra FPGA买不到了 xff0c 现在使用xilinx的CPLD 95144来替换 xff0c 本来想把之前的verilog工程直接重新在ISE上编译一下 xff0c 就可以了 xff0c 看来我是低估FPGA到CPLD的移植过
  • 图形化的调试工具 j-scope systemview

    2022 03 01 当调试传感器 AD值时 xff0c 特别想把转换值直观的展示出来 xff0c 就用到了下面几咱方法 通常的解决办法是用串口上位机 xff0c USB接口上位机或者MDK的逻辑分析仪功能 xff0c 使用这三种方式都比较
  • 移远ec20模式与切换

    移远EC20支持4种模式 0 rmnet模式 通过QMI工具发的QMI命令 xff0c 获取公网IP 这种模式可以配合usb ecm驱动或高通GobiNet驱动使用 1 ecm模式 通过标准的CDC ECM发起data call xff0c
  • STM32开发必备知识篇:串口DMA空闲中断

    随着撰写博客的深入 xff0c 笔者先初步打算把博客细分为四大板块 xff1a 1 FPGA基础知识篇 xff1b 2 FPGA 20个例程篇 xff1b 3 STM32开发必备知识篇 xff1b 4 STM32 10个项目篇 xff0c
  • 大端小端(Big- Endian和Little-Endian)

    字节序 xff08 Endian xff09 xff0c 大端 xff08 Big Endian xff09 xff0c 小端 xff08 Little Endian xff09 图文并茂 http www cppblog com tx7d
  • STM32程序设计规范浅析

    这篇博客写到 STM32基础知识篇 里 xff0c 一方面是一个很好地对过往工作的总结 xff0c 另一方面也是整个专栏撰写计划的开端 xff0c 古人云 xff1a 良好的开端是成功的一半 xff0c 在文章的最后详细地规划了整个专栏后期
  • C语言编程规范(头文件规范)

    C语言的规范使用 xff0c 有利于提高代码的清晰 简洁 可测试 安全 效率 可移植 xff0c 因此必须规范使用C语言编程 代 码 总 体 原
  • C语言变量和常量命名规则

    变量命名规则 原则 1 一个变量只有一 个功能 xff0c 不能把一个变量用作多个用途 2 结构单一 xff0c 不能设计面面俱到的数据结构 xff1b 结构的定义应该明确的描述一个对象 xff0c 去掉相关相不强的数据 xff1b 3 不
  • ROS+Gazebo----Unable to find uri[model:// ]

    基于ROS 43 Gazebo环境 xff0c 用roslaunch把sdf模型加载到gazebo仿真世界 目录结构如下 输入命令roslaunch my simulation my world launch 报错 xff1a 1 不接入网
  • 最完整介绍Visual C++ 6.0和Visual Studio 2022中的编译、生成和运行(CTRL+F7、F7、CTRL+F5)

    我是荔园微风 xff0c 作为一名在IT界整整25年的老兵 xff0c 经常被Visual C 43 43 6 0和Visual Studio 2022初学者问到程序写好后怎么使用编译调试菜单以及怎么使用CTRL 43 F7 F7 CTRL
  • 判断大小端的方法(java和c++)

    首先我们给出大小端的定义 小端 xff1a 较高的有效字节存放在较高的的存储器地址 xff0c 较低的有效字节存放在较低的存储器地址 大端 xff1a 较高的有效字节存放在较低的存储器地址 xff0c 较低的有效字节存放在较高的存储器地址

随机推荐

  • vscode配置c++代码提示补全

    vscode配置c 43 43 代码提示补全 在网上找了大半天 xff0c 说的方式都试过了 xff0c 都没有适合我的 xff0c 还是自己找stackoverflow靠谱点 34 editor rulers 34 80 一行限制80字符
  • 解决头文件相互包含问题的方法

    解决头文件相互包含问题的方法 所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数 一般情况下 xff0c C C 43 43 要求所有的类型必须在使用前被定义 xff0c 但是在一些特殊情况下 xff0c 这种要求无法满足 xff
  • C++ 中头文件相互包含问题的解决办法

    我们在写C 43 43 程序的时候 xff0c 常常要把不同的类的声明放置与不同的头文件中 xff0c 以提高代码的整洁性 xff0c 如此一来 xff0c 就难免会遇到头文件相互包含的问题 xff0c 也就是说 xff0c 假设我们有两个
  • Pixhawk_nuttx启动过程和启动文件

    lt span style 61 34 font family Arial Helvetica sans serif background color rgb 255 255 255 34 gt Pixhawk nuttx启动过程 lt s
  • 施密特触发器原理图解

    施密特触发器原理图解详细分析 重要特性 xff1a 施密特触发器具有如下特性 xff1a 输入电压有两个阀值VL VH xff0c VL施密特触发器通常用作缓冲器消除输入端的干扰 施密特波形图 施密特触发器也有两个稳定状态 xff0c 但与
  • Delphi 类库(DLL)动态调用与静态调用示例讲解

    在Delphi或者其它程序中我们经常需要调用别人写好的DLL类库 下面直接上示例代码演示如何进行动态和静态的调用方法 DLL动态调用与静态调用的例子 编译环境 Delphi XE 转载或编译请不要修改此文件
  • HTML中的Hack手段之条件注释

    通常WEB 的好处就是可以跨平台 但这个世界偏偏有个另类 就是IE 浏览器 在平常做HTML 设计时 xff0c 有时需要为IE 的表示差异而不得不使用一些Hack 手段 条件注释就是这类手段之一 条件注释是IE 浏览器的 专利 也就是说我
  • JavaScript函数中的arguments对象

    ECMAScript标准中 xff0c 每个函数都有一个特殊的内置对象arguments arguments对象是一个类Array对象 object 用以保存函数接收到的实参副本 一 内置特性 说它是一个内置对象是因为我们在创建函数时并没有
  • JavaScript函数之高阶函数

    高阶函数 xff08 higher order function xff09 如果一个函数接收的参数为或返回的值为函数 xff0c 那么我们可以将这个函数称为高阶函数 众所周知 xff0c JavaScript是一种弱类型的语言 JavaS
  • 前端优化建议:合理利用JavaScript的条件运算符

    在最近的项目中要使用到一个格式化文件大小的算法 xff0c 于是不假思索写了如下代码 function formatSize size if size lt 1024 return size 43 34 B 34 else if size
  • 了解python之面向对象

    了解python之面向对象 面向对象概念 xff1a 面向对象编程 xff08 Object Oriented Programming xff0c 简称OOP xff09 是一种程序涉及思想 OOP把对象作为程序的基本单元 xff0c 一个
  • 了解python之进程与线程

    了解python之进程与线程 本文虽然叫作 了解python进程与线程 xff0c 但还是有点难度的 可以先查阅另外一篇文字 xff0c 快速入门 Python快速入门多线程与多进程 1 进程 进程 xff08 Process xff0c
  • Python快速入门多线程与多进程

    Python快速入门多线程与多进程 多线程 多线程的含义 进程我们可以理解为是一个可以独立运行的程序单位 xff0c 比如打开一个浏览器 xff0c 这就开启了一个浏览器进程 xff1b 打开一个文本编辑器 xff0c 这就开启了一个文本编
  • C++中strcmp的头文件问题

    C 43 43 中strcmp的头文件问题 今天在写程序时遇到的一个问题 include lt stdio h gt include lt string gt using std string int main char str STEL
  • strlen()函数详解

    头文件 xff1a include lt string h gt strlen 函数用来计算字符串的长度 xff0c 其原型为 xff1a unsigned int strlen char s strlen 用来计算指定的字符串s 的长度
  • 阿里云物联网平台基本设置-物模型

    陈拓 2019 12 14 2020 01 15 1 概述 如何让设备连接上云 xff1f 参考如下路径 本文以一个温度传感器为例 xff0c 演示创建产品 定义物模型 创建设备 虚拟设备调试 xff0c 这几部分 2 阿里云开通 2 1
  • Make与CMake

    1 Make与CMake 首先先来了解一下gcc xff0c gcc是GNU Compiler Collection 就是GNU编译器套件 xff0c 也可以简单认为是编译器 xff0c 它可以编译很多种编程语言 包括C C 43 43 O
  • C++学习(23)

    1 分析下述代码运行 xff1a include lt iostream gt using namespacestd int main int a 10 61 0 1 2 3 4 5 6 7 8 9 int p 61 a cout lt l
  • 史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路

    花了一天时间把一直以来的 最大子序列 最大递增子序列 最大公共子序列 最长公共子串 等问题总结了一下 其中参考了若干博文 xff0c 都备注引用 首先子序列是指一个一个序列中 xff0c 由若个数 xff08 字母 xff09 组成 xff
  • TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)

    TCP协议拥塞控制算法 xff08 Reno HSTCP BIC Vegas Westwood xff09 一 TCP拥塞控制的研究框架 二 现有TCP拥塞控制的算法 xff08 Reno HSTCP Vegas Westwood xff0