OMNeT++ IDE Tutorial

目次

はじめに
パケットネットワークモデルの実装
ブログラム構成
イベントログと統計情報の記録
レポート

はじめに

このチュートリアルの目的は、簡単なシミュレーションモデルの作成を通して、OMNeT++ IDEの使い方を理解することである。

パケットネットワークモデルの実装

  1. 1回目の実験で作成したomnetpp-4.1ファルダ(C:\Users\jikkenuser\sim\omnetpp-4.1)の下のsamplesの下にpkswitch_netファルダを作成する。
  2. omnetpp-4.1ファルダにあるmingwenv.cmdをダブルクリックして立上げる。
  3. コマンドプロンプトで、omnetppと入力しOMNeT++ IDEを立上げる。Workspaceは、C:\Users\jikkenuser\sim\omnetpp-4.1\samplesとする。
  4. Welcomフォルダが表示された場合、Welcomフォルダを終了する(xをクリック)。
  5. 新プロジェクトを作成する:File | New | OMNeT++Project... を選び、以下のように設定する:
    • Project name: pkswitch_net
    • Nextをクリック
    • Select template: Empty project
    • finishをクリック
  6. Project Explorerウインドでpkswitch_netフォルダ内のpackage.nedを右クリックし、Deleteを選択後、OKを押す。
  7. パケットネットワークモデルの全てのNEDファイル、C++ファイル、ヘッダファイル、msgファイル、iniファイルを作成します。最初のファイル(pkswitch_net.ned)の作成は以下の通り(この操作を残りの全てのファイルに対して行う):
    • File | New | File を選ぶ。
    • Enter or select the parent folderに対して、pkswitch_netをクリック。
    • File name: pkswitch_net.ned
    • Finishをクリック。
    • pkswitch_net.nedの中味をブラウザからカットし、IDEのpkswitch_net.nedと書かれたウインド上でペーストする。
    • ペースト後保存する(Ctrl-s或いは、フロッピディスクのアイコンをクリック。尚、ウインドウの左下がDesignの場合、Sourceに変更しないとペースト出来ない。)
    • Project Explorerウインドにpkswitch_net.nedがあることを確認する。
  8. コンパイルする: Project | Build All を選択する。 (どうしてもコンパイルエラーが出る人は、OMNeT++ IDEを終了後、作成したpkswitch_netフォルダを削除し、ここにある(コンパイルが成功した)pkswitch_netフォルダー(解凍が必要)を使って下さい。
  9. 実行する: 
    • Project Explorerウインドから、omnetpp.iniを右クリックする。
    • Run As | 1 OMNeT++Simulation...を選択する。
    • Tkenvが立ち上がったら、config nameはOne -- "10% router-to-router link utilization"を選択


プログラム構成

OMNet++は、モジュールと呼ばれる再利用可能な要素を組合せてシミュレーションモデルを作成します。複数のモジュール間をつないで合成モジュール(compound module)を作ります。それらを更につないで、多階層の合成モジュールが出来ます。階層はNEDファイルで定義します。

NEDファイルの例として、Project Explorerのpkswitch_net.nedをダブルクリックして下さい。submodulesを見ると、pkswitch_netはホストを4台とルータを2台を組合わせてネットワークを構成しています。また、connectionsを見ると、host[0]とhost[1]がlanlinkでrouter[0]に、host[2]とhost[3]がlanlinkでrouter[1]に、router[0]とrouter[1]がwanlinkでつながっていることが分かります。

更に、host.nedを見ると、ホストは5っのサブモジュールで構成されていることがわかります。これは、GUIウインドのhost[1]のアイコンをダブルクリックした時の表示に一致します。

シンプルモジュールとは、これ以上サブモジュールに分解出来ないモジュールであり、シンプルモジュールの動作はC++で記述されている。modules.nedを見ると、上記5つのモジュールはいずれもシンプルモジュールであることが分かる。シンプルモジュールは、simpleをキーワードとして、合成モジュールはmoduleをキーワードして宣言される。pkswitch_netをシミュレーションするには、networkをキーワードとしてpkswitch_netを宣言する。



NEDファイルは、OMNet++ IDEを使って、テキストモードとグラフィックモードの両方で編集出来ます。Project Explorerウインドからhost.nedをダブルクリックして下さい。中央のウインドにhost.nedが表示されましたが、そのウインドの左下にDesign(グラフィックモード)とSource(テキストモード)のモード切替があります。NEDファイルはモジュールの構造(トポロジ)のみを定義します。モジュールの動作とモジュールのパラメータ値は規定しません。動作は、C++コードがシンプルモジュールに対して規定します。

一方、iniファイルはネットワークの構成を記述します。どんなOMNeT++シミュレーションでも、1つのiniファイルが必要です。このファイルは、NEDネットワークの名前、ネットワークやネットワーク内の要素に必要なパラメータ値を設定します。ネットワーク内のモジュールはパスを使って表現されるので、iniファイルもパスを使ってパラメータを指定します。例えば、host[0]のパラメータdestAddressListは、パスによってpkswitch_net.host[0].destAddressListであらわされる。また、pkswitch_net.**.pkSizeは、パケット長分布を指定するパラメータであり、**は"."を含む全ての文字にマッチすることを表す正規表現(オートマトンで習った?)です。尚、*は"."を含まない全ての文字にマッチする正規表現です。
以下のomnetpp.iniで、[General]や[Config One]は(パラメータや実行時間などの)実行条件の異なるシミュレーションを表しています。[General]はデフォルトのシミュレーション条件であり、[Config One]で[General]で設定したパラメータ値を上書き(オーバライト)することが可能です。


イベントログと統計情報の記録


pkswitch_netモデルでは、シンプルモジュールのC++コードの中で、以下の統計情報を収集します:

  1. 出力キュー長
  2. 出力キュー長分布
  3. 出力キュー長の時間変化 
  4. ホストが送信したパケット数と受信したパケット数
  5. 受信側(sink)で観測したパケット長分布 
  6. 受信側(sink)で観測したホップ数分布 
  7. 受信側(sink)で観測したEnd-to-endパケット遅延分布


以下のapp_sink.hに受信側(sink)で観測するデータの変数が定義されています。Histogramは計測したデータの分布、Vectorは時系列を求めるのための変数です。



データの分布やグラフは次のようにしてアクセス可能です。まず、シンプルモジュールのアイコンをダブルクリックし、contentsタブを選ぶと、その中に収集した統計情報があります。例えば、OMNeT++/Tkenvウインド(GUI)で、Expressを選択し、シミュレーションを最後まで実行後、host[1]をダブルクリックし、その後、app_sinkをダブルクリックして下さい。ウインドが開いたら、Contentsタブを選びます。そこには、上記統計情報の内、5から7の分布が収集されています。pkSizeStatsが5のパケット長分布、hopCountStatsが6のホップ数分布、pkDelayStatsがパケット遅延分布です。例えば、パケット長分布のpkSizeStatsをダブルクリックして下さい。下のようなヒストグラムが表示されます。


シミュレーションは後処理として二つのファイルを残します。vectorファイル(.vec)scalarファイル(.sca)です。vectorファイルは(時間、値)の対から成る時系列データです。一方、scalarファイルは統計情報の要約を含んでいます。これらは、通常のテキストファイルで、OMNet++のツールを使って処理することが出来ます。pkswitch_netモデルでは以下の二つのファイルがシミュレーション実行後に作成されます(シミュレーションが実行されると、古いファイルは消去されます)。

  1. One-0.vec キュー長サイズの時間変化
  2. One-0.sca 様々な統計情報。例えば、平均end-to-end遅延、ホストが送信したパケット数と受信したパケット数等。


以下は、app_sink.ccのhandleMessage()関数の中の命令文です。HopCountVector.record()、pkDelayVector.record()を実行すると、One-0.scaファイルにデータを書き込みます。



一方、スカラーデータ(One-0.sca)は、finish()関数(シミュレーションが正常に終了した場合に実行される)のなかで、recordScalar()関数により書き込まれます。以下は、app_sink.ccのfinish()関数の一部です。



ここで、One-0.vec/scaファイルの中味を見てみましょう。


沢山のデータがありますが、ここではapp_sinkモジュールが受信したパケット数をホスト別に比較します。


レポート

課題:

  1. One-0.vecファイルを使って、host[0]に到着したパケットのEnd-to-end遅延時間の時間変化を表すグラフを作成せよ(ヒント:*.host[0].*とpkDelayVectorをフィルタとして使う)。
  2. app_genモジュールから送信されるパケットのパケット到着間隔を変えて(この結果、router[0]とrouter[1]間のリンクの使用率がも変わる)、host[0].app_sinkモジュールが受信したパケットのend-to-end遅延時間の分布(pk delay (histogram))を以下の手順で求る。次に、リンクの使用率が高い(80%)場合と低い(10%)場合で求めた分布にどのような違いがあるか確かめよ。
    • omnetpp.iniに、[Config Two]以下の3行追加します。
    • 次に、以下の手順で[Config One]を実行します: 
      • Project Explorerウインドから、omnetpp.iniを右クリックする。
      • Run As | 1 OMNeT++Simulation...を選択する。
      • Tkenvが立ち上がったら、config nameはOne -- "10% router-to-router link utilization"を選択。
      • Tkenvを終了。
    • その後、[Config Two]を実行します(config nameはTwo -- "80% router-to-router link utilization"を選択)。
    • Config Oneの結果は、resultsファオルダのOne-0.scaとOne-0.vecにあります。
    • Config Twoの結果は、resultsファオルダのTwo-0.scaとTwo-0.vecにあります。
  3. pkswitch_netモデルにhost[4]を追加し、ホスト毎に送信したパケット数を表すグラフを作成せよ。(ヒント:*.app_genと#sentをフィルタとして使う)。尚、host[4]は以下の手順で加えます:




レポート提出期限:

2回の実験を1つのレポートとして提出する。2 回目の実験が終了してから1 週間後(つまり、次のテーマの情報工学実験IV が行われる日)の17:00までに、WingNet(学生用ポータルサイトBeNeFITの中の業務支援を選択) を使って提出して下さい。また、レポートはWord を使って作成して下さい。
WingNet の選択画面(1 班の例)は以下の通り。


注意事項:


表紙:

————————–(表紙)—————————
情報工学実験IV
テーマ名: ネットワーク・シミュレーション
情報工学科3 年 組 班
s0xaxxxx 氏名_____
実施日平成 年 月 日、 月 日
提出日平成 年 月 日
—————————————————————

本文:



その他:
OMNeT++に関する質問、OMNeT++について更に多くを知りたい人は種田研究室(C82)へ。