本文是我使用ns3的一点小结,以及一些基本操作,可以供初学者借鉴
首先进入ns-allinone-3.17文件夹中的ns-3.17文件夹,然后把需要使用的实例third.cc复制到scratch文件夹,在运行实例
输入cd ns-allinone-3.17 //进入ns3文件夹
cd ns-3.17 //进入运行目录
cp examples/tutorial/third.cc scratch/third.cc //复制我们要用的实例third.cc进去scratch文件夹(莫忘了格式后缀名)
./waf --run scratch/third //运行实例(运行是不需要后缀名,否者会出错)
可以看见实例的运行结果,此结果表示的意思是:第一行:客户机在第2s的时候向IP为10.1.2.4的节点的第九号端口(port)发送了1024字节大小的数据包第二行:10.1.2.4的这个服务器接在2.00596s收到了来自10.1.3.3的端口为49153的1024字节大小的数据包第三行:10.1.2.4服务器在2.00369s向10.1.3.3的49153号端口发送了1024字节的一个数据包第四行:2.00737s客户机(10.1.3.3)接收到了来自ip为10.1.2.4(服务器)的9号端口的一个1024字节的数据包
首先是安装。
apt-get install qt4-dev-tools
注:安装的时候出错了
显示:推荐: libqt4-dev 但是它将不会被安装 推荐: qt4-designer 但是它将不会被安装
网上搜了很多只有下面的指令有用
sudo apt-get autoremove libqtcore4
然后重新安装
不知道原因,按照这个指令的话,感觉可能是原先的QT内核版本问题
cd netanim
make clean
qmake NetAnim.pro
make
可以进入netanim-3.103文件夹看到Netanim确实已经安装好了(绿色的显示)
要运行Netanim,首先需要有xml文件,所以我们需要生成相应的xml文件。
进去scratch文件夹修改实例文件third.cc
cd scratch
vim third.cc //当然你也可以在ubuntu中直接打开修改保存。
打开vim编译器后,你可以看见third.cc源代码。
按下“I”可以进入编辑模式修改(按ESC退出编译模式)
在源代码中添加头文件:
#include “ns3/netanim-module.h”
然后找到Simulator::Run();
在这句的前面添加一行生成xml文件的代码
AnimationInterface anim(“third.xml”);
可以将刚才的改动保存。
然后退出scratch文件夹到ns-3.17运行实例来产生xml文件
./waf –run scratch/third
输入代码:ls
可以看见生成的third.xml文件(也可以看见一些.pcap格式的文件,这个后面说)
接着就是先退出ns-3.17文件夹,进去netanim-3.103文件夹来运行Netanim
cd ..
cd netanim-3.103
./Netanim
点击左上角的文件夹符号,可以然后打开生成的xml文件
选择一个.xml文件即可导入。
点击绿色的开始符号即可运行(下图是我截的实例某一时刻图形)。
+:设备队列中的入队操作;
-:设备队列中的出队操作;
d:数据包被丢弃,通常因为队列已满;
r:网络设备接收到数据包。
我们来更详细的看一下trace文件的第一行。为了看得更清晰,我把这一行分成了不同的部分,并在左边标出序号:
00 +
01 2
02 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
03 ns3::PppHeader (
04 Point-to-Point Protocol: IP (0x0021))
05 ns3::Ipv4Header (
06 tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
07 length: 1052 10.1.1.1 > 10.1.1.2)
08 ns3::UdpHeader (
09 length: 1032 49153 > 9)
10 Payload (size=1024) 展开后的trace事件的第一行(序号00)代表操作。+字符表示是一个传输队列的入队操作。第二行(序号01)是单位为秒的仿真时间。你或许回忆起我们让UdpEchoClientApplication在两秒开始发送数据包。我们确定这个正在发生。
Trace的下一行(序号02)告诉我们trace发送端发起这个事件(以tracing命名空间表示)。你可以认为tracing命名空间有点像一个文件系统命名空间。命名空间的根为NodeList。这个NodeList是NS-3核心代码管理的一个容器,此容器包含有一个脚本中创建的所有的节点。。正如一个文件系统在根下有目录,在NodeList下有节点数。字符串/NodeList/0是指NodeList中第0个节点,我们通常认为是"node 0".每个节点中有一个已经安装好的设备列表。这个列表是在命名
空间的下一个出现的。可以看到
trace事件来自节点中安装的第0个设备DeviceList/0。
下一个字符串,$ns3::PointToPointNetDevice告诉我们第0个节点的设备列表的第0个位置的设备类型。回忆序号00处的+操作表示设备的传输队列发生了入队操作,这个在"trace path"TxQueue/Enqueue的最后部分反映出来了。
Trace中剩下的几行是很直观的。序号03-04处表明数据包封装成点到点协议。序号05-07处显示数据包IP版本,发送端IP地址10.1.1.1,接收端IP地址为10.1.1.2。序号08-09出显示数据包的UDP头,最后序号10处表明数据包数据量为1024bytes。
在trace文件中的下一行显示了这个数据包在这个节点中从传输队列中被移除。
Trace文件的第三行显示了数据包正在被回显服务器所在的节点的网络设备接收。trace如下。
00 r
01 2.25732
02 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
03 ns3::Ipv4Header (
04 tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
05 length: 1052 10.1.1.1 > 10.1.1.2)
06 ns3::UdpHeader (
07 length: 1032 49153 > 9)
08 Payload (size=1024)
注意,trace操作现在是r并且仿真时间已经增加到2.25732秒。如果你一直按照本教程来操作,你已经把网络设备的DataRate,和信道Delay设置成默认值。那么对于这个值,你应该觉得眼熟,因为上一章中已经见过这个值。
在第2行中,Trace发送端命名空间条目已经改变,来显示这个事件是来自节点1(/NodeList/1),即数据包的接收trace端(/MacRx)。通过查看文件中其他的traces,你可以很容易的跟踪数据包。
当然你可以可以使用wireshaer来查看(此处打开的是third-1-1.pcap)