【致谢】: 感谢关注NS3 Tutorial中文版的广大网友们,感谢NS3翻译小组,感谢初稿的翻译者们,感谢审稿和编辑们!!!   (详细的名单请查看博文翻译Tutorial
 
 
  声明:引用和转载相关内容,请尊重作者、翻译者和审稿者的辛勤付出,我们坚信开源的思想,我们希望自己的工作可以为更多的人提供帮助,我们不希望成为随意粘贴和任意复制的对象。
 
 

1  简介     http://www.nsnam.org/docs/release/tutorial/tutorial_1.html#Introduction           

翻译: 伍迪  刘小洋
校稿: Xiaochuan Shen
编辑: ProbibidoAmor
 
NS-3是一款离散事件的网络仿真器,主要应用于研究和教育领域。“NS-3项目”是一个完全开源的NS-3开发工程,于2006年启动。
NS-3的主文档由四部份组成:
l  NS-3 Doxygen手册    模拟器公共API的说明文档
l  NS-3教程           (本教程 Tutorial
l  NS-3参考手册       Reference Manual    
本指南的目的是向NS-3新用户以结构化的方式介绍NS-3系统。常常,新用户很难通过繁冗的参考手册收集到对当前仿真任务有用的实质信息。在本教程中,我们将通过几个仿真实例向读者介绍和阐释NS-3的主要概念和特点。
随着本教程的深入,我们会介绍完整的NS-3文档,并指出源代码的具体位置,以便于对NS-3软件系统运行机制感兴趣的研究者做深入的钻研。
开始之前,有几个要点需要读者注意:
l  NS-3并不是NS-2的扩展,而是一个全新的模拟器。虽然二者都由C++编写,但NS-3并不支持NS-2APINS-2中的一些模块已经被移植到了NS-3NS-3开发的过程中,NS-3项目组会继续维护NS-2,同时也会研究过渡和整合机制。
l  NS-3是开源的。NS-3项目努力为研究者提供一个开放的环境来共享他们自己的软件。

1.1   NS-2用户

对于熟悉NS-2的读者来说,NS-3NS-2最明显的区别是脚本语言的选择。NS-2使用OTcl脚本语言,仿真的结果可以通过网络动画器namNetwork Animator nam)来演示。在NS-2中,如果仅使用C++语言而不用OTcl,仿真过程是不可能运行起来的(即,只有main()函数而没有任何OTcl语句)。另外,NS-2的许多模块由C++编写,其他的用OTcl语言编写。而在NS-3中,仿真器全都由C++编写,仅仅带有可选择性的Python语言绑定。因此,仿真脚本可以由C++或者Python语言编写。某些仿真结果可以通过nam演示,但是新的动画演示器也正在开发之中。由于NS-3可以生成pcaptrace文件,也可以利用其他工具通过trace文件来分析仿真过程。在本教程中,我们先重点讲解使用C++编写脚本,并通过trace文件来分析仿真结果。
NS-3NS-2也有一些相似之处 (比如二者都是基于C++对象,一些NS-2的模块已移植到了NS-3)。在本教程中,我们将强调NS-3NS-2的区别。
我们经常听到一个疑问:“我到底是要继续使用NS-2,还是转向NS-3呢?”
答案视情况而定。虽然NS-3现在还没有包含所有的NS-2模块,但是另一方面,NS-3也有一些新的功能(比如,能正确地处理节点上的多重接口,使用IP地址,与因特网协议和设计保持一致,以及更加详细的802.11模块等)NS-2的模块可以被移植到NS-3中(移植帮助文档正在准备之中)。NS-3的多个前端也正在积极开发中。同时,NS-3开发者也相信(部分早期用户也已证明)NS-3已经可以充分使用,也是用户进行新仿真项目时的一个富有吸引力的选择。

1.2   共享 contributing

NS-3是由学术研究者开发和使用的用于网络科研和教学的仿真器。它依赖于研究者们持续不懈地努力,开发新模块、调试和维护已有模块、并共享成果。为了鼓励研究者像支持NS-2那样支持NS-3,我们希望NS-3的开发者遵守下面几条规则:
l  基于GNU GPLv2兼容性的开放源码许可
l 
l  共享代码(Contributed Code) 页(类似于NS-2的共享代码页)
l  Src/contrib. 目录(我们会保留您共享的代码)
l  开放的错误追踪器(bug tracker
l  NS-3开发者会很乐意帮助潜在的代码共享者们,提供NS-3仿真器的入门途径(请联系我们)
我们也意识到,如果您正在读本教程,对NS-3项目的共享或许还不在您当前最关心的事,但是我们希望您知道,“共享”是NS-3项目的灵魂。即使是给我们写一个关于您使用NS-3的经验便条(例如:“这个教程的章节条理不够清晰”),通知某些文档已过时等等,我们将会感激之至。

1.3   教程内容组织

本指南假定新用户可能会顺着以下思路了解NS-3
l  尝试下载和编译NS-3
l  尝试运行几个简单的示例程序
l  查看仿真结果并试图调整仿真
因此,我们将大体按照这个顺序来组织本教程。
 
 
 

2 资源           http://www.nsnam.org/docs/release/tutorial/tutorial_5.html#Resources

2.1   网络资源

NS-3用户有必要知道几个重要的网站:
    主站点位于http://www.nsnam.org 提供NS-3系统的基本信息。
详细文档位于主站点的http://www.nsnam.org/documents.html. 您也可以从这个网页上得到系统架构的相关信息。
维基百科网页http://www.nsnam.org/wiki可以作为NS-3主站点的补充。您可以在那里找到用户和开发者的FAQs,以及相关问题的解决途径,第三方的共享代码、论文等等。
NS-3的源码可以在http://code.nsnam.org 找到。读者也可以在名为ns3-dev的源码仓库找到当前的NS-3开发树。还有NS-3的之前发行版本和最新测试版本的代码。

2.2   源码管理系统Mercurial

复杂的软件系统需要一种途径,用于管理和组织对现有代码和文档的修改。有很多种方法可以实现这种管理,读者可能已听说过某些版本控制软件,CVSConcurrent Version System)或许是其中最常见的一个。
NS-3项目采用Mercurial系统作为它的源码管理系统。尽管读者在阅读本教程时不需要知道太多的Mercurial相关知识,但我们建议读者能够熟悉Mercurial,并用于查看 NS-3源码。Mercurial的网址为http://www.selenic.com/mercurial/,读者可以从上面获取到这个软件配置管理系统(Software Configuration management, SCM)的二进制程序和源码。Mercurial的开发者Selenic提供了一个Mercurial教程,网址为http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial/,以及快速入门指南:http://www.selenic.com/mercurial/wiki/index.cgi/QuickStart/ .
NS-3的主页上,读者也可以获取到有关MercurialNS-3配合使用的最常用信息。

2.3   编译系统Waf

读者下载NS-3的源码到本地系统之后,需要对源码进行编译来生成可执行程序。正如源码管理方式多种多样,编译源码也有多种工具。最常用的工具是make. Make最出名的一点:它可能是编译大型和高可配置型系统最难的一种方法。因此,有很多替代工具被开发出来。最近,大型高可配置系统的编译工具大多选择用Python语言来开发。
NS-3的编译系统采用了Waf。它是用Python开发的新一代编译管理系统。读者不必掌握python,即可编译现有的NS-3项目。如果读者想要扩展现有的NS-3系统,大多数情况只需了解Python知识的很少且非常直观的一个子集。
对于想了解Waf细节的读者,可以访问http://code.google.com/p/waf/ .

2.4   开发环境

正如以上所述,NS-3的脚本由C++或者Python编写。从NS-3.2开始,NS3API提供了python语言接口,但是所有的模块都是由C++编写的。这里,我们假定读者掌握C++知识和了解面向对象的相关概念。我们将在用到一些高级的概念或者读者可能不熟悉的语言特性、习惯用语或设计模式时适当地花些时间复习它们。但是我们也不希望本教程变成C++教程,所以我们希望读者能够掌握基本的C++命令。在网站上和书籍中,你可以找到无数的关于C++知识的信息。
如果读者是个C++新手,那么您在继续阅读本指南之前可能需要找一些C++教程或者网站,至少必须熟悉一下C++的基本语言特征。例如,Cplusplus教程
NS-3系统开发过程中使用了许多的GNU 工具链(toolchain)组件。所谓软件的工具链是指在给定环境中可用编程工具的集合。如果读者想要快速地了解一下GNU 工具链所包含的内容,请浏览http://en.wikipedia.org/wiki/GNU_toolchain .  NS-3使用gccGNU binutils,以及gdb. 但是,我们并不使用GNU编译系统工具(build system tools),既不用make,也不用autotools,而是使用Waf来作为编译管理工具。
通常,NS-3使用者的工作环境为Linux或者类Linux系统。对于Windows环境,有几种可以不同程度模拟Linux环境的软件,比如CygwinNS-3支持在Cygwin环境下的开发。Windows用户可以浏览http://www.cygwin.com/ 获取该软件(虽然有许多工程维护者使用MinGW,但是MinGW现在还没有得到官方支持)Cygwin可以提供许多流行的Linux系统命令。但是,某些情况下它也会出现问题,因为它毕竟只是Linux系统的模拟。CygwinWindows中其他程序的交互也有可能会导致程序出现问题。
如果读者正在使用Cygwin或者MinGW;并使用着Logitech的某些软件产品,我们或许可以让您少点麻烦:建议您去看一看MinGW FAQ
搜索Logitech并阅读FAQ条目:“为什么当我编译源码时,make经常崩溃,留下一个sh.exe.stackdump文件”。无论您相信与否,当运行Logitech时,Logitech 进程监视器潜入了每个正在系统中运行的动态连接库(DLL)当中。它可能导致您的Cygwin或者MinGw的动态连接库奇怪地中止,常常也会阻止调试器的运行。所以当运行Cygwin的时候,一定要小心您的Logitech软件。
替代Cygwin的一种选择是安装虚拟机,比如在VMware上安装Linux虚拟机。

2.5   套接字编程

我们假定读者对本教程所举例子中的Berkeley套接字API基本熟悉。如果您不了解套接字,我们建议您学习一下这些API和一些常见的使用例程。TCP/IP Sockets in C这本书可以帮助您很好地理解TCP/IP套接字。
网站http://cs.baylor.edu/~donahoo/practical/CSockets/ 包含了Socket in C书中所举例子的源码。
如果读者理解了该书中的前四章(如果读者没有这本书的话,可以看上面网站中的源代码),您会更好的理解本教程的内容。这里还有一本关于多播套接字(Multicast Sockets)的书籍(Multicast Sockets, Makofske and Almeroth。如果您想学习本书中有关多播的例子,该书里面有些资料您可能需要了解。