Ns (シミュレータ)

**ns** (**network simulator**の略称に由来) とは、オープンソースで開発が進められている、インターネットを主な対象とした離散事象ネットワークシミュレータの系列 (ns-1, ns-2, ns-3) の名称である。

## 概要
この離散事象ネットワークシミュレータの系列は、全て研究と教育のために用いられる。ns-3プロジェクトの最終的な目標は、コンピュータネットワークに関する研究のコミュニティ内において好んで利用されるオープンなシミュレーション環境の構築である。この目標に関しては、実際にコンピュータネットワーク分野のトップカンファレンスであるACM SIGCOMMへの論文投稿で頻繁に使用されていることが確認されているため、ns-3プロジェクトの目標は概ね達成されていると言える。ns-2はアメリカの学術研究機関を中心に開発が進められていたが、ns-3はフランスの学術研究機関を中心に開発が進められている。また、ns-3では*Annual Meeting*と称したns-3の利用者・開発者の会議が毎年行われており、ワークショップ等も行われている。ns-3はGNU GPLv2ライセンスの下で、無償での研究・開発・使用が認められている。コンピュータネットワークシミュレータとしての世界シェアはトップであるが、コンピュータネットワーク関係者全体を見れば、ns-3ユーザーは少なく、ns-3ユーザーからのソースコードのコミットもあまり芳しくないという状況がある。

### ns-3の仕様概要
* インターネット・プロトコル・スイートのシミュレータとしての実装を主体とする。ns-3はシミュレータであるため、実機実装時の動作に関する保証は不可能である。従って、ns-3が適する用途は、実機と無関係な抽象的な理論検証である。
* ns-3のシステムは大きく分けて、シミュレーションの実行を行う*ns-3 core*と、実験の定義を行う*simulation scenario*に分かれている。ns-3ユーザーは自身のシミュレーションの要求に対する空白部分を埋める形でコーディングし、Wafビルドシステム経由で単一のアプリケーションとしてシミュレータをビルドし、シミュレーションを実行する。ビルド時に出力されるバイナリは、実行環境のCPUに合わせて最適化され、スワップアウト, スワップインが発生しない限りは効率的に動作する。主にC++のソフトウェアフレームワークの形式で構築されており、*simulation scenario*の記述時のみPythonを選択することが可能である。Pythonのみでは*ns-3 core*の改変が行えないため、独自プロトコルの実装等は不可能となり、十分にns-3の機能を活用できない。*ns-3 core*はC++の演算子のオーバーロード, テンプレートメタプログラミング, Standard Template Library (STL) 等の言語仕様を活用して稠密に構築されており、機能の数と比較してソースコードはコンパクトにまとめられている。その反面、文法が独特になり、ソースコードもビルドエラーの出力も長大かつ複雑になり、問題の発生原因の特定が難しくなるため、ソフトウェア開発初心者にとっては開発のハードルが高くなるという欠点が生じてしまっている。また、アルゴリズム, プロトコルの大まかな動作のみに焦点を当てているため、現実のネットワーク機材と比較して実装されていない処理が多い。さらに、クラスや関数の命名には、実装されている機能と全く無関係な命名が行われている場合があり、その不明な点を理解するために、膨大な調査が要求される点も問題である。
* C++の言語仕様の制約下で、イベントキューの長さが許される限り、シミュレーション上のネットワークを構成するノード数を増加させることが可能である。
* 実機とシミュレータの組み合わせで実験ネットワークを構成する事も可能である。
* *ns-3 core*はユーザー空間とカーネル空間に区別されている。サーバやクライアント等のクラスはユーザー空間で利用する。ルーティングやNIC等のクラスはカーネル空間で利用する。
* Linuxで動作するプロトコル・スタックのコードを、ns-3上で利用可能にする機能も提供されている。この機能は、日本人の研究者である田崎創が開発してコミットを行っており、Direct Code Execution (DCE) という名称で提供されている。
* MPIによるマルチプロセスとしての明示的な並列化も対応済みである。MPIを利用する場合、ns-3ユーザー自身がネットワークトポロジを考慮して各プロセスが担当するノードを割り当てなければならない。
* シミュレーション結果をアニメーションで可視化する補助ソフトウェアとして、オンラインビジュアライザ (シミュレーション実行中に可視化) であるPyVizと、オフラインビジュアライザ (シミュレーション実行終了後に可視化) であるNetAnimが用意されている。ソフトウェアアーキテクチャにおけるns-2からの根本的な変更に伴い、ns-2に存在したビジュアライザであるNamは互換性が無くなり完全に廃止された。

### Annual Meeting
毎年、アメリカ合衆国において、ns-3コンソーシアムが主催する、ns-3の利用者と開発者を対象とした*Annual Meeting*が開催されている。主に、ns-3コンソーシアムの運営方針に関する対面による会議や、ns-3初心者を対象としたワークショップが行われている。

2016年6月13日 - 2016年6月17日の*Annual Meeting*はアメリカ合衆国ワシントン州シアトルに設置されているワシントン大学において開催されており、会期中の催しは下記のようになっている。

* ns-3 Training
* Workshop on ns-3
* Consortium Annual Plenary Meeting
* Workshop on Wireless Network Performance Evaluation

