implement tcp bbr on ns3 (在ns3上实现TCP BBR)

37 篇文章 20 订阅
20 篇文章 4 订阅

 After several days of work and debug, I implement TCP BBR algorithms on ns3.33.
 One thing is to get instant rtt instead of smothed rtt.
 The second is I notice some difference in tcp-rate-ops.cc (ns3) by comparison with tcp_rate.c (linux tcp stack).

const TcpRateOps::TcpRateSample &
TcpRateLinux::GenerateSample (uint32_t delivered, uint32_t lost, bool is_sack_reneg,
                              uint32_t priorInFlight, const Time &minRtt){
    if (m_rateSample.m_priorTime == Seconds (0) || is_sack_reneg)
    {
      NS_LOG_INFO ("PriorTime is zero, invalidating sample");
      m_rateSample.m_delivered = -1;
      m_rateSample.m_interval = Seconds (0);
      m_rateSampleTrace (m_rateSample);
      return m_rateSample;
    }
  if (m_rateSample.m_interval < minRtt)
    {
      NS_LOG_INFO ("Sampling interval is invalid");
      m_rateSample.m_interval  = Seconds (0);
      m_rateSample.m_priorTime = Seconds (0); // To make rate sample invalid
      m_rateSampleTrace (m_rateSample);
      return m_rateSample;
    }                              
 }

 When m_priorTime is reset as zero in TcpRateSample, m_rateSample.m_ackElapsed will sample a time intervel equal to Simulator::Now (). And m_rateSample.m_priorTime will be update and the acked packet is valid (m_rateSample.m_priorTime!=Seconds(0)) in GenerateSample. A quite low bandwidth value will be sampled. Such low bandwidth will be used by long term bandwidth sampling in BBR algorithm. The flow will gain lower bandwidth here after and weird behavior will be observed.

void
TcpRateLinux::SkbDelivered (TcpTxItem * skb){
    if (m_rateSample.m_priorDelivered == 0
      || skbInfo.m_delivered > m_rateSample.m_priorDelivered)
    {
      m_rateSample.m_ackElapsed       = Simulator::Now () - m_rateSample.m_priorTime;
      m_rateSample.m_priorDelivered   = skbInfo.m_delivered;
      m_rateSample.m_priorTime        = skbInfo.m_deliveredTime;
      m_rateSample.m_isAppLimited     = skbInfo.m_isAppLimited;
      m_rateSample.m_sendElapsed      = skb->GetLastSent () - skbInfo.m_firstSent;

      m_rateSampleTrace (m_rateSample);

      m_rate.m_firstSentTime          = skb->GetLastSent ();
    }
}

 So change is made on SkbDelivered function:

  if (m_rateSample.m_priorDelivered == 0
      || skbInfo.m_delivered > m_rateSample.m_priorDelivered)
    {
      m_rateSample.m_priorDelivered   = skbInfo.m_delivered;
      m_rateSample.m_priorTime        = skbInfo.m_deliveredTime;
      m_rateSample.m_isAppLimited     = skbInfo.m_isAppLimited;
      m_rateSample.m_sendElapsed      = skb->GetLastSent () - skbInfo.m_firstSent;
      m_rate.m_firstSentTime          = skb->GetLastSent ();
    }
    m_rateSample.m_ackElapsed        = Simulator::Now () - m_rateSample.m_priorTime;
    m_rateSampleTrace (m_rateSample);

The third change is in tcp_socket_base.cc

uint32_t
TcpSocketBase::SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck){
	m_rateOps->SkbSent(outItem, isStartOfTransmission&&(m_tcb->m_highTxMark==m_tcb->m_nextTxSequence));
}

 I test three TCP BBR flows on a 6Mbps, 50 one way propagation delay p2p link.

Result:

 Estimated bandwidth at sender:
在这里插入图片描述
 Taces rtt of each flow:
在这里插入图片描述
  The code is uploaded to github [6].
Reference:
[1] Reproduce-TCP-BBR-in-ns-3
[2] linux bbr
[3] ns-3-dev-git
[4] test quic bbr on ns3
[5] evaluation BBRv2 on ns3
[6] tcp-bbr-ns3 code

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值