您好,欢迎访问三七文档
一、简介1.什么是NS-3?NS是一个离散事件驱动网络模拟器。官方定义:(from)ns-3isadiscrete-eventnetworksimulatorforInternetsystems,targetedprimarilyforresearchandeducationaluse.ns-3isfreesoftware,licensedundertheGNUGPLv2license,andispubliclyavailableforresearch,development,anduse.ns-3isintendedasaneventualreplacementforthepopularns-2simulator.Theprojectacronym“nsnam”deriveshistoricallyfromtheconcatenationofns(networksimulator)andnam(networkanimator).2.NS-3vsNS-2NS-3虽然冠以一个“3”,但事实上跟它广泛流行的前任NS-2并非一脉相承,或者从使用角度上说,仅仅继承了一个名称而已。NS-3基本上是一个新的模拟器,不支持NS-2的API。NS-3是完全用C++编写的(也有可选的Python接口),而NS-2一部分模块使用C++而另一部分使用OTcl。因而NS-3最大的特点就是脚本可以C++或Python语言,而在NS-2中,我们使用的是OTcl。NS-3的功能仍旧在开发中,因此它远没有NS-2完善(当然NS-2的维护也在进行中)。NS-3并不包含目前所有NS-2的功能,但它具有某些新的特性:正确的多网卡处理、IP寻址策略的使用、更详细的802.11模块等等。Lateststablerelease:ns-3.2.1(November20,2008)4.NS-3的一些名词解释POSIX:PortableOperatingSystemInterface可移植的操作系统的接口一组操作系统API的协议/标准族,最开始为了Unix系统上的可移植性而开发的,也适用于其他操作系统。Doxygen:DocumentationGenerator支持C++、C、Java、Objective-C、Python、IDL、Fortran、VHDL、PHP、C#等各种语言的文档生成器,用于从源代码中生成说明文档。(类似于我之前使用过的Sandcastle,貌似更加强大些,有必要得学习一下。)nam:NetworkAnimator基于Tcl/TK的网络动画演示工具,能提供拓扑和包级别的动画以及数据流观察。(参考)MercurialNS-3代码维护使用的源码版本控制管理系统WafNS-3项目使用的新一代的基于Python的构建系统(BuildSystem)WireShark一种GUI包嗅探器。由于NS-3能生成.pcap文件,因此可以使用类似于WireShark的软件对数据进行分析tcpdump另一种包嗅探器。在Linux下使用CLI进行数据分析2资源网络资源NS-3用户有必要知道几个重要的网站:主站点位于,提供NS-3系统的基本信息。详细文档位于主站点的您也可以从这个网页上得到系统架构的相关信息。维基百科网页可以作为NS-3主站点的补充。您可以在那里找到用户和开发者的FAQs,以及相关问题的解决途径,第三方的共享代码、论文等等。NS-3的源码可以在找到。读者也可以在名为ns3-dev的源码仓库找到当前的NS-3开发树。还有NS-3的之前发行版本和最新测试版本的代码。2.2源码管理系统Mercurial复杂的软件系统需要一种途径,用于管理和组织对现有代码和文档的修改。有很多种方法可以实现这种管理,读者可能已听说过某些版本控制软件,CVS(ConcurrentVersionSystem)或许是其中最常见的一个。NS-3项目采用Mercurial系统作为它的源码管理系统。尽管读者在阅读本教程时不需要知道太多的Mercurial相关知识,但我们建议读者能够熟悉Mercurial,并用于查看NS-3源码。Mercurial的网址为,读者可以从上面获取到这个软件配置管理系统(SoftwareConfigurationmanagement,SCM)的二进制程序和源码。Mercurial的开发者Selenic提供了一个Mercurial教程,网址为,以及快速入门指南:在NS-3的主页上,读者也可以获取到有关Mercurial和NS-3配合使用的最常用信息。2.3编译系统Waf读者下载NS-3的源码到本地系统之后,需要对源码进行编译来生成可执行程序。正如源码管理方式多种多样,编译源码也有多种工具。最常用的工具是make.Make最出名的一点:它可能是编译大型和高可配置型系统最难的一种方法。因此,有很多替代工具被开发出来。最近,大型高可配置系统的编译工具大多选择用Python语言来开发。NS-3的编译系统采用了Waf。它是用Python开发的新一代编译管理系统。读者不必掌握python,即可编译现有的NS-3项目。如果读者想要扩展现有的NS-3系统,大多数情况只需了解Python知识的很少且非常直观的一个子集。对于想了解Waf细节的读者,可以访问开发环境正如以上所述,NS-3的脚本由C++或者Python编写。从NS-3.2开始,NS3的API提供了python语言接口,但是所有的模块都是由C++编写的。这里,我们假定读者掌握C++知识和了解面向对象的相关概念。我们将在用到一些高级的概念或者读者可能不熟悉的语言特性、习惯用语或设计模式时适当地花些时间复习它们。但是我们也不希望本教程变成C++教程,所以我们希望读者能够掌握基本的C++命令。在网站上和书籍中,你可以找到无数的关于C++知识的信息。如果读者是个C++新手,那么您在继续阅读本指南之前可能需要找一些C++教程或者网站,至少必须熟悉一下C++的基本语言特征。例如,Cplusplus教程。NS-3系统开发过程中使用了许多的GNU工具链(toolchain)组件。所谓软件的工具链是指在给定环境中可用编程工具的集合。如果读者想要快速地了解一下GNU工具链所包含的内容,请浏览使用gcc,GNUbinutils,以及gdb.但是,我们并不使用GNU编译系统工具(buildsystemtools),既不用make,也不用autotools,而是使用Waf来作为编译管理工具。通常,NS-3使用者的工作环境为Linux或者类Linux系统。对于Windows环境,有几种可以不同程度模拟Linux环境的软件,比如Cygwin。NS-3支持在Cygwin环境下的开发。Windows用户可以浏览获取该软件(虽然有许多工程维护者使用MinGW,但是MinGW现在还没有得到官方支持)。Cygwin可以提供许多流行的Linux系统命令。但是,某些情况下它也会出现问题,因为它毕竟只是Linux系统的模拟。Cygwin和Windows中其他程序的交互也有可能会导致程序出现问题。如果读者正在使用Cygwin或者MinGW;并使用着Logitech的某些软件产品,我们或许可以让您少点麻烦:建议您去看一看MinGWFAQ。搜索Logitech并阅读FAQ条目:“为什么当我编译源码时,make经常崩溃,留下一个sh.exe.stackdump文件”。无论您相信与否,当运行Logitech时,Logitech进程监视器潜入了每个正在系统中运行的动态连接库(DLL)当中。它可能导致您的Cygwin或者MinGw的动态连接库奇怪地中止,常常也会阻止调试器的运行。所以当运行Cygwin的时候,一定要小心您的Logitech软件。替代Cygwin的一种选择是安装虚拟机,比如在VMware上安装Linux虚拟机。2.5套接字编程我们假定读者对本教程所举例子中的Berkeley套接字API基本熟悉。如果您不了解套接字,我们建议您学习一下这些API和一些常见的使用例程。TCP/IPSocketsinC这本书可以帮助您很好地理解TCP/IP套接字。网站~donahoo/practical/CSockets/包含了SocketinC书中所举例子的源码。如果读者理解了该书中的前四章(如果读者没有这本书的话,可以看上面网站中的源代码),您会更好的理解本教程的内容。这里还有一本关于多播套接字(MulticastSockets)的书籍(MulticastSockets,MakofskeandAlmeroth)。如果您想学习本书中有关多播的例子,该书里面有些资料您可能需要了解。NS3的两个例子/*-*-Mode:C++;c-file-style:gnu;indent-tabs-mode:nil;-*-*///Emacs模式行,GPLboilerplate#includens3/core-module.h//#includens3/simulator-module.h#includens3/node-module.h#includens3/helper-module.h//DefaultNetworkTopology////10.1.1.0//n0--------------n1n2n3n4//point-to-point||||//================//LAN10.1.2.0usingnamespacens3;NS_LOG_COMPONENT_DEFINE(SecondScriptExample);intmain(intargc,char*argv[]){boolverbose=true;//定义变量,用于决定是否开启两个UdpApplication的Logging组件;默认true开启uint32_tnCsma=3;//LAN中另有3个nodeCommandLinecmd;cmd.AddValue(nCsma,Numberof\extra\CSMAnodes/devices,nCsma);cmd.AddValue(verbose,Tellechoapplicationstologiftrue,verbose);//命令行参数设置是否开启loggingcmd.Parse(argc,argv);if(verbose){LogComponentEnable(UdpEchoClientApplication,LOG_LEVEL_INFO);LogComponentEnable(UdpEchoServerApplication,LOG_LEVEL_INFO);}nCsma=nCsma==0?1:nCsma;//三目运算符还可以这样写。。。。/********************网络拓扑部分************************///创建使用P2P链路链接的2个nodeNodeContainer
本文标题:NS3中文教程详解
链接地址:https://www.777doc.com/doc-5017887 .html