## 歴史
### 1988年 (前史:REALの基礎開発)
1988年に、nsの派生元に当たるREALの最初のバージョンが開発された。

カリフォルニア大学バークレー (UCB) 校において、Srinivasan Keshavにより、fair queueing Gateway Algorithm [Nag87][DKS88], first-come-first-served scheduling Gateway Algorithm, DEC Gateway Algorithm [RCJ87, RaJ87]の各々の性能を比較する学術研究の一環として、離散事象ネットワークシミュレーションに関する明確かつ実用的な枠組みが構築された。このシミュレータの詳細は**REAL: A Network Simulator**という論文に纏められて発表された。

REALはREalistic And Largeの略称であり、コロンビア大学が開発を進めていたNEST simulation toolkitを用いて構築された。REALは最初期の実用的なネットワークシミュレータとなった。REALの開発は1997年のVer.5.0まで継続され、ソフトウェアアーキテクチャはnsの基盤にもなった。

### 1995年 - 1997年 (ns-1の基礎開発)
ローレンス・バークレー国立研究所 (LBNL) において、Steve McCanne, Sally Floyd, Kevin Fall等が参加するNetwork Research Groupにより、REALで定義されたソフトウェアアーキテクチャを元にしてnsの最初のバージョンである ns version 1 (LBNL Network Simulator) が開発された。このバージョンは後にns-1と呼ばれるようになった。

REALと同様に、拡張可能で、容易に設定・プログラム可能なイベントドリブン型のシミュレーションエンジンとして設計が行われた。また、TCPの輻輳制御アルゴリズムとルータスケージュールアルゴリズムを複数搭載した。シミュレーションで取り扱うネットワークを定義するシナリオの記述言語がTcl, 通信プロトコルを駆動するコアの記述言語がC++に定められた。

### 1996年 - 1997年 (ns-2の基礎開発)
Steve McCanneがns-1のリファクタリングを行った結果のソースコードを元にns-2の開発が行われた。シナリオの記述言語がOTcl (Object Tcl), コアの記述言語がC++に変更された。シナリオ言語がオブジェクト指向言語に改められたため、OTclとC++のオブジェクト間で関連性を持たせることが出来るようになった。しかし、ns-1とns-2の間でクラスやモジュールの互換性は保たれている。また、ns-2でGPLv2に準拠するようになった。

### 2006年 (ns-3の基礎開発)
ns-2の開発開始から10年経過する過程で、CPUの進化において高クロック化からマルチコア化へのパラダイムシフトが起き、無線ネットワークの普及も急速に進み始めた。それに伴って、ns-2のソフトウェアアーキテクチャでは、開発当初想定していなかった並列化によるシミュレーション処理のスケールと無線ネットワークへの対応が難しいという問題が現れ始めてきた。その2つの問題に対処するために、アメリカ国立科学財団 (NSF) の支援の下で、Tom Henderson, George Riley, Sally Floyd, and Sumit Roy等が先導するチームにより、ソフトウェアアーキテクチャを全面的に刷新したns-3が開発された。ns-3では、開発者がOTclとC++という異なるプログラミング言語のオブジェクト間の関連性を意識しなくて済むように、シナリオ, コア共に記述言語がC++に統一された。この変更により、ns-2とns-3の間のクラスやモジュールの互換性は無くなった。また、Gustavo CarneiroによりPythonバインディングとWafビルドシステムが開発されて新たに導入された。さらに、無線ネットワークのシミュレーションコードの充実、MPIによる並列化対応が行われた。ソフトウェアアーキテクチャの刷新に伴い、ns-2まで存在したビジュアライザであるNamは廃止された。その代わりに、シミュレーション実行終了時に出力されるトレースファイルを読み込んでトポロジ上にパケットフローを表示するオフラインビジュアライザとしてNetAnimが、シミュレーション実行中にシミュレータの内部にアタッチし、パケットの流れをトレースしてトポロジ上にパケットフローを表示するオンラインビジュアライザとしてPyVizが用意された。ns-2の時代のドキュメントの不足を反省し、各種ドキュメントが拡充され、Doxygenによりソースコードから生成されたAPIリファレンスも用意されるようになった。

以前のメジャーバージョンであるns-2では過去に開発された有線ネットワークのプロトコルのシミュレーションコードが充実していた。しかし、最新のns-3では、ns-2とのクラスやモジュールの互換性を捨てて無線ネットワークへの対応を強化したため、有線ネットワークのプロトコルのns-3ネイティブなシミュレーションコードが不足している状態である。そのため、学術界全体としてns-2からns-3への移行は難航しており、ns-2の開発停止後も長らくの間、有線ネットワークの分野ではns-2、無線ネットワークの分野ではns-3という住み分けが続いている。

## 脚注



## 参考文献
* REAL: A Network Simulator
* REAL 5.0 Overview
* NS(1) manual page
* ns version 1 - LBNL Network Simulator
* Marc Greis' Tutorial for the UCB/LBNL/VINT Network Simulator "ns"
* The Network Simulator - ns-2 - ISI
* ns-3

## 関連項目
* シミュレーション - 現象を抽象化して近似的に再現すること。
* :en:Discrete event simulation
* :en:Network simulation