SoonyangZhang / DrainQueueCongestion

Congestion control algorithms evaluation on ns3

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

DrainQueueCongestion

Algorithms

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

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

Supported multipath congstion control algorithms:

  • lia wvegas olia balia
  • 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).

About

Congestion control algorithms evaluation on ns3

License:BSD 3-Clause "New" or "Revised" License


Languages

Language:C++ 88.8%Language:Python 10.3%Language:Shell 0.9%