本来ns3中实现的TCP协议栈就实现了各种的拥塞控制算法,我自己基于UDP协议也实现了一些拥塞控制算法。为什么这么干,当时觉得基于TCP协议仿真不灵活,比如怎么拿到数据包的单向传输时延,怎么统计丢包率。当时觉的这些都没法做,于是就模仿quic协议自己实现了一个简单的传输协议。最近发现,这些在ns3中的TCP协议栈中都是可以实现的。这样就显得我自己的实现很多此一举。通过抄写别人的代码,编程能力有所提升。
然后就有一些同学,询问我的代码,代码本身是开源的。但是,一般向我问询的人都是是刚入门ns3。看到我的一坨代码,就不知道如何安装了。我又是十分热心的人,知道现在做毕设,做研究的不易,愿意帮助他们减少一些学习的困难。因为我感觉在网络研究领域,认真的人渐少。单纯的写手越来越多,点线图伪造的一个比一个高。但是一遍遍告诉别人怎么安装,每次查不到都要花费半天,时间浪费的令我心痛。子在川上曰:逝者如斯夫,不舍昼夜。我是一个惜时的人,有时周边人聚会什么的,我都不乐意参加,让人感觉不易相处。My time is not measured by the tick of a clock, but by the length of life.
遂有此篇,怎么ns3中安装这坨代码[1],并获取数据。
Step1 修改编译器标志
ns3中的有个编译标志需要修改,不然,定义的函数,没有被调用,编译当做错误处理。参考[2]中的1.3节(Change some warning flags)。
Step2 文件放置
把[1]中的整个dqc文件夹放进ns3的src文件夹下。
配置环境变量
sudo gedit /etc/profile
export DQC=/home/zsy/C_Test/ns-allinone-3.26/ns-3.26/src/dqc/model/thirdparty
export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:$DQC/include/:$DQC/congestion/:$DQC/logging/
这里的DQC是我电脑中的路径,替换你的路径!
找不路径,可以在shell中进入dqc/model/thirdparty,键入$PWD命令,
把输出的绝对路径赋值给DQC。
建立一个 traces文件夹收集数据
编译
每次编译或者运行,需要生效环境变量。
sudo su
source /etc/profile
编译./build.py。
测试
把github中scratch下文件,复制到ns3的scratch文件夹下。
曾经有同学,把我github中scratch文件夹放进了ns3中的scratch下(scratch/scratch/dqc-test),肯定是出错的。
运行:
sudo su
source /etc/profile
./waf --run "scratch/dqc-test --it=1 --cc=bbr"
数据就在traces文件夹下。比如后缀为owd的文件,收集的就是单向时延信息。
//https://github.com/SoonyangZhang/DrainQueueCongestion/blob/master/dqc/model/dqc_trace.cc
void DqcTrace::OpenTraceOwdFile(std::string name){
char buf[FILENAME_MAX];
memset(buf,0,FILENAME_MAX);
std::string path = std::string (getcwd(buf, FILENAME_MAX)) + "/traces/"
+name+"_owd.txt";
m_owd.open(path.c_str(), std::fstream::out);
}
void DqcTrace::OnOwd(uint32_t seq,uint32_t owd,uint32_t size){
if(m_owd.is_open()){
float now=Simulator::Now().GetSeconds();
m_owd<<now<<"\t"<<seq<<"\t"<<owd<<"\t"<<size<<std::endl;
m_owd.flush();
}
}
m_owd<<now<<"\t"<<seq<<"\t"<<owd<<"\t"<<size<<std::endl;这行就透漏每行数据的含义。
[1] evluation congestion control algorithm
[2] ns3安装教程