【声明】允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
http://yangfei1.blog.51cto.com/1471532/368586
http://yangfei1.blog.51cto.com/1471532/368587


转载的文章中给的原文地址已经失效,我这里重新整理了原文地址,方便大家查看对照,如果也失效了,可以直接去官网找Tutorial

官网的英文原文地址:
ns-3 Tutorial https://www.nsnam.org/docs/tutorial/html/

原文目录如下:

  1. Introduction 简介
  2. Resources 资源
  3. Getting Started 快速入上手
  4. Conceptual Overview 概念概述
  5. Tweaking Tweak工具
  6. Building Topologies 建立拓扑
  7. Tracing trace系统
  8. Data Collection 数据收集
  9. Conclusion 总结

3 快速上手

翻译: 数字城堡
校稿: Xiaochuan Shen xcs105@zepler.net
编辑: 刘小洋 banana.0420@yahoo.com.cn

3.1 下载ns-3

从现在起,我们假定读者使用的工作环境为Linux或者仿Linux环境(Linux, Cygwin等等.) 并且已经安装了可用的GNU工具链,而且还安装了Mercurial(分布式版本控制系统)和Waf软件。细节已经在ns-3网页中详述过,参见以下链接:
http://www.nsnam.org/getting_started.html.

ns-3源码可以在网站http://code.nsnam.org 上的Mercurial源码库下载到.你也可以从链接http://www.nsnam.org/releases/处下载一个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 你放置NS3的文件夹
mkdir repos
cd repos
hg clone http://code.nsnam.org/ns-3-allinone

当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软件包。如果你访问如下链接:http://code.nsnam.org/ 就会发现若干源码库,其中很多是ns3开发团队专用的。其中在源码库org/ 你会发现名为ns-3.1的源码库,这是ns-3的第一个稳定版本。还有一些分散的源码库名为ns-3.1-reftraces,它为ns-3.1保留了参考记录。保持这些文件的一致性是非常重要的,尤其是当你想对源码库做一个回归测试时。至少做一次测试来验证所有的程序都正确编译了。

当前的开发版ns-3的快照存放在http://code.nsnam.org/ns-3-dev/中;相关的参考记录存放在链接 http://code.nsnam.org/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 http://code.nsnam.org/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 http://code.nsnam.org/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 https://launchpad.net/pybindgen 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 你放置NS3的文件夹
mkdir tarballs
cd tarballs
wget http://www.nsnam.org/releases/ns-allinone-3.6.tar.bz2
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两遍了,现在你知道如何修改配置和编译优化代码了。

3.3 测试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 object
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条目。

NS3 Tutorial 中文版:第三章 快速上手相关推荐

  1. NS3 Tutorial 中文版:第二章 资源

    [声明]允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. http://yangfei1.blog.51cto.com/1471532/368585 转载 ...

  2. Python基础教程(第3版)中文版 第一章 快速上手:基础知识(笔记)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,分享给大家: https://www.captainai.net/lf 如果你学完了Python不知道干什么,不妨去了解一下. 第一章 快速 ...

  3. Tableau基础-第三章(快速表计算)

    从头开始学Tableau-第三章(快速表计算) 第一章 第二章 数据源 这一章主要介绍一下快速表计算,在前面的2章中我们基础的了解了一下Tableau的函数,有时候并不希望每一个指标值都用函数去构造, ...

  4. NS3 Tutorial 中文版:第四章 概念概述

    [声明]允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. http://yangfei1.blog.51cto.com/1471532/368589 ht ...

  5. AMBA5 AHB协议规范(AHB5,AHB-Lite)中文版-第三章 传输

    第三章 Transfers 本章描述读写传输.它包括以下部分: – 基本传输 on page 3-28. – 传输类型 on page 3-30. – 锁定传输 on page 3-32. – 传输大 ...

  6. 【C】【笔记】《C和指针》 第一章 快速上手 第二章 基本概念 第三章 数据 第四章 语句 第五章 操作符和表达式

    本文为个人读书笔记,仅供记录学习过程中遇到的日后需要留意的问题,如有相关版权问题请及时通知作者. 所有传递给函数的参数都是按值传递的. C语言约定:字符串就是一串以nul字节结尾的字符. 为什么用一个 ...

  7. 《C和指针》读书笔记第一章快速上手

    写在前面,由于学过C语言,导致想要跳跃式地翻阅<C和指针>,后来发现这实为错误,对于这本经典著作,要做的是从头到尾保持体系的完整性. <C和指针>配套代码请移步网站:Point ...

  8. Learning Spark中文版--第三章--RDD编程(1)

       本章介绍了Spark用于数据处理的核心抽象概念,具有弹性的分布式数据集(RDD).一个RDD仅仅是一个分布式的元素集合.在Spark中,所有工作都表示为创建新的RDDs.转换现有的RDD,或者调 ...

  9. CakePHP 2.x CookBook 中文版 第三章 入门(三)

    为什么80%的码农都做不了架构师?>>>    路由 多数情况下,CakePHP 的默认路由都能够很好地工作.对用户体验和搜索引擎兼容敏感的程序员将注意到 CakePHP 的 URL ...

最新文章

  1. ICLR2018 | 深度学习顶会见闻,干货资源都在这里(附源码、论文链接)
  2. hibernate批量删除和更新数据
  3. python第三方库安装-多种方式
  4. OpenCASCADE:Foundation Classes内存管理
  5. 积跬步-java任职要求
  6. Win10开机一直转圈圈怎么办?一直转圈进不去系统的解决方法
  7. 【python】面向对象的封装、继承、多态的练习题
  8. 李彦宏候选工程院院士;陌陌回应探探下架;拼多多回应“刷单”质疑 | 极客头条...
  9. Magento 2.0 Alipay Cross-Border Mobile Payment Extension - Magento 2.0 支付宝跨境支付手机版...
  10. python的第三方库是干什么用的-Python最强大的第三方库,你有必要了解一下!
  11. Java8初体验(一)lambda表达式语法
  12. python网络爬虫-导航树
  13. 一周信创舆情观察(2.21~2.27)
  14. 3GPP TS 24.301 Release 8 中文版
  15. python实习内容过程_实习报告
  16. 什么是 URL Schema
  17. 不积跬步无以至千里,反思
  18. 前端获取本地ip和外网ip
  19. Learning Transferable Visual Models From Natural Language Supervision
  20. Android中字母大小写切换的快捷键

热门文章

  1. 个人项目-网络电话呼叫客户端 (一)
  2. 应届生参加工作,什么事情越早知道越好?
  3. 关于营销自动化,30个惊人的事实
  4. [案例7-2]商城进货交易记录
  5. 如何解决Access操作或事件已被禁用模式阻止
  6. ChatGPT实现代码生成
  7. 清华、商汤提出SIM方法,让自监督学习兼顾语义对齐与空间分辨能力
  8. 锐龙R3 4100 性能怎么样 相当于什么水平
  9. 最全的BAT大厂面试题整理
  10. 五款微信编辑器优缺点评测