図2は、実施形態にかかる通信方法の例を説明する図である。図2では、理解し易くするために、2つのクラスタに分けられている無線アドホックネットワークを例として説明する。
隣接するクラスタに含まれているノード装置と通信可能なノード装置は、そのノード装置の識別子(ノードID)と参加しているクラスタの識別子(クラスタID)を含む通知フレームを、隣接するノード装置に送信する。図2では、理解しやすくするために、互いに隣接するノード装置を実線で結んでいる。あるノード装置に「隣接する」ノード装置とは、あるノード装置から送信されたフレームを受信することができる範囲内に位置するノード装置のことを指すものとする。また、あるノード装置から送信されたフレームを受信できる範囲に位置するノード装置のことを、そのノード装置の「隣接ノード装置」と記載することがある。
ノード装置は、参加しているクラスタのクラスタIDと受信した通知フレームに含まれているクラスタIDを比較する。クラスタIDに含まれる数値が小さい方のクラスタに含まれているノード装置の間では、中継装置を選択するノード装置が選択される。以下、中継装置を選択するノード装置を「選択装置」と記載する。以下、選択装置を太線で示すものとする。図2(a)の例では、クラスタID=1中のノードAが選択装置として選択されている。
選択装置は、選択装置が含まれているクラスタ中に位置するノード装置のうち、隣接するクラスタ中のノード装置と通信可能なノード装置の中から、第1の中継装置を選択する。選択装置は、第1の中継装置のノードIDを選択装置の隣接ノードに通知する。第1の中継装置のノードIDを通知されたノード装置は、同じクラスタに属する隣接ノード装置に、第1の中継装置のノードIDを通知する。例えば、図2(a)の例では、ノードBが第1の中継装置に選択されている。また、クラスタID=1に含まれるノード装置は、ノードBが第1の中継装置であることを、ノードBからの通知を用いて認識する。
自ノードに割り当てられているノードIDと、第1の中継装置として動作するノードのIDが一致したノード装置は、自ノードが位置するクラスタと隣接するクラスタの間の通信を中継することを認識する。さらに、第1の中継装置は、隣接するノード装置のうち、隣接クラスタに含まれているノード装置から、第2の中継装置を選択する。第1の中継装置は、第2の中継装置に、クラスタ間の通信の中継を開始するように要求する。第2の中継装置は、第1の中継装置からの要求に応じて、クラスタ間の通信の中継を行うノード装置として選択されたことを認識する。図2(b)の例では、第1の中継装置に選択されたノードBは、隣接クラスタ中の隣接ノードであるノードCを第2の中継装置に選択する。ノードCは、クラスタID=7に含まれる他のノード装置に、ノードCが第2の中継装置であることを通知する。
その後、第1の中継装置と第2の中継装置が、クラスタ間の通信を中継する。従って、図2(b)の例では、クラスタID=1のクラスタに含まれるノード装置は、クラスタID=7のクラスタに含まれているノード装置宛のフレームを、ノードBに送信する。ノードBは、クラスタID=7のクラスタ中のノード装置宛のフレームを、ノードCに転送する。ノードCは宛先のノード装置にフレームを送信する。また、クラスタID=7のクラスタ中のノード装置は、クラスタID=1のクラスタ中のノード装置宛のフレームをノードCに送信する。ノードCは、クラスタID=1のクラスタ中のノード装置宛のフレームをノードBに送信する。ノードBは、ノードCから転送されてきたフレームを宛先のノード装置に送信する。
このように、隣接する2つのクラスタの一方では、クラスタ間を中継するノード装置が自律的に決定されるので、クラスタ間の通信を中継するノード装置の数が減少する。さらに、同じクラスタ内の選択装置からクラスタ間の通信を中継する中継装置として選択された第1の中継装置は、第1の中継装置の隣接ノード装置であって、隣接するクラスタ中のノード装置から、第2の中継装置を選択する。このため、自律的にクラスタ間の通信を中継するノード装置を選択していないクラスタにおいても、クラスタ間の通信を中継するノードの数が限定される。クラスタ間の通信を中継するノードの数が減少するため、経路の決定の処理が単純化され、経路の決定にかかる時間が短縮化される。
<通知フレーム>
通知フレームとしてHelloフレームが用いられることがある。また、第1または第2の中継装置として動作することを要求するための情報もHelloフレームに含まれていてもよい。このように変形すると、Helloフレーム以外の制御フレームを用いずに中継装置の設定ができるので、ネットワークに負荷をかけずに中継装置の設定を行うことができる。
以下、通知フレームとしてHelloフレームが用いられる場合を例として説明する。以下の説明では、隣接するクラスタに含まれているノード装置と直接通信することが可能なノード装置のことを「境界ノード」と記載することがある。また、クラスタ間の通信を行うノード装置のことを「サブゲートウェイ」と記載する。さらに、同じクラスタ中のノード装置からサブゲートウェイを選択するノード装置のことを「リーダーノード」と記載する。隣接するクラスタの区別を容易にするために、隣接するクラスタの組合せのうちで、リーダーノードが属するクラスタのことを「マスタ側クラスタ」、リーダーノードが含まれない方のクラスタのことを「スレーブ側クラスタ」と記載する。従って、サブゲートウェイに設定されたノード装置は、図2で説明した中継装置の例であり、リーダーノードに選択されたノード装置は、図2を参照しながら説明した選択装置の例である。リーダーノードは、マスタ側クラスタ中の境界ノードの中からサブゲートウェイを選択する。マスタ側クラスタで選択されたサブゲートウェイは、スレーブ側クラスタのサブゲートウェイを選択することになる。
図3にHelloフレームのフォーマットの例を示す。Helloフレームは、フレームタイプ、アドレス情報、経路情報、クラスタ情報(Cluster Information、CI)、マスタ側クラスタ情報(Master Cluster Information、MCI)、隣接クラスタ数(Cluster Count、CCNT)を含む。アドレス情報は、グローバル宛先(Global Destination、GD)、グローバル送信元(Global Source、GS)、ローカル宛先(Local Destination、LD)、ローカル送信元(Local Source、LS)を含む。なお、Helloフレーム中のマスタ側クラスタ情報フィールドは、マスタ側クラスタに含まれている境界ノードで生成されるHelloフレームで使用される。
フレームタイプは、フレームの種類を一意に表す情報である。例えば、Helloフレームではフレームタイプ=0に設定され、データフレームではフレームタイプ=1に設定される。「グローバル宛先」は、フレームの最終的な宛先を指す。一方、フレームを生成したノード装置を「グローバル送信元」と記載する。「ローカル宛先」は、フレームを最終的な宛先に送信するために行われる1ホップの転送の際に、宛先として指定されるノード装置のことを指す。「ローカル送信元」は、フレームが1ホップ転送される場合の転送元のノード装置である。Helloフレームは送信元のノード装置から1ホップのノード装置にブロードキャストされる。このため、Helloフレームの場合、ローカル送信元とグローバル送信元はいずれも、Helloフレームを生成したノード装置である。また、Helloフレームのローカル宛先とグローバル宛先は、いずれも、全ての隣接ノード装置へのブロードキャストを表すアドレスである。
経路情報は、Helloフレームを生成したノード装置がフレームを送信する経路を保持しているノード装置を識別する情報を含む。クラスタ情報は、Helloフレームを生成したノード装置が参加しているクラスタに関する情報である。クラスタ情報には、クラスタIDやクラスタ内に含まれているノード装置の識別子が含まれる。さらに、クラスタ内でサブゲートウェイに設定されているノード装置については、クラスタ情報は、ノード装置に割り当てられた識別子に対応付けて、サブゲートウェイに設定されていることを表す情報も含む。以下、クラスタの識別子は、アルファベットのCの後に、クラスタを一意に特定するために使用する数値を付したものとする。一方、ノード装置の識別子は、アルファベットのNの後に、ノード装置を一意に特定するために使用する数値を付したものとする。なお、クラスタ情報は、実装に応じて他の情報をさらに含んでもよい。例えば、クラスタが動的に形成されるシステムでは、クラスタに含まれているノード装置の数が上限に達しているかを示す情報がクラスタ情報に含まれることがある。
マスタ側クラスタ情報フィールドは、マスタ側クラスタの境界ノードが保持している情報を通知するために使用される。マスタ側クラスタ情報フィールドを用いて通知される情報については後述する。
隣接クラスタ数は、Helloフレームを生成したノード装置が通信可能なノード装置が含まれるクラスタのうち、Helloフレームを生成したノード装置が参加しているクラスタ以外のクラスタの数である。例えば、クラスタC1中のノードN1の隣接ノード装置がノードN2〜N6であり、ノードN2〜N4はクラスタC1、ノードN5はクラスタC2、ノードN6はクラスタC3に含まれているとする。この場合、ノードN1の隣接クラスタ数は2となる。
<装置構成>
図4は、ノード装置10の構成の例を示す。図4は、Helloフレームによって中継装置の設定を行う場合に用いられるノード装置10の例である。
ノード装置10は、受信部11、送信部12、フレーム処理部13、Helloフレーム生成部14、データフレーム処理部15、クラスタ処理部20、ルーティング処理部25、サブゲートウェイ設定部30、記憶部50を備える。クラスタ処理部20は、クラスタ管理部21と抽出処理部22を有する。ルーティング処理部25は、経路情報処理部26と転送処理部27を有する。サブゲートウェイ設定部30は、処理種別判定部31、スレーブ側テーブル更新部32、マスタ側テーブル更新部33、決定処理部40を備える。決定処理部40は、リーダーノード特定部41、サブゲートウェイ選択部42、中継先決定部43を有する。記憶部50は、ノード種別情報51、ルーティングテーブル52、マスタ側クラスタテーブル53、スレーブ側クラスタテーブル54、クラスタ情報テーブル55、データ56を保持する。
受信部11は、ノード装置10に送信されてきたフレームを受信する。受信部11は、受信したフレームをフレーム処理部13に出力する。フレーム処理部13は、入力されたフレームに含まれているフレームタイプを確認する。フレームタイプの値は、フレームの種類によって異なり、例えば、Helloフレームとデータフレームでは、異なる値となっている。フレーム処理部13は、予め、ノード装置10が受信する可能性があるフレームの種類の各々に対応するフレームタイプの値を記憶することができ、また、適宜、記憶部50から取得することもできる。フレーム処理部13は、Helloフレームを抽出処理部22と経路情報処理部26に出力し、データフレームをデータフレーム処理部15に出力する。送信部12は、Helloフレーム生成部14、データフレーム処理部15または転送処理部27から入力されたフレームを、フレームのローカル宛先に送信する。Helloフレーム生成部14は、周期的にHelloフレームを生成する。Helloフレーム生成部14は、Helloフレームを送信部12に出力する。データフレーム処理部15は、自ノード宛のフレームを、アプリケーションにより処理する。一方、フレーム処理部13から入力されたフレームのグローバル宛先が他のノード装置10である場合、データフレーム処理部15は、転送処理部27にフレームを出力する。
クラスタ処理部20は、クラスタの生成や維持に関する処理を行う。ここで、クラスタは静的に決定されても、動的に生成されても良いものとする。クラスタ管理部21は、クラスタごとに含まれるノード装置10の情報を処理する。クラスタ管理部21は、クラスタに含まれるノード装置10が静的に決定される場合、クラスタ情報テーブル55に基づいて、自ノードが参加しているクラスタを特定する。クラスタ情報テーブル55は、クラスタの識別子に対応付けてそのクラスタに含まれているノード装置10の識別子を記録する。一方、アドホックネットワークに含まれているノード装置10の数やノード装置10の位置などに応じて、クラスタが動的に決定される場合、クラスタ管理部21は、クラスタの生成処理を行う。この場合、クラスタ管理部21は、クラスタの生成や統合なども行う。さらに、クラスタ管理部21は、クラスタ情報テーブル55を更新する。
抽出処理部22は、隣接するノード装置10から受信したHelloフレームから、クラスタ情報、マスタ側クラスタ情報、隣接クラスタ数を抽出する。抽出処理部22は、Helloフレームに含まれているクラスタ情報を、クラスタ管理部21に出力する。さらに、抽出処理部22は、クラスタ情報、マスタ側クラスタ情報、および、隣接クラスタ数を処理種別判定部31に出力する。
ルーティング処理部25は、フレームのルーティングに関する処理を行う。経路情報処理部26は、隣接するノード装置10から受信したHelloフレームから、経路情報を取得し、ルーティングテーブル52を生成する。転送処理部27は、フレームのグローバル宛先に応じて、ルーティングテーブル52を用いて、転送先を決定する。
サブゲートウェイ設定部30は、サブゲートウェイの決定に関する処理を行う。処理種別判定部31は、自ノードが境界ノードであるかを判定する。自ノードが境界ノードである場合、処理種別判定部31は、さらに、自ノードがマスタ側クラスタに含まれているかを判定する。処理種別判定部31は、判定の結果に応じて、抽出処理部22から入力された情報の出力先を決定する。処理種別判定部31は、自ノードが参加しているクラスタのクラスタIDと、抽出処理部22から入力されたクラスタ情報に含まれているクラスタIDを比較することにより判定を行う。自ノードが参加しているクラスタID以外のクラスタIDを含むHelloフレームが受信されていない場合、処理種別判定部31には、自ノードが参加しているクラスタの以外のクラスタのクラスタIDは入力されない。この場合、処理種別判定部31は、自ノードは境界ノードではないと判定する。そこで、処理種別判定部31は、抽出処理部22から入力された情報を廃棄する。
一方、処理種別判定部31に、自ノードが参加しているクラスタのクラスタIDよりも大きな数字を含むクラスタIDが入力されたとする。すると、処理種別判定部31は、自ノードが参加しているクラスタは入力されたクラスタIDで識別されるクラスタに対するマスタ側のクラスタであると判定する。このため、処理種別判定部31は、自ノードはマスタ側クラスタの境界ノードとして動作すると判定する。そこで、処理種別判定部31は、マスタ側クラスタ情報と隣接クラスタ数を、リーダーノード特定部41に出力する。
自ノードが参加しているクラスタのクラスタIDよりも小さな数字を含むクラスタIDが入力された場合、処理種別判定部31は自ノードが参加しているクラスタは入力されたクラスタIDで識別されるクラスタに対するスレーブ側のクラスタであると判定する。このため、処理種別判定部31は、自ノードはスレーブ側クラスタの境界ノードとして動作すると判定する。そこで、処理種別判定部31は、マスタ側クラスタ情報と隣接クラスタ数を、スレーブ側テーブル更新部32に出力する。
スレーブ側テーブル更新部32は、スレーブ側クラスタの境界ノードであると判定された場合に、処理種別判定部31から入力された情報を用いてスレーブ側クラスタテーブル54を更新する。スレーブ側クラスタテーブル54の例を図5に示す。スレーブ側クラスタテーブル54は、マスタ側クラスタごとに、マスタ側クラスタで設定されたサブゲートウェイのノード識別子を対応付けて記録している。図5の例では、マスタ側クラスタとなる隣接クラスタが複数(m個)の場合を示している。また、図5の例では、マスタ側クラスタとの間の通信を中継するサブゲートウェイも複数である。例えば、クラスタC1との通信を中継するサブゲートウェイの数はk1個、クラスタC2との通信ではk2個、クラスタCmとの間ではkm個である。
マスタ側テーブル更新部33、リーダーノード特定部41、サブゲートウェイ選択部42、中継先決定部43は、マスタ側クラスタの境界ノードであると判定されたノード装置10で動作する。マスタ側テーブル更新部33は、マスタ側クラスタ情報を用いてマスタ側クラスタテーブル53を更新する。Helloフレームに含まれているマスタ側クラスタ情報の例を図6(a)に示す。マスタ側クラスタ情報は、スレーブ側のクラスタに割り当てられたクラスタIDに、サブゲートウェイの設定に用いられる情報とリーダーノードの情報を対応付けたものである。サブゲートウェイの設定に用いられる情報には、スレーブ側クラスタのサブゲートウェイの識別子(SID)、マスタ側クラスタのサブゲートウェイの識別子(MGW)、マスタ側クラスタのサブゲートウェイの隣接クラスタ数(SGWCNT)が含まれる。マスタ側サブゲートウェイに関するシーケンス番号(SGWSN)もマスタ側クラスタ情報に含まれる。マスタ側サブゲートウェイに関するシーケンス番号は、マスタ側のサブゲートウェイのHelloフレーム毎に異なる値となっており、マスタ側サブゲートウェイに関する情報の新しさの指標として用いられる。
マスタ側クラスタのリーダーノードの情報、マスタ側クラスタ内のサブゲートウェイ候補の情報も、マスタ側クラスタ情報に含まれる。マスタ側クラスタのリーダーノードの情報は、リーダーノードの識別子(LID)と、リーダーノードに関するシーケンス番号(LIDSN)が含まれる。リーダーノードに関するシーケンス番号は、リーダーノードが生成したHelloフレーム毎にインクリメントされる値である。リーダーノードに関するシーケンス番号は、リーダーノードに関する情報の新しさの指標として用いられる。マスタ側クラスタ内のサブゲートウェイ候補(CSID)は、マスタ側クラスタの現在のサブゲートウェイよりもサブゲートウェイとしての条件が良好であると判定されたノード装置10の情報が含まれている。サブゲートウェイ候補の隣接クラスタ数(CSCNT)は、サブゲートウェイ候補のノードIDに対応付けられている。
マスタ側クラスタテーブル53は、スレーブ側の隣接クラスタごとに、マスタ側クラスタ情報を記録しているテーブルである。マスタ側クラスタテーブル53の例を図6(b)に示す。図6(b)の例では、隣接するスレーブ側のクラスタの数はn個である。なお、nは任意の自然数を取りうる。
リーダーノード特定部41は、マスタ側クラスタ情報に含まれているリーダーノードと自ノードのいずれかをリーダーノードとして特定する。自ノードがリーダーノードである場合、マスタ側クラスタ情報をサブゲートウェイ選択部42に出力して、サブゲートウェイの選択を要求する。一方、自ノードがリーダーノードではない場合、マスタ側クラスタ情報をマスタ側テーブル更新部33に出力する。リーダーノード特定部41は、特定した結果をマスタ側クラスタテーブル53のリーダーノードの欄に記録する。リーダーノードの選択基準は、予め、各ノード装置10に設定されているものとする。リーダーノードの選択基準は、各ノード装置10で同一の基準であれば、実装に応じて任意に設定できる。後で、ノードIDに含まれている数値が小さいほどリーダーノードに選択されやすい場合を例として、リーダーノードの選択方法を説明する。
サブゲートウェイ選択部42は、リーダーノードに選択されたノード装置10で動作する。サブゲートウェイ選択部42は、マスタ側クラスタ中でサブゲートウェイとして動作するノード装置10を決定する。マスタ側クラスタ中のサブゲートウェイの選択基準は、予め、各ノード装置10のサブゲートウェイ選択部42に設定されているものとする。マスタ側クラスタ中のサブゲートウェイの選択基準も、各ノード装置10で同一の基準であれば、実装に応じて任意に設定できる。後で、隣接クラスタ数が大きいほどサブゲートウェイに選択されやすい場合を例として、サブゲートウェイの選択方法を説明する。リーダーノードのサブゲートウェイ選択部42は、サブゲートウェイに選択したノード装置10の識別子と隣接クラスタ数を、マスタ側クラスタテーブル53に記録する。マスタ側クラスタ情報にサブゲートウェイ候補情報が含まれている場合、サブゲートウェイ選択部42は、前に決定したサブゲートウェイと通知されたサブゲートウェイ候補を比較し、一方をサブゲートウェイに選択する。
中継先決定部43は、マスタ側クラスタのサブゲートウェイに決定されたノード装置10において動作する。中継先決定部43は、スレーブ側クラスタに含まれている隣接ノード装置から、クラスタ間の通信に用いられるフレームの中継先とするノード装置10を選択する。ここで選択されたノード装置10は、スレーブ側クラスタ中でのサブゲートウェイとなる。中継先決定部43は、決定した中継先の情報をマスタ側クラスタテーブル53に記録する。
ノード種別情報51は、自ノードがサブゲートウェイに設定されているかを示す情報を保持する。データ56は、フレーム処理部13、Helloフレーム生成部14、データフレーム処理部15、クラスタ処理部20、ルーティング処理部25、サブゲートウェイ設定部30の処理に用いられるデータである。データ56は、オペレータ等により設定されたデータの他、フレーム処理部13、Helloフレーム生成部14、データフレーム処理部15、クラスタ処理部20、ルーティング処理部25、サブゲートウェイ設定部30の処理により得られたデータも含む。
図7は、ノード装置10のハードウェア構成の例を示す図である。ノード装置10は、プロセッサ100、バス101(101a〜101c)、タイマIC104、Dynamic Random access Memory(DRAM)106、フラッシュメモリ107、無線モジュール108を備える。ノード装置10は、オプションとして、有線通信に用いられるPHYsical layer(PHY)チップ102を含むことができる。バス101a〜101cは、プロセッサ100、PHYチップ102、タイマIC104、DRAM106、フラッシュメモリ107、および、無線モジュール108を、データの入出力が可能になるように接続する。
プロセッサ100は、MicroProcessingUnit(MPU)などを含む任意の処理回路である。プロセッサ100は、フラッシュメモリ107に格納されたファームウェアなどのプログラムを読み込んで処理を行う。このとき、プロセッサ100は、DRAM106をワーキングメモリとして使用できる。ノード装置10において、プロセッサ100は、フレーム処理部13、Helloフレーム生成部14、データフレーム処理部15、クラスタ処理部20、ルーティング処理部25、サブゲートウェイ設定部30として動作する。ノード装置10において、DRAM106は、記憶部50として動作する。受信部11と送信部12は、無線モジュール108により実現される。
タイマIC104は、Helloフレームを送信する間隔の計測や、隣接するノード装置10からHelloフレームを受信する間隔を計測するときに用いられる。つまり、タイマIC104は、Helloフレーム生成部14や経路情報処理部26などの一部として動作する。
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置10にインストールされてもよい。または、プログラムは、ネットワークからPHYチップ102や無線モジュール108を介してダウンロードされることによりノード装置10にインストールされてもよい。また、実施形態に応じて、DRAM106やフラッシュメモリ107以外の他の種類の記憶装置が利用されることがある。また、ノード装置10は、コンピュータによって実現されても良い。
<第1の実施形態>
以下、サブゲートウェイの設定方法の例を、サブゲートウェイが新規に設定される場合と、ノード装置10の増減によってサブゲートウェイが変更される場合に分けて説明する。
〔サブゲートウェイの設定〕
図8は、サブゲートウェイの設定方法の例を説明する図である。図8の例では、クラスタC1とクラスタC7が隣接している。クラスタC1にはノードN1〜N5が含まれており、クラスタC7には、ノードN6〜N8が含まれている。隣接ノードとの間でHelloフレームを送受信することにより、隣接するクラスタに含まれているノード装置からのHelloフレームを受信することができるノード装置は、境界ノードであると認識する。図8(a)の例では、ノードN3〜N6、N8が境界ノードとなり得る。図8では、境界ノードとなり得るノードを破線で囲んでいる。境界ノードは、隣接するノード装置が属するクラスタのクラスタIDと、自ノードが参加しているクラスタのクラスタIDを比較することにより、マスタ側クラスタを決定する。図8(a)のケースでは、クラスタC1がマスタ側クラスタとなり、クラスタC7がスレーブ側クラスタとなる。従って、ノードN3〜N5は、マスタ側クラスタの境界ノードとして動作し、ノードN6とN8はスレーブ側クラスタの境界ノードとして動作する。
リーダーノードは、マスタ側クラスタの境界ノードの中から選択される。ノードIDに含まれている数値が小さいほどリーダーノードになりやすい場合、図8(b)に示すように、ノードN3がリーダーノードに設定される。リーダーノードは、マスタ側クラスタ中のサブゲートウェイを選択する。マスタ側クラスタ中の境界ノードは、リーダーノードに選択されなかった場合は、サブゲートウェイを選択することはできず、リーダーノードの選択に従う。図8(c)の例では、リーダーノードであるノードN3は、ノードN3をサブゲートウェイに選択している。このため、図8(c)の例では、ノードN3がリーダーノードとサブゲートウェイを兼ねている。マスタ側クラスタのサブゲートウェイは、スレーブ側クラスタに参加している隣接ノードから、スレーブ側クラスタ中のサブゲートウェイを決定する。図8(d)の例では、ノードN3はノードN6をスレーブ側サブゲートウェイに決定している。
ここで、Helloフレームの送信を行った順序によっては、リーダーノードがサブゲートウェイを決定した後で、既にサブゲートウェイとして動作しているノード装置10よりもサブゲートウェイとしての条件が良好なノード装置10が発生する場合がある。そこで、マスタ側クラスタ中の境界ノードは、現在サブゲートウェイに設定されているノード装置10よりもサブゲートウェイとしての条件が良いノード装置10があるかを、マスタ側クラスタ情報を用いて判定する。リーダーノードは、サブゲートウェイとしての条件がより良いノード装置10を発見すると、サブゲートウェイを変更する。リーダーノード以外の境界ノードは、現在サブゲートウェイに設定されているノード装置10よりもサブゲートウェイとしての条件が良好なノード装置10を発見すると、発見したノード装置10の情報をサブゲートウェイ候補としてリーダーノードに通知する。リーダーノードは、マスタ側クラスタ内の他の境界ノードから通知されたサブゲートウェイ候補の条件を、サブゲートウェイに設定されているノード装置10の条件と比較する。サブゲートウェイ候補の条件のほうが良ければ、リーダーノードは、マスタ側クラスタのサブゲートウェイを変更する。スレーブ側クラスタについては、マスタ側クラスタのサブゲートウェイが変更することができる。例えば、マスタ側クラスタのサブゲートウェイは、スレーブ側サブゲートウェイより良い条件のノード装置10を発見すると、サブゲートウェイを変更する。
図9A、図9Bは、第1の実施形態で行われる処理の例を説明するシーケンス図である。以下、図9A、図9Bを用いて、サブゲートウェイが変更される過程を含めて、サブゲートウェイの決定方法の具体例を説明する。なお、図9A、図9Bでも、図8(a)に示すアドホックネットワークでの例を説明する。なお、手順(1)の段階では、いずれのノード装置10も、境界ノードであるかを知らないものとする。また、図9A、図9Bの説明の際に、マスタ側クラスタテーブル53やスレーブ側クラスタテーブル54の例を示している他の図を参照することがある。そこで、図10(a)〜図14では、テーブルの参照番号の後に、アンダースコアを挟んで、テーブルが更新された手順の番号を記載する。例えば、手順(2)によって得られるマスタ側クラスタテーブル53は「53_2」という番号を付している。また、図の参照を容易にするために、図9Aと図9Bにおいても、更新後のテーブルの番号を示す。
(1)ノードN6のHelloフレーム生成部14は、Helloフレームを生成する時刻になると、Helloフレームを生成する。Helloフレーム生成部14は、クラスタ管理部21からクラスタID(C7)を取得して、以下のような情報要素を含むHelloフレームを生成する。
タイプ :Helloフレーム
GS :ノードN6
LS :ノードN6
クラスタ情報中のクラスタID:C7
マスタ側クラスタ情報 :なし
隣接クラスタ数 :0
Helloフレーム生成部14は、生成したHelloフレームを送信部12に出力する。ノードN6の送信部12は、隣接するノード装置10にHelloフレームを送信する。
(2)ノードN3はノードN6から送信されたHelloフレームを受信する。以下、図8を参照しながら、ノードN3がN6からHelloフレームを受信したときに行われる処理を手順(2a)〜(2d)に分けて詳しく説明する。
(2a)ノードN3のフレーム処理部13は、受信部11を介してノードN6から受信したHelloフレームを、抽出処理部22に出力する。抽出処理部22は、ノードN6から受信したHelloフレームに含まれているクラスタ情報と隣接クラスタ数を処理種別判定部31に出力する。ノードN3の処理種別判定部31は、ノードN3が参加しているクラスタのクラスタIDがC1であることを記憶している。処理種別判定部31は、ノードN3が参加しているクラスタのクラスタIDがC1であることと、受信したHelloフレームに含まれているクラスタIDがC7であることから、ノードN3が境界ノードであると判定する。さらに、処理種別判定部31は、C1とC7では、C1の方がクラスタID中の数字が小さいことから、図8(a)に示すように、クラスタC1を、クラスタC7との組み合わせではマスタ側クラスタとする。
(2b)処理種別判定部31は、抽出処理部22から入力された情報を、リーダーノード特定部41に出力する。ノードN3にはいずれのノード装置10からもマスタ側クラスタ情報を含むHelloフレームが送信されてきていないので、ノードN3のリーダーノード特定部41が境界ノードであることを認識しているノードは、ノードN3だけである。そこで、リーダーノード特定部41は、図8(b)に示すように、ノードN3をリーダーノードに設定する。さらに、リーダーノード特定部41は、マスタ側クラスタテーブル53に以下の情報を記録する。
隣接クラスタID :C7
リーダーノードのノードID :N3
リーダーノードのシーケンス番号:0
(2c)ノードN3のリーダーノード特定部41は、サブゲートウェイ選択部42にサブゲートウェイの選択を要求する。サブゲートウェイ選択部42は、クラスタC1中のクラスタC7との境界ノードの中から、隣接クラスタ数が最も多いノード装置10を、サブゲートウェイに選択する。ここでは、ノードN3は、クラスタC1とC7の間の境界ノードとしては、ノードN3以外を認識していない。このため、ノードN3のサブゲートウェイ選択部42は、図8(c)に示すように、ノードN3をサブゲートウェイに選択する。そこで、サブゲートウェイ選択部42は、マスタ側クラスタテーブル53の隣接クラスタID=C7のエントリに、以下の情報を記録する。
サブゲートウェイのノードID :N3
サブゲートウェイのシーケンス番号 :0
サブゲートウェイの隣接クラスタ数 :1
サブゲートウェイ候補 :なし
サブゲートウェイ候補の隣接クラスタ数:0
(2d)ノードN3の中継先決定部43は、ノードN3がマスタ側クラスタのサブゲートウェイに決定されたため、スレーブ側クラスタのサブゲートウェイを決定する。ノードN3はノードN6からHelloフレームを受信しているので、中継先決定部43は、ノードN6がスレーブ側クラスタのC7に含まれている隣接ノード装置であると判定する。この時点では、他にスレーブ側クラスタのC7に含まれている隣接ノード装置を検出していないので、中継先決定部43は、ノードN6をスレーブ側クラスタ中でのサブゲートウェイとして選択する。ノードN6をサブゲートウェイに決定すると、図8(d)に示すようにサブゲートウェイが設定されることになる。中継先決定部43は、決定した中継先の情報をマスタ側クラスタテーブル53の隣接クラスタID=C7のエントリに記録する。
手順(2a)〜(2d)の処理により、ノードN3が保持するマスタ側クラスタテーブル53は、図10(a)に示すようになる。ただし、手順(2d)の段階では、ノードN3がノードN6に対して、サブゲートウェイとして動作することを要求することが決定されているが、ノードN6はまだサブゲートウェイとしては動作していない。
(3)図9Aの手順(3)では、ノードN5がノードN6から受信したHelloフレームを処理する。ノードN5で行われる処理は、手順(2)で述べた処理と同様である。ノードN5での処理により、ノードN5が保持するマスタ側クラスタテーブル53は、図10(b)に示すようになる。
(4)ノードN8は、ノードN6からHelloフレームを受信する。受信部11、フレーム処理部13、抽出処理部22の処理は手順(2a)でノードN3の場合を例として説明したとおりである。処理種別判定部31は、ノードN8が参加しているクラスタのクラスタIDがC7であることと、受信したHelloフレームに含まれているクラスタIDもC7であることから、ノードN8が境界ノードではないと判定する。そこで、ノードN8の処理種別判定部31は、抽出処理部22から入力された情報を破棄する。一方、同じクラスタ内のノード装置10からHelloフレームを受信したことから、経路情報処理部26は、Helloフレームに含まれている経路情報を取得し、ルーティングテーブル52を更新する。ノードN7もノードN6からのHelloフレームを受信すると、ノードN8と同様に処理する。
(5)ノードN3のHelloフレーム生成部14は、Helloフレームを生成する時刻になると、Helloフレームを生成する。Helloフレーム生成部14は、クラスタ管理部21からクラスタID(C1)を取得する。さらに、図10(a)に示すマスタ側クラスタテーブル53から生成したマスタ側クラスタ情報をHelloフレームに含める。マスタ側クラスタ情報に含まれる要素が図6(a)に示す通りである場合、生成されたHelloフレームには、以下の情報要素が含まれる。
タイプ :Helloフレーム
GS :ノードN3
LS :ノードN3
クラスタ情報中のクラスタID :C1
クラスタ情報中のサブゲートウェイ:ノードN3
隣接クラスタ数 :1
マスタ側クラスタ情報
隣接クラスタID :C7
スレーブ側サブゲートウェイのノードID:N6
リーダーノードのノードID :N3
リーダーノードのシーケンス番号 :1
サブゲートウェイのノードID :N3
サブゲートウェイのシーケンス番号 :1
サブゲートウェイの隣接クラスタ数 :1
サブゲートウェイ候補 :なし
サブゲートウェイ候補の隣接クラスタ数 :0
Helloフレーム生成部14は、生成したHelloフレームを送信部12に出力する。ノードN3の送信部12は、隣接するノード装置10にHelloフレームを送信する。
(6)ノードN4は、ノードN3からHelloフレームを受信する。この時点では、ノードN4はクラスタC7に含まれているノード装置10からHelloフレームを受信していなので、ノードN4は、ノードN4が境界ノードであると認識していない。さらに、ノードN4の処理種別判定部31は、ノードN4がクラスタC1に参加していることと、受信したHelloフレームに含まれているクラスタIDもC1であることから、ノードN4が境界ノードではないと判定する。従って、ノードN4では、手順(4)のノードN7、N8と同様に、境界ノードとしての処理が行われない。なお、ノードN3から受信したHelloフレームのクラスタ情報には、ノードN3がサブゲートウェイであることが記録されている。そこで、ノードN4のクラスタ管理部21は、ノードN3がクラスタC1中のサブゲートウェイであることを認識する。
(7)ノードN2もノードN3からHelloフレームを受信する。ノードN2の処理種別判定部31はノードN2が境界ノードではないと判定するので、ノードN2は、境界ノードとしての処理を行わない。ノードN2のクラスタ管理部21も、ノードN4と同様に、Helloフレーム中のクラスタ情報を読み込むことにより、ノードN3がクラスタC1中のサブゲートウェイであることを認識する。
(8)ノードN5はノードN3からHelloフレームを受信する。ノードN5の処理種別判定部31は、手順(3)において、ノードN5のことをクラスタC1とC7の間のサブゲートウェイの設定の際にマスタ側クラスタ中の境界ノードとして動作すると判定している。そこで、処理種別判定部31は、ノードN3から受信したHelloフレームに含まれているマスタ側クラスタ情報を、リーダーノード特定部41に出力する。
ノードN5のリーダーノード特定部41は、マスタ側クラスタ情報に含まれているリーダーノードのノードIDと、ノードN5が保持しているマスタ側クラスタテーブル53のリーダーノードの情報を比較する。Helloフレームで通知されてきたリーダーノードはノードN3であり、マスタ側クラスタテーブル53に記録されているリーダーノードはノードN5である。そこで、リーダーノード特定部41は、ノードN5よりもノードN3のほうがリーダーノードとしての条件がよいと判定し、リーダーノードの設定を、図10(c)に示すように変更する。
ノードN5がリーダーノードではなくなったので、マスタ側テーブル更新部33は、ノードN3から通知されたマスタ側クラスタ情報に従って、マスタ側クラスタテーブル53を変更する。このため、図10(c)に示すように、マスタ側クラスタのサブゲートウェイは、リーダーノードであるノードN3の決定に従って、ノードN3に変更される。さらに、マスタ側テーブル更新部33は、スレーブ側クラスタのサブゲートウェイも、リーダーノードの決定に従って更新する。ここでは、ノードN3からの通知を受ける前にノードN5はノードN6をスレーブ側のサブゲートウェイとすることを決定していたので、スレーブ側クラスタのサブゲートウェイの設定は変更されない。
さらに、ノードN5のクラスタ管理部21は、クラスタ情報に基づいて、ノードN3がクラスタC1中のサブゲートウェイであることを認識する。また、クラスタ管理部21は、ノードN5がサブゲートウェイではなくなったという情報もマスタ側テーブル更新部33から取得する。
(9)ノードN6はノードN3からHelloフレームを受信する。ノードN6の処理種別判定部31は、ノードN6がクラスタC7に参加していて、受信したHelloフレームに含まれているクラスタIDがC1であることから、ノードN6がスレーブ側クラスタ中の境界ノードであると判定する。そこで、スレーブ側テーブル更新部32は、マスタ側クラスタ情報を用いて、クラスタC1がマスタ側クラスタであるエントリを、スレーブ側クラスタテーブル54に生成する。スレーブ側テーブル更新部32は、マスタ側クラスタ情報に含まれているサブゲートウェイのノードIDが自ノードのノードIDと一致するので、サブゲートウェイとして動作することを要求されていると判定する。スレーブ側テーブル更新部32の処理により、図11(a)に示すスレーブ側クラスタテーブル54が生成される。ノードN6は、クラスタC7のサブゲートウェイとしての動作を開始する。
(10)ノードN8もノードN3からHelloフレームを受信する。ノードN8で行われる処理は、ノードN6の処理として手順(9)で説明した処理と同様である。ただし、ノードN8のスレーブ側テーブル更新部32は、マスタ側クラスタ情報に含まれているサブゲートウェイのノードIDがN6であるので、ノードN8はサブゲートウェイとして動作することを要求されていないと判定する。そこで、ノードN8中のスレーブ側クラスタテーブル54は、図11(b)に示すようになる。
(11)ノードN8のHelloフレーム生成部14は、Helloフレームを生成する時刻になると、Helloフレームを生成する。ノードN8はスレーブ側クラスタ内の境界ノードであるので、以下の情報要素を含むHelloフレームが生成される。
タイプ :Helloフレーム
GS :ノードN8
LS :ノードN8
クラスタ情報中のクラスタID:C7
マスタ側クラスタ情報 :なし
隣接クラスタ数 :1
生成されたHelloフレームは、ノードN8の隣接ノードに送信される。
(12)ノードN6はノードN8からHelloフレームを受信する。ノードN6はスレーブ側クラスタ内の境界ノードであるが、同じクラスタ内のノード装置10からHelloフレームを受信したため、手順(4)と同様の処理を行う。
(13)ノードN5は、ノードN8からHelloフレームを受信する。ノードN5はマスタ側クラスタ内の境界ノードであるので、マスタ側テーブル更新部33は、隣接クラスタ数を、マスタ側クラスタテーブル53のスレーブ側のサブゲートウェイ候補の隣接クラスタ数と比較する。この時点では、図10(c)に示すように、スレーブ側クラスタのサブゲートウェイはノードN6であり、ノードN6の隣接クラスタ数は0となっている。そこで、ノードN5は、ノードN8の方がノードN6よりもサブゲートウェイとしての条件が良好であると判定し、マスタ側クラスタテーブル53を図11(c)に示すように変更する。
(14)ノードN4も、ノードN8からHelloフレームを受信する。ノードN4はノードN8からのHelloフレームを受信するまでは、クラスタC7とクラスタC1の境界ノードであると認識していない。そこで、ノードN4で行われる処理は、手順(2)で述べた処理と同様である。ノードN4での処理により、ノードN4が保持するマスタ側クラスタテーブル53は、図12(a)に示すようになる。
(15)ノードN3もノードN8からHelloフレームを受信する。ノードN3はマスタ側クラスタ中のサブゲートウェイであるので、中継先決定部43は、隣接クラスタ数を、マスタ側クラスタテーブル53のスレーブ側のサブゲートウェイ候補の隣接クラスタ数と比較する。この時点では、図10(a)に示すように、スレーブ側クラスタのサブゲートウェイはノードN6であり、ノードN3のマスタ側クラスタテーブル53では、ノードN6の隣接クラスタ数は0となっている。そこで、ノードN3は、ノードN8の方がノードN6よりもサブゲートウェイとしての条件が良好であると判定し、サブゲートウェイをノードN6からノードN8に変更する。さらに、スレーブ側のサブゲートウェイ候補も、ノードN8に変更する。このため、ノードN3のマスタ側クラスタテーブル53は図12(b)に示すようになる。
(16)次に、ノードN5がHelloフレームを生成したとする。Helloフレームの生成は、手順(5)で説明した処理と同様に行われる。Helloフレームを生成するときのノードN5のマスタ側クラスタテーブル53は、図11(c)に示すとおりである。このため、生成されたHelloフレームには、以下の情報要素が含まれる。
タイプ :Helloフレーム
GS :ノードN5
LS :ノードN5
クラスタ情報中のクラスタID :C1
クラスタ情報中のサブゲートウェイ:ノードN3
隣接クラスタ数 :1
マスタ側クラスタ情報
隣接クラスタID :C7
スレーブ側サブゲートウェイのノードID:N6
リーダーノードのノードID :N3
リーダーノードのシーケンス番号 :1
サブゲートウェイのノードID :N3
サブゲートウェイのシーケンス番号 :1
サブゲートウェイの隣接クラスタ数 :1
サブゲートウェイ候補 :なし
サブゲートウェイ候補の隣接クラスタ数 :0
なお、手順(15)においてノードN3がスレーブ側クラスタのサブゲートウェイをノードN6からノードN8に変更することを決定しているが、ノードN3はサブゲートウェイの変更を決定した後にHelloフレームを送信していない。このため、ノードN3以外のノード装置10は、スレーブ側クラスタでサブゲートウェイが変更されることを認識していない。このため、ノードN5は、スレーブ側サブゲートウェイのノードIDをN6に設定したHelloフレームを生成する。Helloフレームは、ノードN5に隣接するノード装置10に送信される。
(17)ノードN3はノードN5からHelloフレームを受信する。ノードN3のサブゲートウェイ選択部42は、ノードN5から受信したHelloフレームにサブゲートウェイ候補が含まれていないので、マスタ側のサブゲートウェイは変更されないと判定する。このため、マスタ側クラスタテーブル53は変更されない。
(18)ノードN6のスレーブ側テーブル更新部32は、ノードN5からHelloフレームを受信すると、スレーブ側クラスタテーブル54を用いて、Helloフレームの送信元がマスタ側クラスタのサブゲートウェイかを判定する。この時点でのノードN6のスレーブ側クラスタテーブル54は、図11(a)に示すとおりである。そこで、スレーブ側テーブル更新部32は、ノードN5はマスタ側クラスタのサブゲートウェイではないと判定する。すると、スレーブ側テーブル更新部32は、処理を終了する。
(19)ノードN8のスレーブ側テーブル更新部32は、ノードN5からHelloフレームを受信すると、Helloフレームの送信元はマスタ側クラスタのサブゲートウェイではないと判定する。ノードN8はサブゲートウェイとして動作していないので処理を終了する。
(20)次に、ノードN4がHelloフレームを生成したとする。Helloフレームの生成は、手順(5)で説明した処理と同様に行われる。このときノードN4は、ノードN4をリーダーノードであると認識しており、図12(a)に示すマスタ側クラスタテーブル53を保持しているので、以下の情報要素を含むHelloフレームを生成する。
タイプ :Helloフレーム
GS :ノードN4
LS :ノードN4
クラスタ情報中のクラスタID :C1
クラスタ情報中のサブゲートウェイ:ノードN4
隣接クラスタ数 :1
マスタ側クラスタ情報
隣接クラスタID :C7
スレーブ側サブゲートウェイのノードID:N8
リーダーノードのノードID :N4
リーダーノードのシーケンス番号 :1
サブゲートウェイのノードID :N4
サブゲートウェイのシーケンス番号 :1
サブゲートウェイの隣接クラスタ数 :1
サブゲートウェイ候補 :なし
サブゲートウェイ候補の隣接クラスタ数 :0
Helloフレームは、ノードN4に隣接するノード装置10に送信される。
(21)ノードN3はノードN4からHelloフレームを受信する。ノードN3での処理は手順(17)と同様であり、マスタ側クラスタテーブル53は変更されない。
(22)ノードN8はノードN4からHelloフレームを受信する。ノードN8では手順(9)と同様に処理が行われる。このため、ノードN8は、図12(c)に示すスレーブ側クラスタテーブル54を生成する。このため、手順(22)の時点では、マスタ側クラスタ(C1)では、ノードN3とノードN4の2つがマスタ側サブゲートウェイとなっており、スレーブ側クラスタ(C7)では、ノードN6とノードN8の2つがスレーブ側サブゲートウェイとなる。
(23)次に、ノードN6が再度、Helloフレームを生成する。このとき生成されるHelloフレームには、以下の情報が含まれる。
タイプ :Helloフレーム
GS :ノードN6
LS :ノードN6
クラスタ情報中のクラスタID :C7
クラスタ情報中のサブゲートウェイ:ノードN6
マスタ側クラスタ情報 :なし
隣接クラスタ数 :1
Helloフレームは、ノードN6に隣接するノード装置10に送信される。
(24)ノードN3は、ノードN6からHelloフレームを受信すると、手順(15)と同様に処理する。この時点では、図12(b)に示すように、スレーブ側クラスタのサブゲートウェイはノードN8であり、ノードN8の隣接クラスタ数は1となっている。一方、Helloフレームにより、ノードN6も隣接クラスタ数が1であることが通知されている。隣接クラスタ数が同じであるので、中継先決定部43は、ノードID中の番号が比較的小さいノードであるN6をスレーブ側のサブゲートウェイに設定する。さらに、中継先決定部43は、スレーブ側のサブゲートウェイ候補もノードN6に変更するので、ノードN3のマスタ側クラスタテーブル53は図13(a)に示すようになる。
(25)ノードN5は、ノードN6からHelloフレームを受信する。ノードN5はマスタ側クラスタ内の境界ノードであるので、手順(13)と同様の処理が行われる。このため、ノードN5は、ノードN6の方がノードN8よりもサブゲートウェイとしての条件が良好であると判定し、マスタ側クラスタテーブル53を図13(b)に示すように変更する。
(26)ノードN7、N8は、ノードN6からHelloフレームを受信すると手順(4)に述べた処理を行う。さらに、ノードN7とN8のいずれでも、クラスタ管理部21がクラスタ情報を処理することにより、クラスタC7中でノードN6がサブゲートウェイとして動作していることを認識する。このため、ノードN7は、クラスタC7中のサブゲートウェイとしてノードN6を認識し、ノードN8は、クラスタC7中のサブゲートウェイはノードN6とN8であると認識している。
(27)ノードN3は、再度、Helloフレームを隣接ノードに送信する。このとき送信されるHelloフレームは、シーケンス番号以外は手順(5)と同じ情報要素を含む。
(28)ノードN4は、ノードN3からHelloフレームを受信すると、手順(8)のノードN5と同様の処理を行う。なお、このとき、ノードN4のマスタ側テーブル更新部33は、スレーブ側のサブゲートウェイの情報も更新する。このため、ノードN4のマスタ側クラスタテーブル53は、図13(c)に示すように更新される。このため、ノードN4のクラスタ管理部21は、クラスタC1中のサブゲートウェイはノードN3であると認識する。
(29)ノードN5は、ノードN3からHelloフレームを受信すると手順(8)に述べた処理を行う。このとき、ノードN5のマスタ側クラスタテーブル53は、シーケンス番号以外は変更されない。
(30)ノードN6のスレーブ側テーブル更新部32は、ノードN3からHelloフレームを受信すると、スレーブ側クラスタテーブル54を用いて、Helloフレームの送信元がマスタ側クラスタのサブゲートウェイであると判定する。スレーブ側テーブル更新部32は、スレーブ側クラスタのサブゲートウェイの設定が変更されていないと判定し、処理を終了する。
(31)ノードN8のスレーブ側テーブル更新部32は、ノードN3からHelloフレームを受信すると、Helloフレームの送信元がスレーブ側クラスタテーブル54にマスタ側のサブゲートウェイとして登録されているかを判定する。この時点では、ノードN8が保持するスレーブ側クラスタテーブル54は、図12(c)に示す情報を保持しており、マスタ側サブゲートウェイはノードN4になっている。このため、スレーブ側テーブル更新部32は、ノードN3から受信したHelloフレームに基づいてスレーブ側クラスタテーブル54を変更しない。
(32)ノードN8は再度、Helloフレームを送信する。このとき生成されるHelloフレームは、以下の情報を含む。
タイプ :Helloフレーム
GS :ノードN8
LS :ノードN8
クラスタ情報中のクラスタID :C7
クラスタ情報中のサブゲートウェイ:ノードN8
マスタ側クラスタ情報 :なし
隣接クラスタ数 :1
ノードN3〜N5はいずれもノードN8からのHelloフレームを処理するが、いずれのノード装置10でもマスタ側クラスタテーブル53の情報は変化しない。
(33)ノードN5は再度、Helloフレームを送信する。ノードN3はノードN5からのHelloフレームを処理するが、マスタ側クラスタテーブル53の情報は変化しない。ノードN6、N8もノードN5からのHelloフレームを処理するが、スレーブ側クラスタテーブル54の情報は変化しない。
(34)ノードN4は再度、Helloフレームを送信する。ノードN3はノードN4からのHelloフレームを処理するが、マスタ側クラスタテーブル53の情報は変化しない。
ノードN8は、ノードN4からのHelloフレームを受信すると、Helloフレームの送信元がスレーブ側クラスタテーブル54にマスタ側のサブゲートウェイとして登録されているかを判定する。この時点では、ノードN8が保持するスレーブ側クラスタテーブル54は、図12(c)に示す情報を保持しており、マスタ側サブゲートウェイはノードN4になっている。このため、スレーブ側テーブル更新部32は、マスタ側クラスタ情報からスレーブ側クラスタのサブゲートウェイのノードIDを取得する。取得したノードIDはノードN6のIDであるので、スレーブ側テーブル更新部32は、スレーブ側クラスタのサブゲートウェイの設定が変更されたと判定し、サブゲートウェイとしての処理を終了する。さらに、スレーブ側テーブル更新部32は、スレーブ側クラスタテーブル54を図14に示すように変更する。このため、ノードN8のクラスタ管理部21は、ノードN6がクラスタC7中のサブゲートウェイであると認識する。
図8〜図14を参照しながら説明したようにサブゲートウェイが決定されると、サブゲートウェイとして動作するノード装置10の識別子は、Helloフレーム中のクラスタ情報に含められる。境界ノードではないノード装置10は、Helloフレーム中のクラスタ情報を用いて、自ノードと同じクラスタ中でサブゲートウェイとして動作するノード装置10を特定することができる。例えば、図9(b)の手順(28)の処理が行われた後、ノードN3、N4、N5は、いずれも、ノードN3がサブゲートウェイとして動作していることをクラスタ情報に含めたHelloフレームを送信する。このためノードN2は、クラスタC1ではノードN3がサブゲートウェイとして動作していると認識する。さらに、ノードN2も、ノードN3がサブゲートウェイであるということをクラスタ情報に含めたHelloフレームをブロードキャストする。すると、ノードN1は、ノードN2からHelloフレームを受信することにより、ノードN3を介して他のクラスタ中のノード装置10と通信できると認識する。
その後、例えば、ノードN1がノードN7にフレームを送信しようとする場合、ノードN7はノードN1と異なるクラスタに含まれているので、ノードN1は、サブゲートウェイに向けてフレームを転送することを決定する。ノードN1には、ノードN3がサブゲートウェイとして動作することが既に通知されているので、ノードN1は、ノードN7宛てのフレームをノードN3に向けて送信する。つまり、第1の実施形態によると、ノードN1は、クラスタ間の通信の中継を行うノード装置10を境界ノードの中から選択しなくても良くなる。このため、ノードN1がノードN7宛てのフレームを生成してから、フレームの転送先を特定するための処理が簡略化できる。このため、ノードN1でノードN7宛てのフレームの経路の決定にかかる時間を短縮化できる。ノードN1からノードN7宛てのフレームを受信したノードN2も、ノードN1と同様に、ノードN7がクラスタC1に含まれていないことを特定すると、ノードN7宛てのフレームをノードN3に送信する。従って、ノードN2についても、フレームの転送先をクラスタC1中の境界ノードの中から選択する場合に比べて、第1の実施形態による方法の方が、処理負担が軽減されているといえる。
〔サブゲートウェイの変更方法〕
図15は、サブゲートウェイの変更方法の例を説明する図である。図15を参照しながら、新たなクラスタを検出したときに行われるサブゲートウェイの変更方法の例を説明する。
図15(a)は、図8(a)に示すアドホックネットワークにノードN9が加わり、ノードN9がクラスタC9に含まれている場合を例としてサブゲートウェイの変更方法の例を説明する。図15(a)に示すようにノードN9がアドホックネットワークに参加しても、ノードN9がHelloフレームを送信する前は、サブゲートウェイの設定は図8を参照しながら説明した場合から変化しない。このときのノードN3〜N5が保持するマスタ側クラスタテーブル53の例を、図16に示す。図16(a)はノードN3、図16(b)はノードN5、図16(c)はノードN4が保持するマスタ側クラスタテーブル53の例である。
次に、ノードN9が以下の情報要素を含むHelloフレームを送信したとする。
タイプ :Helloフレーム
GS :ノードN9
LS :ノードN9
クラスタ情報中のクラスタID:C9
マスタ側クラスタ情報 :なし
隣接クラスタ数 :0
図15(a)の例では、ノードN9の隣接ノードであるノードN4がHelloフレームを受信する。ノードN4は、ノードN9から受信したHelloフレームにより、ノードN9とクラスタC9の存在を検出する。そこで、ノードN4のマスタ側テーブル更新部33は、マスタ側クラスタテーブル53にクラスタC9についてのエントリを追加する。さらに、ノードN4の処理種別判定部31は、クラスタC1がクラスタC9に対するマスタ側クラスタであると判定し、マスタ側クラスタ情報をリーダーノード特定部41に出力する。リーダーノード特定部41は、ノードN4を、クラスタC1とC9の間のサブゲートウェイの設定の際のリーダーノードに選択する。さらに、サブゲートウェイ選択部42は、ノードN4を、クラスタC1とC9の間のマスタ側サブゲートウェイに決定する。中継先決定部43は、ノードN9をスレーブ側のサブゲートウェイに決定する。
また、ノードN4は、ノードN4の隣接クラスタの数を1から2に変更する。サブゲートウェイ選択部42は、ノードN4の隣接クラスタ数が2に変更されたことにより、現在クラスタC1でクラスタC9以外のクラスタとの間のサブゲートウェイに設定されているノード装置10よりも自ノードの条件が良くなったかを判定する。クラスタC1とクラスタC4の間の通信に用いられるサブゲートウェイは、ノードN3でありノードN3の隣接クラスタの数は1である。このため、ノードN4のサブゲートウェイ選択部42は、ノードN4の方がノードN3よりも、サブゲートウェイとしての条件が良いと判定する。ノードN4のサブゲートウェイ選択部42は、ノードN4がクラスタC1とクラスタC7の間の通信に用いられるサブゲートウェイを決定する際のリーダーノードではないので、ノードN4を、クラスタC7との間のサブゲートウェイ候補とする。これらの処理により、Helloフレームを受信した後のノードN4のマスタ側クラスタテーブル53は、図17(a)に示すように更新される。
次に、ノードN4がHelloフレームを生成したとする。ノードN4は、ノードN4が保持するマスタ側クラスタテーブル53(図17(a)参照)のうち、スレーブ側のサブゲートウェイ候補以外の情報を、Helloフレームに含める。従って、マスタ側クラスタ情報には、クラスタC7の情報と、クラスタC9の情報がHelloフレームに含められる。ノードN4で生成されたHelloフレームは、ノードN4の隣接ノード装置に送信される。
ノードN4から送信されたHelloフレームをノードN9が受信すると、図9Aを参照して説明した手順(9)のノードN6と同様の処理を行う。このため、ノードN9のスレーブ側クラスタテーブル54は、図17(b)に示すように更新される。
ノードN4から送信されたHelloフレームをノードN3も受信する。この時点ではクラスタC1とC7の間の通信でのマスタ側サブゲートウェイはノードN3である。このため、ノードN3のサブゲートウェイ選択部42は、Helloフレーム中のサブゲートウェイ候補の情報と、ノードN3の情報を比較する。ノードN3の隣接クラスタ数が1であり、ノードN4の隣接クラスタ数は2である。このため、ノードN3のサブゲートウェイ選択部42は、ノードN4の方がノードN3よりも、サブゲートウェイとしての条件が良いと判定する。ノードN3のサブゲートウェイ選択部42は、ノードN3がクラスタC1とクラスタC7の間の通信に用いられるサブゲートウェイを決定する際のリーダーノードであるので、ノードN4を、クラスタC7との間のサブゲートウェイとする。また、サブゲートウェイ候補の情報は記録しない。このため、ノードN3のマスタ側クラスタテーブル53は、図17(c)に示す通りになる。
さらに、ノードN3がHelloフレームを生成したとする。ノードN3は、ノードN3が保持するマスタ側クラスタテーブル53(図17(c)参照)のうち、スレーブ側のサブゲートウェイ候補以外の情報を、Helloフレームに含める。ノードN3で生成されたHelloフレームは、ノードN3の隣接ノード装置に送信される。
ノードN4は、ノードN3からHelloフレームを受信する。ノードN4のサブゲートウェイ選択部42は、クラスタC1とC7の通信に関するマスタ側クラスタ情報において、ノードN4がマスタ側サブゲートウェイに設定されていることを検出する。すると、ノードN4は、マスタ側サブゲートウェイとして動作を開始する。このため、図15(b)に示すようにサブゲートウェイが設定される。さらに、ノードN4のマスタ側テーブル更新部33は、マスタ側クラスタテーブル53を、Helloフレームを用いて、図18(a)に示すように変更する。
ノードN5は、ノードN3からHelloフレームを受信する。ノードN5のサブゲートウェイ選択部42は、ノードN4がマスタ側サブゲートウェイに設定されていることを検出すると、マスタ側クラスタテーブル53を、Helloフレームを用いて、図18(b)に示すように変更する。
その後、ノードN4が再度、Helloフレームを生成したとする。ノードN4は、ノードN4が保持するマスタ側クラスタテーブル53(図18(a)参照)のうち、スレーブ側のサブゲートウェイ候補以外の情報を、Helloフレームに含める。ノードN4で生成されたHelloフレームは、ノードN4の隣接ノード装置に送信される。
ノードN4から送信されたHelloフレームをノードN8が受信すると、ノードN8のスレーブ側テーブル更新部32は、クラスタC1とクラスタC7の通信において、ノードN8がスレーブ側のサブゲートウェイに設定されていることを検出する。そこで、ノードN8は、スレーブ側サブゲートウェイとして動作を開始する。このため、図15(c)に示すようにサブゲートウェイが設定される。
ノードN4から送信されたHelloフレームをノードN3が受信すると、ノードN3のマスタ側テーブル更新部33は、クラスタC7についてのエントリの処理を行う。マスタ側テーブル更新部33は、クラスタC7において、ノードN8がスレーブ側のサブゲートウェイに決定されたことを検出する。そこで、ノードN3は、スレーブ側サブゲートウェイの情報を更新し、マスタ側クラスタテーブル53を図19(a)に示すように更新する。
ノードN4から送信されたHelloフレームをノードN9が受信すると、ノードN9のスレーブ側テーブル更新部32は、ノードN9がスレーブ側のサブゲートウェイに設定されていることを検出する。そこで、ノードN9は、スレーブ側サブゲートウェイとして動作を開始する。このため、図15(d)に示すようにサブゲートウェイが設定される。
その後、ノードN3がHelloフレームを生成すると、図19(a)に含まれている情報のうちのサブゲートウェイ候補以外の情報が、ノードN3の隣接ノードに通知される。そこで、ノードN5は、クラスタC1とクラスタC7の通信の際にスレーブ側サブゲートウェイとして動作するノードがノードN8であることを認識する。このため、ノードN5のマスタ側クラスタテーブル53は、図19(b)に示すように変更される。
図20は、ノード装置10で行われる処理の例を示すフローチャートである。なお、ステップS3とS4の順序は、実装に応じて変更することができる。ノード装置10は、クラスタに所属しているかを判定する(ステップS1)。いずれかのクラスタに所属しているノード装置10は、クラスタに所属しているノード装置10からHelloフレームを受信したかを判定する(ステップS1でYes、ステップS2)。クラスタに所属しているノード装置10からHelloフレームを受信した場合、ノード装置10は、Helloフレームで通知されたマスタ側クラスタ情報を処理する(ステップS2でYes、ステップS3)。さらに、ノード装置10は、マスタ側クラスタ中のノード装置10である場合、Helloフレームの送信元のノード装置10が参加しているクラスタの情報を更新する(ステップS4)。
図21Aと図21Bは、受信したマスタ側クラスタ情報の処理の例を説明するフローチャートである。図21Aと図21Bは、Helloフレームを受信したノード装置10が行う処理の例である。処理種別判定部31は、受信したHelloフレームにマスタ側クラスタ情報があるかを判定する(ステップS11)。Helloフレームにマスタ側クラスタ情報が含まれていない場合、処理種別判定部31は、マスタ側クラスタに含まれている境界ノードからHelloフレームを受信しなかったと判定し、マスタ側クラスタ情報の処理を終了する(ステップS11でNo)。一方、Helloフレームにマスタ側クラスタ情報が含まれている場合、処理種別判定部31は、変数nを1に設定する(ステップS12)。処理種別判定部31は、マスタ側クラスタ情報の中から、n番目に含まれているエントリの取得を試みる。以下の説明で、マスタ側クラスタ情報の中に含まれているエントリのことを「MCIエントリ」と記載する。処理種別判定部31は、n番目のMCIエントリを取得できない場合、マスタ側クラスタ情報の処理を終了する(ステップS13でNo)。
処理種別判定部31は、n番目のMCIエントリを取得した場合、自ノードがHelloフレームの送信元と同じクラスタに所属しているかを判定する(ステップS13でYes、ステップS14)。Helloフレームの送信元と同じクラスタに所属しているノード装置10のリーダーノード特定部41は、処理対象のMCIエントリと同じクラスタIDのエントリを、マスタ側クラスタテーブル53から取得しようとする(ステップS14でYes、S15)。リーダーノード特定部41は、エントリの取得に成功すると、処理対象のMCIエントリに含まれているリーダーノードのノードIDを、マスタ側クラスタテーブル53に設定されているリーダーノードのノードIDと比較する(ステップS16でYes、ステップS17)。処理対象のMCIエントリに含まれているリーダーノードのノードID中の数字の方が小さい場合、リーダーノード特定部41は、より良いリーダーノードが通知されたと判定し、リーダーノードを変更する(ステップS17でYes、ステップS18)。その後、サブゲートウェイ選択部42により、マスタ側サブゲートウェイ(SGW)の更新処理が行われる(ステップS19)。一方、より良いリーダーノードが通知されていないと判定した場合、リーダーノードが変更されずに、マスタ側サブゲートウェイの更新処理が行われる(ステップS17でNo、ステップS19)。その後、処理種別判定部31は、nを1つインクリメントしてステップS13以降の処理を行う(ステップS20)。
図21Bを参照しながら、ステップS14でNoと判定された場合に行われる処理を説明する。Helloフレームの送信元と同じクラスタに所属していないノード装置10では、スレーブ側テーブル更新部32は、処理対象のMCIエントリ中のスレーブ側クラスタが自ノードのクラスタであるかを判定する(ステップS31)。処理対象のMCIエントリ中のスレーブ側クラスタが自ノードのクラスタでない場合、処理種別判定部31は、隣接クラスタと他のクラスタとの間の通信に用いるサブゲートウェイを決定するための情報を含むMCIエントリを取得したと判定する。そこで、処理種別判定部31は、取得したMCIエントリは処理対象ではないと判定し、廃棄する(ステップS31でNo、ステップS32)。
スレーブ側クラスタが自ノードのクラスタである場合、スレーブ側テーブル更新部32は、処理対象のMCIエントリと同じクラスタIDに対応付けられたエントリをスレーブ側クラスタテーブル54から取得する(ステップS31でYes、ステップS33)。次に、スレーブ側テーブル更新部32は、処理対象のMCIエントリにおいて、自ノードがスレーブ側サブゲートウェイに指定されているかを判定する(ステップS34)。自ノードがスレーブ側サブゲートウェイに指定されていない場合、スレーブ側テーブル更新部32は、スレーブ側クラスタテーブル54中に、Helloフレームの送信元がマスタ側サブゲートウェイとして登録されているかを判定する(ステップS34でNo)。スレーブ側テーブル更新部32は、Helloフレームの送信元がサブゲートウェイであるエントリがあれば、そのエントリを、スレーブ側クラスタテーブル54から削除する(ステップS36)。一方、処理対象のMCIエントリ中のスレーブ側サブゲートウェイが自ノードである場合、スレーブ側テーブル更新部32は、Helloフレームの送信元がマスタ側クラスタのサブゲートウェイであるかを判定する(ステップS34でYes、ステップS35)。Helloフレームの送信元がマスタ側クラスタのサブゲートウェイである場合、スレーブ側テーブル更新部32は、自ノードをスレーブ側クラスタのサブゲートウェイに設定する(ステップS35でYes、ステップS37)。一方、Helloフレームの送信元がマスタ側クラスタのサブゲートウェイではない場合、Helloフレームの送信元がマスタ側サブゲートウェイとして登録されているかを判定する(ステップS35でNo)。Helloフレームの送信元がマスタ側クラスタのサブゲートウェイである場合、ステップS36の処理が行われる。
図22は、Helloフレームの送信元が属するクラスタの情報の処理の例を説明するフローチャートである。処理種別判定部31は、スレーブ側クラスタ中のノード装置10からHelloフレームを受信したかを判定する(ステップS41)。スレーブ側クラスタ中のノード装置10からHelloフレームを受信した場合、マスタ側テーブル更新部33は、Helloフレームの送信元が属するクラスタに対するエントリをマスタ側クラスタテーブル53から取得することを試みる(ステップS42)。エントリの取得に成功すると、マスタ側テーブル更新部33は、Helloフレームの送信元の条件を、マスタ側クラスタテーブル53中のスレーブ側のサブゲートウェイ候補の条件と比較する(ステップS43でYes、ステップS44)。Helloフレームの送信元が、スレーブ側のサブゲートウェイ候補よりも条件が良い場合、マスタ側テーブル更新部33は、スレーブ側サブゲートウェイ候補を変更する(ステップS44でYes、ステップS45)。さらに、サブゲートウェイ選択部42は、自ノードがマスタ側クラスタのサブゲートウェイであるかを判定する(ステップS46)。自ノードがマスタ側クラスタのサブゲートウェイである場合、サブゲートウェイ選択部42は、スレーブ側サブゲートウェイを変更する(ステップS46でYes、ステップS47)。一方、自ノードがマスタ側クラスタのサブゲートウェイでない場合、サブゲートウェイ選択部42は処理を終了する(ステップS46でNo)。また、Helloフレームの送信元の条件が、スレーブ側のサブゲートウェイ候補の条件以下である場合、マスタ側テーブル更新部33は、処理を終了する(ステップS44でNo)。さらに、ステップS41でNoと判定された場合、処理種別判定部31は処理を終了する。
ステップS43でエントリの取得に失敗すると、マスタ側テーブル更新部33は、Helloフレームの送信元のノード装置10が属するクラスタに関するエントリをマスタ側クラスタテーブル53に生成する(ステップS48)。リーダーノード特定部41は、新たにエントリが生成されたクラスタについては、自ノードをリーダーノードに設定する。さらに、サブゲートウェイ選択部42は、新たにエントリが生成されたクラスタについて、自ノードをマスタ側のサブゲートウェイに設定する(ステップS49)。さらに、中継先決定部43は、Helloフレームの送信元を、スレーブ側クラスタのサブゲートウェイに設定する(ステップS50)。
図23は、マスタ側サブゲートウェイの更新処理の例を説明するフローチャートである。サブゲートウェイ選択部42は、処理対象のMCIエントリに、自ノードよりも条件が良いサブゲートウェイ候補の情報が含まれているかを判定する(ステップS61)。自ノードよりも条件が良いサブゲートウェイ候補の情報が含まれていない場合、サブゲートウェイ選択部42は、現在のマスタ側サブゲートウェイに設定されているノード装置10について、隣接クラスタ数とノードIDを取得する(ステップS62)。サブゲートウェイ選択部42は、現在のマスタ側サブゲートウェイに設定されているノード装置10と、自ノードの条件を比較し、自ノードの方が現在のマスタ側サブゲートウェイよりも良好な条件を備えているかを判定する(ステップS63)。自ノードの条件の方が良好である場合、サブゲートウェイ選択部42は、自ノードがリーダーノードであるかを判定する(ステップS64)。自ノードがリーダーノードである場合、サブゲートウェイ選択部42は、マスタ側サブゲートウェイを自ノードに変更するとともに、マスタ側クラスタテーブル53を適宜変更する(ステップS64でYes、ステップS65)。例えば、サブゲートウェイ選択部42は、マスタ側クラスタのサブゲートウェイの隣接クラスタの値やシーケンス番号を、自ノードの値に変更する。また、スレーブ側サブゲートウェイを、自ノードが保持しているマスタ側クラスタテーブル53に含まれているスレーブ側のサブゲートウェイ候補にする。一方、自ノードがリーダーノードでない場合、サブゲートウェイ選択部42は、自ノードをマスタ側サブゲートウェイ候補に設定する(ステップS66)。ステップS63において、自ノードが現在設定されているマスタ側サブゲートウェイよりも条件が悪いと判定すると、サブゲートウェイ選択部42は処理を終了する。
次に、ステップS61において処理対象のMCIエントリに、自ノードよりも条件が良いサブゲートウェイ候補の情報が含まれていると判定された場合の処理について説明する。この場合も、サブゲートウェイ選択部42は、現在のマスタ側サブゲートウェイに設定されているノード装置10について、隣接クラスタ数とノードIDを取得する(ステップS67)。サブゲートウェイ選択部42は、現在のマスタ側サブゲートウェイに設定されているノード装置10よりも、サブゲートウェイ候補の方が良好な条件を備えているかを判定する(ステップS68)。サブゲートウェイ候補の条件の方が良好である場合、サブゲートウェイ選択部42は、自ノードがリーダーノードであるかを判定する(ステップS68でYes、ステップS69)。自ノードがリーダーノードである場合、サブゲートウェイ選択部42は、マスタ側サブゲートウェイをサブゲートウェイ候補として通知されたノード装置に変更するとともに、マスタ側クラスタテーブル53を適宜変更する(ステップS69でYes、ステップS70)。例えば、サブゲートウェイ選択部42は、マスタ側クラスタのサブゲートウェイの隣接クラスタの値やシーケンス番号を、サブゲートウェイ候補の値に変更する。一方、自ノードがリーダーノードでない場合、サブゲートウェイ選択部42は、処理を終了する(ステップS69でNo)。ステップS68において、サブゲートウェイ候補の条件は現在設定されているマスタ側サブゲートウェイの条件以下であると判定すると、サブゲートウェイ選択部42は、サブゲートウェイ候補の情報を記憶しない(ステップS71)。
境界ノードは、図20〜図23を参照しながら説明したような処理を行うため、クラスタの増減やノード装置10の数の増設にも柔軟に対応してサブゲートウェイを決定することができる。
図15〜図23を参照しながら説明したように、クラスタの増設やノード装置10の増減により、サブゲートウェイが変更された場合も、サブゲートウェイとして動作するノード装置10の識別子は、Helloフレーム中のクラスタ情報に含められる。このため、境界ノード以外のノード装置10も、Helloフレームにより、サブゲートウェイが変更されたことと、変更後のサブゲートウェイを特定することができる。例えば、図15(d)の例では、クラスタC1中のいずれのノード装置10も、クラスタC7またはC9に含まれているノード装置10に宛てたフレームを、ノードN4に送信すれば良いことがHelloフレームから特定できる。このため、クラスタ中のノード装置は、他のクラスタ中のノード装置10に宛てたフレームの転送先を、フレームの転送のたびに境界ノードの中から選択しなくても良い。このため、各ノード装置10の転送処理における負担が軽減される。
ここで、フレームの中継先を指定する方法の例を説明する。例えば、ノードN1がデータフレームをノードN7に送信しようとしているとする。ノードN1のデータフレーム処理部15が生成するデータフレームの例を図24(a)に示す。データフレームには、送信されるデータ、タイプ情報、グローバル宛先アドレス、グローバル送信元アドレス、ローカル宛先アドレス、ローカル送信元アドレスが含まれる。ノードN1の転送処理部27は、クラスタC1に含まれていないノード装置10に宛てたフレームを転送する場合、フレームにサブゲートウェイ情報(SGW情報)を付加する。サブゲートウェイ情報を含むデータフレームを図24(b)に示す。ここでは、クラスタC1のサブゲートウェイはノードN4であることが予め通知されているため、サブゲートウェイ情報にノードN4のアドレスが設定されるものとする。サブゲートウェイ情報は、クラスタ内の通信においては、グローバル宛先と同様に扱われる。例えば、ノードN2は、ノードN1から受信したフレームのサブゲートウェイ情報を確認することにより、受信フレームをN4に転送することを決定する。このとき、ノードN2の転送処理部27は、データフレーム中のローカル宛先アドレスとローカル送信元アドレスを変更した上で、フレームをノードN4に転送する。ノードN4は、サブゲートウェイ情報に設定されているアドレスがノードN4に割り当てられているアドレスであることを特定すると、受信したフレームからサブゲートウェイ情報を除去する。さらに、ノードN4は、サブゲートウェイを除去した後のフレームを隣接クラスタのサブゲートウェイに転送する。なお、1つのクラスタに複数のサブゲートウェイがある場合、サブゲートウェイ情報に指定されるアドレスは、1つのクラスタ中の全てのサブゲートウェイを指定するマルチキャストアドレスであっても良い。1つのクラスタ中の全てのサブゲートウェイにフレームがマルチキャスト送信されたとしても、サブゲートウェイの数は、境界ノードの数よりも少ないので、輻輳が発生しにくい。
第1の実施形態にかかる方法は、サブゲートウェイがフレームの中継先のノード装置10への経路情報を保持する場合に適応でき、また、サブゲートウェイが自クラスタ以外の経路情報を保持していない場合にも適応できる。サブゲートウェイが中継先のクラスタ中の経路情報を保持する場合、サブゲートウェイとして動作するノード装置10の数が多い程、複数のノード装置10で他クラスタの経路情報を重複して記憶するケースが多くなる。例えば、図8(a)において、クラスタC1中のノードN3〜N5の全てがクラスタC1とクラスタC7の間の通信を中継する場合、ノードN3〜N5の全てがクラスタC1とクラスタC7の経路情報を保持することになってしまう。同様に、第1の実施形態にかかる方法を適応しないと、クラスタC7では、ノードN6とN8の両方が、クラスタC1とクラスタC7の経路情報を保持することになる。しかし、第1の実施形態を適応することにより、図8(a)に示すネットワークでは、ノードN3とN6がクラスタ間の通信を中継するために、クラスタC1とクラスタC7の経路情報を保持すればよい。従って、他クラスタの経路情報が複数のノード装置10に重複して記憶されないので、第1の実施形態では、ノード装置が保持するメモリが効率的に使用される。
さらに、第1の実施形態にかかる方法では、クラスタ間の通信を中継するノード装置10が、境界ノードの中から自律的に選択される。このため、第1の実施形態にかかる方法は、ノードの数が多い大規模なネットワークや、クラスタの設定の変更が頻繁に行われる場合にも使用できる。
<第2の実施形態>
第2の実施形態として、アドホックネットワークに参加しているノード装置10が隣接ノード装置10に障害が発生したかを判定し、障害を検出すると動的にサブゲートウェイを変更する場合について説明する。
第2の実施形態では、マスタ側クラスタ中の境界ノードは、リーダーノードからHelloフレームを受信する間隔をモニタすることにより、リーダーノードに障害が発生しているかを判定する。リーダーノードに障害が発生した場合、マスタ側クラスタ中の境界ノードは、リーダーノードを変更する。例えば、リーダーノードの障害を検出した境界ノードは、自ノードをリーダーノードに指定したHelloフレームを隣接ノードに送信することにより、リーダーノードの変更を行う。
リーダーノードは、マスタ側のサブゲートウェイからHelloフレームが送信される間隔をモニタすることにより、マスタ側のサブゲートウェイに障害が発生しているかを判定する。リーダーノードは、マスタ側のサブゲートウェイの障害を検出すると、新たにマスタ側のサブゲートウェイを設定する。例えば、リーダーノードは、自ノードをサブゲートウェイに設定したHelloフレームを送信することにより、マスタ側のサブゲートウェイを選択することができる。
マスタ側のサブゲートウェイは、スレーブ側のサブゲートウェイからHelloフレームを受信する間隔をモニタすることにより、スレーブ側のサブゲートウェイに障害が発生しているかを判定する。スレーブ側のサブゲートウェイに障害が発生すると、マスタ側のサブゲートウェイは、他の隣接ノードをスレーブ側のサブゲートウェイに設定することができれば、スレーブ側のサブゲートウェイを変更する。一方、他にスレーブ側のサブゲートウェイに指定できるノード装置がない場合、マスタ側サブゲートウェイは、境界ノードではなくなったと判定する。すると、マスタ側クラスタテーブル53から隣接しなくなったクラスタについてのエントリを削除する。その後、マスタ側サブゲートウェイに指定されているノード装置10は、境界ノードではなくなったことをHelloフレームでマスタ側クラスタ中の境界ノードに通知する。すると、リーダーノードは、新たにマスタ側のサブゲートウェイを設定しなおす。
さらに、スレーブ側クラスタ中のノード装置10も、マスタ側クラスタのサブゲートウェイからのHelloフレームを受信する頻度をモニタすることにより、マスタ側クラスタのサブゲートウェイの障害を検出することができる。スレーブ側クラスタのサブゲートウェイは、マスタ側クラスタのサブゲートウェイの障害を検出すると、障害を検出したノードをサブゲートウェイとしているエントリをスレーブ側クラスタテーブル54から削除する。
以上の処理を行うために、第2の実施形態では、ノード装置10はマスタ側クラスタテーブル53の代わりにマスタ側クラスタテーブル61を備え、スレーブ側クラスタテーブル54の代わりにスレーブ側クラスタテーブル62を備える。
図25は、第2の実施形態で用いられるマスタ側クラスタテーブル61の例を示す。マスタ側クラスタテーブル61は、マスタ側クラスタテーブル53に含まれている情報要素に加え、マスタ側サブゲートウェイ、スレーブ側サブゲートウェイ、リーダーノードについてのTime To Live(TTL)を含む。マスタ側テーブル更新部33は、Helloフレームに含まれているリーダーノードのシーケンス番号を、マスタ側クラスタテーブル61でのリーダーノードのシーケンス番号と比較する。比較した結果、Helloフレーム中のシーケンス番号の方が大きい場合、マスタ側テーブル更新部33は、リーダーノードが正常にHelloフレームを送信できたと判定し、リーダーノードのTTLをリセットする。TTLの初期値は任意の正の整数である。一方、Helloフレーム中のシーケンス番号がマスタ側クラスタテーブル61に記録されている値以下の場合、マスタ側テーブル更新部33は、すでに受信しているHelloフレームを再度受信したと判定してHelloフレームの処理を行わない。マスタ側テーブル更新部33は、リーダーノードについてのTTLの値を一定の時間ごとに1つデクリメントしていき、TTLの値が0になると、リーダーノードに障害が発生したと判定する。マスタ側テーブル更新部33は、リーダーノードが新たに設定されると、リーダーノードのTTLの値をリセットする。
マスタ側テーブル更新部33は、マスタ側サブゲートウェイについても、リーダーノードと同様の方法により、TTLの値を更新する。リーダーノードは、サブゲートウェイ選択部42が新たにマスタ側のサブゲートウェイを設定すると、TTLの値をリセットする。
マスタ側のサブゲートウェイのマスタ側テーブル更新部33は、スレーブ側サブゲートウェイからHelloフレームを受信すると、スレーブ側サブゲートウェイについてのTTLの値をリセットする。なお、マスタ側のサブゲートウェイとスレーブ側サブゲートウェイは、互いに隣接しているので、処理済のHelloフレームを再度受信する可能性は低い。このため、マスタ側のサブゲートウェイのマスタ側テーブル更新部33は、スレーブ側サブゲートウェイから受信するHelloフレームについては、シーケンス番号をモニタしなくても良い。マスタ側テーブル更新部33は、スレーブ側サブゲートウェイについてのTTLの値を一定の時間ごとに1つデクリメントしていき、TTLの値が0になると、スレーブ側サブゲートウェイに障害が発生したと判定する。
図26は、第2の実施形態で用いられるスレーブ側クラスタテーブル62の例を示す。スレーブ側クラスタテーブル62には、マスタ側クラスタのTTLと、マスタ側サブゲートウェイのTTLが含まれている。スレーブ側テーブル更新部32は、隣接するクラスタ中のノード装置10から受信したHelloフレームのクラスタ情報を抽出し、スレーブ側クラスタテーブル62中のエントリと比較する。Helloフレーム中のクラスタIDで識別されるクラスタのエントリについて、スレーブ側テーブル更新部32は、マスタ側クラスタについてのTTLをリセットする。スレーブ側テーブル更新部32は、マスタ側クラスタについてのTTLの値を一定の時間ごとに1つデクリメントしていき、TTLの値が0になると、マスタ側クラスタが消失したか、自ノードが隣接ノードではなくなったと判定する。スレーブ側テーブル更新部32は、TTLの値が0になったマスタ側クラスタについてのエントリをスレーブ側クラスタテーブル62から削除する。
スレーブ側クラスタ中のスレーブ側テーブル更新部32は、マスタ側クラスタのサブゲートウェイからHelloフレームを受信すると、マスタ側クラスタのサブゲートウェイについてのTTLの値をリセットする。スレーブ側テーブル更新部32は、マスタ側サブゲートウェイについてのTTLの値を一定の時間ごとに1つデクリメントしていき、TTLの値が0になると、マスタ側サブゲートウェイに障害が発生したと判定する。スレーブ側テーブル更新部32は、TTLの値が0になったマスタ側サブゲートウェイについてのエントリをスレーブ側クラスタテーブル62から削除する。
図27は、障害の発生によるサブゲートウェイの変更方法の例を示す。初期状態では、ノードN3がリーダーノードに設定され、マスタ側サブゲートウェイ、スレーブ側サブゲートウェイも図27(a)に示すように設定されているものとする。図27(a)の状態のときに、ノードN3〜N5が保持しているマスタ側クラスタテーブル61の例を図28に示す。図28(a)はノードN4、図28(b)はノードN5、図28(c)はノードN3のマスタ側クラスタテーブル61の例を示す。
その後、図27(b)に示すように、ノードN8に障害が発生したとする。ノードN8は、Helloフレームの送信を中止する。ノードN4は、ノードN8からHelloフレームを受信できなくなると、ノードN8についてのTTLの値を一定時間ごとに1つずつデクリメントする。ノードN4は、ノードN8についてのTTLの値が0になると、ノードN8に障害が発生したと判定する。ノードN4には、ノードN8以外にクラスタC7中の隣接ノードがない。このため、ノードN4は、クラスタC7に隣接しなくなったと判定し、マスタ側クラスタテーブル61からクラスタC7のエントリを削除する。この処理により、ノードN4のマスタ側クラスタテーブル61は、図29(a)に示すようになる。
ノードN4に備えられているマスタ側クラスタテーブル61からクラスタC7のエントリがなくなると、ノードN4は、生成するHelloフレームに、クラスタC7についてのMCIエントリを含めない。このため、ノードN3は、ノードN4からクラスタC7についてのMCIエントリを受信することができない。ノードN3のマスタ側テーブル更新部33は、クラスタC7のマスタ側サブゲートウェイであるノードN4からクラスタC7のMCIエントリが送られてこないため、マスタ側サブゲートウェイのTTLを一定時間ごとに1つずつデクリメントする。ノードN3は、マスタ側サブゲートウェイのTTLが0になると、ノードN4はクラスタC7に隣接していないと判定する。ノードN3はリーダーノードであるので、ノードN3のサブゲートウェイ選択部42は、ノードN3をクラスタC7との通信に用いられるマスタ側サブゲートウェイに設定する。さらに、ノードN3の中継先決定部43は、ノードN3がマスタ側サブゲートウェイに設定されたため、ノードN6をスレーブ側サブゲートウェイに設定する。これらの処理により、サブゲートウェイは、図27(c)に示すように変更される。さらに、ノードN3の備えるマスタ側クラスタテーブル61は、図29(b)に示すように更新される。
ノードN3は、サブゲートウェイを図27(c)に示すように変更した後、マスタ側サブゲートウェイがノードN3、スレーブ側サブゲートウェイがノードN6であることを通知するHelloフレームを隣接ノードに送信する。このため、ノードN3からHelloフレームを受信したノードN5では、マスタ側クラスタテーブルが図28(b)の状態から図29(c)に示すように変更される。
図30は、障害発生時にマスタ側クラスタ中の境界ノードが行う処理の例を説明するフローチャートである。ノード装置10は、TTL=0を含むエントリがあると判定すると、リーダーノードでTTL=0になっているかを判定する(ステップS81でYes、ステップS82)。リーダーノードでTTL=0になっている場合、リーダーノード特定部41は、自ノードをリーダーノードに設定し、リーダーノードのTTLの値をリセットする(ステップS82でYes、ステップS83)。リーダーノードでTTL=0になっていない場合、ノード装置10は、マスタ側サブゲートウェイについてのTTLが0になっているかを判定する(ステップS82でNo、ステップS84)。マスタ側サブゲートウェイについてのTTLが0になっている場合、サブゲートウェイ選択部42は、自ノードがリーダーノードであるかを判定する(ステップS84でYes、ステップS85)。自ノードがリーダーノードでない場合、サブゲートウェイ選択部42は処理を終了する(ステップS85でNo)。一方、自ノードがリーダーノードである場合、サブゲートウェイ選択部42は、マスタ側のサブゲートウェイを変更し、TTLの値をリセットする(ステップS85でYes、ステップS86)。
ステップS84において、マスタ側サブゲートウェイについてのTTLが0になっていない場合、中継先決定部43は、スレーブ側サブゲートウェイに障害が発生したと判定する(ステップS84でNo)。そこで、中継先決定部43は、自ノードがマスタ側サブゲートウェイであるかを判定する(ステップS87)。自ノードがマスタ側サブゲートウェイでない場合、処理を終了する(ステップS87でNo)。自ノードがマスタ側サブゲートウェイである場合、スレーブ側サブゲートウェイを変更できるかを判定する(ステップS87でYes、ステップS88)。スレーブ側サブゲートウェイを変更できる場合、中継先決定部43は、新たなスレーブ側サブゲートウェイを決定した上で、TTLの値をリセットする(ステップS88でYes、ステップS89)。スレーブ側サブゲートウェイを変更できない場合、中継先決定部43は、TTL=0を含むエントリを削除する(ステップS88でNo、ステップS90)。
図31は、障害発生時にスレーブ側クラスタ中の境界ノードが行う処理の例を説明するフローチャートである。スレーブ側テーブル更新部32は、TTL=0を含むエントリがあると判定すると、マスタ側クラスタのTTLが0になっているかを判定する(ステップS91でYes、ステップS92)。マスタ側クラスタのTTLが0になっている場合、スレーブ側テーブル更新部32は、TTL=0となっているマスタ側クラスタを含むエントリをスレーブ側クラスタテーブル62から削除する(ステップS92でYes、ステップS93)。マスタ側クラスタのTTLが0になっていない場合、マスタ側サブゲートウェイのTTLが0となっているかを判定する(ステップS92でNo、ステップS94)。マスタ側サブゲートウェイのTTLが0になっていない場合、スレーブ側テーブル更新部32は処理を終了する(ステップS94でNo)。マスタ側サブゲートウェイのTTLが0になっている場合、スレーブ側テーブル更新部32は、TTL=0となっているマスタ側サブゲートウェイを含むエントリをスレーブ側クラスタテーブル62から削除する(ステップS94でYes、ステップS95)。
図32Aと図32Bは、第2の実施形態におけるマスタ側クラスタ情報の処理の例を説明するフローチャートである。ステップS101〜S107は、図21Aを参照しながら説明したステップS11〜S17と同様である。通知されたリーダーノードの条件が現在のリーダーノードの条件以下の場合、マスタ側テーブル更新部33は、Helloフレーム中のリーダーノードのシーケンス番号SNが更新されているかを判定する(ステップS107でNo、ステップS108)。Helloフレーム中のリーダーノードのシーケンス番号が更新されている場合、マスタ側テーブル更新部33は、リーダーノードのTTLの値をリセットする(ステップS108でYes、ステップS109)。さらに、マスタ側テーブル更新部33は、リーダーノードのシーケンス番号を更新する。一方、現在のリーダーノードの条件よりも、通知されたリーダーノードの条件の方が良い場合、マスタ側テーブル更新部33は、リーダーノードを変更する(ステップS107でYes、ステップS110)。さらに、マスタ側テーブル更新部33は、リーダーノードのTTLをリセットし、シーケンス番号を更新する(ステップS111)。ステップS108でNoと判定された場合か、ステップS109、S111の処理の後、ステップS112の処理により、マスタ側サブゲートウェイが更新される。ステップS112については後述する。その後、マスタ側サブゲートウェイのTTLがリセットされる(ステップS113)。さらに、nが1つインクリメントされ、ステップS103以降の処理が繰り返される(ステップS114)。
図32BのステップS121〜S123は、図21Bを参照しながら説明したステップS31〜S33と同様である。ステップS123の処理の後、スレーブ側テーブル更新部32は、処理対象のMCIに対応するスレーブ側クラスタテーブル62のエントリについて、マスタ側クラスタのTTLをリセットする(ステップS124)。ステップS125〜S127の処理は、図21Bを参照しながら説明したステップS34〜S36と同様である。ステップS126でYesと判定されると、スレーブ側テーブル更新部32は、自ノードを、スレーブ側サブゲートウェイに設定する。さらに、スレーブ側テーブル更新部32は、スレーブ側クラスタテーブル62中のマスタ側サブゲートウェイのTTLをリセットする(ステップS128)。
図33は、Helloフレームの送信元が属するクラスタの情報の処理の例を説明するフローチャートである。ステップS131〜S133は、図22を参照しながら説明したステップS41〜S43と同様である。マスタ側クラスタテーブル61からのエントリの取得に成功すると、マスタ側テーブル更新部33は、Helloフレームの送信元がスレーブ側サブゲートウェイであるかを判定する(ステップS133でYes、ステップS134)。Helloフレームの送信元がスレーブ側サブゲートウェイでない場合、マスタ側テーブル更新部33は処理を終了する(ステップS134でYes、ステップS135)。ステップS136〜S139の処理は、図22を参照しながら説明したステップS44〜S47と同様である。その後、中継先決定部43は、スレーブ側サブゲートウェイのTTLをリセットする(ステップS140)。ステップS136、S138でNoと判定された場合も、ステップS140の処理が行われる。ステップS141〜S143の処理は、図22を参照しながら説明したステップS48〜S50と同様である。その後、中継先決定部43は、スレーブ側サブゲートウェイのTTLをリセットする(ステップS144)。
以上、説明したように、第2の実施形態では、サブゲートウェイとして動作するノード装置10に障害が発生しても、自律的にサブゲートウェイの設定が変更される。また、第1の実施形態と同様の利点もある。
<その他>
なお、第1および第2の実施形態を含む以上の実施形態は、上記に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
上記の例では、理解しやすくするために、1つのクラスタがマスタ側クラスタもしくはスレーブ側クラスタのいずれかとなる場合について説明した。しかし、1つのクラスタがあるクラスタに対してマスタ側クラスタとなり、他のクラスタに対してスレーブ側クラスタとなることもある。例えば、クラスタC2がクラスタC1、C3の両方と隣接しているとする。この場合、クラスタC2は、クラスタC1との間の通信に用いられるサブゲートウェイの決定では、スレーブ側クラスタとなるが、クラスタC3との間の通信に用いられるサブゲートウェイの決定では、マスタ側クラスタとなる。
Helloフレームに含まれる情報要素は、実装に応じて追加されても良い。また、前述のとおり、Helloフレーム以外の制御フレームを用いて、サブゲートウェイの設定が行われても良い。また、マスタ側クラスタテーブル53、61やスレーブ側クラスタテーブル54、62に含まれる情報要素も、実装に応じて変更されても良い。
第1および第2の実施形態を含む以上の実施形態は、クラスタがノード装置10の増減に応じて動的に形成される場合と、クラスタが固定的に決定されている場合のいずれにも適応されうる。
さらに、リーダーノードやサブゲートウェイの選択条件は、実装に応じて変更されることがある。例えば、ノードIDに含まれている数値が大きいほど、リーダーノードに設定されやすくても良い。同様に、サブゲートウェイについても、ノードIDの値が大きいノード装置10ほど選択されやすくなるように、条件が設定されていても良い。