Ubuntu 18.04 にNetwork Simulator 2 をのせる。

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

## Network Simulator 2　とは？

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

> [ns-2: 無料だが無愛想なネットワークシミュレータ - 2006年7月21日11:46 Nauman-Afza](https://mag.osdn.jp/06/07/21/0249208)

ns-2は、**OTcl** と **C/C++** で実装されています。

### 開発の源流

1989年から始まり1995年にPARCやバークレーやISIなどが参画する「Virtual InterNetwork Testbed」プロジェクトのサポートをDARPAを通して行われました。
[公式より](https://www.isi.edu/nsnam/ns/)


開発は長く非常に安定しています。また、APTなどのパッケージ管理ソフトで`ns`をインストールすることもできます。

```sh
# 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 マニュアル - 東北大学](http://www.it.is.tohoku.ac.jp/lecture/network/ns_kiso/ns_kiso.pdf)
- [ns (シミュレータ)　- Wikipedia](https://ja.wikipedia.org/wiki/Ns_(%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF))
- [NS2関連リンク - CVI](https://sites.google.com/site/106cvi/ns2/links)


ネットワーク分野の研究では、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](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`というファイルがあります。これをコマンドラインで実行するとインストールできます。

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

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

```bash
# インストール
./install
```

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

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

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

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.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行目を修正してください。

> 行の先頭が
>
> `-`の行は削除された行で、
>
> `+`の行は追加された行になります。

```diff
--- 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を追記していきます。
下記は個人的な書き方例です。

```bash
# ~/.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`コマンドで実行可能です。

```bash
source ~/.profile
```

### 動作確認

PATHが無事通せていれば、下記のコマンドが実行できるはずです。

```bash
# 有線のサンプル
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 みたいなところでトラブルシューティング対応とか少しやっていました。

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