平成17年度卒業研究

NSシミュレーションを使ったモバイルネットワーク

学籍番号 01kc140
渡辺 裕樹

目次

第1章 はじめに

1.1 NSとは

1.2 研究内容

第2章 準備

2.1 IEEE 802.11とは

2.2 DSDVとは

2.3 AODVとは

2.4 otcl言語の基本構文

第3章 シミュレーション実験

3.1  シミュレーションの設定

3.2 シミュレーションプログラム

3.3  シミュレーションの結果

3.3.1  AODVの場合

3.3.2  DSDVの場合

第4章 まとめと今後の展望

参考文献

謝辞

第1章 はじめに

 本研究ではNSというネットワークシミュレーターを用いて、無線ネットワークのシミュレート実験を行う。

1.1 NSとは

 NSとはその名の通りネットワークをシミュレーションするツールであり、 カルフォルニア大学のバークレイ校で開発された。ネットワークプロトコルの挙動などネットワークの実験を実機で行おうとする際には多くのコンピュータにより、実験用の箱庭ネットワークを構築し、小さな変更を加えながら多くのシナリオを何度も行うことになる。こういった実験には箱庭ネットワークの構築、管理のオーバーヘッドが実験の進行を阻害するという問題点がある。これを解決するためには、疑似的にネットワークをある一台のコンピュータ上でシミュレートするという方法が有効であり、これを実現する実装の一つがNSである。

 ネットワークをシミュレートする際には 手軽なネットワークトポロジなどの変更や実際のネットワークに近い実行速度 が重要となる。これを解決するためNSでは、C++とotcl(object tcl)の 2つのプログラミング言語を用いている。C++は実行速度が速いが変更は面倒であり、 一方、otclは実行速度は遅いが変更はとても簡単である。この2つの言語を使い分けることで、状況に応じた設定を記述できる。 NSの動作設定は既に用意されているエージェントクラスを用いることで非常に簡単に書くことができる。このエージェントクラスの実行部分はC++により記述されており、インターフェース部分はotclで書かれている。基本的にノードの配置などはotclにより記述する。あるノードに任意の処理をさせたい場合は新たなエージェントの定義をC++で記述し、そのエージェントをノードに割り当てることで可能になる。

 通常、NSのシミュレーションの結果はテキストファイルとして得られるが、NAMというものでシミュレーション結果をアニメーションとしてパケットの動きを観察できる。この機能は直観的にパケットの流れを追うことができると言う点で非常に優れており、プロトコルの勉強をする際には非常に有用なものである。また、全てのノードをシミュレーションするのではなく、実機と組み合わせて、シミュレータによりつくり出したトラフィックを実機に流しこむなどという使いかたもできる。

1.2 研究内容

 本研究では以下の設定でシミュレーションを行った。


図 1 シミュレーションの動作図

第2章 準備

2.1 IEEE 802.11とは

 IEEE 802.11とはIEEE(米国電気電子学会)でLAN技術の標準を策定している802委員会が1998年7月に定めた無線LANの標準規格群のことである。電波無線方式と赤外線方式とあり、それぞれ規定されている。初期のIEEE802.11ではチャネルビットレート(通信速度)が2Mbpsであったが、後に2.4GHz帯上で11Mbpsの伝送速度を実現する「IEEE 802.11b」や、5.2GHz帯の無線で約54Mbpsの通信を行なう仕様である、「IEEE 802.11a」、またIEEE 802.11bの上位規格で、IEEE 802.11bと同じ2.4GHz帯を使用して約54Mbpsの伝送速度で行う「IEEE 802.11g」などの拡張仕様が生まれた。

