SkillAgentSearch skills...

DrainQueueCongestion

Congestion control algorithms evaluation on ns3

Install / Use

/learn @SoonyangZhang/DrainQueueCongestion
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

DrainQueueCongestion

Algorithms

Congestion control algorithms evaluation on ns3
code is referenced from quic protocol for simulation purpose.
Implemented congestion control algorithms:

  • [x] Reno cubic veno westwood c2tcp elastic
  • [x] vegas tcp-lp copa
  • [x] BBR PCC BBRv2(ecn)
  • [x] DCTCP(ecn)

Supported multipath congstion control algorithms:

  • [x] lia wvegas olia balia
  • [x] couple BBR

Configuration

As for ns3 test case, the wscript gives clear hint how to arrange this file
in the right position in ns3.
And add the CPLUS_INCLUDE_PATH flag in /etc/profile, for example:

export DQC=/home/zsy/C_Test/ns-allinone-3.xx/ns-3.xx/src/dqc/model/thirdparty  
export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:$DQC/include/:$DQC/congestion/:$DQC/logging/  

The path /home/zsy/C_Test/ is where I put ns-allinone-3.xx under, substituting it with your ns3 path.
Create a file named "traces" under /xx/xx/ns-allinone-3.xx/ns-3.xx/ for data collection.

Run

Run simulation on ns3.26:

sudo su  
source /etc/profile  
./waf --run "scratch/bbr-var-eva-3.26 --it=1 --cc=bbr"  

Of cource, the project can be running on newer version of ns3,
as long as the topology is built. For example, on ns3.30.

sudo su  
source /etc/profile  
./waf --run "scratch/bbr-var-eva-3.30 --it=1 --cc=bbr"  

The difference is only in BuildExampleTopo function.

Trace

The code in dqc/model/dqc_trace.cc is used to collect send rate (E_DQC_BW),
one way delay (E_DQC_OWD), raceived rate (E_DQC_GOODPUT).
In bbr-var-eva-3.30.cc, the enable trace flag is:

trace1.Log(log,DqcTraceEnable::E_DQC_OWD|DqcTraceEnable::E_DQC_BW|DqcTraceEnable::E_DQC_GOODPUT);  

The E_DQC_OWD will create file to collect data.
The callback function (DqcTrace::OnOwd) is registered in InstallDqc function to write data to file.

recvApp->SetOwdTraceFuc(MakeCallback(&DqcTrace::OnOwd,trace));  

The meaning of data in it_bbr_flowid_owd.txt can be found in DqcTrace::OnOwd.

void DqcTrace::OnOwd(uint32_t seq,uint32_t owd,uint32_t size){
    if(m_owd.is_open()){  
        char line [256];  
        memset(line,0,256);  
        float now=Simulator::Now().GetSeconds();  
        sprintf (line, "%f %16d %16d %16d",  
                now,seq,owd,size);  
        m_owd<<line<<std::endl;  
    }    
}  

the receipt time of a packet, packet number, owd, packet size.

Results

BBR simulation results:
Test with 3 flow in a point to point channel(3Mbps, one way delay 100ms, max queue length 300ms).
bandwidth fairness(drain_to_target_(false)):
avatar
one way transmission delay
avatar
BBR with the parameter (drain_to_target_(true)):

./waf --run "scratch/dqc-test --it=1 --cc=bbrd"  

rate dynamic:
avatar
one way transmission delay:
avatar
BBRv2:
rate dynamic:
avatar
one way transmission delay:
avatar
Cubic simulation results:
bandwidth fairness:
avatar
one way delay
avatar
The paper on copa: Copa: Practical Delay-Based Congestion Control for the Internet.
Copa simulation results:
bandwidth fairness:
avatar
one way delay
avatar
There is a review papar to evaluate the performance of these algorithms(https://arxiv.org/abs/1909.03673).

Related Skills

View on GitHub
GitHub Stars96
CategoryDevelopment
Updated21d ago
Forks25

Languages

C++

Security Score

100/100

Audited on Mar 16, 2026

No findings