INET Framework for OMNeT++

目次

はじめに
表示されたGUI
さあ、シミュレーションを始めましょう!!
シミュレーションの再実行
赤いフレームは何を意味するのか?
モジュール構造
ARP動作
ARPの始まり
ARP Request
ARPキャッシュ
イーサネットへの送信
ARP Reply
ARP Reply処理
レポート

はじめに

このチュートリアルは、OMNeT++シミュレーション環境で書かれたINETフレームワーク、TCP/IPやインターネットプロトコルのシミュレーションモデルに習熟するためのものである。

このチュートリアルは、ARPTestシミュレーションに対して書かれている。このシミュレーションを実行するために、初めにINET-OverSim-20101019.gzomnetpp-4.1-src-windows.zipを以下の手順でインストールする(以下では、ユーザ名がjikkenuserの場合を仮定する)。

  1. C:\Users\jikkenuserの下にフォルダsimを作成する。
  2. omnetpp-4.1-src-windows.zipとINET-OverSim-20101019.gzをダウンロードし、フォルダsimに入れる。
  3. omnetpp-4.1-src-windows.zipを右クリックし、すべて展開(T)... | ファイルを下のフォルダに展開する(F): C:\Users\jikkenuser\sim
  4. omnetpp-4.1ファルダにあるmingwenv.cmdをダブルクリックする。
  5. 立ち上がったコマンドプロンプトから次の二つのコマンドを入力しINET-OverSim-20101019.gz (Firefoxでは拡張子がtgz)を展開する。
  6. 次に、コマンドプロンプトから次の二つのコマンドを入力しomnetpp-4.1をコンパイルする(少し時間がかかる)。
  7. コマンドプロンプトで、INET-OverSim-20101019をコンパイルする。
  8. 次に、コマンドプロンプトから次のコマンドを入力して、OMNeT++ IDEを立ち上げる。
  9. OMNeT++ IDEを使って、動的ライブラリに変更する。
  10. コマンドプロンプトからARPTest simulationを立ち上げる
  11. OMNeT++ Demo Simulationsが立ち上がったら、以下の手順でARP Testを実行する

表示されたGUI

次のアプリケーションが立ち上がっていればOKです。今日はこれらのウインドのみを利用します。

後方のウインドは、OMNeT++/Tkenvウインド(メインウインドウ)です。このウインドを終了するとプログラムがexitします。そのウインドの中の右側の大きなウインドウはシミュレーション実行時のログメッセージを表示します。
左側は、モデルのオブジェクトを表示します。3行のステータスバーがその上にあります。更に、その上にツールバーアイコンがあります。

前側のウインドは、シミュレーションモデルを表します。このウインドをクローズしても、"Inspect network"ツールバーアイコンを押せば、再オープンすることが出来ます。

さあ、シミュレーションを始めましょう!!

ツールバーの "Run" ボタンをクリックして下さい。

最初に見るのは、ノード間で交換される"autoconf"とラベル付けされたメッセージです。これは、イーサネットモデルの自動コンフィグレーション処理です。

自動コンフィグレーションは約1msシミュレーション時間後に終了し、ネットワークシミュレーションが始まります。
シミュレーションでは、クライアント(ラップトップ)がサーバにTCPコネクションの設定を開始しデータストリームを送信します。
ネットワークはイーサネットなので、クライアントはTCP SYNパケットを送信する前にrouter1のMACアドレスを学習するためにARP requestを送信します。


初めに、OMNeT++のアニメーションの使い方を学習します。アニメーション速度はウインドウの最上部にあるスライダを調節することにより速くしたり遅くしたり出来ます。

シミュレーションの終了は、赤い"STOP"アイコンをクリックします。

"Fast"アイコンはアニメーションを停止し、500ms毎にログを更新します
"Express"アイコンは最速でシミュレーションを実行し、1000ms毎にログを更新します。

Expressモードでは、赤い"STOP!"ボタンをクリックすることにより、シミュレーションを止めることが可能です。

メインウインドウの3番目のステータスバーにシミュレーションの速度が表示されます。

Ev/secはCPUが1秒当り実行する平均イベント数です。
Simsec/secは(実世界の)1秒当りシミュレーションの中では何秒進むか(実世界の1秒とシミュレーションの1秒は異なる)を表している。
Ev/simsecはシミュレーションの中で1秒間に発生するイベント数の平均を表している。

シミュレーションの再実行

Expessモードで実行すると、以下のダイアログが現れるでしょう:

"No more events"はシミュレーションが正常に終了したことを表しています。

シミュレーションはSimulateメニューの"Rebuild network"コマンドを使って再実行出来ます。

基本事項の説明を終えて、シミュレーションの解説に戻ります。

赤いフレームは何を意味するのか?

(スクリーンショットのrouter1の周りの)赤いフレームは、次のイベントの位置を指している。

モジュール構造

