通信ネットワークシミュレータ

送信者 → 直列ルータ → 受信者 の流れを、性能配分を変えながら対話的に理解する教材

ルータが直列につながったネットワークにおける
最適な資源配分について考える

簡易なネットワークシミュレータを作成し、パケットの到着率 λ と各ルータのサービス率 μᵢ を動かしながら、系全体の遅延・スループット・ロスの変化を観察します。以下の 4 週間の流れで実施していきます。

Week 1
確率乱数の発生
一様/指数/正規/対数正規乱数を生成し、度数分布・平均分散が理論値と一致するかを確認する。
Week 2
ルータが一つの場合の分析
単一の M/M/1 待ち行列をシミュレートし、λ と μ の関係から平均待ち時間・利用率 ρ の挙動を理解する。
Week 3
ルータが直列につながった場合の分析
複数ルータを直列接続し、各 μᵢ の配分を変えたときのボトルネック現象と最適な資源配分を検討する。
Week 4
レポート提出
ここまでの実験結果を整理し、観察・考察をレポートとしてまとめて提出する。
⚠️
注意事項
・実験には ノートパソコンを必ず持参 してください。
・プログラミング言語は C++ を使用します。

Week 1 ― 確率乱数の発生

目的: パケットの到着間隔やサービス時間はランダムに生起します。コンピュータで「ランダムさ」を表現するには 疑似乱数 を使います。ここでは、一様乱数を起点として、指数分布・正規分布・対数正規分布に従う乱数を発生させ、度数分布が理論の密度関数と一致することを確認します。
実習の進め方

配布 sample1.cpp で行う課題

  1. 準備: 配布/sample1.cpp// *** を埋める(一様 → 区間変換、exp_dist は逆関数法、normal_dist は Box–Muller、lognormal_dist はパラメタ変換)
  2. 実行: DIST_TYPE を 1〜4 に変えて g++ sample1.cpp && ./a.out > data.txt を 4 回(末尾の Average:… 行はツールが自動スキップ)
  3. 確認: 専用ツールで度数分布表と理論 PDF を比較。学習ポイントは「確率密度 = 相対度数 / Δx」の Δx を自分で設定すること
下のデモ: 実習をやる前に、4 分布がどんな形になるかを対話的に眺めるプリビュー。パラメタを動かすと右側の理論式と統計量が追従します。
ヒストグラム (相対度数 / 階級幅)
理論密度関数
f(x) = λ e−λx
サンプル平均
理論:
サンプル分散
理論:
最小値
最大値

Week 2 ― 単一ルータ (M/M/1) の分析

目的: 1 つのルータに対して、到着率 λ・サービス率 μ を動かしたときに、平均キュー長 L平均遅延 W利用率 ρ = λ/μ がどう変化するかを観察します。理論式 (M/M/1) とシミュレーション値の比較も行います。
実習の進め方

配布 sample2.cpp で行う課題

  1. 準備: 配布/sample2.cpp// *** を埋める(r_total の積分、指数/対数正規のサービス時間、滞在時間の総和計算)
  2. 実行: rho を 0.1〜0.9 まで 0.05 刻みで変えて再コンパイル・実行し、出力を追記: ./a.out >> results.txt(17 点)
  3. 確認: 専用ツールで L–ρ, W–ρ グラフをシミュと理論で重ね描き
  4. オプション: #define TRACE_QUEUE 1 で 1 回実行 → queue_trace.csv が出力 → 同 HTML の「4. バッファ状態」で階段グラフ + パケットが溜まるアニメーションを確認
下のデモ: 実習の前に、単一ルータの挙動を対話的に確認するプリビュー。λ と μ を動かすとキュー形成・ロスの様子が変わります。
ρ = λ/μ = 0.67
L = ρ/(1−ρ) = 2.00
W = 1/(μ−λ) = 1.00 s
理論 W = 1/(μ−λ)
シミュレーション値
送信総数
0
到着総数
0
ロス数
0
平均遅延 (実測)
0.00s
平均キュー長
0.00
時刻
0.0s

Week 3 ― 直列ルータの分析と資源配分

実験内容: 送信者が指数分布に従う間隔でパケットを発生 (到着率 λ) し、N 個のルータ R₁…Rₙ を経由して受信者へ届きます。各ルータは FIFO キューを持ち、サービス時間は μᵢ の指数分布。下の各カードで μᵢ を変えて、系全体の挙動を観察してください。
実習の進め方

配布 sample3.cpp で行う課題

  1. 準備: 配布/sample3.cpp// *** を埋める(指数/対数正規のサービス時間、server1..5t_ave, q_max を決める。使える t_ave: 5, 6, 10, 15, 18, 30、総バッファ = 20)
  2. 実行: ./a.outaverage rate(スループット)を取得。配置を変えて複数回
  3. 確認: #define TRACE_QUEUE 1 で実行 → queue_trace3.csv が出力 → 専用 HTML で各サーバ Q_i(t) とパイプラインアニメーションを確認。ボトルネック位置がひと目でわかる
下のデモ: 実際に sample3.cpp で試す前の対話的プリビュー。ルータ数と μᵢ を動かして、どこで詰まるかの感覚を掴みます。
配分プリセット
送信中パケット
キュー待機
ロス (キュー溢れ)
受信者に到着
バッファ合計: 20 / 20
λ = 2.5 [pkt/s]
min μᵢ = 3.0 [pkt/s]
ρmax = λ / min μᵢ = 0.83
送信総数
0
到着総数
0
ロス数
0
平均遅延
0.00s
スループット
0.00pkt/s
時刻
0.0s

Week 4 ― レポート提出

これまでの実験で得られた結果をもとに、最適な資源配分について考察するレポートを提出します。以下の観点を盛り込むと、説得力のあるレポートになります。
データのエクスポート

各ツールから CSV で数値を取り出す

  1. 課題1: histogram_check.html の「CSVダウンロード」で 度数分布表(以上/未満/階級値/データ数/相対度数/確率密度/理論値)を出力 → Excel でグラフ整形
  2. 課題2: queueing_result.html の「CSVダウンロード」で ρ/λ/μ/L_sim/L_theory/W_sim/W_theory/誤差% を出力
  3. 課題3: sample3_viewer.html は直接のダウンロード機能はないが、queue_trace3.csvaverage rate の標準出力がそのまま使える
① 乱数の妥当性
生成した各分布の度数分布・平均・分散が、理論値とどの程度一致しているかを確認する。
② 単一ルータの挙動
ρ を変化させたときの W, L の挙動を、M/M/1 理論式と比較する。
③ 直列ルータの資源配分
μ の総和が同じでも配分次第で系のスループット・遅延が変わることを示す。
④ 考察
ボトルネックがどこに生じるか、λ の変化に対する系の耐性について議論する。