资源描述
1. Ns3 的安装:
开发环境配置:
sudo apt-get install gcc g++ python python-dev //C++和python安装,必装
sudo apt-get install mercurial //NS3代码维护使用的源码版本控制管理系统
sudo apt-get install bzr //运行python绑定ns-3-dev需要bazaar这个组件
sudo apt-get install libgtk2.0-0 libgtk2.0-dev //基于GTK的配置系统
sudo apt-get install gdb valgrind //调试工具
sudo apt-get install doxygen graphviz imagemagick //文档生成器
sudo apt-get install texlive texlive-latex-extra //文档生成器,从源代码中生成说明文档
sudo apt-get install texinfo dia texlive-extra-utils texi2html //ns-3手册和tutorial编写查看工具
sudo apt-get install flex bison //仿真必需的词法分析器和语法分析生成器,必装
sudo apt-get install libgoocanvas-dev //部分移动场景仿真的可视化测试需要这个组件
sudo apt-get install tcpdump //读取pcap的packet traces,即包嗅探器
sudo apt-get install sqlite sqlite3 libsqlite3-dev //支持统计特性的数据库软件
sudo apt-get install libxml2 //xml的配置存储软件
sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas //Gustavo's ns-3-pyviz的可视化软件
sudo apt-get install qt4-qmake
sudo apt-get install qt4-dev-tools
安装完成后:
进入ns-allinone-3.16目录
sudo ./build.py
之后 进入ns-allinone-3.16/ns-3.16
sudo ./waf -check
返回目录ns-allinone-3.16
进入目录netanim-3.103
sudo make clean
sudo qmake NetAnim.pro
sudo make
之后
sudo ls
可以看见绿色的NetAnim这个东西就成功了
sudo ./NetAnim 打开仿真界面
安装全部完成
2. ns3仿真的运行
ctrl+alt+t调出终端,进入ns-allinone-3.16目录,
输入 cd ns-3.16/ 进入ns-3.16文件夹
输入 cd examples/tutorial/ 进入examples里面的tutorial文件夹(里面有刚刚上手专用的实例,我们就用这个来调试)
在tutorial目录下,输入 cp first.cc ~/ns-allinone/ns-3.16/scratch/ ,将first.cc这个文件复制到ns-3.16的scratch文件夹里面. 具体位置由实际的自己的计算机的文件目录所定。
输入 cd ..
输入 cd .. 此时进入的是ns-3.16文件夹
输入cd scratch/ 进入scratch文件夹
输入 ls 查看有没有那个复制进去的文件 有的话进行下面,没有的话 要先复制进去
确定有的话,输入 cd .. 返回ns-3.16/
输入 sudo ./waf --run scratch/first 注意:在输入运行的文件名时,不要加后缀名。
现在就可以运行了。
以下是这个的显示结果:
此结果表示的意思是:
第一行:客户机在第2s的时候向IP为10.1.1.2的节点的第九号端口(port)发送了1024字节大小的数据包
第二行:10.1.1.2的这个服务器接在2.00369s收到了来自10.1.1.1的端口为49153的1024字节大小的数据包
第三行:10.1.1.2服务器在2.00369s向10.1.1.1的49153号端口发送了1024字节的一个数据包
第四行:2.00737s客户机(10.1.1.1)接收到了来自ip为10.1.1.2(服务器)的9号端口的一个1024字节的数据包
3. 图形仿真器(Netanim)的使用
进入ns-allinone-3.16文件夹
输入cd netanim-3.103
进入netanim-3.103文件夹
看见那个绿色的了吧,就是运行那个绿色的来调出仿真界面
输入 ./NetAnim
可以看见下图
点击左上角的文件夹符号,可以打开导入文件(PS:必须是.xml文件)
选择一个.xml文件即可导入。(如果没有,请继续下节的生成.xml文件)
点击绿色的开始符号即可运行。
4. 生成.xml文件
比如:进入ns-3.16文件夹,可以看到有个scratch目录。将你需要生成.xml的文件复制到scratch文件夹。进入scratch
cd scratch/
sudo apt-get install vim
输入sudo vim first.cc
即打开vim编辑器。
可以看到
这是first.cc的源代码
按下I 可以进入编辑模式 按下ESC可以退出编辑模式
在头文件包含处添加一句
#include “ns3/netanim-module.h”
然后去找到有一句 Simulator::Run();
在这句的前面添加一行代码
AnimationInterface anim(“first.xml”);
按下ESC,退出编辑模式
按下:wq
可以将刚才的改动保存
输入 cd ..
返回ns-3.16文件夹
输入 sudo ./waf –run scratch/first
注意不要有后缀名
运行成功
输入 ls
可以看到有个名字叫做 first.xml的文件 这个就是可以当作动画的文件。
再用上一节的仿真界面的使用来运行这个就行
如图:
成功的仿真了。
5. .tr和.pcap文件的生成和解析
tr文件的生成:需要在Simulator::Run (); 这个的前面加上 AsciiTraceHelper ascii; csmaHelper.EnableAll (ascii.CreateFileStream (“csma-1.tr”));
pcap文件的生成: 需要在Simulator::Run (); 这个的前面加上 csmaHelper.EnablePcapAll (“csma-1”, false);
如图:
之后按照上面的运行方法运行。(csmaHelper是由CsmaHelper这个类(协议)实例化的对象).
如图运行完成:
之后ls 看有没有自己命名的那些文件:我的tr文件为test-csma-1.tr 我的pcap文件为 test-csma-1....pcap
输入vim 自己的文件名 即: vim test-csma-1.tr
如图:
分析Ascii Traces
在一个极其密集的文档中有很多信息,但是需要注意的第一件事是在这个文件中有很多分立的行。除非你大大加宽你的窗口,否则是很难看清楚的。
每一行对应了一个trace事件。本例中我们在查看每个点到点设备的传输队列的trace事件。传输队列是任一个目的地为点到点信道的数据包的必经队列。注意trace文件的每行以一个单独的字符开始(后面带有空格)。这个字符具有如下含义:
· +: An enqueue operation occurred on the device queue;
· -: A dequeue operation occurred on the device queue;
· d: A packet was dropped, typically because the queue was full;
· r: A packet was received by the net device.
· +:设备队列中的入队操作;
· -:设备队列中的出队操作;
· 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)是单位为秒的仿真时间。
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,你可以很容易的跟踪数据包。
5.3.2 PCAP 格式Tracing
ns-3设备控制器也可以被用来创建.pcap格式的trace文件。缩写pcap(通常为小写)表示packet capture,事实上是包含有定义一个.pcap文件格式的API。可以读取并且显示这种格式的最流行的程序是Wireshark(以前被称为Ethereal)。然而,有很多其他的分析器也使用这个包格式。我们鼓励读者了解其他的分析pcap追踪文件的工具。在本教程中,我们用tcpdump来查看pcap trace。
在scratch/myfirst.cc中我们刚增加的ASCII追踪代码后面插入这行代码。注意我们刚使用的是字符串''myfirst"而不是"myfirst.pcap"。这是因为这里传递的参数是个前缀,而不是完整的文件名。在仿真过程中,helper将为任何一个点到点设备创建一个追踪文件。文件名将包含预设前缀,节点名,设备名,和".pcap"后缀。
在我们的例子脚本中,我们最终将看到名为"myfirst-0-0.pcap"和"myfirst-1-0.pcap"。这分别是为节点0设备0,和节点1设备0创建的pcap trace文件。
用tcpdump读取结果
此处最简单的做法就是使用tcpdump来查看pcap文件,
tcpdump -nn -tt -r myfirst-0-0.pcap
reading from file myfirst-0-0.pcap, link-type PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
reading from file myfirst-1-0.pcap, link-type PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
在myfirst-0-0.pcap(客户端设备)文件中可以看到回显数据包在第二秒被发送。如果查看第二个文件(myfirst-1-0.pcap)可以看到此包在2.257324秒被收到。在第二个文件中可以看到在2.257324秒这个包被回应,最终,在客户端2.514648秒回应的包被收到。
5.3.2.2 用Wireshark读取结果
如果你对Wireshark不熟悉,从http://.wireshark.org/可以下载到程序和文档。
Wireshark是一个可以用来显示trace文件的用户图形接口。如果你安装了Wireshark,可以打开和查看每一个trace文件,就像这些trace是使用包嗅探工具在真正的网络上抓下来一样。
对于trace文件和pcap文件 均可以自己编写gawk脚本来查看,编写方法自己百度。
以下为实例讲解:
打开first.cc文件 (前面的标号是我自己的vim配置,只是方便阅读,并不是代码。)
顶部的注释栏为GNU声明
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 as
5 * published by the Free Software Foundation;
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 */
然后是头文件包含
16
17 #include "ns3/core-module.h"
核心模型库
18 #include "ns3/network-module.h"
网络模型库
19 #include "ns3/internet-module.h"
因特网模型库
20 #include "ns3/point-to-point-module.h"
点到点网络模型
21 #include "ns3/applications-module.h"
应用模型库
正式代码:
22
23 using namespace ns3;
使用ns3的命名空间
24
25 NS_LOG_PONENT_DEFINE ("FirstScriptExample");
启用日志,日志是方便在运行和运行成功后查看输出的信息的。
26
27 int
28 main (int argc, char *argv[])
29 {
30 LogponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
开启客户机应用日志,记录客户机的使用情况
31 LogponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
开启服务器应用日志,记录服务器的使用情况
32
33 NodeContainer nodes;
实例化一个节点容器对象,里面还是空的。
34 nodes.Create (2);
为容器创建两个新的节点。
35
36 PointToPointHelper pointToPoint;
实例化一个点到点协议的对象。
37 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
设置点到点协议的数据传输速率。
38 pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
设置点到点协议的网络延迟。
39
40 NetDeviceContainer devices;
实例化一个网卡容器。
41 devices = pointToPoint.Install (nodes);
为节点安装带有点到点协议的网卡。
42
43 InternetStackHelper stack;
实例化一个协议栈。
44 stack.Install (nodes);
为每个节点安装一个协议栈用于网卡存储网络协议。
45
46 Ipv4AddressHelper address;
实例化一个IP地址的对象。
47 address.SetBase ("10.1.1.0", "255.255.255.0");
设置IP地址和子网掩码。
48
49 Ipv4InterfaceContainer interfaces = address.Assign (devices);
为网卡注册IP地址。
50
以下为应用层配置
51 UdpEchoServerHelper echoServer (9);
实例化一个服务器应用,监听端口9。
52
53 ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
实例化一个服务器对象,并且将第1号节点设置为服务器。
54 serverApps.Start (Seconds (1.0));
服务器开始时间为1.0s
55 serverApps.Stop (Seconds (10.0));
服务器停止时间为10.0s
56
57 UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
实例化一个客户机应用,发送给第1号节点的IP,发送给9号端口。
58 echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
设置数据包的个数
59 echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
设置包的间隔时间
60 echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
设置数据包的大小
61
62 ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
实例化一个客户机,并把第0号节点设置为客户机。
63 clientApps.Start (Seconds (2.0));
客户机开始时间为2.0s
64 clientApps.Stop (Seconds (10.0));
客户机停止时间为10.0s
65
66 Simulator::Run ();
开始运行
67 Simulator::Destroy ();
运行结束后销毁内存
68 return 0;
返回成功值
69 }
对于初学者,首先要看懂examples/tutorial/里面的几个.cc文件,之后再去/src里面找到自己喜欢的致力于学习。不要操之过急。
展开阅读全文