(57)【要約】  ノード装置は、受信部、参加要求部、ルーティングテーブル、生成要求部、および、送信部を備える。受信部は、ネットワークの経路情報を通知する経路情報パケットを受信する。参加要求部は、隣接するノード装置である隣接ノード装置と隣接ノード装置を介して通信可能なノード装置の中から選択した第１のノード装置に、自身が所属している第１のクラスタへの参加を要求するための参加要求パケットを生成する。ルーティングテーブルは、第１のクラスタに所属している各所属ノード装置までの経路を記憶する。生成要求部は、第１のクラスタに所属する所属ノード装置の数が閾値を超えると、第１のクラスタに所属していない第２のノード装置に、第１のクラスタとは異なる第２のクラスタの生成を要求するための生成要求パケットを生成する。送信部は、参加要求パケットを第１のノード装置に送信し、生成要求パケットを第２のノード装置に送信する。
2013042208.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークの経路情報を通知する経路情報パケットを受信する受信部と、
隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置の中から選択した第１のノード装置に、自身が所属している第１のクラスタへの参加を要求するための参加要求パケットを生成する参加要求部と、
前記第１のクラスタに所属している各所属ノード装置までの経路を記憶するルーティングテーブルと、
前記第１のクラスタに所属する所属ノード装置の数が閾値を超えると、前記第１のクラスタに所属していない第２のノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求するための生成要求パケットを生成する生成要求部と、
前記参加要求パケットを前記第１のノード装置に送信し、前記生成要求パケットを前記第２のノード装置に送信する送信部
を備えることを特徴とするノード装置。
【請求項２】
前記隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置のうち、いずれのクラスタにも所属していない未所属ノード装置を特定すると共に、前記未所属ノード装置を未所属テーブルに記録する未所属ノード特定部をさらに備え、
前記参加要求部は、前記未所属テーブルに記録されているノード装置から、前記第１のクラスタへの参加を要求するノード装置を選択し、
前記未所属ノード特定部は、前記所属ノード装置を前記未所属テーブルから削除し、前記所属ノード装置から通知された情報から、前記所属ノード装置に隣接しているノード装置のうちでいずれのクラスタにも所属していないノード装置を特定し、前記未所属テーブルに記録する
ことを特徴とする請求項１に記載のノード装置。
【請求項３】
前記所属ノード装置から、前記所属ノード装置に隣接するノード装置が前記第２のクラスタに所属していることを通知する隣接クラスタ通知を受信すると、前記隣接クラスタ通知の送信元を前記第２のクラスタと対応付けて、候補テーブルに記録する候補テーブル生成部と
前記候補テーブルから選択したノード装置を、前記第２のクラスタと前記第１のクラスタの間のゲートウェイとして動作するノード装置であるサブゲートウェイに決定するサブゲートウェイ決定部
をさらに備える
ことを特徴とする請求項１もしくは２に記載のノード装置。
【請求項４】
前記サブゲートウェイ決定部は、前記サブゲートウェイに、前記第１のクラスタに所属しておらず、かつ、前記サブゲートウェイに隣接するノード装置までの経路をルーティングテーブルに記憶することと、前記隣接クラスタ通知で通知したクラスタに含まれるノード装置を前記サブゲートウェイとして動作させることを要求する
ことを特徴とする請求項３に記載のノード装置。
【請求項５】
所属しているクラスタ中に複数のサブゲートウェイがある場合、通信条件が所定の条件よりも良いサブゲートウェイを、前記所属しているクラスタに含まれていないノード装置宛のデータパケットの中継先として優先的に選択するデフォルトゲートウェイに決定するデフォルトゲートウェイ決定部をさらに備える
ことを特徴とする請求項３もしくは４に記載のノード装置。
【請求項６】
第１のノード装置は、前記第１のノード装置の隣接ノード装置、および、前記隣接ノード装置から通信可能なノード装置に、第１のクラスタへの参加を要求することにより、前記第１のノード装置を含む第１のクラスタを生成し、
前記第１のクラスタに所属している所属ノード装置は、経路情報を通知する経路情報パケットを送受信することにより、他の所属ノード装置までの経路をルーティングテーブルに記憶し、
前記第１のノード装置は、前記所属ノード装置の数が閾値を超えるまで、前記第１のクラスタへの参加の要求と、前記ルーティングテーブルへの経路の記憶を繰り返し、
前記所属ノードの数が前記閾値を超えると、前記第１のクラスタに所属していない第２のノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求する
ことを特徴とする通信方法。
【請求項７】
前記第１のノード装置は、前記第１のクラスタに所属しており、かつ、前記第２のクラスタに所属する第３のノード装置に隣接するノード装置を、前記第１のクラスタと前記第２のクラスタの間のゲートウェイとして動作するノード装置である第１のサブゲートウェイに決定し、
前記第１のサブゲートウェイは、前記第３のノード装置を、第１のクラスタと前記第２のクラスタの間のゲートウェイとして動作する第２のサブゲートウェイに設定し、
前記第１のサブゲートウェイは前記第２のサブゲートウェイまでの経路を前記ルーティングテーブルに記憶する
ことを特徴とする請求項６に記載の通信方法。
【請求項８】
前記第１のサブゲートウェイは、前記所属ノード装置から前記第１のクラスタとは異なるクラスタに所属する第４のノード装置へ送信されるデータを含むデータパケットを記憶し、
前記第１のサブゲートウェイは、前記第４のノード装置への経路を前記第２のサブゲートウェイに問い合わせ、
前記第２のサブゲートウェイが格納しているルーティングテーブルに前記第４のノード装置が記録されている場合、前記第２のサブゲートウェイは前記第４のノード装置への経路を前記第１のサブゲートウェイに通知し、
前記第１のサブゲートウェイは、通知された経路を用いて、前記データパケットを前記第４のノード装置へ送信する
ことを特徴とする請求項６もしくは７に記載の通信方法。
【請求項９】
前記第２のサブゲートウェイが格納しているルーティングテーブルに前記第４のノード装置が記録されていない場合、前記第２のサブゲートウェイは、前記第２のクラスタに所属している第３のサブゲートウェイに、前記第４のノード装置への経路を問い合わせ、
前記第３のサブゲートウェイは、前記第３のサブゲートウェイに隣接し、かつ、前記第２のクラスタに所属していない第４のサブゲートウェイに対して、前記第４のノード装置への経路を問い合わせ、
前記第４のサブゲートウェイが格納しているルーティングテーブルに前記第４のノード装置が記録されている場合、前記第４のサブゲートウェイは前記第４のノード装置への経路を前記第３のサブゲートウェイに通知し、
前記第３のサブゲートウェイは前記第４のノード装置への経路を前記第２のサブゲートウェイに通知する
ことを特徴とする請求項８に記載の通信方法。
【請求項１０】
ネットワークの経路情報を通知する経路情報パケットを受信し、
隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置に、第１のクラスタへの参加を要求する制御パケットを送信し、
前記第１のクラスタに所属している所属ノード装置までの経路をルーティングテーブルに記憶し、
前記所属ノード装置の数が閾値を超えると、前記第１のクラスタに所属していないノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求する制御パケットを送信する
処理をコンピュータに行わせることを特徴とする通信プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワークに属する複数のノード装置の間での通信方法と、ノード装置に関する。
【背景技術】
【０００２】
無線アドホックネットワークに属するノード装置は、ルーティング情報を伝播させるために、Ｈｅｌｌｏパケットを用いる。例えば、図１に示すアドホックネットワークに属するノード装置Ａは、ノード装置Ａが保持しているルーティング情報を含むＨｅｌｌｏパケットを生成し、周期的にブロードキャストする。Ｈｅｌｌｏパケットを受信したノード装置Ｂは、ノード装置Ｂが保持しているルーティング情報と、Ｈｅｌｌｏパケットに含まれている情報を比較し、ノード装置Ｂが保持していなかったルーティング情報をＨｅｌｌｏパケットから取得する。さらに、ノード装置Ｂは、Ｈｅｌｌｏパケットから経路の品質情報も取得し、なるべく品質情報の良い経路を用いて通信を行う。この品質情報には、ループ情報も含まれている。このように、アドホックネットワークに属するノード装置は、Ｈｅｌｌｏパケットを用いて、ネットワーク中に含まれている他のノード装置への経路情報を学習し、得られた最適経路を用いて通信を行う。ここで、アドホックネットワークに含まれている各ノード装置は、アドホックネットワーク中の他の全てのノード装置までの経路をルーティングテーブル中に保持する。例えば、ノード装置Ａは、アドホックネットワーク中のノード装置Ａ以外のノード装置の各々への経路情報をルーティングテーブルに保持する。このため、ノード装置Ａは、例えば、ノード装置Ｂを介してノード装置Ｃにデータパケットを送信することができる。【０００３】
関連する技術として、パケットを受信したノード装置が、予め記憶していた送信対象パケットの識別情報と、受信パケットの識別情報を比較する通信方法が知られている。この方法では、比較結果に基づいて、受信パケットの最終宛先への経路についての送信可能性が判断される。また、パケットの最終宛先ノードごとに、パケットを中継するノードについての重み付けを行い、重み付けの結果に基づいて、パケットの送り先を決定する方法も考案されている。さらに、互いに近傍に配置された複数のノード装置でクラスタを形成し、クラスタの中からクラスタヘッドを選択する際に、より多くの隣接ノードを持つノード装置がより高い確率でクラスタヘッドに選択されるようにする方法が知られている。また、無線センサーノードの位置情報とお互いの電波強度を元に安定した経路をツリー状に構築して、グループ分割する方法も考案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２０１１／０１３１６５号
【特許文献２】国際公開第２００９／１３０９１８号
【特許文献３】特開２００８−３１２０５９号公報
【特許文献４】特開２００７−２４３７９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
背景技術で述べた方法では、ネットワーク中に含まれるノード装置の数が増加すると、各ノード装置が保持するルーティングテーブルの大きさが大きくなってしまうという問題がある。ネットワーク中のノード装置をクラスタやグループに分ける方法であっても、形成されるクラスタやグループの規模が大きくなると、ルーティングテーブルが大きくなるという問題がある。【０００６】
本発明は、ノード装置が保持するルーティングテーブルの容量を抑えることを目的とする。
【課題を解決するための手段】
【０００７】
実施形態に係る装置は、受信部、参加要求部、ルーティングテーブル、生成要求部、および、送信部を備える。受信部は、ネットワークの経路情報を通知する経路情報パケットを受信する。参加要求部は、隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置の中から選択した第１のノード装置に、自身が所属している第１のクラスタへの参加を要求するための参加要求パケットを生成する。ルーティングテーブルは、前記第１のクラスタに所属している各所属ノード装置までの経路を記憶する。生成要求部は、前記第１のクラスタに所属する所属ノード装置の数が閾値を超えると、前記第１のクラスタに所属していない第２のノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求するための生成要求パケットを生成する。送信部は、前記参加要求パケットを前記第１のノード装置に送信し、前記生成要求パケットを前記第２のノード装置に送信する。
【発明の効果】
【０００８】
ルーティングテーブルの容量が抑制される。
【図面の簡単な説明】
【０００９】
【図１】アドホックネットワークの例を示す図である。
【図２】生成されたクラスタの例を示す図である。
【図３】ノード装置の構成の例を示す図である。
【図４】パケットの構成の例を説明する図である。
【図５】ノード装置のハードウェア構成の例を示す図である。
【図６】リンクテーブルの例を示す図である。
【図７】リンクテーブルを更新するときの経路管理部の動作の例を説明するフローチャートである。
【図８】未所属テーブルの例を示す図である。
【図９】未所属テーブルを更新するときの未所属ノード特定部の動作の例を説明するフローチャートである。
【図１０】クラスタの生成方法の例を説明する図である。
【図１１】クラスタテーブルの例を示す図である。
【図１２】起点ノード装置による、クラスタの生成の例を示す図である。
【図１３】クラスタの生成の際に行われる処理の例を説明するシーケンス図である。
【図１４】クラスタデータパケットの構成の例を示す図である。
【図１５】新たな起点ノード装置の指定とクラスタの生成の例を説明する図である。
【図１６】新たな起点ノード装置の指定とクラスタの生成において行われる通信の例を説明するシーケンス図である。
【図１７】クラスタ生成の手順の例を説明するフローチャートである。
【図１８】未所属ノードにクラスタへの参加を要求するときの動作の例を説明するフローチャートである。
【図１９】新たなクラスタの生成が開始される場合の動作の例を説明するフローチャートである。
【図２０】クラスタに所属しているノード装置でのＨｅｌｌｏパケットの生成の例を説明する図である。
【図２１】ノード装置がＨｅｌｌｏパケットを受信した場合に行う動作の例を説明するフローチャートである。
【図２２】ルーティングテーブルの更新のための動作の例を説明するフローチャートである。
【図２３】クラスタテーブルの更新のための動作の例を説明するフローチャートである。
【図２４】ルーティングテーブルの更新のための動作の例を説明するフローチャートである。
【図２５】クラスタテーブルの更新のための動作の例を説明するフローチャートである。
【図２６】サブゲートウェイの決定方法の例を説明する図である。
【図２７】所属クラスタに隣接するクラスタのＩＤを認識する方法の例を説明する図である。
【図２８】隣接クラスタの通知を受けたときの起点ノード装置の動作の例を説明する図である。
【図２９】サブゲートウェイの決定の際に行われる動作の例を説明するシーケンス図である。
【図３０】隣接クラスタ通知部の動作の例を説明するフローチャートである。
【図３１】隣接クラスタを通知されたときの候補テーブル生成部の動作の例を説明するフローチャートである。
【図３２】サブゲートウェイを生成する際の起点ノード装置の動作の例を説明するフローチャートである。
【図３３】サブゲートウェイに指定されたノードの動作の例を説明するフローチャートである。
【図３４】データパケットのフォーマットの例を示す図である。
【図３５】データパケットの受信に際して行われる動作の例を説明するフローチャートである。
【図３６】ハイウェイデータパケットのフォーマットの例を示す図である。
【図３７】所属クラスタに含まれないノード装置との通信方法の例を説明する図である。
【図３８】検索データパケットのフォーマットの例を示す図である。
【図３９】データパケットの宛先の検索方法とデータパケットの送信の例を説明する図である。
【図４０】検索データパケットの処理の例を説明するフローチャートである。
【図４１】ハイウェイデータパケットの処理の例を説明するフローチャートである。
【発明を実施するための形態】
【００１０】
図２は、生成されたクラスタの例を示す。図２の例では、図１に示したアドホックネットワークがクラスタＣ１〜Ｃ３の３つに分けられている。アドホックネットワークに含まれるノード装置の各々は、ネットワークの経路情報を通知する経路情報パケットを送受信することにより、隣接ノード装置を認識する。以下の説明では、経路情報パケットはＨｅｌｌｏパケットであるものとする。ここで、あるノード装置の「隣接ノード装置」は、あるノード装置から送信されたパケットを受信することができる範囲内に位置するノード装置のことを指すものとする。
【００１１】
起点ノード装置は、隣接ノード装置に対して、起点ノード装置が所属するクラスタと同じクラスタに所属するように要求するための制御パケットを送信する。ここで、起点ノード装置は、予め、１つのクラスタに含めることができるノード装置の数を表す閾値を記憶しており、閾値以下の数のノード装置を１つのクラスタに含める。クラスタに参加すると、ノード装置は、参加したクラスタを識別する識別子を含めたＨｅｌｌｏパケットを送信する。ノード装置は、同じクラスタに所属しているノード装置までの経路をルーティングテーブルに記録する。しかし、ノード装置は、所属するクラスタが異なるノード装置の情報はルーティングテーブルに記録しない。
【００１２】
各クラスタでは、隣接するクラスタ中のノード装置と通信可能なノード装置から「サブゲートウェイ」（sub gateway、ＳＧＷ）が選択される。図２の例では、四角で示すノード（ＳＧ１１〜ＳＧ３２）がサブゲートウェイであるものとする。サブゲートウェイとして動作するノード装置は、そのノード装置が所属しているクラスタに隣接するクラスタ中に含まれているサブゲートウェイの情報もルーティングテーブルに含めるものとする。例えば、サブゲートウェイＳＧ２１は、ＳＧ１２の情報を保持している。従って、ノード装置は、所属するクラスタとは異なるクラスタ中のノード装置に、サブゲートウェイを介してパケットを送信することができる。例えば、クラスタＣ２に属するノード装置は、サブゲートウェイＳＧ２１とＳＧ１２を介してクラスタＣ１に所属しているノード装置にパケットを送信することができる。
【００１３】
このように、各クラスタに所属するノード装置の数に上限を設け、サブゲートウェイ以外のノード装置が保持するルーティングテーブルには各クラスタ中のノード装置までの経路を記録するようにすると、ノード装置中のルーティングテーブルの肥大化を抑えることができる。また、サブゲートウェイは、サブゲートウェイが所属しているクラスタ中のノード装置への経路に加えて、隣接するクラスタ中のノードの情報も含む。このため、ノード装置は、サブゲートウェイを介して異なるクラスタに所属するノードにパケットを送信することができる。また、サブゲートウェイが保持する経路情報も、サブゲートウェイが所属しているクラスタ中のノード装置までの経路と、隣接するクラスタに所属するノード装置までの経路である。このため、サブゲートウェイに選択されたノード装置であっても、ルーティングテーブルに含まれる経路の数は、ネットワーク全体に含まれているノード装置の各々への経路の数に比べて小さくなる。従って、実施形態にかかる方法により、ネットワーク中のノード装置が保持するルーティングテーブルの大きさを小さくすることができる。
【００１４】
＜装置構成＞
図３は、ノード装置１０の構成の例を示す。ノード装置１０は、受信部１１、パケット分岐処理部１２、ＦＩＤ（frame identification）生成部１３、上位処理部１４、Ｈｅｌｌｏ生成部１５、送信部１６、Ｈｅｌｌｏ処理部２０、受信処理部３０、クラスタ処理部４０、検索処理部７０、データ処理部８０、記憶部９０を備える。受信部１１は、隣接するノード装置１０からパケットを受信する。
【００１５】
図４（ａ）は、ノード装置１０の間で送受信されるパケットの構成の例を示す。パケットは、ヘッダとペイロードを有する。ヘッダは、パケットの種類によらず共通の形式であり、Ｔｙｐｅフィールド、Ｌｅｎｇｔｈフィールド、グローバル宛先（Global Destination、ＧＤ）フィールド、グローバル送信元（Global Source、ＧＳ）フィールド、ローカル送信元（Local Source、ＬＳ）フィールド、ローカル宛先（Local Destination、ＬＤ）フィールドを含む。以下の説明で、「グローバル宛先」は、パケットの最終的な宛先のノード装置１０を示すものとする。一方、「ローカル宛先」は、パケットをグローバル宛先に送信するために行われる１ホップの転送の際に、宛先として指定されるノード装置１０を示す。「ローカル送信元」は、パケットが１ホップ転送される場合の転送元のノード装置１０を指す。「グローバル送信元アドレス」は、パケットを生成したノード装置１０を示すものである。装置を示すものは（ＭＡＣ）アドレス等、装置固有の識別子(ID)であっても良い。
【００１６】
Ｔｙｐｅフィールドは、ペイロードに含まれるデータの種類を示す。Ｔｙｐｅフィールドの値とパケットの種類の関係の例を図４（ｂ）のテーブルに表す。Ｈｅｌｌｏパケットでは、Ｔｙｐｅフィールドの値が「０」に設定されている。Ｔｙｐｅフィールドの値が「１」であるパケットはクラスタデータパケット（ＣＤＰ）である。また、Ｔｙｐｅフィールドの値が「２」であるパケットはハイウェイデータパケット（ＨＤＰ）、「３」であるパケットはデータパケット（ＤＰ）である。また、Ｔｙｐｅフィールドの値が「４」であるパケットは、検索データパケット（ＳＤＰ）である。個々のパケットについては後で詳しく説明する。これらのパケットのうち、クラスタデータパケット、検索データパケット、および、Ｈｅｌｌｏパケットは、ノード装置１０の制御に用いられる。以下の記載では、クラスタデータパケット、検索データパケット、もしくは、Ｈｅｌｌｏパケットのことを「制御パケット」と記載することがある。Ｌｅｎｇｔｈフィールドは、パケットの長さを表す。
【００１７】
パケット分岐処理部１２は、受信パケットのヘッダ中にあるＴｙｐｅフィールドの値によって受信パケットの種類を判別し、パケットの種類ごとに予め決められた出力先に出力する。パケット分岐処理部１２は、ＨｅｌｌｏパケットをＨｅｌｌｏ処理部２０に出力する。クラスタデータパケットは、クラスタ処理部４０に出力され、ハイウェイデータパケットは、データ処理部８０に出力される。データパケットは、Acknowledgment（ＡＣＫ）パケットである場合は受信処理部３０に出力されるが、ＡＣＫパケット以外のデータパケットはデータ処理部８０に出力される。また、パケット分岐処理部１２は、検索データパケットを検索処理部７０に出力する。なお、パケットに含まれている情報などについては後述する。
【００１８】
Ｈｅｌｌｏ処理部２０は、経路管理部２１、未所属ノード特定部２２を備える。Ｈｅｌｌｏ処理部２０は、Ｈｅｌｌｏパケットに含まれている情報を取得して、リンクテーブル９１、クラスタテーブル９２、未所属テーブル９３、ルーティングテーブル９５を更新する。リンクテーブル９１、クラスタテーブル９２、未所属テーブル９３、ルーティングテーブル９５は、記憶部９０に格納されている。リンクテーブル９１は、隣接するノード装置１０の識別子に対応付けて、隣接するノード装置１０が参加しているクラスタの識別子や、隣接するノード装置１０がサブゲートウェイに指定されているかなどの情報を保持する。クラスタテーブル９２は、ノード装置１０が所属しているクラスタと同じクラスタに所属しているノード装置１０の情報などを記録する。未所属テーブル９３は、クラスタに所属していないノード装置１０についての情報を記録している。なお、以下の説明では、クラスタに所属していないノード装置１０を「未所属ノード装置」と記載することがある。ルーティングテーブル９５は、ノード装置１０が所属するクラスタと同じクラスタに所属しているノード装置１０までの経路を記録する。リンクテーブル９１、クラスタテーブル９２、未所属テーブル９３、ルーティングテーブル９５については、後で詳しく説明する。
【００１９】
クラスタ処理部４０は、クラスタ生成部５０、サブゲートウェイ生成部６０、デフォルトＧＷ決定部４１、クラスタ検索テーブル（ＣＣＴ）４２、隣接クラスタテーブル（ＮＣＴ）４３、ゲートウェイ候補テーブル（ＳＧＷＣＴ）４４を備える。クラスタ生成部５０は、参加要求部５１、参加処理部５２、生成要求部５３、未所属ノード特定部５４を備える。起点ノード装置として選択されたノード装置１０では、参加要求部５１、生成要求部５３、未所属ノード特定部５４が動作する。一方、起点ノード装置として選択されていないノード装置１０では、参加処理部５２が動作する。参加要求部５１、参加処理部５２、生成要求部５３、未所属ノード特定部５４の動作については後で説明する。クラスタ構築テーブル４２は、生成要求部５３により新たに起点ノード装置に指定されたノード装置１０で参加要求部５１が動作するときに使用されるテーブルであり、起点ノード装置に指定したノード装置１０の情報などが記録される。また、未所属ノード特定部５４は、未所属テーブル９３の情報を使用し、適宜、更新する。
【００２０】
サブゲートウェイ生成部６０は、隣接クラスタ通知部６１、候補テーブル生成部６２、サブゲートウェイ決定部６３を備える。候補テーブル生成部６２とサブゲートウェイ決定部６３は、起点ノード装置として動作しているノード装置１０で動作する。一方、隣接クラスタ通知部６１は、起点ノード装置として動作していないノード装置１０と、起点ノード装置の両方で動作できるものとする。隣接クラスタテーブル４３とゲートウェイ候補テーブル４４は、サブゲートウェイ決定部６３および候補テーブル生成部６２の動作で参照される。デフォルトＧＷ決定部４１は、サブゲートウェイに設定されていないノード装置１０で動作する。デフォルトＧＷ決定部４１は、ノード装置１０が他のクラスタに所属するノード装置１０にパケットを送信するために使用するサブゲートウェイ（デフォルトゲートウェイ）を決定する。隣接クラスタ通知部６１、候補テーブル生成部６２、サブゲートウェイ決定部６３、隣接クラスタテーブル４３、ゲートウェイ候補テーブル４４についても、後で詳しく説明する。
【００２１】
検索処理部７０は、検索先決定部７１、検索実行部７２、サーチログテーブル７３を備える。検索先決定部７１と検索実行部７２は、サブゲートウェイで動作する。検索先決定部７１や検索実行部７２は、ハイウェイデータパケットの送信先を検索するために、サーチログテーブル７３、ハイウェイテーブル９４を用いる。ハイウェイデータパケットを用いた通信については後述する。
【００２２】
データ処理部８０は、データパケット（ＤＰ）処理部８１、ハイウェイデータパケット（ＨＤＰ）処理部８２、ペンディングデータテーブル８３を備える。ハイウェイデータパケット処理部８２は、パケット分岐処理部１２から受信したハイウェイデータパケットをデータパケットに変換することができる。ハイウェイデータパケット処理部８２は、変換により得られたデータパケットをデータパケット処理部８１に出力する。また、データパケット処理部８１からのデータパケットをハイウェイデータパケットに変換して送信部１６に出力できる。データパケット処理部８１は、パケット分岐処理部１２から入力されたデータパケットと、ハイウェイデータパケット処理部８２から入力されたデータパケット、上位処理部１４からのデータパケットを処理する。また、データパケット処理部８１は、適宜、データパケットに含まれている情報を上位処理部１４に出力することができる。上位処理部１４では、上位レイヤのアプリケーションによる処理が行われる。また、データパケット処理部８１やハイウェイデータパケット処理部８２は、ＦＩＤ生成部１３から入力されたＦＩＤを用いてパケットを生成する。ハイウェイデータパケットの処理についても後述する。
【００２３】
受信処理部３０は、ＡＣＫ処理部３１とバッファ部３２を備える。ＡＣＫ処理部３１は、パケット分岐処理部１２から受信したデータパケットの内容を確認し、受信の成功と失敗のいずれが通知されているかを認識する。バッファ部３２は、データパケットの送信の失敗と再送に備えて、送信済みのデータパケットを格納している。そこで、受信の成功を表すＡＣＫパケットが入力されると、ＡＣＫ処理部３１は、受信したＡＣＫパケットで特定されるデータパケットをバッファ部３２から削除する。
【００２４】
Ｈｅｌｌｏ生成部１５は、ノード装置１０への経路と、ルーティングテーブル９５に記録されている経路を、隣接ノード装置１０に通知するためのＨｅｌｌｏパケットを生成する。送信部１６は、Ｈｅｌｌｏ生成部１５、クラスタ処理部４０、検索処理部７０、データ処理部８０から入力されたパケットを、隣接ノードに送信する。
【００２５】
記憶部９０は、リンクテーブル９１、クラスタテーブル９２、未所属テーブル９３、ハイウェイテーブル９４、ルーティングテーブル９５のほかに、ＦＩＤ管理テーブル９６を備える。ＦＩＤ管理テーブル９６は、データパケットが送受信される経路のループ検出に用いられる。データパケット処理部８０は、データパケットのＧＳとＦＩＤを対応付けてＦＩＤ管理テーブル９６に記録する。受信処理部３０は、受信したデータパケットのＦＩＤとＧＳの組み合わせをＦＩＤ管理テーブル９６に記録されている情報と比較する。受信したデータパケットのＧＳとＦＩＤの組み合わせが既にＦＩＤ管理テーブル９６に記録されている場合、受信処理部３０は、データパケットがループによって戻ってきたと判断する。
【００２６】
図５は、ノード装置１０のハードウェア構成の例を示す図である。ノード装置１０は、MicroProcessingUnit（ＭＰＵ）１００、バス１０１（１０１ａ〜１０１ｃ）、PHYsical layer（ＰＨＹ）チップ１０２、タイマＩＣ１０４、Dynamic Random access Memory（ＤＲＡＭ）１０６、フラッシュメモリ１０７、無線モジュール１０８を備える。バス１０１ａ〜１０１ｃは、ＭＰＵ１００、ＰＨＹチップ１０２、タイマＩＣ１０４、ＤＲＡＭ１０６、フラッシュメモリ１０７、無線モジュール１０８の間でデータの入出力が可能になるように接続する。
【００２７】
ＭＰＵ１００は、フラッシュメモリ１０７に格納されたファームウェアなどのプログラムを読み込んで処理を行う。このとき、ＭＰＵ１００は、ＤＲＡＭ１０６をワーキングメモリとして使用できる。ＭＰＵ１００は、パケット分岐処理部１２、ＦＩＤ生成部１３、上位処理部１４、Ｈｅｌｌｏ生成部１５、Ｈｅｌｌｏ処理部２０、受信処理部３０、クラスタ処理部４０、検索処理部７０、データ処理部８０として動作する。ＤＲＡＭ１０６は、記憶部９０として動作する。ＰＨＹチップ１０２や無線モジュール１０８は、受信部１１および送信部１６として動作する。ここで、ＰＨＹチップ１０２はオプションであり、ノード装置１０は、ＰＨＹチップ１０２を介して回線による通信を行うことができる。例えば、Ｌ３ネットワークとアドホックネットワークとの間のゲートウェイとして動作するノード装置１０は、Ｌ３ネットワーク中のノード装置とＰＨＹチップ１０２を用いて通信することができる。タイマＩＣ１０４は、参加要求部５１や生成要求部５３が送信したパケットに対する応答パケットを受信するまでの時間を計測する際に用いられ、参加要求部５１や生成要求部５３の一部として動作する。
【００２８】
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置１０にインストールされてもよい。または、プログラムは、ネットワークからＰＨＹチップ１０２や無線モジュール１０８を介してダウンロードされることによりノード装置１０にインストールされてもよい。また、実施形態に応じて、ＤＲＡＭ１０６やフラッシュメモリ１０７以外の他の種類の記憶装置が利用されることがある。また、ノード装置１０は、コンピュータによって実現されても良い。
【００２９】
＜クラスタの生成前のＨｅｌｌｏパケットの処理＞
まず、クラスタが生成される前に、ネットワーク中のノード装置１０は、Ｈｅｌｌｏパケットを用いて隣接ノードや未所属ノードを確認する。Ｈｅｌｌｏパケットの例を図４（ｃ）に示す。以下、ノード装置１０ａがＨｅｌｌｏパケットをブロードキャスト送信することにより、ノード装置１０ａに隣接しているノード装置１０ｂにノード装置１０ａの情報を通知する場合を例として述べる。
【００３０】
Ｈｅｌｌｏパケットでは、ＧＤとＬＤがブロードキャストアドレス、ＧＳとＬＳがＨｅｌｌｏパケットを送信するノード装置１０のアドレスに設定されている。また、Ｔｙｐｅフィールドの値は「０」である。ペイロードには、クラスタフィールド、Ｓｇｗフラグ、データが含まれる。クラスタフィールドには、Ｈｅｌｌｏパケットの送信元であるノード装置１０ａが所属しているクラスタのクラスタ識別子が記録されるが、ここでは、クラスタが形成されていないため、クラスタの識別子は格納されない。Ｓｇｗフラグは、送信元のノード装置１０ａがサブゲートウェイであるかを表す。以下の説明では、Ｓｇｗフラグが「０」に設定されていることは、サブゲートウェイに設定されていないことを表し、Ｓｇｗフラグが「１」に設定されていることは、サブゲートウェイに設定されていることを表すものとする。クラスタの形成前は、いずれのノード装置１０もサブゲートウェイに設定されていないため、Ｓｇｗフラグの値は０である。データフィールドには、ルーティングテーブル９５に記録されているＧＤについての情報が記録される。しかし、クラスタが生成される前は、ルーティングテーブル９５も生成されていないので、データフィールドにデータが含まれていないＨｅｌｌｏパケットが送信される。
【００３１】
次に、図６〜図９を参照しながら、Ｈｅｌｌｏパケットを受信したときのノード装置１０ｂの動作について説明する。ノード装置１０ｂに備えられている経路管理部２１と未所属ノード特定部２２は、パケット分岐処理部１２を介してＨｅｌｌｏパケットを受信すると、受信したＨｅｌｌｏパケットに基づいて、リンクテーブル９１と未所属テーブル９３を更新する。
【００３２】
図６は、リンクテーブル９１の例を示す。リンクテーブル９１は、ノード装置１０の隣接ノード装置の各々について、隣接ノードのアドレス、クラスタ識別子、ホップ数、隣接ノード装置に対して設定されているＳｇｗフラグの値が記録される。リンクテーブル９１中のクラスタ識別子は、隣接ノード装置が所属しているクラスタを識別する識別子である。なお、図６はリンクテーブル９１の例であり、例えば、リンクテーブル９１はホップ数を含めないなど、リンクテーブル９１に含まれる情報を変更することができる。
【００３３】
図７は、リンクテーブル９１を更新するときの経路管理部２１の動作の例を説明するフローチャートである。経路管理部２１は、受信したＨｅｌｌｏパケットのＬＳを抽出し、ＬＳをキーとしてリンクテーブル９１のアドレスの欄を検索する（ステップＳ１）。キーとして用いたＬＳのアドレスがリンクテーブル９１に登録されていない場合、経路管理部２１は、ＬＳに対応するエントリを作成する（ステップＳ２でＮｏ、ステップＳ３）。次に、経路管理部２１は、追加したエントリにＨｅｌｌｏパケットのＬＳ、クラスタＩＤ、Ｓｇｗフラグの値を設定し、ホップ数を記録する（ステップＳ４）。すなわち、経路管理部２１は、アドレスの欄にＨｅｌｌｏパケットのＬＳを登録し、ホップ数に１を設定する。このとき、まだクラスタが生成されていないので、経路管理部２１は、クラスタＩＤの欄の値を初期化し、Ｓｇｗフラグの値を０に設定する。一方、ステップＳ２でＬＳのアドレスがリンクテーブル９１に登録されている場合、経路管理部２１は、エントリの作成を行わずにリンクテーブル９１を更新する（ステップＳ２でＹｅｓ）。この場合、経路管理部２１は、ステップＳ１の検索でヒットしたエントリについてステップＳ４の処理を行う。
【００３４】
図８は、未所属テーブル９３の例を示す。未所属テーブル９３は、未所属ノードを未所属ノードの隣接ノードと対応付けて記録している。図９は、未所属テーブル９３を更新するときの未所属ノード特定部２２の動作の例を説明するフローチャートである。ステップＳ１１〜Ｓ１５はクラスタに所属していないノード装置１０からＨｅｌｌｏパケットを受信した場合の動作であり、ステップＳ１６〜Ｓ１８は、クラスタに所属しているノード装置１０からＨｅｌｌｏパケットを受信した場合の動作である。ここでは、ステップＳ１１〜Ｓ１５を参照しながらノード装置１０ｂで行われる処理を説明し、ステップＳ１６〜Ｓ１８の処理については、後述する。
【００３５】
未所属ノード特定部２２は、受信したＨｅｌｌｏパケットのクラスタフィールドにクラスタ識別子が設定されているかを確認する（ステップＳ１１）。クラスタ識別子が設定されていない場合、未所属ノード特定部２２は、クラスタに所属していないノード装置１０からＨｅｌｌｏパケットを受信したと判断し、Ｈｅｌｌｏパケットの送信元を未所属テーブル（ＵＫＴ）９３に記録するための処理を行う。まず、未所属ノード特定部２２は、受信したＨｅｌｌｏパケットのＬＳを抽出し、ＬＳをキーとして未所属テーブル９３の未所属ノードの欄を検索する（ステップＳ１２）。キーとして用いたＬＳのアドレスが未所属テーブル９３に登録されていない場合、未所属ノード特定部２２は、ＬＳに対応するエントリを作成する（ステップＳ１３でＮｏ、ステップＳ１４）。さらに、未所属ノード特定部２２は、追加したエントリの未所属ノードにＨｅｌｌｏパケットのＬＳを設定し、隣接ノードの欄にＨｅｌｌｏパケットを受信したノード装置１０のアドレスを設定する（ステップＳ１５）。例えば、ノード装置１０ｂがノード装置１０ａから初めてＨｅｌｌｏパケットを受信した場合、ノード装置１０ａは未所属テーブル９３に記録されていない。そこで、ノード装置１０ｂの未所属ノード特定部２２は、新たに生成したエントリの未所属ノードの欄にノード装置１０ａを記録し、ノード装置１０ａの隣接ノードとして、ノード装置１０ｂを記録する。一方、ステップＳ１３で、キーとして用いたＬＳのアドレスが未所属テーブル９３に登録されていることが確認された場合、未所属ノード特定部２２は処理を終了する（ステップＳ１３でＹｅｓ）。
【００３６】
＜クラスタの生成＞
図１０は、クラスタの生成方法の例を示す。以下の説明では、クラスタの生成を開始するノード装置１０のことを「起点ノード装置」と記載することがある。また、ノード装置１０が所属しているクラスタを、そのノード装置１０の「所属クラスタ」と記載することがある。さらに、クラスタに所属しているノード装置１０を「所属ノード」と記載することもある。また、起点ノード装置は、予め、１つのクラスタに含めることができるノード装置１０の数を表す閾値を記憶しているものとする。
【００３７】
起点ノード装置は、Ｈｅｌｌｏパケットの送受信により隣接ノード装置を認識すると、隣接ノード装置を含むクラスタの生成を開始する。まず、起点ノード装置中の参加要求部５１は、生成するクラスタを識別するクラスタ識別子を決定する。次に、起点ノード装置を、決定したクラスタ識別子で識別されるクラスタに所属させる。以下の説明では、起点ノード装置Ｏ１はクラスタＣ４を生成するものとする。
【００３８】
次に、図１０（ａ）に示すように、起点ノード装置Ｏ１は、隣接ノード装置１０に、クラスタＣ４への参加を要求すると共に、クラスタＣ４を識別するクラスタ識別子を送信する（取り込み）。参加を要求されたノード装置１０は、いずれのクラスタにも所属していない場合、クラスタＣ４に所属すると共に、起点ノード装置Ｏ１にクラスタＣ４に参加した旨を通知（参加通知）する。ここで、起点ノード装置Ｏ１は、クラスタに関する情報を、適宜、クラスタテーブル９２に記録するものとする。図１１は、クラスタテーブル９２の例を示す。クラスタテーブル９２には、ノード装置１０の所属クラスタのクラスタ識別子と起点ノード装置Ｏ１のアドレスが記録されるものとする。例えば、起点ノード装置Ｏ１が保持するクラスタテーブル９２では、クラスタ識別子はＣ４である。起点ノード装置Ｏ１は、参加通知を受け取ると、参加通知の送信元を所属ノードとしてクラスタテーブル９２に記録する。なお、クラスタテーブル９２には、所属クラスタに含まれているサブゲートウェイも記録されるが、サブゲートウェイの設定や記録については、後述する。
【００３９】
起点ノード装置Ｏ１は、参加通知を受信すると、クラスタＣ４に所属しているノードの数をインクリメントし、閾値と比較する。クラスタＣ４に所属しているノード装置１０の数が閾値未満である場合、起点ノード装置Ｏ１は、他の隣接ノード装置にクラスタＣ４への参加を要求する。全ての隣接ノードに参加を要求しても、まだクラスタＣ４の所属ノードの総数が閾値に達しない場合、起点ノード装置Ｏ１は、隣接ノード装置を介して通信可能なノード装置１０に対しても、クラスタＣ４への参加を要求する。起点ノード装置Ｏ１は、クラスタＣ４に含まれるノード装置１０の数が閾値に達するまでクラスタＣ４への参加の要求を繰り返す。
【００４０】
クラスタＣ４の所属ノードの数が閾値と同数になると、起点ノード装置Ｏ１は、クラスタＣ４への参加の要求を停止する。さらに、起点ノード装置Ｏ１は、図１０（ｂ）に示すように、未所属ノードから選択したノード装置１０に対して、新たな起点ノード装置Ｏ２として動作することを要求する。また、起点ノード装置Ｏ１は、起点ノード装置として動作することを要求する際に、閾値を起点ノード装置Ｏ２に通知するものとする。
【００４１】
図１０（ｃ）に示すように、起点ノード装置Ｏ２はクラスタＣ５を生成する。クラスタＣ５の生成の際の起点ノード装置Ｏ２の動作は、起点ノード装置Ｏ１がクラスタＣ４を生成するときと同様である。クラスタＣ５の所属ノードの数が閾値に達すると、起点ノード装置Ｏ２は、起点ノード装置Ｏ３に新たなクラスタの生成を要求する。起点ノード装置Ｏ３は、クラスタＣ６を生成する。起点ノード装置Ｏ３は、参加を要求できる未所属ノードが無い場合、クラスタの作成終了を起点ノード装置Ｏ２に通知する。すると、起点ノード装置Ｏ２は、図１０（ｄ）に示すように、新たな起点ノード装置Ｏ４にクラスタの生成を要求する。
【００４２】
図１０（ａ）〜図１０（ｄ）に示す手順を繰り返されることにより、アドホックネットワーク中の全てのノード装置１０（ノード）がいずれかのクラスタに分類される。次に、図１２に示すアドホックネットワークでクラスタが生成される場合を例として、クラスタ生成部５０の動作を詳しく説明する。図１２に示すネットワークは、１５個のノード装置１０を含み、ノードＳは起点ノード装置として動作するものとする。図１２には、ノードＳ、ノードＡ、ノードＣの各々についての隣接ノードを示している。ノードＳの隣接ノードは、ＮＳの円で示される範囲のノードであるとする。同様に、ノードＡの隣接ノードはＮＡの円、ノードＣの隣接ノードはＮＣの楕円で囲まれた範囲に位置するノードであるとする。また、ここでは、起点ノード装置が記憶している閾値は９であるものとする。なお、図１２中の数字は、図１３を参照しながら説明する手順の番号を示す。
【００４３】
図１３は、クラスタの生成の際に行われる処理の例を説明するシーケンス図を示す。
（１）ノードＳの参加要求部５１は、隣接ノードの情報を取得すると、クラスタＣＳの生成を開始する。参加要求部５１は、ノードＳのクラスタテーブル（ＣＴ）９２のクラスタＩＤに「ＣＳ」を登録する。このとき、ノードＳ以外のノードでは、クラスタテーブル９２にクラスタＩＤは登録されていない。
【００４４】
（２）ノードＳの参加要求部５１は、未所属テーブル（ＵＫＴ）９３を参照し、未所属テーブル９３に登録されているノードから、クラスタＣＳへの参加を要求するノードを選択する。ここでは、ノードＡが選択されたとする。このとき、参加要求部５１は、未所属テーブル９３からノードＳがノードＡの隣接ノード（Ｎｅｉ）であることも認識する。
【００４５】
（３）参加要求部５１は、参加を要求するクラスタデータパケットを生成する。クラスタデータパケットの構成の例を図１４に示す。クラスタデータパケットでは、Ｔｙｐｅフィールドの値は１に設定される。参加要求部５１は、ノードＡがノードＳの隣接ノードであるため、ＧＤとＬＤの両方にノードＡのアドレスを設定する。また、参加要求部５１は、ＧＳとＬＳの両方にノードＳのアドレスを設定する。クラスタデータパケットのペイロードには、クラスタタイプフィールド、クラスタＩＤフィールド、データが含まれる。参加要求部５１は、クラスタタイプフィールドに参加要求を表す値（＝２）、クラスタＩＤフィールドにクラスタＣＳの識別子であるＣＳを設定する。参加要求部５１は、送信部１６を介して、生成したクラスタデータパケットをノードＡに送信する。
【００４６】
（４）ノードＡの参加処理部５２は、パケット分岐処理部１２を介して、ノードＳから送信されたクラスタデータパケットを受信する。参加処理部５２はクラスタタイプフィールドの値を確認することにより、クラスタへの参加が要求されたことを認識する。参加処理部５２は、ノードＡがいずれかのクラスタに参加しているかを、ノードＡのクラスタテーブル９２を参照して確認する。ここでは、クラスタテーブル９２にクラスタＩＤが登録されていないので、参加処理部５２は、ノードＡがいずれのクラスタにも参加していないと認識する。そこで、参加処理部５２は、クラスタＣＳに参加する。また、参加処理部５２は、クラスタテーブル９２のクラスタＩＤの欄にＣＳを設定し、合わせてノードＳのアドレスをクラスタＣＳの起点ノードのアドレスとして記録する。
【００４７】
（５）ノードＡの参加処理部５２は、起点ノード装置Ｓに送信する参加通知を生成する。参加処理部５２は、クラスタデータパケットのＧＤとＬＤをノードＳのアドレスに設定し、さらに、ＧＳとＬＳをノードＡのアドレスに設定する。さらに、クラスタタイプフィールドに「３」を設定する。ここで、クラスタタイプフィールド＝３は、クラスタデータパケットのＧＳに設定されたノードから送信されたクラスタデータパケットに対する応答メッセージであることを示すものとする（図１４）。また、参加処理部５２は、クラスタＩＤフィールドにＣＳを設定する。さらに、参加処理部５２は、データフィールドに、ノードＡが保持している未所属テーブル９３のデータを含める。図１３の例では、ノードＡの未所属テーブル９３に基づいて、ノードＳ、ノードＢ、ノードＣが未所属ノードとしてデータフィールドに記録される。クラスタデータパケットの生成が終わると、参加処理部５２は、生成したパケットをノードＳに送信する。
【００４８】
（６）ノードＳの未所属ノード特定部５４は、ノードＡからクラスタデータパケットを受信すると、クラスタＩＤフィールドの値を確認する。ここでは、クラスタＩＤフィールドの値がＣＳであるので、未所属ノード特定部５４は、ノードＡがクラスタＣＳに所属していることを認識する。そこで、未所属ノード特定部５４は、ノードＡのエントリを未所属テーブル９３から削除する。また、未所属ノード特定部５４は、ノードＳに記憶されているクラスタテーブル９２の所属ノードの欄に、ノードＡを登録する。
【００４９】
さらに、未所属ノード特定部５４は、ノードＡから受信したクラスタデータパケットのデータフィールドのデータを用いて、未所属テーブル９３を更新する。未所属ノード特定部５４は、クラスタデータパケットで通知されたノードの各々について、
（α）起点ノード装置として動作するノード、
（β）未所属テーブル９３に登録されているノード、
（γ）クラスタテーブル９２に登録されているノード
のいずれかに該当するかを確認する。（α）〜（γ）のいずれにも該当しない場合、未所属ノード特定部５４は、通知されたノードを未所属テーブル９３に登録する。ここでは、ノードＳ、ノードＢ、ノードＣが未所属ノードとして通知されているが、未所属ノード特定部５４は、ノードＳは起点ノードであることを認識すると、ノードＳを未所属テーブル９３に追加しない。さらに、未所属ノード特定部５４は、未所属テーブル９３に記録されているノードとノードＢ、ノードＣを比較する。すると、ノードＢはすでに未所属テーブル９３に登録されているので、未所属ノード特定部５４は、ノードＢも未所属テーブル９３に追加しない。ノードＣは起点ノードではなく、未所属テーブル９３にも登録されていないので、未所属ノード特定部５４は、ノードＣを未所属テーブル９３に登録する。このとき、ノードＣを通知してきたノードであるノードＡが、ノードＣの隣接ノードに指定される。登録後の未所属テーブル９３の例を図１３に示す。
【００５０】
（７）ノードＳの参加要求部５１は、クラスタテーブル９２に記録されている所属ノードの数を閾値と比較する。所属ノード数は２（ノードＳとノードＡ）であり、閾値よりも小さい。そこで、参加要求部５１は、未所属テーブル９３から、新たにクラスタＣＳへの参加を要求するノードを選択する。参加要求部５１は、参加を要求するノードとしてノードＣを選択し、ノードＡがノードＣの隣接ノードであることを認識したとする。
【００５１】
すると、参加要求部５１は、参加を要求するためのクラスタデータパケットを生成する。このとき、ＧＤにノードＣのアドレス、ＬＤにノードＡのアドレス、ＧＳとＬＳの両方にノードＳのアドレスが設定される。クラスタデータパケットのペイロードは、手順（３）で生成されたクラスタデータパケットと同様である。参加要求部５１は、生成したクラスタデータパケットをノードＡに送信する。
【００５２】
（８）ノードＡは、手順（７）で送信されたパケットを受信する。ノードＡの参加処理部５２は、ＧＤにノードＣのアドレスが設定されているので、受信したパケットがノードＡ宛てではないことを認識する。そこで、参加処理部５２は、受信したパケットのヘッダ中のＬＳをノードＡのアドレスに変更し、ＬＤをノードＣのアドレスに変更した上で、ノードＣに送信する。なお、ルーティングテーブル９５が生成される前は、参加処理部５２は、適宜、リンクテーブル９１を使用してクラスタデータパケットを転送しているものとする。
【００５３】
（９）ノードＣの参加処理部５２は、パケットを受信すると、手順（４）と同様の処理を行う。さらに、参加処理部５２は、クラスタデータパケットのＧＳに設定されていたノード（起点ノード装置）に送信するクラスタデータパケットを生成する。参加処理部５２は、クラスタデータパケットのＧＤをノードＳのアドレス、ＬＤをノードＡのアドレスに設定し、さらに、ＧＳとＬＳをノードＣのアドレスに設定する。ペイロードの情報は、手順（５）と同様に生成される。なお、ここでは、ノードＣの未所属テーブル９３に基づいて、ノードＡ、ノードＬ、ノードＭが未所属ノードとしてデータフィールドに記録される。生成されたクラスタデータパケットは、ノードＡに送信される。
【００５４】
（１０）ノードＡの参加処理部５２は、ノードＣからのクラスタデータパケットを受信すると、ＧＤを確認する。ＧＤにはノードＳが指定されているので、参加処理部５２は、受信したパケットのヘッダ中のＬＳをノードＡのアドレスに変更し、ＬＤをノードＳのアドレスに変更した上で、ノードＳに送信する。
【００５５】
（１１）ノードＳの未所属ノード特定部５４は、受信したクラスタデータパケットを、手順（６）と同様に処理する。すなわち、未所属ノード特定部５４は、ノードＣのエントリを未所属テーブル９３から削除し、クラスタテーブル９２の所属ノードの欄に、ノードＣを登録する。さらに、未所属ノード特定部５４は、ノードＣから通知された未所属ノードのうち、未所属テーブル９３への登録の対象となるノードを検索する。ここでは、ノードＡがすでにクラスタテーブル９２に登録されているので、未所属ノード特定部５４は、ノードＬとノードＭを未所属テーブル９３に登録する。なお、ノードＬとノードＭの隣接ノードとして、ノードＣが登録される。
【００５６】
なお、ノードＳは、ノードＡ以外の隣接ノードにも、手順（２）〜（６）の処理を繰り返すことにより、全ての隣接ノードをクラスタＣＳの所属ノードとすることができる。さらに、図１３を参照して説明した手順は一例であり、実装に応じて変更されることがある。例えば、起点ノード装置は、起点ノード装置の隣接ノードに対して優先的に参加を要求し、起点ノード装置の隣接ノードへの参加要求が終わった後に、隣接ノード以外のノードに参加を要求することができる。
【００５７】
図１２および図１３を参照しながら説明した処理により、クラスタＣＳにノードＡ〜ＨとノードＳが参加したとする。すると、クラスタＣＳの所属ノードの数は９であり、閾値に到達する。所属ノードの数が閾値と一致すると、参加要求部５１は処理を停止し、未所属テーブル９３に登録されているノードがあるかを確認する。未所属テーブル９３に登録されているノードが無い場合、参加要求部５１は、クラスタの生成が終了したと認識する。一方、未所属テーブル９３に未所属ノードが登録されている場合、参加要求部５１は、所属ノードの数が閾値に達していることと、未所属ノードがあることを生成要求部５３に通知する。生成要求部５３は、参加要求部５１からの通知を受けると、新たな起点ノード装置を指定する。
【００５８】
図１５は、新たな起点ノード装置の指定とクラスタの生成の例を示す。また、図１６は、新たな起点ノード装置の指定とクラスタの生成において行われる通信の例を説明するシーケンス図である。なお、図１５の数字は、図１６の説明で用いられる手順の番号を表す。
【００５９】
（２１）ノードＳの生成要求部５３は、ノードＳが生成しているクラスタＣＳの所属ノードの数は閾値に達しているが、未所属ノードが残っていることを、参加要求部５１から通知される。すると、生成要求部５３は、未所属テーブル９３を確認して、新たな起点ノードに指定するノードを決定する。ここでは、生成要求部５３が、ノードＬを新たな起点ノードに指定したとする。
【００６０】
（２２）生成要求部５３は、起点ノードに設定するためのクラスタデータパケットを生成する。新たなクラスタの生成を要求する場合、図１４に示すように、クラスタデータパケットのクラスタタイプフィールドの値は「１」に設定される。さらに、生成要求部５３は、クラスタデータパケットのヘッダを設定する。また、生成要求部５３は、クラスタデータパケットを経由させるノードを識別する情報を、クラスタデータパケットのデータフィールドに含める。
【００６１】
後述するように、クラスタが形成されると、クラスタに所属しているノード装置１０同士で送受信されたＨｅｌｌｏパケットにより、ルーティングテーブル９５が生成される。ルーティングテーブル９５には、所属しているクラスタと同一のクラスタ中のノード装置１０までの経路が保持される。そこで、生成要求部５３は、クラスタデータパケットの宛先の隣接ノードまでの経路についてのルーティングテーブル９５のデータを用いてアドレスを設定する。例えば、ここでは宛先となるノードＬは、ノードＣに隣接していることが未所属テーブル９３から認識される。ノードＳのルーティングテーブル９５には、ノードＣ宛てのパケットをノードＡを経由して送信できることが記録されている。そこで、生成要求部５３は、ＧＤにノードＣ、ＬＤにノードＡ、ＧＳとＬＳとにノードＳを指定する。さらに、生成要求部５３は、生成開始の宛先となるノードＬは、クラスタＩＤフィールドに記録する。生成要求部５３は、生成したクラスタデータパケットをノードＡに送信する。
【００６２】
（２３）ノードＡの参加処理部５２は、他のノード宛のクラスタデータパケットであって、クラスタタイプフィールドの値が「１」に設定されているパケットを受け取ると、ＧＤフィールドを参照する。参加処理部５２は、ＧＤフィールドに記録されているノードに向けて、クラスタデータパケットを転送する。ここでは、ＧＤフィールドにノードＣの情報が含まれているので、生成要求部５３は、クラスタデータパケットのＬＳをノードＡ、ＬＤをノードＣに変更して、ノードＣに送信する。
【００６３】
（２４）ノードＣの参加処理部５２は、ノードＡから受信したクラスタデータパケットのＬＳをノードＣ、ＬＤをノードＬ、ＧＤをクラスタデータパケットのクラスタＩＤフィールドに記録されているノードＬに変更して、ノードＬに送信する。このとき、参加処理部５２は、リンクテーブル９１を参照して転送を行うものとする。
【００６４】
（２５）ノードＬの参加要求部５１は、ノードＳからのクラスタデータパケットを受信すると、クラスタＣＬの生成を開始する。参加要求部５１は、ノードＬのクラスタテーブル（ＣＴ）９２のクラスタＩＤに「ＣＬ」を登録する。さらに、参加要求部５１は、クラスタ構築テーブル（ＣＣＴ）４２に、クラスタの生成開始を要求してきたパケットのＧＳとＬＳを記録する。ここでは、ＧＳとしてノードＳのアドレスが記録され、ＬＳとしてノードＣのアドレスが記録される。
【００６５】
（２６）ノードＬの参加要求部５１は、未所属テーブル９３に基づいて、クラスタＣＬへの参加を要求するノードを決定する。図１５の例では、ノードＬはノードＭに参加を要求する。参加を要求する際に行われる動作は、図１２と図１３を参照しながら説明した動作と同様である。
【００６６】
（２７）参加要求部５１は、未所属テーブル９３に未所属ノードがなくなると、クラスタの生成が終了したことを、クラスタデータパケット（終了通知メッセージ）を用いて、クラスタ構築テーブル４２に記録されているＧＳに通知する。このとき、参加要求部５１は、生成したクラスタに所属しているノードのリストを、終了通知メッセージのデータフィールドに記録する。ここでは、ノードＬの参加要求部５１は、生成したクラスタにノードＬとノードＭが含まれていることを通知する。
【００６７】
生成終了を通知するクラスタデータパケットのヘッダでは、ＧＤとしてクラスタ構築テーブル４２に記録されているＧＳのアドレスが指定される。ここでは、ノードＬは、ノードＳに、クラスタ生成の終了を通知する。終了通知メッセージでは、クラスタタイプフィールドの値は「４」に設定されており、クラスタＩＤはＣＬに設定されている。ノードＬの参加要求部５１は、ＬＤにノードＣを指定した上で、生成したパケットをノードＣに送信する。さらに、終了通知メッセージを送信すると、参加要求部５１は、クラスタ検索テーブル４２のエントリを削除する。
【００６８】
（２８）ノードＣの参加処理部５２は、ノードＬから受信したクラスタデータパケットのＧＤがノードＳであることを認識すると、ルーティングテーブル９５を用いてクラスタデータパケットを転送する。このとき、参加処理部５２は、クラスタデータパケットのＬＳをノードＣのアドレス、ＬＤをノードＡのアドレスに設定した上で、ノードＡに送信する。
【００６９】
（２９）ノードＡの参加処理部５２も、ルーティングテーブル９５を用いて、クラスタデータパケットの転送処理を行う。参加処理部５２は、クラスタデータパケットのＧＤがノードＳであることを認識すると、パケットのＬＳをノードＡのアドレス、ＬＤをノードＳのアドレスに設定した上で、ノードＳに送信する。
【００７０】
（３０）ノードＳの生成要求部５３は、ノードＡから、ノードＬで生成された終了通知メッセージを受信する。すると、生成要求部５３は、ノードＬのエントリを未所属テーブル９３から削除する。さらに、生成要求部５３は、生成終了通知のデータフィールドに記録されているノードについても、未所属テーブル９３からエントリを削除する。ここでは、ノードＬとノードＭのエントリが未所属テーブル９３から削除される。
【００７１】
図１７は、クラスタ生成の手順の例を説明するフローチャートである。起点ノードの参加要求部５１は、クラスタの生成を開始する（ステップＳ２１）。参加要求部５１は、未所属テーブル（ＵＫＴ）９３に登録があるかを確認する（ステップＳ２１でＹｅｓ、ステップＳ２２）。未所属テーブル９３に未所属ノードが登録されている場合、参加要求部５１は、生成しているクラスタの所属ノード数と閾値を比較することにより、新たなノードをクラスタに追加できるかを確認する（ステップＳ２２でＹｅｓ、ステップＳ２３）。新たなノードをクラスタに追加できる場合、参加要求部５１は、クラスタへの参加要求を行う（ステップＳ２３でＹｅｓ、ステップＳ２４）。新たなノードをクラスタに追加できない場合、参加要求部５１は、生成要求部５３に新たなクラスタの生成を依頼する（ステップＳ２３でＮｏ、ステップＳ２５）。一方、ステップＳ２２で未所属テーブル９３に未所属ノードが登録されていないと判定した場合、参加要求部５１は処理を終了する（ステップＳ２２でＮｏ）。また、ステップＳ２１で起点ノードではないと判定されたノードでも、処理が終了される（ステップＳ２１でＮｏ）。
【００７２】
図１８は、未所属ノードにクラスタへの参加を要求するときの動作の例を説明するフローチャートである。なお、図１８のフローチャートは一例である。例えば、ステップＳ３７〜Ｓ３９の順序は任意に変更することができる。また、ステップＳ４１はオプションであり、ノード装置１０の性能に応じて省略することもできる。
【００７３】
参加要求部５１は、未所属テーブル９３に記録されている未所属ノードの１つを選択し、クラスタデータパケットを生成する（ステップＳ３１、Ｓ３２）。このとき、クラスタデータパケットのＧＤにはステップＳ３１で選択されたノードのアドレスが指定される。また、クラスタタイプフィールドの値は２（ＣＲＥＡＴＥ）に設定される。さらに、クラスタＩＤには、参加要求部５１が生成しているクラスタのＩＤが記録される。参加要求部５１は、生成したクラスタデータパケットを送信し、送信時刻を記録する（ステップＳ３３、Ｓ３４）。クラスタデータパケットの参加通知メッセージ（ＡＣＫ）を受信するまで、未所属ノード特定部５４は待機する（ステップＳ３５、Ｓ３６）。参加通知メッセージを受信すると、未所属ノード特定部５４は、参加通知メッセージの送信元のノードのエントリを、未所属テーブル９３から削除する（ステップＳ３６でＹｅｓ、ステップＳ３７）。さらに、未所属ノード特定部５４は、参加通知メッセージのデータに未所属ノードの情報が含まれている場合、得られたノードの情報を未所属テーブル９３に追加する（ステップＳ３８）。さらに、未所属ノード特定部５４は、クラスタテーブル９２に参加通知メッセージの送信元を追加する（ステップＳ３９）。
【００７４】
一方、ステップＳ３６で参加通知メッセージを受け取っていないと判定した場合、未所属ノード特定部５４は、参加を要求するクラスタデータパケットの送信時刻から経過した時間が所定の時間よりも長いかを確認する（ステップＳ３６でＮｏ、ステップＳ４０）。所定の時間を経過していない場合、ステップＳ３５以降の処理が繰り返される。所定の時間を経過しても参加通知メッセージを受信できない場合、参加を要求したノードについては、次に未所属テーブル９３からノードを選択する際の優先順位を低くする（ステップＳ４１）。
【００７５】
図１９は、新たなクラスタの生成が開始される場合の動作の例を説明するフローチャートである。なお、図１９のフローチャートは一例である。例えば、ノード装置１０の性能に応じてステップＳ５９を省略するなどの変更が加えられることがある。
【００７６】
生成要求部５３は、未所属テーブル９３に登録されている未所属ノードの１つを選択する（ステップＳ５１）。生成要求部５３は、選択した未所属ノードに送信するためのクラスタデータパケットを生成する（ステップＳ５２）。このとき、クラスタデータパケットのＧＤはステップＳ５１で選択された未所属ノードに対する隣接ノードのアドレスが指定される。また、クラスタタイプフィールドの値は１（ＳＴＡＲＴ）に設定される。さらに、クラスタＩＤには、新たに生成されるクラスタを識別するクラスタＩＤが記録される。なお、クラスタＩＤにより、新たな起点ノードとされるノード装置１０は、一意に識別できるものとする。生成要求部５３は、生成したクラスタデータパケットを送信し、送信時刻を記録する（ステップＳ５３、Ｓ５４）。クラスタデータパケットの終了通知メッセージ（ＦＩＮＩＳＨ）を受信するまで、生成要求部５３は待機する（ステップＳ５５、Ｓ５６）。終了通知メッセージを受信すると、生成要求部５３は、終了通知メッセージの送信元のノードのエントリを、未所属テーブル９３から削除する（ステップＳ５６でＹｅｓ、ステップＳ５７）。さらに、生成要求部５３は、ステップＳ５３で送信したクラスタデータパケットに基づいて生成されたクラスタの所属ノードについても、未所属テーブル９３から削除する。
【００７７】
一方、ステップＳ５６で参加通知メッセージを受け取っていないと判定した場合、生成要求部５３は、クラスタの生成を要求するクラスタデータパケットの送信時刻から経過した時間が所定の時間よりも長いかを確認する（ステップＳ５６でＮｏ、ステップＳ５８）。所定の時間を経過していない場合、ステップＳ５５以降の処理が繰り返される（ステップＳ５８でＮｏ）。所定の時間を経過しても終了通知メッセージを受信できない場合、クラスタの生成を要求したノードについては、次に未所属テーブル９３からノードを選択する際の優先順位を低くする（ステップＳ５８でＹｅｓ、ステップＳ５９）。
【００７８】
＜クラスタ所属後のＨｅｌｌｏパケットの処理＞
クラスタの生成中やクラスタの生成後も、ノード装置１０の間でＨｅｌｌｏパケットの送受信が行われる。以下、クラスタの生成が開始された後で、いずれのノード装置１０もサブゲートウェイに設定されていない場合について、Ｈｅｌｌｏパケットの処理を説明する。サブゲートウェイが設定された後の処理は、後述する。
【００７９】
ノード装置１０の動作は、Ｈｅｌｌｏパケットを受信したノード装置１０がクラスタに所属しているかによって変化する。クラスタに所属していないノード装置１０がＨｅｌｌｏパケットを受信した場合の動作は、先に図６〜図９を参照しながら説明したとおりである。一方、クラスタに所属しているノード装置１０では、Ｈｅｌｌｏパケットを用いてルーティングテーブル９５やクラスタテーブル９２の更新が行われることがある。また、クラスタに所属しているノード装置１０は、Ｈｅｌｌｏパケットを生成する際に、ノード装置１０が記憶しているルーティングテーブル９５の経路情報をＨｅｌｌｏパケットのデータフィールドに含めることができる。
【００８０】
図２０は、クラスタに所属しているノード装置１０ａでのＨｅｌｌｏパケットの生成の例を示す。図２０（ａ）は、Ｈｅｌｌｏパケットのフォーマットの例を示す。図２０（ｂ）は、データフィールドのフォーマットの例を示す。データフィールドには、ＧＤについての情報が含まれる。データフィールドに含まれているＧＤの数は、Ｌｅｎフィールドに記録される。ノード装置１０ａのＨｅｌｌｏ生成部１５は、ルーティングテーブル９５に記録されているＧＤについて、クラスタＩＤ、ホップ数、Ｓｇｗフラグの値を読み出して、データに含める。
【００８１】
ルーティングテーブル９５の例を図２０（ｃ）に示す。ルーティングテーブル９５は、ＧＤごとに、ＴＴＬ（Time to Live）エントリ生存カウンタの値、ＧＤクラスタＩＤ、ＧＤ−Ｓｇｗフラグの値、ＬＤが記録されている。ここで、「ＧＤ−Ｓｇｗフラグ」は、ルーティングテーブル９５でＧＤに対応付けて記録されているＳｇｗフラグの値である。ここでは、いずれのノード装置１０もサブゲートウェイに指定されていないので、ＧＤ−Ｓｇｗフラグの値は、いずれのノードでも０であるものとする。ＴＴＬエントリ生存カウンタの値は、ＧＤについての記録が更新されてから経過した時間に応じて減少し、ＴＴＬエントリ生存カウンタの値が正の値である場合、ＧＤに関する情報が有効であることを示す。ＧＤクラスタＩＤは、ＧＤが所属しているクラスタを識別する識別子である。また、図２０（ｃ）の例では、ＧＤにパケットを送信するためにノード装置１０が設定するＬＤが、ＧＤごとに３つ記録されており、各ＬＤに応じてホップ数が記録されている。
【００８２】
Ｈｅｌｌｏ生成部１５は、ＧＤ、クラスタＩＤ、ＧＤ−Ｓｇｗフラグ、ホップ数の各々について、ルーティングテーブル９５に記録されている値を取得してデータに設定する。このとき、Ｈｅｌｌｏ生成部１５は、ノード装置１０ａからＧＤにパケットを送信する際に第１候補として用いられるＬＳに対応付けられたホップ数をデータに含めるものとする。
【００８３】
図２１は、ノード装置１０がＨｅｌｌｏパケットを受信した場合に行う動作の例を説明するフローチャートである。ここでは、ノード装置１０ａからブロードキャストされたＨｅｌｌｏパケットをノード装置１０ｂ、１０ｃが受信する場合の例を、図２１を参照しながら説明する。ここで、ノード装置１０ａとノード装置１０ｂはクラスタに所属しており、ノード装置１０ｃは未所属ノードであるとする。なお、図２１は動作の例であり、例えば、ステップＳ６１とＳ６２の順序の変更、ステップＳ６５とＳ６６の順序の変更、ステップＳ７１とＳ７２の順序の変更などの変更が加えられる場合がある。
【００８４】
ノード装置１０ｂ、１０ｃのいずれも、Ｈｅｌｌｏパケットを受信すると、リンクテーブル９１と未所属テーブル９３を更新する（ステップＳ６１、Ｓ６２）。なお、ステップＳ６１は図７で説明した動作と同様であり、ステップＳ６２は図９のステップＳ１６〜Ｓ１８の動作と同様である。ノード装置１０ａから送信されたＨｅｌｌｏパケットによりクラスタが通知されているので、ノード装置１０ｂ、１０ｃは、Ｈｅｌｌｏパケット中のＬＳをキーとして未所属テーブル９３の未所属ノードの欄を検索する（ステップＳ１１でＹｅｓ、ステップＳ１６）。未所属ノードがヒットしたら未所属ノード特定部２２は、ヒットしたノードのエントリを削除する（ステップＳ１７、Ｓ１８）。
【００８５】
次に、ノード装置１０は、クラスタテーブル９２にクラスタＩＤが記録されているかを確認する（ステップＳ６３）。クラスタに所属していないノード装置１０ｃは処理を終了する（ステップＳ６３でＮｏ）。
【００８６】
クラスタに所属しているノード装置１０ｂは、クラスタテーブル９２に記録されているクラスタ識別子と、Ｈｅｌｌｏパケット中のクラスタ識別子を比較する（ステップＳ６４）。両者が一致すると、ノード装置１０ｂの経路管理部２１は、ノード装置１０ａ（ＨｅｌｌｏパケットのＬＳ）について、ルーティングテーブル９５を更新する（ステップＳ６４でＹｅｓ、ステップＳ６５）。また、経路管理部２１は、クラスタテーブル９２を更新するための処理も行う（ステップＳ６６）。
【００８７】
ノード装置１０ｂの経路管理部２１は、Ｈｅｌｌｏパケットのデータフィールドに含まれているリストから、未処理のエントリを１つ取得する（ステップＳ６７、Ｓ６８）。未処理のエントリに有効な値が記録されていない場合、経路管理部２１は処理を終了する（ステップＳ６８でＮｏ）。
【００８８】
一方、未処理のエントリを取得できた場合、経路管理部２１は、取得したエントリのＧＤがノード装置１０ｂ（経路管理部２１が備えられているノード装置１０）のアドレスと一致するかを確認する（ステップＳ６８でＹｅｓ、ステップＳ６９）。取得したエントリのＧＤとノード装置１０ｂのアドレスが一致した場合、経路管理部２１は、ルーティングテーブル９５を更新せずに他のエントリの処理を行うため、ステップＳ６７に戻る（ステップＳ６９でＹｅｓ）。一方、取得したエントリのＧＤとノード装置１０ｂのアドレスが一致しない場合、経路管理部２１は、さらに、取得したエントリについて記録されているクラスタＩＤが、ノード装置１０ｂが所属しているクラスタを識別するクラスタＩＤであるかを確認する（ステップＳ７０）。取得したエントリについて記録されているクラスタＩＤが、ノード装置１０ｂの所属クラスタを識別するクラスタＩＤである場合、経路管理部２１は、ルーティングテーブル９５とクラスタテーブル９２を更新する（ステップＳ７０でＹｅｓ、ステップＳ７１、Ｓ７２）。その後、経路管理部２１はステップＳ６７以降の処理を繰り返す。一方、取得したエントリについて記録されているクラスタＩＤが、ノード装置１０ｂが所属しているクラスタを識別するクラスタＩＤではない場合、経路管理部２１はステップＳ６７以降の処理を繰り返す（ステップＳ７０でＮｏ）。
【００８９】
ステップＳ６４においてクラスタテーブル９２に記録されているクラスタ識別子と、Ｈｅｌｌｏパケット中のクラスタ識別子が一致しない場合、ノード装置１０ｂの経路管理部２１は、ノード装置１０ｂがサブゲートウェイであるかを確認する（ステップＳ７３）。ノード装置１０ｂがサブゲートウェイではない場合、ノード装置１０ｂは処理を終了する（ステップＳ７３でＮｏ）。ノード装置１０ｂがサブゲートウェイの場合は、ルーティングテーブル９５とクラスタテーブル９２が更新される（ステップＳ７４、Ｓ７５）。ノード装置１０ｂがサブゲートウェイである場合の動作については、後述する。
【００９０】
図２２は、ルーティングテーブル９５の更新のための動作の例を説明するフローチャートである。図２２は、図２１のステップＳ６５の処理を詳細に表している。ノード装置１０ｂの経路管理部２１は、ＨｅｌｌｏパケットのＬＳに登録されているアドレスをキーとして、ルーティングテーブル９５のＧＤの欄を検索することにより、ＬＳまでの経路が既に登録されているかを確認する（ステップＳ８１、Ｓ８２）。ＨｅｌｌｏパケットのＬＳまでの経路が登録されていない場合、経路管理部２１は、ルーティングテーブル９５に新たなエントリを作成し、作成したエントリにＬＳに対応する値を記録する（ステップＳ８２でＮｏ、ステップＳ８３、Ｓ８４）。一方、ＨｅｌｌｏパケットのＬＳまでの経路が登録されている場合、経路管理部２１は、検索で得られたエントリの値をＨｅｌｌｏパケットで通知された値に更新する（ステップＳ８２でＮｏ、ステップＳ８４）。
【００９１】
図２３は、クラスタテーブル９２の更新のための動作の例を説明するフローチャートである。図２３は、図２１のステップＳ６６の処理を詳細に表している。図２３のステップＳ９１で表されているように、Ｈｅｌｌｏパケットの送信元のノード装置１０がサブゲートウェイではない場合は、クラスタテーブル９２は更新されない。ここでは、ノード装置１０ａがサブゲートウェイに設定されていないため、ノード装置１０ｂの経路管理部２１はクラスタテーブル９２を更新せずに処理を終了する。Ｈｅｌｌｏパケットの送信元がサブゲートウェイである場合については、後述する。
【００９２】
図２４は、ルーティングテーブル９５の更新のための動作の例を説明するフローチャートである。図２４は、図２１のステップＳ７１の処理を詳細に表している。ノード装置１０ｂの経路管理部２１は、データフィールドのＧＤに登録されているアドレスをキーとして、ルーティングテーブル９５のＧＤの欄を検索する（ステップＳ１０１）。ステップＳ１０２〜Ｓ１０４の処理は、図２２を参照しながら説明したステップＳ８２〜Ｓ８４の処理と同様である。
【００９３】
図２５は、クラスタテーブル９２の更新のための動作の例を説明するフローチャートである。図２５は、図２１のステップＳ７２の処理を詳細に表している。図２５のステップＳ１１１に表されているように、Ｈｅｌｌｏパケットのデータフィールドに記録されているＧＤがサブゲートウェイではない場合は、クラスタテーブル９２は更新されない。ここでは、サブゲートウェイの設定がまだ開始されていないので、ノード装置１０ｂの経路管理部２１はクラスタテーブル９２を更新せずに処理を終了する。データフィールド中のＧＤがサブゲートウェイである場合については、後述する。
【００９４】
図２１のステップＳ６８〜Ｓ７２の処理により、ノード装置１０ｂは、ノード装置１０ｂが所属しているクラスタの所属ノードについての情報を取得したときに、Ｈｅｌｌｏパケットから取得した情報を用いてルーティングテーブル９５を更新する。このため、ルーティングテーブル９５には、ノード装置１０ｂと同じクラスタに所属するノード装置１０までの経路情報が記録される。換言すると、ノード装置１０は、所属しているクラスタと同じクラスタに所属するノード装置１０までの経路をルーティングテーブル９５に記録する。このため、本実施形態に係るノード装置１０では、ルーティングテーブル９５の大きさは、各ノード装置がアドホックネットワーク中の全てのノード装置までの経路を記録する場合に比べて小さくなる。
【００９５】
＜サブゲートウェイの決定＞
図２６は、サブゲートウェイの決定方法の例を示す。まず、ノード装置１０は、所属しているクラスタ（所属クラスタ）に隣接する隣接クラスタを認識し、図２６（ａ）に示すように、隣接クラスタのクラスタＩＤを起点ノード装置Ｏ１に通知する。起点ノード装置Ｏ１は、隣接クラスタのクラスタＩＤを通知してきたノード装置１０の中からサブゲートウェイを選択する。さらに、起点ノード装置Ｏ１は、図２６（ｂ）に示すように、選択したノード装置１０に、サブゲートウェイとして動作することを依頼するメッセージ（ＳＧＷ依頼）を送信する。次に、図２６（ｃ）に示すように、ＳＧＷ依頼を受信したノード装置１０は、起点ノード装置Ｏ１にＳＧＷ応答メッセージを送信すると共に、サブゲートウェイとしての動作を開始する。さらに、ＳＧＷ依頼を受信したノード装置１０は、隣接クラスタ中のノード装置１０であって、Ｈｅｌｌｏパケットを受信することができるノード装置１０に対して、ＳＧＷ依頼を送信してサブゲートウェイとする。また、図２６（ｄ）に示すように、隣接クラスタでもサブゲートウェイの決定が行われる。
【００９６】
以下、図２６で示した方法について、図２７〜３３を参照しながら詳しく説明する。
図２７は、所属クラスタに隣接するクラスタのＩＤを認識する方法の例を示す。ノード装置１０は、前述のように、Ｈｅｌｌｏパケットを送受信することにより、リンクテーブル９１を更新する。リンクテーブル９１は、図２７（ａ）に示すように、隣接ノードが所属するクラスタのクラスタＩＤを記録している。そこで、隣接クラスタ通知部６１は、リンクテーブル９１のクラスタＩＤの欄に記録されている値を、所属クラスタのクラスタＩＤと比較する。隣接クラスタ通知部６１は、所属クラスタのクラスタＩＤとは異なるクラスタのＩＤを検出すると、所属クラスタの隣接クラスタに所属するノード装置１０からＨｅｌｌｏパケットを受信していることを認識する。図２７（ａ）と図２７（ｂ）の例では、ノード装置１０の所属クラスタは、ＣＩＤ１、ＣＩＤ２、ＣＩＤｋで特定できるクラスタと隣接していることが認識される。そこで、隣接クラスタ通知部６１は、検出したクラスタＩＤを図２７（ｃ）に示すように、起点ノード装置Ｏ１に送信するクラスタデータパケットのデータフィールドに含める。さらに、隣接クラスタ通知部６１は、クラスタタイプフィールドの値を「５」（図１４のＮＥＩ＿ＣＬＵＳＴＥＲ）に設定する。隣接クラスタ通知部６１は、生成したパケットを起点ノード装置に送信する。
【００９７】
図２８は、隣接クラスタの通知を受けたときの起点ノード装置の動作の例を表す。起点ノード装置の候補テーブル生成部６２は、受信したクラスタデータパケット（図２８（ａ））に基づいて、隣接クラスタテーブル４３とゲートウェイ候補テーブル４４を生成する。なお、隣接クラスタテーブル４３は、サブゲートウェイ決定部６３がサブゲートウェイを設定する対象となる隣接クラスタを認識するために用いられる。一方、ゲートウェイ候補テーブル４４は、サブゲートウェイ決定部６３がサブゲートウェイとして指定できるノード装置１０を認識するために用いられる。
【００９８】
隣接クラスタテーブル４３は、図２８（ｂ）に示すように、隣接クラスタのＩＤと、その隣接クラスタとの間で用いられるサブゲートウェイの設定状況を示す確定フラグを対応付けている。ここで、確定フラグが「０」に設定されている場合は、その隣接クラスタとの間で通信する際に用いられるサブゲートウェイが確定していないことを示す。一方、サブゲートウェイが確定している場合、確定フラグは「１」に設定される。つまり、サブゲートウェイ決定部６３は、確定フラグの値が「０」のエントリに記録されているクラスタを、サブゲートウェイを決定する対象として認識する。候補テーブル生成部６２は、受信したクラスタデータパケットのデータフィールドに含まれているクラスタＩＤを、隣接クラスタテーブル４３の隣接クラスタＩＤの欄に記録されている値と比較する。隣接クラスタテーブル４３に含まれていないクラスタＩＤがクラスタデータパケットにより通知された場合、候補テーブル生成部６２は、隣接クラスタテーブル４３に新たなエントリを生成して、隣接クラスタＩＤを記録する。このとき、確定フラグは０に設定される。
【００９９】
ゲートウェイ候補テーブル４４は、図２８（ｃ）に示すように、サブゲートウェイに指定する候補のノード装置１０（候補ノード）、候補ノードが隣接しているクラスタのＩＤ、状態フラグが対応付けられている。状態フラグ＝０は、その候補ノードがサブゲートウェイとして動作していないことを示す。一方、状態フラグ＝１は、その候補ノードがサブゲートウェイとして選択されていることを示す。候補テーブル生成部６２は、隣接クラスタを通知するクラスタデータパケット（図２８（ａ））でのＧＳと、データフィールドで通知されたクラスタＩＤの組み合わせをゲートウェイ候補テーブル４４から検索する。ＧＳとクラスタＩＤの組み合わせが無い場合、候補テーブル生成部６２は、ゲートウェイ候補テーブル４４にエントリを生成して、ＧＳとクラスタＩＤの組み合わせを記録する。このとき、ＧＳは候補ノードの欄に記録される。また、新たに生成されたエントリでは状態フラグの値を０に設定される。
【０１００】
図２９は、サブゲートウェイの決定の際に行われる動作の例を説明するシーケンス図である。図２９の例では、クラスタＣＳとクラスタＣＬの間で用いられるサブゲートウェイの設定について述べる。ここで、ノードＳはクラスタＣＳの起点ノード装置であり、ノードＬはクラスタＣＬの起点ノード装置であるものとする。また、ノードＡ、ＣはクラスタＣＳに所属し、ノードＭはクラスタＣＬに所属しているものとする。なお、以下の手順は一例であり、例えば、手順（５２）以降の処理を手順（４９）〜（５１）よりも前に行うように変更することができる。
【０１０１】
（４１）ノードＣの隣接クラスタ通知部６１は、リンクテーブル（ＬＴ）９１に記録されているクラスタＩＤとノードＣの所属クラスタのクラスタＩＤ（ＣＳ）を比較して、隣接クラスタを検出する。ここでは、ノードＣのリンクテーブル９１にノードＡ、Ｌ、Ｍが記録されているとする。ノードＬ、Ｍの所属クラスタはクラスタＣＬであるため、ノードＣの隣接クラスタ通知部６１は、クラスタＣＬと隣接していることを認識する。
【０１０２】
（４２）ノードＣは、データフィールドに隣接クラスタのリスト（クラスタＩＤリスト）を含むクラスタデータパケットを生成する。図２９では、隣接クラスタを通知するクラスタデータパケットは、送信先となる起点ノード装置および送信元のノード装置１０と対応付けて、（ＮＥＩＧＨＢＯＲ＿ＣＬＵＳＴＯＲ，Ｓ，Ｃ）のように表記されている。ＮＥＩＧＨＢＯＲ＿ＣＬＵＳＴＯＲは隣接クラスタを通知するクラスタデータパケットを表す。クラスタデータパケットの種類を表す記述の後に、起点ノード装置がノードＳであることと、送信元がノードＣであることが記載されている。
【０１０３】
（４３）手順（４２）でノードＣから送信されたクラスタデータパケットは、ノードＡによってノードＳに送信される。
【０１０４】
（４４）ノードＳの候補テーブル生成部６２は、受信したパケットを用いて、隣接クラスタテーブル（ＮＣＴ）４３とゲートウェイ候補テーブル（ＳＧＷＣＴ）４４を更新する。隣接クラスタテーブル４３とゲートウェイ候補テーブル４４の更新方法は、図２８を参照しながら説明したとおりである。図２９の例では、隣接クラスタテーブル４３にクラスタＣＬのＩＤが登録される。また、ゲートウェイ候補テーブル４４には、ノードＣがクラスタＣＬに含まれるノード装置１０に隣接していることが記録される。
【０１０５】
（４５）サブゲートウェイ決定部６３は、隣接クラスタテーブル４３から、確定フラグが０に設定されているクラスタのＩＤを取得する。次に、サブゲートウェイ決定部６３はゲートウェイ候補テーブル４４を確認することにより、取得したクラスタＩＤに対応付けられた候補ノードのうちで、状態フラグが０に設定されているノード装置１０を検索する。サブゲートウェイ決定部６３は、検索したノード装置１０の中から、サブゲートウェイに指定するノード装置１０を決定する。例えば、図２９の例では、クラスタＣＬのＩＤに対応付けられた確定フラグの値は０である。そこで、サブゲートウェイ決定部６３は、クラスタＣＬとの間の通信に用いられるサブゲートウェイが決定されていないと判断し、ゲートウェイ候補テーブル４４に登録されている候補ノードのうちで状態フラグ＝０であるノード装置１０を検索する。ここで、ノードＣは、クラスタＣＬ中のノードに隣接していて状態フラグの値が０である。そこで、ノードＳのサブゲートウェイ決定部６３は、ノードＣをサブゲートウェイに決定する。
【０１０６】
（４６）サブゲートウェイ決定部６３は、サブゲートウェイに指定するノード装置１０に対して、サブゲートウェイとして動作することを要求するクラスタデータパケット（ＳＧＷ要求、ＲＥＱ＿ＳＧＷ）を送信する。図１４に示すように、ＳＧＷ要求の場合、クラスタタイプフィールドの値は「６」に設定される。また、クラスタＩＤフィールドには、隣接クラスタのＩＤが記録される。サブゲートウェイ決定部６３は、ＳＧＷ要求のクラスタデータパケットを手順（４５）で決定した候補ノードに送信する。さらに、サブゲートウェイ決定部６３は、隣接クラスタテーブル４３について、ＳＧＷ要求のクラスタＩＤフィールドにＩＤが記録されている隣接クラスタに対応付けられた確定フラグを「１」に設定する。
【０１０７】
例えば、ノードＳのサブゲートウェイ決定部６３は、クラスタＩＤフィールドにクラスタＣＬのＩＤ、クラスタタイプフィールドに６を設定したクラスタデータパケットを生成し、ノードＣにむけて送信する。図２９では、ＳＧＷ要求は、隣接クラスタＩＤ、および、送信先のノード装置１０と対応付けて、（ＲＥＱ＿ＳＧＷ，ＣＬ，Ｃ）のように表記されている。ＳＧＷ要求の送信後、サブゲートウェイ決定部６３は、隣接クラスタテーブル４３でクラスタＣＬに対応付けられた確定フラグを１に設定する。
【０１０８】
（４７）ノードＡは、ルーティングテーブル９５を参照することにより、ノードＳから受信したＳＧＷ要求をノードＣに送信する。
【０１０９】
（４８）ノードＣは、ＳＧＷ要求を受信すると、ノードＣがサブゲートウェイであることを認識し、サブゲートウェイとしての動作を開始する。例えば、ノードＣは、ノードＣの所属クラスタとは異なるクラスタに所属するノード装置１０からＨｅｌｌｏパケットを受信した場合でも、Ｈｅｌｌｏパケットに応じてルーティングテーブル９５を更新する。また、ノードＣから送信されるＨｅｌｌｏパケットでは、ＳＧＷフラグが１に設定される。サブゲートウェイとしての動作については、後で詳しく述べる。
【０１１０】
（４９）ノードＣは、ノードＳにＳＧＷ応答（ＡＣＫ＿ＳＧＷ）であるクラスタデータパケットを送信する。図１４に示すように、ＳＧＷ応答の場合、クラスタタイプフィールドの値は「７」に設定される。また、クラスタＩＤフィールドには、隣接クラスタのＩＤが記録される。図２９では、ＳＧＷ応答は、隣接クラスタＩＤ、および、送信元のノード装置１０と対応付けて、（ＲＥＱ＿ＡＣＫ，ＣＬ，Ｃ）のように表記されている。
【０１１１】
（５０）ノードＡは、ルーティングテーブル９５を参照することにより、ノードＣから受信したＳＧＷ応答をノードＳに送信する。
【０１１２】
（５１）起点ノードは、ＳＧＷ応答を受信すると、ゲートウェイ候補テーブル４４において、ＳＧＷ応答の送信元のノード装置に対応する状態フラグを１に設定する。ここでは、ノードＳは、ＳＧＷ応答を受信すると、ノードＣについて隣接クラスタがＣＬであるエントリの状態フラグを１に設定する。
【０１１３】
（５２）サブゲートウェイに設定されたノードＣは、クラスタＣＬ中のノード装置１０であり、かつ、ノードＣに隣接しているノード装置１０に対して、サブゲートウェイとして動作することを要求する。このとき、ノードＣのサブゲートウェイ決定部６３は、クラスタテーブル９２を参照し、クラスタＣＬに含まれているノード装置をサブゲートウェイに設定するために選択する。ここでは、サブゲートウェイ決定部６３がノードＭを選択したものとする。サブゲートウェイ決定部６３は、ＳＧＷ要求を生成してノードＭに送信する。なお、ＳＧＷ要求の生成は、手順（４２）と同様である。さらに、サブゲートウェイ決定部６３は、ルーティングテーブル（ＲＴ）９５にノードＭのエントリを追加する。このとき、ノードＭがサブゲートウェイであることも合せて登録される。
【０１１４】
（５３）ノードＭは、ＳＧＷ要求を受信すると、ノードＭの所属クラスタ（クラスタＣＬ）とは異なるクラスタ（クラスタＣＳ）に所属するノードからＳＧＷ要求を受信したことを認識する。すると、ノードＭは、サブゲートウェイとしての動作を開始する。また、所属ノードの起点ノード装置に、ＳＧＷ応答を送信することにより、サブゲートウェイとして動作していることを通知する。ここでは、ノードＭは、ノードＬにＳＧＷ応答を送信する。ＳＧＷ応答の生成方法は、手順（４９）で述べたとおりである。さらに、ノードＭのサブゲートウェイ決定部６３は、ルーティングテーブル９５にノードＣのエントリを追加する。このとき、ノードＣがサブゲートウェイであることを登録する。
【０１１５】
（５４）起点ノードの動作は手順（５１）と同様である。すなわち、ノードＬは、ＳＧＷ応答を受信すると、ゲートウェイ候補テーブル４４において、ノードＭの隣接クラスタがＣＬであるエントリの状態フラグを１に設定する。
【０１１６】
図３０は、隣接クラスタ通知部６１の動作の例を説明するフローチャートである。隣接クラスタ通知部６１は、リンクテーブル９１に登録されている未処理のエントリを１つ取得する（ステップＳ１２１、ステップＳ１２２でＹｅｓ）。次に、隣接クラスタ通知部６１は、取得したエントリに含まれているクラスタＩＤは、所属クラスタのクラスタＩＤであるかを確認する（ステップＳ１２３）。所属クラスタのクラスタＩＤが含まれている場合、隣接クラスタ通知部６１はステップＳ１２１に戻って他のエントリの処理を開始する（ステップＳ１２３でＹｅｓ）。一方、取得したエントリのクラスタＩＤが所属クラスタのクラスタＩＤとは異なる場合、隣接クラスタ通知部６１は、取得したエントリに含まれているクラスタＩＤを隣接クラスタテーブル４３に記録して、ステップＳ１２１に戻る（ステップＳ１２３でＮｏ、ステップＳ１２４）。リンクテーブル９１に含まれている全てのエントリについて処理が終わると、隣接クラスタ通知部６１は、隣接クラスタテーブル４３にクラスタＩＤが記録されているかを確認する（ステップＳ１２５）。隣接クラスタテーブル４３にクラスタＩＤが記録されている場合、隣接クラスタ通知部６１は、隣接クラスタを通知するためのクラスタデータパケットを生成して、所属クラスタの起点ノード装置に送信する（ステップＳ１２５でＹｅｓ、ステップＳ１２６、Ｓ１２７）。一方、隣接クラスタテーブル４３にクラスタＩＤが記録されていない場合、隣接クラスタ通知部６１は処理を終了する（ステップＳ１２５でＮｏ）。
【０１１７】
図３１は、隣接クラスタを通知されたときの候補テーブル生成部６２の動作の例を説明するフローチャートである。図３１は、図２９を参照しながら説明した手順（４４）で行われる動作の例を示す。候補テーブル生成部６２は隣接クラスタの通知を受信すると、クラスタデータパケットにクラスタＩＤが含まれているかを確認する（ステップＳ１３１、ステップＳ１３２）。未処理のクラスタリストがクラスタデータパケットに含まれていない場合、候補テーブル生成部６２は処理を終了する（ステップＳ１３２でＮｏ）。一方、クラスタＩＤが含まれている場合、候補テーブル生成部６２は、クラスタデータパケットの送信元のアドレス（ＧＳ）と、受信パケット中のクラスタＩＤ（隣接クラスタ）の組み合わせで、ゲートウェイ候補テーブル４４を検索する（ステップＳ１３３）。ＧＳと隣接クラスタの組み合わせがゲートウェイ候補テーブル４４に記録されていない場合、候補テーブル生成部６２は、ゲートウェイ候補テーブル４４に、ＧＳと隣接クラスタの組み合わせのエントリを追加する（ステップＳ１３４でＮｏ、ステップＳ１３５、Ｓ１３６）。ＧＳと隣接クラスタの組み合わせがゲートウェイ候補テーブル４４に記録されている場合は、ステップＳ１３５とＳ１３６は行われない（ステップＳ１３４でＹｅｓ）。次に、候補テーブル生成部６２は、隣接クラスタＩＤをキーとして、隣接クラスタテーブル４３を検索する（ステップＳ１３７）。隣接クラスタＩＤが隣接クラスタテーブル４３に記録されている場合、候補テーブル生成部６２は、ステップＳ１３１以降の処理を繰り返す（ステップＳ１３８でＹｅｓ）。一方、隣接クラスタＩＤが隣接クラスタテーブル４３に記録されていない場合、候補テーブル生成部６２は、隣接クラスタテーブル４３に、隣接クラスタＩＤを記録したエントリを追加する（ステップＳ１３８でＮｏ、ステップＳ１３９、Ｓ１４０）。
【０１１８】
図３２は、サブゲートウェイを生成する際の起点ノード装置の動作の例を説明するフローチャートである。起点ノード装置中のサブゲートウェイ決定部６３は、隣接クラスタテーブル４３に含まれている未処理のエントリを読み込む（ステップＳ１５１、ステップＳ１５２でＹｅｓ）。なお、隣接クラスタテーブル４３に未処理のエントリが残っていない場合、サブゲートウェイ決定部６３は、処理を終了する（ステップＳ１５２でＮｏ）。未処理のエントリを読み込んだ場合、サブゲートウェイ決定部６３は、確定フラグの値を確認する（ステップＳ１５３）。確定フラグの値が１であり、すでにサブゲートウェイが確定されている場合、サブゲートウェイ決定部６３はステップＳ１５１に戻る（ステップＳ１５３でＮｏ）。
【０１１９】
一方、確定フラグの値が０であり、サブゲートウェイが決まっていない場合、サブゲートウェイ決定部６３はゲートウェイ候補テーブル４４から未処理のエントリを取得する（ステップＳ１５４、ステップＳ１５５でＹｅｓ）。なお、ゲートウェイ候補テーブル４４から未処理のエントリが取得できない場合、サブゲートウェイ決定部６３は処理を終了する（ステップＳ１５５でＮｏ）。次に、サブゲートウェイ決定部６３は、取得したエントリの状態フラグが未確定（状態フラグ＝０）であることを示しているかを確認する（ステップＳ１５５でＹｅｓ、ステップＳ１５６）。取得したエントリの状態フラグが未確定ではない（状態フラグ＝１）場合、ステップＳ１５４以降の処理が繰り返される（ステップＳ１５６でＮｏ）。一方、取得したエントリの状態フラグが未確定を表す場合、サブゲートウェイ決定部６３は、隣接クラスタテーブル４３のクラスタＩＤとゲートウェイ候補テーブル４４のクラスタＩＤが一致しているかを確認する（ステップＳ１５７）。両者が一致していない場合、ステップＳ１５４以降の処理が繰り返される（ステップＳ１５７でＮｏ）。
【０１２０】
隣接クラスタテーブル４３のクラスタＩＤとゲートウェイ候補テーブル４４のクラスタＩＤが一致している場合、サブゲートウェイ決定部６３は、ＳＧＷ要求を生成する（ステップＳ１５７でＹｅｓ、ステップＳ１５８）。さらに、サブゲートウェイ決定部６３は、ステップＳ１５５で読み込んだゲートウェイ候補テーブル４４のエントリに記録されているノードに、ＳＧＷ要求を送信する（ステップＳ１５９）。さらに、サブゲートウェイ決定部６３は、ステップＳ１５１で読み込んだ隣接クラスタテーブル４３のエントリについて、確定フラグを確定（確定フラグ＝１）に設定する（ステップＳ１６０）。このフローでは、起点ノードが、サブゲートウェイが未設定である隣接クラスタに対してサブゲートウェイを設定する処理を1度だけ行う方法を表している。サブゲートウェイが未設定である複数の隣接クラスタに対して処理を行うために、ステップＳ１５１からステップＳ１６０の処理を同時に並行して実行しても良い。
【０１２１】
図３３は、サブゲートウェイに指定されたノードの動作の例を説明するフローチャートである。ＳＧＷ要求を受信したノードは、サブゲートウェイに設定されたことを認識すると共に、ＳＧＷ応答を生成する（ステップＳ１７１、Ｓ１７２）。サブゲートウェイ決定部６３は、生成したＳＧＷ応答を、所属クラスタの起点ノード装置に送信する（ステップＳ１７３）。さらに、サブゲートウェイ決定部６３は、ＳＧＷ要求の送信元（ＧＳ）が起点ノード装置であるかを確認する（ステップＳ１７４）。ＳＧＷ要求の送信元が起点ノード装置ではない場合は、処理を終了する（ステップＳ１７４でＮｏ）。
【０１２２】
一方、ＳＧＷ要求の送信元が起点ノード装置である場合、サブゲートウェイ決定部６３は、ＳＧＷ要求のクラスタＩＤで識別されるクラスタに所属する隣接ノードをリンクテーブル９１から選択する（ステップＳ１７４でＹｅｓ、ステップＳ１７５）。リンクテーブル９１に該当するエントリが存在する場合、サブゲートウェイ決定部６３は、ＳＧＷ要求を生成して選択したノードに送信する（ステップＳ１７６でＹｅｓ、ステップＳ１７７、Ｓ１７８）。さらに、サブゲートウェイ決定部６３は、選択したリンクテーブル９１のエントリをルーティングテーブル９５に登録する（ステップＳ１７９）。一方、ステップＳ１７６で、ＳＧＷ要求のクラスタＩＤで識別されるクラスタに所属する隣接ノードがリンクテーブル９１に含まれていない場合、サブゲートウェイ決定部６３は処理を終了する（ステップＳ１７６でＮｏ）。
【０１２３】
サブゲートウェイが決定されると、デフォルトＧＷ決定部４１は、所属クラスタに所属していないノード装置１０にパケットを送信する際に用いるサブゲートウェイを選択する。以下の説明では、所属クラスタに所属していないノード装置１０にパケットを送信する際に用いるサブゲートウェイのことを「デフォルトゲートウェイ」と記載する。
【０１２４】
クラスタ内の各ノード装置１０は、ホップ数が一番小さいサブゲートウェイをデフォルトゲートウェイとすることができる。なお、ホップ数を用いる方法は、デフォルトゲートウェイの決定方法の例であって、デフォルトゲートウェイの決定方法は、実装に応じて任意に変更することができる。例えば、通信品質（到達率、輻輳など）も用いてデフォルトゲートウェイを決定することもできる。
【０１２５】
＜サブゲートウェイが決定された後のＨｅｌｌｏパケットの処理＞
次に、図２１を参照しながら、サブゲートウェイが決定された後で、Ｈｅｌｌｏパケットが処理される場合の動作について説明する。サブゲートウェイが所属クラスタに所属するノードからＨｅｌｌｏパケットを受信したときの処理は、ステップＳ６１〜Ｓ７２の通りである。ここで、ステップＳ６６のクラスタテーブル９２の更新の処理について図２３を参照しながら説明する。Ｈｅｌｌｏパケットを受信したノードは、Ｈｅｌｌｏパケットの送信元（ＬＳ）はサブゲートウェイであるかを、ＨｅｌｌｏパケットのＳＧＷフラグによって確認する（ステップＳ９１）。送信元がサブゲートウェイである場合、Ｈｅｌｌｏパケットを受信したノードは、Ｈｅｌｌｏパケットの送信元がクラスタテーブル９２のサブゲートウェイリストに記録されているかを確認する（ステップＳ９２、Ｓ９３）。サブゲートウェイがクラスタテーブル９２に登録されている場合、クラスタテーブル９２の更新処理が終了される（ステップＳ９３でＹｅｓ）。一方、サブゲートウェイがクラスタテーブル９２に登録されていない場合、Ｈｅｌｌｏパケットを受信したノードは、クラスタテーブル９２のサブゲートウェイリストに、Ｈｅｌｌｏパケットの送信元を記録する（ステップＳ９３でＮｏ、ステップＳ９４）。なお、Ｈｅｌｌｏパケットの送信元がサブゲートウェイではない場合の処理は、前述のとおりである。
【０１２６】
また、ステップＳ７２で行われるクラスタテーブル９２の更新について、図２５を参照しながら説明する。Ｈｅｌｌｏパケットを受信したノードは、Ｈｅｌｌｏパケットのデータ部分に含まれる経路情報のリストについて、ＧＤがサブゲートウェイであるかを確認する（ステップＳ１１１）。ＧＤがサブゲートウェイである場合、Ｈｅｌｌｏパケットを受信したノードは、ＧＤがクラスタテーブル９２のサブゲートウェイリストに記録されているかを確認する（ステップＳ１１２、Ｓ１１３）。サブゲートウェイがクラスタテーブル９２に登録されている場合、クラスタテーブル９２の更新処理が終了される（ステップＳ１１３でＹｅｓ）。一方、サブゲートウェイがクラスタテーブル９２に登録されていない場合、Ｈｅｌｌｏパケットを受信したノードは、クラスタテーブル９２のサブゲートウェイリストに、ＧＤを記録する（ステップＳ１１３でＮｏ、ステップＳ１１４）。なお、Ｈｅｌｌｏパケットにより通知された経路のＧＤがサブゲートウェイではない場合の処理は、前述のとおりである。
【０１２７】
次に、Ｈｅｌｌｏパケットを所属クラスタとは異なるクラスタから受信した場合の処理について（図２１のステップＳ６４でＮｏ）、図２１を参照しながら説明する。Ｈｅｌｌｏパケットを受信したノード装置１０は、サブゲートウェイであるかを確認する（ステップＳ７３）。Ｈｅｌｌｏパケットを受信したノード装置１０がサブゲートウェイである場合、経路管理部２１は、ルーティングテーブル９５とクラスタテーブル９２を更新する（ステップＳ７３でＹｅｓ、ステップＳ７４、Ｓ７５）。ここで、ステップＳ７４の処理は図２２を参照しながら説明した処理と同様である。また、ステップＳ７５の処理は、図２３を参照しながら説明した処理と同様である。一方、Ｈｅｌｌｏパケットを受信したノード装置１０は、サブゲートウェイではない場合、ノード装置１０は処理を終了する（ステップＳ７３でＮｏ）。
【０１２８】
＜クラスタ内でのデータパケットの送受信＞
図３４は、データパケットのフォーマットの例を示す。データパケット処理部８１は、データパケットを生成する。このとき、データパケットのヘッダのＴｙｐｅフィールドの値は、図４にも示すように「３」に設定される。Ｌｅｎｇｔｈフィールドの値はデータパケットに含まれているデータの長さを表す。データパケット処理部８１は、データパケットの宛先のアドレスをＧＤに設定する。さらにデータパケット処理部８１は、ルーティングテーブル９５のＧＤの欄を宛先アドレスで検索し、ヒットしたエントリ中にＬＤとして登録されているノードをＬＤに設定する。また、データパケット処理部８１は、ＧＳとＬＳを送信元ノードのアドレスに設定する。ホップ数は送信元ノードからのホップ数をカウントするために用いられ、送信元ノードでは０に設定される。ＦＩＤフィールドには、ＦＩＤ生成部１３から入力された値が記録される。データフィールドには、送信データが含まれる。ＧＳとＦＩＤを組み合わせて、パケットにネットワーク上での唯一性を表している。
【０１２９】
図３５は、データパケットの受信に際して行われる動作の例を説明するフローチャートである。データパケット処理部８１は、パケット分岐処理部１２を介して受信したデータパケットのＧＤと、パケットを受信したノード装置１０に割り当てられているアドレスが一致するかを確認する（ステップＳ１９１）。データパケットのＧＤと、ノード装置１０に割り当てられているアドレスが一致した場合、データパケット処理部８１は、データパケットが上位処理部１４での処理対象であると判断し、上位処理部１４に通知する（ステップＳ１９１でＹｅｓ、ステップＳ１９２）。また、データパケット処理部８１は、適宜、データパケットを上位処理部１４に出力することもできる。
【０１３０】
一方、データパケットのＧＤと、ノード装置１０に割り当てられているアドレスが一致しない場合、データパケット処理部８１は、受信パケットを他のノードに転送することを決定する（ステップＳ１９１でＮｏ）。データパケット処理部８１は、ルーティングテーブル９５のＧＤの欄を、データパケットのＧＤに記録されているアドレスをキーとして検索し、ヒットするエントリがあるかを確認する（ステップＳ１９３、Ｓ１９４）。ＧＤに設定されているノードが所属クラスタと同じクラスタに所属している場合、ルーティングテーブル９５にヒットするエントリがある（ステップＳ１９４でＹｅｓ）。データパケット処理部８１は、データパケットのＬＤを、ヒットしたエントリにＬＤとして記録されているノードのアドレスに変更し、ＬＳをそのデータパケットを処理しているノード装置１０のアドレスに変更する。さらに、ホップ数の値を１つインクリメントする（ステップＳ１９５）。データパケット処理部８１は、ホップ数の値を、予め記憶しているＨｏｐ限界値と比較する（ステップＳ１９６）。ホップ数の値がＨｏｐ限界値以下である場合、データパケット処理部８１は、送信部１６を介してデータパケットを転送する（ステップＳ１９６でＹｅｓ、ステップＳ１９７）。一方、ホップ数の値がＨｏｐ限界値を超えた場合、データパケット処理部８１は、データパケットを破棄して処理を終了する（ステップＳ１９６でＮｏ）。
【０１３１】
ステップＳ１９４においてＮｏと判定された場合は、ＧＤに設定されているノードが所属クラスタと同じクラスタに所属していない。この場合に行われる処理については後で説明する。
【０１３２】
＜所属クラスタに含まれないノード装置との通信方法＞
サブゲートウェイではないノード装置１０は、所属クラスタに所属していないノード装置１０までの経路をルーティングテーブル９５に記録していない。そこで、所属クラスタに含まれていないノード装置１０にパケットを送信する場合、ノード装置１０は、そのノード装置１０のデフォルトゲートウェイにハイウェイデータパケットを送信する。
【０１３３】
図３６は、ハイウェイデータパケットのフォーマットの例を示す。ハイウェイデータパケットはハイウェイデータパケット処理部８２によって生成される。ハイウェイデータパケットは、データパケットの先頭に、さらにヘッダを含んでいる。以下、区別をし易くするために、ハイウェイデータパケットの先頭に付されているヘッダを「アウターヘッダ」、ハイウェイデータパケット中のデータパケットに含まれているヘッダを「インナーヘッダ」と記載する。アウターヘッダのフォーマットは、インナーヘッダのフォーマットと同様である。
【０１３４】
アウターヘッダのＴｙｐｅフィールドには、ハイウェイデータパケットであることを表す値が設定される。図３６の例では、ハイウェイデータパケットの先頭のＴｙｐｅフィールドは、２に設定される。アウターヘッダのＧＤにはハイウェイデータパケットの宛先ノードのアドレスが記録される。例えば、送信元のノードは、ハイウェイデータパケットの宛先ノードを送信元ノードのデフォルトゲートウェイとする。アウターヘッダのＧＳ、ＬＳ、ＬＤは、データパケットの場合と同様に設定される。一方、インナーヘッダでは、ＬＳとＬＤは設定されなくても良い。インナーヘッダのＧＤはデータパケットの宛先ノードのアドレス、ＧＳはデータパケットの送信元ノードのアドレスに設定される。
【０１３５】
図３７は、所属クラスタに含まれないノード装置との通信方法の例を示す。図３７（ａ）に示すように、まず、送信元ノードは、ハイウェイデータパケットを生成すると、送信元ノードのデフォルトゲートウェイにハイウェイデータパケットを送信する。すると、ハイウェイデータパケットを受信したサブゲートウェイは、ハイウェイデータパケットのインナーヘッダのＧＤを取得し、取得したＧＤが所属しているクラスタを検索する。クラスタの検索には、検索データパケットが用いられる。
【０１３６】
検索データパケットのフォーマットの例を図３８に示す。検索データパケットは、検索実行部７２により生成される。検索データパケットのペイロードは、ＳｅａｒｃｈＴｙｐｅフィールド、ｆｏｕｎｄフラグ、Ｓｅａｒｃｈ  ＩＤフィールド、Ｈｏｐ数、ＫｅｙＧＳフィールド、ＫｅｙＦＩＤフィールド、Ｃｈｅｃｋｅｄａｄｄｒフィールドが含まれる。ＳｅａｒｃｈＴｙｐｅフィールドは、その検索データパケットが検索を要求しているか、検索結果を通知しているかを区別するために用いられる。以下の説明では、検索を要求する検索データパケットでは、ＳｅａｒｃｈＴｙｐｅフィールドの値が０に設定され、検索結果を通知する検索データパケットではＳｅａｒｃｈＴｙｐｅフィールドの値が１に設定されるものとする。Ｓｅａｒｃｈ  ＩＤフィールドは、検索の対象となるノードのアドレスを記録する。ｆｏｕｎｄフラグは検索対象のノードが検出されたかを示す。ｆｏｕｎｄフラグ＝０は未検出を表し、ｆｏｕｎｄフラグ＝１は検出成功を表す。Ｈｏｐ数は、検索データパケットの送信元から検出されたノードまでのホップ数を示す。ＫｅｙＧＳフィールドは、ハイウェイデータパケット中のインナーヘッダ（データパケットのヘッダ）に設定されているＧＳを記録し、ＫｅｙＦＩＤフィールドは、インナーヘッダのＦＩＤを記録する。Ｃｈｅｃｋｅｄａｄｄｒフィールドは、検索対象とされたクラスタの情報が記録される。
【０１３７】
検索データパケットのＴｙｐｅフィールドは検索データパケットであることを表す値に設定される。例えば、図４の例では、Ｔｙｐｅフィールドは「４」に設定される。検索データパケットのＧＤは、検索を行う対象となるクラスタ中のサブゲートウェイのアドレスである。ＬＳは、検索データパケットを送信するノードのアドレス、ＧＳは、検索データパケットの送信元のアドレス、ＬＤはＧＤへの転送先のアドレスである。なお、データパケット処理部８１は、ルーティングテーブル９５を参照してＬＤを取得する。
【０１３８】
クラスタの検索を行うサブゲートウェイ中の検索実行部７２は、そのサブゲートウェイの所属クラスタが隣接しているクラスタの各々について、検索データパケットを送信する。検索データパケットが送信される場合の例を図３７（ｂ）に示す。検索データパケットを受信したサブゲートウェイの各々は、所属クラスタに検索の対象となっているノード装置１０が所属しているかを確認する。検索の対象となっているノード装置１０が検出できない場合、サブゲートウェイは、新たに検索データパケットを生成し、所属クラスタに隣接しているクラスタに送信する。検索の対象となっているノード装置１０が検出できた場合、サブゲートウェイは、そのサブゲートウェイに問合せを行ったノード装置１０に向けて検索結果を通知する。検索結果の通知の様子を図３７（ｃ）に示す。ハイウェイデータパケットを受信したサブゲートウェイは、検索結果を取得すると、検索の対象となっているノード装置１０が所属するクラスタへハイウェイデータパケットを送信する。ハイウェイデータパケットを受信したサブゲートウェイは、ハイウェイデータパケットのアウターヘッダを除去し、データパケットの宛先にデータパケットを送信する。データパケットが送信されたときの例を図３７（ｄ）に示す。
【０１３９】
次に、図３９を参照しながらデータパケットの送信で行われる動作について詳しく説明する。
図３９は、データパケットの宛先の検索方法とデータパケットの送信の例を示す。図３９の例では、クラスタＣ１に所属するノードＳがクラスタＣ３に所属するノードＧにデータパケットを送信するものとする。ここで、ノードＳおよびノードＡはクラスタＣ１、ノードＢおよびノードＣはクラスタＣ２、ノードＤおよびノードＧがクラスタＣ３に所属しているものとする。また、ノードＡはノードＳのデフォルトゲートウェイであるとする。さらに、クラスタＣ１はクラスタＣ２に隣接しているが、クラスタＣ３には隣接しておらず、クラスタＣ２はクラスタＣ１およびクラスタＣ３に隣接しているものとする。
【０１４０】
（６１）ノードＳのデータパケット処理部８１は、ノードＧ宛のデータパケットを生成する。データパケットのＧＤはノードＧ、ＧＳとＬＳはノードＳに設定されている。しかし、データパケット処理部８１は、ルーティングテーブル９５にノードＧが記録されていないことを認識すると、ＬＤを設定せずに、生成したデータパケットをハイウェイデータパケット処理部８２に出力する。
【０１４１】
ハイウェイデータパケット処理部８２は、入力されたデータパケットにアウターヘッダを付加する。ハイウェイデータパケット処理部８２は、アウターヘッダのＧＤを、ノードＳのデフォルトゲートウェイであるノードＡに設定する。アウターヘッダのＧＳとＬＳはノードＳに設定される。ハイウェイデータパケット処理部８２は、ルーティングテーブル９５を参照することにより、ノードＡにパケットを送信するために指定するＬＤを取得し、取得した値をアウターヘッダのＬＤに設定する。ここで生成されたパケットは図３９（ａ）に示すとおりである。ハイウェイデータパケット処理部８２は、ハイウェイデータパケットをノードＡに向けて送信する。
【０１４２】
（６２）ノードＡは、ハイウェイデータパケットを受信すると、ハイウェイテーブル９４を確認する。ハイウェイテーブル９４は、ハイウェイデータパケットの転送や、経路の検索をしたことがあるために、ＬＤを認識しているノードについての情報が記録されている。ハイウェイテーブル９４は、所属クラスタ以外に所属するＧＤと、そのＧＤに対応するＬＤを記録している。なお、サブゲートウェイではないノード装置１０は、ハイウェイテーブル９４を保持しないことができる。
【０１４３】
ノードＡのハイウェイデータパケット処理部８２は、受信したハイウェイデータパケットのＧＤがハイウェイテーブル９４に記録されていない場合、ハイウェイデータパケットをペンディングデータテーブル８３に記録する。ペンディングデータテーブル８３は、ハイウェイデータパケットを記録できる任意の形式とすることができる。ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのインナーヘッダのＧＤを検索先決定部７１に通知し、経路の検索を要求する。
【０１４４】
検索先決定部７１は、サーチログテーブル（ＳＬＴ）７３を確認する。サーチログテーブル７３は、これまでに検索された経路に付いての情報が記録されている。サーチログテーブル７３の各エントリには、ＬＳ、ＦＩＤ、ＧＳ、ｄｏｎｅフラグ、および、アドレスリストが含まれている。図３９中のサーチログテーブル７３の記載では、エントリごとに、左側からＬＳ、ＦＩＤ、ＧＳ、ｄｏｎｅフラグ、アドレスリストの順にデータが記録されているものとする。サーチログテーブル７３のＬＳの欄には、検索データパケットの送信元となるノード装置１０のアドレスが記録される。ＦＩＤにはハイウェイデータパケットに含まれているデータパケットのＦＩＤ、ＧＳにはハイウェイデータパケットの送信元ノードのアドレスが記録される。ｄｏｎｅフラグは、検索が終了したかを表す。以下の説明では、ｄｏｎｅフラグ＝０は検索が終わっていないことを表し、ｄｏｎｅフラグ＝１は検索が終わっていることを表すものとする。アドレスリストには、検索データパケットの送信先のノード装置１０のアドレスが記録される。
【０１４５】
サーチログテーブル７３の例を図３９（ｂ）に示す。検索先決定部７１は、通知されたＧＤについてのエントリがサーチログテーブル７３に含まれていない場合、エントリを生成して通知されたＧＤについての情報をサーチログテーブル７３に記録する。ここでは、ＬＳはノードＡ、ＧＳはノードＳである。また、ｄｏｎｅフラグ＝０、ＦＩＤはＦＩＤ０に設定される。検索先決定部７１は、隣接クラスタから検索先を選択して、検索実行部７２に通知する。検索実行部７２は、検索先のクラスタのサブゲートウェイのうちでノードＡの隣接ノードであるノードを検索データパケットの送信先に決定する。ここではクラスタＣ２が検索先に指定され、検索データパケットの送信先はノードＢに決定されたものとする。さらに、検索実行部７２は、サーチログテーブル７３のアドレスリストに、検索データパケットの送信先（ノードＢ）を記録する。
【０１４６】
検索実行部７２は、検索データパケットを生成する。ノードＡが生成する検索データパケットの例を図３９（ｃ）に示す。ノードＡで生成された検索データパケットは、ＧＳとＬＳがノードＡとなる。ＧＤおよびＬＤは、検索データパケットの送信先のノードＢとなる。検索実行部７２は、ＳｅａｒｃｈＴｙｐｅフィールドの値を０、ｆｏｕｎｄフラグ＝０、ホップ数＝０、ＫｅｙＧＳフィールドの値をノードＳに設定する。さらに、検索実行部７２は、ＣｈｅｃｋｅｄａｄｄｒフィールドにクラスタＣ１を指定することにより、クラスタＣ１が検索済みであることをノードＢに通知する。ノードＡの検索実行部７２は、生成した検索データパケットをノードＢに向けて送信する。
【０１４７】
（６３）ノードＢの検索先決定部７１は、ＳｅａｒｃｈＴｙｐｅフィールドの値が０に設定された検索データパケットを受信すると検索を行う。まず、検索先決定部７１は、Ｃｈｅｃｋｅｄａｄｄｒフィールドの値を確認する。ここでは、Ｃｈｅｃｋｅｄａｄｄｒフィールドの値から、所属クラスタ（クラスタＣ２）が検索されていないことを認識する。すると、ノードＢの検索先決定部７１は、検索データパケットのＳｅａｒｃｈ  ＩＤフィールドに記録されているノードがルーティングテーブル９５に記録されているかを確認する。ここでは、ノードＢが保持するルーティングテーブル９５にはノードＧが記録されていない。すると、検索先決定部７１は、ノードＧはクラスタＣ２に所属していないことを認識する。
【０１４８】
次に、ノードＢの検索先決定部７１は、検索データパケットのＫｅｙＧＳフィールドの値とＫｅｙＦＩＤフィールドの値を抽出し、抽出した値の組み合わせに対応付けられたエントリがサーチログテーブル７３に記録されているかを確認する。ここでは、ＫｅｙＧＳフィールドの値とＫｅｙＦＩＤフィールドの値に対応するエントリがサーチログテーブル７３に含まれていないものとする。すると、検索先決定部７１は、エントリをサーチログテーブル７３に追加し、ＬＳ、ＦＩＤ、ＧＳ、ｄｏｎｅフラグの値を設定する。次に、ノードＢの検索先決定部７１は、隣接クラスタのうちで、まだ検索が行われていないクラスタを検索先に決定する。ここでは、検索先決定部７１は、クラスタＣ３を検索先に指定して検索実行部７２に通知する。
【０１４９】
検索実行部７２は、所属クラスタのサブゲートウェイであって、かつ、クラスタＣ３に含まれているサブゲートウェイに隣接しているサブゲートウェイ（ノードＣ）を検索データパケットの送信先に決定する。従って、サーチログテーブル７３には、
ＬＳ          ：ノードＡ
ＦＩＤ        ：ＦＩＤ０
ＧＳ          ：ノードＳ
ｄｏｎｅフラグ：０
ＧＤ          ：ノードＣ
の情報が記録される。サーチログテーブル７３の例を図３９（ｄ）に示す。
【０１５０】
さらに、検索実行部７２は、ノードＣに、検索データパケットを送信する。検索データパケットの生成方法は、手順（６２）で説明した方法と同様である。ノードＢが生成する検索データパケットの例を図３９（ｅ）に示す。ノードＢの検索実行部７２は、検索データパケットのＧＤをノードＣ、ＧＳとＬＳをノードＢに設定する。さらに、ノードＢの検索実行部７２は、ホップ数を１に設定し、さらに、クラスタＣ１とクラスタＣ２が検索済みであることをＣｈｅｃｋｅｄａｄｄｒフィールドに記録する。ノードＢの検索実行部７２は、ルーティングテーブル９５を参照してＬＤを決定し、生成した検索データパケットを送信する。
【０１５１】
（６４）ノードＢからノードＣに至る経路のノード装置１０は、検索データパケットを受信するたびに、適宜、ＬＳとＬＤを変更し、ホップ数を１つインクリメントした上で、検索データパケットを転送する。
【０１５２】
（６５）ノードＣの検索先決定部７１は、検索を要求する検索データパケットを受信すると、Ｃｈｅｃｋｅｄａｄｄｒフィールドの値から、所属クラスタ（クラスタＣ２）が検索済みであることを認識する。すると、ノードＣの検索先決定部７１はルーティングテーブル９５の検索を行わない。
【０１５３】
次に、ノードＣの検索先決定部７１は、検索データパケットのＫｅｙＧＳフィールドの値とＫｅｙＦＩＤフィールドの値の組み合わせに対応するエントリがサーチログテーブル７３に記録されているかを確認する。ここでは、検索データパケットから得られた値の組み合わせに対応するエントリがサーチログテーブル７３に含まれていないので、検索先決定部７１は、
ＬＳ          ：ノードＢ
ＦＩＤ        ：ＦＩＤ０
ＧＳ          ：ノードＳ
ｄｏｎｅフラグ：０
ＧＤ          ：ノードＤ
を示すエントリをサーチログテーブル７３に追加する。追加されたエントリの例を、図３９（ｆ）に示す。なお、サーチログテーブル７３のＬＳは、検索データパケットの送信元ノードであるので、ノードＢとなる。ノードＣの検索先決定部７１は、隣接クラスタからクラスタＣ３を検索先に指定して検索実行部７２に通知する。
【０１５４】
検索実行部７２は、隣接ノードであって、かつ、クラスタＣ３に含まれているサブゲートウェイに隣接しているサブゲートウェイ（ノードＤ）に、検索データパケットを送信する。検索データパケットの生成方法は、手順（６２）で説明した方法と同様である。ノードＣが生成する検索データパケットの例を図３９（ｇ）に示す。ノードＣの検索実行部７２は、検索データパケットのＧＤをノードＤ、ＧＳとＬＳをノードＣに設定する。また、ホップ数はノードＢからノードＣに至るまでのホップ数に１を加えた値になる。すなわち、ホップ数は、ノードＡを起点としたホップ数である。
【０１５５】
（６６）ノードＤの検索先決定部７１は、検索を要求する検索データパケットを受信すると、Ｃｈｅｃｋｅｄａｄｄｒフィールドの値を確認する。ここでは、ＣｈｅｃｋｅｄａｄｄｒフィールドにＣ３が含まれていないため、検索先決定部７１は、クラスタＣ３が検索されていないことを認識する。すると、ノードＤの検索先決定部７１は、Ｓｅａｒｃｈ  ＩＤフィールドに記録されているノードがルーティングテーブル９５に記録されているかを確認する。ここでは、ノードＤが保持するルーティングテーブル９５にはノードＧが記録されているものとする。
【０１５６】
すると、検索先決定部７１は検索が終了したと判断し、検索結果を通知するための検索データパケットを生成する。ノードＤで生成される検索データパケットの例を図３９（ｈ）に示す。ノードＤの検索先決定部７１は、検索データパケットのＳｅａｒｃｈＴｙｐｅフィールドの値を１、ｆｏｕｎｄフラグを１に設定し、検索結果を通知するための応答であることを示す。さらにＣｈｅｃｋｅｄａｄｄｒフィールドにクラスタＣ１〜Ｃ３を記録する。検索先決定部７１は、ホップ数フィールドに、ノードＤからノードＧに至るまでのホップ数を記録する。検索先決定部７１は、ＫｅｙＧＳフィールド、ＫｅｙＦＩＤフィールド、Ｓｅａｒｃｈ  ＩＤフィールドの値は、検索を要求してきた検索データパケットと同じ値とする。検索先決定部７１は、ＧＤに検索を要求してきた検索データパケットの送信元を設定する。従って、ＧＤにノードＣが設定される。さらに、ＧＳとＬＳがノードＤに設定される。検索先決定部７１は、生成した検索データパケットをノードＣに向けて送信する。
【０１５７】
（６７）ノードＣの検索先決定部７１は、ＳｅａｒｃｈＴｙｐｅフィールドの値が１である検索データパケットを受信すると、検索結果が通知されていると認識する。また、検索データパケットのホップ数フィールドの値を１つインクリメントする。
【０１５８】
検索先決定部７１は、ＳｅａｒｃｈＴｙｐｅフィールド＝１の検索データパケットの内容をハイウェイテーブル９４に記録する。ハイウェイテーブル９４に追加されるエントリの例を図３９（ｉ）に示す。ＧＤにはＳｅａｒｃｈ  ＩＤフィールドの値、ＬＤは、検索データパケットの送信元ノード、Ｌｅｎの欄には、インクリメント後の検索データパケットのホップ数フィールドの値が記録される。すなわち、Ｌｅｎの値は、ハイウェイテーブル９４を記録しているノードからそのエントリのＧＤまでのホップ数になる。ここでは、ホップ数は、ノードＣからノードＧまでのホップ数である。もしハイウェイテーブル９４にＧＤが同じエントリがある場合は、ホップ数が小さい方の値が採用される。
【０１５９】
ノードＣの検索先決定部７１は、サーチログテーブル７３を確認して、検索データパケットのペイロードに記録されている情報を通知する対象を特定する。このとき、検索先決定部７１は、検索データパケットのＫｅｙＧＳフィールドとＫｅｙＦＩＤフィールドの値の組合せをキーとして、サーチログテーブル７３のＧＳとＦＩＤの欄を検索する。なお、図３９の例では、サーチログテーブル７３のＧＳとＦＩＤの欄は、サーチログテーブル７３のエントリの２番目と３番目の欄である。さらに、サーチログテーブル７３中の、ヒットしたエントリについては、ｄｏｎｅフラグを１に変更する。従って、変更後のサーチログテーブル７３のエントリは、
ＬＳ          ：ノードＢ
ＦＩＤ        ：ＦＩＤ０
ＧＳ          ：ノードＳ
ｄｏｎｅフラグ：１
ＧＤ          ：ノードＤ
となる。図３９（ｋ）にサーチログテーブル７３のエントリが変更されたときの例を示す。検索先決定部７１は、ヒットしたエントリのＬＳに指定されているノードに向けて、ノードＤから通知された情報を通知する。このとき、検索先決定部７１は図３９（ｊ）に示す検索データパケットを生成して、ノードＢに向けて送信する。
【０１６０】
（６８）ノードＢの検索先決定部７１は、ＳｅａｒｃｈＴｙｐｅフィールドの値が１である検索データパケットを受信すると、（６７）で説明した手順と同様の処理により、ハイウェイテーブル９４とサーチログテーブル７３を更新する。ハイウェイテーブル９４の例を図３９（ｌ）に示す。サーチログテーブル７３の変更後のエントリには、
ＬＳ          ：ノードＡ
ＦＩＤ        ：ＦＩＤ０
ＧＳ          ：ノードＳ
ｄｏｎｅフラグ：１
ＧＤ          ：ノードＣ
のデータが記録される。変更後のサーチログテーブル７３の例を図３９（ｍ）に示す。また、ノードＢの検索先決定部７１は、図３９（ｎ）に示す検索データパケットを生成して、ノードＡに送信する。
【０１６１】
（６９）ノードＡの検索先決定部７１は、検索データパケットを受信すると、（６７）で説明した手順と同様の処理により、ハイウェイテーブル９４とサーチログテーブル７３を更新する。ハイウェイテーブル９４の例を図３９（ｏ）に示す。変更後のサーチログテーブル７３には、
ＬＳ          ：ノードＡ
ＦＩＤ        ：ＦＩＤ０
ＧＳ          ：ノードＳ
ｄｏｎｅフラグ：１
ＧＤ          ：ノードＢ
のデータが記録される。サーチログテーブル７３の例を図３９（ｐ）に示す。
【０１６２】
（７０）ノードＡのハイウェイデータパケット処理部８２は、ハイウェイテーブル９４にノードＧのエントリができたため、ペンディングデータテーブル８３に格納されていたハイウェイデータパケットをノードＢに転送する。このとき、ハイウェイデータパケットのアウターヘッダのＧＤはノードＢ、ＧＳおよびＬＳはノードＡに変更される。
【０１６３】
（７１）ノードＢのハイウェイデータパケット処理部８２は、ノードＡからハイウェイデータパケットを受信すると、ハイウェイデータパケットのインナーヘッダのＧＤをキーとして、ルーティングテーブル９５を参照する。ルーティングテーブル９５にＧＤが含まれていない場合、ハイウェイデータパケット処理部８２は、ハイウェイテーブル９４を参照する。ハイウェイテーブル９４にＧＤ＝ノードＧのエントリができたため、ノードＢは、このエントリのＬＤに登録されているノードＣをアウターヘッダのＧＤに設定して、ハイウェイデータパケットをノードＣに転送する。
【０１６４】
（７２）ノードＣがノードＢからハイウェイデータパケットを受信した場合の処理も手順（７１）と同様である。ノードＣは、アウターヘッダに含まれるアドレスを変更して、ハイウェイデータパケットをノードＤに転送する。
【０１６５】
（７３）ノードＤのハイウェイデータパケット処理部８２は、ノードＣからハイウェイデータパケットを受信すると、ハイウェイデータパケットのインナーヘッダのＧＤをキーとして、ルーティングテーブル９５を検索する。ルーティングテーブル９５にＧＤが記録されているので、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのアウターヘッダを除去し、データパケット処理部８１に出力する。データパケット処理部８１に出力されるデータパケットの例を図３９（ｑ）に示す。データパケット処理部８１は、ルーティングテーブル９５を参照してデータパケットをノードＧに転送する。
【０１６６】
図４０は、検索データパケット（ＳＤＰ）の処理の例を説明するフローチャートである。図４０は、検索データパケットを受信したノードの動作を表しており、図４０の説明では、検索データパケットを受信したノードのことを「自ノード」と記載することがある。
【０１６７】
検索データパケットを受信したノードの検索先決定部７１は、ＳｅａｒｃｈＴｙｐｅフィールドに基づいて、検索が要求されているかを判定する（ステップＳ２２１）。検索が要求されている場合、検索先決定部７１は、自ノードが検索データパケットのＧＤと一致するかを確認する（ステップＳ２２１でＹｅｓ、ステップＳ２２２）。自ノードが検索データパケットのＧＤでない場合、検索データパケットを宛先に転送するための処理を行う(ステップＳ２２２でＮｏ、ステップＳ２２７)。自ノードが検索データパケットのＧＤである場合、検索先決定部７１は、さらに、自ノードがサブゲートウェイであるかを確認する（ステップＳ２２２でＹｅｓ、ステップＳ２２３）。自ノードがサブゲートウェイでない場合、検索先決定部７１は処理を終了する（ステップＳ２２３でＮｏ）。自ノードがサブゲートウェイである場合、Ｓｅａｒｃｈ  ＩＤフィールドに記録されているノードが自ノード、もしくは、ルーティングテーブル９５に記録されているノードのいずれかであるかを判定する（ステップＳ２２４）。Ｓｅａｒｃｈ  ＩＤフィールドに記録されているノードが自ノード、もしくは、ルーティングテーブル９５に記録されているノードのいずれかである場合、検索は終了する（ステップＳ２２４でＹｅｓ）。そこで、検索先決定部７１は、検索結果を通知するための検索データパケットを生成する（ステップＳ２２５）。このとき、検索先決定部７１は、受信した検索データパケットのＧＤとＧＳを入れ替え、ｆｏｕｎｄフラグを１に設定する。また、検索先決定部７１は、ＳｅａｒｃｈＴｙｐｅフィールドの値を１に変更する。次に、検索先決定部７１は、検索データパケットの探索済みのクラスタリストに自ノードの所属クラスタを識別するクラスタＩＤを記録する（ステップＳ２２６）。その後、検索先決定部７１は、生成した検索データパケットを送信する（ステップＳ２２７）。このとき、検索先決定部７１は、検索データパケットのＧＤでルーティングテーブル９５を検索し、得られたＬＤを検索データパケットのＬＤに設定する。さらに、検索データパケットのＬＳに自ノードを設定する。
【０１６８】
ステップＳ２２４で、Ｓｅａｒｃｈ  ＩＤフィールドに記録されているノードが自ノードではなく、ルーティングテーブル９５に記録されているノードでもない場合、検索先決定部７１は、サーチログテーブル７３への登録処理を行う（ステップＳ２２８）。また、検索先決定部７１は、隣接クラスタのうちでまだ検索が行われていないクラスタを検索先として特定し、検索先のクラスタに所属するサブゲートウェイを選択する（ステップＳ２２９）。検索データパケットの転送先が得られた場合、検索先決定部７１は、転送先のノードをサーチログテーブル７３に記録し、ステップＳ２２６以降の処理を行う（ステップＳ２３１でＹｅｓ）。一方、全ての隣接クラスタの検索が終わっているなどの理由により、検索データパケットの転送先が得られなかった場合、検索実行部７２は、サーチログテーブル７３のｄｏｎｅフラグを１に設定する（ステップＳ２３１でＮｏ、ステップＳ２３２）。さらに、検索実行部７２は、検索データパケットの送信元に対して、検索が終わったことを通知するための検索データパケットを返信する（ステップＳ２３３）。ステップＳ２３３で送信される検索データパケットでは、ＳｅａｒｃｈＴｙｐｅフィールド＝１が設定されているので、検索データパケットに対する応答であることが宛先のノードで認識される。ここでは検索先のノードまでの経路が発見されていないので、検索データパケットのｆｏｕｎｄフラグは０に設定される。
【０１６９】
受信した検索データパケットが検索結果を通知している場合、検索先決定部７１は、自ノードが検索データパケットのＧＤと一致するかを確認する（ステップＳ２２１でＮｏ、ステップＳ２３４）。自ノードが検索データパケットのＧＤでない場合、検索データパケットを宛先に転送するための処理を行う(ステップＳ２３４でＮｏ、ステップＳ２４１)。自ノードが検索データパケットのＧＤである場合、検索先決定部７１は、さらに、自ノードがサブゲートウェイであるかを確認する（ステップＳ２３５）。自ノードがサブゲートウェイでない場合、検索先決定部７１は処理を終了する（ステップＳ２３５でＮｏ）。自ノードがサブゲートウェイである場合、検索データパケットのｆｏｕｎｄフラグが１であるかを確認する（ステップＳ２３６）。ｆｏｕｎｄフラグが１である場合、検索先決定部７１は、検索データパケットで通知された内容をハイウェイテーブル９４に記録する（ステップＳ２３６でＹｅｓ、ステップＳ２３７）。このとき、ハイウェイテーブル９４のＧＤに、検索データパケットのＳｅａｒｃｈ  ＩＤフィールドに記録されているノードが記録される。また、ハイウェイテーブル９４のＬＤに、検索データパケットのＧＳが記録される。さらに、検索先決定部７１は、ハイウェイテーブル９４のホップ数を設定する。一方、ｆｏｕｎｄフラグが１でない場合、検索先決定部７１はステップＳ２３７の処理を行わずにステップＳ２３８の処理を行う（ステップＳ２３６でＮｏ）。ノード装置１０は、自ノードが検索データパケットを用いた問い合わせを開始した場合、ハイウェイテーブル９４を用いてハイウェイデータパケットを送信する（ステップＳ２３８でＹｅｓ、ステップＳ２３９）。自ノードが検索データパケットを用いた問い合わせを開始したかどうかは、検索データパケットのＫｅｙＧＳフィールド、ＫｅｙＦＩＤフィールドの値の組み合わせでサーチログテーブル７３を検索することにより判定される。検索データパケットのＫｅｙＧＳフィールド、ＫｅｙＦＩＤフィールドの値の組み合わせに一致するエントリのＬＳが自ノードである場合、自ノードが問い合わせを開始したと判定される。一方、検索データパケットを用いた問い合わせを開始したノードではない場合、検索実行部７２は、ＫｅｙＧＳフィールド、ＫｅｙＦＩＤフィールドの値の組み合わせに一致するエントリのＬＳをサーチログテーブル７３から取得する（ステップＳ２４０）。検索実行部７２は、検索データパケットのＧＤに、サーチログテーブル７３から得られたＬＳを設定する。その後、検索先決定部７１は、生成した検索データパケットを送信する（ステップＳ２４１）。ステップＳ２４１で送信される検索データパケットの生成方法は、ステップＳ２２７と同様である。
【０１７０】
図４１は、ハイウェイデータパケットの処理の例を説明するフローチャートである。図４１は、ハイウェイデータパケットを受信したノードの動作を表しており、図４１の説明では、ハイウェイデータパケットを受信したノードのことを「自ノード」と記載することがある。
【０１７１】
ハイウェイデータパケット処理部８２は、受信したハイウェイデータパケットのＧＤが自ノードであるかを判定する（ステップＳ２５１）。ハイウェイデータパケットのＧＤが自ノードである場合、ハイウェイデータパケット処理部８２は、自ノードがサブゲートウェイであるかを確認する（ステップＳ２５１でＹｅｓ、ステップＳ２５２）。自ノードがサブゲートウェイではない場合、ハイウェイデータパケット処理部８２はデータを廃棄した上で処理を終了する（ステップＳ２５２でＮｏ、ステップＳ２５３）。
【０１７２】
一方、自ノードがサブゲートウェイである場合、ハイウェイデータパケット処理部８２は、インナーヘッダのＧＤ（データパケットのＧＤ）が自ノードかを確認する（ステップＳ２５２でＹｅｓ、ステップＳ２５４）。ＧＤが自ノードである場合、ハイウェイデータパケット処理部８２は、上位処理部１４にデータを出力して処理を終了する（ステップＳ２５４でＹｅｓ、ステップＳ２５５）。ＧＤが自ノードではない場合、インナーヘッダのＧＤがルーティングテーブル９５に登録されているかを確認する（ステップＳ２５４でＮｏ、ステップＳ２５６）。ＧＤがルーティングテーブル９５に登録されている場合、所属クラスタ内にＧＤがいることになる（ステップＳ２５７でＹｅｓ）。そこで、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットをデータパケットに変換してデータパケット処理部８１に出力する。さらに、データパケット処理部８１は、データパケットのＬＳを自ノードとし、データパケットのＬＤをＧＤに対応付けてルーティングテーブル９５に記録されているＬＤとする（ステップＳ２５８）。データパケット処理部８１は、データパケットを転送する（ステップＳ２５９）。
【０１７３】
ステップＳ２５７で、ＧＤがルーティングテーブル９５に登録されていないと判定された場合、ハイウェイデータパケット処理部８２は、インナーヘッダのＧＤがハイウェイテーブル９４に登録されているかを確認する（ステップＳ２５７でＮｏ、ステップＳ２６０）。ＧＤがハイウェイテーブル９４に登録されていない場合、検索データパケットの送信が行われる（ステップＳ２６１でＮｏ、ステップＳ２６２）。一方、ＧＤがハイウェイテーブル９４に登録されている場合、ハイウェイテーブル９４のＬＤをハイウェイデータパケットのＧＤ（アウターヘッダのＧＤ）に設定する（ステップＳ２６１でＹｅｓ、ステップＳ２６３）。その後、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのアウターヘッダのＧＤがルーティングテーブル９５に登録されているかを確認する（ステップＳ２６４、Ｓ２６５）。アウターヘッダのＧＤがルーティングテーブル９５に登録されていない場合、ハイウェイデータパケット処理部８２は、データを廃棄して処理を終了する（ステップＳ２６５でＮｏ、ステップＳ２６８）。
【０１７４】
一方、ＧＤがルーティングテーブル９５に登録されている場合、ルーティングテーブル９５の該当するエントリに記録されているＬＤをアウターヘッダのＬＤに設定する。また、アウターヘッダのＬＳを自ノードにし、データパケットのホップ数を１つインクリメントする（ステップＳ２６５でＹｅｓ、ステップＳ２６６）。ハイウェイデータパケット処理部８２は、ホップ数の値が予め記憶しているホップ限界以下の場合、ハイウェイデータパケットを転送する（ステップＳ２６９）。一方、ホップ数の値を予め記憶しているホップ限界を超えている場合、ハイウェイデータパケット処理部８２は、データを廃棄する（ステップＳ２６７でＮｏ、ステップＳ２６８）。また、ステップＳ２５１でハイウェイデータパケットのＧＤは自ノードではないと判定された場合は、ステップＳ２６４以降の処理が行われる。
【０１７５】
さらに、図３５を参照しながら、ハイウェイデータパケットが生成される場合の動作について説明する。データパケットのＧＤが所属クラスタと異なるクラスタに所属している場合、ステップＳ１９４でＮｏと判定され、ハイウェイデータパケットの作成が開始される（ステップＳ１９８）。以下の説明では、ステップＳ１９８〜Ｓ２１０を参照しながら、ハイウェイデータパケットを生成するノードの動作を説明する。また、ステップＳ１９８〜Ｓ２１０の説明では、ハイウェイデータパケットを生成するノードを「自ノード」と記載する。
【０１７６】
ハイウェイデータパケット処理部８２は、自ノードがサブゲートウェイであるかを確認する（ステップＳ１９９）。自ノードがサブゲートウェイではない場合、ハイウェイデータパケット処理部８２は、デフォルトゲートウェイまでの経路をルーティングテーブル９５から取得する（ステップＳ２００、Ｓ２０１）。ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのアドレス等を設定する（ステップＳ２０２）。すなわち、ハイウェイデータパケット処理部８２は、デフォルトゲートウェイをハイウェイデータパケットのＧＤに設定し、自ノードをハイウェイデータパケットのＧＳに設定する。さらに、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのＬＤをデフォルトゲートウェイまでの経路のＬＤに設定し、さらに、データパケットのホップ数を１つインクリメントする。ホップ数がホップ限界以下であれば、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットを転送する（ステップＳ２０８でＹｅｓ、ステップＳ２０９）。一方、ホップ数がホップ限界を超えていれば、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットを廃棄する（ステップＳ２０８でＮｏ）。
【０１７７】
ステップＳ１９９で自ノードがサブゲートウェイであると判定された場合、インナーヘッダのＧＤ（データパケットのＧＤ）がハイウェイテーブル９４に登録されているかを確認する（ステップＳ２０３、Ｓ２０４）。インナーヘッダのＧＤがハイウェイテーブル９４に記録されている場合、ハイウェイデータパケット処理部８２は、ハイウェイテーブル９４でＧＤへの経路のＬＤとして登録されているノードを、アウターヘッダのＧＤに設定する。さらに、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのＧＳを自ノードに設定する（ステップＳ２０５）。次に、ハイウェイデータパケット処理部８２は、ハイウェイデータパケットのアウターヘッダのＧＤと一致するエントリをルーティングテーブル９５から取得する（ステップＳ２０６）。ハイウェイデータパケット処理部８２は、取得したエントリにＬＤとして記録されているノードを、ハイウェイデータパケットのアウターヘッダのＬＤに指定し、ＬＳを自ノードとする。さらに、ハイウェイデータパケット処理部８２は、データパケットのホップ数を１つインクリメントする（ステップＳ２０７）。ハイウェイデータパケット処理部８２は、ホップ数がホップ限界以下の場合、ハイウェイデータパケットを転送し、ホップ数がホップ限界を超えている場合、ハイウェイデータパケットを廃棄する（ステップＳ２０８、Ｓ２０９）。なお、ステップＳ２０４でハイウェイテーブル９４に登録されていないと判定されると、サブゲートウェイは、検索データパケットの送信処理を行う（ステップＳ２１０）。
【０１７８】
＜その他＞
以上の説明では、クラスタ中のノード数が閾値まで達したときに新たなクラスタの生成が開始される場合を例としたが、新たなクラスタの生成が開始されるタイミングは実装に応じて変更されることがある。例えば、クラスタ中のノード数が閾値の８０％に達したときに新たなクラスタの生成が開始されても良い。
【０１７９】
これまでの説明で図示したパケットのフォーマットは一例である。実装に応じてパケットのフォーマットが適宜変更される場合もある。
さらに、前述の説明では、クラスタの生成を行っている起点ノード装置が１つの場合を例として説明したが、クラスタの生成を行う起点ノード装置の数は複数でもよい。この場合も個々の起点ノード装置の動作は前述のとおりである。
【０１８０】
また、クラスタＩＤをクラスタの起点ノード装置のアドレスとすることができる。この場合、クラスタＩＤと起点ノード装置のアドレスは一致するため、クラスタテーブル９２は、クラスタＩＤと起点ノード装置のアドレスのうちの一方を記憶することができ、メモリ領域を節約できる。
【符号の説明】
【０１８１】
１０  ノード装置
１１  受信部
１２  パケット分岐処理部
１３  ＦＩＤ生成部
１４  上位処理部
１５  Ｈｅｌｌｏ生成部
１６  送信部
２０  Ｈｅｌｌｏ処理部
２１  経路管理部
２２  未所属ノード特定部
３０  受信処理部
３１  ＡＣＫ処理部
３２  バッファ部
４０  クラスタ処理部
４１  デフォルトＧＷ決定部
４２  クラスタ検索テーブル
４３  隣接クラスタテーブル
４４  ゲートウェイ候補テーブル
５０  クラスタ生成部
５１  参加要求部
５２  参加処理部
５３  生成要求部
５４  未所属ノード特定部
６０  サブゲートウェイ生成部
６１  隣接クラスタ通知部
６２  候補テーブル生成部
６３  サブゲートウェイ決定部
７０  検索処理部
７１  検索先決定部
７２  検索実行部
７３  サーチログテーブル
８０  データ処理部
８１  データパケット処理部
８２  ハイウェイデータパケット処理部
８３  ペンディングデータテーブル
９０  記憶部
９１  リンクテーブル
９２  クラスタテーブル
９３  未所属テーブル
９４  ハイウェイテーブル
９５  ルーティングテーブル
９６  ＦＩＤ管理テーブル
１００  ＭＰＵ
１０１  バス
１０２  ＰＨＹチップ
１０４  タイマＩＣ
１０６  ＤＲＡＭ
１０７  フラッシュメモリ
１０８  無線モジュール
【図１】
2013042208.tif 000003
【図２】
2013042208.tif 000004
【図３】
2013042208.tif 000005
【図４】
2013042208.tif 000006
【図５】
2013042208.tif 000007
【図６】
2013042208.tif 000008
【図７】
2013042208.tif 000009
【図８】
2013042208.tif 000010
【図９】
2013042208.tif 000011
【図１０】
2013042208.tif 000012
【図１１】
2013042208.tif 000013
【図１２】
2013042208.tif 000014
【図１３】
2013042208.tif 000015
【図１４】
2013042208.tif 000016
【図１５】
2013042208.tif 000017
【図１６】
2013042208.tif 000018
【図１７】
2013042208.tif 000019
【図１８】
2013042208.tif 000020
【図１９】
2013042208.tif 000021
【図２０】
2013042208.tif 000022
【図２１】
2013042208.tif 000023
【図２２】
2013042208.tif 000024
【図２３】
2013042208.tif 000025
【図２４】
2013042208.tif 000026
【図２５】
2013042208.tif 000027
【図２６】
2013042208.tif 000028
【図２７】
2013042208.tif 000029
【図２８】
2013042208.tif 000030
【図２９】
2013042208.tif 000031
【図３０】
2013042208.tif 000032
【図３１】
2013042208.tif 000033
【図３２】
2013042208.tif 000034
【図３３】
2013042208.tif 000035
【図３４】
2013042208.tif 000036
【図３５】
2013042208.tif 000037
【図３６】
2013042208.tif 000038
【図３７】
2013042208.tif 000039
【図３８】
2013042208.tif 000040
【図３９】
2013042208.tif 000041
【図４０】
2013042208.tif 000042
【図４１】
2013042208.tif 000043
【手続補正書】
【提出日】平成26年3月26日(2014.3.26)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ネットワークの経路情報を通知する経路情報パケットを受信する受信部と、
隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置の中から選択した第１のノード装置に、自身が所属している第１のクラスタへの参加を要求するための参加要求パケットを生成する参加要求部と、
前記第１のクラスタに所属している各所属ノード装置までの経路を記憶するルーティングテーブルと、
前記第１のクラスタに所属する所属ノード装置の数が閾値を超えると、前記第１のクラスタに所属していない第２のノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求するための生成要求パケットを生成する生成要求部と、
前記参加要求パケットを前記第１のノード装置に送信し、前記生成要求パケットを前記第２のノード装置に送信する送信部
を備えることを特徴とするノード装置。
【請求項２】
前記隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置のうち、いずれのクラスタにも所属していない未所属ノード装置を特定すると共に、前記未所属ノード装置を未所属テーブルに記録する未所属ノード特定部をさらに備え、
前記参加要求部は、前記未所属テーブルに記録されているノード装置から、前記第１のクラスタへの参加を要求するノード装置を選択し、
前記未所属ノード特定部は、前記所属ノード装置を前記未所属テーブルから削除し、前記所属ノード装置から通知された情報から、前記所属ノード装置に隣接しているノード装置のうちでいずれのクラスタにも所属していないノード装置を特定し、前記未所属テーブルに記録する
ことを特徴とする請求項１に記載のノード装置。
【請求項３】
前記所属ノード装置から、前記所属ノード装置に隣接するノード装置が前記第２のクラスタに所属していることを通知する隣接クラスタ通知を受信すると、前記隣接クラスタ通知の送信元を前記第２のクラスタと対応付けて、候補テーブルに記録する候補テーブル生成部と
前記候補テーブルから選択したノード装置を、前記第２のクラスタと前記第１のクラスタの間のゲートウェイとして動作するノード装置であるサブゲートウェイに決定するサブゲートウェイ決定部
をさらに備える
ことを特徴とする請求項１もしくは２に記載のノード装置。
【請求項４】
前記サブゲートウェイ決定部は、前記サブゲートウェイに、前記第１のクラスタに所属しておらず、かつ、前記サブゲートウェイに隣接するノード装置までの経路をルーティングテーブルに記憶することと、前記隣接クラスタ通知で通知したクラスタに含まれるノード装置を前記サブゲートウェイとして動作させることを要求する
ことを特徴とする請求項３に記載のノード装置。
【請求項５】
所属しているクラスタ中に複数のサブゲートウェイがある場合、通信条件が所定の条件よりも良いサブゲートウェイを、前記所属しているクラスタに含まれていないノード装置宛のデータパケットの中継先として優先的に選択するデフォルトゲートウェイに決定するデフォルトゲートウェイ決定部をさらに備える
ことを特徴とする請求項３もしくは４に記載のノード装置。
【請求項６】
第１のノード装置は、前記第１のノード装置の隣接ノード装置、および、前記隣接ノード装置から通信可能なノード装置に、第１のクラスタへの参加を要求することにより、前記第１のノード装置を含む第１のクラスタを生成し、
前記第１のクラスタに所属している所属ノード装置は、経路情報を通知する経路情報パケットを送受信することにより、他の所属ノード装置までの経路をルーティングテーブルに記憶し、
前記第１のノード装置は、前記所属ノード装置の数が閾値を超えるまで、前記第１のクラスタへの参加の要求と、前記ルーティングテーブルへの経路の記憶を繰り返し、
前記所属ノードの数が前記閾値を超えると、前記第１のクラスタに所属していない第２のノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求する
ことを特徴とする通信方法。
【請求項７】
前記第１のノード装置は、前記第１のクラスタに所属しており、かつ、前記第２のクラスタに所属する第３のノード装置に隣接するノード装置を、前記第１のクラスタと前記第２のクラスタの間のゲートウェイとして動作するノード装置である第１のサブゲートウェイに決定し、
前記第１のサブゲートウェイは、前記第３のノード装置を、第１のクラスタと前記第２のクラスタの間のゲートウェイとして動作する第２のサブゲートウェイに設定し、
前記第１のサブゲートウェイは前記第２のサブゲートウェイまでの経路を前記ルーティングテーブルに記憶する
ことを特徴とする請求項６に記載の通信方法。
【請求項８】
前記第１のサブゲートウェイは、前記所属ノード装置から前記第１のクラスタとは異なるクラスタに所属する第４のノード装置へ送信されるデータを含むデータパケットを記憶し、
前記第１のサブゲートウェイは、前記第４のノード装置への経路を前記第２のサブゲートウェイに問い合わせ、
前記第２のサブゲートウェイが格納しているルーティングテーブルに前記第４のノード装置が記録されている場合、前記第２のサブゲートウェイは前記第４のノード装置への経路を前記第１のサブゲートウェイに通知し、
前記第１のサブゲートウェイは、通知された経路を用いて、前記データパケットを前記第４のノード装置へ送信する
ことを特徴とする請求項６もしくは７に記載の通信方法。
【請求項９】
ネットワークの経路情報を通知する経路情報パケットを受信し、
隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置に、第１のクラスタへの参加を要求する制御パケットを送信し、
前記第１のクラスタに所属している所属ノード装置までの経路をルーティングテーブルに記憶し、
前記所属ノード装置の数が閾値を超えると、前記第１のクラスタに所属していないノード装置に、前記第１のクラスタとは異なる第２のクラスタの生成を要求する制御パケットを送信する
処理をコンピュータに行わせることを特徴とする通信プログラム。
【国際調査報告】
2013042208.tif 000044
2013042208.tif 000045
2013042208.tif 000046
2013042208.tif 000047