全部博文(180)
分类: 系统运维
2010-06-27 22:39:24
(点击以下目录,可以查看相应的英文原文)
3 NS3快速上手
翻译: 数字城堡 |
|
校稿: Xiaochuan Shen |
|
编辑: 刘小洋 |
|
3.1 下载ns-3
从现在起,我们假定读者使用的工作环境为Linux或者仿Linux环境(Linux, Cygwin等等.) 并且已经安装了可用的GNU工具链,而且还安装了Mercurial(分布式版本控制系统)和Waf软件。细节已经在ns-3网页中详述过,参见以下链接:
ns-3源码可以在网站 上的Mercurial源码库下载到.你也可以从链接处下载一个tar格式压缩包,或者直接使用Mercurial从源码库下载。除非有特殊需要,我们推荐使用Mercurial从源码库下载。tar格式压缩包下载,请参见本节最后部分。最简单的方法就是使用Mercurial源码库下载一个ns-3-allinone压缩包,此压缩包内含一套脚本集来管理各种子系统下的ns-3下载和安装。我们推荐你使用这个压缩包来简化你的ns-3安装。
3.1.1 使用Mercurial下载ns-3
作为练习,我们首先在home目录下建立一个目录并取名为repos,用来存放本地Mercurial源码库,注意:在本教程随后内容中,我们假定你已经这样做了。如果使用如下的方法,可以在Linux的shell中下载到一份ns-3-allinone软件包(假定你已经安装了Mercurial):
cd
mkdir repos
cd repos
hg clone
当Mercurail的hg命令执行后,可以看到如下结果:
destination directory: ns-3-allinone
requesting all changes
adding changesets
adding manifests
adding file changes
added 31 changesets with 45 changes to 7 files
7 files updated, 0 files merged, 0 files removed, 0 files unresolved
当clone命令运行结束以后,在前述建立的repos目录下,会出现一个ns-3-allinone目录,而且含有如下文件:
build.py* constants.py dist.py* download.py* README util.py
注意:你实际上仅仅下载了一些Python脚本,下一步就是利用这些脚本根据需要下载并来安装ns-3软件包。如果你访问如下链接: 就会发现若干源码库,其中很多是ns3开发团队专用的。其中在源码库org/ 你会发现名为ns-3.1的源码库,这是ns-3的第一个稳定版本。还有一些分散的源码库名为ns-3.1-reftraces,它为ns-3.1保留了参考记录。保持这些文件的一致性是非常重要的,尤其是当你想对源码库做一个回归测试时。至少做一次测试来验证所有的程序都正确编译了。
当前的开发版ns-3的快照存放在/ns-3-dev/中;相关的参考记录存放在链接 /ns-3-dev-ref-traces/中。 ns3开发人员会尽量保持源码库中的代码处于一致,工作的状态,但是他们仍在开发中,有一些未发布过的代码。所以如果你不需要最新的特性的话还是考虑使用发行版。
由于发布版的版本号在变化中,我在指南中还是继续使用通常不变的ns-3-dev,但是你可以根据自己的需要选择其他的版本,并替换这里的”ns-3-dev”,(例如, ns-3.6或 ns-3.6-ref-traces),在下文中,你可以通过访问源码库列表或者访问ns3开始网页找到最新的ns-3发布版软件。
当你从源码库下载完后,继续切换进入你自己建立的ns-3-allinone目录中。 我们现在使用download.py脚本来下载ns-3需要使用的各个部件。继续在你的shell中输入以下命令 (如果你想使用任意发行版你可以将ns-3-dev替换为你选择的发行版的名字,例如"ns-3.6" 和"ns-3.6-reftraces")。
./download.py -n ns-3-dev -r ns-3-dev-ref-traces
注意,-n选项的默认参数为ns-3-dev,-r选项的默认参数为ns-3-dev-ref-traces,所以上述命令中这两个选项的参数实际上是多余的。我们使用这个例子来描述如何指定源码库。你只需简单键入如下命令就可以使用默认参数来下载ns-3-dev:
./download.py
当hg (Mercurial)命令执行时,你可以看到如下的信息:
#
# Get NS-3
#
Cloning ns-3 branch
=> hg clone /ns-3-dev ns-3-dev
requesting all changes
adding changesets
adding manifests
adding file changes
Chapter 3: Getting Started 8
added 4634 changesets with 16500 changes to 1762 files
870 files updated, 0 files merged, 0 files removed, 0 files unresolved
这些输出信息显示下载脚本已经从源码库中下载到了实际的ns-3源码,紧接着,你就会看到这样的信息:
#
# Get the regression traces
#
Synchronizing reference traces using Mercurial.
=> hg clone /ns-3-dev-ref-traces ns-3-dev-ref-traces
requesting all changes
adding changesets
adding manifests
adding file changes
added 86 changesets with 1178 changes to 259 files
208 files updated, 0 files merged, 0 files removed, 0 files unresolved
这表明下载脚本为你下载了参考记录文件。下载脚本被设计成自适应的,它能检测在一些系统平台上某些ns-3模块不被支持,在你的系统平台上,你可能看不到这些系统不支持的源码被下载。然而,在大多数系统平台上这样的过程会显示如下:
#
# Get PyBindGen
#
Required pybindgen version: 0.10.0.640
Trying to fetch pybindgen; this will fail if no network connection is available. Hit Ctrl-=> bzr checkout -rrevno:640 pybindgen
Fetch was successful.
这些信息显示了下载脚本在为你下载Python绑定生成器的过程,下一步你就可能看到如下的信息(不同的系统平台表现有所不同),
#
# Get NSC
#
Required NSC version: nsc-0.5.0
Retrieving nsc from https://secure.wand.net.nz/mercurial/nsc
=> hg clone https://secure.wand.net.nz/mercurial/nsc nsc
requesting all changes
adding changesets
adding manifests
adding file changes
added 273 changesets with 17565 changes to 15175 files
10622 files updated, 0 files merged, 0 files removed, 0 files unresolved
这些信息显示了下载脚本在为你下载网络仿真器支架程序(NSC)的过程。
当复制命令结束,你在~/repos/ns-3-allinone目录下会有几个新目录:
build.py* constants.pyc download.py* ns-3-dev-ref-traces/ pybindgen/ util.py
constants.py dist.py* ns-3-dev/ nsc/ README util.pyc
继续进入ns-3-dev目录,你会见到如下的文件:
AUTHORS examples/ regression/ scratch/ waf*
bindings/ LICENSE regression.py src/ waf.bat*
CHANGES.html ns3/ RELEASE_NOTES utils/ wscript
doc/ README samples/ VERSION wutils.py
现在可以准备编译ns-3软件了。
3.1.2 使用Tarball下载ns-3
使用tarball下载ns-3比使用Mercurail下载ns-3要简单一些,因为需要下载的各个部分都已经预先被打包在一个压缩包中了,你只需要选择一个发行版版本,下载并且解压就可以。如上所述,在Mercurial下载方法中,是在home目录下创建一个repos目录,保存本地Mercurial源码库。你也可以建立一个tarball目录来下载。(注意:本教程后面会假定你把它下载到了repoa目录,所以请留意这个选择)。如果你选择了tarballs方法下载,你可以键入如下命令来下载一份ns-3的发行版 (当然,可以根据需要选择你想要的版本):
cd
mkdir tarballs
cd tarballs
wget
tar xjf ns-allinone-3.6.tar.bz2
如果你切换到ns-allinone-3.6目录,你会看到下述文件:
build.py* ns-3.6/ nsc-0.5.1/ README
constants.py ns-3.6-ref-traces/ pybindgen-0.12.0.700/ util.py
现在就可以编译ns-3软件包了。
3.2 编译ns-3
3.2.1 使用build.py编译
如果你是第一次编译ns-3软件包,建议使用allinone环境,它会为你以最常用的方式配置工程。
切换到你在上文下载一节中创建的目录下。如果你使用Mercurial下载,请进入~/repos目录下的ns-3-allinone目录,如果你使用tarball下载,找到~/tarballs目录下类似ns-allinone-3.6的目录,键入如下的命令,并请耐心等待:
./build.py
编译脚本开始编译下载的ns3时,你会看到大量常见的编译器输入信息。最后你会看到如下编译成功的好消息:
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’build’ finished successfully (2m30.586s)
一旦工程编译好,你就可以不再使用ns-3-allinone脚本包了。你已经从其中获取必要的东西,现在是你直接同Waf交互的时候了,它位于ns-3-dev目录中,并不在 ns-3-allinone目录中。切换到ns-3-dev目录下(或者你下载的版本的相应目录下):
cd ns-3-dev
3.2.2使用Waf编译
我们使用waf来配置和编译ns-3工程软件包,这一点不是严格必须的,但是做一个简单的介绍是很有必要的,起码可以了解如何修改工程的配置。也许你能做出的最有用的配置修改就是编译工程的优化版本了,默认你会将你的工程编译为调试版本,让我们来使工程做出优化的编译。
为了通知waf进行优化编译,你需要执行如下的命令:
./waf -d optimized configure
这会Waf可能会切换到其他目录收集信息. 当编译系统检查各种依存关系时,你可以看到类似如下的输出结果:
Checking for program g++ : ok /usr/bin/g++
Checking for program cpp : ok /usr/bin/cpp
Checking for program ar : ok /usr/bin/ar
Checking for program ranlib : ok /usr/bin/ranlib
Checking for g++ : ok
(鉴于长度限制,省略)
Checking for program valgrind : ok /usr/bin/valgrind
---- Summary of optional NS-3 features:
Threading Primitives : enabled
Real Time Simulator : enabled
Emulated Net Device : enabled
GNU Scientific Library (GSL) : enabled
Tap Bridge : enabled
GtkConfigStore : enabled
XmlIo : enabled
SQlite stats data output : enabled
Network Simulation Cradle : enabled
Python Bindings : enabled
Python API Scanning Support : enabled
Use sudo to set suid bit : not enabled (option --enable-sudo not selected)
Build examples and samples : enabled
Static build : not enabled (option --enable-static not selected)
’configure’ finished successfully (2.870s)
需要注意输入的最后一部分。部分ns-3选项并不是默认的,需要底层系统的支持才能够顺利运行。例如:为了运行XmlTo, 系统必须安装libxml-2.0库,如果没有发现这个库,相应的ns-3特性就不会被激活,这会以消息显示出来。另一个需要注意的地方是:对于一些特定的程序,需要使用sudo命令来设置该程序的。这个是默认设置为关的,所以此性质会显示出未激活,现在我们可以进一步返回到调试编译上来:
./waf -d debug configure
此时编译系统被配置好,你可以编译ns-3程序的debug版本了,只需简单的命令如下:
./waf
一些waf命令在编译阶段是很重要的,另一些命令是在配置阶段有用的,例如,如果你想使用ns-3的仿真(emaulation)特性,你一定要通过上述的sudo来设置用户标识位(suid)为有效位。这将是一个配置命令,你可以使用如下命令通知Waf来重新设置:
./waf -d debug --enable-sudo configure
如果你这样做,waf会运行sudo以root的权限来改变仿真代码的socket创建程序。在waf中还有许多其它的配置和编译选项可用。若要察看详细的选项,键入以下命令:
./waf --help
我们将会在下一节中使用测试相关的命令。好的,你已经编译ns-3两遍了,现在你知道如何修改配置和编译优化代码了。
你可以通过运行“./test.py -c core”脚本进行ns-3软件包单元测试,
./test.py -c core
这些测试可以被waf并行执行的,最后你可以看到如下的结果:
47 of 47 tests passed (47 passed, 0 failed, 0 crashed, 0 valgrind errors)
这是条相当重要的信息。
实际中,你看到的可能是类似于如下的信息:
Waf: Entering directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’build’ finished successfully (1.799s)
PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram
PASS: TestSuite sample
PASS: TestSuite ipv4-address-helper
PASS: TestSuite devices-wifi
PASS: TestSuite propagation-loss-model
...
PASS: TestSuite random-number-generators
47 of 47 tests passed (47 passed, 0 failed, 0 crashed, 0 valgrind errors)
用户通常可以运行此命令来检查ns-3软件包是否正确编译了。
你也可以使用我们的回归测试包来保证你的发行版和工具链产生的二进制文件会产生同参考输出文件相同的结果。你在运行/download.py过程中会下载这些参考记录。 (警告: ns-3.2和ns-3.3发布版不使用ns-3-allinone环境,当你进行回归测试时需要在线环境,因为在直接运行测试之前它们需要同一个在线源码库进行参考记录的动态同步)。
在回归测试中Waf会允许一系列的测试,这些测试会产生我们所说的记录文件,记录文件的内容会和参考记录相对比,如果它们相同,那么回归测试会报告一个通过状态(PASS);如果回归测试失败你会看到一个失败标记(FAIL),和一个指针指向有问题的记录文件和它的联合参考记录文件,还附带一个差异参数和选项以便检查哪里出现错误了。如果在一个pcap文件中出现错误, 在对比之前常使用tcpdump来将pcap文件转换为文本文件。
如果需要的支持缺失,某些回归测试会被跳过,测试状态会被标记为跳过(SKIP)。
注意:回归测试也是并行的,所以产生的信息也可能是交叉出现的。
要进行回归测试,需要给Waf提供回归标记:
./waf --regression
可以看到如下信息显示进行了多项测试:
Entering directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
[647/669] regression-test (test-csma-bridge)
[648/669] regression-test (test-csma-broadcast)
[649/669] regression-test (test-csma-multicast)
[650/669] regression-test (test-csma-one-subnet)
PASS test-csma-multicast
[651/669] regression-test (test-csma-packet-socket)
PASS test-csma-bridge
...
Regression testing summary:
PASS: 22 of 22 tests passed
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’build’ finished successfully (25.826s)
如果你想看看在回归测试中有哪些项目测试的例子,可以使用如下命令:
cd build/debug/regression/traces/second.ref
tcpdump -nn -tt -r second-2-0.pcap
这些结果对于熟悉tcpdump或者网络嗅探器是很清楚的,在本教程的后半部分我们会更多地提及pcap文件。
在一切完成后,请用cd命令返回顶层ns-3目录:
cd ../../../../..
3.4 运行第一个脚本
我们通常使用Waf运行脚本,这将使编译系统正确设置共享库的路径,并保证这些共享库在运行时可用,如果要运行一个程序,只需在Waf加入—run选项即可,让我们在ns-3环境下运行常见的hello world程序试一下:
./waf --run hello-simulator
Waf首先检查程序正确编译了,而且还可以根据需要重新执行编译。
Waf执行了此程序,并输出如下信息:
Hello Simulator
祝贺你. 你现在是一名ns-3用户了!
如果你想在其他工具下如gdb或者valgrind下运行程序,可参见本Wiki条目。