2.2 DSDVとは

 DSDV(Destination Sequenced Distance Vector)は、古典的なBell-Fordルーティングアルゴリズムをもとにした、テーブル駆動型のルーティングプロトコルである。この方式では、モバイルネットワーク内のルータ間でルーティング情報がループしないよう、改良が加えられている。モバイルネットワーク中の各ノードは、同一ネットワーク内の到達可能なすべての宛先とその宛先までのホップ数を記録したルーティングテーブルを管理している。したがって、送信元ノードが経路を必要とするしないに関わらず、常に利用可能なルーティング情報が準備されている。

 シーケンス番号方式は、経路が新しいか古いかをモバイルホストが判断するのに使用する。ルーティングテーブルの更新情報は、テーブルの整合性を維持するためにネットワーク全体に定期的に送信される。したがって、ネットワーク中に多くの制御トラフィックを生成してしまい、ネットワーク資源の利用効率を低下させる結果となってしまう。この問題を軽減させるために、DSDVは2種類のルーティング情報更新用パケットを使用する。1つは、フルダンプ(full dump)である。もう1つは、フルダンプより小さな差分(incremental)パケットである。

 新しいルーティング情報をブロードキャストする時、宛先ノードのアドレス、宛先までのホップ数、そしてそのブロードキャストの新しい一意なシーケンス番号とともに、宛先についての情報を受信した時のシーケンス番号を格納する。最も新しいシーケンス番号を持つ経路が常に使用される。2つの経路更新情報が同じシーケンス番号を持つ場合、ホップ数の少ない経路を選択する。

2.3 AODVとは

 AODVとは Ad hoc On-Demand Distance Vectorの略であり、アドホックネットワークにおける主要なルーティングプロトコルである。このプロトコルでは保持しているルーティングテーブルの寿命が短いため発信側が通信する際にはルーティングテーブルが消えている。そのため、OnDemandで経路を計算する。On Demandとは、テーブル駆動型とは異なる、送信元始動によるオンデマンド型のルーティングである。送信元ノードが要求した時にのみ経路を作成し、あるノードにおいて宛先への経路が必要になった時、ネットワーク内で経路探索プロセスを起動する。このプロセスは、経路が見つかるか、利用可能なすべての経路パターンを試し終えると終了する。いったん経路が発見、確立されると、宛先へのアクセスが不可能になるか経路が不必要になるまでは、何らかの手段によってその経路が維持される。

 発信側のノードはRREQメッセージをフラッディングし、宛先ノードにRREQメッセージが届くと、宛て先ノードはRREPメッセージというものを発信側ノードに返す。この時にあて先ノードへ向かうルートが確立され、通信ができるようになる。長所としてネットワークトロポジが動的に変化しても対応が迅速であることがあげられる。

2.4 otcl言語の基本構文

 ここでは、先程の述べたNSを動かすプログラムではotcl言語を使う。otclの基本構文の特徴について少し説明をする。

otclの特徴としてはシンプルな文法が挙げられる。基本的には行が単位で、行自体はコマンドと、そのコマンドが必要とするアーギュメントをリスト形式(文字列を空白で区切ったもの)で記述するだけである。例えば、 set val 10ではset がコマンドであり、valと10がアーギュメントである。また、コメントは#の後に書き、文を複数行にまたがらせるためには行末に¥を書く。変数に型はなく、宣言不要でsetコマンドにより代入できる。

 コマンドには以下のものなどがある

  1. otclがあらかじめ提供しているコアコマンド。
     例えば代入文であるset,if文,for文,リストを数式で計算するexprなどがあげられる。
  2. ユーザーがC++などで作成したもの
  3. 複合コマンドとしてのプロシージャ
     proc 名前{引数リスト}{プロージャーの内容}で定義する。プロージャー内の変数は基本的にすべてローカル変数だが、変数をglobal宣言をするとグローバル変数にアクセスできる。

 次にリストを記述するための特殊文字{ } " "と、Tclパーサーにリスト要素を前処理させる特殊文字[ ] $ がある。

  1. 通常は空白が区切り文字であるが、リストを " "で挟むとひとつの要素になる(ブランクやタブが単なる文字扱いとなる)。
    
     set   address "埼玉県 川越市"
    
  2. $が文字列中に現れると、$に続く文字列が変数とみなされ、その値に置き換えられる(変数置換)。
    
     puts $addres
    
  3. 同様にリストを{ }で挟んでも一つの要素になる。ブランクやタブが単なる文字扱いとなるだけではなく、[ ] $ も単なる文字扱いとなり、下記の置換子の機能が働かなくなる。
    
     set doller {$}
    
  4. リストを[ ]で挟むと、コマンドラインとみなされ、その実行結果に置き換えられる(コマンド置換)。
    
      set   answer [expr sin(1.24)*cos(2.8)]
    

 otclはnewコマンドでクラス名を指定するとオブジェクトインスタンスを返す。これをsetコマンドで変数を代入すると、以後、変数、メッセージという構文でオブジェクトにメッセージを送ることができる。NS2ではこれにより、エージェントの動作を指示する。


 set ns [new Simulater]
 set node [$ns node]

