以下では、図面を参照して、アドホックネットワークのノード装置であって、2段階でクラスタ形成を行うことができる装置を説明する。
まず、図1〜2を参照して、比較例と本発明の概要について説明する。その後、図3〜30を参照して、2段階でクラスタ形成を行うことができるノード装置10について説明する。
図3〜30を参照して説明するノード装置10では、Helloパケットの送受信のみでクラスタ生成処理およびクラスタ統合処理の2段階でクラスタ形成を行う事で、ネットワークにかかる負荷を軽減し、且つ、クラスタヘッドの負荷を減らしつつ、クラスタ形成を行うことができる。また、個々のクラスタのサイズのばらつきが小さく、クラスタの数も小さくすることができる。クラスタ統合処理を実行することによって、クラスタ数は減少するので、ルーティング時のクラスタを跨ぐ数を減らすことができる。さらに、処理リソースが減少することでアドホックネットワークのスループット向上が可能となる。
<比較例>
図1は、クラスタが形成されたアドホックネットワークの例を示す図である。図1のアドホックネットワークは50個の50個のノード装置N1〜N50を含んでいる。各ノード装置は、それぞれ固有の識別情報(Identification、ID)を保有する。各ノード装置に付与された識別番号を「ノードID」と呼ぶことがある。図中では各ノード装置は、1〜50のノードIDを保有する。ノードIDは、MACアドレスでも良い。
図1のみならず、図2以降においても、ノード装置のことを単に、「ノード」と呼ぶこともある。各ノードに付与された番号や記号をノードIDとも呼ぶ。これらのノード装置のうち互いに隣接するノード装置は実線で結ばれている。また、ノードIDが数字xで指定される場合、そのノード装置を単にノード装置Nx、またはノードNxを呼ぶことがある。またノードIDが数字以外の記号yで指定される場合、そのノード装置を単にノード装置y、またはノードyと呼ぶことがある。
ここで、「隣接する」とは、複数のノード装置が互いにパケットを送受信できる距離に位置することを指す。2つのノード装置が隣接しているとき、これら2つのノード装置は「リンク」で結ばれているという。また、あるノード装置から送信されたパケットを受信できる範囲に位置するノード装置のことを、そのノード装置の「隣接ノード装置」または単に「隣接ノード」と呼ぶことがある。
各ノード装置の例としては、センサが挙げられる。このとき、アドホックネットワーク10は、センサネットワークとも呼ばれる。リンクによるノードの接続は有線であっても無線であっても良い。
各ノード装置は、互いに隣接しているノード情報やネットワーク全体についての情報を必ずしも把握していない。そこで、各ノードは、自分自身がどのように他のノードと接続されているかを知るために、隣接するノードとの間で、たとえばHelloメッセージのような、経路情報やノード間のリンクの通信品質情報といったノード情報を含むメッセージの送受信を定期的に行う。Helloメッセージは、たとえば数秒間隔で各ノードから送信される。しかしながら、Helloメッセージが送信されるタイミングは、数秒間隔には限らず、任意の一定間隔で送信されても、不定期的に送信されてもよい。そのようなメッセージの遣り取りから、各経路の通信品質を計算し、その結果をもって最終宛先までの複数の経路の構築及び最適な経路の決定を行う。つまり、Helloメッセージには、メッセージを送信するノードと隣接するノード間の経路情報およびノード間リンクの通信品質情報等のノード情報が含まれている。たとえば、あるノード装置から送信されたHelloパケットは、送信元のノード装置の隣接ノード装置で受信される。Helloパケットは、ネットワークの経路情報を通知するために用いられる。
図1に示されている例は、クラスタのノード数が10を超えると、新しいクラスタを生成する方法を用いて形成されたものである。図1のように50個のノード装置がある場合、ネットワーク全体でクラスタ数を最小にしようとすれば、ノード装置を50/10=5個のクラスタに分けることが可能である。しかしながら、図1では、C1〜C8の8個のクラスタで形成されてしまっている。
クラスタC1〜C8はそれぞれ、クラスタヘッドN1、N13,N25、N30、N35、N38,N44、N46を含んでいる。また、クラスタC1は、ノード装置N1〜N10を含んでいる。クラスタC2はノード装置N11〜N20を含んでいる。クラスタC3はノード装置N21〜N25を、クラスタC4はノード装置N26〜N30を含んでいる。クラスタC5はノード装置N31〜35を、クラスタC6はノード装置N36〜N39を含んでいる。クラスタC7はノード装置N41〜N45を、クラスタC8はノード装置N46〜N50を含んでいる。
ここで、「クラスタヘッド」とは、クラスタの生成を開始するノード装置であり、クラスタヘッド自身を含むクラスタを生成する。クラスタヘッドを「起点ノード」または「ゲートウェイ(GW)」と呼ぶこともある。
たとえば、ノード装置N1がクラスタ生成を開始するとする。この時点でノード装置N2〜N50は、いずれのクラスタにも属していないものとする。このように、クラスタに属していないノード装置のことを「フリーノード」と呼ぶことがある。
起点ノードは、生成しているクラスタの識別子(図1では、C1、C2、...、C8など)とそのクラスタに参加しているノード装置の識別子(図1のクラスタC1であればノード装置を示すID番号1〜10など)を含むHelloパケットをブロードキャスト送信する。フリーノードは、起点ノードから送信されたHelloパケットにより生成中のクラスタの識別子を認識する。フリーノードがクラスタに参加する場合、参加するクラスタの識別子と自身の識別子を対応付けた情報を含むHelloパケットを生成し、生成したHelloパケットをブロードキャスト送信する。たとえば、ノード装置N1〜N50がフリーノードとして存在し、ノード装置N1が起点ノードとなって、クラスタが生成される場合を考える。図1では、ノード装置N1に隣接するノード装置N2、N3、N4、N6、N7は、起点ノードN1から送信されたHelloパケットを受信することにより、クラスタC1が生成中であることを認識する。ノード装置N2、N3、N4、N6、N7はクラスタに属していないフリーノードであるので、生成中のクラスタC1の識別子を認識すると、クラスタC1に参加することを決定する。図1のノード装置N2がクラスタC1に参加する場合、参加するクラスタの識別子C1と自身の識別子N2を対応付けた情報を含むHelloパケットを生成し、生成したHelloパケットをブロードキャスト送信する。
起点ノードN1は、生成中のクラスタC1の識別子に対応付けてノード装置の識別子が通知されると、クラスタC1への参加の要求を受信したと認識する。そこで、起点ノードN1は、受信したHelloパケットにより、生成中のクラスタC1に参加するノード装置を認識し、認識したノード装置をクラスタに加える。クラスタに加えられたノード装置は、そのノード装置がクラスタに加えられたことを、起点ノードからのHelloパケットによって確認する。クラスタに参加しているノード装置を「参加ノード」と呼ぶことがある。参加ノードは、参加しているクラスタの識別子を含むHelloパケットをブロードキャスト送信する。フリーノードは、参加ノードで生成されたHelloパケットから生成中のクラスタの識別子を認識すると、上述の手順によってクラスタに参加する。これらの処理は、クラスタに含まれるノード装置の数が閾値に達するまでくりかえされる。
図1のクラスタC1は、N1を起点ノードとし、N2〜N50がフリーノードの状態から、クラスタに含まれるノード装置の数の閾値が10のときに生成されたクラスタである。
クラスタに含まれるノード装置の数が閾値に達すると、起点ノードは、新たなクラスタの生成を要求する情報(生成要求、または生成要求情報)を含むHelloパケットをブロードキャスト送信する。生成要求を受信した参加ノードは、受信した生成要求を含むHelloパケットを生成し、ブロードキャスト送信する。生成要求を含むHelloパケットを受信したフリーノードは、新たな起点ノードとして動作し、クラスタの生成を開始する。図1では、ノード装置N13、N30、N35、N38がそれぞれ、クラスタC2、C4、C5、C6の生成を開始する。クラスタの生成が始まった以後の手順は、クラスタC1の生成の手順と同じである。クラスタが生成されると、各ノード装置は、同一のクラスタ内の他のノード装置に至る経路をルーティングテーブルに格納する。
図1では、Helloパケットによってクラスタの生成に用いられる情報を送受信し、クラスタに含まれるノード装置の数が閾値すると別のクラスタを生成するという方法によりクラスタが生成される。
このようにクラスタを形成することにより、各ノード装置は、アドホックネットワークに含まれる全てのノード装置までの経路を格納する必要がない。よって、各ノード装置に格納されるルーティングテーブルの大きさは、アドホックネットワークがクラスタに分割されていない場合に比べて小さくなる。このため、各ノード装置において、経路情報を格納することにより生じる負荷の大きさも軽減される。また、クラスタの形成に用いられる情報は、Helloパケットによって送受信されるので、他のパケット、たとえば制御パケットを用いる場合に比べてクラスタを生成するために行われる情報の送受信による帯域の消費量は少ない。
しかしながら、図1の例では、クラスタが含むノードの数は、C3の5つから、C1、C2の10個までクラスタ毎にクラスタ数のバラつきが発生している。数千台というオーダーのノード装置を含む大規模なネットワークに適用する場合、クラスタ数が多くなるとルーティング時のクラスタを跨ぐ数が多くなり、スループットが低下するおそれがある。
そこで、開示される実施形態に関するアドホックネットワークのノード装置は、複数のノード装置が集まったとき、第1段階のクラスタ生成処理と第2段階のクラスタ統合処理の2段階でクラスタを生成する。
<全般的な説明>
図2は段階的なクラスタ形成処理の概略を説明する図である。図2の(A)は、段階的にクラスタを形成するクラスタ形成処理の第1段階であるクラスタ生成処理の概略を説明する図、図2の(B)は、クラスタ形成処理の第2段階であるクラスタ統合処理の概略を説明する図、そして、図2の(C)は、クラスタ形成処理の第2段階であるクラスタ統合処理の結果の例を説明する図である。
以下では、第1段階、第2段階を含めて複数のノード装置からクラスタを作る処理を「クラスタ形成」、第1段階で起点ノードが他のノード装置を取り込んで、第1段階が終了するまでクラスタを成長させる処理を「クラスタ生成」と呼ぶことがある。
以下で開示される実施形態では、クラスタに含まれ得るノード数が第1段階のクラスタ生成処理と第2段階のクラスタ統合処理では異なる。第1段階終了時にクラスタに含まれ得るノード数を暫定的最大クラスタノード数、第2段階終了時にクラスタに含まれ得るノード数を単に「最大クラスタノード数」と呼ぶ。
最大クラスタノード数は、暫定的最大クラスタノード数より大きい。たとえば、最大クラスタノード数は、暫定的最大クラスタノード数の約2倍の値である。最大クラスタノード数としては、10、20、50などを例示することができる。もちろん、最大クラスタノード数はこれらの数に限定されない。また、最大クラスタノード数に対する暫定的最大クラスタノード数の割合も100%以下の任意の数を取り得る。
図2の(A)に示されているように、第1段階では、クラスタのノード数が暫定的最大クラスタノード数以下となるようにクラスタを生成、成長させるクラスタ生成処理を行う。つまり、クラスタのノード数が最大クラスタノード数に届かず、クラスタの成長の余地がある場合も、あえてクラスタを成長させない。その後、第1段階で生成されたクラスタを統合するクラスタ統合処理を行う第2段階に移る。第1段階のクラスタ成長処理および第2段階のクラスタ統合処理は共に、後述のように、Helloパケットの交換のみで行なわれる。
このようにHelloパケットの送受信のみで、クラスタ成長処理およびクラスタ統合処理を行うことによって、小さなサイズのクラスタの数を減らすことができ、ネットワークにかかる負荷を軽減し、且つ、クラスタヘッドの負荷を減らすことができる。
最大クラスタノード数に対する暫定的最大クラスタノード数の割合は、クラスタの生成の速度を優先する場合は高めに、たとえば75%、80%に設定する。また、クラスタ内のノード数(クラスタ粒度)の均一性を優先する場合は割合を低く、たとえば40%、35%等に設定する。第1段階終了時でのクラスタノード数を暫定的最大クラスタノード数と呼ぶことがある。暫定的最大クラスタノード数の最大クラスタノード数に対する割合は、上記の数値に限定されない。
ノード装置に対してフリーノードの参加要求がなくなった時点から所定の時間だけ経過した後に、第2段階での統合処理を開始する。各ノード装置は、一定時間のインターバルを取り、そのインターバル内でクラスタに属するノード装置の数に変化が無ければ、クラスタ形成は安定したと判定し、クラスタ統合の処理へ移行する。
クラスタ統合処理に移行したクラスタは、隣接するクラスタに統合が可能であれば、統合される。所定の時間は、クラスタのノード数に依存し、クラスタのサイズが小さければ小さいほど、すなわちクラスタが含むノード数が少なければ少ないほど、短い。よって、小さいサイズのクラスタからクラスタ統合処理に移行するので、小さいサイズのクラスタであるほど、別のクラスタに取り込まれる可能性が高い。
図2の(B)では、クラスタ4がクラスタ1に、クラスタ6およびクラスタ7がクラスタ3に、クラスタ8がクラスタ5に、クラスタ10がクラスタ9に統合される。第2段階でのクラスタ統合処理は、サイズが小さいクラスタから開始する。第1段階では、ノード数が暫定的最大クラスタノード数以下のクラスタが生成されるので、サイズが小さいクラスタが自身より大きなサイズのクラスタに統合される。図2の(B)では、クラスタ数は10である。第2段階のクラスタ統合処理も、後述のように、Helloパケットの交換のみで行なわれる。
各ノードはクラスタ生成段階を省略しクラスタ統合段階から始めることもできる。この場合、クラスタ粒度は最少、つまりでクラスタ内のノード数は1で、各ノード装置がクラスタを構成する。この場合、全ノード装置は起動と同時にクラスタ統合処理を開始する、つまり1ノードから形成されるクラスタの起点ノードとして機能する。
図2の(C)では、10個のクラスタがクラスタ統合処理の結果、5個になった様子を示している。
<ノード装置の構成>
以下では、上述のように、複数個が集まったときに2段階でクラスタの形成を行うノード装置10について説明する。
たとえば、センサネットワークに参加するノード装置は、十分に豊富なリソースを備えない場合がある。ノード装置10は、Helloパケットの送受信のみでクラスタ生成処理およびクラスタ統合処理を含むクラスタ形成処理を行う手段を備えている。このように特別な制御パケットを使用しない事で、ネットワークにかかる負荷を軽減し、且つ、クラスタヘッドの負荷を減らしつつ、クラスタ形成を行うことができる。クラスタ統合処理は、クラスタ内のノード数が少ないクラスタから優先的に開始される。クラスタ統合処理を実行することによって、クラスタ数は減少しルーティング時のクラスタを跨ぐ数を減らすことができる。さらに、処理リソースが減少することでアドホックネットワークのスループット向上が可能となる。
図3は、ノード装置10の構成の例を示す機能ブロック図である。ノード装置10は、受信部102、ノード種別判定部104、参加処理部106、クラスタ情報更新部108、クラスタ生成部110、フリーノードリスト生成部112、クラスタ統合先候補通知部114、クラスタ統合要求受付部116、クラスタ統合要求更新部118、クラスタ統合リスト生成部120、クラスタ統合処理部122、クラスタ統合リスト通知部124、設定部136、ハローパケット生成部138、送信部140を含む。さらに、ノード装置10は、ノード種別情報126、クラスタ情報128、フリーノードリスト130、マージクラスタリスト132、マージノードリスト134を記憶する。ノード種別情報126、クラスタ情報128、フリーノードリスト130、マージクラスタリスト132、マージノードリスト134のそれぞれと、それらが格納されるノード種別情報格納部126、クラスタ情報格納部128、フリーノードリスト格納部130、マージクラスタリスト格納部132、マージノードリスト格納部134は同じ符号で参照される。
クラスタ情報格納部128は、ネットワーク中の前記複数のノード装置の中で、前記ノード装置が経路情報を記憶するノード装置のグループであるクラスタに含まれるノード装置の装置識別情報(ノード装置の識別子)を格納する。また、クラスタ情報128には、クラスタ情報(CI)のほか、最大クラスタノード数が格納されている。
受信部102は、隣接するノード装置10から送信されたパケットを受信し、Helloパケットをノード種別判定部104に出力する。受信部102は、隣接するノード装置である隣接ノード装置から、前記ネットワーク中の情報伝達のための経路に関する経路情報、および前記隣接ノード装置が経路情報を記憶するノード装置のグループであるクラスタに含まれるノード装置の装置識別情報の通知に用いられるハローパケットを受信する。
送信部140は、パケットを隣接するノード装置10に送信する。たとえば、送信部140は、ハローパケット生成部138で生成されたHelloパケットを隣接するノード装置に送信する。隣接する全てのノード装置にパケットを送信するとき、パケットをブロードキャスト送信するとも言う。
図4はHelloパケットのフォーマットの例を示す図である。
図4に示されているように、Helloパケット300は、ヘッダとペイロードを含む。
ヘッダは、Typeフィールド、グローバル宛先(Global Distination:GD)フィールド、グローバル送信先(Global Source:GS)フィールド、ローカル送信元(Local Source:LS)、ローカル宛先(Local Distination:LD)を含む。
ペイロードは、クラスタ情報(Cluster Information:CI)フィールド、フリーノードリスト(Free Node List:FNL)フィールド、マージノードリスト(Merge Node List:MNL)フィールド、マージクラスタリスト(Merge Cluster List:MCL)フィールドを含む。ペイロードはさらに、図示されていないが、Helloヘッダの数を表す情報、Helloヘッダを含む。Helloヘッダは経路情報を含む。経路情報は、Helloパケットを生成するノード装置のルーティングテーブルに経路が記憶されているGDの識別子が含まれる。
以下、「グローバル宛先(GD)」とは、パケットの最終的な宛先のノード装置10を指す。また、「ローカル宛先(LD)」とは、パケットが1ホップ転送される場合の転送先のノード装置10を指す。「ローカル送信元(LS)」は、パケットが1ホップ転送される場合の転送元のノード装置10を指す。「グローバル送信元(GS)とは最初にパケットを作成した発信元のノード装置10を指す。Helloパケットは、送信元のノード装置10に隣接するノード装置にブロードキャスト送信される。
Typeフィールドには、ペイロードに含まれるデータの種類を示す情報が格納される。Helloパケットの場合、TypeフィールドはHelloパケットを特定する値が格納される。受信部102は、受信したパケットのTypeフィールドに格納されている値を用いてHelloパケットを識別し、ノード種別判定部104に出力する。
クラスタ情報(CI)フィールドには、ノード装置10自身が所属しているクラスタの識別子(Cluster Identifier:CID)と、クラスタ識別子(CID)で識別されるクラスタに含まれているノード装置の識別子(Node Identifier:NID、ノードID)のリストと、endフラグが格納される。
クラスタに含まれているノード装置の識別子(NID)の数は任意である。以下では、複数のノード装置の識別子(NID)の集合を「{NID}」と示すことがある。
クラスタ情報(CI)フィールドに含まれるendフラグは、クラスタ識別子(CID)で識別されるクラスタに新たなノード装置が参加できるかを示す情報である。つまり、クラスタ識別子(CID)で識別されるクラスタが最大クラスタノード数のノード装置を含んでいるかを示す情報である。
この最大クラスタノード数は、ノード装置10が現在クラスタ形成の第1段階にあれば、暫定的最大クラスタノード数、第2段階にあれば、最大クラスタノード数のことを指す。以下では、単に「最大クラスタノード数」と言えば、そのノード装置がクラスタ形成の第1段階にあるか第2段階にあるかに依存して、暫定的最大クラスタノード数または最大クラスタノード数を指すものとする。
endフラグは、たとえば、「true」と「false」の2つを取る。「true」および「false」は、「true」および「false」を示す数字、文字を含む記号であってもよい。endフラグが「true」の場合、クラスタが最大クラスタノード数のノード装置を含んでいるため、ノード装置10は新たにそのクラスタに参加することができない。endフラグが「ture」であるクラスタ情報を有するHelloパケットは、新たなクラスタの生成を要求するための情報である生成要求として用いられる。endフラグが「false」の場合、クラスタに含まれるノードの数は最大クラスタノード数には達していないため、そのノード装置10が含まれるクラスタには、新たなノード装置が参加することができる。
フリーノードリスト(FNL)フィールドには、ノードを参加させたいクラスタを識別するクラスタ識別子(CID)と、クラスタ識別子(CID)で識別されるクラスタに参加させたいノード装置の識別子(Node Identifier:NID、ノードID)のリストが含まれる。フリーノードリスト(FNL)フィールドに格納される情報を「フリーノード情報」と呼ぶことがある。クラスタに参加させたいノード装置の識別子(NID)の数は任意である。以下では、複数のノード装置の識別子(NID)の集合を「{NID}」と示すことがある。
マージノードリスト(Merge Node List:MNL)フィールドとマージクラスタリスト(Merge Cluster List:MCL)フィールドは、クラスタ形成の第2段階のクラスタ統合処理で用いられる。
クラスタ統合処理で2つのクラスタが統合する際には、異なる2つのクラスタに属し、隣接する2つのノード装置Aとノード装置Bの間でHelloパケットを送受信する。本実施形態では、クラスタ識別子(CID)を数値で表現した場合、クラスタ識別子(CID)の数値が小さい方のクラスタがマスタ、もう一方がスレーブとなる。仮に、ノード装置Aをマスタ側のクラスタに属するノード装置、ノード装置Bをスレーブ側のクラスタに属するノード装置とする。
マージクラスタリスト(Merge Cluster List:MCL)フィールドは、自ノード装置がスレーブ側のクラスタに属しているとき、隣接し、マスタ側のクラスタに属するノード装置の識別子(S−Identifier:SID)と、自ノード装置が属するスレーブ側のクラスタに属するノード装置の識別子(NID)を含む。以下では、ノード装置の識別子(NID)の集合を「{NID}」と示すことがある。
ノード装置Bが、マスタ側クラスタに属するノード装置Aからクラスタ統合先候補通知としてのHelloパケットを受信すると、ノード装置Bはマスタ側のクラスタに属するノード装置の識別子(SID)に、ノード装置Aを識別する識別子を格納し、スレーブ側のクラスタに属するノード装置を識別する識別子(NID)の集合を空集合{}として、Helloパケットをブロードキャスト送信する。
マージクラスタリスト(Merge Cluster List:MCL)フィールドは、ノード装置Bが属するスレーブ側のクラスタ内でHelloパケットがクラスタ統合要求通知として送受信されている場合には、ノード装置Bが含まれるスレーブ側のクラスタに属するノード装置を識別する識別子(NID)の集合である。
マージノードリスト(Merge Node List:MNL)フィールドには、マージクラスタリスト(MCL)フィールドにリストアップされたノード装置を識別する識別子(NID)の集合の要素数がスレーブ側のクラスタに属するノード装置に一致したとき、マージクラスタリスト(MCL)フィールドのノード装置を識別する識別子(NID)の集合が移動され格納される。すなわち、マージノードリスト(MNL)フィールドには、マスタ側のクラスタと統合し得るスレーブ側のクラスタに属する全ノード装置のリストが格納される。ノード装置Bがクラスタ統合要求通知としてHelloパケットをブロードキャスト送信する際には、マージノードリスト(MNL)は、ノード装置Bが含まれるスレーブ側のクラスタに属するード装置を識別する識別子(NID)の集合である。
設定部136は、ノード装置10をフリーノード、起点ノード、参加ノードのいずれかに設定し、ノード装置10の種別を特定する情報を、ノード種別情報126に格納する。
ノード種別情報126は、ノード装置10の種別を特定する任意の形式の情報である。もし、自身が起点ノードに設定されたときには、クラスタ情報128を更新する。
ノード種別判定部104は、受信部102からHelloパケットが転送されると、ノード種別情報126からノード装置10の種別、つまりフリーノード、起点ノード、参加ノードのいずれであるか、を取得する。ノード種別判定部104では、ノードの種別と、Helloパケット中のクラスタ情報(CI)、フリーノード情報(FNL等)、マージクラスタリスト(MCL)、およびマージノードリスト(MNL)の出力先が関連付けられている。図3に示されているように、ノード種別判定部104はノード種別情報126を参照して、クラスタ情報(CI)を、ノード装置10がフリーノードである場合には、参加処理部106に送る。また、ノード種別判定部104はノード種別情報126を参照して、クラスタ情報(CI)を、ノード装置10が起点ノードまたは参加ノードである場合にはクラスタ情報更新部108に送る。ノード種別判定部104はノード種別情報126を参照して、フリーノード情報(FNL等)を、ノード装置10が起点ノードである場合にはクラスタ生成部110に、参加ノードである場合にはフリーノードリスト生成部112に送る。同様に、マージクラスタリスト(MCL)は、ノード装置10が起点ノードである場合にはクラスタ統合要求受付部116に、参加ノードである場合にはクラスタ統合要求更新部118に送られる。マージノードリスト(MNL)は、ノード装置10が起点ノードである場合にはクラスタ統合処理部122に、参加ノードである場合にはクラスタ統合リスト通知部124に送られる。
参加処理部106は、クラスタへの参加の要求と参加の確認を行う。参加処理部106は、ノード装置10がフリーノードである場合にHelloパケットを受信したときに、Helloパケットに含まれるクラスタ情報(CI)を受け取る。参加処理部106はクラスタ情報(CI)を受け取ると、クラスタ情報(CI)に含まれるクラスタ識別子({NID})とendフラグの内容を確認する。さらに、参加処理部106は、ノード装置10自身の装置識別子を含むエントリがフリーノードリスト130に格納されているかを確認する。ノード装置10自身が既にクラスタへの参加を要求している場合、フリーノードリスト130にノード装置10自身の識別子を含むエントリが含まれている。
フリーノードリスト130にノード装置10自身の識別子を含むエントリが含まれていない場合、ノード装置10自身はクラスタへの参加を要求していない。そこで、参加処理部106は、参加が可能なクラスタ、つまりendフラグが「true」ではないクラスタに参加を要求するために、クラスタ情報(CI)に含まれるクラスタ識別子(CID)とノード装置10自身の識別子(ノードID)の組み合わせをフリーノードリスト130に格納する。フリーノードリスト130にノード装置10自身の識別子を含むエントリが含まれている場合、ノード装置10自身は既にクラスタへの参加を要求している。そこで、参加処理部106は、クラスタに参加できたかどうかを確認するために、クラスタ情報(CI)にノード装置10自身の識別子が含まれているかどうかを確認する。クラスタ情報(CI)にノード装置10自身の識別子が含まれている場合、参加処理部106は、ノード装置10自身はクラスタに参加できていると判定して、クラスタ情報(CI)に含まれるノード装置の識別子の組({NID})を更新する。同時に、フリーノードリスト130からノード装置10自身の識別子を削除し、そのクラスタの参加ノードになる。クラスタ情報(CI)にノード装置10自身の識別子が含まれていない場合、クラスタ情報(CI)に含まれるクラスタ識別子(CID)クラスタに参加可能かを確認するため、endフラグを確認する。
クラスタ情報(CI)に含まれるendフラグが「true」である場合、参加処理部106は、ノード装置10自身が属するクラスタは既に最大クラスタノード数個のノード装置を含んでいるため、フリーノードリスト130のエントリを削除する。フリーノードリスト130にノード装置10自身の識別子を含むエントリが含まれていない場合にendフラグが「true」であるクラスタ情報(CI)を含むHelloパケットを受信すると、ノード装置10自身を起点ノードに指定し、ノード種別情報126を変更し、さらにクラスタ情報128を更新する。
クラスタ情報更新部108は、Helloパケットで通知されたクラスタ情報(CI)が、ノード装置10自身が属しているクラスタに関する情報であるかを確認するために、クラスタ情報(CI)に含まれているクラスタ識別子(CID)とノード装置10自身が属しているクラスタの識別子が一致するかを確認する。両者が一致する場合には、ノード装置10自身が属しているクラスタの情報が通知されているので、クラスタ情報更新部108は、クラスタ情報128をHelloパケットで通知されたクラスタ情報(CI)に基づいて更新する。さらにクラスタ情報更新部108は、フリーノードリスト130からクラスタ情報(CI)に含まれているノード装置に関するエントリを削除する。
また、クラスタ情報更新部108は、ノード装置10自身がクラスタ情報(CI)に設定されている場合は、マージノードリスト(MNL)またはマージクラスタリスト(MCL)を比較し、必要に応じてマージクラスタリスト132、マージノードリスト134を更新する。
さらに、クラスタ情報更新部108は、ノード種別判定部104から受け取ったクラスタ情報(CI)をクラスタ統合先候補通知部114に送る。
また、クラスタ情報更新部108は、クラスタに含まれるノード装置の数が、所定の整数値で定義される最大クラスタノード数に対する所定の割合以下であり、且つ所定の時間にわたり変化がないことを確認するクラスタノード変化確認部としても機能する。
クラスタ生成部110は、ノード種別判断部より受け取ったノードフリーリスト(FNL)等のノードフリー情報を処理し、必要に応じて自ノードで管理するクラスタ情報(CI)を参照、更新する。
フリーノードリスト生成部112は、ノード種別判定部104から受け取ったフリーノードリスト(FNL)を処理し、必要に応じてノード装置10自身が管理するフリーノードリスト130を更新する。
クラスタ統合先候補通知部114は、クラスタ情報更新部108より受け取ったクラスタ情報(CI)と自ノードで管理するクラスタ情報128を参照し、クラスタ統合の条件を満たしていれば自ノードで管理するマージクラスタリスト132を更新する。また、マージクラスタリスト132を更新する場合、自ノードが起点ノードの場合はクラスタ統合要求受付部116にマージクラスタリスト(MCL)を渡す。
クラスタ統合要求受付部116は、ノード種別判定部104またはクラスタ統合先候補通知部114より受け取ったマージクラスタリスト(MCL)を処理し、クラスタ統合の条件を満たしていれば自ノードで管理するマージクラスタリスト132を更新する。
クラスタ統合要求更新部118は、ノード種別判定部104より受け取ったマージクラスタリスト(MCL)を処理し、クラスタ統合の条件を満たしていれば自ノードで管理するマージクラスタリスト132を更新(スレーブ側参加ノード登録)する。また、自ノードがマスタ側対向ノードの場合は、クラスタ統合リスト生成部120へマージクラスタリスト(MCL)およびクラスタ情報(CI)を渡す。
クラスタ統合リスト生成部120は、クラスタ統合要求更新部118より受け取ったマージクラスタリスト(MCL)およびクラスタ情報(CI)を処理し、クラスタ統合の条件を満たしていれば自ノードで管理するマージノードリスト134を更新する。
クラスタ統合処理部122は、ノード種別判定部104より受け取ったマージノードリスト(MNL)を処理し、クラスタ統合の条件を満たしていれば自ノードで管理するクラスタ情報128を更新する。
クラスタ統合処理部122は、第1のクラスタとは異なる第2のクラスタに含まれるノード装置の一つからハローパケットを受けたとき、自身のクラスタ情報格納部に格納されている装置識別情報から第1のクラスタに含まれるノード装置の数を取得し、ハローパケットに含まれる情報に基づいて第2のクラスタに含まれるノード装置の数を取得し、第1のクラスタに含まれるノード装置の数と第2のクラスタに含まれるノード装置の数の和が前記最大クラスタノード数以下であることを判定する統合クラスタノード数判定部を含んでいる。そしてクラスタ統合処理部122は、統合クラスタノード数判定部の判定の結果に基づいて、第2のクラスタに含まれるノード装置の装置識別情報を、第1のクラスタに含まれるノード装置の装置識別情報に追加して、クラスタ情報格納部に格納される装置識別情報を更新し、第2のクラスタを前記第1のクラスタに統合させる。
クラスタ統合リスト通知部124は、ノード種別判定部より受け取ったマージノードリスト(MNL)を処理し、必要に応じて自ノードで管理するマージノードリスト134を参照、更新する。
ハローパケット生成部138は、Helloパケットを生成し、送信部140に送る。Helloパケットのフォーマットの例は、図4に示されている。Helloパケットは、クラスタ情報(CI)フィールド、フリーノードリスト(FNL)フィールド、マージノードリスト(Merge Node List:MNL)フィールド、マージクラスタリスト(Merge Cluster List:MCL)フィールドを含んでいる。これらのフィールドに格納される情報はそれぞれ、クラスタ情報128、フリーノードリスト130、マージノードリスト134、マージクラスタリスト132から取得される。
<動作例>
図5〜13を参照しながら、ノード装置10の動作の例を説明する。
以下では、クラスタ形成処理の第2段階であるクラスタ統合処理について説明する。
クラスタ形成処理の第1段階であるクラスタ生成処理から第2段階のクラスタ統合処理への移行は、各ノード装置単位で行われる。各ノード装置10は所属するクラスタ内のノード装置の数の変化を監視し、所定の時間にわたりクラスタ内のノード装置の数の変化がない場合にクラスタ統合処理を開始する。例えばクラスタ生成処理でクラスタへの参加した後、属するクラスタのノード数の数が変化しなくなってから一定時間待機する。一定時間待機した時点で、クラスタ内のノード数が少ないクラスタは、ノード数が多いクラスタより先にタイムアウトになり、クラスタ統合段階へ移行しクラスタ統合要求が先に届く。すなわち、隣接するクラスタにおいてクラスタ内のノード数が少ないクラスタから優先的にクラスタ統合処理が開始される。
図5は、複数のクラスタがある場合、どのクラスタからクラスタ統合処理が開始されるのかを決定するクラスタ統合優先順位決定処理の概略を説明する図である。
図5に示されているように、クラスタ1はノード装置の識別子(NID)がNID=1から5の5つのノード装置を、クラスタ6はノード装置の識別子(NID)がNID=6から8の3つのノード装置を、クラスタ9はノード装置の識別子(NID)がNID=9から12の4つのノード装置を含んでいる。クラスタ1の起点ノードはNID=1のノード装置、クラスタ6の起点ノードはNID=6のノード装置、クラスタ9の起点ノードはNID=9のノード装置である。
この場合、クラスタ6は、3つのクラスタの中で最も小さい、すなわちクラスタが含むノード装置の数が最小である。よって、クラスタ6が、クラスタ1および9より先にクラスタ統合段階に移行する。クラスタ形成処理の第1段階であるクラスタ生成処理から第2段階のクラスタ統合処理への移行は、第1段階で設定される最大クラスタノード数の値を変更し、さらにノード装置10のクラスタ情報128に格納されているendフラグを「true」から「false」に変更することによって行われる。
図6は、クラスタ統合先候補通知処理の概略を説明する図である。
クラスタ統合処理は、隣接するクラスタ同士で実施される。隣接クラスタとのHelloパケットの送受信は、隣接するクラスタに属するノード装置であって、ノード装置同士も互いに隣接する2つのノード装置である対向ノード装置の間で行われる。たとえば、図6に示されているノードであれば、クラスタ1に属するNID=3のノード装置と、クラスタ6に属するNID=7、8のノード装置の組がそのような対向ノード装置である。
クラスタ統合先候補通知処理では、隣接するクラスタに属する対向ノード装置からのHelloパケットを受け取ると、受信したノード装置は自ノードで管理するクラスタ情報(CI)とHelloパケットに含まれるクラスタ情報(CI)から両方のクラスタのノード装置の数を足し合わせ、最大クラスタノード数に達しているかどうかを判定する。もし、足し合わせたノード数が最大クラスタノード数以下であれば、2つのクラスタは統合可能であると判定される。
この時、ノード装置10自身のクラスタ統合先候補通知部114は、自身が属するクラスタと隣接するクラスタのどちらがマスタでどちらがスレーブであるかを決定する。本例では、自身が属するクラスタと隣接するクラスタの識別子(CID)の値を比較し、クラスタの識別子(CID)の値が小さい方のクラスタをマスタ、大きいクラスタをスレーブとする。図6の例では、クラスタ1がマスタ、クラスタ6がスレーブとなる。
クラスタ6(スレーブ側クラスタ)のNID=7のノード装置がクラスタ1(マスタ側クラスタ)のNID=3のノード装置からHelloパケットを受けて、クラスタ6とクラスタ1が統合可能であると判定されると、スレーブ側クラスタの対向ノード、すなわちNID=7のノード装置のクラスタ統合要求更新部118は、自身のマージクラスタリスト132を、
<SID、{NID}>=<3、{}>
のように変更する。
図6に示されているように、たとえば、クラスタ6のノード装置N7には、クラスタ1に属する隣接ノード、すなわち対向ノード装置としてノード装置N3、N4、N5の3つのノード装置がある。この例のように対向ノード装置が複数ある場合には、クラスタ統合先候補通知が冗長してクラスタ6の起点ノードN6に到達する可能性がある。そのため、任意にクラスタ内でクラスタ統合先候補通知の伝送を制限してもよい。たとえば、ノードIDが数字で表される場合、対向ノード装置の組のうち、スレーブ側クラスタのノード装置のIDとマスタ側クラスタのノード装置のIDの和が最小のものを対向ノード装置の組として選択してもよい。
図7は、クラスタ6のNID=7のノード装置が送信するHelloパケットのマージクラスタリスト(MCL)フィールドに格納される情報である。この情報はHelloパケット生成部138がマージクラスタリスト132から取得する。マージクラスタリスト132からの情報に基づいて、クラスタ6のNID=7のノード装置が送信するHelloパケットのマージクラスタリスト(MCL)フィールドには、「<3、{}>」と格納され、クラスタ統合先候補通知としてのHelloパケットは、送信部140からブロードキャスト送信される。
クラスタ6のNID=7のノード装置からクラスタ6内にブロードキャスト送信されたHelloパケットは、NID=7のノード装置に隣接するNID=8のノード装置を経て、クラスタ6の起点ノードであるNID=6のノード装置によって受信される。
図8は、スレーブ側の起点ノードがクラスタ統合先候補通知を受けた後の動作を示す図である。今の場合、スレーブ側の起点ノードは、NID=6のノード装置である。
NID=6のノード装置のクラスタ要求受付部116では、他クラスタからのクラスタ統合先候補通知を受信していないかを判定する。この判定は、NID=6のノード装置10のマージクラスタリスト132のSIDに既に値が格納されているかどうかで判定することができる。もし、NID=6のノード装置10のマージクラスタリスト132のSIDに既に値が設定されていなければ、クラスタ統合先候補通知を受け付け、マージクラスタリスト132のSIDに、クラスタ6に隣接するクラスタ1のノード装置の識別子を設定する。つまり、NID=6のノード装置10のマージクラスタリスト132では、SID=3と設定される。
次に、NID=6のノード装置10のクラスタ統合要求更新部118は、自身が属するクラスタ6内の全ノードに対し、クラスタ統合要求中である事を通知するようなHelloパケットをハローパケット生成部138に生成させる。具体的には、マージクラスタリスト132のノード装置の識別子にスレーブのクラスタの起点ノード、すなわちNID=6のノード装置の識別子を設定し、それを用いたHelloパケットを生成する。このHelloパケットのクラスタ情報(CI)フィールドは、
<CID、{NID}、end>=<6、{6、7、8}、false>
が格納される。また、マージクラスタリスト(MCL)フィールドには、
<SID、{NID}>=<3、{6}>
が格納される。
その後、NID=6のノード装置10のハローパケット生成部138で生成されたHelloパケットは、送信部140から送信される、
NID=6のノード装置からHelloパケットを受けたスレーブのクラスタ6内の各ノード装置は、Helloパケットのマージクラスタリスト(MCL)フィールドに、自身が属するクラスタの起点ノードを示す値、すなわちNID=6のノード装置の識別子が設定されていることで、クラスタ統合要求を受付けたこと認識する。そして、マージクラスタリスト132のノード装置の識別子の組{NID}に自身のノード装置の識別子を追加し、自身のノード装置の識別子が追加されたマージクラスタリスト(MCL)フィールドを含むHelloパケットを送信する。このHelloパケットのクラスタ情報(CI)フィールドとマージクラスタリスト(MCL)フィールドの例は図9Aに示されている。
最終的にスレーブ側クラスタの全ノードがHelloパケットのマージクラスタリスト(MCL)フィールドのノード装置の識別子の集合({NID})にリストアップされる。
図9Bは、NID=7のノード装置によりNID=3のノード装置に向けて送信される
Helloパケットの例である。このHelloパケットのクラスタ情報(CI)フィールドとマージクラスタリスト(MCL)フィールドにはそれぞれ、
CI:<CID、{NID}、end>=<6、{6、7、8}、false>
MCL:<SID、{NID}>=<3、{6、7、8}>
が格納される。
図9Cは、図9Bに示されているようなクラスタ情報(CI)フィールドとマージクラスタリスト(MCL)フィールドを含むHelloパケットを受信したマスタ側クラスタに属するNID=3のノード装置から送信されるHelloパケットの例である。
NID=3のノード装置は、クラスタ統合要求通知(図9Bに示されているHelloパケット)に含まれるマージクラスタリスト(MCL)フィールドのノード装置の識別子の集合({NID})の要素数と、クラスタ情報(CI)フィールドに含まれるノード装置の数が一致するかを判定する。もし、両者が一致すれば、クラスタ統合リスト生成部120はマージクラスタリスト(MCL)に基づいて、NID=3のノード装置のマージノードリスト134を変更する。そして、NID=3のノード装置のハローパケット生成部138は、クラスタ情報(CI)フィールド、マージノードリスト(MNL)フィールド、マージクラスタリスト(MCL)フィールドがそれぞれ、
CI:<CID、{NID}、end>=<1、{1、2、3、4、5}、false>MNL:<{NID}>=<{6、7、8}>
MCL:<SID、{NID}>=<、{}>
であるようなHelloパケットを生成し、NID=3のノード装置の送信部140からブロードキャスト送信する。このとき、クラスタ1内で送受信されるHelloパケットはクラスタ統合要求通知としてとしての意味を持つ。
図10は、マスタ側クラスタであるクラスタ1のNID=3のノード装置が図9CのようなHelloパケットをブロードキャスト送信した後の、クラスタ1内の各ノード装置の動作の例を示す図である。
マスタ側クラスタであるクラスタ1の起点ノード(NID=1のノード装置)は、他クラスタからのクラスタ統合先候補通知を受信していないか、及び、マージノードリスト(MNL)フィールドに含まれるノード装置の識別子の組({NID})の要素数と自身が属するクラスタ内のノード装置の数の合計が最大クラスタノード数以下であるかを確認する。もし、これらの条件を満たす場合は、クラスタ情報(CI)にマージノードリスト(MNL)フィールドに含まれるノード装置を追加することでクラスタ統合を実施する。そして、NID=1のノード装置のハローパケット生成部138は、クラスタ情報(CI)フィールド、マージノードリスト(MNL)フィールド、マージクラスタリスト(MCL)フィールドがそれぞれ、
CI:<CID、{NID}、end>=<1、{1、2、3、4、5、6、7、8}、false>
MNL:<{NID}>=<{}>
MCL:<SID、{NID}>=<、{}>
であるようなHelloパケットを生成する。
図11はそのようなHelloパケットの例である。クラスタ1の起点ノード(NID=1のノード装置)の送信部140は、図11に示されているようなHelloパケットをブロードキャスト送信する。
マスタ側クラスタであるクラスタ1の起点ノード(NID=1のノード装置)は、他クラスタからのクラスタ統合先候補通知を受信していないか、及び、マージノードリスト(MNL)フィールドに含まれるノード装置の識別子の組({NID})の要素数と自身が属するクラスタ内のノード装置の数の合計が最大クラスタノード数以下であるかを確認する。もし、これらの条件を満たす場合は、クラスタ情報(CI)にマージノードリスト(MNL)フィールドに含まれるノード装置を追加することでクラスタ統合を実施し、新しいクラスタ1が形成される。そして、NID=1のノード装置のハローパケット生成部138は、クラスタ情報(CI)フィールド、マージノードリスト(MNL)フィールド、マージクラスタリスト(MCL)フィールドがそれぞれ、
CI:<CID、{NID}、end>=<1、{1、2、3、4、5、6、7、8}、false>
MNL:<{NID}>=<{}>
MCL:<SID、{NID}>=<、{}>
であるようなHelloパケットを生成する。この新しいクラスタ1の起点ノードはNID=1のノード装置であり、クラスタに含まれるノード装置は、NID=1〜8で識別される。また、マージノードリスト(MNL)フィールドに含まれるノード装置の識別子の組({NID})の要素数と自身が属するクラスタ内のノード装置の数の合計が最大クラスタノード数を超える場合には、endフラグは、「true」となり、クラスタ統合は実施されない。
図12は、マスタ側クラスタであるクラスタ1の起点ノード(NID=1のノード装置)が、上記のようなクラスタ情報(CI)フィールドを含むHelloパケットを送信した後の、ノード装置の動作を説明する図である。
マスタ側クラスタの起点ノード(NID=1のノード装置)からHelloパケットが送信されると、マスタ側クラスタに属していた各ノード装置(NID=1、2、3、4、5のノード装置)は、クラスタ情報(CI)フィールドに自身が管理するマージノードリスト134に格納されているノード装置の識別子(NID)が含まれていればクラスタ統合されたと認識しマージノードリスト134に格納されているノード装置の識別子(NID)から一致したノード装置の識別子(NID)を削除する。そして、自身のクラスタ情報128を書き換える。すなわち、クラスタ情報128には、
CI:<CID、{<NID、SN>}、end>=<1、{1、2、3、4、5、6、7、8}、false>
なる情報が格納される。
すべてのノード装置(NID=1、2、3、4、5、6、7、8のノード装置)のクラスタ情報128が書き換えられると、クラスタ統合処理は終了する。
図13はノード装置10のハードウェア構成の例を示す図である。
ノード装置10、MPU(Micro Processing Unit)200、PHY(Physical Layer)チップ202、タイマIC204、DRAM(Dynamic Random Access Memory)206、フラッシュメモリ208、無線モジュール210を含む。MPU200、PHYチップ202、タイマIC204、DRAM206、フラッシュメモリ208、無線モジュール210は互いにバス201(201a〜201c)によって接続され、MPU202の管理の下で各種のデータを相互に授受することができる。
MPU202は、このコンピュータ200全体の動作を制御する演算処理装置であり、コンピュータ200の制御処理部として機能する。MPU202は、ノード種別判定部104、参加処理部106、クラスタ情報更新部108、クラスタ生成部110、フリーノードリスト生成部112、クラスタ統合先候補通知部114、クラスタ統合要求受付部116、クラスタ統合要求更新部118、クラスタ統合リスト生成部120、クラスタ統合処理部122、クラスタ統合リスト通知部124、設定部136、ハローパケット生成部138として動作する。
フラッシュメモリ208は、ファームウェアなどの所定の基本制御プログラムが予め記録されている不揮発性メモリである。MPU202は、この基本制御プログラムをコンピュータ200の起動時に読み出して実行することにより、このコンピュータ200の各構成要素の動作制御が可能になる。
DRAM206は、MPU202が各種の制御プログラムを実行する際に、必要に応じて作業用記憶領域として使用する、随時書き込み読み出し可能な半導体メモリである。DRAM206は、ノード種別情報126、クラスタ情報128、フリーノードリスト130、マージクラスタリスト132、マージノードリスト134、ルーティングテーブルを記憶できる。ただし、ノード種別情報126はフラッシュメモリ208に格納されても良い。この場合、起動後に、フラッシュメモリ208に格納されているノード種別情報126がDRAM206に読み込まれる。
PHYチップ202や無線モジュール210は、受信部102や送信部140として動作する。PHYチップ202はオプションであり、PHYチップ202を備えることによって、回線を用いた通信を行うことができる。
タイマIC204は、Helloパケットを送信する時刻や、装置10が属しているクラスタが含むノード装置の数が変化しない時間などを計測する。
尚、ファームウェア等のプログラムは、コンピュータ読み取り可能な記録媒体に記録されてノード装置10に提供されても良い。MPU202は、コンピュータ読み取り可能な記録媒体に記録されている所定の制御プログラムを読み出して実行することもできる。なお、コンピュータ読み取り可能な記録媒体としては、例えばUSB(Universal Serial Bus)規格のコネクタが備えられているフラッシュメモリ、CD−ROM(Compact Disc Read Only Memory)、DVD−ROM(Digital Versatile Disc Read Only Memory)などがある。またプログラムはネットワークからPHYチップ202や無線モジュール210を介してダウンロードされることによりノード装置10にインストールされても良い。ノード装置10はコンピュータにより実現されても良い。
<ノード装置における処理>
図14は、ノード種別判定部104の動作を説明するフローチャートである。
ステップS102で、ノード種別判定部104は、Helloパケットが受信部102から入力されると、ノード種別情報126を参照して、ノード装置10自身がフリーノードであるかどうかの判定をする。もしこの判定の結果がYes、すなわちノード装置10自身がフリーノードであればステップS104に進む。もしこの判定の結果がNo、すなわちノード装置10自身がフリーノードでなければステップS106に進む。
ステップS104では、ノード装置10自身がフリーノードであるという情報を含むクラスタ情報(CI)を参加処理部106に通知する。ステップS104の処理が終わると、ノード種別判定部104の処理を終了する。
ステップS106では、ノード装置10自身がフリーノードでないという情報を含むクラスタ情報(CI)をクラスタ情報更新部108に通知する。
ステップS106の次のステップS108では、ノード種別情報126を参照して、ノード装置10自身が起点ノードであるかどうかを判定する。もしこの判定の結果がYes、すなわちノード装置10自身が起点ノードであればステップS110に進む。もしこの判定の結果がNo、すなわちノード装置10自身が起点ノードでなければステップS116に進む。
ステップS110では、フリーノードリスト(FNL)をクラスタ生成部110に通知する。そして、ステップS112に進む。
ステップS112では、マージクラスタリスト(MCL)をクラスタ統合要求受付部116に通知する。
ステップS112の次のステップS114では、マージノードリスト(NML)をクラスタ統合処理部122に通知する。ステップS110とステップS112とステップS114の処理の順序は、任意である。ステップS114の処理が終わると、ノード種別判定部104の処理を終了する。
ステップS116では、フリーノードリスト(FNL)をフリーノードリスト生成部112に通知する。そして、ステップS118に進む。
ステップS118では、マージクラスタリスト(MCL)をクラスタ統合要求更新部118に通知する。
ステップS118の次のステップS120では、マージノードリスト(NML)をクラスタ統合リスト通知部124に通知する。ステップS116とステップS118とステップS120の処理の順序は、任意である。ステップS114の処理が終わると、ノード種別判定部104の処理を終了する。
図15は、参加処理部106の動作の例を示すフローチャートである。
S130では、参加処理部106は、フリーノードリスト130に自身のエントリがあるかどうかを判定する。フリーノードリスト130に自身のエントリがある場合はステップS140に進む。フリーノードリスト130に自身のエントリがない場合はステップS132に進む。
ステップS132では、Helloパケットのクラスタ情報(CI)フィールドに含まれているendフラグが「true」であるかどうかを判定する。endフラグが「true」である場合はS136に進む。endフラグが「true」でない場合はステップS134に進む。
ステップS134では、クラスタ内のノード数が最大クラスタノード数に達していないので、参加処理部106は、自身のノード装置の識別子(NID)を、クラスタ情報(CI)に含まれているクラスタ識別子(CID)に対応つけてフリーノードリスト130に格納する。ステップS134の処理が終わると、参加処理部の処理が終了する。
ステップS136で参加処理部106は、自身のノード装置が起点ノードとして動作できるようにクラスタ情報128を生成する。このとき、クラスタ情報128には、自身のノード装置の識別子がクラスタ識別子(CID)として記憶され、新たに生成されたクラスタには自身のノードが含まれる。そして、ステップS138に進む。
ステップS138で参加処理部106は、自身のノード装置の設定を起点ノードに変更して、ステップS138の処理が終わると、参加処理部106の処理が終了する。
一方、ステップS130の判定の結果がYes(Y)の場合、すなわちフリーノードリスト130に自身のエントリがある場合、参加処理部106は、ステップS140で、クラスタ情報128に自身のノード装置の識別子が含まれているかを確認する。ステップS140の判定の結果がYes(Y)の場合、すなわちクラスタ情報128に自身のノード装置の識別子が含まれている場合、ステップS142に進む。
ステップS142で参加処理部106は、フリーノードリスト130から自身のノード装置のエントリを削除し、クラスタ情報(CI)フィールドに含まれているノードの情報をクラスタ情報128に格納する。そして、ステップS144に進む。
ステップS144で参加処理部106は、自身のノード装置の設定を参加ノードに変更して、ステップS138の処理が終わると、参加処理部106の処理が終了する。
ステップS140の判定の結果がNo(N)の場合、すなわちクラスタ情報128に自身のノード装置の識別子が含まれていない場合は、ステップS146に進む。
ステップS146では、endフラグが「true」であるかを判定する。この判定の結果がYes(Y)であれば、ステップS148に進む。この判定がNo(N)であれば、参加処理部106の処理が終了する。
ステップS148では、ノード装置10が属するクラスタのノード装置の数が上限に達しているので、フリーノードリスト130のエントリを削除し、参加処理部の処理が終了する。
図16は、クラスタ情報更新部108の動作の例を示すフローチャートである。
各ノードは受信したHelloパケットのクラスタ情報(CI)のクラスタ識別子(CID)が、自身のノード装置のクラスタ情報128に格納されているクラスタ識別子(CID)と同じ場合には次のような処理を行う。すなわち、クラスタ内のノード装置の数に変化があった時点から一定時間のタイミングを取るためのタイマを設定する。一定時間内にクラスタ内のノード装置の数に変化がなければ、受信したHelloパケットのクラスタ情報(CI)を自身のノード装置のクラスタ情報128にマージすることで、自身のノード装置が属するクラスタの全ノードを認識する。また、自身のノード装置のフリーノードリスト130について、クラスタ情報128に追加されたノード装置に対応するエントリは削除する。自身のノード装置のマージノードリスト134に格納されているノード装置の識別子(NID)が、受信したHelloパケットのクラスタ情報(CI)に含まれていれば、クラスタ統合(マスタ側)が完了したと認識し、自身のノード装置のマージノードリスト134に格納されているエントリを削除する。
各ノードは受信したHelloパケットのクラスタ情報(CI)のクラスタ識別子(CID)が自身のノード装置のクラスタ情報128に格納されているクラスタ識別子(CID)と異なる場合には以下の処理を行う。すなわち、自身のノード装置のマージクラスタリスト132と、受信したHelloパケットのクラスタ情報(CI)に含まれているノード装置の識別子(NID)を確認し、自身のノード装置の識別子が含まれていればクラスタ統合(スレーブ側)が完了したと認識し、受信したHelloパケットのクラスタ情報(CI)を自身のノード装置のクラスタ情報128に置き換え、自身のノード装置のマージノードリスト134に格納されているエントリを削除する。クラスタ統合中でなければクラスタ統合先候補通知部114へノード種別判定部104より受け取った受信したHelloパケットに含まれているクラスタ情報(CI)を渡す。
ステップS150でクラスタ情報更新部108は、受信したHelloパケットのクラスタ情報(CI)フィールドのクラスタ識別子(CID)が、自身のクラスタ情報128に格納されているクラスタ識別子(CID)が一致するかどうかを判定する。もし、この判定の結果がYesの場合、すなわち両者が一致する場合は、ステップS152に進む。また、この判定の結果がNoの場合、すなわちもし両者が一致しなければ、ステップS168に進む。
ステップS152でクラスタ情報更新部108は、つまり受信したHelloパケットのクラスタ情報(CI)フィールドのクラスタ識別子(CID)と自身のクラスタ情報128に格納されているクラスタ識別子(CID)が一致する場合は、S152でHelloパケットに含まれるクラスタ識別子(CID)で識別されるクラスタのノード数と、自身のクラスタ情報128に格納されているクラスタ識別子(CID)で識別されるクラスタのノード数で違いがあるかどうかを判定する。この判定の結果がYesであれば、ステップS154に進む。この判定の結果がNoであれば、ステップS156に進む。
ステップS154でクラスタ情報更新部108は、クラスタ識別子(CID)で識別されるクラスタのノード数に変化があった時点から一定時間のタイムアウトを計測するタイマを設定する。そして、ステップS156に進む。
ステップS156では、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれるノードの識別子({NID})と、自身のクラスタ情報128に格納されているクラスタの識別子(CID)で認識されるクラスタに含まれるノードの識別子({NID})を結合させる(マージする)。このことによって、クラスタ識別子(CID)で識別されるクラスタに含まれる全てのノード装置を認識する。
ステップS156の次のステップS158でクラスタ情報更新部108は、自身のノード装置のフリーノードリスト130に含まれるクラスタ識別子(CID)で識別されるクラスタに参加させたいノード装置の識別子(NID)のリストに、自身のクラスタ情報128に格納されているクラスタ識別子(CID)で識別されるクラスタに含まれるノード装置の識別子(NID)が含まれているかどうかを判定する。
ステップS158の判定の結果がYesであればステップS160に進み、Noであれば、ステップS160を処理せずにステップS162に進む。
ステップS160でクラスタ情報更新部108は、自身のクラスタ情報128に格納されているクラスタの識別子(CID)で認識されるクラスタに含まれるノードの識別子({NID})と一致する、自身のノード装置のフリーノードリスト130に含まれるノード装置の識別子(NID)を削除する。そしてステップS162に進む。
ステップS162でクラスタ情報更新部108は、自身のノード装置のマージノードリスト134が設定されているかどうかを判定する。もし設定されていればステップS164に進む。もし、設定されていなければクラスタ情報更新部108の処理を終了する。
ステップS164でクラスタ情報更新部108は、自身のノード装置のマージノードリスト132に含まれるノードの識別子({NID})は、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれるノードの識別子({NID})に含まれているかどうかを判定する、もしこの判定の結果がYesであれば、ステップS166に進む。もしこの判定の結果がNoであれば、クラスタ情報更新部108の処理を終了する。
ステップS166では、自身のノード装置のマージノードリスト132に含まれるノードの識別子({NID})と自身のクラスタ情報128に格納されているクラスタの識別子(CID)で認識されるクラスタに含まれるノードの識別子({NID})を比較し、一致するノード装置の識別子を自身のノード装置のマージノードリスト132から削除して、クラスタ情報更新部108の処理を終了する。
受信したHelloパケットのクラスタ情報(CI)フィールドのクラスタ識別子(CID)と、自身のクラスタ情報128に格納されているクラスタ識別子(CID)が一致しない場合、ステップS168でクラスタ情報更新部108は、自身のノード装置のマージクラスタリスト132に自身のノード装置の識別子(NID)が設定されているかどうかを判定する。この判定の結果がYesであれば、ステップS170に進む。この判定の結果がNoであれば、ステップS178に進む。
ステップS170でクラスタ情報更新部108は、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれるノードの識別子({NID})に自身のノード装置の識別子(NID)が設定されているかどうかを判定する。この判定の結果がYesであれば、ステップS172に進む。また、この判定の結果がNoであれば、ステップS178に進む。
ステップS172では、受け取ったHelloパケットの送信元LSが、マージクラスタリストのSIDまたは自身のクラスタ情報128に含まれるノード装置の識別子(NID)に含まれているかどうかを判定する。この判定の結果がYesであれば、ステップS174に進む。また、この判定の結果がNoであれば、ステップS178に進む。
ステップS174では、自身のクラスタ情報128に含まれる情報を削除し、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれる情報を自身のクラスタ情報128に上書きする。
ステップS174の次のステップS176では、自身のノード装置のマージクラスタリスト132に含まれる情報を削除して、クラスタ情報更新部108の処理を終了する。
ステップS178では、クラスタ統合先候補通知部の処理を行う。
ステップS178の処理が終わると、クラスタ情報更新部108の処理を終了する。
図17は、クラスタ生成部110の動作の例を示すフローチャートである。
ステップS180でクラスタ生成部110は、クラスタ情報128のendフラグの値が「true」であるかを判定する。endフラグの値が「true」であれば、新たなノード装置をクラスタに追加することはできない。この判定の結果がNo、すなわちendフラグの値が「false」であれば、新たなノード装置をクラスタに追加することができる。この判定の結果がYes、すなわちendフラグの値が「true」であれば、クラスタ生成部110の処理は終了する。endフラグの値が「false」であれば、ステップS182に進む。
endフラグの値が「false」の場合、クラスタ生成部110は、受信したHelloパケットのフリーノードリスト(FNL)フィールドに含まれるフリーノード情報が、自身のノード装置で作成したクラスタに参加しようとしているノード装置の識別子であるかを確認する。このため、S182でクラスタ生成部110は、受信したHelloパケットのフリーノードリスト(FNL)フィールドに含まれるクラスタ識別子(CID)と、クラスタ情報128に含まれているクラスタ識別子(CID)が異なるかどうかを判定する。この判定の結果がNo、すなわちフリーノード情報とクラスタ情報128に含まれているクラスタ識別子(CID)が一致する場合、クラスタ生成部110は、自身のノード装置が生成しているクラスタに対して、参加が要求されたと認識する。そして、ステップS184に進む。この判定の結果がYesであれば、クラスタ生成部110の処理は終了する。
S184でクラスタ生成部110は、フリーノード情報に含まれているノード装置の識別子(NID)をクラスタ情報128に追加し、クラスタに参加させる。S184の処理が終了すると、クラスタ生成部110の処理は終了する。
図18は、フリーノードリスト生成部112の動作の例を示すフローチャートである。
ステップS190およびS200はそれぞれ、ステップ180およびステップS182と同様の処理である。
ステップS190でフリーノードリスト生成部112は、クラスタ情報128のendフラグの値がtrueであるかを判定する。この判定の結果がYes、すなわちendフラグの値がtrueであれば、フリーノードリスト生成部112の処理は終了する。endフラグの値がfalseであれば、ステップS200に進む。
ステップS200でフリーノードリスト生成部112は、受信したHelloパケットのフリーノードリスト(FNL)フィールドに含まれるクラスタ識別子(CID)と、クラスタ情報128に含まれているクラスタ識別子(CID)が異なるかどうかを判定する。この判定の結果がNoの場合、フリーノードリスト生成部112は、自身のノード装置が生成しているクラスタに対して、参加が要求されたと認識する。そして、ステップS202に進む。この判定の結果がYesであれば、フリーノードリスト生成部112の処理は終了する。
ステップS202でフリーノードリスト生成部112は、受信したHelloパケットのフリーノードリスト(FNL)フィールドに含まれるノード装置の識別子(NID)が、クラスタ情報128に含まれているかどうかを判定する。この判定の結果がNoの場合、すなわちフリーノードリスト(FNL)フィールドに含まれるノード装置の識別子(NID)が、クラスタ情報128に含まれてない場合、ステップS204に進む。この判定の結果がYesであれば、フリーノードリスト生成部112の処理は終了する。
ステップS204でフリーノードリスト生成部112は、フリーノードリスト(FNL)フィールドに含まれるノード装置の識別子(NID)をフリーノードリスト130に追加する。ステップS204の処理が終了すると、フリーノードリスト生成部112の処理は終了する。
図19は、クラスタ統合先候補通知部114の動作の例を示すフローチャートである。
図19に示されている処理で各ノードは、自身が所属しているクラスタのクラスタ識別子(CID)と異なるクラスタ情報(CI)を含むHelloパケットを受信した場合に、クラスタ統合段階に移行しているかどうかを、クラスタのノード装置の数に変化がなくなった時点からのタイマがタイムアウトしているかに基づいて判断する。クラスタ統合段階に移行していれば、自身のノード装置のクラスタ情報128と、受信したHelloパケットのクラスタ情報(CI)から両方のクラスタのノード数を合計し、上限を超えていなければ、クラスタ統合可能と判断する。クラスタ統合可能で、自身ノード装置が属するクラスタがスレーブ側クラスタであった場合は、クラスタ統合先候補(マスタ側クラスタに属するノード装置)をマージクラスタリスト(MCL)のSIDに設定する。また、起点ノードの場合はクラスタ統合受付部へ設定したマージクラスタリストを渡す。
ステップS210でクラスタ統合先候補通知部114は、受信したHelloパケットのクラスタ情報(CI)フィールドのクラスタ識別子(CID)が、自身のクラスタ情報128に格納されているクラスタ識別子(CID)が異なるかどうかを判定する。このときのHelloパケットは、クラスタ統合先候補通知としての意味を持つ。この判定の結果がYesの場合、すなわち受信したHelloパケットのクラスタ情報(CI)フィールドのクラスタ識別子(CID)が、自身のクラスタ情報128に格納されているクラスタ識別子(CID)が異なる場合、ステップS212に進む。
ステップS212でクラスタ統合先候補通知部114は、ノード装置の数に変化がなくなった時点からの一定時間のタイムアウトをしているかを判断する。この判定の結果がYesの場合、クラスタ統合先候補通知部114は、クラスタ統合段階に移行していることを認識する。そして、ステップS214に進む。
ステップS214でクラスタ統合先候補通知部114は、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれるノード装置の識別子(NID)と、自身のクラスタ情報128に格納されているノード装置の識別子(NID)のエントリ数の合計が、クラスタあたりのノード装置の数の上限である最大クラスタノード数以下であるかを判定する。この判定の結果がYesの場合は、Helloパケットの送信元のノード装置が属するクラスタと、自身が属するクラスタは統合可能である。そして、ステップS216に進む。
ステップS216でクラスタ統合先候補通知部114は、自身が属するクラスタがスレーブ側であるかどうかを判定する。この判定の結果がYesの場合、ステップS216に進む。
ステップS218でクラスタ統合先候補通知部114は、受信したHelloパケットのマージクラスタリスト(MCL)が空であるかどうかを判定する。この判定の結果がYesの場合、ステップS220に進む。
ステップS220でクラスタ統合先候補通知部114は、クラスタ統合先候補、すなわちマスタ側クラスタに属し、自身と隣接するノード装置をマージクラスタリスト(MCL)のSIDに設定する。
ステップS220の次のS222でクラスタ統合先候補通知部114は、自身が起点ノードであるかを判定する。この判定の結果がYesの場合、ステップS224に進む。
ステップS224でクラスタ統合先候補通知部114は、クラスタ統合要求受付部116へ設定したマージクラスタリストを渡す。そして、クラスタ統合先候補通知部114の処理は終了する。
また、ステップS210、S212、S214、S216、S218、S222の判定の結果がNoであれば、クラスタ統合先候補通知部114の処理を終了する。
図20は、クラスタ統合要求受付部116の動作の例を示すフローチャートである。
図20に示されている処理で起点ノードは、他のクラスタからのクラスタ統合先候補通知が競合していないかを自身のノード装置のマージクラスタリスト132に含まれる情報に基づいて比較、判断し、クラスタ統合先候補通知を受け付ける。
起点ノードは、クラスタ統合先候補通知を受け付けたことを受け、自身のノード装置の識別子(NID)をマージクラスタリスト132に追加する。
ステップS230でクラスタ統合要求受付部116は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるマスタ側クラスタのノード装置の識別子(SID)が、自身のクラスタ情報128に含まれないかどうかを判定する。この判定の結果がYesの場合、ステップS232に進む。この判定の結果がNoの場合、クラスタ統合要求受付部116の処理を終了する。
ステップS232でクラスタ統合要求受付部116は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドのノード装置の識別子(NID)が未設定であるかどうかを判定する。この判定の結果がYesの場合、ステップS238に進む。この判定の結果がNoの場合、ステップS234に進む。
ステップS234でクラスタ統合要求受付部116は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるマスタ側クラスタのノード装置の識別子(SID)が、自身のマージクラスタリスト132に含まれるマスタ側クラスタのノード装置の識別子(SID)と同じであるかどうかを判定する。この判定の結果がYesの場合、ステップS236に進む。この判定の結果がNoの場合、クラスタ統合要求受付部116の処理を終了する。
ステップS236でクラスタ統合要求受付部116は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるノード装置の識別子(NID)を、自身のマージクラスタリスト132に含まれるノード装置の識別子(NID)にマージする。
ステップS232の判定の結果がYesの場合、すなわち受信したHelloパケットのマージクラスタリスト(MCL)フィールドのノード装置の識別子(NID)が未設定であると判定された場合は、ステップS238の処理を行う。
ステップS238でクラスタ統合要求受付部116は、自身のマージクラスタリスト132に含まれるノード装置の識別子(NID)に自身のノード装置の識別子(NID)を設定する。そして、クラスタ統合要求受付部116の処理は終了する。
図21は、クラスタ統合要求更新部118の動作の例を示すフローチャートである。
図21に示されている処理で参加ノードは、マージクラスタリスト(MCL)に自身のノード装置が属するクラスタの起点ノードが設定されていることでクラスタ統合要求通知を受付けたことを判断し、自身のノード装置の識別子を自身のマージクラスタリスト132に追加する。
ステップS240でクラスタ統合要求更新部118は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるマスタ側クラスタのノード装置の識別子(SID)が、自身のクラスタ情報128に含まれないかどうかを判定する。この判定の結果がYesの場合、S250に進んでクラスタ統合リスト生成部120の処理を行い、クラスタ統合要求更新部118の処理を終了する。この判定の結果がNoの場合、ステップS242に進む。
ステップS242でクラスタ統合要求更新部118は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドのノード装置の識別子(NID)が未設定であるかどうかを判定する。この判定の結果がNoの場合、ステップS244に進む。この判定の結果がYesの場合、ステップS248に進む。
ステップS248でクラスタ統合要求更新部118は、自身のマージクラスタリスト132に、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるマスタ側クラスタのノード装置の識別子(SID)を設定する。そして、クラスタ統合要求更新部118の処理は終了する。
ステップS244でクラスタ統合要求更新部118は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドのノード装置の識別子(NID)が、自身のクラスタ情報126に含まれるかどうかを判定する。この判定の結果がNoの場合、クラスタ統合要求更新部118の処理は終了する。この判定の結果がYesの場合、ステップS246に進む。
ステップS246でクラスタ統合要求更新部118は、自身のノード装置のマージクラスタリスト132に格納されるノード装置の識別子(NID)に自身のノード装置の識別子を追加する。そして、クラスタ統合要求更新部118の処理は終了する。
図22は、クラスタ統合リスト生成部120の動作の例を示すフローチャートである。
マスタ側の対向ノードは、自身のノード装置のクラスタ情報128に格納されるノード装置の識別子(NID)と、受信したクラスタ統合要求通知のマージクラスタリスト(MCL)フィールに含まれるノード装置の識別子(NID)とが完全に一致するかどうかを確認する。一致すれば受信したHelloパケット(クラスタ統合要求通知)のマージクラスタリスト(MCL)フィールに含まれるノード装置の識別子(NID)を自身のノード装置のクラスタ情報128に格納されるノード装置の識別子(NID)に設定する。
ステップS260でクラスタ統合リスト生成部120は、自身のノード装置のマージクラスタリスト132は空かどうかを判定する。この判定の結果がYesであれば、S262に進む。
ステップS262でクラスタ統合リスト生成部120は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるマスタ側クラスタのノード装置の識別子(SID)が、自身のノード装置の識別子であるかどうかを判定する。この判定の結果がYesであれば、S264に進む。
ステップS264でクラスタ統合リスト生成部120は、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれるノード装置の識別子(NID)と、自身のクラスタ情報128に格納されているノード装置の識別子(NID)が一致するかどうかを判定する。この判定の結果がYesであれば、S266に進む。
ステップS266でクラスタ統合リスト生成部120は、受信したHelloパケットのクラスタ情報(CI)フィールドに含まれるノード装置の識別子(NID)を、自身のマージノードリスト134に設定する。そして、クラスタ統合リスト生成部120の処理を終了する。
また、ステップS260,S262、S264の判定の結果がNoの場合は、クラスタ統合リスト生成部120の処理を終了する。
図23はクラスタ統合処理部122の動作の例を示すフローチャートである。
起点ノードは、クラスタ統合要求の競合確認し、受信したHelloパケットのマージノードリスト(MNL)に含まれるノード装置の識別子(NID)の数と自身のノード装置のクラスタ情報128に格納されているノード装置の数の合計が、クラスタあたりのノード装置の数の上限である最大クラスタノード数以下であれば、ノード装置のクラスタ情報128に受信したHelloパケットのマージノードリスト(MNL)に含まれるノード装置の識別子(NID)を追加することでクラスタ統合を実施する。
ステップS270でクラスタ統合処理部122は、自身のノード装置のマージクラスタリスト132が未設定であるかを判定する。この判定の結果がYesであれば、S272に進む。
ステップS272でクラスタ統合処理部122は、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるノード装置の識別子(NID)の数と、自身のクラスタ情報128に格納されているノード装置の識別子(NID)の数の合計が、クラスタあたりのノード装置の数の上限である最大クラスタノード数以下であるかどうかを判定する。この判定の結果がYesであれば、S274に進む。
ステップS274でクラスタ統合処理部122は、自身のクラスタ情報128に、受信したHelloパケットのマージクラスタリスト(MCL)フィールドに含まれるノード装置の識別子(NID)を追加して、クラスタを統合する。そして、クラスタ統合処理部122の処理を終了する。
また、ステップS270、S272の判定の結果がNoであれば、クラスタ統合処理部122の処理を終了する。
図24と図25は、クラスタ統合リスト通知部124の動作の例を示すフローチャートである。
参加ノードは、クラスタ統合要求の競合を確認し、受信したHelloパケットのマージノードリスト(MNL)フィールドに含まれるノード装置の識別子(NID)をマージノードリスト134に含まれるノード装置の識別子(NID)に設定する。
図24は、複数のクラスタから統合要求通知が送られてきたとき、複数のクラスタの1つのクラスタと統合するときのクラスタ統合リスト通知部124の動作の例を示すフローチャートである。
ステップS280でクラスタ統合リスト通知部124は、自身のノード装置のマージクラスタリスト132が空かどうかを判定する。この判定の結果がYesであれば、S282に進む。
ステップS282でクラスタ統合リスト通知部124は、自身のマージノードリスト134が未設定であるかどうかを判定する。この判定の結果がYesであれば、S284に進む。
ステップS284でクラスタ統合リスト通知部124は、受信したHelloパケットのマージノードリスト(MNL)フィールドに含まれるノード装置の識別子(NID)をマージノードリスト134に含まれるノード装置の識別子(NID)に設定する。そして、クラスタ統合リスト通知部124の処理を終了する。
また、ステップS280、S282の判定の結果がNoであれば、クラスタ統合リスト通知部124の処理を終了する。
図25は、複数のクラスタから統合要求通知が送られてきたとき、複数のクラスタと同時に統合するクラスタ統合リスト通知部124の動作の例を示すフローチャートである。
ステップS290でクラスタ統合リスト通知部124は、ステップS280と同様の処理を行う。すなわち、自身のノード装置のマージクラスタリスト132が空かどうかを判定する。この判定の結果がYesであれば、S292に進む。この判定の結果がNoであれば、クラスタ統合リスト通知部124の処理を終了する。
ステップS292でクラスタ統合リスト通知部124は、ステップS284と同様の処理を行う。ステップS292でクラスタ統合リスト通知部124は、受信したHelloパケットのマージノードリスト(MNL)フィールドに含まれるノード装置の識別子(NID)をマージノードリスト134に含まれるノード装置の識別子(NID)に設定する。そして、クラスタ統合リスト通知部124の処理を終了する。
<クラスタ統合の処理シーケンス>
図26〜28を参照して、クラスタ統合の処理の例を説明する。
図26は、クラスタ統合前のネットワークのトポロジーの例を示す図である。図26は、クラスタ形成の第1段階であるクラスタ生成段階ではクラスタあたりの最大ノード数を3とし、第2段階であるクラスタ統合段階ではクラスタあたりの最大ノード数を6として、クラスタ生成段階が完了している状態を示している。
以下では、図26のクラスタAとクラスタEが統合して図27に示されている状態に移行する際の処理の例について説明する。
図26では、クラスタAは、ノード装置の識別子NID=A、B、Cの3つのノード装置を含み、起点ノードはノード装置の識別子NID=Aのノード装置である。クラスタEはノード装置の識別子NID=D、Eの2つのノード装置を含み、起点ノードはノード装置の識別子NID=Eのノード装置である。
図27では、図26のクラスタAとクラスタEが統合されて、ノード装置の識別子NID=A、B、C、D、Eの5つのノード装置を含み、起点ノードがノード装置の識別子NID=Aのノード装置であるクラスタAが形成されている。
図28は、クラスタAとクラスタEが統合して図27に示されている状態に移行する際の処理の例を説明するシーケンス図である。
クラスタEがクラスタ統合段階に移行すると、クラスタEのノード装置DがHelloパケット(a)をノード装置Cに送る。Helloパケット(a)のクラスタ情報(CI)には、
CI:<CID、{NID}、end>=<E、{D、E}、false>
なる情報が格納されている。
クラスタEのノード装置DからHelloパケット(a)を受けたクラスタAのノード装置Cは、Helloパケット(b)をノード装置Dに送る。Helloパケット(b)のクラスタ情報(CI)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C}、false>
なる情報が格納されている。
ノード装置Dは、ノード装置Dのクラスタ情報128に含まれている、ノード装置Dが属するクラスタEが含むノード装置の数と、Helloパケット(b)のクラスタ情報(CI)フィールドに含まれているノード装置の識別子{A、B、C}の数を加えて、統合段階ではクラスタあたりの最大ノード数を6以下であることを確認する。そして、 ノード装置Dは、ノード装置Cから受けたHelloパケット(b)の送信元Cを自身のマージクラスタリスト132のSIDに登録(1)を行う。
次に、クラスタ統合先候補通知としてのHelloパケット(c)をクラスタE内にブロードキャスト送信する通知処理(2)を行う。このとき、Helloパケット(c)のクラスタ情報(CI)フィールドとマージクラスタリスト(MCL)フィールドには、
CI:<CID、{NID}、end>=<E、{D、E}、false>
MCL:<SID、{NID}>=<C、{}>
なる情報が格納されている。
ノード装置DからHelloパケット(c)を受けたノード装置Eは、起点ノードなのでクラスタ統合要求が競合していないことを確認する。さらに、ノード装置Eのマージクラスタリスト132にノード装置の識別子(NID)を設定する設定処理(4)を行う。ここでは、自身のマージクラスタリスト132を更新し、マージクラスタリスト132にノード装置Eが含まれるようにする更新処理(3)を行う。 次に、ノード装置Eは、Helloパケット(d)をクラスタE内にブロードキャスト送信する。Helloパケット(d)のクラスタ情報(CI)フィールドとマージクラスタリスト(MCL)フィールドには、
CI:<CID、{NID}、end>=<E、{D、E}、false>
MCL:<SID、{NID}>=<C、{E}>
なる情報が格納されている。
ノード装置EからHelloパケット(d)を受けたノード装置Dは、受けたHelloパケット(d)のマージクラスタリストに起点ノードEを含んでいる事で、クラスタ統合要求が受付済みであることを認識し、自身のマージクラスタリスト132を更新し、ノード装置Dが含まれるようにし、クラスタ統合要求が受付済みであることを伝播する処理(5)を行う。ノード装置Dは、Helloパケット(e)をブロードキャスト送信する。Helloパケット(e)のクラスタ情報(CI)フィールドとマージクラスタリスト(MCL)フィールドには、
CI:<CID、{NID}、end>=<E、{D、E}、false>
MCL:<SID、{NID}>=<C、{D、E}>
なる情報が格納されている。
ノード装置DからHelloパケット(e)を受けたノード装置C(ノード装置Dの対向ノード)は、Helloパケット(e)のマージクラスタリスト(MCL)フィールドに格納されているノード装置の識別子({NID}={D、E})の数とクラスタ情報(CI)フィールドに含まれているノード装置の識別子{D、E}の数を確認し、一致すればマージノードリスト134に写し替える登録処理(7)を行う。
次に、ノード装置CはHelloパケット(f)をクラスタA内にブロードキャスト送信する。Helloパケット(f)のクラスタ情報(CI)フィールドとマージノードリスト(MNL)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C}、false>
MNL:<{NID}>=<{D、E}>
なる情報が格納されている。
ノード装置CからHelloパケット(f)を受信したノード装置Bは、Helloパケット(f)のマージノードリスト(MNL)フィールドに格納されているノード装置の識別子({NID}={D、E})をノード装置Bのマージノードリスト134に写し替える登録処理(8)を行う。
ノード装置Bは、Helloパケット(g)をクラスタA内にブロードキャスト送信する。Helloパケット(g)のクラスタ情報(CI)フィールドとマージノードリスト(MNL)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C}、false>
MNL:<{NID}>=<{D、E}>
なる情報が格納されている。
Helloパケット(g)を受信した起点ノードAは、クラスタ統合要求が競合していないことを確認する。そして、マージノードリスト134に含まれているノード装置の識別子{D、E}の数と、クラスタ情報126に含まれているノード装置Aが属するクラスタAのノード装置の数の合計が最大クラスタノード数以下であれば、クラスタ情報126にHelloパケット(g)のマージノードリスト(MNL)フィールドに含まれるノード{D、E}を追加する更新処理(9)を行う。
そして、ノード装置Aは、クラスタ統合後のクラスタ情報126に含まれている情報を用いてHelloパケット(h)を生成し、送信処理(10)を行う。Helloパケット(h)のクラスタ情報(CI)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C、D、E}、false>
なる情報が含まれている。
ノード装置AからHelloパケット(h)を受けたノード装置Bは、Helloパケット(h)のクラスタ情報(CI)フィールドに含まれているノード装置の識別子{A、B、C、D、E}に、ノード装置Bのマージノードリスト(MNL)と一致するものがあれば、ノード装置Bのマージノードリスト134からそのノード装置の識別子(NID)を削除し、クラスタ情報128を書き換える処理(11)を行う。
処理(11)を行った後、ノード装置Bは、Helloパケット(i)を送信する。Helloパケット(i)のクラスタ情報(CI)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C、D、E}、false>
なる情報が含まれている。
ノード装置BからHelloパケット(i)を受けたノード装置Cは、処理(11)と同様の処理(12)を行う。すなわちノード装置Cは、Helloパケット(i)のクラスタ情報(CI)フィールドに含まれているノード装置の識別子{A、B、C、D、E}に、ノード装置Cのマージノードリスト134と一致するものがあれば、ノード装置Cのマージノードリスト(MNL)からそのノード装置の識別子(NID)を削除し、クラスタ情報128を書き換える処理(12)を行う。
処理(12)を行った後、ノード装置Cは、Helloパケット(j)を送信する。Helloパケット(j)のクラスタ情報(CI)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C、D、E}、false>
なる情報が含まれている。
ノード装置CからHelloパケット(j)を受けたノード装置Dは、自身のマージクラスタリスト132に自ノード装置Dが含まれているので統合される状態であり、Helloパケット(j)のクラスタ情報(CI)フィールドに含まれているノード装置の識別子{A、B、C、D、E}に、ノード装置Dが含まれ、すなわち統合が許可された情報であり、かつ、このHelloパケット(j)の送信元であるノード装置Cは、自身のマージクラスタリスト132のSIDと一致しているため、Helloパケット(j)のクラスタ情報(CI)フィールドのクラスタ情報(CI)フィールドに含まれているノード装置と自身のマージクラスタリスト132のNIDが一致するものを自身のマージクラスタリスト132から削除し、Helloパケット(j)のクラスタ情報(CI)フィールドのクラスタ情報(CI)フィールドに含まれているノード装置、を自身のクラスタ情報128に書き換える処理(13)を行う。この処理後、ノード装置DはクラスタAに所属する。
処理(13)を行った後、ノード装置Cは、Helloパケット(k)を送信する。Helloパケット(k)のクラスタ情報(CI)フィールドには、
CI:<CID、{NID}、end>=<A、{A、B、C、D、E}、false>
なる情報が含まれている。
ノード装置DからHelloパケット(k)を受けたノード装置Eは、自身のマージクラスタリスト132に自ノード装置Eが含まれているので統合される状態であり、Helloパケット(k)のクラスタ情報(CI)フィールドに含まれているノード装置の識別子{A、B、C、D、E}に、ノード装置Eが含まれ、すなわち統合が許可された情報であり、かつ、このHelloパケット(k)の送信元であるノード装置Dは、ノード装置Eのクラスタ情報128に含まれているため、Helloパケット(k)のクラスタ情報(CI)フィールドのクラスタ情報(CI)フィールドに含まれているノード装置と自身のマージクラスタリスト132のNIDが一致するものを自身のマージクラスタリスト132から削除し、Helloパケット(k)のクラスタ情報(CI)フィールドのクラスタ情報(CI)フィールドに含まれているノード装置、を自身のクラスタ情報128に書き換える処理(14)を行う。この処理後、ノード装置EはクラスタAに所属する。
このようにして図27に示されているように、図26のクラスタAとクラスタEが統合されて、ノード装置の識別子NID=A、B、C、D、Eの5つのノード装置を含み、起点ノードがノード装置の識別子NID=Aのノード装置であるクラスタAが形成される。
図29は、上述の比較例で開示されたノード装置を用いてクラスタを形成した結果を示す図である。また、図30は、上述の実施形態で開示されたノード装置を用いてクラスタを形成した結果を示す図である。実施形態では、小さなサイズ、すなわち含まれるノード装置の数が少ないクラスタが減っていることが分かる。
このように、Helloパケットの送受信のみでクラスタ生成処理およびクラスタ統合処理の2段階でクラスタ形成を行う事で、ネットワークにかかる負荷を軽減し、且つ、クラスタヘッドの負荷を減らしつつ、クラスタ形成を行うことができる。クラスタ統合処理を実行することによって、クラスタ数は減少しルーティング時のクラスタを跨ぐ数を減らすことができる。さらに、処理リソースが減少することでアドホックネットワークのスループット向上が可能となる。