ns-3 でネットワークシミュレーションIntroduction to simulation with ns-3

オープンソースのネットワークシミュレータ ns-3 を使ってシミュレーションを行う方法を紹介します。

参考資料
ns-3
Documentation (ns-3.14 チュートリアル)
Experimentation with ns-3 (slide)

ns-3は Discrete event simulator のひとつで、 特にMANETを含む無線ネットワークのシミュレーションによく使われます。近年サポートされるサービス/プロトコルが充実してきており、トランスポート 層のIPv6サポート、WiMAXやLTE、OpenFlowなども扱えるようです。(詳細)コミュニティの活動も活発なようで、開発 & サポート用メーリングリストはいつも賑わっています。初歩的な質問にも開発者が親切に回答しているように見えます。

実験シナリオはC++またはPythonで記述しますが、私は現状C++の方しか試していませんのでこのエントリではPythonに関しては触れません。

以降の情報は前述のチュートリアルを参考に記述していますので、詳細を知りたい方は原本を読んでください。とても詳しく説明されています。

ns-3のインストール

開発元からtarballをダウンロードする方法と、Mercurialリポジトリから最新のコードをチェックアウトする方法があります。ここではMac OS上で後者の方法でインストールすることにします。(Mercurialは既にインストール済であるものとします) tarballをダウンロード&展開した場合は、手順3からの作業となります。

1.ビルド用スクリプトのチェックアウト

2.ソースコードの取得
欲しいバージョン (ここでは ns-3.14) を指定してダウンロードスクリプトを実行する。リポジトリを参照し、”ns-3″ がつくもののいずれかを取得しましょう。(開発版ならns-3-dev)

3.取得したソースコードからビルド

4.ビルドのテスト

failやcrash, errorがなければokです。

5.シミュレーションの実行テスト
シミュレーションの実行にはツールwafを使用します。ここでは予めビルド済みのシナリオhello-simulatorを動かしてみます (ソースコードは examples/tutorial/hello-simulator.cc)

“Hello Simulator”が出力されれば正しく実行されています。

 

サンプルシナリオの実行

ns-3をそのまま利用する(プロトコル等に手を加えない)場合の実験の手順は以下の通りです。

  1. シミュレーションシナリオをC++で記述する
  2. 作ったシナリオファイルを scratchディレクトリに配置する
  3. wafを用いてビルド
  4. wafを用いてシナリオを実行

ここではサンプルシナリオを上記に従って実行してみます。サンプルコードは examples/tutorial ディレクトリにありますので、まずはfirstシナリオ (first.cc) を改変せずに実行します。

以下のような出力があれば正常にシナリオが実行されています:

first シナリオは2ノード間でUDP/IPv4パケットを授受するものです。
詳細はチュートリアルのとおりですが、2ノードをC++のクラスとして用意し、そこにデバイスとTCP/IPのプロトコルスタックを設定した上で、それぞれにUDPクライアント or サーバアプリケーションを動かすようになっています。

firstシナリオはパケットを授受してデバッグメッセージを出力するだけですが、実機でのtcpdumpのようにパケットをキャプチャすることも 可能です。例えばtutorial/examplesディレクトリにあるsecondシナリオでは有線ネットワーク上での複数端末の通信をシミュレーショ ンし、パケットキャプチャを行っています。

まずはfirstシナリオと同様に実行してみます:

以下のような出力があれば正しくシミュレーションシナリオが処理されています:

このとき、同ディレクトリにsecond-0-0.pcap, second-1-0.pcap, second-2-0.pcapというファイルが作成されます。これらのファイルは各ノードのパケットキャプチャファイルで、tcpdump -w で取得出来るファイルと同じ形式になっており、実験後にtcpdumpやwiresharkを用いて解析出来て便利です。

今後はMANET等の無線ネットワークの実験シナリオの書き方やns-3の内部処理、独自プロトコルの実装についてお話していきたいと思います。

Satoru Noguchi