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 隻維護，
* 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++

## 註解

## 參考來源

## 外部連結

* （英文）ns-2 主頁（頁面存檔備份，存於網際網路檔案館）
* （英文）ns-3 主頁（頁面存檔備份，存於網際網路檔案館）