第3章 シミュレーション実験

3.1 シミュレーションの設定


図 2 ノード配置図
  • 時刻10にノード0とノード1が802.11上でFTP通信を始めようとする。
  • 時刻15にノード0が右に移動し始める。ルーティングプロトコルによりノードは他の通信を中継する。移動による経路の変化を観察する。
  • 同条件でルーティングプロトコルをAODVとDSDVの2つをそれぞれシュミレーションし、ルーティングプロトコルの比較をする。
  • 3.2 シミュレーションプログラム

      実際に本実験で使用したプログラムを示す

    
    # A 3-node example for ad-hoc simulation with DSDV
    
    # Define options
    
    # It is (D) from here
    set val(chan)         Channel/WirelessChannel  ;# channel type
    set val(prop)         Propagation/TwoRayGround ;# radio-propagation model
    set val(netif)        Phy/WirelessPhy          ;# network interface type
    set val(mac)          Mac/802_11               ;# MAC type
    set val(ifq)          Queue/DropTail/PriQueue  ;# Interface queue type
    set val(ll)           LL                       ;# Link layer type
    set val(ant)          Antenna/OmniAntenna      ;# Antenna type
    set val(ifqlen)       50                       ;# max packet in ifq
    set val(rp)           AODV                     ;# routing protocol
    set val(nn)           6                        ;# number of mobilenodes
    set val(x)            1000                     ;# x dimension of topography
    set val(y)            600                      ;# y dimension of topography
    set val(stop)         150                      ;# time of simulation end
    # It is (D) to here
    
    # It is (E) from here
    set ns     [new Simulator]
    set tracefd       [open simple.tr w]
    set windowVsTime2 [open win.tr w]
    set namtrace      [open simwrls.nam w]
    
    $ns  trace-all $tracefd 
    $ns  namtrace-all-wireless $namtrace $val(x) $val(y)
    # It is (E) to here
    
    # set up topography object
    set topo	[new Topography]
    
    $topo load_flatgrid $val(x) $val(y)
    
    create-god $val(nn)
    
    
    # Create nn mobilenodes [$val(nn)] and attach them to the cannel.
    
    # It is (F) from here
    # configure the nodes
            $ns  node-config -adhocRouting $val(rp) \
                              -llType $val(ll) \
                              -macType $val(mac) \
                              -ifqType $val(ifq) \
                              -ifqLen $val(ifqlen) \
                              -antType $val(ant) \
                              -propType $val(prop) \
                              -phyType $val(netif) \
                              -channelType $val(chan) \
    		          -topoInstance $topo \
                              -agentTrace ON \
                              -routerTrace ON \
                              -macTrace OFF \
                              -movementTrace ON 
    # It is (F) to here
    
    for {set i 0} {$i < $val(nn) } {incr i} {
    set node_($i) [$ns  node ]
    } 
    
    # It is (G) from here
    # Provide initial location of mobilenodes
    
    # It is (B) from here
    $node_(0) set X_ 10.0
    $node_(0) set Y_ 5.0     
    $node_(0) set Z_ 0.0
    # It is (B) to here
    
    $node_(1) set X_ 50.0
    $node_(1) set Y_ 385.0
    $node_(1) set Z_ 0.0
    
    $node_(2) set X_ 150.0
    $node_(2) set Y_ 200.0
    $node_(2) set Z_ 0.0
    
    $node_(3) set X_ 400.0
    $node_(3) set Y_ 200.0
    $node_(3) set Z_ 0.0
    
    $node_(4) set X_ 600.0
    $node_(4) set Y_ 350.0
    $node_(4) set Z_ 0.0
    
    $node_(5) set X_ 750.0
    $node_(5) set Y_ 200.0
    $node_(5) set Z_ 0.0
    # It is (G) to here
    
    # Generation of movements
    # It is (C) from here
    $ns  at 10.0 "$node_(0) setdest 950.0 5.0 8.0"  
    # It is (C) to here
    
    # It is (A) from here
    # Set a TCP connections between node_(0) and node_(1)
    set tcp [new Agent/TCP/Newreno]
    $tcp set class_ 2
    set sink [new Agent/TCPSink]
    $ns  attach-agent $node_(0) $tcp
    $ns  attach-agent $node_(1) $sink
    $ns  connect $tcp $sink
    set ftp [new Application/FTP]
    $ftp attach-agent $tcp
    $ns  at 10.0 "$ftp start" 
    # It is (A) to here
    
    # Printing the window size
    proc plotWindow {tcpSource file} {
    global ns
    set time 0.01
    set now [$ns now]
    set cwnd [$tcpSource set cwnd_]
    puts $file "$now $cwnd"
    $ns at [expr $now+$time] "plotWindow $tcpSource $file" }
    $ns at 10.1 "plotWindow $tcp $windowVsTime2"
    
    # Define node initial position in nam
    for {set i 0} {$i < $val(nn)} {incr i} {
    # 30 defines the node size for nam
    $ns  initial_node_pos $node_($i) 30
    }  
    
    # Tell nodes when the simulation ends
    for {set i 0} {$i < $val(nn) } {incr i} {
        $ns  at $val(stop) "$node_($i) reset";
    }
    
    # It is (H) from here
    # ending nam and the simulation
    $ns  at $val(stop)  "$ns nam-end-wireless $val(stop) "
    $ns  at $val(stop)  "stop"
    $ns  at 150.01 "puts \"end simulation\" ; $ns  halt"
    
    proc stop {} {
        global ns  tracefd namtrace
        $ns flush-trace
        close $tracefd
        close $namtrace
    }
    # It is (H) to here
    
    $ns run   
    

     プログラム中の主な部分を解説する。

    (A)
    時刻10.0からnode_(0)からnode_(1)へFTP(TCP)通信が始まる。2つのノード間のトラフィックフローを定義している。node_(0)をソースとして2つのノード間にTCPコネクションを張っている。
    (B)
    同じく時刻10.0である程度でnode_(0)は座標(10.0,5.0,0.0)から
    (C)
    座標(950,5.0,0.0)へ動きだす。  なお、node_(0)からnode_(1)へ必ず通信ができるわけではないが、直接通信できない時は、中継ノードがあればそれを介して通信を行うことになる。 モーバイルノードは, リンク層(LL), インターフェイスキュー(IfQ), MAC層, 無線チャネルノード送信, 信号受信, などのネットワークコンポーネントから構成される。 無線シミュレーションで必要となるネットワークコンポーネントそれぞれの型を定義する必要がある。
    (D)
    アンテナの形式, 電波伝搬モデル, モバイルノードで使われるアドホックルーティングの方式等、 コネクションパターン, ノード移動ファイル, トポロジ境界のx, y座標, 乱数発生器用の初期値, シミュレーションを停止する時刻を定義している。ここではアドホックルーティングプロトコルとしてAODV(Ad-hoc ON Demand Distance Vector)を使う。
    (E)
    シミュレータオブジェクトのインスタンスであるnsを作った後に, 無線用のトレースファイルであるsimple.trをオープンする。 同様に、 nam用のトレースファイルの設定をする。 ノードを作る前にノードの設定が必要である。
    (F)
    ノードの設定のAPIを定義している。 アドレッシング(フラット/階層 など)の形式, アドホックルーティングプロトコル, リンク層, MAC層, IfQなどの形式の定義から構成される。
    (G)
    モバイルノードを生成し、6つのノードに初期座標を与えている。
    (H)
    シミュレーションが終わる時刻を定義して、 モーバイルノードにノード内のネットワークコンポーネントを実際にリセットするための指示を与えている。

    3.3 シミュレーションの結果

    3.3.1 AODVの場合

    1. 時刻10にノード0はノード2を介してノード1と通信する。直接通信できないので、中継ノードがあればそれを介して通信を行っている。OnDemandで経路を計算し、通信経路が確立されている。

      図3 ノード2を介した通信
    2. 同じく時刻10からノード0が右に移動し、ノード2で通信を中継できなくなるのでRREQメッセージのフラッディングにより、ノード3に切り換えて通信経路を確立する。

      図4 ノード3に切り換えた後の通信
    3. ノード3、4、5ともにノード0と離れているので通信が途絶えてしまう。RREQフラッディングを行っても、相手ノードからRREPメーセージが返ってこないので、ルートを確立できない。

      図5 通信の切断
    4. 通信切断後、ノード0が右に移動し続け、ノード5を介して再度通信を再開する。RREQフラッディングを行っているので、宛て先ノードからRREPメーセージが返ってくることにより、通信経路を確立できている。

      図6 通信の再開
    5. ここで、シミュレーション結果を`xgraph'というプロットプログラム用いて、実際にグラフにしめす。

      図7 AODV実験結果のウインドウサイズのグラフ

    3.3.2 DSDVの場合

    1. 時刻10にノード0はノード2を介してノード1と通信する。モバイルネットワーク中の各ノードは、ルーティングテーブルを管理している。したがって、直接通信できなくても、中継ノードがあればそれを介して通信を行える。

      図8 ノード2を介した通信
    2. 時刻15にノード0が右に移動する。時刻には通信が途絶えてしまう。新しいルーティング情報をブロードキャストする時、宛先についての情報を受信した時のシーケンス番号を格納するわけだが、常に情報が変化し、時間内に対応しきれていない。

      図9 通信の切断
    3. 以降、通信が再開されることなく通信を終える。

      図10 通信の切断後のシミュレート状況
    4. `xgraph'を用いて、グラフにしめす。

      図11 DSDV実験結果のウインドウサイズのグラフ

    第4章 まとめと今後の展望

     今回の実験で用いたAODVは通信エリアをOnDemandに探索するため、ノードの移動に対して有効に働き、常に最適な経路を計算した。そして、通信が切断されても再度、中継ノードを経由して、経路が作成できることがわかった。
     また、図8で`xgraph'で実際にグラフにすることにより、中継ノードが増えるごとに伝送速度が落ちていることが確認できた。
     一方、DSDVも中継ノードを介して通信を行うことが確認できたが、通信経路の変化には有効ではないことが確認できた。また図11で送信ノードの移動が終わったあとに伝送速度が多少上がっているので、ノードが移動することにより伝送速度が下がることも確認できた。
     今後の展望としては、ノードの数を増やし、何通りかの宛て先ノードを作り、どの経路を通って通信を行うかも実験してみたい。また、ノードの移動速度を落として、DSDVの新しいルーティング情報をブロードキャストし、通信経路がどのくらいで作成できるのかも確認したい。
     最後に携帯電話の通信をしたかったのだが、通信が複雑で困難だったので断念した。次はぜひとも携帯電話の通信にも挑戦したいと考えている。

    参考文献

    1. Eitan Altman and Tania Jimenez "NS Simulatator for beginners"    Univ. de Los Andes, Merida, Venezeula  And ESSI, Sophia-Antipolis,France(2003-2004)  
    2. kensuke "ns-2に関するメモ"  http://www.kensuke.org/ns/index.html

    謝辞

    最後になりましたが、本稿を作成するにあたり、以下の方にお世話になりました。