図1は、実施形態に係る通信方法の例を示す図である。図1は、ノードa〜eとゲートウェイ装置(GW)の6つのノード装置が参加しているアドホックネットワークの例を示す。図1では、理解しやすくするために、互いに隣接するノード装置を実線で結んでいる。ここで、あるノード装置に「隣接する」ノード装置は、あるノード装置から送信されたフレームを受信することができる範囲内に位置するノード装置のことを指すものとする。また、あるノード装置から送信されたフレームを受信できる範囲に位置するノード装置のことを、そのノード装置の「隣接ノード装置」と記載することがある。
アドホックネットワークに含まれる各ノード装置は、経路情報フレームを送受信することにより、経路情報を取得する。経路情報フレームは、経路情報フレームの送信元のノード装置がフレームを送信することができる宛先のノード装置の識別子と、宛先のノード装置ごとの転送先のノード装置の識別子を含む。つまり、経路情報フレームの送信元のノード装置10は、経路情報フレームを用いて、フレームの最終的な宛先別にフレームの転送先を、隣接ノードに通知する。
以下、図1に示すアドホックネットワークで行われる経路情報の取得方法の例について説明する。ここでは、ノードaは、GWとの間での経路情報フレーム5の送受信により、ノードaがGWに隣接していることを認識しているものとする。
(A1)ノードaは、経路情報フレーム5aを用いて、GW宛にフレームを送信できることと、GW宛のフレームの転送先はGWであることを、隣接ノード装置に通知する。
(A2)ノードbは、ノードaから経路情報フレーム5aを受信すると、ノードb、ノードa、ノードaから通知された転送先を経由して最終的な宛先に至る経路にループが含まれるかを判定する。ここで、ノードaから通知された転送先と最終的な宛先が一致する場合は、ノードaが最終的な宛先に隣接していることを意味する。このため、Helloフレームで通知された転送先と最終的な宛先が一致しても、ループとは判定されない。
ノードaから通知された経路情報を用いると、ノードb、ノードa、GWの順にフレームが転送されるので、経路中にループが発生しない。そこで、ノードbは、GW宛のフレームをノードaに転送することができると判定する。ノードbは、ノードaから通知された情報をルーティングテーブル22bに記録する。ルーティングテーブル22bにおいて、「GD」はグローバル宛先(Global Destination)を表し、「LD」はローカル宛先(Local Destination)を表す。ここで、「グローバル宛先」は、フレームの最終的な宛先を指す。また、「ローカル宛先」は、フレームを最終的な宛先に送信するために行われる1ホップの転送の際に、宛先として指定されるノード装置のことを指す。従って、経路情報フレームは、グローバル宛先(GD)ごとに、経路情報フレームを生成したノード装置がフレームの転送先とするローカル宛先(LD)を通知しているといえる。なお、「LD1」は、ローカル宛先のうちで転送先として優先的に選択されるノード装置10を指すものとする。
(A3)次に、ノードbは、経路情報フレーム5bを用いて、ノードbがGW宛のフレームをノードaに転送することを隣接ノード装置に通知する。
(A4)ノードcは、ノードbから受信した経路情報フレーム5b中の情報を用いて、ノードc、ノードb、ノードaを経由してGWに至る経路にループが含まれるかを判定する。ノードcは判定対象の経路にループを発見しないので、GW宛のフレームをノードbに転送することができると判定する。そこで、ノードcは、ルーティングテーブル22cに示す情報を記録する。
(A5)次に、ノードcはルーティングテーブル22cに示す情報を用いて、ノードcがGW宛のフレームをノードbに送信することを、図1中の経路情報フレーム5cを用いて隣接ノードに通知する。
(A6)ノードbは、ノードcの隣接ノードなので、経路情報フレーム5cを受信する。そこで、ノードbは、ノードcから受信した経路情報を用いてノードbからGW宛のフレームを送信した場合の経路にループが発生するかを判定する。この場合、判定対象の経路は、ノードb、ノードc、ノードbの順にノード装置を経由してGWに到達するので、ループを含んでいる。そこで、ノードbは、ノードbがGW宛のフレームをノードcに送信すると、ノードcとノードbの間でループが発生すると判定し、ルーティングテーブル22bにはノードcから通知されたGWへの経路を記録しない。
(A7)その後、ノードbがGW宛のフレームを送信しようとするとき、ノードbは、ルーティングテーブル22bを参照して転送先を決定する。ここで、ルーティングテーブル22bには、GWをグローバル宛先とするフレームの転送先の候補としてはノードcが記録されていないので、ノードbはノードcにフレームを送信しない。ノードbからGWに宛てたフレームは、ノードbとノードcの間のループ経路を経由しないので、ノードbとノードcの間のリンクは、他の通信に使用され得る。
このように、実施形態に係る通信方法では、経路情報フレーム5を受信したノード装置は、ループを含むことが検出できた経路をフレームの送信に使用しないため、ネットワーク中の通信が効率化される。
なお、ここでは、ノードbの動作を例として説明したが、ノードaもノードbと同様に通知された経路にループが含まれているかを判定する。従って、手順(A3)でノードbから送信された経路情報フレーム5bを受信したノードaは、ノードbにGW宛のフレームを送信するとノードaに戻ってくると判定するので、ノードbから通知されたGW宛の経路を記憶しない。
<装置構成>
以下、経路情報フレームとしてHelloフレームが使用される場合を例として説明する。なお、経路情報フレームは、複数のノード装置の間でネットワークの経路情報を共有するために使用される任意のフレームとすることができ、Helloフレームは、経路情報フレームの例である。
図2は、ノード装置10の構成の例を示す。ノード装置10は、フレーム受信部11、フレーム情報解析部12、経路情報処理部13、アプリケーション処理部14、Helloフレーム生成部15、転送処理部16、フレーム送信部17、記憶部20を備える。記憶部20は、リンクテーブル21とルーティングテーブル22を有する。さらに、記憶部20は、フレーム情報解析部12、経路情報処理部13、アプリケーション処理部14、Helloフレーム生成部15、転送処理部16の処理で使用するデータを保持することができる。
フレーム受信部11は、ノード装置10に送信されてきたフレームを受信する。フレーム受信部11は、受信したフレームをフレーム情報解析部12に出力する。フレーム情報解析部12は、入力されたフレームに含まれているアドホックヘッダ中のフレームタイプフィールドを確認する。フレームタイプフィールドの値は、フレームの種類によって異なり、例えば、Helloフレームとデータフレームでは、異なる値となっている。フレーム情報解析部12は、予め、ノード装置10が受信する可能性があるフレームの種類の各々に対応するフレームタイプフィールドの値を記憶することができ、また、適宜、記憶部20から取得することもできる。フレーム情報解析部12は、Helloフレームを経路情報処理部13に出力し、データフレームをアプリケーション処理部14に出力する。
経路情報処理部13は、Helloフレームから、Helloフレームを生成したノード装置10に割り当てられたアドレス、グローバル宛先アドレスとローカル宛先アドレスの組み合わせを取得する。経路情報処理部13は、自ノードからHelloフレームの送信元と、組み合わせ中のローカル宛先を経由してグローバル宛先に至る経路にループが含まれているかを判定する。経路情報処理部13は、組み合わせに含まれているローカル宛先アドレスが自ノードに割り当てられたアドレスではない場合、経路中にループが含まれないと判定する。そこで、経路情報処理部13は、グローバル宛先アドレスにHelloフレームの送信元を対応付けてルーティングテーブル22に記録する。一方、ローカル宛先アドレスが自ノードに割り当てられたアドレスと一致すると、経路情報処理部13は、経路中にループが含まれると判定する。この場合、経路情報処理部13は、ローカルアドレスとグローバルアドレスの組み合わせに基づいてルーティングテーブル22を更新しない。なお、組み合わせに含まれているローカル宛先アドレスとグローバル宛先アドレスが一致することも有り得る。組み合わせに含まれているローカル宛先アドレスとグローバル宛先アドレスが一致することは、Helloフレームの送信元は、グローバル宛先が割り当てられたノード装置10に隣接していることを示す。このため、組み合わせ中のローカル宛先アドレスとグローバル宛先アドレスが一致しても、経路情報処理部13は、ループが含まれるとは判定しない。
経路情報処理部13は、ルーティングテーブル22に加えて、リンクテーブル21も更新する。経路情報処理部13は、Helloフレームの受信間隔の測定、Helloフレームの受信強度の測定、Helloフレームの送信元との間のリンクの状況を示す値(復路リンク重み)の計算なども行う。ここで、経路情報処理部13が計算する復路リンク重みは、Helloフレームの送信元から自ノードに向けた方向でのリンクの状況を示す。例えば、復路リンク重みは、Helloフレームの受信間隔が理論値に近く、受信強度が大きいほど、小さな値になるように計算される。経路情報処理部13は、Helloフレームの受信間隔、受信強度などをリンクテーブル21に記録する。また。経路情報処理部13は、隣接ノード装置10からHelloフレームで通知された復路リンク重みもリンクテーブル21に記録する。
図3は、リンクテーブル21の例を示す。図3の例では、Helloフレームの受信間隔、受信強度、隣接ノード装置10から通知された復路リンク重みに加えて、データの再送回数もHelloフレームの送信元に対応付けて記録されている。また、受信間隔と受信強度については、それぞれ、平均値と分散値が含まれる。なお、図3では、Helloフレームの送信元を、Helloフレームのローカル送信元(Local Source、LS)と表している。「ローカル送信元」とは、フレームが1ホップ転送される場合の転送元のノード装置10である。一方、フレームを生成したノード装置10を「グローバル送信元」(Global Source、GS)と記載することがある。Helloフレームは送信元のノード装置10から1ホップのノード装置10にブロードキャストされるので、Helloフレームの場合、ローカル送信元とグローバル宛先はいずれも、Helloフレームを生成したノード装置10である。
図4(a)は、ルーティングテーブル22の例を示す。ルーティングテーブル22は、1つのグローバル宛先に対して、1つ以上の任意の数のローカル宛先を記録することができる。例えば、図4(a)に示すように、ルーティングテーブル22は、1つのグローバル宛先に対して、3つ以下のローカル宛先を対応付けて記憶することができる。さらに、ルーティングテーブル22は、例えば、経路のホップ数や経路中に含まれる各リンクの受信電波強度などを用いて計算された経路の品質を表す情報を、グローバル宛先とローカル宛先の組合せごとに記録することができる。品質情報の計算方法は、実装に応じて選択される。ルーティングテーブル22の更新方法については後で詳しく説明する。
アプリケーション処理部14は、フレーム情報解析部12から入力されたフレームのうちの自ノード宛のフレームを、アプリケーションにより処理する。一方、フレーム情報解析部12から入力されたフレームのグローバル宛先が他のノード装置10である場合、アプリケーション処理部14は、転送処理部16にフレームを出力する。さらに、アプリケーション処理部14は、予め、Helloフレームの送信周期を記憶している。アプリケーション処理部14は、Helloフレームを生成するタイミングをHelloフレーム生成部15に通知する。
Helloフレーム生成部15は、アプリケーション処理部14からHelloフレームを生成する時刻が通知されると、Helloフレームを生成する。Helloフレームについては、後で詳しく説明する。Helloフレーム生成部15は、Helloフレームをフレーム送信部17に出力する。
転送処理部16は、アプリケーション処理部14から入力されたフレームのグローバル宛先に応じて、ローカル宛先を決定して、アドホックヘッダを生成する。フレームのフォーマットについては後述する。転送処理部16は、ローカル宛先を決定する際に、ルーティングテーブル22を参照する。転送処理部16は、アドホックヘッダを付加したフレームを、フレーム送信部17に出力する。フレーム送信部17は、Helloフレーム生成部15または転送処理部16から入力されたフレームを、フレームのローカル宛先に送信する。例えば、Helloフレームのローカル宛先は隣接する全てのノード装置10であるので、フレーム送信部17は、Helloフレームをブロードキャスト送信する。
図5は、ノード装置10のハードウェア構成の例を示す図である。ノード装置10は、プロセッサ100、バス101(101a〜101c)、タイマIC104、Dynamic Random access Memory(DRAM)106、フラッシュメモリ107、無線モジュール108を備える。ノード装置10は、オプションとして、PHYチップ102を含むことができる。バス101a〜101cは、プロセッサ100、PHYチップ102、タイマIC104、DRAM106、フラッシュメモリ107、および、無線モジュール108を、データの入出力が可能になるように接続する。
プロセッサ100は、MicroProcessing Unit(MPU)などの任意の処理回路である。プロセッサ100は、フラッシュメモリ107に格納されたファームウェアなどのプログラムを読み込んで処理を行う。このとき、プロセッサ100は、DRAM106をワーキングメモリとして使用できる。ノード装置10において、プロセッサ100は、フレーム情報解析部12、経路情報処理部13、アプリケーション処理部14、Helloフレーム生成部15、転送処理部16として動作する。ノード装置10において、DRAM106は、記憶部20として動作し、リンクテーブル21とルーティングテーブル22を保持する。ノード装置10において、無線モジュール108は、フレーム受信部11およびフレーム送信部17として動作する。PHYチップ102は、有線通信に用いられる。アドホックネットワークと他のネットワーク中の装置の間の通信を中継するゲートウェイとして動作するノード装置10では、PHYチップ102を介して回線による通信を行うことができる。
タイマIC104は、Helloフレームを送信する間隔の計測や、隣接するノード装置10からHelloフレームを受信する間隔を計測するときに用いられる。つまり、タイマIC104は、経路情報処理部13やアプリケーション処理部14などの一部として動作する。
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置10にインストールされてもよい。または、プログラムは、ネットワークからPHYチップ102や無線モジュール108を介してダウンロードされることによりノード装置10にインストールされてもよい。また、実施形態に応じて、DRAM106やフラッシュメモリ107以外の他の種類の記憶装置が利用されることがある。また、ノード装置10は、コンピュータによって実現されても良い。
<フレームのフォーマット例>
図6(a)にHelloフレームのフォーマットの例を示す。Helloフレームのアドホックヘッダには、ローカル宛先アドレス、ローカル送信元アドレス、タイプ、フレームサイズなどの情報が含まれている。Helloフレームでは、ローカル宛先アドレスは全ての隣接ノードを表すブロードキャストアドレスに設定される。また、Helloフレームのローカル送信元アドレスは、Helloフレームを生成したノード装置10に割り当てられたアドレスとなる。タイプはフレームの種類を一意に特定できる値である。
図6(a)に示すHelloフレームには、アドホックヘッダの他、圧縮ヘッダ、Helloメッセージヘッダ、Helloヘッダ、署名などの情報も含まれる。圧縮ヘッダは、Helloフレームに含まれているデータの圧縮に関する情報を含む。Helloメッセージヘッダには、Helloヘッダ数が含まれる。Helloヘッダ数は、Helloフレームの送信元のノード装置10がルーティングテーブル22に記憶しているグローバル宛先の数と同数である。
Helloヘッダには、グローバル宛先アドレス、ローカル宛先アドレス、ノードタイプ、ホップ数、死活監視状態情報、経路品質重み、復路リンク重みが含まれる。Helloヘッダ中のローカル宛先アドレスは、同じHelloヘッダ中のグローバル宛先アドレスにフレームを転送するときの転送先となるノード装置10である。Helloフレームの送信元のノード装置10が、Helloヘッダ中のグローバル宛先までの複数の経路を保持している場合、転送に使用される確率が最も高いノード装置10のアドレスがHelloヘッダのローカル宛先アドレスとして記録される。例えば、ノードbからGWまでの経路として、ノードbは、転送先をノードaとする経路と、転送先をノードeとする経路を保持しているとする。ここで、転送先をノードaとする経路の通信状況が、転送先をノードeとする経路の通信状況よりも良好である場合、ノードbは、グローバル宛先がGWであるHelloヘッダ中のローカル宛先アドレスをノードaのアドレスに設定する。以下、ローカル宛先について説明するときに、文字列LDの後に、そのローカル宛先の優先度を表す数字を続けて記載することがある。例えば、ノードbからノードaを経由してGWに至る経路の状況が、ノードbからノードeを経由してGWに至る経路の状況よりも良好な場合、GD=GWの経路では、ノードaがLD1、ノードeがLD2となる。
ホップ数フィールドは、Helloフレームの送信元からHelloヘッダ中のグローバル宛先までのホップ数を記録する。1つのグローバル宛先に対して複数のローカル宛先がある場合、LD1を経由する経路のホップ数がHelloヘッダに記録される。Helloヘッダ中のノードタイプは、Helloヘッダ中のグローバル宛先に指定された装置がゲートウェイとして動作しているかを特定するために使用される。経路品質重みは、経路に含まれている全リンクの通信実績値の和であり、経路の通信品質の計算に用いられる。経路品質重みについても、1つのグローバル宛先に対して複数のローカル宛先がある場合、LD1を経由する経路についての値がHelloヘッダに記録される。復路リンク重みフィールドは、Helloヘッダのグローバル宛先がHelloフレームの送信元の隣接ノードである場合に用いられる。復路リンク重みフィールドは、Helloヘッダのグローバル宛先のノードからHelloフレームの送信元が受信したHelloフレームの受信品質を表す。
図6(b)は、データフレームのフォーマットの例を示す。データフレームは、アドホックヘッダ、データヘッダ、ペイロードを含む。アドホックヘッダに含まれる情報要素は、Helloフレームと同様である。データヘッダには、データフレームのグローバル宛先アドレスと、グローバル送信元アドレスが含まれる。ペイロードには送受信されるデータが記録される。
<第1の実施形態>
図7は、ネットワークの例を示す図である。図8は、第1の実施形態で行われる処理の例を説明するシーケンス図である。以下、図7に示すアドホックネットワークにおいてHelloフレームが送受信される場合に行われる処理の例を説明する。図7の例では、アドホックネットワークは、ネットワーク31に接続されている。ネットワーク31は、サーバ32を含む。アドホックネットワークに参加しているノード装置10は、ネットワーク31とアドホックネットワークとの間のゲートウェイとして動作するノード装置を介して、サーバ32と通信できる。
図7に示すように、ノードaはGWに隣接しているので、ノードaは、グローバル宛先がGWの場合、ローカル宛先をGWに設定する。ノードeは、グローバル宛先がGWの場合、ローカル宛先としてはノードbとノードfを設定できるが、ここでは、ノードfをローカル宛先とする経路の方がノードbをローカル宛先とする経路よりも状況が良い経路であるとする。すなわち、ノードeでは、GD=GWの場合、ノードfがLD1、ノードbがLD2となる。ノードcおよびノードdは、グローバル宛先がGWの場合、ローカル宛先をノードbに設定するものとする。
なお、手順の番号は、図7、図8、および、図10に示す括弧つきの番号に対応しているものとする。また、以下の説明では、動作を行っているノード装置10を明確にするために、符号の最後に動作を行っているノード装置10に割り当てられているアルファベットを記載することがある。例えば、ノードbの中の経路情報処理部13を、「経路情報処理部13b」と表記することがある。
(1)ノードaのアプリケーション処理部14aは、Helloフレーム生成部15aにHelloフレームの生成を要求する。Helloフレーム生成部15aは、以下の情報要素を含むHelloフレームを生成し、フレーム送信部17aを介してブロードキャスト送信する。このため、ノードaは、グローバル宛先がGWのフレームをGWに送信することを、Helloフレームを用いてノードaの隣接ノード装置10に通知できる。
Helloフレームの送信元 :ノードa
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :GW
以下の図で、「Helloフレーム」という文字列の後の括弧中の最初の値は、Helloヘッダ中のグローバル宛先を示すものとする。一方、括弧中の2番目の値は、最初の値で示したグローバル宛先に当てたフレームを転送する際に、Helloフレームの生成元のノード装置10がローカル宛先に指定するノード装置10を示す。
(2)ノードbのフレーム受信部11bは、受信したHelloフレームをフレーム情報解析部12bに出力する。フレーム情報解析部12bは、アドホックヘッダに含まれているタイプの値に基づいて、入力されたフレームがHelloフレームであると判定すると、入力されたフレームを経路情報処理部13bに出力する。経路情報処理部13bは、Helloフレームの送信元について得られた情報をリンクテーブル21bに記録する。例えば、経路情報処理部13bは、手順(1)で受信したフレームを用いて、図3のNo.1の情報をリンクテーブル21bに記録したとする。なお、図3のNo.1に記録されている復路リンク重みは、以前にノードbがブロードキャストしたHelloフレームをノードaが受信したときに計算された値である。従って、図3のNo.1に記録されている復路リンク重みは、ノードbからノードaに向けてフレームが送信されるときのリンクの状況を示す。
経路情報処理部13bは、ノードaからノードbに向けてフレームが送信される場合の復路リンク重みを計算する。復路リンク重みは、Helloフレームの受信間隔の平均値と分散値、Helloフレームの受信強度の平均値と分散値、Helloフレームの送信元へのフレームの再送回数などにより求められる。経路情報処理部13bは、Helloフレームの受信間隔を予め記憶しており、Helloフレームの受信間隔の平均値が予め記憶している受信間隔に近いほど、復路リンク重みの値を小さくする。また、Helloフレームの受信強度の平均値が大きいほど、経路情報処理部13bは、復路リンク重みの値を小さくする。さらに、経路情報処理部13bは、Helloフレームの受信間隔とHelloフレームの受信強度のいずれについても分散値が小さいほど、復路リンク重みの値を小さくする。再送回数は小さいほど、リンク重みの値が小さくなる。
さらに、経路情報処理部13bは、ノードbから、Helloフレームの送信元とHelloヘッダ中のローカル宛先を経由してHelloヘッダ中のグローバル宛先に至る経路にループが含まれているかを判定する。このとき、経路情報処理部13bは、Helloヘッダ中のローカル宛先がノードbであるかによって、ループの有無を判定する。ここでは、Helloヘッダ中のローカル宛先がGWであるので、経路情報処理部13bは、処理対象のHelloヘッダによって通知された経路にはループが含まれていないと判定する。そこで、経路情報処理部13bは、ノードa経由のGWへの経路をルーティングテーブル22に記録する。
また、経路情報処理部13bは、ノードaを経由してGWに至る経路について評価値を計算する。評価値は、Helloヘッダ中の経路品質重みと、Helloフレームの送信元から通知されてきた自ノードに関する復路リンク重みを用いて計算される。経路情報処理部13bは、ノードaから送信されたHelloフレームにGD=ノードbのHelloヘッダが含まれているかを判定する。GD=ノードbのHelloヘッダがHelloフレームに含まれている場合、経路情報処理部13bは、GD=ノードbのHelloヘッダの復路リンク重みと、GD=GWの経路品質重みを用いて、評価値を求める。経路情報処理部13bは、得られた評価値を、ノードbからノードaを経由してGWに至る経路の品質情報とする。経路品質重みが経路の状況が比較的良いことを示す値であり、さらに、Helloフレームの送信元との間のリンクの状況も良好である場合、そのHelloヘッダで通知される経路の状態は比較的良好である。ここでは、評価値、Helloヘッダ中の経路品質重みと、Helloフレームの送信元との間のリンク重みのいずれも、小さい値ほど、経路の状況が良いことを示すものとする。なお、評価値の計算式は実装に応じて任意に決定される。ここでは、経路情報処理部13bは、図4(a)のNo.1−1の経路を記録したものとする。
(3)ノードeのHelloフレーム生成部15eは、アプリケーション処理部14eの要求に応じて、以下のようなLD1を経由する経路の情報をHelloヘッダに含めたHelloフレームを生成する。そこで、ノードeは、グローバル宛先がGWのフレームをノードfに送信することを、ノードeの隣接ノード装置10に通知できる。
Helloフレームの送信元 :ノードe
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :ノードf
(4)ノードbの経路情報処理部13bは、ノードeで生成されたHelloフレームを、手順(2)と同様に取得する。経路情報処理部13bは、Helloフレームの送信元についての情報をリンクテーブル21bに記録する。ここでは、経路情報処理部13bが図3のNo.3の情報をリンクテーブル21bに記録するものとする。
さらに、経路情報処理部13bは、ノードbから、ノードe、ノードfを経由してGWに至る経路にループが含まれているかを判定する。ここで、経路情報処理部13bは、GD=GWのHelloヘッダ中のローカル宛先がノードeであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれないと判定する。経路情報処理部13bは、ノードeを経由してGWにフレームを送信できると判定し、ノードe経由のGWへの経路をルーティングテーブル22に記録する。ここでは、経路情報処理部13bは、図4(a)のNo.1−2の経路を記録するものとする。
(5)ノードcは、LD1を経由する経路の情報をHelloヘッダに含めたHelloフレームを生成する。そこで、ノードcは、以下の情報要素を含むHelloフレームを用いて、グローバル宛先がGWのフレームをノードbに送信することを、ノードcの隣接ノード装置10に通知できる。
Helloフレームの送信元 :ノードc
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :ノードb
(6)ノードbの経路情報処理部13bは、ノードcで生成されたHelloフレームを、手順(2)と同様に取得する。経路情報処理部13bは、Helloフレームの送信元についての情報をリンクテーブル21bに記録する。ここでは、図3のNo.2の情報がリンクテーブル21bに記録されたものとする。
さらに、経路情報処理部13bは、ノードbから、ノードc、ノードbの順にノード装置10を経由してGWに至る経路にループが含まれているかを判定する。ここで、経路情報処理部13bは、Helloヘッダ中のローカル宛先がノードbであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれると判定する。そこで、ループを含む経路を記憶することを避けるため、経路情報処理部13bは、ノードcから受信したHelloフレームに含まれている情報を、ルーティングテーブル22bに記録せずに破棄する。
ノードdもノードcと同様に、グローバル宛先をGW、LD1をノードbに設定したHelloヘッダを含むHelloフレームを生成して、ノードdの隣接ノード装置10に送信する(図7)。ノードbは、ノードdから受信したHelloフレームも、ノードcから受信したHelloフレームと同様に処理する。従って、ノードbが、ノードa、c〜eで生成されたHelloフレームを用いることにより、経路情報処理部13bは、図3に示すリンクテーブル21bと図4(a)に示すルーティングテーブル22bを生成することができる。
(7)経路情報処理部13bは、ルーティングテーブル22bに記録されているローカル宛先について、それぞれの経路の評価値を比較し、評価値が小さい順に優先度を高くする。なお、優先度が高いほど、LDの後に続く数字が小さくなる。
ここでは、経路情報処理部13bは、GWがグローバル宛先である場合、ノードaを転送先とする経路の方が、ノードeを転送先とする経路よりも良好であり、優先度が高いと判定したとする。従って、経路情報処理部13bは、GD=GWの経路について、ノードaをLD1、ノードeをLD2とする。
図9は、各ノード装置10で生成される経路の例を示す。ノードa、c〜e、GWも、図7と図8の手順(1)〜(7)を参照しながら説明したのと同様の方法により、アドホックネットワーク中の各ノード装置10への経路を取得する。図9の例では、ノードa〜fで保持されているルーティングテーブル22から、グローバル宛先がGWの経路についてのローカル宛先を抜粋して示している。
ここで、ノードaは、GWをローカル宛先としてルーティングテーブル22aに記録するが、ノードbをGWへの経路のローカル宛先として記録しない。これは、ノードbがLD1をノードaとしたHelloフレームをブロードキャストするためである。ノードaがノードbから通知された経路を用いると、ノードaはグローバル宛先がGWであるフレームを、ノードaからノードbに送信し、さらにノードbから受信し直してGWに送信することになる。そこで、ノードaは、ノードbから通知されたGWまでの経路を用いてノードaからフレームを送信すると、ループが発生すると判定し、ノードbから受信した経路の情報を破棄する。同様に、ノードfも、ノードfをLD1に設定したGW宛の経路がノードeから通知されるため、ノードeをGW宛の経路のローカル宛先に記録しない。
(8)次に、ノードbのアプリケーション処理部14bは、GW宛のデータを生成したとする。アプリケーション処理部14bは、生成したデータを転送処理部16bに出力する。転送処理部16bは、ルーティングテーブル22bを参照して、以下のようなアドレスの情報を含むデータフレームを生成する。
グローバル送信元 :ノードb
グローバル宛先 :GW
ローカル宛先 :ノードa
ローカル送信元 :ノードb
転送処理部16bは、生成したデータフレームをフレーム送信部17bに出力する。フレーム送信部17bは、図10に示すように、ノードaにデータフレームを送信する。
(9)ノードaのフレーム受信部11aは、ノードbから受信したデータフレームをフレーム情報解析部12aに出力する。フレーム情報解析部12aは、アドホックヘッダのタイプを参照することにより、データフレームをアプリケーション処理部14aに出力する。アプリケーション処理部14aは、グローバル宛先がノードaではないので、転送処理部16aにデータフレームを出力する。転送処理部16aは、ルーティングテーブル22aを参照することにより、データフレームのアドレス情報を以下のように変更する。
グローバル送信元 :ノードb
グローバル宛先 :GW
ローカル宛先 :GW
ローカル送信元 :ノードa
転送処理部16aは、生成したデータフレームをフレーム送信部17aに出力する。フレーム送信部17aは、図10に示すように、GWにデータフレームを送信する。
(10)次に、ノードbが手順(8)と同様にGW宛のデータフレームを生成し、ノードaに送信したとする。
(11)ノードbから手順(10)で送信されたデータフレームを受信する前に、ノードaに障害が発生したとする。
(12)ノードbのアプリケーション処理部14bは、ノードaにデータフレームを送信してから一定の時間以内にデータフレームのGWへの送信が成功したことを確認できない場合、ノードaを経由するGWへの経路に障害が発生したと判定する。そこで、アプリケーション処理部14bは、転送処理部16bに、LD2を使用した経路でのデータフレームの再送を要求する。
(13)転送処理部16bは、ルーティングテーブル22bを参照して、以下のようなアドレスの情報を含むデータフレームを生成する。
グローバル送信元 :ノードb
グローバル宛先 :GW
ローカル宛先 :ノードe
ローカル送信元 :ノードb
転送処理部16bは、生成したデータフレームをフレーム送信部17bに出力する。フレーム送信部17bは、ノードeにデータフレームを送信する。
(14)ノードeは、ノードbから受信したGW宛のフレームを、手順(9)のノードaと同様の処理により、ノードfに送信する。ノードfも、手順(9)のノードaと同様の処理により、フレームをGWに送信する。
このように、図8を参照しながら手順(1)〜(14)で説明した処理により、アドホックネットワーク中のノード装置10のいずれかで障害が発生しても、ループを含まない迂回ルートによってフレームがグローバル宛先に向けて送信される。このため、アドホックネットワーク中の無駄なトラフィックが削減されて、効率的に通信が行われる。図8と図10を参照しながらノードbで生成されたデータフレームの転送の例について説明したが、他のノード装置10で生成されたGW宛のフレームについても同様に処理される。
図11は、ノード装置10に障害が発生したときに行われる転送の例を説明する図である。例えば、図8を参照しながら説明した手順(12)でノードaに障害が発生していることをノードbが検出した後で、ノードdからGW宛のフレームが送信された場合について説明する。なお、図11に示す手順(D1)〜(D4)は、手順(12)の後に行われていれば良く、手順(13)、(14)と並行して行われても良い。
(D1)ノードdのアプリケーション処理部14dがGW宛のデータを転送処理部16dに出力すると、転送処理部16dはルーティングテーブル22dを参照して、グローバル宛先をGW、ローカル宛先をノードbに設定したフレームを生成する。
(D2)ノードbのアプリケーション処理部14bは、フレーム受信部11b、フレーム情報解析部12bを介して、ノードdで生成されたフレームを取得する。アプリケーション処理部14bは、ノードb宛のフレームを受信しなかったと判定すると、フレームを転送処理部16bに出力する。ここで、アプリケーション処理部14bは、ノードaの障害を検出していることも転送処理部16bに通知する。すると、転送処理部16bは、ルーティングテーブル22bではグローバル宛先がGWの場合はLD1がノードaであるが、ノードaにフレームを転送できないと判定する。そこで、転送処理部16bは、LD2であるノードeをローカル宛先に指定することにより、フレームに以下のアドレス情報を付加する。
グローバル送信元 :ノードd
グローバル宛先 :GW
ローカル宛先 :ノードe
ローカル送信元 :ノードb
ノードbは、ノードdから受信したGW宛のフレームをノードeに転送する。
(D3)ノードeのアプリケーション処理部14eは、フレーム受信部11eとフレーム情報解析部12eを介して、フレームを取得する。フレームのグローバル宛先がGWなので、アプリケーション処理部14eは、転送処理部16eにフレームを出力する。転送処理部16eは、ルーティングテーブル22eを参照して、フレームのローカル宛先をノードfに決定する。フレームは、ノードfに転送される。
(D4)ノードfは、ノードeと同様の処理により、ノードeから受信したフレームをGWに送信する。
図12は、転送経路が変更される場合の処理の例を説明するシーケンス図である。図12を参照しながら、ノードaでの障害の発生と、ノードaの復旧に伴って行われる経路の変更の例を説明する。図12の最初の時点でもノードeは、グローバル宛先がGWの場合のLD1をノードf、LD2をノードbに設定しているとする。ノードeが保持するルーティングテーブル22eの例を、図4(b)に示す。また、ノードcは、グローバル宛先がGWのときのLD1がノードbであるものとする。
(21)図11に示すようにノードaに障害が発生すると、ノードbからノードaへのフレームの再送回数が大きくなる。さらに、ノードbはノードaからHelloフレームを受信することができない。再送回数の増大やHelloフレームを受信できないことなどに基づいて、経路情報処理部13bは、リンクテーブル21bを更新する。また、経路情報処理部13bは、ノードbとノードaの間のリンクの状況の悪化に伴って、ノードaを経由する経路についての評価値を更新する。これらの処理により、ノードbからノードaを経由してGWに至る経路の評価値が示す状況の方が、ノードbからノードeを経由してGWに至る経路の評価値が示す状況よりも悪くなったとする。すると、経路情報処理部13bは、グローバル宛先がGWの経路について、LD1をノードe、LD2をノードaに変更する。
ノードaをLD2にした後もノードaが復旧しないと、ノードbとノードaの間のリンクの状況がさらに悪化する。経路情報処理部13bは、ノードbがノードaからHelloフレームを受信できない期間が一定以上になると、リンクテーブル21bからノードaのエントリを削除する。さらに、経路情報処理部13bは、ルーティングテーブル22bからも、ノードaまでの経路の削除や、ノードaをローカル宛先に設定した経路の削除を行う。このため、図12に示すように、ノードbのGD=GWの経路ではLD1がノードeに設定され、LD2の設定が消去される。
(22)ノードbのアプリケーション処理部14bは、Helloフレームを生成する時刻になると、Helloフレーム生成部15bにHelloフレームの生成を要求する。Helloフレーム生成部15bは、以下の情報要素を含むHelloフレームを用いて、グローバル宛先がGWのフレームをノードeに送信することを、ノードbの隣接ノード装置10に通知できる。
Helloフレームの送信元 :ノードb
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :ノードe
(23)ノードeの経路情報処理部13eは、フレーム受信部11eとフレーム情報解析部12eを介して、ノードbで生成されたHelloフレームを取得する。経路情報処理部13eは、ノードbから受信したHelloフレームに含まれる経路にループが含まれているかを判定する。例えば、経路情報処理部13eは、ノードe、ノードb、ノードeの順にノード装置10を経由してGWに至る経路にループが含まれているかを判定する。ここで、経路情報処理部13eは、Helloヘッダ中のローカル宛先がノードeであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれると判定する。
そこで、ループを含む経路を記憶することを避けるため、経路情報処理部13eは、処理対象のHelloヘッダで表される経路の情報が、ルーティングテーブル22eに含まれているかを判定する。ルーティングテーブル22eには、図4(b)に示すように、GD=GW、LD2=ノードbの経路がNo.1−2に記録されている。そこで、経路情報処理部13eは、図4(c)に示すように、GD=GWでLD2=ノードbの経路のエントリを、ルーティングテーブル22eから削除する。すなわち、ノードeは、ノードbがGW宛のフレームの送信に優先的に使用する経路を変更したことにより、ルーティングテーブル22eを変更する。
(24)その後、ノードaが障害から復帰したとする。
(25)ノードbは、手順(22)と同様に、GD=GW、LD1=ノードeの情報を含むHelloフレームを、ノードbの隣接ノード装置10にブロードキャストする。
(26)ノードaの経路情報処理部13aは、ノードbで生成されたHelloフレームを、フレーム受信部11aとフレーム情報解析部12aを介して取得する。経路情報処理部13aは、ノードaから、ノードb、ノードeを経由してGWに至る経路にループが含まれているかを判定する。ここで、経路情報処理部13aは、Helloヘッダ中のローカル宛先がノードeであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれないと判定する。経路情報処理部13aは、ノードbを経由してGWにフレームを送信できると判定し、ノードb経由のGWへの経路をルーティングテーブル22に記録する。
さらに、経路情報処理部13aは、GWからのHelloフレームにより、ノードaがGWに隣接していることも特定する。経路情報処理部13aは、GD=GWのフレームをGWに送信する場合の経路品質と、ノードbに転送する場合の経路の品質を比較する。ここでは、GD=GWのフレームをGWに送信する場合の経路の品質の方が良かったとする。すると、経路情報処理部13aは、GW宛のフレームの送信先をLD1=GW、LD2=ノードbに設定する。
(27)ノードaのアプリケーション処理部14aは、Helloフレームを生成する時刻になると、Helloフレーム生成部15aにHelloフレームの生成を要求する。Helloフレーム生成部15aは、以下の情報要素を含むHelloフレームを用いて、グローバル宛先がGWのフレームをGWに送信することを、ノードaの隣接ノード装置10に通知できる。
Helloフレームの送信元 :ノードa
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :GW
(28)ノードbの経路情報処理部13bは、ノードaから送信されたHelloフレームを用いて、ノードaの情報をリンクテーブル21bに登録する。さらに、経路情報処理部13bは、ノードbからノードaとGWを経由するGWまでの経路にループが含まれるかを判定する。このとき、経路情報処理部13bは、Helloヘッダ中のローカル宛先がノードbではないので、処理対象のHelloヘッダによって通知された経路にはループが含まれていないと判定する。そこで、経路情報処理部13bは、ノードaを経由してGWにフレームを送信できると判定し、ノードa経由のGWへの経路をルーティングテーブル22bに記録する。このとき、既にノードeをLD1としてGWに至る経路がルーティングテーブル22bに登録されているので、ノードaはGWに至る経路のLD2として登録される。
(29)ノードaは、手順(27)と同様にHelloフレームをブロードキャストする。
(30)ノードbの経路情報処理部13bは、ノードaから送信されたHelloフレームを用いて、ノードbとノードaの間の復路リンク重みやHelloフレームの受信に関する観測値を更新する。また、経路情報処理部13bは、リンクの状況の変化に応じて、ルーティングテーブル22bの経路の評価値も更新する。ここで、ノードbとノードaの間で繰り返しHelloフレームを送受信できたことにより、ノードeを経由してGWに至る経路の品質情報よりも、ノードaを経由してGWに至る経路の品質情報のほうが良くなったとする。すると、経路情報処理部13bは、GD=GWのフレームについての設定を、LD1をノードa、LD2をノードeとする。
(31)ノードbのHelloフレーム生成部15bは、アプリケーション処理部14bからの要求により、以下の情報要素を含むHelloフレームを生成する。
Helloフレームの送信元 :ノードb
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :ノードa
すなわち、Helloフレーム生成部15bは、グローバル宛先がGWのフレームをノードaに送信することをノードbの隣接ノード装置10に通知できるHelloフレームを生成する。
(32)ノードaの経路情報処理部13aは、ノードbで生成されたHelloフレームを取得すると、ノードaから、ノードb、ノードaの順にノード装置10を経由してGWに至る経路にループが含まれているかを判定する。ここで、経路情報処理部13aは、Helloヘッダ中のローカル宛先がノードaであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれると判定する。
そこで、ループを含む経路を記憶することを防止するため、経路情報処理部13aは、GD=GWでLD2=ノードbの経路のエントリを、ルーティングテーブル22aから削除する。
(33)ノードeの経路情報処理部13eは、ノードbで生成されたHelloフレームを取得すると、ノードeから、ノードb、ノードaの順にノード装置10を経由してGWに至る経路にループが含まれているかを判定する。ここで、経路情報処理部13eは、Helloヘッダ中のローカル宛先がノードaであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれていないと判定する。そこで、経路情報処理部13eは、ノードbをGW宛の経路のLD2に登録する。
手順(21)〜(33)で説明したように、アドホックネットワーク中のノード装置10は、隣接するノード装置10がグローバル宛先へのフレームの転送経路を変更することにより、ルーティングテーブル22を更新できる。このため、隣接ノード装置10での経路の変更に伴って、ノード装置10がフレームの転送経路を動的に変更することができ、フレームがループを含む経路で転送されることを防止できる。また、障害が起こったノード装置10が復帰すると、経路の状況に応じて、復帰したノード装置10を経由する経路を用いたフレームの転送が再開される。このため、アドホックネットワーク中で効率的にフレームが転送される。
図13は、フレームの転送ができない場合の処理の例を示す。図13に示すアドホックネットワークにおいて、ノードaとノードeの両方に同時期に障害が発生したとする。すると、ノードbは、図12の手順(21)で説明した処理をノードaとノードeの両方に対して行うことにより、ルーティングテーブル22bからGWに至る経路を削除する。その後、ノードdがGWをグローバル宛先としたフレームをノードbに送信したとする。すると、アプリケーション処理部14bは、転送処理部16bにノードdから受信したフレームの転送を要求する。しかし、GWを宛先とした経路がルーティングテーブル22bから削除されているので、転送処理部16bは、フレームを転送できないと判定する。そこで、転送処理部16bは、フレームをローカル送信元に転送する(バックトラック)。ここでは、ノードbがノードdから受信したフレームが、ノードbからノードdに送信される。ノードdは、バックトラック処理が行われたことを検出すると、宛先へのフレームの送信ができないと判定して、処理を終了する。なお、バックトラック処理が行われたことを検出するために、各ノード装置10の転送処理部16では、フレームごとにフレームを識別する識別番号とフレームの転送先を対応付けた情報を保持しているものとする。
図14は、ノード装置10で行われる動作の例を説明するフローチャートである。フレーム情報解析部12は、フレーム受信部11を介して受信したフレームのタイプを判定することにより、受信フレームを振り分ける(ステップS1)。フレーム情報解析部12は、データフレームなど、Helloフレーム以外のフレームをアプリケーション処理部14に出力する。アプリケーション処理部14は、入力されたフレームのグローバル宛先が自ノードであるかを判定する(ステップS2)。アプリケーション処理部14は、自ノード宛のフレームを処理する(ステップS2でYes、ステップS3)。一方、グローバル宛先が自ノードではない場合、アプリケーション処理部14は、フレームを転送処理部16に出力する。転送処理部16は、フレームのグローバル宛先までの経路がルーティングテーブル22に登録されているかを判定する(ステップS2でNo、ステップS4)。フレームのグローバル宛先までの経路がルーティングテーブル22に登録されていない場合、転送処理部16は、フレームのローカル送信元にフレームを送り返す(ステップS4でNo、ステップS5)。フレームのグローバル宛先までの経路がルーティングテーブル22に登録されている場合、転送処理部16は、ローカル宛先を決定し、フレーム送信部17を介してフレームを転送する(ステップS4でYes、ステップS6)。
一方、フレーム情報解析部12は、Helloフレームを経路情報処理部13に出力する(ステップS1でHello受信)。経路情報処理部13は、Helloフレームの受信間隔や受信強度などを用いて、リンク品質を計算する(ステップS7)。経路情報処理部13は、リンクテーブル21を更新する(ステップS8)。さらに、経路情報処理部13は、ルーティングテーブル22を更新する(ステップS9)。
図15はルーティングテーブル22の更新処理の例を説明するフローチャートである。経路情報処理部13は、変数nを1に設定する(ステップS21)。経路情報処理部13は、n番目のHelloヘッダをHelloフレームから抽出する(ステップS22)。経路情報処理部13は、Helloヘッダ中の経路情報のローカル宛先が自ノードであるかを判定する(ステップS23)。
Helloヘッダ中の経路情報のローカル宛先が自ノードではない場合、経路情報処理部13は、処理対象のHelloヘッダで通知された経路がルーティングテーブル22にすでに登録されているかを判定する(ステップS23でNo、ステップS24)。処理対象のHelloヘッダで通知された経路がルーティングテーブル22にすでに登録されている場合、経路情報処理部13は、Helloヘッダで通知された経路の品質情報を更新する(ステップS25)。処理対象のHelloヘッダで通知された経路が登録されていない場合、経路情報処理部13は、ルーティングテーブル22に新たな経路の情報を追加できるかを判定する(ステップS26)。ルーティングテーブル22に新たな経路の情報を追加できる場合、経路情報処理部13は、ルーティングテーブル22に処理対象のHelloヘッダで通知された経路の情報を記録する(ステップS26でYes、ステップS28)。すなわち、経路情報処理部13は、Helloヘッダで通知されたグローバルアドレスをルーティングテーブル22のGDとし、対応するローカル送信先アドレス(LD)をHelloフレームの送信元とする。さらに、経路情報処理部13は、経路の品質情報を登録する。
一方、1つのグローバル宛先に対応付けて登録できるローカル宛先の数の上限まで経路が登録されている場合、ステップS26でNoと判定される。すると、経路情報処理部13は、処理対象のHelloヘッダで通知された経路の通信条件が、ルーティングテーブル22に登録されている経路の通信条件よりも良好であるかを判定する(ステップS27)。処理対象のHelloヘッダで通知された経路の通信条件が、ルーティングテーブル22に登録されている経路の通信条件よりも良好である場合、通知された経路についてステップS28の処理が行われる(ステップS27でYes、ステップS28)。なお、この場合は、ルーティングテーブル22に記録されている経路のうち、最も条件の悪い経路が削除される。ステップS25またはステップS28の処理によりルーティングテーブル22の情報を変更すると、経路情報処理部13は、経路の優先順位を決定する(ステップS29)。一方、処理対象のHelloヘッダで通知された経路の通信条件が、ルーティングテーブル22中の経路の通信条件よりも悪い場合、経路情報処理部13は、Helloヘッダで通知された経路をルーティングテーブル22に登録しない(ステップS27でNo)。
Helloヘッダ中の経路情報のローカル宛先が自ノードである場合、経路情報処理部13は、処理対象のHelloヘッダで通知された経路がルーティングテーブル22にすでに登録されているかを判定する(ステップS23でYes、ステップS30)。ここで、経路情報処理部13は、HelloヘッダのGDであるノード装置10への転送先として、ルーティングテーブル22において、Helloフレームの送信元が含まれているかを判定する。HelloヘッダのGDへの転送先にHelloフレームの送信元が含まれている場合、経路情報処理部13は、その経路をルーティングテーブル22から削除する(ステップS30でYes、ステップS31)。
ステップS21〜S31の処理が終わると、経路情報処理部13は、Helloフレームに含まれている全てのHelloヘッダを処理したかを判定する(ステップS32)。全てのHelloヘッダを処理していない場合、経路情報処理部13は、nの値を1つインクリメントして、ステップS22以降の処理を繰り返す(ステップS32でNo、ステップS33)。一方、全てのHelloヘッダの処理が終わると、経路情報処理部13は処理を終了する(ステップS32でYes)。
第1の実施形態によると、図8を参照しながら説明した処理により、アドホックネットワーク中のノード装置10のいずれかで障害が発生しても、ループを含まない迂回ルートによってフレームがグローバル宛先に向けて送信される。さらに、図12を参照しながら説明したように、ノード装置10は、隣接するノード装置10での転送経路の変更に伴って、ルーティングテーブル22を更新する。このため、隣接ノード装置10での経路の変更により、フレームの転送経路にループが発生することを防ぐことができる。また、障害が起こったノード装置10が復帰すると、経路の状況に応じて、復帰したノード装置10を経由する経路を用いたフレームの転送が再開される。このため、アドホックネットワーク中で効率的にフレームが転送される。
第1の実施形態では、各ノード装置10は、自ノードにフレームを転送しようとしているノード装置10を、フレームの送信先としないようにルーティングテーブル22を生成しているといえる。このため、ノード装置10が送信したフレームは、再度、同じノード装置10を経由せずに最終宛先に送信される。従って、第1の実施形態により、無駄なトラフィックを削減して無線リソースを有効に活用できる。さらに、アドホックネットワーク中の輻輳を防止することができるので、システム全体の安定性も高められる。
<第2の実施形態>
図16は、第2の実施形態で行われる処理の例を説明するシーケンス図である。第2の実施形態では、経路の状況が悪化したことを検出したノード装置10の隣接ノード装置10が、経路の状況の悪化を検出したノード装置10を避けてフレームを転送する場合について説明する。
第2の実施形態でもHelloフレームの送受信やルーティングテーブル22の生成は、第1の実施形態と同様に行われる。図16の処理が開始される時点では、ノードbにおいて、グローバル宛先がGWの場合のLD1はノードa、LD2はノードeであるとする。ノードeでは、グローバル宛先がGWの場合のLD1はノードf、LD2はノードbであるとする。ノードaでは、グローバル宛先がGWのときのLD1がGWであり、ノードcでは、グローバル宛先がGWのときのLD1がノードbであるものとする。
(41)ノードaのアプリケーション処理部14aは、GWとの間のリンクが切れたことを検出する。経路情報処理部13aは、リンクの切断に伴って、リンクテーブル21aやルーティングテーブル22aを更新する。
(42)ノードaのHelloフレーム生成部15aは、アプリケーション処理部14aからの要求により、以下の情報要素を含むHelloフレームを生成する。
Helloフレームの送信元 :ノードa
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :GW
Helloヘッダ中の品質情報 :品質劣化
すなわち、Helloフレーム生成部15aは、グローバル宛先がGWのフレームをGWに送信することと、ノードaを経由するGW宛の経路の品質が劣化していることを、ノードaの隣接ノード装置10に通知できるHelloフレームを生成する。
ノードbの経路情報処理部13bは、ノードaから受信したHelloフレームに基づいて、ノードaを経由したGWまでの経路の品質情報を更新する。
その後も、ノードaは、GWとの間のリンクが回復するまで、Helloフレームを用いて、ノードaを経由してGWに至る経路の品質が劣化していることを、ノードaの隣接ノード装置10に通知し続ける。ノードbでは、ルーティングテーブル22bの品質情報の更新が続けられる。
(43)ノードbにおいて、経路情報処理部13bがルーティングテーブル22bの品質情報の更新を続けたことにより、ノードaを経由してGWに至る経路の品質よりも、ノードeを経由してGWに至る経路の品質情報の方が良くなったとする。すると、経路情報処理部13bは、GD=GWの経路について、LD1をノードe、LD2をノードaに変更する。
(44)ノードbのHelloフレーム生成部15bは、アプリケーション処理部14bの要求に応じて、以下の情報要素を含むHelloフレームを生成する
Helloフレームの送信元 :ノードb
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :ノードe
ノードbは、Helloフレームを用いて、グローバル宛先がGWのフレームをノードeに送信することを、ノードbの隣接ノード装置10に通知する。
(45)ノードeの経路情報処理部13eは、ノードbで生成されたHelloフレームを取得する。経路情報処理部13eは、Helloヘッダ中のローカル宛先がノードeであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれると判定する。
そこで、ループを含む経路を記憶することを避けるため、経路情報処理部13eは、処理対象のHelloヘッダで通知された経路を使用する経路の情報をルーティングテーブル22eから削除する。このため、ノードeは、GW宛のフレームのLD1の情報はノードfのまま変更しないが、LD2の情報を削除する。
(46)ノードaの経路情報処理部13aは、ノードbで生成されたHelloフレームを取得する。経路情報処理部13aは、Helloヘッダ中のローカル宛先がノードeであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれないと判定する。経路情報処理部13aは、ノードbを経由してGWにフレームを送信できると判定し、ノードe経由のGWへの経路をルーティングテーブル22に記録する。このため、GW宛のフレームの送信先としてLD1=GW、LD2=ノードbがルーティングテーブル22aに記録される。
(47)ノードbは、手順(44)で述べたようにHelloフレームを送信し続ける。ノードbからHelloフレームを受信するたびに、ノードaは、ノードbを経由したGWまでの経路の品質情報を更新する。
(48)ノードaにおいて、経路情報処理部13aがルーティングテーブル22aの品質情報の更新を続けたことにより、ノードaからGWに至る経路の品質よりも、ノードbを経由してGWに至る経路の品質情報の方が良くなったとする。すると、経路情報処理部13aは、LD1をノードb、LD2をGWに変更する。
(49)ノードaのHelloフレーム生成部15aは、アプリケーション処理部14aの要求に応じて、以下の情報要素を含むHelloフレームを生成する
Helloフレームの送信元 :ノードa
Helloヘッダ中のグローバル宛先:GW
Helloヘッダ中のLD1 :ノードb
ノードaは、Helloフレームを用いて、グローバル宛先がGWのフレームをノードbに送信することを、ノードaの隣接ノード装置10に通知する。
(50)ノードbの経路情報処理部13bは、ノードaで生成されたHelloフレームを取得する。経路情報処理部13bは、Helloヘッダ中のローカル宛先がノードbであるので、処理対象のHelloヘッダによって通知された経路にはループが含まれると判定する。
そこで、ループを含む経路を記憶することを避けるため、経路情報処理部13bは、処理対象のHelloヘッダで通知された経路を含む経路の情報をルーティングテーブル22bから削除する。このため、ノードbでは、GW宛のフレームのLD1はノードeのまま変更しないが、LD2の情報を削除する。
手順(50)の処理が終わった段階で、ノードaにおいて、グローバル宛先をGWに指定したフレームが生成されたとする。すると、ノードaで生成されたフレームは、ノードaからノードb、ノードe、ノードfを経由して、GWに送信される。
このように、第2の実施形態では、リンクの切断などの障害を検出したノード装置10は、そのノード装置10を経由する経路が選択されにくくなるように、経路品質が劣悪であることをHelloフレームで隣接ノード装置10に通知する。このため、第2の実施形態では、品質が悪化したリンクを含む経路が選択されにくくなる。さらに、第1の実施形態と同様に、ルーティングテーブル22に登録されている経路を選択すれば、送信したフレームを転送先のノード装置10から再度受信することなく、フレームをグローバル宛先に転送できる。従って、効率的に通信が行われる。
第2の実施形態によると、無線環境の変動により一時的にリンクが切断された場合でも、最終的な宛先までのフレームの到達可能性を高めることができる。なお、第2の実施形態においても、切断されたリンクが復旧すると、品質情報が良好であることが記録されているHelloフレームを複数回にわたって送受信することにより、リンクの切断前の通信経路が復旧されうる。
<その他>
なお、実施形態は上記に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
第1の実施形態と第2の実施形態を組み合わせることができる。
リンクテーブル21やルーティングテーブル22に含まれる情報要素は、実装に応じて変更される場合がある。同様に、フレームのフォーマットも実装に応じて変更されることがあるものとする。
上記の例では、アドホックネットワークと他のネットワーク中の装置の間の通信を中継するゲートウェイとして動作するノード装置10がグローバル宛先であるフレームを例として動作を説明した。しかし、グローバル宛先はアドホックネットワーク中の任意のノード装置10とすることができる。いずれのノード装置10がグローバル宛先である場合も、前述の方法により、ループを含む経路はルーティングテーブル22に登録されない。