王朝百科
分享
 
 
 

tcp reno

王朝百科·作者佚名  2010-07-05  
宽屏版  字体: |||超大  

Reno是目前应用最广泛且较为成熟的算法。该算法所包含的慢启动、拥塞避免和快速重传、快速恢复机制,是现有的众多算法的基础。

1.慢启动与拥塞避免

TCP发送端采用慢启动和拥塞避免算法来控制向网络输送的数据量。为了实现这些算法,必须向TCP每个连接状态加入3个参量:

(1)拥塞窗口(cwnd),如前所述,它是对发送端收到确认(ACK)之前能向网络传送的最大数据量的一个发送端的限制。

(2)接收端通知窗口(rwnd),它是对未完成数据量的接收端的限制,cwnd和rwnd的最小值决定了数据传送。

(3)慢启动阀值(ssthresh),被用来确定是用慢启动还是用拥塞避免算法来控制数据传送,具体用法如下:当cwnd<ssthresh时使用慢启动算法;cwnd>ssthresh时使用拥塞避免算法;当cwnd=ssthresh时,发送端既可以使用慢启动也可以使用拥塞避免。ssthresh的初始值可以任意大(比如,一些实现中使用接收端通知窗口的尺寸),但是一旦对拥塞响应之后,其大小可能会被减小。

在不清楚网络环境的情况下向网络传送数据,要求TCP缓慢地探测网络以确定可用带宽,以避免突然传送大量数据而使网络拥塞。为达此目的,在传送开始时,采用了慢启动机制,这个机制在修复了由重发定时器探测到的数据丢失之后也被采用。

首先要确定的是cwnd的初始值IW(初始窗口大小),这里规定它必须小于或等于2*SMSS字节而且不能大于两个数据段。

在慢启动期间,每收到一个新的ACK,cwnd最多增长1。直到cwnd超过ssthresh或者检测到拥塞时,停止执行慢启动算法,转入拥塞避免阶段。在拥塞避免期间,cwnd在每个ACK以1/cwnd(或每个RTT增加SMISS个字节)的速度递增。拥塞避免算法一直保持直到检测出拥塞。等式(5.1.1)给出了一个在拥塞避免期间用来修正cwnd值的公式:

cwnd+=1/cwnd (5.1.1)

每收到一个非重复的ACK都采用等式(5.1.1)来调整cwnd。等式(5.1.1)用于近似拥塞避免算法的增长。

在实现中,在拥塞避免期间常用公式:cwnd+=SMSS*SMSS/cwnd来修正cwnd的值,当SMSS*SMSS/cwnd<1时,cwnd+=1。

另一种改进的方案是每当新的ACK到来时记下被新确认的字节数,然后cwnd就可增加相应字节数,这个增加的数目最多可达到SMSS字节。

一旦TCP发送端使用重传定时器检测到包丢失时,ssthresh的值就如下设置:

Ssthresh=max(FlightSize/2,2*SMSS) (5.1.2)

式中,Filght Size是已发送但未收到ACK的数据的大小。

在重发了丢失的数据段之后,cwnd必须被设置成LW(丢失窗口),它等于一个满尺寸数据段的大小。再发丢失的数据段之后,发送端起用慢启动算法增长窗口直到该窗口大小增长到等于新设置的ssthresh值之后,又采用拥塞避免算法了。

2.快速重传与快速恢复

当接收端收到一个失序的数据报时,会立即发回一个重复ACK,这个ACK的目的是告知发送端收到一个失序的数据报并说明其所期望的接受序号。从发送端的角度看,重复ACK可能是许多网络问题引起的。首先,它们有可能是因为包丢失而引起。在此情况下,在此数据段之后的所有数据段都会触发重复ACK。其次,重复ACK可能是由于网络对数据段的重新排序引起的。最后,重复ACK有可能是ACK或数据段被网络复制所引起的。此外,当接收端部分或完整地填补了序号空缺应立即发送一个ACK,这样可以更及时地通知发送端,使其迅速从重发状态中恢复过来。快速重传算法如图5-2所示。

TCP发送端应该使用快速重传算法来探测或者修复数据丢失,在收到3个重复ACK(即连续的4个相同的ACK,标志着1个数据段已丢失)时,TCP不等重传定时器超时就立即重传看来已丢失的数据段。此后起用快速恢复算法来进行新的数据传输,直到1个非重复 ACK到达。

下面是快速传送/快速恢复算法的实现:

(1)当第二个重复ACK收到时,ssthresh根据等式(5.1.2)设值。

(2)重传丢失的数据段并将cwnd的值设置为ssthresh+3*SMSS,称之为给拥塞窗口“充气”。

(3)此后对每个接收到一个重复ACK,将cwnd增大SMSS字节,这将人为地扩充拥塞窗口用以反映已经离开网络的附加数据段。

(4)如果cwnd和接收端的通知窗口值允许的话,发送一个数据段。

(5)当下一个确认新数据的ACK到达时,设定cwnd值为ssthresh(步骤1设置的值),这称作给窗口“放气”。这个ACK必须是步骤1触发的重发引起的确认,重发之后一个RTT(在接收端有次序紊乱的数据段的情况下,它可能一会儿就到达)。另外,此ACK应该确认丢失数据段和第二个重复ACK期间的数据段,如果它们一个也没有丢失的话。Reno算法的性能分析从Reno运行机制中很容易看出,为了维持一个动态平衡,必须周期性地产生一定量的丢失,再加上AIMD机制--减少快,增长慢,尤其是在大窗口环境下,由于一个数据报的丢失所带来的窗口缩小要花费很长的时间来恢复,这样,带宽利用率不可能很高且随着网络的链路带宽不断提升,这种弊端将越来越明显。

公平性方面,根据统计数据,Reno的公平性还是得到了相当的肯定,它能够在较大的网络范围内理想地维持公平性原则。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有