中を見るために、一つのノード(クライアント、サーバ、またはルータ)をダブルクリックする。

クライアントモデル(左の図)の主な構成要素は以下の通り:

このように、ダブルクリックすると複数のサブモジュールが現れるモジュールを合成モジュールと呼ぶ。
tcpをダブルクリックすると、次のようなウインドが開く。

このウインドは、tcpがC++で実装され、これ以上分解出来ないことを表している。このようなモジュールをシンプル・モジュールと呼ぶ。
このウインドはC++のオブジェクトを表示している。

ここからは、arpモジュールに焦点を当てる。

ARP動作

GUI上で最初のARPの動作が始まるのは、イーサネットのautoconfigメッセージのやり取りが終わった後である。
これらのやり取りを素早く通過するには、"Run until..."アイコンを使うとよい。

シミュレーションを再開始 (Simulate|Rebuild network)後、ツールバーの"Run until..."をクリックします。
autoconfigはおよそ1msシミュレーション時間で終了し、最初のARP requestがおよそ1sなので、Run untilダイアログには2msを入れれば良い。

OKをクリックすると、ラップトップ(クライアント)の周りに赤いフレームが現れ、ステータスバーの再上位ラインにクライアントで起きる次のイベントが表示される。"scheduled-events"(メインウインドの左側)のオブジェクトツリーをオープンすると、イベントが一つだけあり、それがクライアントアプリケーション(client.tcpApp[0])で起きることがわかる。

クライアントをダブルクリックし、内部を表示します。更に、network layerをダブルクリックしその内部を表示します。
メインウインドのツールバーの"Step"を押すとイベントが1つ実行されて停止します。すると、アプリケーションがTCPにコネクションをオープンするように要求します(緑色の丸)。
続いて"Step"を押すと、TCPはSYN(TCPコネクション要求)パケットをnetwork layerに送ります。
更に"Step"を押すと、IPはrouting Tableを参照してパケットの宛先インタフェースをeth0に決定します。さらに、宛先(192.168.0.1)のイーサネットのMACアドレスが不明であるためMACアドレスを取得する(この動作をARPアドレス解決と呼ぶ)ためにIPデータグラムはARPに送られます。

ここからARPが始まります。次のイベント番号が #94(メインウインドの再上位ステータスバーに表示されている)であることをメモすると良いでしょう。
"Run until..."ダイアログを使って94を入れれば、直ぐにここに来ることが出来ます。

ARPの始まり

arpモジュールはログを残し、何が起きているかを表示します。ログメッセージはメインウインドに現れます。しかし、他のモジュールも同じウインドにログを書込むため探すのが大変です。arpのメッセージのみを含むウインドをオープンするには、arpモジュールを右クリックし、メニューから"Inspect Module output"を選択します。すると、"(ARP)ARPTest.client.networkLayer.arp"とタイトルがついた新しいウインドが現れます。これはarpモジュールに関わるイベントのみを表示します。

  

ここで、"Step"を押すと次のイベントが実行され、arpはARP requestを送信します。arpのログが先ほど立ち上げたウインドに表示されます。

arpはIPアドレスをMACアドレスに変換するためにARPキャッシュを利用します。ARPキャッシュには、IPアドレスとMACアドレスの対が登録されています。
もしもARPキャッシュにIPアドレスが登録されていなければ、arpはARP Requestをブロードキャストして近くのホストやルータにそのIPアドレスに対するMACアドレスが何かを尋ねます。これが、シミュレーションで今から行われることです。

ARP Request

ARP Request(赤い丸)をダブルクリックすると、以下のようなARP Requestのウインド(arpREQと表示)が表示されます。

このウインドはARP Requestパケットの中身(opcode, srcMACAddress, destMACAddress, srcIPAddress, destIPAddress)です。
srcMACAddressとsrcIPAddressはラップトップ(クライアント)のMACアドレスとIPアドレスです。
destIPAddressはサーバのIPアドレスです。
destMACAddressが知りたいサーバのMACアドレスです。(わからないので)今は0に設定されています。

ARPキャッシュ

ここで、ARPキャッシュに何があるか見てみよう。
arpモジュールをダブルクリックすると、ウインドが開きます。次に、Contentsを表示します。

コンテンツの最後の行にARPキャッシュ(arpCache)があります。arpCacheの行をダブルクリックするとARPキャッシュの中身が表示されます。
キャッシュの中身はアドレス解決中であることを表しています(192.168.0.1 ==> pending)。

イーサネットへの送信

eth[0]の内部を見るためにダブルクリックします。"Step"ツールバーボタンを押すと、ARP Requestがqueueに入ることが分かります。
更に"Step"を押すと、ARP Requestをイーサネットフレームでカプセル化するためにencapに送られます。
更に"Step"を押すと、encapを通過しmacに到着します。この時点で、ARP Requestはイーサネットフレームにカプセル化されています。
このことは、メッセージ(赤い丸)をダブルクリックするとウインドが開き、宛先アドレス(dest)が全てFFにセットされていることから確認出来ます。


