网络拥塞控制(六)HSTCP
六、HSTCP
注意到上面所提到的TCP的一些缺陷,国外学者开始提出新的拥塞控制方法,最先由Floyd提出了HSTCP(High-Speed TCP),并在2003年由ietf组织标准化(rfc3649)。
HSTCP为了所达到的目标:
1.单个连接能够达到高吞吐率而不需要不现实的低丢包率要求。上面提到,普通的TCP要想在1Gbps,100ms的环境下达到满吞吐率,需要8333个RTT才能达到窗口的最佳值,这需要的一个保证就是在8333个RTT内一个包也不能丢失,否则就会引起窗口的减半,然后即使网络一直顺畅不发生拥塞,然而物理层的传输误码率也无法达到这个要求,也就是说在这个时期内肯定会有丢包发生的。HSTCP就是要在这种情况下达到单连接的高吞吐率,至于为什么要指定说是单连接,相信大家都知道多线程下载时能够提升吞吐率。
2.在慢启动的时候就达到相当的高吞吐,也就是说需要改变TCP的慢启动算法。
3.在发生丢包拥塞后能够快速恢复再次达到高吞吐。
4.不能添加额外的负向反馈,比如说路由器的特殊支持。这个主要是指另一种TCP的拥塞控制方法,显式拥塞通知(ECN)。
5.不能要求接收方提供额外的负向反馈。
6.在中度丢包甚至高丢包环境下性能至少与标准TCP一样好。
7.与标准TCP兼容友好。友好性之前说过,这是一个协议设计中的重要方面。
为了达到上面的要求,我们来看看HSTCP提出的窗口增加和减小方法,先看拥塞控制中的两个公式:
Cwnd = cwnd+a(cwnd)/cwnd ............................ (1)
Cwnd = (1-b(cwnd)) * cwnd ............................ (2)
式(1)是拥塞避免时的窗口增长方式,式(2)是发生了丢包后的窗口下降方式,其中a,b为两个函数,cwnd为其自变量,在标准TCP中a(cwnd)=1,b(cwnd)=0.5,也就是加法增大,乘法减小,为了达到TCP的友好性,在窗口较低的情况下,也就是说非BDP的网络环境下,HSTCP采用的是和标准TCP相同的a和b,也就是一样的方式来保证两者之间的友好性。当BDP大时,也就是w较大时(HSTCP设定的临界值为38),采取新的a和b来达到高吞吐的要求:
a(w) = w^2 * p(w) * 2 * b(w)/(2-b(w)) ,其中p(w)是窗口为w时的丢包率
b(w) = (High_Decrease - 0.5) (log(w)-log(W)) / (log(W_1)-log(W)) + 0.5
High_Decrease是最大的减小乘法因子,标准TCP取值为0.5,HSTCP取为0.1,W为低窗口的临界值,也就是38,W_1是窗口最大值,设为83000(为什么是83000?Floyd是通过10Gbps,100ms的网络下计算出来的窗口值,精确值是83333)。
通过分阶段,根据不同的网络环境下使用不同的TCP窗口增长和降低参数,HSTCP达到了高吞吐的要求。分阶段的思想后来在其他的TCP变种中也得到了应用。显然在cwnd取不同的值的时候,a和b的值都可以计算出来,在RFC3649的最后作者把a和b的取值都计算了出来,真正使用的时候直接查表即可,在Linux内核中可以看到(/net/ipv4/tcp_highspeed.c)一个定义好的数组保存的就是这个表,从代码中可以很好的理解HSTCP。
注:很多计算过程都省略了,推荐看的文档就是RFC3649,所有的数值和计算都说的比较清楚。
下一节:BI-TCP。