一、简介
1. 什么是NS-3?
NS是一个离散事件驱动网络模拟器。官方定义:(from http://www.nsnam.org/)
ns-3 is a discrete-event network simulator for Internet systems, targeted primarily for research and educational use. ns-3 is free software, licensed under the GNU GPLv2 license, and is publicly available for research, development, and use.
ns-3 is intended as an eventual replacement for the popular ns-2 simulator. The project acronym “nsnam” derives historically from the concatenation of ns (network simulator) and nam (network animator).
2. NS-3 vs NS-2
NS-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模块等等。
Latest stable release: ns-3.2.1 (November 20, 2008)
4. NS-3的一些名词解释
POSIX:Portable Operating System Interface
一组操作系统API的协议/标准族,最开始为了Unix系统上的可移植性而开发的,也适用于其他操作系统。
Doxygen:Documentation Generator
支持C++、C、Java、Objective-C、Python、IDL、Fortran、VHDL、PHP、C#等各种语言的文档生成器,用于从源代 码中生成说明文档。(类似于我之前使用过的Sandcastle,貌似更加强大些,有必要得学习一下。)
nam:Network Animator
基于Tcl/TK的网络动画演示工具,能提供拓扑和包级别的动画以及数据流观察。(参考http://www.isi.edu/nsnam/nam/)
Mercurial
NS-3代码维护使用的源码版本控制管理系统
Waf
NS-3项目使用的新一代的基于Python的构建系统(Build System)
WireShark
一种GUI包嗅探器。由于NS-3能生成.pcap文件,因此可以使用类似于WireShark的软件对数据进行分析
tcpdump
另一种包嗅探器。在Linux下使用CLI进行数据分析
2.1 网络资源
NS-3
用户有必要知道几个重要的网站:
2.2 源码管理系统Mercurial
复杂的软件系统需要一种途径,用于管理和组织对现有代码和文档的修改。有很多种方法可以实现这种管理,读者可能已听说过某些版本控制软件,
CVS
(
Concurrent Version System
)或许是其中最常见的一个。
在
NS-3
的主页上,读者也可以获取到有关
Mercurial
和
NS-3
配合使用的最常用信息。
2.3 编译系统Waf
读者下载
NS-3
的源码到本地系统之后,需要对源码进行编译来生成可执行程序。正如源码管理方式多种多样,编译源码也有多种工具。最常用的工具是
make. Make
最出名的一点:它可能是编译大型和高可配置型系统最难的一种方法。因此,有很多替代工具被开发出来。最近,大型高可配置系统的编译工具大多选择用
Python
语言来开发。
NS-3
的编译系统采用了
Waf
。它是用
Python
开发的新一代编译管理系统。读者不必掌握
python
,即可编译现有的
NS-3
项目。如果读者想要扩展现有的
NS-3
系统,大多数情况只需了解
Python
知识的很少且非常直观的一个子集。
正如以上所述,
NS-3
的脚本由
C++
或者
Python
编写。从
NS-3.2
开始,
NS3
的
API
提供了
python
语言接口,但是所有的模块都是由
C++
编写的。这里,我们假定读者掌握
C++
知识和了解面向对象的相关概念。我们将在用到一些高级的概念或者读者可能不熟悉的语言特性、习惯用语或设计模式时适当地花些时间复习它们。但是我们也不希望本教程变成
C++
教程,所以我们希望读者能够掌握基本的
C++
命令。在网站上和书籍中,你可以找到无数的关于
C++
知识的信息。
如果读者是个
C++
新手,那么您在继续阅读本指南之前可能需要找一些
C++
教程或者网站,至少必须熟悉一下
C++
的基本语言特征。例如,
Cplusplus教程
。
NS-3
系统开发过程中使用了许多的
GNU
工具链(
toolchain
)组件。所谓软件的工具链是指在给定环境中可用编程工具的集合。如果读者想要快速地了解一下
GNU
工具链所包含的内容,请浏览
http://en.wikipedia.org/wiki/GNU_toolchain . NS-3
使用
gcc
,
GNU binutils
,以及
gdb.
但是,我们并不使用
GNU
编译系统工具(
build system tools
),既不用
make
,也不用
autotools
,而是使用
Waf
来作为编译管理工具。
通常,
NS-3
使用者的工作环境为
Linux
或者类
Linux
系统。对于
Windows
环境,有几种可以不同程度模拟
Linux
环境的软件,比如
Cygwin
。
NS-3
支持在
Cygwin
环境下的开发。
Windows
用户可以浏览
http://www.cygwin.com/
获取该软件
(
虽然有许多工程维护者使用
MinGW
,但是
MinGW
现在还没有得到官方支持
)
。
Cygwin
可以提供许多流行的
Linux
系统命令。但是,某些情况下它也会出现问题,因为它毕竟只是
Linux
系统的模拟。
Cygwin
和
Windows
中其他程序的交互也有可能会导致程序出现问题。
如果读者正在使用
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
套接字。