【传输层协议】Linux默认拥塞控制CUBIC

一,CUBIC信息

参考:https://zhuanlan.zhihu.com/p/358808466

论文原文:https://www.cs.princeton.edu/courses/archive/fall16/cos561/papers/Cubic08.pdf

CUBIC是当前Linux系统上默认的拥塞控制算法(内核2.6.18之后)。它的拥塞控制窗口增长函数是一个三次函数,这样设计的目的是为了在当前的快速和长距离网络环境中有更好的扩展性。CUBIC的拥塞窗口增长独立于RTT,因此能更好的保证流与流之间的公平性。

二,前身: BIC-TCP

在Linux内核2.6.8版本里,BIC-TCP被选为默认算法,优点在于稳定性。

BIC-TCP采用二分搜索的方式来决定拥塞窗口的增长尺度:

最大值点:TCP最近一次出现丢包时拥塞窗口的值;

最小值点:最近一个RTT周期内没有出现丢包事件时窗口的大小;

二分搜索记录最小值和最大值的中间点,当拥塞窗口增长到这个中间值且没有出现丢包的话,就说明网络还可以容纳更多的数据包。那么将这个中值设为新的最小值,在新的最小值和最大值间搜索中间值。

在拥塞窗口的值还远没有达到BDP时,其增长速度很快;相反,当拥塞窗口的值接近于BDP时,其拥塞窗口增长函数是一个简化的对数凹函数。这个凹函数使拥塞窗口在饱和点或平衡点比凸函数或线性函数保持更长的时间。

当超过最大值时,最大探测使用一个与前阶段完全对称的窗口增长函数。在最大探测期间,窗口最初缓慢地增长以发现附近新的最大值,经过一段时间的缓慢增长,如果没有找到新的最大值,则它猜测新的最大值离得很远,所以它给窗口大小增加一个大的固定增量,使用加法增加切换到更快的增加速度。

在这里插入图片描述

三,下一代: CUBIC

CUBIC是BIC-TCP的下一代版本。 它通过用三次函数(包含凹和凸部分)代替BIC-TCP的凹凸窗口生长部分,大大简化了BIC-TCP的窗口调整算法。实际上,任何奇数阶多项式函数都具有这种形状。

在这里插入图片描述

关键特征

窗口增长仅取决于两个连续拥塞事件之间的时间。拥塞事件是指出现TCP快速恢复。因此,窗口增长与RTT无关。

窗口增长函数

当出现丢包事件时,CUBIC同BIC-TCP一样,会记录这时的拥塞窗口大小作为 W m a x W_{max} Wmax,接着通过因子β执行拥塞窗口的乘法减小,这里β是一个窗口降低常数,并进行正常的TCP快恢复和重传。从快速恢复阶段进入拥塞避免后,使用三次函数的凹轮廓增加窗口。三次函数被设置在 W m a x W_{max} Wmax处达到稳定点,然后使用三次函数的凸轮廓开始探索新的最大窗口。

增长函数公式如下:

W ( t ) = C ( t − K ) 3 + W m a x W(t)=C(t-K)^3+W_{max} W(t)=C(tK)3+Wmax

C是一个CUBIC的参数,t是从窗口上次降低开始到现在的时间,是一个弹性值,而K是上述函数在没有进一步丢包的情况下将 W增加到 W m a x W_{max} Wmax经历的时间,其计算公式如下:

K = W max  ∗ β C 3 K=\sqrt[3]{\frac{W_{\text {max }} * β}{C}} K=3CWmax β

乘法降低

当出现数据包丢失时,CUBIC会通过乘以因子β来降低拥塞窗口,这里取β=0.2,设置β<0.5的副作用是收敛较慢。虽然更适应性的设置会导致更快的收敛,但是会使协议的分析变得更加困难,并影响协议的稳定性。

快速收敛

为了提高CUBIC的收敛速度,在协议中加入了启发式。当新的流量加入网络时,网络中的现有流量需要放弃其带宽份额,以使新流量有一定的增长空间。

在发生丢包前,CUBIC会记录一个最大窗口值 W m a x W_{max} Wmax,当发生丢包后,在降低窗口前,CUBIC又会记录当前的窗口值作为新的 W m a x W_{max} Wmax,为了不至于混淆,可以将之前记录的 W m a x W_{max} Wmax标记为 W l a s t m a x W_{lastmax} Wlastmax。当发生丢包时,CUBIC会比较二者大小,如果 W l a s t m a x W_{last max} Wlastmax小于 W m a x W_{max} Wmax,这表明由于可用带宽的变化,该流所经历的饱和点正在降低。这种情况下,CUBIC的做法是通过进一步的减小 W m a x W_{max} Wmax来释放更多的可用带宽。减小因子为(2-β)/2

四,CUBIC算法

论文用伪代码的形式展示了CUBIC的算法流程,cwnd的迭代计算公式与上述策略基本保持一致:

在这里插入图片描述

五,ns-3中使用CUBIC

从ns-3.33版本开始,ns-3支持CUBIC。

参考:https://blog.csdn.net/qq_42824983/article/details/124966397

但ns-3的协议栈中默认使用newReno作为拥塞控制算法,因此可以修改TCP类型去使用CUBIC

代码直接改自ns-3.34/examples/tcp/tcp-linux-reno.cc

int main (int argc, char *argv[])
{
  uint32_t stream = 1;
  std::string socketFactory = "ns3::TcpSocketFactory";
  //如果要用不同的拥塞控制算法改下面的就行
  // std::string tcpTypeId = "ns3::TcpLinuxReno";
  // std::string tcpTypeId = "ns3::TcpNewReno";
  // std::string tcpTypeId = "ns3::TcpVeno";
  // std::string tcpTypeId = "ns3::TcpBic";
  // std::string tcpTypeId = "ns3::TcpBbr";
  std::string tcpTypeId = "ns3::TcpCubic";
  std::string qdiscTypeId = "ns3::FifoQueueDisc";
  bool isSack = true;
  uint32_t delAckCount = 1;
  std::string recovery = "ns3::TcpClassicRecovery";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值