ns3入门(1)——第一个案例first.cc

ns3入门(1)——第一个案例first.cc

一、安装ns3

安装没啥可说的,参考一下别人的网站吧。

说下我的环境吧,ubuntu16.04,仅此。

1.安装eclipse
https://blog.csdn.net/qq_39101111/article/details/78542144

2.安装ns3
https://www.cnblogs.com/zlcxbb/p/3852810.html

3.eclipse+ns3
https://www.jianshu.com/p/85ed25003e30

大部分都没有讲eclipse中为什么要那么配,根据我的猜测(暂时懒得细究),和windows环境下配置java的jdk环境变量一样。就像你需要告诉windows java怎么执行代码一样,你需要告诉eclipse怎么编译以及运行ns3的代码,所以就像前面网站说的那样,需要配置waf,build的位置什么的。
 
 


二、运行hello-simulator (编译,运行,eclipse+命令行)

1、命令行的编译

在命令行里面执行操作的时候,waf是编译器的名字,所以要进入到waf所在的文件夹下使用一下命令。

./waf clean
./waf -d debug -o build/debug --enable-examples --enable-tests configure

首先是清空之前编译过的内容,重新进行编译。
接着在debug模式下进行整个项目的编译。

在这里要解释的是,编译是什么。

按照我的理解,就是把整个项目转换成一种编译器看得懂的语言,比如机器码什么的。所以编译和运行是有差别的。

为什么我要强调是整个项目,因为这个流程比较花时间,所以有时候编译器或者你使用的IDE会选择不去重新编译整个项目而是局部。

好处是运行的时候快了很多,坏处是有时候你会发现你写的代码好像根本没有起作用。

所以小tips

就是你发现出现了一些你没有办法解释的现象的时候,不妨试一试 clean。

2、命令行的运行

使用以下命令

./waf --run hello-simulator

你就会看到你的终端出现了这个程序打印的字符串"Hello Simulator",美妙哈哈哈哈。

而如果想运行其他程序,操作类似,比如我接下来要说的,first.cc。

./waf --run examples/tutorial/first

为什么这里要加路径呢,因为所在文件夹是ns3,没有first.cc,要找过去。同时也可以避免同名的问题。

3、eclipse的运行
我感觉没啥可说的,在之前的配置说明里面其实都挺清楚的了,我觉得各位看到这里的时候对于eclipse中运行肯定没有问题了。如果有,回头再看看第3个链接。
https://www.jianshu.com/p/85ed25003e30
 
 


三、解读first.cc (udp点对点通信)

参考官方文档
https://www.nsnam.org/docs/release/3.29/tutorial/html/conceptual-overview.html#ns-3-source-code

在我看来,代码主要分为两大块,网络配置和应用配置。

为了描述方便,我后面可能部分地方会用英文,不是装逼,是因为有时候翻译不准确,不会翻译,直接英文算了,反正代码里也是英文。

而且我觉得英文就英文,不用管中文是啥,比如NetDevice,鬼知道是啥,网卡还是什么,随便它,反正就是NetDevice,用来配置节点的网络环境的。

1、网络配置

(1) 基本时间单位和日志配置

Time::SetResolution (Time::NS);
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

代码挺明显的,把第一句话的NS看做一个常量吧,可以改,表示最小时间单位是纳秒,我反正目前类比为单片机的晶振类似的。

后面两句就是允许控制台输出。

(2)节点创建

NodeContainer nodes;
nodes.Create (2);

简单易懂,创建了2个节点。

至于container到底在干嘛,先不管,反正这个类牛逼轰轰,让它create就可以create就对了。

(3)点对点通信配置

  PointToPointHelper pointToPoint;
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

又是一个牛逼的类,定义网络环境,速率是5Mbps,延迟是2ms。

(4)NetDevice配置

  NetDeviceContainer devices;
  devices = pointToPoint.Install (nodes);

不多说,给每个节点安装NetDevice。Ns3认为节点node就是计算机,所以这个install就理解成给计算机装一些必备的硬件就行了。

(5)InternetStack配置

InternetStackHelper stack;
stack.Install (nodes);

给每个节点配置协议栈?我觉得是这么回事,其实也不用管目前,反正官方这么弄了,你就这么抄,初学代码,深究没必要呀我觉得。后面你碰到了,再去改就是了,那个时候你学到的东西才是真正学到的。

(6)IP地址配置

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);

这个就有必要说一下了,因为后面用得着。

简单来说就是配置整个网络的ip地址和子网掩码,节点的ip地址会在这个基础上自动加1.

所以,现在,我们有两个节点,分别是:10.1.1.1 , 10.1.1.2。

2、应用配置

(1)端口配置

UdpEchoServerHelper echoServer (9);

(2)服务端节点配置

ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

注意这里第一句话中的参数,nodes是一个容器,有我们的两个节点,get(1)就得到了第一个,意思是第一个节点当做服务器节点。

(3)客户端节点配置

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

需要注意的是这里的端口配置,需要和服务器监听的端口号一样,应该不用多说。

后面就是一些物理层或者mac层的配置而已,最大发包数呀,通信间隔呀,包大小之类的,一看就懂应该。

3、仿真

配置完了就该运行了。

主要运行代码:

  Simulator::Run ();
  Simulator::Destroy ();

需要解释一下的是run(),理解为run函数会调用其他的函数,一层一层会进栈,所以destroy函数虽然紧跟着它,但是并不会马上执行,因为run函数没有执行完。

同时,另一个需要注意的函数是

Simulator::Stop (Seconds (11.0));

中间的数字可以改,上面表示11s的时候停止,需要写在run前面,进行手动关闭,防止死循环啊之类的。

如果写在run后面,那一旦run进入了死循环,这句话就永远执行不到了,所以后面没有意义。
&nbasp;
&nbasp;
&nbasp;


以上,就是对于出入ns3的理解,希望指正。

你可能感兴趣的:(ns3)