随便说说
上一节我们似乎只是简单地说了“Hello“,然后介绍了一丢丢技巧,对NS3这个庞大的世界还没有进行真正的探索。
先前在自己的帖子搭建P2P网络介绍过first脚本,但当时的自己也是一知半解(虽然现在也没好多少),文章里只是简单分析了代码各部分的功能,然后展现了实验结果和工具的使用过程,并没有很细致去学习代码。因此决定带领读者和自己一起动手搭建一个最简单的P2P网络,一起学习NS3的代码逻辑。
顺口一提,关于工具NetAnim、Tracemetrics的使用方法,在之前的文章中有详细的介绍,如有需要可移步~搭建P2P网络
问题来了
现需要创建一个包含两个节点的有线网络,链路层使用点对点协议(Point-To-Point,PPP)进行分组传输,点对点信道要求传输速率5Mbit/s、传播延迟2ms,其中1号节点作为服务器、0号节点作为客户端。
认识头文件
NS3脚本主要以C++语言编写,其头文件的均以:”<模块名>-module.h"命名,因此根据脚本需要的模块进行引入即可。
那么我们一起来想一下,搭建一个p2p网络需要哪些模块呢?当新手看到这里八成是要在心里骂街,模块那么多那么多,。别急,让我们一起去认识他们。
#include "ns3/core-module.h":定义了ns3的核心功能:模拟事件、事件调度巴拉巴拉
#include "ns3/network-module.h":基本网络组件:网络结点、分组和地址
以上两个头文件是所有脚本必须要有的,NS3可是一个模拟器,怎么能少了core~要是连网络节点都无法定义,怎么能继续进行呢?
#include "ns3/internet-module.h": 定义了TCP/IP协议栈
#include "ns3/applications-module.h": 定义了分组收发模型:贪婪模型、ON/OFF模型等
这两个模块不是必需的,但是基本都会用到,毕竟网络和应用的环节还是不可缺少的。
命名空间与日志系统
using namespace ns3: ns3命名空间保护整个ns3源代码,方便项目与非ns3项目隔离与整合
这也意味着如果只引用ns3命名空间时,想要使用标准库函数(cin、cout等)必须使用std::cin...
因此一般习惯性地将标准库命名空间一同加上
using namespace std;
下面定义一个日志组件,名为“My New First"
NS_LOG_COMPONENT_DEFINE("My New First");
日志系统对代码调试和了解模拟流程都有着很重要的作用,但目前对这部分了解还不太多,后续会继续学习。
准备阶段
现在让我们进入main,开始正式编写脚本吧
CommandLine cmd;
cmd.Parse(argc,argv);
这里定义了一个命令行变量,其作用是可以通过终端去临时修改一些变量,方便调试
LogComponentEnable(
"UdpEchoClientApplication",LOG_LEVEL_INFO);
LogComponentEnable(
"UdpEchoServerApplication",LOG_LEVEL_INFO);
这里的两步是为了打印Log组件的信息,分别输出服务器和客户端的信息
准备阶段里设置命令行与日志组件,可能一开始很不好理解,不过随着学习的深入,会越来越明了的。这部分内容推荐大家去阅读马春光先生的教材《