ゼミで作った資料の出涸らしです。
Network Simulator 2 とは?
有線・無線ネットワークの研究者にとってns-2(オープンソースのネットワークシミュレータ)は値千金のツールだ。ns-2を、私は研究の道程で偶然見つけた。当時、私はネットワークシミュレータを必要としていたが、名の通った本格的なメーカー品が大学になかったので、研究の用途に耐える無料の代替品を探さざるを得なかったのである。ns-2は無料だが、かなり無愛想なツールでもある。
ns-2は、OTcl と C/C++ で実装されています。
開発の源流
1989年から始まり1995年にPARCやバークレーやISIなどが参画する「Virtual InterNetwork Testbed」プロジェクトのサポートをDARPAを通して行われました。
公式より
開発は長く非常に安定しています。また、APTなどのパッケージ管理ソフトでns
をインストールすることもできます。
# Ubuntu 18.04の場合
$ apt search ns
ns2/bionic 2.35+dfsg-2.1 amd64
Discrete event simulator targeted at networking research
ns2-dbg/bionic 2.35+dfsg-2.1 amd64
debug symbols of ns2
ns2-doc/bionic 2.35+dfsg-2.1 all
docs of ns2
ns2-examples/bionic 2.35+dfsg-2.1 all
examples of ns2
ネットワーク分野の研究では、ns2のほかns3も利用しています。
ns3は、フロントをOTclで実装していたところを**C++**にし、OpenMPIなどを用いることで並列演算(マルチコアでのシミュレーション)が可能になっています。
また、NS3では、C++のほかPython Bindingも用意され Python 越しにいくつか実行できます。
インストールについて
Ubuntu 18.04ではAPTを用いてバイナリをインストールすることもできますが、適宜プログラムの改変などを行うことを考えるとプログラムのソースコードをダウンロードし、コンパイルしたほうが良い。
NS2のソースコード
NS2のソースコードは以下のURLからダウンロードすることができます。
https://downloads.sourceforge.net/project/nsnam/allinone/ns-allinone-2.35/ns-allinone-2.35.tar.gz
サーバーなどでは、ChromeやFirefoxのようなWebブラウザはないので、なるべくコマンドで実行するようみにつけてください。
よく知られたコマンドとして、wget
とcurl
があります。これらを用いてダウンロードしてみてください。
解凍
tar.gz
形式の解凍は、tar
コマンドを利用できます。わからなければ。ググる。
インストール
解凍したフォルダの中にinstall
というファイルがあります。これをコマンドラインで実行するとインストールできます。
インストールできたか、エラーを 吐いたかログを見て確認してください。
インストールの注意事項については後述を見てください。
# インストール
./install
インストールに必要なこと
APTのインストールでは、他に必要な(依存関係のある)コンパイル済みのパッケージ群を自動的にインストールしていましたが、ソースコードからのコンパイルは依存関係やコンパイルの問題を自分で解決する必要があります。
今回は、下記の3点が必要です。
- CとC++のコンパイラのインストール(バージョンに注意)
- 必要なパッケージ(依存関係パッケージ)のインストール
- ソースコードの修正
CとC++のコンパイラ
NS2はC言語とC++言語で書かれています、そのため、対応するコンパイラが必要です。C言語のコンパイラはgcc
で、C++言語のコンパイラはg++
です。
注意
現在(2019年8月12日)のgccとg++のバージョンは9.2ですが、NS2がリリースされた年のバージョンは、4.4です。
なので、現在のコンパイラではエラーを吐きます。
APTでバージョン4.xのものをインストールするようにして下さい。
# gccの検索
apt list gcc-4*
# g++の検索
apt list g++-4*
インストール対象は、gcc-4.x
とg++-4.x
(xはサブのバージョン)です。APTでインストールしましょう。(インストール方法はぐぐって)
インストール後、標準のC言語/C++コンパイラをgcc
コマンドからgcc-4.x
にする必要があります。
標準のコンパイラを環境変数を用いて定義することができます。
# C言語の設定
export CC=gcc-4.x
# C++言語の設定
export CXX=g++-4.x
この設定は、コマンド画面を閉じるまで有効です。
設定を維持したい場合は、適宜bashの設定ファイルなどに書き込んでください。
その他の必要なパッケージ
そのほかに必要なパッケージがあります。足りないものは適宜APTでインストールしてください。
autoconf
tcl
tk
libxt-dev
make
nam
ソースコードの修正
公式からダウンロードしたソースコードには一点ミスがあります。
下記は修正前と修正後のファイルをdiff
コマンドを使って差分を確認したところです。
下記を参考にns-allinone-2.35/ns-2.35/linkstate/ls.h
の137行目を修正してください。
行の先頭が
-
の行は削除された行で、
+
の行は追加された行になります。
--- ns-allinone-2.35/ns-2.35/linkstate/ls.h 2010-03-08 14:54:51.000000000 +0900
+++ ns-allinone-2.35-fixed/ns-2.35/linkstate/ls.h 2020-02-04 14:26:55.473631911 +0900
@@ -134,7 +134,7 @@ public:
return ib.second ? ib.first : baseMap::end();
}
- void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
+ void eraseAll() {this-> erase(baseMap::begin(), baseMap::end()); }
T* findPtr(Key key) {
iterator it = baseMap::find(key);
return (it == baseMap::end()) ? (T *)NULL : &((*it).second);
PATHを通す
インストールが完了したら、今度は
実行ファイルにパスを通していきます。
シェルの変更はしていないので、bash
を使っていると思います。
その場合は、~/.profile
にPATHを追記していきます。
下記は個人的な書き方例です。
# ~/.profile: executed by Bourne-compatible login shells.
# <--- ここに書く --->
# NS2を置いている場所(適宜修正してください)
export NS_HOME="$HOME/ns2/ns-allinone-2.35"
export LD_LIBRARY_PATH=$NS_HOME/otcl-1.14:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$NS_HOME/lib:$LD_LIBRARY_PATH
export TCL_LIBRARY=$NS_HOME/tcl8.5.10/library
while read -r line
do
export PATH="${line}:${PATH}"
done << PATH_LIST
$NS_HOME/bin
$NS_HOME/sbin
$NS_HOME/ns-2.35
$NS_HOME/nam-1.15
$NS_HOME/xgraph-12.2
$NS_HOME/tcl8.5.10/unix
$NS_HOME/tk8.5.10/unix
PATH_LIST
# <--- ここまで --->
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
mesg n || true
再読込
再読込はsource
コマンドで実行可能です。
source ~/.profile
動作確認
PATHが無事通せていれば、下記のコマンドが実行できるはずです。
# 有線のサンプル
ns $NS_HOME/ns-2.35/tcl/ex/simple.tcl
# 無線のサンプル
ns $NS_HOME/ns-2.35/tcl/ex/simple-wireless.tcl
# TCPのサンプル
ns $NS_HOME/ns-2.35/tcl/ex/simple-tcp.tcl
自己紹介
はじめまして、ナカガワです。
大学でネットワークを専攻しています。
いままでは、https://www.nettech.tuis.ac.jp とか、http://pcdesk.tuis.ac.jp みたいなところでトラブルシューティング対応とか少しやっていました。
研究の息抜きにやっていこうかなーと思います。