ネットワークシミュレーションのラボ:ns-3 シミュレーターを 1 台の専用 Ubuntu VM で

このラボでは、多くの大学の授業で使われるネットワークシミュレーター ns-3 を、生徒 1 人ひとりに 1 台の Ubuntu VM の中で渡します。生徒は C++ のプログラムの中に小さなネットワークを作って動かし、書き出されたパケットトレースを読み、遅延、スループット、パケット損失を測ります。生徒が書く 2 つのプログラムは、生徒が見ることのない値で動かすスクリプトが採点します。

生徒のパソコンには何も入れる必要がなく、ケーブルもいりません。ns-3 は本物のシミュレーターで、Ubuntu のアーカイブから入り、プログラムは数秒でビルドできます。パケットトレースは本物の pcap ファイルなので、実際のネットワークのキャプチャと同じ tcpdump のコマンドで読めます。

生徒が学ぶこと

ネットワークをどう書き表し、どう測るかを学びます。最初のプログラムは、2 つのノードをポイントツーポイントのリンクでつなぎ、UDP エコーを 1 つ送ります。pcap ファイルには、要求と返事が時刻つきで残ります。遅延とデータレートを変えると、それぞれが往復時間のどの部分を動かすかが分かります。遅延はどのパケットでも同じで、データレートはパケットが大きいほど効いてきます。次に、複数の送信者がルーター経由で、遅い 1 本のリンクを分け合います。FlowMonitor が各フローの送信数と到着数を数え、パケットがいつ、なぜ失われるかが見えます。

5 つのパート

1 つ目は 2 つのノードとエコーです。用意されたプログラムを sim build でビルドして動かします。2 つ目はトレースです。sim pcap が、デバイスを通ったパケットを一覧にします。3 つ目はコマンドラインでリンクを変えることで、実行の前に予想を立てます。4 つ目は FlowMonitor を使ったボトルネックです。送信者、ルーター、遅いリンクがあり、フローごとに損失とスループットを数えます。5 つ目は生徒が書く 2 つのプログラム scenario.cc と loss.cc で、それぞれ何をすべきかが先頭のコメントにそのまま書いてあります。生徒が編集するものはすべてフォルダー ns3 にあり、ホームフォルダーの README.md が何をするかを伝えます。答えは書いてありません。

ブラウザーで動かす

VM ラボは、モジュールのラボ課題として設定し、サンプルはラボのページにあります。マシンは小さく、CPU 1 つ、メモリ 1 GB、ディスク 10 GB です。プログラムのコンパイルは 2 秒から 5 秒です。

  1. ラボを追加する. 担当するモジュールで課題を追加し、Ubuntu VM ラボのカードを選びます。ページには compose ファイルの代わりに、マシンの短い説明が表示されます。
  2. サンプルから始める. ページに、すぐ使えるラボが並びます。Network simulation を選びます。サンプルを使うと文章が置き換わりますが、元に戻すで自分の文章に戻せます。
  3. 公開して自分用のコピーを起動する. 公開してから、開始を押します。ラボの setup スクリプトが、VM の初回起動時に ns-3、C++ コンパイラー、tcpdump を Ubuntu のアーカイブから入れ、sim 補助コマンド、作業用プログラム、README を書き込みます。数分かかります。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。ブラウザーで開くものはなく、ラボはターミナルだけです。

このラボの基本レッスン

Network Simulation Basics は、このラボ(Ubuntu VM)で行う短いレッスンです。導入、「できる」で書いた目標、キーワード、復習の問い、考えごとの確認、よくある間違い、最後の確認があり、各ステップの実行ボタンがコマンドをマシンのターミナルに入力します。生徒はエコーをビルドして動かし、その pcap を読み、遅延を長く、レートを遅くしてもう一度動かし、ボトルネックを 2 回動かしてパケットがいつ失われるかを見ます。

このレッスンは見て回るだけで、ラボ本来の課題である 2 つのプログラムは生徒に任せるので、答えは出てきません。

採点の仕組み

ラボにはチェックがあります。保存したマシンのコピーで動き、scenario.cc と loss.cc をコンパイルします。scenario.cc は、チェックが毎回新しく引く遅延、データレート、パケットの大きさで 2 回動かし、プログラムが表示する往復時間が、計算と、プログラムが書いた pcap の 2 つの時刻に合っている必要があります。loss.cc は、チェックが毎回新しく引く送信者の数、レート、ボトルネックで、過負荷のときとそうでないときの 2 回動かし、表示する損失とスループットが、FlowMonitor が書いた XML と、用意されたボトルネックのプログラムの実行結果に合っている必要があります。別のプログラムを起動するものや、ns-3 を使っていないものは断られます。チェックが表示した最初の行が理由を伝えます。

  1. 配る. 課題と同じようにラボを割り当てます。希望すれば期限も付けられます。生徒ごとに専用の VM が付き、授業のあとも残ります。
  2. チェックを実行する. クラス一覧の生徒の行で、チェックを実行を押します。保存したマシンのコピーを起動し(コピーは保存し直されません)、ラボのチェックスクリプトを root で実行して、合格したか、何を表示したか、いつかを示します。結果は生徒には伝わりません。
  3. 採点する. チェックが表示した最初の行を読みます。プログラムが書いた pcap と往復時間が合わない、損失が loss.xml と合わない、など、何が正しくないかが書いてあります。足りなければ理由を付けて返します。

GitHub の定義ファイル

このファイルがラボの定義のすべてで、プラットフォームが実行する文章そのものです。大きさ、setup スクリプト、補助コマンド、作業用プログラム、README、チェックが入っています。コピーして構成や数値を変えれば、もっと長いラボが作れます。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

ラボにライセンスは必要ですか。
いいえ。ns-3 はオープンソースで、GNU General Public License バージョン 2 のもとにあり、生徒の VM の起動時に Ubuntu のアーカイブから入るので、私たちが配布するものはありません。
なぜ Python ではなく C++ なのですか。
Ubuntu 26.04 の ns-3 3.46 にはライブラリとヘッダーはありますが Python バインディングがないので、ラボは ns-3 自身が書かれている言語で、チュートリアルも使う C++ を使います。生徒は短い main 関数を編集し、sim build が入っているライブラリに対して数秒でコンパイルします。
生徒は何かを壊すことがありますか。
壊せるのは自分のコピーだけです。アカウントのない訪問者のマシンが届くのは Ubuntu のアーカイブだけで、シミュレーションのネットワークはプログラムの中にあり、本物のネットワークには触れません。ファイルを壊したら sim reset で配ったときの状態に戻せます。
実際の生徒の VM で試しましたか。
setup、レッスンのコマンド、チェックと、チェックをだます各方法は、VM の代わりの本物の Ubuntu 26.04 コンテナで、arm64 のマシン上で実行しました。起動した生徒の VM と、生徒のマシンの amd64 パッケージは、授業の前に一度試すことをお勧めします。