ns-3 学习记录-1

关于ns-3

简介

ns-3是一个离散事件模拟器,旨在满足学术研究和教学的需求。

ns-3架构:

ns-3架构

ns-3与ns-2的区别

  • ns-3现在由积极的开发者维护,而NS-2已经有近10年没有重大的功能性更新
  • ns-3并不是ns-2的扩展,而是一个全新的模拟器
  • ns-3提供更多有用的功能,例如:实现代码允许环境(mplementation code execution environment),允许用户在模拟器中允许真正的实现代码
  • ns-3提供更加底层的抽象,从而允许其更好得构建仿真系统。
  • ns-3提供更加深入,在当下十分热门的Module(包括LTE和WiFi Module)
  • ns-3的模拟器脚本可以通过C++或者Python语言编写,而ns-2的脚本语言选择有Otcl

ns-3的学习资源

ns-3 安装

ns-3 运行环境

  • Linux x86 及 x86_64
  • FreeBSD x86 及 x86_64
  • Mac OS X PowerPC 及 x86

注意到虽然ns-3 能够在 Windows上的Cygwin上运行,但现在已经不被官方所支持。 推荐选择Linux Ubuntu发行版作为ns-3的允许环境,可以考虑安装双系统或者在虚拟机内安装Ubuntu。 我采用了Vmare + Ubuntu 12.04 LTS 作为运行环境。

安装依赖程序

在Ubuntu终端(Ctrl+ALt+T)中运行:

sudo apt-get install gcc g++ python python-dev
sudo apt-get install mercurial
sudo apt-get install bzr
sudo apt-get install gdb valgrind

以下为可选组件,但是最好都装上:

sudo apt-get install gsl-bin libgsl0-dev libgsl0ldbl
sudo apt-get install flex bison libfl-dev
sudo apt-get install tcpdump
sudo apt-get install sqlite sqlite3 libsqlite3-dev
sudo apt-get install libxml2 libxml2-dev
sudo apt-get install libgtk2.0-0 libgtk2.0-dev
sudo apt-get install doxygen graphviz imagemagick
sudo apt-get install texlive texlive-extra-utils texlive-latex-extra
sudo apt-get install python-sphinx dia
sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas libgoocanvas-dev
sudo apt-get install libboost-signals-dev libboost-filesystem-dev
sudo apt-get install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev

使用bake.py检查ns-3的依赖项

使用Mercurial下载Bake hg clone http://code.nsnam.org/bakeBake添加环境变量 export BAKE_HOME=pwd/bake export PATH=$PATH:$BAKE_HOME export PYTHONPATH=$PYTHONPATH:$BAKE_HOME 查找需要安装的程序 bake.py check 会得到类似下面的输出:

> Python - OK
> GNU C++ compiler - OK
> Mercurial - OK
> CVS - OK
> GIT - OK
> Bazaar - OK
> Tar tool - OK
> Unzip tool - OK
> Unrar tool - OK
> 7z  data compression utility - OK
> XZ data compression utility - OK
> Make - OK
> cMake - OK
> patch tool - OK
> autoreconf tool - OK
> Path searched for tools: /usr/lib64/qt-3.3/bin
/usr/lib64/ccache /usr/local/bin  /usr/bin/bin/usr/local/sbin /usr/sbin
/sbin /user/dcamara/home/scripts/user/dcamara/home/INRIA/Programs/bin 
/user/dcamara/home/INRIA/repos/llvm/build/Debug+Asserts/bin

如果有未安装的程序,使用sudo apt-get install安装,知道所有检查选项都显示OK

下载 ns-3的源文件

在终端运行:

wget http://www.nsnam.org/release/ns-allinone-3.18.tar.bz2
tar xjf ns-allinone-3.18.tar.bz2

ns-3的当前版本可在http://www.nsnam.org/releases/查看 cd ns-allinone-3.18/ ls 可看到类似的目录结构:

bake      constants.py   netanim-3.103  pybindgen-0.16.0.831  util.py
build.py  constants.pyc  ns-3.18        README                util.pyc

使用Waf编译ns-3

进入ns-3.18/文件夹

cd ns-3.18/

在终端运行:

./waf clean
./waf -d optimized --enable-examples --enable-tests configure
./waf

编译会持续较长时间 当看到类似下面的消息说明编译成功:

Waf: Entering directory `/home/zly/ns-allinone-3.18/ns-3.18/build'
Waf: Leaving directory `/home/zly/ns-allinone-3.18/ns-3.18/build'
'build' finished successfully 

测试 ns-3

进入到ns-3.18目录,允许

./test.py -c core

当看到类似下面的消息,说明通过了所有测试用例,ns-3安装成功

159 of 162 tests passed (159 passed, 3 skipped, 0 failed, 0 crashed, 0 valgrind errors)

运行第一个仿真脚本

NS-3里的关键概念

  • 节点:
    • ns-3中基本计算设备被抽象为节点。节点由C++中的Node类来描述。Node类提供了用于管理仿真器中网络组件表示的各种方法
  • 应用程序:
    • 在ns-3中,需要被仿真的用户程序被抽象为应用。应用在C++中用Application类来描述。
  • 信道:
    • 在ns-3的模拟环境中,你可以把节点连接到代表数据交换信道的对象上。在这里,基本的通信子网这一抽象概念被称为信道,在C++中用Channel类来描述
  • 网络设备:
    • 在ns-3中,网络设备这一抽象概念相当于硬件设备和软件驱动的总和。NS3仿真环境中,网络设备相当于安装在节点上,使得节点通过信道和其他节点通信。像真实的计算机一样,一个节点可以通过多个网络设备同时连接到多条信道上。
    • 网络设备由C++中的NetDevice类来描述。NetDevice类提供了管理连接其他节点和信道对象的各种方法,并且允许开发者以面向对象的方法来自定义。

myfirst.cc

ns-3.18/scratch目录下建立myfirst.cc文件,并键入下面的C++代码:

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

int
main (int argc, char *argv[])
{
  Time::SetResolution (Time::NS);
  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
  LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);


  NS_LOG_INFO ("Creating Topology");

  NodeContainer nodes;
  nodes.Create (2);

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

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

  InternetStackHelper stack;
  stack.Install (nodes);

  Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.0");

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  UdpEchoServerHelper echoServer (9);

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

  UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
  echoClient.SetAttribute ("MaxPackets", UintegerValue (2));
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (0.001)));
  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
  clientApps.Start (Seconds (2.0));
  clientApps.Stop (Seconds (10.0));

  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

回到ns-3.18目录 先编译新增加的脚本:

./waf

运行myfisrt.cc脚本:

./waf --run scratch/myfirst

得到下面的输出:

At time 2s client sent 1024 bytes to 10.1.1.2 port 9
At time 2.001s client sent 1024 bytes to 10.1.1.2 port 9
At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00537s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.00537s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9
At time 2.00906s client received 1024 bytes from 10.1.1.2 port 9


blog comments powered by Disqus

Published

2013-10-28

Tags