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通用公共許可證