Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

posted at

updated at

Ubuntu 18.04 にNetwork Simulator 2 をのせる。

ゼミで作った資料の出涸らしです。

Network Simulator 2 とは?

有線・無線ネットワークの研究者にとってns-2(オープンソースのネットワークシミュレータ)は値千金のツールだ。ns-2を、私は研究の道程で偶然見つけた。当時、私はネットワークシミュレータを必要としていたが、名の通った本格的なメーカー品が大学になかったので、研究の用途に耐える無料の代替品を探さざるを得なかったのである。ns-2は無料だが、かなり無愛想なツールでもある。

ns-2: 無料だが無愛想なネットワークシミュレータ - 2006年7月21日11:46 Nauman-Afza

ns-2は、OTclC/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ブラウザはないので、なるべくコマンドで実行するようみにつけてください。
よく知られたコマンドとして、wgetcurlがあります。これらを用いてダウンロードしてみてください。

解凍

tar.gz形式の解凍は、tarコマンドを利用できます。わからなければ。ググる。

インストール

解凍したフォルダの中にinstallというファイルがあります。これをコマンドラインで実行するとインストールできます。

インストールできたか、エラーを 吐いたかログを見て確認してください。

インストールの注意事項については後述を見てください。

# インストール
./install

インストールに必要なこと

APTのインストールでは、他に必要な(依存関係のある)コンパイル済みのパッケージ群を自動的にインストールしていましたが、ソースコードからのコンパイルは依存関係やコンパイルの問題を自分で解決する必要があります。

今回は、下記の3点が必要です。

  1. CとC++のコンパイラのインストール(バージョンに注意)
  2. 必要なパッケージ(依存関係パッケージ)のインストール
  3. ソースコードの修正
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.xg++-4.xxはサブのバージョン)です。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 みたいなところでトラブルシューティング対応とか少しやっていました。

研究の息抜きにやっていこうかなーと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?