Reno
传统的TCP Reno算法有慢启动,拥塞避免,快速重传快速恢复阶段。
Reno算法存在的问题主要有:
- 受链路Buffer(缓冲区)影响很大。Buffer小于BDP会很容易丢包,速度一直上不去;Buffer太大会延迟严重,易发生超时重传。
- 对高带宽网络利用率低。CA阶段,每经过一个RTT拥塞窗口大小加1,收敛速度太慢。
- 对共享链路其他RTT较大的连接不友好。RTT小的连接会抢占带宽,不公平。
之后又对Reno算法一些细节进行改进诞生了New Reno算法、SASK算法。
后来又诞生了BIC算法。
Bic算法
BIC和CUBIC的慢启动、快速重传恢复阶段与Reno相同。
发生丢包时定义最大拥塞窗口为Wmax ,采用乘性减减小拥塞窗口至Wmin ,Wmax = β * Wmin ,β为小于1的系数。此时实际最佳窗口值应该在Wmax 和Wmin 之间,此时BIC算法在这个区域采用二分搜索,每经过一个RTT,便将窗口设置到Wmax 和Wmin 的中点,如果没有丢包,则更新Wmin 为当前cwnd值,一直持续到接近Wmax,直到二者之差小于Smin。
但是在一个RTT里面增长过多会造成传输上的抖动,因而BIC-TCP选取了另外取了两个参考值,称为Smax和Smin,如果中点和当前cwnd值的差大于Smax的话,那么cwnd就只增长Smax。
没有丢包情况下达到Wmax ,说明链路发生变化,可用带宽更大,就需要快速抢占带宽测试新的天花板Wmax ,进入最大窗探测过程(Max Probing)阶段,首先把Wmax 设置为一个非常大的值,然后BIC采取了一个类似慢启动策略,每个RTT后窗口值变为cwnd+1,cwnd+2,…,cwnd+Smax,直到增长为Smax的时候再次进入二分阶段。
BIC在离Wmax 较远时,窗口增速很快,如果将BIC广泛应用到RTT较小,丢包较高的网络中去,BIC的增窗策略太激进了,大量的抢占了资源,公平性难以保证。其次,BIC的的窗口控制阶段较多,还有Smax和Smin的区分,增加了算法实现复杂度。
Cubic算法
CUBIC是对BIC的改进。
CUBIC用一个三次多项式代替了BIC增长曲线,对窗口增长机制进行了简化,保证了快速探测合适的拥塞窗口。并且不再以RTT为单位,窗口增长函数仅仅取决于连续的两次拥塞事件的时间差,保证了公平性。
c
w
n
d
=
C
(
t
?
K
)
3
+
W
m
a
x
cwnd = C(t-K)^3+W_{max}
cwnd=C(t?K)3+Wmax?
K
=
β
W
m
a
x
/
C
3
K = \sqrt[3] {\beta W_{max}/C}
K=3βWmax?/C
?
其中:
t
t
t为当前时间和上次窗口降低之间的时间差。
C
C
C为系数,较大时曲线更陡。
K
K
K在上次丢包时更新,计算多长时间达到Wmax
β
β
β为小于1的系数,Wmax = β * Wmin
t
t
t离
K
K
K越远,曲线增加越快,接近
K
K
K时曲线近乎水平。
当窗口太小使得CUBIC不能获得比传统TCP更好的性能时,例如在一次丢包事件后,经过t时间,如果CUBIC的增窗速度小于标准TCP,则采用标准TCP增加的窗口大小。
Cubic优点有:
Cubic存在的问题有:
- 当带宽变化时,cwnd跟随比较慢。因为三次曲线中间部分几乎是水平的。
- 更容易导致BufferBloat,即在Buffer较大时,容易导致Buffer难以清空,延迟会很高。
|