"Step"ボタンを押すと、ARP requestはただちに送信されないで、macの中に留まります。何故直ぐに送信されないのか?メインウインドを見ると、"wait IFG first"と表示があります。IFGはInter-Frame Gapの略でイーサネット標準のフレーム間ギャップを表します。これは、イーサネットハードウェアが受信モードから送信モードに切り替わるために必要な時間です。このシミュレーションでは、IFGの終了がイベントとして扱われます。

再度"Step"ボタンを押すと、EndIFGイベントが処理され、イーサネット上にデータが送信されます。macモジュールが黄色に変わり送信が進行中であることを示しています。また、ARP requestがrouter1に送信されます。

イーサネットフレームを伝送するための時間とケーブルを伝搬する時間は無視できません。従って、シミュレーションでは次の4っつのイベントが順番に実行されます。。

現在macが送信したメッセージ(イーサネットフレーム)は、フレーム送信の始まりを表している。伝送終了は "scheduled-events"にある"EndTransmission (cMessage)"というイベントで通知される。

受信側(router1)では、イーサネットフレームメッセージの受信の開始("start of reception")イベントが発生する。
ステータスバーの最初の行の "next event"フィールドに次のイベントが表示される。

ここで、router1のeth[1]をダブルクリックします。"Step"ボタンを押すと、router1のmacは受信状態に入る(このことを表すために、macが青色に変わる)。

数回"Step"ボタンを押すと、クライアントのmacは伝送を終了します。一方、router1のmacは受信を終了し、受信フレームをencapに渡します。
encapでイーサネットヘッダが剥ぎ取られ、
ARP Requestパケットがarpに渡されます。

ARP Reply

次のイベントで、arpはARP Requestパケットを処理します。
イベント#105まで"Step"ボタンを押す。ここでrouter1のarpのモジュール出力ウインドを開く。

"Step"ボタンを押す。すると、router1のarpはARP RequestのsrcIPAddressとsrcMACAddressをARPキャッシュに追加します。その後、ARP Requestに対して返答するか否かの判断処理が走る。ARP Requestの中のdestIPAddressはrouter1のIPアドレスではない。しかし、proxy ARPがオンになっている(このことは、arpをダブルクリックすれば確認出来る)。proxy ARPでは、もしもルータが宛先IPアドレスへの経路を知っているならば、自分のMACアドレスを(srcMACAddressに)設定してARP Requestに返答しなければいけない。この一連の動作がここで起きる。

arpがARP requestパケットを処理している間、次のような赤く点滅した矢印が現れた。

この矢印は、proxy ARP処理の一部として、IPアドレス192.168.0.1への経路があるか否か確認するためにarpがrouting tableを参照することを表している。

宛先IPアドレスへの経路が分かることが確認できたので、arpはARP replyを返す
ここで、ARP Replyパケット(arpREPLYと表示)を開く(赤い丸をダブルクリックする)。すると、ARP Replyの中身が表示され、srcIPAddressとdestIPAddressが受信したARP Requestパケットと入替っている。更に、srcMACAddressフィールドにはrouter1のeth[1]インタフェースのMACアドレスが設定されている。

何度も"Step"ボタンを押すと、 やがてARP Replyパケットはイーサネットを通過してクライアントのarpに到着する。

ARP Reply処理

クライアントのARP reply処理の結果は次のスクリーンショットで見ることが出来る。
router1のMACアドレスがARPキャッシュに追加されている。キャッシュエントリの"age=0"は必要である。なぜならば、router1が120秒間エントリのソースIPアドレスとMACアドレスを持つパケットを受信しないと、キャッシュから取除かれるためである。


レポート

課題:

  1. ARPアドレス解決では、クライアントのarpはARP Requestを送信しrouter1のarpからのARP Replyを受信します。ARP RequestとARP Replyが通過する全てのシンプルモジュール(モジュール構造)を通過する順に(シーケンス図等で)列挙せよ。(誤りやすい点:イーサネットへの送信)  例:arp -> tcpdump -> queue -> ....
  2. ARP RequestARP Replyパケットの中身を表示せよ(ARP RequestとARP Replyの赤い丸をダブルクリックすればよい)。パケットのスクリーンコピー(Snipping Tool)をレポートに添付せよ 。
  3. クライアントがARP Request送信前とARP Reply受信後のクライアントのARPキャッシュ(arpCache)の中味を表示せよ。また、router1がARP Request受信前とARP Reply送信後のrouter1のARPキャッシュの中味を表示せよ。 ARPキャッシュのスクリーンコピー(Snipping Tool)をレポートに添付せよ 。

レポート提出期限:

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


注意事項:


表紙:

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

本文: