ndnSIM安装、源代码结构与修改兴趣包生存周期

这篇笔记是另一篇博客(https://blog.csdn.net/qq_33588730/article/details/80488870)的前置笔记,建议看另一篇博客之前先看一下这篇的基础。希望这篇笔记可以帮助自己快速回忆一些仿真经验,也便于以后的师弟妹还有其他同方向同学快速入门。

安装ndnSIM的方法在官网上(http://ndnsim.net/2.3/getting-started.html)

sudo ./waf install为止,是建立了一个叫ndnSIM的文件夹,把ndnSIM的所有模块代码从github下载安装到该文件夹下,而从cd .. 开始(即从ns-3文件夹回到父文件夹ndnSIM)是通过创建一个叫scenario的文件夹(在目录ndnSIM下,与ns-3同级)并经过一些设置,来使自己编写的所有代码都可以直接放在scenario文件夹里面(包括自己定制的转发策略,consumer与producer应用,仿真场景文件,仿真结果数据记录脚本等)。如果不进行后半部分的命令行配置,则以后自己编写的不同类型的代码文件需要放在不同的文件夹里,后面还会提到。

同时,在查找代码文件和函数,修改源代码等方面,开发软件IDE推荐使用CLion,旗舰版在校学生不需要付费,可以通过自己学校的学生邮箱认证,网址为:

https://www.jetbrains.com/student/

它的功能比较强大,在能识别出代码文件的彼此调用继承关系的前提下,可以查找函数的声明定义在哪个文件,某个代码的声明方法在哪些文件中调用过,当前代码文件中有哪些方法函数可以用,都可以很方便查到,便于快速理清楚各个代码文件之间的逻辑关系和作用,如下所示:

(1)调出当前代码文件包含哪些方法函数的预览:

(2)看到一个函数不认识,或者不知道某个变量是什么类型,ndnSIM的API文档也查不到,如何去找这个函数和变量的定义和声明:

(3)不知道某个文件或者函数在哪里,左侧的工程目录里找不到,可以按两下shift进入全局搜索:

但是在编译运行仿真的时候,依然需要使用命令行,CLion无法识别一些代码调用会乱标红,只能用来看看改改。

1.在安装好ndnSIM之后,安装目录下一些细节的目录及作用:

(1)ns-3,仿真之后产生的txt仿真结果数据文件会在这个目录下。在命令行中通过./waf来编译运行仿真的waf编译工具也在这个文件夹里。

(2)ns-3/src/ndnSIM,这个是真正的ndnSIM源代码目录。

(3)ns-3/src/ndnSIM/apps,这里面放着多种内容请求者(consumer)和内容提供者(producer)的头文件(.hpp,用于声明和其他文件的继承关系和一些虚函数等)和真正的代码文件(.cpp),它们彼此的继承关系是:ndn-consumer-cbr等特定属性和自己定制的内容请求者继承ndn-consumer,自己编写的特定定制的其他producer应该继承ndn-producer,而ndn-consumer与ndn-producer都继承了ndn-app(在各角色应用的.hpp文件开头会提到),如下所示:

所以为什么在另一篇博客(https://blog.csdn.net/qq_33588730/article/details/80488870)的第4点中会说,consumer和producer是一个应用(Application,app),就是这个原因。在不修改仿真路径信息的情况下(除非已经按照官网提示改成了自己创建的scenarios文件夹),自己修改定制的consumer和producer(包括.hpp和.cpp)都应该放在这个文件夹下。

(4)ns-3/src/ndnSIM/examples,这里面存放着很多ndnSIM官网的simulation example源代码,即仿真场景(scenario)文件所在的地方。如果自己编写了定制的仿真场景文件,如另一篇博客(https://blog.csdn.net/qq_33588730/article/details/80488870)的第1和12点所说,也需要放在这个目录下,如下所示:

其中的topologies文件夹是放置拓扑文件(.txt)的地方,如下所示:

在自己的仿真场景文件(在ns-3/src/ndnSIM/examples或/scenario中)里需要靠topologyReader.SetFileName()方法读取所要仿真的网络拓扑时,就输入这个目录,如下所示:

(5)ns-3/src/ndnSIM/NFD/daemon,这个是ndnSIM中集成了NFD模块的地方,主要负责NDN兴趣包和数据包的转发等功能。其中ns-3/src/ndnSIM/NFD/daemon/fw文件夹里面存放着各种转发策略(forwarding strategy),如另一篇博客(https://blog.csdn.net/qq_33588730/article/details/80488870)的第5点所说,如下所示:

如果要编写定制自己的转发策略,那么新的策略文件(包括.hpp和.cpp)要放到这个文件夹下(如果没有修改原有的仿真路径需要如此,官网http://ndnsim.net/2.3/getting-started.html在页面底部最后一张代码图有方法修改,如文章开头所说)。

2.修改兴趣包的生命周期(Interest lifetime):在ns-3/src/ndnSIM/apps下的ndn-consumer.cpp中,有一行是设置兴趣包生存周期属性的,默认的InterestLifetime是2s,如下所示:

所以修改这个属性,可以达到修改例如ndn-consumer-cbr的兴趣包生命周期的效果,因为第1点的(3)说过,后者继承前者。修改之后,可以用 ./waf --run=<需要运行的仿真场景文件名称(无文件后缀)> --vis来启动图形化仿真,点击simulate启动场景运行之后,可以在某个节点上鼠标右键,选择查看PIT条目,可以看到修改过后的兴趣包生存周期,如下所示:

 

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
在ndnSIM中,可以通过利用ns-3中的TracedCallback函数来获取节点的RTT。具体步骤如下: 1. 在ndnSIM源代码中找到ndnSIM/model/ndn-common.hpp文件,添加如下声明: ```cpp typedef Callback<void, Ptr<const Interest>, Ptr<const Face>, uint64_t> InterestSentCallback; ``` 该声明定义了一个回调函数InterestSentCallback,用于在发送兴趣时获取当前时间戳。 2. 在ndnSIM源代码中找到ndnSIM/model/ndn-common.cpp文件,添加如下代码: ```cpp void ndn::Tracers::TraceInterestSent(Ptr<const Interest> interest, Ptr<const Face> face, uint64_t timestamp) { double rtt = Simulator::Now().GetSeconds() - timestamp / 1000000000.0; NS_LOG_INFO("Interest Sent: " << *interest << ", Face: " << *face << ", RTT: " << rtt); } ``` 该代码定义了一个回调函数TraceInterestSent,用于在发送兴趣时计算RTT并输出。 3. 在ndnSIM源代码中找到ndnSIM/model/ndn-common.hpp文件,在class Face中添加一个成员变量: ```cpp InterestSentCallback m_interestSentCallback; ``` 该成员变量用于存储InterestSentCallback回调函数的指针。 4. 在ndnSIM源代码中找到ndnSIM/model/face/face.hpp文件,在class Face中添加一个公共成员函数: ```cpp void SetInterestSentCallback(InterestSentCallback cb); ``` 该成员函数用于设置InterestSentCallback回调函数。 5. 在ndnSIM源代码中找到ndnSIM/model/face/face.cpp文件,实现SetInterestSentCallback成员函数: ```cpp void ndn::Face::SetInterestSentCallback(InterestSentCallback cb) { m_interestSentCallback = cb; } ``` 该函数将InterestSentCallback回调函数的指针存储到m_interestSentCallback成员变量中。 6. 在ndnSIM源代码中找到ndnSIM/model/face/face.cpp文件,在SendInterest函数中添加如下代码: ```cpp m_interestSentCallback(interest, this, Simulator::Now().GetNanoSeconds()); ``` 该代码调用InterestSentCallback回调函数,并传递当前时间戳。 7. 在ndnSIM的应用程序中,可以通过注册InterestSentCallback回调函数来获取RTT。示例代码如下: ```cpp void TraceInterestSent(Ptr<const Interest> interest, Ptr<const Face> face, uint64_t timestamp) { double rtt = Simulator::Now().GetSeconds() - timestamp / 1000000000.0; std::cout << "Interest Sent: " << *interest << ", Face: " << *face << ", RTT: " << rtt << std::endl; } int main(int argc, char* argv[]) { // 初始化ndnSIM // ... // 注册InterestSentCallback回调函数 ndn::Tracers::TraceInterestSent.connect(&TraceInterestSent); // 发送兴趣 Ptr<ndn::Interest> interest = Create<ndn::Interest>("/example/data"); Ptr<ndn::Face> face = // 获取Face的指针 face->SetInterestSentCallback(ndn::Tracers::TraceInterestSent); face->SendInterest(interest); // 运行仿真 Simulator::Run(); // 结束仿真 Simulator::Destroy(); return 0; } ``` 需要注意的是,上述代码中获取的RTT未处理兴趣数。如果需要处理兴趣数,可以在回调函数TraceInterestSent中添加相应的代码计算兴趣数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值