Ns (模拟器)

ns（来源于“network simulator”）是一系列离散事件网络模拟器，包括ns-1、ns-2和ns-3。他们主要应用于研究和教学。ns-3是自由软件，以GNU GPLv2协议分发。

ns-3项目的目标是创建一个开放的用于研究的网络模拟环境，以便于学术团体;这意味着两件事：

- 它需要满足现代网络研究模拟的需要
- 它需要创建一个社区，鼓励贡献、评审并且提高软件质量。

因为创造一个巨大、高质量且被充分测试的网络模拟器需要大量的工作，ns-3项目将任务分配给了社群的各个开发者和用户。

## 历史

REAL 是 ns 的原型，始于1989年。

### ns-1

ns的第一版，被称作ns-1，由劳伦斯伯克利国家实验室（LBNL）的Steve McCanne、Sally Floyd、Kevin Fall和其他贡献者开发于1995-1997年间。这时期它常被称为LBNL网络模拟器（LBNL Network Simulator），源于早期的由S. Keshav编写的REAL模拟器。模拟器的核心由C++写成，和以Tcl脚本为基础的模拟场景。长期的贡献来源于Sun、加州大学伯克利分校的Daedelus项目和卡内基梅隆大学Monarch项目。

### ns-2

在1996-1997年间，ns的第二版（ns-2）最初由Steve McCanne重构而来并用MIT的OTcl替代了Tcl语言，OTcl是一个面向对象的Tcl方言。ns-2的核心部分依旧由C++写成，但是C++模拟对象和变量也可在OTcl中使用。模拟脚本由OTcl写成。这样的结构使得模拟方案能由解释器运行，同时方便的更改而不用重新编译模拟器。在ns-2推出的时期（1990中叶），这样的方式非常方便并且避免了浪费时间的编译操作。而且脚本语言的语法更加清晰。ns-2有一个一起工作的部件，被称作“Network Animator”（nam-1），由Mark Handley编写，用来图形化的展示模拟场景。

1997年，DARPA的Virtual InterNetwork Testbed（VINT）项目启动，劳伦斯伯克利国家实验室、Xerox PARC、加州大学伯克利分校和南加州大学信息科学研究所（ISI）参与其中。ns-2的迅速开发正是在这个时期。同时维护软件的任务渐渐地由ISI接手，最终John Heidemann领导了这个维护任务。在完成了VINT项目后，ns-2在2001-2004年继续由DAPRA SAMAN和NSF CONSER赞助，最终赠与USC/ISI。

现在，ns-2包含了超过30万行代码，并且存在相当多的一部分代码未被合并到主线中。（因为有许多ns-2分支，包括被维护的和未维护的）它能够运行在GNU/Linux、FreeBSD、Solaris、OS X和Windows 95/98/NT/2000/XP上。ns-2以GPL v2协议分发。

### ns-3

ns-3的开发始于2004-2005年间。Tom Henderson（华盛顿大学）领导的一个团队、George Riley（佐治亚理工学院）、Sally Floyd（国际计算机研究中心）和Sumit Roy（华盛顿大学），申请并受美国国家科学基金会（NSF）资助，共同开发ns-2的替代品，被称作ns-3。于此同时，INRIA Sophia Antipolis的Planete研究小组内的Mathieu Lacage和Walid Dabbous开始寻找一个ns-2的替代品，以用于测试IEEE 802.11Wi-Fi模型。Lacage原先使用的模拟器名叫Yet Another Network Simulator（yans）。

两股力量一起合作，在2005年2月的ns-developers邮件列表上讨论ns-3的设计方案。在2005年2月22日，Tom Henderson在ns-developers邮件列表上发了一封邮件，说“我们想要讨论一下未来ns-2如何被重构或者被分支（至少在现在并行的开发，并且维护已有的代码，“We intend to have some discussions on how some of ns-2 might be either refactored or forked as part of a future development effort (in parallel, for now, with maintenance of the existing code tree)”）。一些主要的目标包括了更好的支持网络模拟、复用生成代码和更好的集成以testbed为基础的研究工具。在ns-3的开发过程中，他们决定不再向下兼容ns-2，这主要是因为向后兼容需要太多的额外工作。新的模拟器将从头编写，使用C++。

ns-3的开发始于2006年7月1日。代码主要由Mathieu Lacage编写，并利用了部分yans模拟器、佐治亚理工学院网络模拟器（GTNetS）及ns-2的代码。Gustavo Carneiro贡献了一个框架，包括生成Python绑定（pybindgen）及使用Waf编译系统。

2008年6月，ns-3发布了ns-3.1，之后项目在每个季度发布，直到最近变成了1年3次发布。ns-3在2012年第三季度发布了它的第15版（ns-3.15）。

目前三个版本的状态：

- ns-1不再开发和维护
- ns-2在2010年左右停止开发。目前已不再开发和维护。
- ns-3处于活跃的开发中。

## 设计

ns-3由C++和Python写成，并且以这两种作为编写脚本的语言。

## 组件

ns-3被分为24个模块，包括几个真实网络设备和协议的模块。

## 模拟工作流程

大致上，创建一个模拟可以被分为以下几个步骤：

- 拓扑定义：创建基本设施和相互关系，ns-3有一个向导能够帮助完成此过程。
- 模型使用：添加模型（例如UDP、IPv4、点对点设备和链接、应用）;此时大多数操作可通过向导完成。
- 节点和连接配置：设置模型默认值（例如，一个程序发送的包的大小和点对点连接的MTU值）;此时大多数操作可过属性系统完成。
- 执行：模拟事件，用户请求数据。
- 性能分析：在模拟完成后带时间戳的事件跟踪记录可供使用。这些数据能被工具，例如R语言分析并且得到结论。
- 图形可视化：原始或处理过的数据能被工具，例如Gnuplot、matplotlib或是Xgraph画出。

## 批评

对ns-2的批评主要是因为建模非常复杂并且耗时。主要是因为它没有GUI并且需要学习脚本语言、队列理论和建模技术。并且，最近有人抱怨模拟结果不可重现（可能是由于代码库的不断变更）和使用某些协议一直碰到bug。

对ns-3的批评主要有它缺少ns-2支持的协议和不向后兼容ns-2。因为没有GUI界面，所以和ns-2一样，ns-3也需要大量的时间来学习。

## 基本资料

- 日语原文：ns-3
- 头衔：ns-3网络模拟器
- 开发者：ns-3 项目Tom Henderson, Mathieu Lacage, George Riley, Mitch Watrous, Gustavo Carneiro, Tommaso Pecorella and others.
- 发行日期：2008年6月30日
- 软件版本周期：3.31
- 预览版本：Mercurial 目录
- 编程语言：C++（主要）Python（绑定）
- 操作系统：GNU/Linux, FreeBSD, Mac OS X
- 平台：IA-32, x86-64
- 状态：活跃
- 类型：网络模拟
- 许可协议：GNU通用公共许可证