本研究ではNSというネットワークシミュレーターを用いて、無線ネットワークのシミュレート実験を行う。
NSとはその名の通りネットワークをシミュレーションするツールであり、 カルフォルニア大学のバークレイ校で開発された。ネットワークプロトコルの挙動などネットワークの実験を実機で行おうとする際には多くのコンピュータにより、実験用の箱庭ネットワークを構築し、小さな変更を加えながら多くのシナリオを何度も行うことになる。こういった実験には箱庭ネットワークの構築、管理のオーバーヘッドが実験の進行を阻害するという問題点がある。これを解決するためには、疑似的にネットワークをある一台のコンピュータ上でシミュレートするという方法が有効であり、これを実現する実装の一つがNSである。
ネットワークをシミュレートする際には 手軽なネットワークトポロジなどの変更や実際のネットワークに近い実行速度 が重要となる。これを解決するためNSでは、C++とotcl(object tcl)の 2つのプログラミング言語を用いている。C++は実行速度が速いが変更は面倒であり、 一方、otclは実行速度は遅いが変更はとても簡単である。この2つの言語を使い分けることで、状況に応じた設定を記述できる。 NSの動作設定は既に用意されているエージェントクラスを用いることで非常に簡単に書くことができる。このエージェントクラスの実行部分はC++により記述されており、インターフェース部分はotclで書かれている。基本的にノードの配置などはotclにより記述する。あるノードに任意の処理をさせたい場合は新たなエージェントの定義をC++で記述し、そのエージェントをノードに割り当てることで可能になる。
通常、NSのシミュレーションの結果はテキストファイルとして得られるが、NAMというものでシミュレーション結果をアニメーションとしてパケットの動きを観察できる。この機能は直観的にパケットの流れを追うことができると言う点で非常に優れており、プロトコルの勉強をする際には非常に有用なものである。また、全てのノードをシミュレーションするのではなく、実機と組み合わせて、シミュレータによりつくり出したトラフィックを実機に流しこむなどという使いかたもできる。
本研究では以下の設定でシミュレーションを行った。
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」などの拡張仕様が生まれた。
DSDV(Destination Sequenced Distance Vector)は、古典的なBell-Fordルーティングアルゴリズムをもとにした、テーブル駆動型のルーティングプロトコルである。この方式では、モバイルネットワーク内のルータ間でルーティング情報がループしないよう、改良が加えられている。モバイルネットワーク中の各ノードは、同一ネットワーク内の到達可能なすべての宛先とその宛先までのホップ数を記録したルーティングテーブルを管理している。したがって、送信元ノードが経路を必要とするしないに関わらず、常に利用可能なルーティング情報が準備されている。
シーケンス番号方式は、経路が新しいか古いかをモバイルホストが判断するのに使用する。ルーティングテーブルの更新情報は、テーブルの整合性を維持するためにネットワーク全体に定期的に送信される。したがって、ネットワーク中に多くの制御トラフィックを生成してしまい、ネットワーク資源の利用効率を低下させる結果となってしまう。この問題を軽減させるために、DSDVは2種類のルーティング情報更新用パケットを使用する。1つは、フルダンプ(full dump)である。もう1つは、フルダンプより小さな差分(incremental)パケットである。
新しいルーティング情報をブロードキャストする時、宛先ノードのアドレス、宛先までのホップ数、そしてそのブロードキャストの新しい一意なシーケンス番号とともに、宛先についての情報を受信した時のシーケンス番号を格納する。最も新しいシーケンス番号を持つ経路が常に使用される。2つの経路更新情報が同じシーケンス番号を持つ場合、ホップ数の少ない経路を選択する。
AODVとは Ad hoc On-Demand Distance Vectorの略であり、アドホックネットワークにおける主要なルーティングプロトコルである。このプロトコルでは保持しているルーティングテーブルの寿命が短いため発信側が通信する際にはルーティングテーブルが消えている。そのため、OnDemandで経路を計算する。On Demandとは、テーブル駆動型とは異なる、送信元始動によるオンデマンド型のルーティングである。送信元ノードが要求した時にのみ経路を作成し、あるノードにおいて宛先への経路が必要になった時、ネットワーク内で経路探索プロセスを起動する。このプロセスは、経路が見つかるか、利用可能なすべての経路パターンを試し終えると終了する。いったん経路が発見、確立されると、宛先へのアクセスが不可能になるか経路が不必要になるまでは、何らかの手段によってその経路が維持される。
発信側のノードはRREQメッセージをフラッディングし、宛先ノードにRREQメッセージが届くと、宛て先ノードはRREPメッセージというものを発信側ノードに返す。この時にあて先ノードへ向かうルートが確立され、通信ができるようになる。長所としてネットワークトロポジが動的に変化しても対応が迅速であることがあげられる。
ここでは、先程の述べたNSを動かすプログラムではotcl言語を使う。otclの基本構文の特徴について少し説明をする。
otclの特徴としてはシンプルな文法が挙げられる。基本的には行が単位で、行自体はコマンドと、そのコマンドが必要とするアーギュメントをリスト形式(文字列を空白で区切ったもの)で記述するだけである。例えば、 set val 10ではset がコマンドであり、valと10がアーギュメントである。また、コメントは#の後に書き、文を複数行にまたがらせるためには行末に¥を書く。変数に型はなく、宣言不要でsetコマンドにより代入できる。
コマンドには以下のものなどがある
次にリストを記述するための特殊文字{ } " "と、Tclパーサーにリスト要素を前処理させる特殊文字[ ] $ がある。
set address "埼玉県 川越市"
puts $addres
set doller {$}
set answer [expr sin(1.24)*cos(2.8)]
otclはnewコマンドでクラス名を指定するとオブジェクトインスタンスを返す。これをsetコマンドで変数を代入すると、以後、変数、メッセージという構文でオブジェクトにメッセージを送ることができる。NS2ではこれにより、エージェントの動作を指示する。
set ns [new Simulater]
set node [$ns node]
実際に本実験で使用したプログラムを示す
# 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
プログラム中の主な部分を解説する。
今回の実験で用いたAODVは通信エリアをOnDemandに探索するため、ノードの移動に対して有効に働き、常に最適な経路を計算した。そして、通信が切断されても再度、中継ノードを経由して、経路が作成できることがわかった。
また、図8で`xgraph'で実際にグラフにすることにより、中継ノードが増えるごとに伝送速度が落ちていることが確認できた。
一方、DSDVも中継ノードを介して通信を行うことが確認できたが、通信経路の変化には有効ではないことが確認できた。また図11で送信ノードの移動が終わったあとに伝送速度が多少上がっているので、ノードが移動することにより伝送速度が下がることも確認できた。
今後の展望としては、ノードの数を増やし、何通りかの宛て先ノードを作り、どの経路を通って通信を行うかも実験してみたい。また、ノードの移動速度を落として、DSDVの新しいルーティング情報をブロードキャストし、通信経路がどのくらいで作成できるのかも確認したい。
最後に携帯電話の通信をしたかったのだが、通信が複雑で困難だったので断念した。次はぜひとも携帯電話の通信にも挑戦したいと考えている。
最後になりましたが、本稿を作成するにあたり、以下の方にお世話になりました。
皆様の御協力がなくして、この研究はありませんでした。御忙しいなか、自分のために皆様 の貴重なお時間を割いていただきました。厚くお礼申し上げます。