TCP拥塞控制算法之NewReno和SACK
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP拥塞控制算法之NewReno和SACK相关的知识,希望对你有一定的参考价值。
参考技术A 改进原因分析
TCP Reno 提出的快速恢复算法提高了丢失报文后的吞吐量和顽健性,但是:
仅考虑了每次拥塞发生时只丢失一个报文的情形。
实际网络中,一旦发生拥塞,路由器会丢弃大量的报文,即一次拥塞中丢失多个报文的情形很普遍。
下图是Reno算法中快速恢复状态和拥塞避免状态之间的相互转换:
所以,网络在一次拥塞中丢弃了多个报文,被TCP Reno错误地分析为传输中发生了多次拥塞。过度的窗口减小导致了传输超时的发生。因此为了提高一次拥塞中丢弃多个报文情形下TCP的性能,必须使TCP终端减少盲目削减发送窗口的行为。
New Reno:基于Reno算法的改进
NewReno TCP在Reno TCP的基础上对快速恢复算法进行修改,只有一个数据包丢失的情况下,其机制和Reno是一样的;当同时有多个包丢失时就显示出了它的优势。
Reno快速恢复算法中发送方收到一个新的ACK就退出快速恢复状态,New Reno算法中只有当所有报文都被应答后才退出快速恢复状态。
NewReno TCP添加了恢复应答判断功能,以增强TCP终端通过ACK报文信息分析报文传输状况的能力。
使TCP终端可以把一次拥塞丢失多个报文的情形与多次拥塞的情形区分开来,进而在每一次拥塞发生后拥塞窗口仅减半一次,从而提高了TCP的顽健性和吞吐量。
两个概念:部分应答(PACK)、恢复应答(RACK)
记TCP发送端恢复阶段中接收到的ACK报文(非冗余ACK)为ACKx,记在接收到ACKx时TCP终端已发出的序列号(SN)最大的报文是PKTy,如果ACKx不是PKTy的应答报文,则称报文ACKx为部分应答(Partial ACK,简称PACK);若ACKx恰好是PKTy的应答报文则称报文ACKx为恢复应答(Recovery ACK,简称RACK)。
举例来理解:
如果4、5、6号包丢了,现在只重传4,只收到了4的ACK,后面的5、6没有确认,这就是部分应答Partial ACK。如果收到了6的ACK,则是恢复应答Recovery ACK。
TCP发送端接收到恢复应答表明:经过重传,TCP终端发送的所有报文都已经被接收端正确接收,网络已经从拥塞中恢复。
NewReno发送端在收到第一个Partial ACK时,并不会立即结束Fast-recovery,而会持续地重送Partial ACK之后的数据包,直到将所有遗失的数据包重送后才结束Fast-recovery。收到一个Partial ACK时,重传定时器就复位。这使得NewReno的发送端在网络有大量数据包遗失时不需等待Timeout就能更正此错误,减少大量数据包遗失对传输效果造成的影响。
NewReno大约每一个RTT时间可重传一个丢失的数据包,如果一个发送窗口有M个数据包丢失,TCP NewReno的快速恢复阶段将持续M个RTT。
改进的快速恢复算法具体步骤:
快速恢复是基于数据包守恒的原则,即同一时刻能在网络中传输的数据包是恒定的,只有当旧数据包离开网络后,才能发送新数据包进入网络。一个重复ACK不仅意味着有一个包丢失了,还表示有发送的数据包离开了网络,已经在接收区的缓冲区中,不再占用网络资源,于是将拥塞窗口加一个数据包大小。
Reno和NewReno算法仍存在的问题?
虽然NewReno可以解决大量数据包遗失的问题,但是NewReno在每个RTT时间只能一个数据包遗失的错误。为了更有效地处理大量数据包遗失的问题,另一个解决方法就是让传送端知道哪些已经被接收端收到,但用此方法必须同时修改传送端和接收端的传送机制。
缺乏SACK算法时发送端只能选择两种恢复策略:
TCP SACK在TCP Reno基础上增加了:
当一个窗口内有多个数据包丢失时:
减少了时延,提高了网络吞吐量,使更快地从拥塞状态恢复。
SACK中加入了一个SACK选项(TCP option field),允许接收端在返回Duplicate ACK时,将已经收到的数据区段(连续收到的数据范围)返回给发送端,数据区段与数据区段之间的间隔就是接收端没有收到的数据。发送端就知道哪些数据包已经收到,哪些该重传,因此SACK的发送端可以在一个RTT时间内重传多个数据包。
整个TCP选项长度不超过40字节,实际最多不超过4组边界值。
通过一个wireshark示例来说明接收端的SACK行为:
上图中ACK确认序列号为12421,SACK的块左边界值为13801,SACK的块右边界值为15181。明确了这三个参数的数值,我们基本上就可以计算出被丢弃的数据报的序列号和长度了。通过上图所示的带有SACK的数据报文,我们可以知道被丢弃的数据报文的TCP序列号为12422,其数据长度为13801-12421=1380B。
改进的快速恢复算法:
【参考文献】:
吴文红,李向丽.TCP拥塞控制机制定量性能分析.计算机工程与应用.2008,44(18)
孙伟,温涛,冯自勤,郭权.基于TCP NewReno的稳态吞吐量分析模型.计算机研究与发展.2010
陈琳,双雪芹.TCP网络拥塞控制算法比较研究.长江大学学报.2010,3
许豫飞,TCP拥塞控制算法集齐性能评估.北京邮电大学.2005,3
刘拥民,年晓红.对SACK拥塞控制算法的研究.信息技术.2003,9
焦程波,窦睿彧,兰巨龙.无线网络中选择性重传机制性能分析与改进.计算机应用研究.2007.3
James F.Kurose,Keith W.Ross,Computer Networking A Top-Down Approach Sixth Edition.机械工业出版社
原文: https://blog.csdn.net/m0_38068229/article/details/80417503
在TCP的拥塞控制中,啥是慢开始、拥塞避免、快重传和快恢复算法
在TCP的拥塞控制中,什么是慢开始、拥塞避免、快重传和快恢复算法?这里每一种算法各起什么作用?"乘法减小“和“加法增大”各用在什么情况下
慢开始:在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个MSS的数值。
拥塞避免:当拥塞窗口值大于慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。
快重传算法:发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应该立即重传丢手的报文段而不必继续等待为该报文段设置的重传计时器的超时。
接下来执行的不是慢启动算法而是拥塞避免算法。这就是快速恢复算法。.
防止拥塞的方法
(1)在传输层可采用:重传策略、乱序缓存策略、确认策略、流控制策略和确定超时策略。
(2)在网络层可采用:子网内部的虚电路与数据报策略、分组排队和服务策略、分组丢弃策略、路由算法和分组生存管理。
(3)在数据链路层可采用:重传策略、乱序缓存策略、确认策略和流控制策略。
参考技术A慢开始:在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个MSS的数值。
拥塞避免:当拥塞窗口值大于慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。
快重传算法:发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应该立即重传丢手的报文段而不必继续等待为该报文段设置的重传计时器的超时。
接下来执行的不是慢启动算法而是拥塞避免算法。这就是快速恢复算法。.
运作方法
TCP使用多种拥塞控制策略来避免雪崩式拥塞。TCP会为每条连接维护一个“拥塞窗口”来限制可能在端对端间传输的未确认分组总数量。这类似TCP流量控制机制中使用的滑动窗口。TCP在一个连接初始化或超时后使用一种“慢启动”机制来增加拥塞窗口的大小。
它的起始值一般为最大分段大小的两倍,虽然名为“慢启动”,初始值也相当低,但其增长极快:当每个分段得到确认时,拥塞窗口会增加一个MSS,使得在每次往返时间内拥塞窗口能高效地双倍增长。
以上内容参考:百度百科-TCP拥塞控制
参考技术B 慢开始:在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送端的拥塞窗口cwnd,可以分组注入到网络的速率更加合理。
拥塞避免:
当拥塞窗口值大于慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。拥塞避免算法使发送的拥塞窗口每经过一个往返时延RTT就增加一个MSS的大小。
快重传算法规定:
发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应该立即重传丢手的报文段而不必继续等待为该报文段设置的重传计时器的超时。
快恢复算法:
当发送端收到连续三个重复的ACK时,就重新设置慢开始门限 ssthresh
与慢开始不同之处是拥塞窗口 cwnd 不是设置为 1,而是设置为ssthresh
若收到的重复的AVK为n个(n>3),则将cwnd设置为ssthresh
若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。
若收到了确认新的报文段的ACK,就将cwnd缩小到ssthresh
乘法减小:
是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。
当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。
加法增大:
是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
以上是关于TCP拥塞控制算法之NewReno和SACK的主要内容,如果未能解决你的问题,请参考以下文章
《TCP/IP详解》卷1第16章 TCP拥塞控制&&BBR分析
4-8:TCP协议之拥塞控制(慢启动拥塞避免拥塞发生和快速恢复)