(57)【要約】  無線通信装置は、記憶部、生成部、送信部、判定部を備える。記憶部は、複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を識別する識別情報を記憶する。生成部は、最終宛先装置への経路探索を表す情報を含む探索データを生成する。送信部は、探索データを隣接装置にブロードキャストする。判定部は、探索データが最終宛先装置へ到達しないことを表す情報を含むデータを、記憶部に識別情報が記憶されているすべての特定隣接装置から受信したときに、特定隣接装置から最終宛先装置への迂回経路が存在しないと判定する。
2012073315.tif 000002
【特許請求の範囲】
【請求項１】
複数の無線通信装置を備える無線ネットワークにおいて使用される無線通信装置であって、
前記複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を識別する識別情報を記憶する記憶部と、
前記最終宛先装置への経路探索を表す情報を含む探索データを生成する生成部と、
前記探索データを前記隣接装置にブロードキャストする送信部と、
前記探索データが前記最終宛先装置へ到達しないことを表す情報を含むデータを、前記記憶部に識別情報が記憶されているすべての特定隣接装置から受信したときに、前記特定隣接装置から前記最終宛先装置への迂回経路が存在しないと判定する判定部、
を備える無線通信装置。
【請求項２】
請求項１に記載の無線通信装置であって、
最終宛先装置へのデータ送信において自装置が送信先隣接装置として選択する隣接装置以外のすべての隣接装置が前記特定隣接装置であるときに、前記送信部は、前記探索データを隣接装置にブロードキャストする
ことを特徴とする無線通信装置。
【請求項３】
請求項１または２に記載の無線通信装置であって、
前記最終宛先装置へデータを送信するための経路情報を含む通知データを一定周期で隣接装置へブロードキャストする手段を更に備え、
前記送信部は、前記通知データに前記探索データを付加することで前記隣接装置へ前記探索データをブロードキャストする
ことを特徴とする無線通信装置。
【請求項４】
請求項１〜３のいずれか１つに記載の無線通信装置であって、
前記探索データが前記最終宛先装置に到達したことを表す通知を前記最終宛先装置から受信すると、前記判定部は、前記特定隣接装置から前記最終宛先装置への迂回経路が存在すると判定する
ことを特徴とする無線通信装置。
【請求項５】
請求項１〜４のいずれか１つに記載の無線通信装置であって、
前記送信部は、前記判定部による判定結果を表すデータを前記隣接装置にブロードキャストする
ことを特徴とする無線通信装置。
【請求項６】
請求項１〜５のいずれか１つに記載の無線通信装置であって、
前記最終宛先装置への経路探索を表す情報を含む探索データを前記隣接装置から受信したときに、前記記憶部に特定隣接装置を識別する識別情報が記憶されていなければ、前記送信部は、前記探索データが前記最終宛先装置へ到達しないことを表す情報を含むデータを前記隣接装置にブロードキャストする
ことを特徴とする無線通信装置。
【請求項７】
請求項１〜５のいずれか１つに記載の無線通信装置であって、
前記最終宛先装置への経路探索を表す情報を含む探索データを前記隣接装置から受信したときに、前記探索データを生成した無線通信装置が前記特定隣接装置である場合には、前記送信部は前記探索データをブロードキャストしない
ことを特徴とする無線通信装置。
【請求項８】
複数の無線通信装置を備える無線ネットワークにおいて使用される無線通信装置であって、
前記複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を識別する識別情報を記憶する記憶部と、
前記最終宛先装置へのデータ送信において自装置が送信先隣接装置として選択する隣接装置以外のすべての隣接装置が前記特定隣接装置であるときに、前記特定隣接装置から前記最終宛先装置への迂回経路が存在しないと判定する判定部、
を備える無線通信装置。
【請求項９】
複数の無線通信装置を備える無線ネットワークにおいて無線通信装置により使用される迂回経路探索方法であって、
前記複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を検出し、
前記最終宛先装置への経路探索を表す情報を含む探索データを生成し、
前記探索データを前記隣接装置にブロードキャストし、
前記探索データが前記最終宛先装置へ到達しないことを表す情報を含むデータを、すべての前記特定隣接装置から受信したときに、前記特定隣接装置から前記最終宛先装置への迂回経路が存在しないと判定する、
ことを特徴とする迂回経路探索方法。
【請求項１０】
複数の無線通信装置を備える無線ネットワークにおいて使用される迂回経路探索方法であって、
探索対象無線通信装置において、前記複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を検出し、
前記探索対象無線通信装置において、前記最終宛先装置への経路探索を表す情報を含む探索データを生成し、
前記探索対象無線通信装置から前記探索対象無線通信装置の隣接装置へ前記探索データをブロードキャストし、
前記探索データを受信した各無線通信装置は、それぞれ前記探索データを隣接装置にブロードキャストし、
前記最終宛先装置に対する最上流装置は、前記探索データを受信すると、前記探索データが前記最終宛先装置へ到達しないことを表す情報を含む応答データを隣接装置にブロードキャストし、
前記応答データを受信した各無線通信装置は、それぞれ前記応答データを隣接装置にブロードキャストし、
前記探索対象無線通信装置は、すべての前記特定隣接装置から前記応答データを受信すると、前記特定隣接装置から前記最終宛先装置への迂回経路が存在しないと判定する
ことを特徴とする迂回経路探索方法。
【請求項１１】
請求項１０に記載の迂回経路探索方法であって、
前記最終宛先装置は、前記探索データを受信すると、前記探索データが前記最終宛先装置に到達したことを表す通知を前記探索対象無線通信装置へ送信し、
前記探索対象無線通信装置は、前記最終宛先装置から前記通知を受信すると、前記特定隣接装置から前記最終宛先装置への迂回経路が存在すると判定する
ことを特徴とする迂回経路探索方法。
【請求項１２】
請求項１１に記載の迂回経路探索方法であって、
前記探索対象無線通信装置は、迂回経路が存在することを表す情報を隣接装置へブロードキャストし、
前記探索対象無線通信装置以外の各無線通信装置は、迂回経路が存在することを表す情報を受信したときから所定時間経過した後は、前記探索データを送信しない
ことを特徴とする迂回経路探索方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、無線ネットワークにおいて使用される無線通信装置および無線ネットワークにおける迂回経路探索方法に係わる。
【背景技術】
【０００２】
複数のノードを含むネットワークの１つの形態として、アドホックネットワークが実用化されている。アドホックネットワークでは、各ノードにおいて自律的な経路選択が行われる。すなわち、アドホックネットワークの各ノード装置（または、通信装置）は、ルータまたはスイッチとして動作する機能を備えている。ここで、各ノード装置は、隣接するノード装置とメッセージ等を送信および受信することにより、周辺のネットワーク構成を認識することができる。したがって、アドホック（特に、無線アドホック）方式を採用すると、ネットワーク全体を管理する管理装置を設けることなく、ネットワークを構築したい環境にノード装置を配置するだけで、所望のネットワークを構築することができる。さらに、アドホックネットワークでは、ノードの追加または削除が容易であり、ネットワーク構成を容易に変更することができる。【０００３】
ところで、ネットワークは、一般に、障害が発生した場合であっても通信を継続できるようにするために、迂回経路（或いは、冗長経路または代替経路）を有していることが好ましい。特に、無線ネットワークでは、電波環境に応じてリンクが一時的に切断されることもあり、迂回経路の有無を予め確認しておくことは重要である。【０００４】
例えば、図１に示すネットワークにおいて、ノードＡ〜ＥからノードＧＷへデータを送信する際には、データは、ノードＸを経由しなければならない。すなわち、ノードＡ〜ＥとノードＧＷとの間には、迂回経路は存在しない。以下の説明では、ノードＸのように、特定の宛先へデータを送信する際に必ず通過しなければならないノードを「ボトルネックノード」と呼ぶことがある。【０００５】
図１に示すネットワーク構成においては、ノード装置Ｘが故障すると、ノード装置Ａ〜Ｅは、ノードＧＷへデータを送信できない。また、ノードＸ、Ｙ間のリンクが切断された場合も、ノード装置Ａ〜ＥはノードＧＷへデータを送信できない。すなわち、ノード装置Ａ〜Ｅは、ノードＧＷから孤立するおそれがある。したがって、ネットワークを管理または運営するオペレータは、ボトルネックノードを発見して適切に迂回経路を設けることが要求される。【０００６】
ただし、迂回経路を形成するために中継ノードを追加すると、ネットワークのコストが増加する。このため、オペレータは、中継ノードの増設を注意深く行う必要がある。したがって、ボトルネックノードを精度よく発見する方法が望まれる。【０００７】
しかしながら、アドホックネットワークでは、ネットワーク全体に渡って通信経路を正確に認識することは困難である。このため、アドホックネットワークにおいては、各通信経路に対してそれぞれ迂回経路が存在しているか否かを確認することは容易ではない。【０００８】
なお、ネットワークを管理するサーバコンピュータを設ければ、全ノードの経路情報を収集してネットワークトポロジを解析することは可能である。しかし、ノード数が多いネットワークでは、経路情報を収集するために要する時間が長くなる。さらに、無線ネットワークでは、ノード間のリンクの状態が不安定である。このため、経路情報を収集するための時間が長いと、サーバコンピュータにより得られたトポロジ（すなわち、経路情報を収集した時点でのトポロジ）と、実際のトポロジが一致しないこともある。【０００９】
このように、従来技術においては、無線アドホックネットワークにおいて、ボトルネックノードを精度よく発見することは困難であった。【００１０】
関連する技術として、間欠的に所定の通信管理信号を送受信して自律分散的な無線ネットワークを形成する無線通信装置が提案されている。この無線通信装置は、通信管理信号を受信する受信部と、受信部による通信管理信号の受信の履歴に基づき、無線ネットワークにおける無線通信装置の通信状態を評価する評価部と、評価部による通信状態の評価結果に応じた通知を行なう通知部、を備える。（例えば、特許文献１）【００１１】
また、他の関連する技術として、アドホックネットワークにおいて、複数の中継装置のうち、送信するデータリンクの伝送誤り率が、データを受信するデータリンクの伝送誤り率よりも大きい中継装置を、ボトルネックの候補として推定するボトルネック推定手段を備えるネットワーク制御装置が提案されている。（例えば、特許文献２）
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００９−１４７６４６号公報
【特許文献２】特許第４２９４７２３号
【発明の概要】
【発明が解決しようとする課題】
【００１３】
本発明の目的は、無線アドホックネットワークにおいて、任意の通信経路に対して迂回経路の有無を判定する装置または方法を提供することである。
【課題を解決するための手段】
【００１４】
本発明の１つの態様に係る無線通信装置は、複数の無線通信装置を備える無線ネットワークにおいて使用され、前記複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を識別する識別情報を記憶する記憶部と、前記最終宛先装置への経路探索を表す情報を含む探索データを生成する生成部と、前記探索データを前記隣接装置にブロードキャストする送信部と、前記探索データが前記最終宛先装置へ到達しないことを表す情報を含むデータを、前記記憶部に識別情報が記憶されているすべての特定隣接装置から受信したときに、前記特定隣接装置から前記最終宛先装置への迂回経路が存在しないと判定する判定部、を備える。【００１５】
本発明の１つの態様に係る迂回経路探索方法は、複数の無線通信装置を備える無線ネットワークにおいて使用される。探索対象無線通信装置において、前記複数の無線通信装置のうち、自装置に隣接する無線通信装置である隣接装置であって、且つ、最終宛先となる無線通信装置である最終宛先装置へのデータを自装置に送信する無線通信装置である特定隣接装置を検出する。前記探索対象無線通信装置において、前記最終宛先装置への経路探索を表す情報を含む探索データを生成する。前記探索対象無線通信装置から前記探索対象無線通信装置の隣接装置へ前記探索データをブロードキャストする。前記探索データを受信した各無線通信装置は、それぞれ前記探索データを隣接装置にブロードキャストする。前記最終宛先装置に対する最上流装置は、前記探索データを受信すると、前記探索データが前記最終宛先装置へ到達しないことを表す情報を含む応答データを隣接装置にブロードキャストする。前記応答データを受信した各無線通信装置は、それぞれ前記応答データを隣接装置にブロードキャストする。前記探索対象無線通信装置は、すべての前記特定隣接装置から前記応答データを受信すると、前記特定隣接装置から前記最終宛先装置への迂回経路が存在しないと判定する。
【発明の効果】
【００１６】
上述の態様によれば、無線アドホックネットワークにおいて、任意の通信経路に対して迂回経路の有無を精度よく判定することができる。
【図面の簡単な説明】
【００１７】
【図１】ボトルネックノードについて説明する図である。
【図２】実施形態の無線ネットワークの構成を説明する図である。
【図３】ノード装置の構成を示す図である。
【図４】ノード装置の機能を説明するブロック図である。
【図５】リンクの評価値について説明する図である。
【図６】リンクテーブルの一例を示す図である。
【図７】ルーティングテーブルの一例を示す図である。
【図８】Ｈｅｌｌｏパケットのフォーマットを示す図である。
【図９】実施形態の迂回経路探索方法の概略を示すフローチャートである。
【図１０】ボトルネック候補判定処理の第１および第２の方法を説明する図である。
【図１１】ボトルネック候補判定処理の第３の方法を説明する図である。
【図１２】状態管理テーブルの一例を示す図である。
【図１３】ノード装置の状態の遷移を示す図である。
【図１４】アドホックネットワークの一例を示す図である。
【図１５】迂回経路探索処理の開始時の状態を示す図である。
【図１６】迂回経路が無いネットワークにおける迂回経路探索の実施例である。
【図１７】迂回経路が無いネットワークにおける迂回経路探索の実施例である。
【図１８】迂回経路が無いネットワークにおける迂回経路探索の実施例である。
【図１９】迂回経路が無いネットワークにおける迂回経路探索の実施例である。
【図２０】迂回経路が無いネットワークにおける迂回経路探索の実施例である。
【図２１】迂回経路が無いネットワークにおける迂回経路探索の実施例である。
【図２２】迂回経路があるネットワークにおける迂回経路探索の実施例である。
【図２３】迂回経路があるネットワークにおける迂回経路探索の実施例である。
【図２４】ボトルネック候補判定処理を示すフローチャートである。
【図２５】ボトルネック候補判定処理を示すフローチャートである。
【図２６】状態管理テーブルの更新の実施例を示す図である。
【図２７】迂回経路探索処理を示すフローチャートである。
【図２８】迂回経路探索処理を示すフローチャートである。
【図２９】迂回経路探索処理を示すフローチャートである。
【発明を実施するための形態】
【００１８】
図２は、実施形態の無線ネットワークの構成を説明する図である。実施形態の無線ネットワークは、アドホックネットワークであり、複数の無線通信装置が接続されている。以下の説明では、各無線通信装置のことを「ノード装置」または単に「ノード」と呼ぶことがある。図２に示す例では、無線ネットワークは、ノードｎ１〜ｎ１４を備えている。
【００１９】
図２において、ノード間を接続する破線は、無線リンクを表す。例えばノードｎ６は、ノードｎ３、ｎ５、ｎ１０、ｎ１１との間に無線リンクを有している。すなわち、ノードｎ６から送信される電波（すなわち、無線信号）は、ノードｎ３、ｎ５、ｎ１０、ｎ１１に到達し、また、ノードｎ３、ｎ５、ｎ１０、ｎ１１からそれぞれ送信される電波は、ノードｎ６に到達する。なお、以下の説明では、無線リンクで相互に接続される１組のノードは、互いに「隣接」しているものとする。すなわち、ノードｎ３、ｎ５、ｎ１０、ｎ１１は、ノードｎ６に隣接している。換言すれば、ノードｎ３、ｎ５、ｎ１０、ｎ１１は、ノードｎ６の「隣接ノード」である。
【００２０】
各ノードは、定期的に、Ｈｅｌｌｏパケットをブロードキャストする。ただし、この実施形態では、「ブロードキャスト」は、すべてのノードにパケットを送信するものではなく、すべての隣接ノードにパケットを送信することを意味する。したがって、例えば、ノードｎ６は、ノードｎ３、ｎ５、ｎ１０、ｎ１１へＨｅｌｌｏパケットを送信する。このとき、各ノードｎ３、ｎ５、ｎ１０、ｎ１１は、ノードｎ６から受信したＨｅｌｌｏパケットを他のノードへは転送しない。
【００２１】
Ｈｅｌｌｏパケットは、ノードが存在することを他のノードに通知するために使用される。例えば、ノードｎ６がＨｅｌｌｏパケットをブロードキャストすると、ノードｎ３、ｎ５、ｎ１０、ｎ１１は、そのＨｅｌｌｏパケットを受信する。そうすると、ノードｎ３は、隣接ノードとしてノードｎ６が存在することを認識する。ノードｎ５、ｎ１０、ｎ１１も同様に、隣接ノードとしてノードｎ６が存在することを認識する。
【００２２】
Ｈｅｌｌｏパケットは、上述したように、各ノードから送信される。したがって、例えば、ノードｎ３がＨｅｌｌｏパケットを送信すると、ノードｎ１、ｎ２、ｎ６がそのＨｅｌｌｏパケットを受信する。このとき、各ノードｎ１、ｎ２、ｎ６は、隣接ノードとしてノードｎ３が存在することを認識する。このようにして、各ノードは、自ノードに隣接するノードを認識する。
【００２３】
図３は、ノード装置（すなわち、無線通信装置）の構成を示す図である。ノード装置１は、通信部１０、記憶部２０、制御部３０を備える。通信部１０は、アンテナ、送信機、受信機を備え、無線インタフェースを提供する。記憶部２０は、例えば半導体メモリであり、制御部３０によって使用される。また、記憶部２０は、不揮発性メモリを含む。制御部３０は、ＣＰＵを含み、ノード装置１の動作を制御する。なお、特に図示しないが、ノード装置１は、入力デバイスを接続するための入力インタフェースおよび／または出力デバイスを接続するための出力インタフェースを備えるようにしてもよい。
【００２４】
図４は、ノード装置の機能を説明するブロック図である。なお、図４においては、無線ネットワークの迂回経路の探索に直接的に係わらない機能については省略されている。
記憶部２０は、制御部３０により処理されるデータを記憶する。また、記憶部２０は、リンクテーブル２１、ルーティングテーブル２２、状態管理テーブル２３、ボトルネック判定フラグ格納部２４、最上流フラグ格納部２５を格納する。
【００２５】
リンクテーブル２１は、リンク情報を格納する。リンク情報は、自ノードと隣接ノードとの間のリンクの品質を表す。なお、リンクテーブル２２は、ノード装置がＨｅｌｌｏパケットを受信したときに、リンクテーブル更新部３１により更新される。
【００２６】
ルーティングテーブル２２は、経路情報を格納する。経路情報は、宛先ノードにパケットを送信する経路を表す。換言すると、経路情報は、パケットの宛先ノードとパケットを中継する隣接ノードとの対応関係を表す。なお、ルーティングテーブル２２は、ノード装置がＨｅｌｌｏパケットを受信したときに、ルーティングテーブル更新部３２により更新される。
【００２７】
状態管理テーブル２３は、迂回経路の探索に係わるノード装置の状態を管理する。尚、各ノード装置は、「初期状態」「探索中」「迂回経路なし」「迂回経路あり」のいずれか１つの状態を保持することができる。ボトルネック判定フラグ格納部２４は、ボトルネック判定フラグを格納する。ボトルネック判定フラグは、ノード装置が「非ボトルネックノード」「単独の孤立」「ボトルネック候補」「ボトルネックノード」のいずれであるのかを表す。最上流フラグ格納部２５は、最上流フラグを格納する。最上流フラグは、指定された宛先ノードに対して、ノード装置が最上流に位置するか否かを表す。
【００２８】
制御部３０は、リンクテーブル更新部３１、ルーティングテーブル更新部３２、パケット生成部３３、パケット送信部３４、判定部３５、転送部３６を備える。なお、制御部３０は、この例では、プロセッサを用いてプログラムを実行することにより、リンクテーブル更新部３１、ルーティングテーブル更新部３２、パケット生成部３３、パケット送信部３４、判定部３５、転送部３６を実現する。この場合、プログラムは、記憶部２０の不揮発性メモリ内に予め格納されてもよい。また、プログラムは、可搬型の記録媒体からノード装置１に提供されるようにしてもよい。可搬型の記録媒体は、例えば、ＣＤ−ＲＯＭ、ＤＶＤ、ＵＳＢメモリ等の半導体メモリである。さらに、ノード装置１は、プログラムサーバからプログラムを受信するようにしてもよい。
【００２９】
リンクテーブル更新部３１は、リンクテーブル２１に格納されているリンク情報を更新する。具体的には、リンクテーブル更新部３１は、転送部３６から受け取るＨｅｌｌｏパケットの内容に基づいて、リンクテーブル２１に格納されているリンク情報を更新する。
【００３０】
ルーティングテーブル更新部３２は、ルーティングテーブル２２に格納されている経路情報を更新する。具体的には、ルーティングテーブル更新部３２は、転送部３６から受け取るＨｅｌｌｏパケットの内容に基づいて、ルーティングテーブル２２に格納されている経路情報を更新する。
【００３１】
パケット生成部３３は、Ｈｅｌｌｏパケットを生成する。このとき、パケット生成部３３は、判定部３５により生成される迂回経路探索に係わる情報を含むＨｅｌｌｏパケットを生成することができる。パケット送信部３４は、パケット生成部３３により生成されるＨｅｌｌｏパケットを隣接ノードに送信する。
【００３２】
判定部３５は、転送部３６から受け取るＨｅｌｌｏパケットの内容に基づいて、宛先ノードにデータを送信するための迂回経路が存在するか否かを判定する。このとき、判定部３５は、状態管理テーブル２３、ボトルネック判定フラグ格納部２４、最上流フラグ格納部２５を参照しながら、迂回経路が存在するか否かを判定する。
【００３３】
転送部３６は、隣接ノードからパケットを受信する。隣接ノードからＨｅｌｌｏパケットを受信したときは、転送部３６は、そのＨｅｌｌｏパケットをリンクテーブル更新部３１、ルーティングテーブル更新部３２、判定部３５に与える。一方、データパケット（Ｈｅｌｌｏパケット以外のパケット）を受信したときは、転送部３６は、ルーティングテーブル２２を参照して、そのデータパケットの宛先に対応する隣接ノードを特定する。そして、転送部３６は、特定した隣接ノードへ、受信したデータパケットを送信する。
【００３４】
なお、状態管理テーブル２３は、特定隣接装置を識別する識別情報を記憶する記憶部の一例である。パケット生成部３３は、探索データを生成する生成部の一例である。パケット送信部３４は、探索データを隣接装置にブロードキャストする送信部の一例である。
【００３５】
図５は、リンクの評価値について説明する図である。なお、図５においては、無線ネットワークが備える多数のノードの中の一部のノード（Ｇ、Ｘ、Ｙ、Ｚ、Ａ）のみが描かれている。
【００３６】
ノードＧ、Ｘは、それぞれノードＺに隣接している。ノードＸ、Ｙ、Ｚは、それぞれノードＧに隣接している。ノードＧ、Ｚ、Ａは、それぞれノードＸに隣接している。ノードＧ、Ａは、それぞれノードＹに隣接している。ノードＸ、Ｙは、それぞれノードＡに隣接している。なお、「隣接」は、ノード間で相互に電波が到達することを表す。
【００３７】
リンク重みは、ノード間の無線リンクの品質または通信コストを表す指標である。この実施形態では、品質の良いリンクのリンク重みは小さく、品質の悪いリンクのリンク重みは大きい。また、ノード間のリンク重みは、１組のリンク評価値に基づいて算出される。例えば、ノードＧからノードＺへ向かうリンクの評価値は「９」であり、ノードＺからノードＧへ向かうリンクの評価値は「１１」である。そして、ノード間のリンク重みは、１組のリンク評価値の平均で表わされる。よって、ノードＧ、Ｚ間のリンク重みは「１０」である。同様に、ノードＸ、Ｚ間のリンク重みは「１００」である。すなわち、このケースは、ノードＸ、Ｚ間のリンクよりも、ノードＧ、Ｚ間のリンクの方が、品質が良いことを表している。
【００３８】
各リンクの品質（すなわち、評価値およびリンク重み）は、例えば、下記の方法で検出される。ここでは、各ノード装置は、それぞれ予め決められた周期でＨｅｌｌｏパケットを繰り返し送信するものとする。この場合、リンクの品質が良好であれば、ノード装置において隣接ノードからＨｅｌｌｏパケットを受信する時間間隔は、ほぼ一定となるはずである。一方、リンクの品質が悪いときは、ノード装置において隣接ノードからＨｅｌｌｏパケットを受信する時間間隔のばらつきが大きくなる。したがって、各ノード装置は、Ｈｅｌｌｏパケットの受信間隔に基づいてリンクの品質を検出することができる。例えば、図５に示すノードＧは、ノードＺからＨｅｌｌｏパケットを受信する時間間隔をモニタすることにより、ノードＺからノードＧへ向かうリンクの品質を検出できる。
【００３９】
なお、各ノード装置は、他の方法でリンクの品質を検出してもよい。例えば、ノード装置は、隣接ノードから送信されるＨｅｌｌｏパケットの受信レベル（例えば、受信電波強度）に基づいてリンクの品質を検出してもよい。
【００４０】
図６は、リンクテーブル２１の一例を示す。なお、図６は、図５に示すノードＧが有するリンクテーブル２１を示している。
リンクテーブル２１には、隣接ノードとの間のリンクについてのリンク情報が登録される。リンク情報は、「隣接ノード」「往路リンク評価値」「復路リンク評価値」「リンク重み」を含む。「隣接ノード」は、リンクの接続先のノードを識別する。「往路リンク評価値」は、隣接ノードにとっての往路リンクの品質を表す。「復路リンク評価値」は、隣接ノードにとっての復路リンクの品質を表す。「リンク重み」は、「往路リンク評価値」および「復路リンク評価値」の平均を表す。
【００４１】
例えば、図６に示す第１レコードに登録されているリンク情報は、以下の内容を表している。
【００４２】
隣接ノード：Ｚ
往路リンク評価値（ノードＺからノードＧへ向かうリンクの品質）：１１
復路リンク評価値（ノードＧからノードＺへ向かうリンクの品質）：９
リンク重み（ノードＧとノードＺとの間のリンクの品質）：１０
【００４３】
図７は、ルーティングテーブル２２の一例を示す。なお、図７は、図５に示すノードＡが有するルーティングテーブル２２を示している。
【００４４】
ルーティングテーブル２２には、宛先ノード毎に経路情報が登録される。具体的には、ルーティングテーブル２２には、「グローバル宛先（ＧＤ：Global Destination）」「ローカル宛先（ＬＤ：Local Destination）」「経路重み」「リンク重み」および「評価値」が登録される。「グローバル宛先」は、パケットの宛先ノードを識別する。なお、「グローバル宛先」を「最終宛先装置」と呼ぶことがある。「ローカル宛先」は、宛先ノードへパケットを送信するための経路上に位置する隣接ノードを表す。
【００４５】
「経路重み」は、「ローカル宛先」から「グローバル宛先」までの経路の通信コストを表す。具体的には、「経路重み」は、「ローカル宛先」から「グローバル宛先」までの経路上の各リンクのリンク重みの総和を表す。「リンク重み」は、「ローカル宛先」との間のリンク重みを表す。「評価値」は、グローバル宛先への経路に係わる総通信コストに相当し、例えば「経路重み」および「リンク重み」の和により算出される。
【００４６】
図７に示すルーティングテーブル２２の第１および第２レコードには、グローバル宛先ノードＺについての経路情報が登録されている。第１レコードは、ノードＡからノードＹを経由してノードＺへ至る経路の経路情報を表す。すなわち、第１レコードの「リンク重み」は、ノードＡ、Ｙ間の「リンク重み」を表す。第１レコードの「経路重み」は、ノードＹ、Ｇ間のリンク重み、およびノードＧ、Ｚ間のリンク重みの和を表す。そして、第１レコードの「評価値」は、ノードＡからノードＹおよびノードＧを経由してノードＺへ至る経路の品質（通信コスト）を表す。一方、第２レコードは、ノードＡからノードＸを経由してノードＺへ至る経路の経路情報を表す。すなわち、第２レコードの「リンク重み」は、ノードＡ、Ｘ間の「リンク重み」を表す。第２レコードの「経路重み」は、ノードＸ、Ｇ間のリンク重み、およびノードＧ、Ｚ間のリンク重みの和を表す。そして、第２レコードの「評価値」は、ノードＡからノードＸおよびノードＧを経由してノードＺへ至る経路の品質を表す。
【００４７】
このように、図５および図７に示す例では、ノード装置Ａは、ノードＺへデータパケットを送信するための経路として、ローカル宛先ノードＹを経由する経路（以下、経路Ｙ）およびローカル宛先ノードＸを経由する経路（以下、経路Ｘ）を有する。そして、ノード装置ＡがノードＺへデータパケットを送信または転送する際には、ノード装置Ａの転送部３６は、グローバル宛先がノードＺである経路の中で、評価値が最小の経路を選択する。図７に示す例では、経路Ｙの評価値が２１であり、経路Ｘの評価値が２４である。したがって、この場合、転送部３６は、経路Ｙを選択する。すなわち、転送部３６は、最適なローカル宛先として、ノードＹを選択する。
【００４８】
同様に、各ノード装置は、受信パケットの「グローバル宛先」に基づいてルーティングテーブル２２をサーチし、最適なローカル宛先ノードを選択する。これにより、実施形態のアドホックネットワークにおいて、データパケットは、最適な経路を介してグローバル宛先まで転送される。
【００４９】
図８は、Ｈｅｌｌｏパケットのフォーマットを示す図である。Ｈｅｌｌｏパケット５１は、アドホックヘッダ、グローバル宛先（ＧＤ）、ローカル宛先（ＬＤ）、往路リンク評価値、評価値、探索対象ノード、ノード状態を含む。アドホックヘッダは、アドホックネットワークにおいてパケットを伝送するために必要な情報を格納する。なお、アドホックヘッダは、Ｈｅｌｌｏパケットの送信元ノードを識別する情報を含むようにしてもよい。グローバル宛先、ローカル宛先、評価値は、この例では、図７に示すルーティングテーブルに登録される対応するエントリから抽出される。なお、ルーティングテーブル２２において１つのグローバル宛先に対して複数の経路（すなわち、複数のローカル宛先）が登録されているときは、最適な経路（すなわち、評価値が最小の経路）の経路情報がＨｅｌｌｏパケットに格納される。往路リンク評価値は、隣接ノードにとっての往路リンクの品質を表す。探索対象ノードは、ボトルネックノードであるか否かの判定の対象となるノードを識別する。ノード状態は、「初期状態」「探索中」「迂回経路なし」「迂回経路あり」のいずれか１つを表す。
【００５０】
各ノード装置は、それぞれ定期的にＨｅｌｌｏパケットを隣接ノードへブロードキャストする。すなわち、各ノード装置は、隣接ノードとの間でルーティングテーブル２２に格納されている情報を交換する。そして、各ノード装置は、隣接ノードから受信するＨｅｌｌｏパケットの内容に基づいて、それぞれリンクテーブル２１およびルーティングテーブル２２を作成および更新する。また、各ノード装置は、Ｈｅｌｌｏパケットを利用して、探索対象ノードおよびノード状態を隣接ノードに通知する。
【００５１】
図９は、実施形態の迂回経路探索方法の概略を示すフローチャートである。図９に示すフローチャートの手順は、アドホックネットワーク内の各無線通信装置によって実行される。
【００５２】
ステップＳ１において、無線通信装置は、現在時刻がボトルネック判定時刻であるか否かを判定する。ボトルネック判定時刻は、例えば、ネットワークを管理または運営するオペレータにより指定され、無線通信装置に設定されている。そして、現在時刻がボトルネック判定時刻になると、無線通信装置は、ステップＳ２においてボトルネック候補判定処理を実行する。すなわち、無線通信装置は、自分がボトルネック候補であるか否かを判定する。なお、この明細書では、アドホックネットワークにおいてボトルネックノードである可能性のあるノード装置を「ボトルネック候補」と呼ぶ。
【００５３】
ステップＳ３において、無線通信装置は、迂回経路探索処理を実行する。迂回経路探索処理は、ボトルネック候補がボトルネックノードであるか否かが判定される。なお、図９に示す手順では、迂回経路探索処理は、各無線通信装置により継続的または繰返し実行される。
【００５４】
このように、実施形態の迂回経路探索方法では、多数の無線通信装置の中からボトルネック候補が抽出される。そして、抽出されたボトルネック候補に対して迂回経路探索処理が実行される。したがって、実施形態の迂回経路探索方法によれば、アドホックネットワークにおいて効率的にボトルネックノードを発見することができる。
【００５５】
＜ボトルネック候補判定処理＞
各ノード装置は、それぞれ、自分がボトルネック候補か否かを判定する。ここで、ノード装置は、下記の第１〜第３の方法でボトルネック候補の判定を行う。
【００５６】
図１０は、ボトルネック候補判定処理の第１および第２の方法を説明する図である。図１０に示すアドホックネットワークは、ノードＡ〜Ｆ、Ｘ、Ｙ、ＧＷを備える。また、図１０において、ノード間を接続する実線は、無線リンクを表している。すなわち、ノードＸは、ノードＹに隣接している。ノードＡ、Ｂ、Ｃ、Ｙは、ノードＸに隣接している。ノードＢ、Ｄ、Ｘは、ノードＡに隣接している。ノードＡ、Ｃ、Ｄ、Ｅ、Ｘは、ノードＢに隣接している。ノードＢ、Ｅ、Ｘは、ノードＣに隣接している。ノードＡ、Ｂは、ノードＤに隣接している。ノードＢ、Ｃ、Ｆは、ノードＥに隣接している。ノードＥは、ノードＦに隣接している。なお、ノードＹは、ノードＧＷに隣接していてもよいし、ノードＧＷに隣接していなくてもよい。ただし、ノードＹとノードＧＷとの間には、１以上の通信経路が存在するものとする。
【００５７】
上記構成のアドホックネットワークにおいて、各ノード装置は、それぞれ定期的にＨｅｌｌｏパケットを隣接ノードにブロードキャストする。したがって、各ノード装置は、それぞれ１または複数の隣接ノードからＨｅｌｌｏパケットを受信する。そして、各ノード装置は、隣接ノードから受信するＨｅｌｌｏパケットの内容に基づいて、ルーティングテーブル２２を作成および更新する。この結果、ノード装置Ａ〜Ｆ、Ｘは、それぞれ、ルーティングテーブル２２Ａ〜２２Ｆ、２２Ｘを備えるものとする。
【００５８】
以下の説明では、ノード装置Ａ〜Ｆ、Ｘは、それぞれノードＧＷへデータを送信するものとする。すなわち、各ノード装置Ａ〜Ｆ、Ｘのグローバル宛先は、ノードＧＷである。ノード装置ＧＷは、例えば、ノードＡ〜Ｆ、Ｘからデータを収集するゲートウェイ装置である。ゲートウェイ装置は、例えば、アドホックネットワークの外部のサーバコンピュータに接続され、ノードＡ〜Ｆ、Ｘから収集したデータをそのサーバコンピュータへ送信する。また、ゲートウェイ装置は、アドホックネットワーク内で使用されるＨｅｌｌｏパケットを、アドホックネットワークの外部には送信しないものとする。
【００５９】
第１の方法においては、各ノード装置は、下記の条件Ａを満たす場合に、自分がボトルネック候補であると判定する。
【００６０】
条件Ａ：グローバル宛先に対するローカル宛先が１つだけ
例えば、ノード装置Ａのルーティングテーブル２２Ａには、「グローバル宛先ＧＤ：ノードＧＷ」に対して２つの経路（ローカル宛先がノードＸである経路、およびローカル宛先がノードＢである経路）が登録されている。この場合、ノードＡ、Ｘ間のリンクが切断されたとしても、ノード装置Ａは、ノードＢを経由してノードＧＷへデータを送信することができる。したがって、この場合、ノード装置Ａは、自分（すなわち、ノードＡ）はボトルネック候補ではないと判定する。
【００６１】
これに対して、ノード装置Ｘのルーティングテーブル２２Ｘは、「グローバル宛先ＧＤ：ノードＧＷ」に対して１つの経路（ローカル宛先がノードＹである経路）のみが登録されている。この場合、ノードＸ、Ｙ間のリンクが切断されると、ノード装置Ｘは、ノードＧＷへデータを送信できなくなる可能性がある。したがって、この場合、ノード装置Ｘは、自分（すなわち、ノードＸ）はボトルネック候補であると判定する。同様に、ノード装置Ｆも、自分（すなわち、ノードＦ）はボトルネック候補であると判定する。
【００６２】
第２の方法においては、各ノード装置は、下記の条件Ａおよび条件Ｂを満たす場合に、自分がボトルネック候補であると判定する。
【００６３】
条件Ａ：グローバル宛先に対するローカル宛先が１つだけ
条件Ｂ：複数の隣接ノードを有する
【００６４】
図１０に示す例では、ノード装置Ｘおよびノード装置Ｆが条件Ａを満たす。よって、ノード装置Ｘおよびノード装置Ｆについて条件Ｂを検討する。
【００６５】
ノード装置Ｆは、隣接ノードを１つだけしか有していない。このため、ノード装置Ｆが故障したとしても、この故障に起因してノードＧＷへのデータ送信ができなくなるノードは存在しない。すなわち、条件Ａを満たすノードであっても、条件Ｂを満たさないノードは、ボトルネックノードであるか否かを調査する必要性は高くない。したがって、第２の方法では、ノード装置Ｆは、自分（すなわち、ノードＦ）はボトルネック候補ではないと判定する。ただし、ノード装置Ｆは、自分（すなわち、ノードＦ）は「単独の孤立」であると判定する。
【００６６】
ノード装置Ｘは、４つの隣接ノード（Ｙ、Ａ、Ｂ、Ｃ）を有し、条件Ｂを満たす。ここで、ノード装置Ｘにとって、ノードＹは、ノードＧＷへのデータ送信においてローカル宛先ＬＤである。このため、ノード装置Ｘは、隣接ノードＡ、Ｂ、ＣからノードＧＷ宛てのデータを受信すると、そのデータをノードＹへ送信する。この場合、ノード装置Ｘが故障すると、ノードＡ〜Ｃを含む多数のノードが、ノードＧＷへデータを送信できなくなるおそれがある。したがって、条件Ａおよび条件Ｂを満たすノードについては、ボトルネックノードであるか否かを調査することが好ましい。すなわち、第２の方法では、ノード装置Ｘは、自分（すなわち、ノードＸ）はボトルネック候補であると判定する。
【００６７】
第３の方法においては、各ノード装置は、下記の条件Ａおよび条件Ｃを満たす場合に、自分がボトルネック候補であると判定する。
【００６８】
条件Ａ：グローバル宛先に対するローカル宛先が１つだけ
条件Ｃ：グローバル宛先に対するローカル宛先として選択したノード以外のすべての隣接ノードにより、上記グローバル宛先に対するローカル宛先として選択されている。
【００６９】
以下、図１１に示すアドホックネットワークにおいて、ノード装置Ｘがボトルネック候補判定処理を実行するケースを説明する。なお、図１１に示すノードＡ〜Ｅ、Ｘ、Ｙ、ＧＷは、図１０を参照しながら説明した対応するノードと実質的に同じである。
【００７０】
ノード装置Ｘは、図１１に示すように、４つの隣接ノード（Ａ、Ｂ、Ｃ、Ｙ）を有している。また、ルーティングテーブル２２Ｘにおいては、「グローバル宛先ＧＤ：ノードＧＷ」に対して「ローカル宛先ＬＤ：ノードＹ」が登録されている。すなわち、ノード装置Ｘは、グローバル宛先がノードＧＷであるデータを生成または受信したときは、そのデータを隣接ノードＹへ送信する。
【００７１】
ノード装置Ｘは、ノードＡ、Ｂ、Ｃ、Ｙからそれぞれ受信するＨｅｌｌｏパケットに基づいて、自分（すなわち、ノードＸ）がボトルネック候補か否かを判定する。このとき、ノード装置Ａ、Ｂ、Ｃ、Ｙは、それぞれ、経路情報を含むＨｅｌｌｏパケットをブロードキャストする。
【００７２】
例えば、ノード装置Ａは、ルーティングテーブル２２Ａを備える。ルーティングテーブル２２Ａには、「グローバル宛先ＧＤ：ノードＧＷ」に対して２つの経路（ローカル宛先がノードＸである経路、およびローカル宛先がノードＢである経路）が登録されている。ここで、これら２つの経路を比較すると、ローカル宛先がノードＸである経路の方が評価値は小さい。この場合、ノード装置Ａは、ノードＧＷへの最適な経路として、ローカル宛先がノードＸである経路を選択する。すなわち、ルーティングテーブル２２Ａの経路情報は、「ノード装置Ａは、グローバル宛先がノードＧＷであるデータを生成または受信したときは、そのデータを隣接ノードＸへ送信する。」を表している。そして、ノード装置Ａは、Ｈｅｌｌｏパケットを利用して、ノードＧＷへデータを送るための経路情報を隣接ノードに通知する。図１１においては、ノード装置Ａは、「ＧＤ＝ＧＷ、ＬＤ＝Ｘ」を含むＨｅｌｌｏパケット４１Ａを隣接ノードへブロードキャストしている。ここで、「ＧＤ＝ＧＷ、ＬＤ＝Ｘ」は、図８に示すＨｅｌｌｏパケットの「グローバル宛先」「ローカル宛先」としてそれぞれ「ノードＧＷ」「ノードＸ」が設定されていることを表している。そして、ノード装置Ａから送信されるＨｅｌｌｏパケット４１Ａは、隣接ノードＸ（及び、ノードＢ、Ｄ）に到達する。
【００７３】
同様に、ノード装置Ｂ、Ｃ、Ｙは、それぞれＨｅｌｌｏパケット４１Ｂ、４１Ｃ、４１Ｙをブロードキャストする。このとき、Ｈｅｌｌｏパケット４１Ｂ、４１Ｃ、４１Ｙは、それぞれ下記の経路情報を含む。
【００７４】
４１Ｂ：「ＧＤ＝ＧＷ、ＬＤ＝Ｘ」
４１Ｃ：「ＧＤ＝ＧＷ、ＬＤ＝Ｘ」
４１Ｙ：「ＧＤ＝ＧＷ、ＬＤ＝Ｚ」
【００７５】
ノード装置Ｘは、Ｈｅｌｌｏパケット４１Ａ、４１Ｂ、４１Ｃ、４１Ｙ、およびルーティングテーブル２２Ｘの内容に基づいて、ノードＧＷへのデータ送信において自分（すなわち、ノードＸ）がボトルネック候補か否かを判定する。まず、ルーティングテーブル２２Ｘによれば、「グローバル宛先ＧＤ：ノードＧＷ」に対して「ローカル宛先ＬＤ」は１つだけ登録（すなわち、ＬＤ＝Ｙ）されている。よって、ノード装置Ｘは、条件Ａを満足する。また、ノードＸの隣接ノードＡ、Ｂ、Ｃ、Ｙの中で、ローカル宛先であるノードＹを除く他の３つの隣接ノードＡ、Ｂ、Ｃは、いずれも、「グローバル宛先ＧＤ：ノードＧＷ」に対するローカル宛先ＬＤとして「ノードＸ」を選択している。すなわち、ノード装置Ｘは、条件Ｃも満足する。したがって、ノード装置Ｘは、ノードＧＷへのデータ送信において、自分（すなわち、ノードＸ）がボトルネック候補であると判定する。
【００７６】
このように、図１１において、ノード装置Ａ〜ＣがそれぞれノードＧＷへのデータ送信においてローカル宛先としてノードＸを選択するときに、ノード装置Ｘは条件Ｃを満足する。よって、ノード装置Ｘが条件Ｃを満足するときは、ノード装置Ｘが故障すると、ノードＡ〜Ｃを含む多数のノードがノードＧＷへデータを送信できなくなる可能性が高い。したがって、条件Ａおよび条件Ｃを満たすノードについては、ボトルネックノードであるか否かを調査することが好ましい。
【００７７】
＜迂回経路探索処理＞
上述したように、実施形態の迂回経路探索方法では、アドホックネットワークにおいてボトルネック候補が抽出される。そして、抽出されたボトルネック候補に対して迂回経路探索処理が実行される。このとき、迂回経路探索処理は、各ノード装置が備える状態管理テーブル２３を利用して実行される。
【００７８】
図１２は、状態管理テーブル２３の一例を示す。なお、図１２は、図１０または図１１に示すノード装置Ｘにおいて作成される状態管理テーブル２３を示している。
【００７９】
状態管理テーブル２３は、グローバル宛先ごとに「ローカル宛先」「探索対象ノード」「隣接ノード」「状態」を管理する。ここでは、「グローバル宛先ＧＤ：ノードＧＷ」について「ローカル宛先」「探索対象ノード」「隣接ノード」「状態」が登録されている。
【００８０】
「ローカル宛先」には、グローバル宛先に対する最適な経路として選択される隣接ノードが登録される。なお、グローバル宛先に対応するローカル宛先は、ルーティングテーブル２２から検出される。「探索対象ノード」には、ボトルネックノードか否かの判定が行われるノード（すなわち、ボトルネック候補）が登録される。「隣接ノード」には、状態を管理する対象の隣接ノードが登録される。ただし、各ノード装置は、自分の状態も管理する。したがって、状態管理テーブル２３において「隣接ノード」として登録されるノードは、隣接ノードだけでなく、自ノードも含むものとする。ここで、「隣接ノード」は、グローバル宛先に対するローカル宛先ノードを含まないようにしてもよい。また、「隣接ノード」には、自ノードおよび自ノードをローカル宛先として選択する隣接ノードのみが登録されるようにしてもよい。「状態」は、「０：初期状態」「１：探索中」「２：迂回経路なし」「３：迂回経路あり」を識別する。
【００８１】
図１３は、ノード装置の状態の遷移を示す図である。各ノード装置は、それぞれ、図１３に示す４つの状態の中の１つの状態で動作する。「初期状態」は、ノード装置が迂回経路探索に係わっていない状態を表す。「探索中」は、ノード装置が迂回経路探索を実行している状態を表す。「迂回経路なし」は、ノード装置からグローバル宛先へのデータ送信においてボトルネック候補を経由しない経路（すなわち、迂回経路）が発見されない状態を表す。「迂回経路あり」は、ノード装置からグローバル宛先へのデータ送信においてボトルネック候補を経由しない経路（すなわち、迂回経路）が発見された状態を表す。
【００８２】
以下、迂回経路探索処理の実施例を示す。以下の説明では、図１４に示すアドホックネットワークにおいて、ノードＧＷがグローバル宛先であるものとする。また、ノードＸがボトルネック候補であるものとする。さらに、ノード装置Ａ〜Ｅ、Ｘは、それぞれ、ルーティングテーブル２２Ａ〜２２Ｅ、２２Ｘを有しているものとする。
【００８３】
各ノード装置は、グローバル宛先へのデータ送信において、リンク評価値が最小の隣接ノードをローカル宛先として選択する。たとえば、ノード装置Ａ、Ｂ、Ｃは、ノードＧＷへのデータ送信において、ローカル宛先として「ノードＸ］を選択する。すなわち、ノードＸは、ノード装置Ａ、Ｂ、Ｃによって、ローカル宛先として選択される。また、ノード装置Ｄは、ノードＧＷへのデータ送信において、ローカル宛先として「ノードＡ］を選択する。すなわち、ノードＡは、ノード装置Ｄによりローカル宛先として選択される。さらに、ノード装置Ｅは、ノードＧＷへのデータ送信において、ローカル宛先として「ノードＢ」を選択する。すなわち、ノードＢは、ノード装置Ｅによりローカル宛先として選択される。
【００８４】
ノードＤ、Ｃ、Ｅは、他の隣接ノードによってローカル宛先として選択されていない。このため、ノード装置Ｄ、Ｃ、Ｅは、ノードＧＷへのデータ送信において、他のノードから送信されるデータを「中継」することはない。すなわち、隣接ノード装置によってローカル宛先として選択されていないノードは、グローバル宛先へのデータ送信において「最上流」に位置している。よって、以下では、隣接ノード装置によってローカル宛先として選択されていないノードを「最上流ノード」と呼ぶことがある。図１４に示す例では、ノードＤ、Ｃ、Ｅは、ノードＧＷへのデータ送信において、最上流ノードである。
【００８５】
図１５は、迂回経路探索処理の開始時の状態を示す図である。図１５において、探索対象ノード（すなわち、ノードＸ）は、上述のボトルネック候補であり、二重丸で表わされている。また、最上流ノード（すなわち、ノードＤ、Ｃ、Ｅ）は、四角形で表わされている。
【００８６】
ノード装置Ｘは、状態管理テーブル２３Ｘを備える。図１５に示す状態管理テーブル２３Ｘにおいて、左端の「Ｘ」は、探索対象ノードを識別する。また、状態管理テーブル２３Ｘは、ノードＸ、Ａ、Ｂ、Ｃの状態を管理する。すなわち、ノード装置Ｘは、自分の状態、及びノードＸをローカル宛先として選択する隣接ノード（すなわち、ノードＡ、Ｂ、Ｃ）の状態を管理する。なお、ノードＸは、探索対象ノード（すなわち、ボトルネック候補）である。したがって、状態管理テーブル２３Ｘにおいて、ノードＸの状態は「１：探索中」に設定されている。以下、図１６〜図２３を参照しながら迂回経路探索処理の実施例を説明する。
【００８７】
ノード装置Ｘは、図１６に示すように、探索情報を含むＨｅｌｌｏパケットを隣接ノードへ送信する。探索情報は、図８に示すように、探索対象ノードを識別する情報およびノード状態を表す情報を含む。ここで、探索対象ノードはノードＸであり、ノードＸの状態は「１：探索中」である。したがって、ノード装置Ｘは、探索情報「Ｘ、１」を含むＨｅｌｌｏパケット５１Ｘを送信する。なお、「Ｘ、１」は、「探索対象ノード：ノードＸ」および「ノード状態：１」を表す。以下、「Ｘ、１」を含むＨｅｌｌｏパケットのことをＨｅｌｌｏパケット「Ｘ、１」と呼ぶことがある。ここで、Ｈｅｌｌｏパケット(Ｘ、１)は、最終宛先装置への経路探索を表す情報を含む探索データの一例である。そして、ノードＸから送信されるＨｅｌｌｏパケット「Ｘ、１」は、各隣接ノードＡ〜Ｃ、Ｙによって受信される。そして、ノード装置Ａ〜Ｃは、Ｈｅｌｌｏパケット「Ｘ、１」を受信すると、図１７に示すように、状態管理テーブル２３Ａ〜２３Ｃを作成または更新する。
【００８８】
ノードＡは、最上流ノードではない。したがって、ノードＡの状態管理テーブル２３Ａは、ノードＡおよびノードＡをローカル宛先として選択するノードＤの状態を管理する。そして、ノード装置Ａは、Ｈｅｌｌｏパケット「Ｘ、１」を受信すると、状態管理テーブル２３Ａにおいて、ノードＡの状態を「０：初期状態」から「１：探索中」に更新する。また、ノードＸからＨｅｌｌｏパケット「Ｘ、１」を受信したときのノード装置Ｂの動作は、ノードＡと実質的に同じである。
【００８９】
ノードＣは、上述したように、最上流ノードである。このため、ノードＣの状態管理テーブル２３Ｃは、ノードＣおよび隣接ノードＸ、Ｂ、Ｅの状態を管理する。そして、ノード装置Ｃは、ノードＸからＨｅｌｌｏパケット「Ｘ、１」を受信すると、ノードＣの状態を「０」から「１」に更新すると共に、Ｈｅｌｌｏパケット「Ｘ、１」の送信元であるノードＸの状態も「０」から「１」に更新する。
【００９０】
なお、ノード装置Ｙも、ノードＸからＨｅｌｌｏパケット「Ｘ、１」を受信する。しかし、ノードＹは、探索対象ノードであるノードＸによってローカル宛先として選択されている。この場合、ノード装置Ｙは、ノードＸから受信するＨｅｌｌｏパケット「Ｘ、１」を無視する。したがって、以下の説明では、ノードＹの動作については記載を省略する。
【００９１】
ノード装置Ａ〜Ｃは、それぞれ、図１８に示すように、探索情報を含むＨｅｌｌｏパケットを隣接ノードに送信する。ここで、ノードＡの状態は、「１：探索中」に更新されている。また、探索対象ノードは、変わることはない。したがって、ノード装置Ａは、Ｈｅｌｌｏパケット「Ｘ、１」を隣接ノードに送信する。同様に、ノード装置Ｂ、Ｃも、それぞれＨｅｌｌｏパケット「Ｘ、１」を隣接ノードに送信する。なお、各ノード装置は、それぞれ自律的に動作するので、ノード装置Ａ〜Ｃは、互いに独立したタイミングでＨｅｌｌｏパケット「Ｘ、１」を送信する。
【００９２】
ノード装置Ｄは、図１８に示すように、ノードＡおよびノードＢからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信する。ここで、ノードＤは、上述したように、最上流ノードである。このため、ノードＤの状態管理テーブル２３Ｄは、図１９に示すように、ノードＤおよび隣接ノードＡ、Ｂの状態を管理する。そして、ノード装置Ｄは、ノードＡからＨｅｌｌｏパケット「Ｘ、１」を受信すると、自分（すなわち、ノードＤ）の状態を「０」から「１」に更新すると共に、そのＨｅｌｌｏパケット「Ｘ、１」の送信元であるノードＡの状態も「０」から「１」に更新する。また、ノード装置Ｄは、ノードＢからＨｅｌｌｏパケット「Ｘ、１」を受信すると、そのＨｅｌｌｏパケット「Ｘ、１」の送信元であるノードＢの状態も「０」から「１」に更新する。この結果、ノードＤにおいて、状態管理テーブル２３Ｄにより管理されているすべてのノード（すなわち、ノードＤ、Ａ、Ｂ）の状態が「１」になる。
【００９３】
同様に、ノード装置ＥがノードＢ、ＣからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信すると、状態管理テーブル２３Ｅにより管理されているすべてのノード（すなわち、ノードＥ、Ｂ、Ｃ）の状態が「１」になる。また、ノード装置ＣがノードＸ、Ｂ、ＥからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信すると、状態管理テーブル２３Ｃにより管理されているすべてのノード（すなわち、ノードＣ、Ｘ、Ｂ、Ｅ）の状態が「１」になる。なお、図１９は、ノードＤがノードＡ、ＢからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信し、ノードＥがノードＢ、ＣからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信し、ノードＣがノードＸ、Ｂ、ＥからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信した後の状態を示している。
【００９４】
最上流ノードであるノード装置Ｄは、状態管理テーブル２３Ｄによって管理されているすべてのノードの状態が「１」になると、図１９に示すように、自分（すなわち、ノードＤ）の状態を「１：探索中」から「２：迂回経路なし」に更新する。そして、ノード装置Ｄは、図２０に示すように、探索情報「Ｘ、２」を含むＨｅｌｌｏパケットを隣接ノードに送信する。ここで、「Ｘ、２」は、「探索対象ノード：ノードＸ」および「ノード状態：２」を表す。また、「Ｘ、２」を含むＨｅｌｌｏパケットのことをＨｅｌｌｏパケット「Ｘ、２」と呼ぶことがある。さらに、ノード装置Ｅ、Ｃも、ノード装置Ｄと同様に、それぞれＨｅｌｌｏパケット「Ｘ、２」を隣接ノードに送信する。
【００９５】
ここで、Ｈｅｌｌｏパケット「Ｘ、２」の役割を説明する。Ｈｅｌｌｏパケット「Ｘ、２」は、最上流ノードがすべての隣接ノードからＨｅｌｌｏパケット「Ｘ、１」を受信したときに生成される。そして、最上流ノードがすべての隣接ノードからＨｅｌｌｏパケット「Ｘ、１」を受信する状態は、探索対象ノード（すなわち、ノードＸ）により最初に生成されたＨｅｌｌｏパケット「Ｘ、１」が、その最上流ノードよりも先に転送されないことを意味する。すなわち、この状態は、探索対象ノードから送信されるＨｅｌｌｏパケット「Ｘ、１」が、最上流ノードを経由してグローバル宛先へ到達できないことを表している。したがって、Ｈｅｌｌｏパケット「Ｘ、２」は、実質的に、「グローバル宛先へデータを送信するための迂回経路が存在しない」を表している。すなわち、Ｈｅｌｌｏパケット「Ｘ、２」は、Ｈｅｌｌｏパケット「Ｘ、１」が最終宛先装置へ到達しないことを表す情報を含むデータ（または、応答データ）の一例である。
【００９６】
ノードＧＷに対して最上流に位置するノード装置Ｄ、Ｅ、Ｃは、図２０に示すように、それぞれＨｅｌｌｏパケット「Ｘ、２」を対応する隣接ノードへ送信する。各ノード装置は、Ｈｅｌｌｏパケット「Ｘ、２」を受信すると、状態管理テーブル２３において、受信したＨｅｌｌｏパケット「Ｘ、２」の送信元ノードの状態を「１：探索中」から「２：迂回経路なし」に更新する。例えば、ノード装置Ａは、ノードＤからＨｅｌｌｏパケット「Ｘ、２」を受信すると、状態管理テーブル２３Ａにおいて、ノードＤの状態を「１」から「２」に更新する。また、ノード装置Ｂは、ノードＥからＨｅｌｌｏパケット「Ｘ、２」を受信すると、状態管理テーブル２３Ｂにおいて、ノードＥの状態を「１」から「２」に更新する。
【００９７】
ノード装置（最上流ノードを除く）は、自分をローカル宛先として選択する全ての隣接ノードからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信すると、状態管理テーブル２３において自分の状態を「２」に更新する。たとえば、ノード装置Ａは、図２０に示すように、ノードＡをローカル宛先として選択している全ての隣接ノード（この例では、ノードＤ）からＨｅｌｌｏパケット「Ｘ、２」を受信すると、状態管理テーブル２３ＡにおいてノードＡの状態を「２」に更新する。すなわち、ノード装置Ａは、状態管理テーブル２３Ａにより管理されているすべての隣接ノードの状態が「２」になると、自分（すなわち、ノードＡ）の状態も「２」に更新する。同様に、図２０では、ノード装置Ｂは、ノードＢをローカル宛先として選択している全ての隣接ノード（この例では、ノードＥ）からＨｅｌｌｏパケット「Ｘ、２」を受信すると、状態管理テーブル２３ＢにおいてノードＢの状態を「２」に更新する。
【００９８】
ノード装置Ａは、自分（すなわち、ノードＡ）の状態が「２」になると、図２１に示すように、Ｈｅｌｌｏパケット「Ｘ、２」を隣接ノードへ送信する。同様に、ノード装置Ｂは、自分（すなわち、ノードＢ）の状態が「２」になると、Ｈｅｌｌｏパケット「Ｘ、２」を隣接ノードへ送信する。
【００９９】
ノード装置Ｘは、図２０〜図２１に示すように、ノードＡ、Ｂ、ＣからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信する。そうすると、ノードＸの状態管理テーブル２３Ｘにおいて、ノードＡ、Ｂ、Ｃの状態はそれぞれ「２」に更新され、ノードＸの状態も「２」に更新される。
【０１００】
ボトルネック候補であるノード装置Ｘは、ノードＸをローカル宛先として選択する全てのノードからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信すると、グローバル宛先ＧＷへのデータ送信に対して迂回経路が存在しないと判定する。すなわち、ノード装置Ｘは、ノードＡ、Ｂ、ＣからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信すると、ノードＹを経由する経路の他にノードＧＷへデータを送信するための迂回経路が存在しないと判定する。そうすると、ノード装置Ｘは、ノードＧＷへのデータ送信においてノードＸがボトルネックであり、迂回経路が存在しないことを表す情報をノード装置ＧＷに通知する。この通知の方法は、特に限定されるものではなく、任意のデータ形式でよい。
【０１０１】
ノード装置Ｘは、迂回経路が存在しないことをノードＧＷへ通知した後、Ｈｅｌｌｏパケット「Ｘ、０」を隣接ノードへ送信する。ここで、「Ｘ、０」は、「探索対象ノード：ノードＸ」および「ノード状態：０（初期状態）」を表す。すなわち、Ｈｅｌｌｏパケット「Ｘ、０」は、各ノード装置に対して状態管理テーブル２３の初期化を指示する。
【０１０２】
Ｈｅｌｌｏパケット「Ｘ、０」を受信した各ノード装置は、状態管理テーブル２３において探索対象ノードＸに対応する状態を「０」に更新するとともに、Ｈｅｌｌｏパケット「Ｘ、０」を対応する隣接ノードへ送信する。また、各ノード装置は、Ｈｅｌｌｏパケット「Ｘ、０」を送信してから所定の探索情報保持時間が経過した後、状態管理テーブル２３において探索対象ノードＸに対応する情報を削除する。なお、探索情報保持時間は、例えば、ノード装置が最初のＨｅｌｌｏパケット「Ｘ、１」を送信した時から、最後のＨｅｌｌｏパケット「Ｘ、２」を受信するまでの期間とする。また、探索情報保持時間は、上記期間に所定のマージンを加えた長さであってもよい。
【０１０３】
次に、ノードＧＷへの送信において、迂回経路が存在するケースについて説明する。ここでは、図２２に示すように、ノードＨがノードＣに隣接しており、ノードＨとノードＧＷとの間に、ノードＸを経由しない経路（以下、迂回経路Ｈ）が存在するものとする。
【０１０４】
このケースでは、ノード装置Ｈは、ノードＣからＨｅｌｌｏパケット「Ｘ、１」を受信する。そうすると、ノード装置Ｈは、状態管理テーブル２３を更新すると共に、Ｈｅｌｌｏパケット「Ｘ、１」を隣接ノードへ送信する。ここで、ノードＨとノードＧＷとの間には迂回経路Ｈが存在する。このため、ノードＨから送信されるＨｅｌｌｏパケット「Ｘ、１」は、迂回経路Ｈを介して伝搬され、ノードＧＷに到達する。このとき、ノード装置Ａ〜Ｅは、例えば、Ｈｅｌｌｏパケット「Ｘ、１」またはＨｅｌｌｏパケット「Ｘ、２」を送信および受信している。
【０１０５】
ノード装置ＧＷは、迂回経路Ｈを介してＨｅｌｌｏパケット「Ｘ、１」すると、図２２に示すように、探索対象ノード（すなわち、ノードＸ）に対して、Ｈｅｌｌｏパケット「Ｘ、１」を受信したことを表す情報を通知する。すなわち、ノード装置ＧＷは、迂回経路が存在することを表す情報をノードＸへ通知する。この通知の方法は、特に限定されるものではなく、任意のデータ形式でよい。
【０１０６】
ノード装置Ｘは、迂回経路が存在することを表す情報をノードＧＷから受信すると、図２３に示すように、状態管理テーブル２３Ｘにおいて自分（すなわち、ノードＸ）の状態を「３：迂回経路あり」に更新する。また、ノード装置Ｘは、Ｈｅｌｌｏパケット「Ｘ、３」を隣接ノードに送信する。ここで、「Ｘ、３」は、「探索対象ノード：ノードＸ」および「ノード状態：３」を表す。
【０１０７】
Ｈｅｌｌｏパケット「Ｘ、３」を受信した各ノード装置は、状態管理テーブル２３において、探索対象ノードＸに対応する「状態」を「３」に更新すると共に、Ｈｅｌｌｏパケット「Ｘ、３」を隣接ノードへ送信する。さらに、各ノード装置は、Ｈｅｌｌｏパケット「Ｘ、３」を送信してから探索情報保持時間が経過した後、状態管理テーブル２３において探索対象ノードＸに対応する探索情報を削除する。
【０１０８】
なお、各ノード装置は、状態管理テーブル２３から探索情報を削除した後は、探索情報が付与されていないＨｅｌｌｏパケットを送信するようにしてもよい。この場合、Ｈｅｌｌｏパケットは、図８において、「探索対象ノード」および「ノード状態」が削除されたフォーマットである。
【０１０９】
なお、実施形態のアドホックネットワークは、各ノード装置が自律的に動作する。このため、ノード装置がＨｅｌｌｏパケット「Ｘ、１」、Ｈｅｌｌｏパケット「Ｘ、２」、Ｈｅｌｌｏパケット「Ｘ、３」、Ｈｅｌｌｏパケット「Ｘ、０」を受信する順番は、必ずしも同じではない。
【０１１０】
例えば、ノードＣから迂回経路Ｈを介してノードＧＷへＨｅｌｌｏパケット「Ｘ、１」が到達するまでに要する時間が長いものとする。この場合、ノードＧＷがＨｅｌｌｏパケット「Ｘ、１」を受信する前に、Ｈｅｌｌｏパケット「Ｘ、２」が各ノードに伝搬する。そうすると、ノード装置Ｘは、ノードＧＷがＨｅｌｌｏパケット「Ｘ、１」を受信する前に、「迂回経路が存在しない」と判定することがある。
【０１１１】
ただし、この後、ノードＧＷがＨｅｌｌｏパケット「Ｘ、１」を受信すると、ノードＧＷからノードＸへ迂回経路が存在することを表す情報が通知される。そうすると、ノード装置Ｘは、Ｈｅｌｌｏパケット「Ｘ、２」による判定よりも、ノードＧＷからの通知を優先し、ノードＧＷへのデータ送信において迂回経路が存在すると判定する。したがって、実施形態の迂回経路探索方法によれば、迂回経路の有無を精度よく判定できる。
【０１１２】
＜フローチャート＞
図２４〜図２５は、ボトルネック候補判定処理を示すフローチャートである。なお、ボトルネック候補判定処理は、各ノード装置において判定部３５により実行される。また、ボトルネック候補判定処理は、状態管理テーブル２３を作成する処理、および最上流ノードか否かを判定する処理を含む。さらに、ボトルネック候補判定処理は、例えば、図９に示すように、定期的に実行される。
【０１１３】
ステップＳ１１において、判定部３５は、ボトルネック判定フラグを初期化する。ボトルネック判定フラグの初期値は、「０：非ボトルネック」である。ボトルネック判定フラグは、ボトルネック判定フラグ格納部２４に格納される。なお、ボトルネック判定フラグは、「０：非ボトルネック」の他に、「１：単独の孤立」「２：ボトルネック候補」「３：ボトルネック確定」に更新され得る。
【０１１４】
ステップＳ１２において、判定部３５は、最上流フラグを初期化する。最上流フラグの初期値は、「１：最上流」である。最上流フラグは、最上流フラグ格納部２５に格納される。なお、最上流フラグは、グローバル宛先ＧＤごとに設定される。
【０１１５】
ステップＳ１３において、判定部３５は、状態管理テーブル２３を作成する。ただし、この時点では、状態管理テーブル２３には隣接ノードはエントリされない。例えば、ノード装置Ｘにおいては、ステップＳ１３により、図２６（ａ）に示す状態管理テーブル２３が作成される。図２６（ａ）に示す例では、「グローバル宛先：ＧＷ」「ローカル宛先：Ｙ」「探索対象ノード：Ｘ」が登録されている。また、この時点では「隣接ノード」フィールドには自ノード（すなわち、ノードＸ）のみが登録される。
【０１１６】
ステップＳ１４において、判定部３５は、状態管理テーブル２３に隣接ノードを登録するための期間をカウントするタイマＴＴを開始する。タイマＴＴがカウントする期間は、特に限定されるものではないが、例えば、各ノード装置がＨｅｌｌｏパケットを送信する間隔に対して十分に長いものとする。
【０１１７】
判定部３５は、タイマＴＴが満了するまで、ステップＳ２１〜Ｓ２８において、状態管理テーブル２３に隣接ノードを登録する。このとき、判定部３５は、自ノードをローカル宛先として選択する隣接ノードのみを状態管理テーブル２３に登録してもよい。また、判定部３５は、グローバル宛先ＧＤに対してノード装置が最上流ノードであるか否かの判定も行う。
【０１１８】
ステップＳ２１において、判定部３５は、隣接ノードから送信されるＨｅｌｌｏパケットを待ち受ける。なお、各ノード装置は、定期的にＨｅｌｌｏパケットをブロードキャストする。そして、Ｈｅｌｌｏパケットを受信すると、判定部３５は、ステップＳ２２において、状態管理テーブル２３に設定されているグローバル宛先ＧＤと、Ｈｅｌｌｏパケットのヘッダに設定されているグローバル宛先ＧＤとを比較する。これら２つのグローバル宛先ＧＤが一致すれば、判定部３５の処理はステップＳ２３に移行する。一方、これら２つのグローバル宛先ＧＤが一致しないときは、判定部３５は、ステップＳ２１に戻って次のＨｅｌｌｏパケットを待ち受ける。
【０１１９】
ステップＳ２３において、判定部３５は、Ｈｅｌｌｏパケットの送信元ノードが、状態管理テーブル２３においてグローバル宛先ＧＤに対して既に登録されているか否かをチェックする。Ｈｅｌｌｏパケットの送信元ノードが未だ状態管理テーブル２３に登録されていなければ、判定部３５の処理はステップＳ２４に移行する。一方、Ｈｅｌｌｏパケットの送信元ノードが既に状態管理テーブル２３に登録されていれば、ステップＳ２４〜Ｓ２６はスキップされる。
【０１２０】
ステップＳ２４において、判定部３５は、Ｈｅｌｌｏパケットのヘッダに設定されているグローバル宛先ＧＤに対する最適なローカル宛先ＬＤが、自ノードか否かをチェックする。すなわち、判定部３５は、Ｈｅｌｌｏパケットの送信元ノードが、グローバル宛先ＧＤへデータを送信する際にローカル宛先ＬＤとして自ノードを選択するか否かをチェックする。そして、ローカル宛先ＬＤが自ノードであれば、判定部３５の処理はステップＳ２５に移行する。一方、ローカル宛先ＬＤが自ノードでなければ、ステップＳ２５〜Ｓ２６はスキップされる。なお、以下の説明では、自ノード（すなわち、判定部３５を含むノード装置）を、グローバル宛先ＧＤへのデータ送信においてローカル宛先ＬＤとして選択する隣接ノードのことを「特定隣接ノード」と呼ぶことがある。
【０１２１】
ステップＳ２５において、判定部３５は、グローバル宛先ＧＤに対応する最上流フラグを「０：非最上流」に設定する。このとき、最上流フラグ格納部２５に保持されている最上流フラグが「１」であれば、判定部３５は、その最上流フラグを「１」から「０」に更新する。
【０１２２】
ステップＳ２６において、判定部３５は、状態管理テーブル２３においてグローバル宛先ＧＤに対応するエントリに、Ｈｅｌｌｏパケットの送信元ノードを追加する。
ステップＳ２７は、Ｈｅｌｌｏパケット内に複数のグローバル宛先ＧＤについての経路情報が格納されている場合に、各グローバル宛先ＧＤに対してステップＳ２２〜Ｓ２６の処理を実行するために設けられている。そして、ステップＳ２８においてタイマＴＴが満了すると、判定部３５の処理はステップＳ２９に移行する。
【０１２３】
なお、図２５に示す例では、状態管理テーブル２３には特定隣接ノードが登録される。しかし、状態管理テーブル２３の作成方法は、これに限定されるものではない。例えば、判定部３５は、特定隣接ノードを含むすべての隣接ノードを状態管理テーブル２３に登録してもよい。ただし、この場合、判定部３５は、特定隣接ノードと他の隣接ノードとが識別可能なように、各隣接ノードを状態管理テーブル２３に登録する。
【０１２４】
また、判定部３５は、ステップＳ２１〜Ｓ２８において、自ノードがグローバル宛先ＧＤに対して最上流ノードか否かを判定する。このとき、判定部３５は、各隣接ノードからＨｅｌｌｏパケットを受信する過程で、少なくとも１つの隣接ノードが特定隣接ノードであれば、ステップＳ２５を実行する。すなわち、グローバル宛先ＧＤへのデータ送信においてローカル宛先ＬＤとして自ノードを選択する隣接ノードが１つ以上存在するときは、自ノードは最上流ノードではないと判定される。換言すれば、グローバル宛先ＧＤへのデータ送信においてローカル宛先ＬＤとして自ノードを選択する隣接ノードが存在しないときに、判定部３５は、自ノードを最上流ノードと判定される。
【０１２５】
ステップＳ２９において、判定部３５は、自ノードが最上流ノードか否かをチェックする。このとき、判定部３５は、最上流フラグ格納部２５に格納されている最上流フラグを参照する。そして、自ノードが最上流ノードであれば、判定部３５は、ステップＳ３０を実行する。ステップＳ３０において、判定部３５は、リンクテーブル２１を参照し、状態管理テーブル２３に登録されていない隣接ノードがあれば、その未登録の隣接ノードを状態管理テーブル２３に追加する。一方、自ノードが最上流ノードでなければ、ステップＳ３０はスキップされる。
【０１２６】
このように、ステップＳ２９〜Ｓ３０によれば、最上流ノードの状態管理テーブル２３には、すべての隣接ノードが登録される。なお、ステップＳ２１〜Ｓ２８においてすべての隣接ノードが状態管理テーブル２３に登録されるときは、ステップＳ２９〜Ｓ３０は実行しなくてもよい。
【０１２７】
ステップＳ３１において、判定部３５は、ルーティングテーブル２２において探索対象のグローバル宛先ＧＤに対してローカル宛先ＬＤが１つだけ登録されているのか否かをチェックする。そして、ルーティングテーブル２２において複数の対応するローカル宛先ＬＤが登録されていれば、判定部３５の処理は終了する。この場合、ボトルネック判定フラグは、更新されずに「０：非ボトルネック」のままである。すなわち、ルーティングテーブル２２においてグローバル宛先ＧＤに対応する複数のローカル宛先ＬＤが登録されていれば、判定部３５は、そのグローバル宛先ＧＤに対して迂回経路が存在すると判定する。
【０１２８】
ルーティングテーブル２２において対応するローカル宛先ＬＤが１つだけ登録されているときは、判定部３５は、ステップＳ３２において、２以上の隣接ノードが存在するか否かをチェックする。そして、２以上の隣接ノードが存在するときは、判定部３５は、ステップＳ３３において、ボトルネック判定フラグを「２：ボトルネック候補」に更新する。すなわち、グローバル宛先ＧＤに対してローカル宛先ＬＤが１つだけであり、かつ複数の隣接ノードが存在するときは、判定部３５は、自ノードをボトルネック候補と判定する。一方、隣接ノードが１つだけ存在するときは、判定部３５は、ステップＳ３４において、ボトルネック判定フラグを「１：単独の孤立」に更新する。
【０１２９】
次に、図１０または図１４に示すアドホックネットワークを参照しながら、図２４〜図２５のフローチャートの手順を説明する。以下の説明では、ノードＸ、Ａ、Ｄ、Ｆについて説明する。
【０１３０】
ノードＸは、図１４に示すように、ノードＡ、Ｂ、Ｃによって、ノードＧＷへのデータ送信においてローカル宛先として指定されている。よって、ノードＸの判定部３５は、各隣接ノードからそれぞれＨｅｌｌｏパケットを受信すると、ステップＳ２６において、状態管理テーブル２３にノードＡ、Ｂ、Ｃを追加する。ノードＸの状態管理テーブル２３にノードＡ、Ｂ、Ｃが追加された状態を図２６（ｂ）に示す。このとき、ノードＡ、Ｂ、Ｃは、特定隣接ノードとして状態管理テーブル２３に登録される。
【０１３１】
また、上述のように、ノードＸをノードＧＷへのデータ送信においてローカル宛先として指定する隣接ノードが存在するので、判定部３５は、ステップＳ２５において、最上流フラグを「０」に更新する。すなわち、ノードＸは、ノードＧＷへのデータ送信において最上流ノードではないと判定される。
【０１３２】
さらに、ノードＸのルーティングテーブル２２Ｘにおいて、「グローバル宛先ＧＤ：ノードＧＷ」に対して、ローカル宛先ＬＤは１つしか登録されていない。したがって、ステップＳ３１は「Ｙｅｓ」と判定される。また、ノードＸは、４つの隣接ノードを有するので、ステップＳ３２は「Ｙｅｓ」と判定される。したがって、判定部３５は、ステップＳ３３において、ボトルネック判定フラグを「２」に更新する。すなわち、ノードＸは、ボトルネック候補であると判定される。
【０１３３】
ノードＡは、図１４に示すように、ノードＤによって、ノードＧＷへのデータ送信においてローカル宛先として指定されている。よって、ノードＡの判定部３５は、ステップＳ２５において、最上流フラグを「０」に更新する。すなわち、ノードＡも、ノードＧＷへのデータ送信において最上流ノードではないと判定される。
【０１３４】
また、ノードＡのルーティングテーブル２２Ａにおいて、「グローバル宛先ＧＤ：ノードＧＷ」に対して、２つのローカル宛先ＬＤが登録されている。したがって、ステップＳ３１は「Ｎｏ」と判定される。すなわち、ノードＡの判定部３５は、ステップＳ３２〜Ｓ３４を実行しないので、ノードＡは非ボトルネックと判定される。
【０１３５】
ノードＤは、図１４に示すように、いずれのノードによっても、ノードＧＷへのデータ送信においてローカル宛先として指定されていない。よって、ノードＤにおいてステップＳ２５は実行されず、最上流フラグは「１」のままである。すなわち、ノードＤは、ノードＧＷに対して最上流ノードであると判定される。また、ノードＤのルーティングテーブル２２Ｄにおいて、「グローバル宛先ＧＤ：ノードＧＷ」に対して、２つのローカル宛先ＬＤが登録されている。したがって、ノードＤは、非ボトルネックと判定される。
【０１３６】
ノードＦは、図１０に示すように、ノードＥのみに隣接している。そして、ノードＦのルーティングテーブル２２Ｆにおいて、「グローバル宛先ＧＤ：ノードＧＷ」に対して、ローカル宛先ＬＤは１つしか登録されていない。このため、ステップＳ３１は「Ｙｅｓ」と判定される。また、ノードＦは、隣接ノードを１つだけ有するので、ステップＳ３２は「Ｎｏ」と判定される。したがって、ノードＦの判定部３５は、ボトルネック判定フラグを「１」に更新する。すなわち、ノードＦは、単独の孤立と判定される。
【０１３７】
図２７〜図２９は、迂回経路探索処理を示すフローチャートである。なお、迂回経路探索処理は、各ノード装置において判定部３５により実行される。ただし、迂回経路探索処理の一部は、パケット生成部３３およびパケット送信部３４により実行される。また、迂回経路探索処理は、例えば、図９に示すように、アドホックネットワークの運用中は、継続的または繰返し実行される。
【０１３８】
図２７〜図２９のフローチャートにおいて、「ＩＤ」は、探索対象ノードを識別する情報であり、具体的には、ボトルネック候補ノードを識別する。また、アドホックネットワークが迂回経路探索を行っているときは、各ノード装置は、それぞれ定期的に、探索情報を含むＨｅｌｌｏパケットを隣接ノードにブロードキャストする。探索情報は、図８に示す「探索対象ノード」および「ノード状態」に相当する。なお、「探索対象ノード」および「ノード状態」は、図２７〜図２９では、それぞれ「ＩＤ」「ＳＴＡＴ」で表わされている。
【０１３９】
ステップＳ４１〜Ｓ４３において、判定部３５は、ボトルネック判定フラグの値を検出する。ボトルネック判定フラグは、図２４〜図２５に示すフローチャートにおいて決定され、ボトルネック判定フラグ格納部２４に格納されている。
【０１４０】
ボトルネック判定フラグが「２：ボトルネック候補」であれば、判定部３５は、ステップＳ４４において、自ノードの状態を「１：探索中」に更新する。即ち、ボトルネック候補と判定されたノード装置は、自分を探索対象として、迂回経路探索処理を開始する。
【０１４１】
ステップＳ４５において、判定部３５は、Ｈｅｌｌｏパケットを待ち受ける。なお、アドホックネットワーク上の各ノード装置は、それぞれ定期的に、Ｈｅｌｌｏパケットを隣接ノードに送信する。Ｈｅｌｌｏパケットは、図８に示すように、グローバル宛先を表す情報（ＧＤ）、迂回経路探索の対象ノードを識別する情報（ＩＤ）、ノード装置の状態を表す情報（ＳＴＡＴ）を含む。そして、ノード装置がＨｅｌｌｏパケットを受信したときは、判定部３５の処理はステップＳ４６に移行する。一方、ノード装置がＨｅｌｌｏパケットを受信していないときは、判定部３５の処理はステップＳ６１に移行する。
【０１４２】
ステップＳ４６において、判定部３５は、受信したＨｅｌｌｏパケットの内容に基づいて状態管理テーブル２３を更新する。このとき、判定部３５は、Ｈｅｌｌｏパケットに設定されているグローバル宛先ＧＤおよび探索対象ノード（ＩＤ）に対応するエントリにおいて、ノード状態を更新する。たとえば、「STAT＝１」を含むＨｅｌｌｏパケットを受信したときは、判定部３５は、自ノードおよびＨｅｌｌｏパケットの送信元ノードの状態を「１」に更新する。「STAT＝２」を含むＨｅｌｌｏパケットを受信したときは、判定部３５は、そのＨｅｌｌｏパケットの送信元ノードの状態を「２」に更新する。「STAT＝０」または「STAT＝３」を含むＨｅｌｌｏパケットを受信したときは、判定部３５は、探索情報保持時間タイマを起動する。
【０１４３】
ステップＳ５１〜Ｓ５８およびステップＳ６１〜Ｓ６６の処理は、探索対象ノード毎に実行される。すなわち、アドホックネットワーク上に複数のボトルネック候補が存在するときは、ステップＳ５１〜Ｓ５８およびステップＳ６１〜Ｓ６６の処理は、各ボトルネック候補に対してそれぞれ実行される。
【０１４４】
ステップＳ５１において、判定部３５は、自ノードの状態が「２」であるか否をチェックする。ノード装置の状態が「２」でなければ、判定部３５の処理はステップＳ５２に移行する。一方、ノード装置の状態が「２」であれば、ステップＳ５２〜Ｓ５８はスキップされ、判定部３５の処理はステップＳ７１に移行する。すなわち、ノード装置の状態が既に「迂回経路なし」と判定されているときは、ステップＳ５２〜Ｓ５８は実行されない。
【０１４５】
ステップＳ５２において、判定部３５は、状態管理テーブル２３に登録されているすべての特定隣接ノードの状態が「２」であるか否かをチェックする。そして、すべての特定隣接ノードの状態が「２」であれば、判定部３５の処理はステップＳ５５に移行する。一方、状態が「２」でない特定隣接ノードが存在するときは、判定部３５の処理はステップＳ５３に移行する。
【０１４６】
ステップＳ５３において、判定部３５は、迂回経路探索に係わるグローバル宛先に対応する最上流フラグが「１」であるか否かをチェックする。すなわち、判定部３５は、自ノードがグローバル宛先ＧＤに対して最上流ノードか否かをチェックする。ここで、最上流フラグは、最上流フラグ格納部２５に格納されている。そして、最上流フラグが「１」であれば、判定部３５の処理はステップＳ５４に移行する。一方、最上流フラグが「１」でなければ、判定部３５の処理はステップＳ６２に移行する。
【０１４７】
ステップＳ５４において、判定部３５は、状態管理テーブル２３に登録されているすべての隣接ノードの状態が「１」であるか否かをチェックする。そして、すべての隣接ノードの状態が「１」であれば、判定部３５の処理はステップＳ５５に移行する。一方、状態が「１」でない隣接ノードが存在するときは、判定部３５の処理はステップＳ６２に移行する。
【０１４８】
ステップＳ５５において、判定部３５は、自ノードの状態を「２：迂回経路なし」に更新する。すなわち、最上流ノードにおいては、判定部３５は、状態管理テーブル２３に登録されているすべての隣接ノードの状態が「１」であれば、自ノードの状態を「２」に更新する。これに対して、最上流ノード以外のノードにおいては、判定部３５は、状態管理テーブル２３に登録されているすべての特定隣接ノードの状態が「２」であれば、自ノードの状態を「２」に更新する。
【０１４９】
ステップＳ５６において、判定部３５は、ボトルネック判定フラグが「２」であるか否かをチェックする。そして、ボトルネック判定フラグが「２」であれば、判定部３５は、ステップＳ５７において、ボトルネック判定フラグを「２」から「３：ボトルネック確定」に更新する。すなわち、判定部３５は、自ノードがボトルネックであると判定する。さらに、判定部３５は、ステップＳ５８において、グローバル宛先へのデータ送信において迂回経路が存在しないことをそのグローバル宛先（ここでは、ノードＧＷ）へ通知する。このように、ボトルネック候補であるノード装置は、自ノードがボトルネックであると判定すると、迂回経路が存在しない旨をグローバル宛先ノードに通知する。
【０１５０】
ステップＳ６１は、ステップＳ４５においてＨｅｌｌｏパケットを受信していないときに実行される。判定部３５は、ステップＳ６１において、自ノードの状態が「２」であるか否をチェックする。ノード装置の状態が「２」でなければ、判定部３５の処理はステップＳ６２に移行する。ノード装置の状態が「２」であれば、ステップＳ６２〜Ｓ６６はスキップされ、判定部３５の処理はステップＳ７１に移行する。すなわち、ノード装置の状態が既に「迂回経路なし」と判定されているときは、ステップＳ６２〜Ｓ６６は実行されない。
【０１５１】
ステップＳ６２において、判定部３５は、自ノードの状態が「１」であるか否をチェックする。ノード装置の状態が「１」でなければ、判定部３５の処理はステップＳ６３に移行する。ノード装置の状態が「１」であれば、ステップＳ６３〜Ｓ６６はスキップされ、判定部３５の処理はステップＳ７１に移行する。なお、ステップＳ６２は、ステップＳ５３またはＳ５４において「Ｎｏ」と判定されたときにも実行される。
【０１５２】
ステップＳ６３において、判定部３５は、探索情報保持時間が経過したか否かをチェックする。探索情報保持時間は、ステップＳ４６において起動されたタイマによりカウントされる。すなわち、判定部３５は、「STAT＝０」または「STAT＝３」を含むＨｅｌｌｏパケットを受信したときから探索情報保持時間が経過したか否かをチェックする。そして、探索情報保持時間が経過していれば、判定部３５の処理はステップＳ６４に移行する。一方、探索情報保持時間が経過していなければ、判定部３５の処理はステップＳ７１に移行する。
【０１５３】
ステップＳ６４において、判定部３５は、自ノードの状態が「０」であるか否をチェックする。ノード装置の状態が「０」でないときは、判定部３５の処理はステップＳ６５に移行する。一方、ノード装置の状態が「０」であれば、判定部３５の処理はステップＳ６６に移行する。
【０１５４】
ステップＳ６５において、判定部３５は、自ノードの状態を「０：初期状態」に更新する。ここで、ステップＳ６５は、ステップＳ６１、Ｓ６２、Ｓ６４において「Ｎｏ」と判定されたときに実行される。すなわち、ステップＳ６５は、自ノードの状態が「３：迂回経路あり」のときに実行される。換言すれば、判定部３５は、迂回経路が存在すると判定した後、探索情報保持時間が経過すると、自ノードの状態を初期化する。
【０１５５】
ステップＳ６６において、判定部３５は、状態管理テーブル２３から、探索対象のグローバル宛先に対応する探索情報を削除する。すなわち、判定部３５は、自ノードの状態が「０：初期状態」のときに実行される。換言すれば、判定部３５は、自ノードの状態を初期化した後、探索情報保持時間が経過すると、状態管理テーブル２３から探索情報を削除する。
【０１５６】
このように、判定部３５は、ステップＳ５１〜Ｓ５８、Ｓ６１〜Ｓ６６において、受信したＨｅｌｌｏパケットの内容に基づいて状態管理テーブル２３を更新する。そして、ボトルネック候補ノードの判定部３５は、自ノードがボトルネックであるのか否かを判定する。
【０１５７】
ステップＳ７１において、判定部３５は、現在時刻がＨｅｌｌｏパケットの送信タイミングか否かをチェックする。ここで、ノード装置は、Ｈｅｌｌｏパケットを定期的に隣接ノードへ送信するために、例えば、パケット生成部３３およびパケット送信部３４に送信タイミングを通知するためのタイマを備えている。この場合、ステップＳ７２において、Ｈｅｌｌｏパケットの送信タイミングが通知されると、パケット送信部３３はＨｅｌｌｏパケットを生成し、パケット送信部３４はそのＨｅｌｌｏパケットを隣接ノードへ送信する。このとき、Ｈｅｌｌｏパケットの「探索対象ノード」「ノード状態」には、状態管理テーブル２３に格納されている「探索対象ノード」「状態（ＳＴＡＴ）」がそれぞれ書き込まれる。また、状態管理テーブル２３に複数のグローバル宛先および／または複数の探索対象ノードが登録されているときは、複数セットの探索情報がＨｅｌｌｏパケットに付加される。なお、現在時刻がＨｅｌｌｏパケットの送信タイミングでなければ、ステップＳ７２はスキップされる。
【０１５８】
なお、ステップＳ６６において状態管理テーブル２３から探索情報が削除された後は、パケット送信部３３は、ステップＳ７２において、「探索対象ノード」「ノード状態」が付与されていないＨｅｌｌｏパケットを生成する。ただし、パケット生成部３３は、状態管理テーブル２３から探索情報が削除された後であっても、「探索対象ノード」「ノード状態」が付与されていないＨｅｌｌｏパケットを生成してもよい。この場合、パケット送信部３３は、例えば、情報が無いことを表す値（例えば、すべてゼロ）を「探索対象ノード」「ノード状態」に書き込むようにしてもよい。
【０１５９】
ステップＳ７３において、判定部３５は、グローバル宛先ノード（ここでは、ノードＧＷ）から「迂回経路あり」を表す情報を受信したか否かをチェックする。なお、グローバル宛先ノードは、「ＳＴＡＴ＝１」を含むＨｅｌｌｏパケットを受信すると、「迂回経路あり」を表す情報を探索対象ノードへ送信する。例えば、図２２に示す例では、ノード装置ＧＷは、Ｈｅｌｌｏパケット「Ｘ、１」を受信すると、「迂回経路あり」を表す情報をノードＸへ送信している。
【０１６０】
判定部３５は、「迂回経路あり」を表す情報を受信すると、ステップＳ７４において、自ノードの状態を「３：迂回経路あり」に更新する。つづいて、判定部３５は、ステップＳ７５において、ボトルネック判定フラグを「０：非ボトルネック」に更新する。なお、「迂回経路あり」を表す情報を受信していなければ、判定部３５は、ステップＳ７４〜Ｓ７５の処理をスキップする。
【０１６１】
ボトルネック判定フラグが「３：ボトルネック確定」であれば、ステップＳ４１〜Ｓ４３において「Ｎｏ」と判定される。この場合、判定部３５の処理はステップＳ５８に移行する。そして、判定部３５は、ステップＳ５８において、「迂回経路なし」を表す情報をグローバル宛先（ここでは、ノードＧＷ）へ通知する。
【０１６２】
ボトルネック判定フラグが「１：単独の孤立」である場合の判定部３５の動作は、基本的に、ボトルネック判定フラグが「３」である場合と同じである。ただし、ボトルネック判定フラグが「１」であるときは、判定部３５は、ステップＳ４７において、自ノードの状態を「３」に更新する。
【０１６３】
次に、図１６〜図２３に示す実施例を参照しながら、図２７〜図２９のフローチャートの手順を説明する。
【０１６４】
（Ａ）図１６に示すノード装置Ｘの動作
ノードＸのボトルネック判定フラグは、「２：ボトルネック候補」である。よって、ステップＳ４２において「Ｙｅｓ」と判定され、判定部３５は、ステップＳ４４において、ノードＸの状態を「１：探索中」に更新する。ここで、ノードＸは、Ｈｅｌｌｏパケットを受信していないものとする。そうすると、ステップＳ６２において「Ｙｅｓ」と判定され、ノード装置Ｘは、ステップＳ７２において、Ｈｅｌｌｏパケットを隣接ノードに送信する。このとき、Ｈｅｌｌｏパケットの「グローバル宛先」「探索対象ノード」「状態」には、それぞれ「ノードＧＷ」「ノードＸ」「１」が設定される。すなわち、ノード装置Ｘは、Ｈｅｌｌｏパケット「Ｘ、１」を隣接ノードに送信する。
【０１６５】
（Ｂ）図１７〜図１８に示すノード装置Ａの動作
ノードＡのボトルネック判定フラグは、「０：非ボトルネック」である。そして、ノード装置Ａは、ノードＸからＨｅｌｌｏパケット「Ｘ、１」を受信する。そうすると、判定部３５は、ステップＳ４６において状態管理テーブル２３Ａを更新する。具体的には、判定部３５は、状態管理テーブル２３Ａの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＡの状態を「１」に更新する。この後、ステップＳ５１、Ｓ５２、Ｓ５３において「Ｎｏ」と判定され、ステップＳ６２において「Ｙｅｓ」と判定される。したがって、ノード装置Ａも、ノード装置Ｘと同様に、ステップＳ７２において、Ｈｅｌｌｏパケット「Ｘ、１」を隣接ノードに送信する。なお、ノードＸからＨｅｌｌｏパケット「Ｘ、１」を受信したノード装置Ｂ、Ｃの動作は、ノード装置Ａと実質的に同じである。
【０１６６】
（Ｃ）図１９〜図２０に示すノード装置Ｄの動作
ノードＤのボトルネック判定フラグは、「０：非ボトルネック」である。また、ノードＤは、最上流ノードである。そして、ノード装置Ｄは、ノードＡおよびノードＢからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信する。そうすると、ノードＤの判定部３５は、ステップＳ４６において状態管理テーブル２３Ｄを更新する。具体的には、判定部３５は、状態管理テーブル２３Ｄの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＤの状態を「１」に更新すると共に、ノードＡおよび状態Ｂの状態も「１」に更新する。
【０１６７】
この後、ステップＳ５１、Ｓ５２において「Ｎｏ」と判定され、ステップＳ５３において「Ｙｅｓ」と判定されるので、判定部３５の処理はステップＳ５４に移行する。このとき、ノードＤの状態管理テーブル２３Ｄの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＡ、Ｂの状態はいずれも「１」である。したがって、ステップＳ５４は「Ｙｅｓ」と判定される。
【０１６８】
続いて、ノード装置Ｄの判定部３５は、ステップＳ５５において、状態管理テーブル２３Ｄの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＤの状態を「２」に更新する。そして、ノード装置Ｄは、Ｈｅｌｌｏパケットを隣接ノードに送信する。このとき、Ｈｅｌｌｏパケットの「グローバル宛先」「探索対象ノード」「状態」には、それぞれ「ノードＧＷ」「ノードＸ」「２」が設定される。即ち、ノード装置Ｄは、Ｈｅｌｌｏパケット「Ｘ、２」を隣接ノードに送信する。なお、ノードＢ、ＣからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信したノード装置Ｅの動作は、ノード装置Ｄと実質的に同じである。また、ノードＸ、Ｂ、ＥからそれぞれＨｅｌｌｏパケット「Ｘ、１」を受信したノード装置Ｃの動作も、ノード装置Ｄと実質的に同じである。
【０１６９】
（Ｄ）図２１に示すノード装置Ａの動作
ノード装置Ａは、隣接ノードからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信する。ここで、ノードＧＷへのデータ送信においてノードＡを最適なローカル宛先として選択するノードは、図１４に示すように、ノードＤのみである。よって、ノードＡの状態管理テーブル２３Ａの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリには、特定隣接ノードとしてノードＤのみが登録されている。
【０１７０】
ノード装置ＡがノードＤからＨｅｌｌｏパケット「Ｘ、２」を受信すると、判定部３５は、ステップＳ４６において状態管理テーブル２３Ａを更新する。具体的には、判定部３５は、状態管理テーブル２３Ａの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＤの状態を「２」に更新する。このとき、ノードＡの状態は、未だ「１」である。したがって、ステップＳ５１において「Ｎｏ」と判定され、ステップＳ５２が実行される。
【０１７１】
ノードＡの判定部３５は、ステップＳ５２において、状態管理テーブル２３Ａの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリをサーチする。このとき、ノードＡにとっての特定隣接ノードであるノードＤの状態は「２」なので、判定部３５の処理はステップＳ５５へ移行する。そして、判定部３５は、ステップＳ５５において、状態管理テーブル２３Ａの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＡの状態を「２」に更新する。
【０１７２】
ステップＳ５６において、ノードＡの判定部３５は、ボトルネック判定フラグをチェックする。ここで、ノードＡのボトルネック判定フラグは、上述したように「０」である。よって、ステップＳ５６において「Ｎｏ」と判定され、ステップＳ５７〜Ｓ５８はスキップされる。
【０１７３】
この後、ノード装置Ａは、ステップＳ７２において、Ｈｅｌｌｏパケットを隣接ノードに送信する。このとき、Ｈｅｌｌｏパケットの「グローバル宛先」「探索対象ノード」「状態」には、それぞれ「ノードＧＷ」「ノードＸ」「２」が設定される。すなわち、ノード装置Ａは、Ｈｅｌｌｏパケット「Ｘ、２」を隣接ノードに送信する。なお、ノードＥからＨｅｌｌｏパケット「Ｘ、２」を受信したノード装置Ｂの動作は、ノード装置Ａと実質的に同じである。
【０１７４】
（Ｅ）図２１に示すノード装置Ｘの動作
ノード装置Ｘは、隣接ノードからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信する。ここで、ノードＧＷへのデータ送信においてノードＸを最適なローカル宛先として選択するノードは、図１４に示すように、ノードＡ、Ｂ、Ｃである。したがって、ノードＸの状態管理テーブル２３Ｘの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリには、特定隣接ノードとしてノードＡ、Ｂ、Ｃが登録されている。
【０１７５】
ノード装置ＸがノードＡ、Ｂ、ＣからそれぞれＨｅｌｌｏパケット「Ｘ、２」を受信すると、判定部３５は、ステップＳ４６において状態管理テーブル２３Ｘを更新する。具体的には、判定部３５は、状態管理テーブル２３Ｘの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＡ、Ｂ、Ｃの状態をそれぞれ「２」に更新する。このとき、ノードＸの状態は、未だ「１」である。したがって、ステップＳ５１において「Ｎｏ」と判定され、ステップＳ５２が実行される。
【０１７６】
ノードＸの判定部３５は、ステップＳ５２において、状態管理テーブル２３Ｘの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリをサーチする。このとき、ノードＡ、Ｂ、Ｃの状態はいずれも「２」なので、判定部３５の処理はステップＳ５５へ移行する。そして、判定部３５は、ステップＳ５５において、状態管理テーブル２３Ｘの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリにおいて、ノードＸの状態を「２」に更新する。
【０１７７】
ステップＳ５６において、ノードＸの判定部３５は、ボトルネック判定フラグをチェックする。ここで、ノードＸのボトルネック判定フラグは、上述したように「２：ボトルネック候補」である。よって、ステップＳ５６において「Ｙｅｓ」と判定され、ステップＳ５７〜Ｓ５８が実行される。
【０１７８】
ノードＸの判定部３５は、ステップＳ５７において、ボトルネック判定フラグを「３：ボトルネック確定」に更新する。すなわち、ノードＸの判定部３５は、ノードＸをボトルネックであると判定する。そうすると、判定部３５は、ステップＳ５８において、ノードＧＷへのデータ送信において迂回経路が存在しないことを表す情報をノードＧＷへ通知する。
【０１７９】
（Ｆ）図２２〜図２３に示すノード装置Ｘの動作
ゲートウェイ装置（ノードＧＷ）は、図２２に示すように、Ｈｅｌｌｏパケット「Ｘ、１」を受信すると、ノードＸとゲートウェイ装置との間に迂回経路が存在と判定する。そうすると、ゲートウェイ装置は、「迂回経路あり」を表す情報をノードＸに通知する。
【０１８０】
ノード装置Ｘは、ゲートウェイ装置（ノードＧＷ）から「迂回経路あり」を表す情報を受信する。この場合、ステップＳ７３において「Ｙｅｓ」と判定され、ノードＸの判定部３５は、ステップＳ７４〜Ｓ７５を実行する。すなわち、判定部３５は、ステップＳ７４において、ノードＸの状態を「３：迂回経路あり」に更新する。また、判定部３５は、ステップＳ７５において、ボトルネック判定フラグを「０：非ボトルネック」に更新する。さらに、判定部３５は、特に図示しないが、探索情報保持時間をカウントするためのタイマを起動する。
【０１８１】
この後、判定部３５は、探索情報保持時間が経過するまで、ステップＳ４１〜Ｓ７５の処理を繰り返し実行する。このとき、ノードＸの状態は「３」なので、ノード装置Ｘは、ステップＳ７２において、Ｈｅｌｌｏパケットを隣接ノードに送信する。このとき、Ｈｅｌｌｏパケットの「グローバル宛先」「探索対象ノード」「状態」には、それぞれ「ノードＧＷ」「ノードＸ」「３」が設定される。すなわち、ノード装置Ｘは、Ｈｅｌｌｏパケット「Ｘ、３」を隣接ノードに送信する。
【０１８２】
探索情報保持時間が経過すると（ステップＳ６３：Ｙｅｓ）、ノードＸの判定部３５は、ステップＳ６５において、ノードＸの状態を「０：初期状態」に更新する。その後、判定部３５は、ステップＳ６６において、状態管理テーブル２３Ｘの「グローバル宛先：ＧＷ」「探索対象：Ｘ」に対応するエントリの情報を削除する。
【０１８３】
（Ｇ）図２２〜図２３に示すノード装置Ａの動作
ノード装置ＡがノードＸからＨｅｌｌｏパケット「Ｘ、３」を受信すると、ノードＡの判定部３５は、ステップＳ４６において、ノードＡの状態を「３」に更新すると共に、探索情報保持時間をカウントするためのタイマを起動する。ノード装置Ａの以降の動作は、上記（Ｆ）で説明したノード装置Ｘの動作と実質的に同じである。すなわち、ノード装置Ａは、Ｈｅｌｌｏパケット「Ｘ、３」を隣接ノードに送信する。その後、所定時間が経過すると、判定部３５は、状態管理テーブル２３Ａからが対応する探索情報を削除する。Ｈｅｌｌｏパケット「Ｘ、３」を受信したときの各ノード装置の動作は、ノード装置Ａと実質的に同じである。
【０１８４】
このように、実施形態の迂回経路探索方法においては、特定のノード（実施例では、ボトルネック候補ノード）から送信される探索データ（実施例では、Ｈｅｌｌｏパケット「Ｘ、１」）が、最終宛先にまで伝搬するか否かを調査する。このため、特定のノードを経由せずに最終宛先ノードへデータを送信できるか否か、すなわち迂回経路が存在するか否か、を精度よく判定することができる。
【０１８５】
また、実施形態の迂回経路探索方法においては、アドホックネットワーク内の全ノードについてボトルネック判定を行うのではなく、一部のノード（すなわち、ボトルネック候補）についてのみボトルネック判定が実行される。したがって、ノード数が多いネットワークであっても、ボトルネックを発見するために要する時間は短い。この結果、ノード間のリンクの状態が不安定な無線ネットワークにおいても、ボトルネックノードを精度よく検出することができる。
【０１８６】
＜他の実施形態＞
図９に示すフローチャートにおいては、迂回経路探索方法は、ボトルネック候補を発見する手順、およびボトルネック候補を対象として迂回経路探索を実行する手順を含む。しかし、発明に係る迂回経路探索方法は、このフローチャートに限定されるものではない。例えば、ノード装置は、図２４〜図２５に示すフローチャートにおいて、自ノードがボトルネック候補であるときに、グローバル宛先へのデータ送信において迂回経路が存在しないと判定してもよい。
【図１】
2012073315.tif 000003
【図２】
2012073315.tif 000004
【図３】
2012073315.tif 000005
【図４】
2012073315.tif 000006
【図５】
2012073315.tif 000007
【図６】
2012073315.tif 000008
【図７】
2012073315.tif 000009
【図８】
2012073315.tif 000010
【図９】
2012073315.tif 000011
【図１０】
2012073315.tif 000012
【図１１】
2012073315.tif 000013
【図１２】
2012073315.tif 000014
【図１３】
2012073315.tif 000015
【図１４】
2012073315.tif 000016
【図１５】
2012073315.tif 000017
【図１６】
2012073315.tif 000018
【図１７】
2012073315.tif 000019
【図１８】
2012073315.tif 000020
【図１９】
2012073315.tif 000021
【図２０】
2012073315.tif 000022
【図２１】
2012073315.tif 000023
【図２２】
2012073315.tif 000024
【図２３】
2012073315.tif 000025
【図２４】
2012073315.tif 000026
【図２５】
2012073315.tif 000027
【図２６】
2012073315.tif 000028
【図２７】
2012073315.tif 000029
【図２８】
2012073315.tif 000030
【図２９】
2012073315.tif 000031
【国際調査報告】
2012073315.tif 000032
2012073315.tif 000033