**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只维护，
* ns-3处于活跃的开发中。

设计
--

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

组件
--

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

模拟工作流程
------

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

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

批评
--

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

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

参见
--

* GloMoSim
* NetSim
* OMNeT++

注解
--

1. ↑  Tom Henderson, Mathieu Lacage, George Riley, Mitch Watrous, Gustavo Carneiro, Tommaso Pecorella and others.

参考来源
----

1. ↑  Henderson, Tom.  (邮件列表). ns-announce. 2012-06-09  [2012-12-26]. （原始内容存档于2012-03-27）.
2. ↑  ; 作品或名稱的語言: 英語; 检索日期: 2023年9月10日.
3. ↑ .  [2012-12-29]. （原始内容存档于2013-02-22）.
4. ↑ .  [2012-12-29]. （原始内容存档于2013-01-04）.
5. ↑   Sandeep Bajaj, Lee Breslau, Deborah Estrin, Kevin Fall, Sally Floyd, Padma Haldar, Mark Handley, Ahmed Helmy, John Heidemann, Polly Huang, Satish Kumar, Steven McCanne, Reza Rejaie, Puneet Sharma, Kannan Varadhan, Ya Xu, Haobo Yu, and Daniel Zappala, *Improving Simulation for Network Research*, Technical Report 99-702, University of Southern California, March, 1999.
6. ↑  Lacage, M. and Henderson, T.R. "Yet another network simulator", *Proceeding from the 2006 workshop on ns-2: the IP network simulator*, ACM, 2006.
7. ↑ .  [2012-12-29]. （原始内容存档于2012-03-27）.
8. ↑ .  [2012-12-29]. （原始内容存档于2012-03-27）.
9. ↑ . July 2, 2011  [March 31, 2011]. （原始内容存档于2013-02-15）.
10. ↑  Henderson, Tom.  (邮件列表). ns-announce. 2012-08-29  [2012-12-26]. （原始内容存档于2016-03-05）.

外部链接
----

* （英文）ns-2 主页（页面存档备份，存于）
* （英文）ns-3 主页（页面存档备份，存于）