JP5673840B2 - ノード装置および通信方法 - Google Patents
ノード装置および通信方法 Download PDFInfo
- Publication number
- JP5673840B2 JP5673840B2 JP2013534492A JP2013534492A JP5673840B2 JP 5673840 B2 JP5673840 B2 JP 5673840B2 JP 2013534492 A JP2013534492 A JP 2013534492A JP 2013534492 A JP2013534492 A JP 2013534492A JP 5673840 B2 JP5673840 B2 JP 5673840B2
- Authority
- JP
- Japan
- Prior art keywords
- cluster
- node
- node device
- gateway
- data packet
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims description 118
- 238000004891 communication Methods 0.000 title claims description 18
- 230000005540 biological transmission Effects 0.000 claims description 59
- 238000003860 storage Methods 0.000 claims description 8
- 238000012545 processing Methods 0.000 description 201
- 235000008694 Humulus lupulus Nutrition 0.000 description 25
- 238000012546 transfer Methods 0.000 description 23
- 230000004044 response Effects 0.000 description 18
- 238000012790 confirmation Methods 0.000 description 14
- 238000004519 manufacturing process Methods 0.000 description 12
- 238000010586 diagram Methods 0.000 description 7
- 230000015654 memory Effects 0.000 description 6
- 238000010276 construction Methods 0.000 description 5
- 239000000284 extract Substances 0.000 description 3
- 230000004083 survival effect Effects 0.000 description 3
- 241000854291 Dianthus carthusianorum Species 0.000 description 2
- 101150093282 SG12 gene Proteins 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 101100011863 Arabidopsis thaliana ERD15 gene Proteins 0.000 description 1
- 101150021084 CID2 gene Proteins 0.000 description 1
- 101100191082 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GLC7 gene Proteins 0.000 description 1
- 101100274406 Schizosaccharomyces pombe (strain 972 / ATCC 24843) cid1 gene Proteins 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 238000005304 joining Methods 0.000 description 1
- 230000005577 local transmission Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000003936 working memory Effects 0.000 description 1
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04W—WIRELESS COMMUNICATION NETWORKS
- H04W36/00—Hand-off or reselection arrangements
- H04W36/16—Performing reselection for specific purposes
- H04W36/22—Performing reselection for specific purposes for handling the traffic
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L45/00—Routing or path finding of packets in data switching networks
- H04L45/02—Topology update or discovery
- H04L45/04—Interdomain routing, e.g. hierarchical routing
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Mobile Radio Communication Systems (AREA)
Description
本発明は、ネットワークに属する複数のノード装置の間での通信方法と、ノード装置に関する。
無線アドホックネットワークに属するノード装置は、ルーティング情報を伝播させるために、Helloパケットを用いる。例えば、図1に示すアドホックネットワークに属するノード装置Aは、ノード装置Aが保持しているルーティング情報を含むHelloパケットを生成し、周期的にブロードキャストする。Helloパケットを受信したノード装置Bは、ノード装置Bが保持しているルーティング情報と、Helloパケットに含まれている情報を比較し、ノード装置Bが保持していなかったルーティング情報をHelloパケットから取得する。さらに、ノード装置Bは、Helloパケットから経路の品質情報も取得し、なるべく品質情報の良い経路を用いて通信を行う。この品質情報には、ループ情報も含まれている。このように、アドホックネットワークに属するノード装置は、Helloパケットを用いて、ネットワーク中に含まれている他のノード装置への経路情報を学習し、得られた最適経路を用いて通信を行う。ここで、アドホックネットワークに含まれている各ノード装置は、アドホックネットワーク中の他の全てのノード装置までの経路をルーティングテーブル中に保持する。例えば、ノード装置Aは、アドホックネットワーク中のノード装置A以外のノード装置の各々への経路情報をルーティングテーブルに保持する。このため、ノード装置Aは、例えば、ノード装置Bを介してノード装置Cにデータパケットを送信することができる。
関連する技術として、パケットを受信したノード装置が、予め記憶していた送信対象パケットの識別情報と、受信パケットの識別情報を比較する通信方法が知られている。この方法では、比較結果に基づいて、受信パケットの最終宛先への経路についての送信可能性が判断される。また、パケットの最終宛先ノードごとに、パケットを中継するノードについての重み付けを行い、重み付けの結果に基づいて、パケットの送り先を決定する方法も考案されている。さらに、互いに近傍に配置された複数のノード装置でクラスタを形成し、クラスタの中からクラスタヘッドを選択する際に、より多くの隣接ノードを持つノード装置がより高い確率でクラスタヘッドに選択されるようにする方法が知られている。また、無線センサーノードの位置情報とお互いの電波強度を元に安定した経路をツリー状に構築して、グループ分割する方法も考案されている。
背景技術で述べた方法では、ネットワーク中に含まれるノード装置の数が増加すると、各ノード装置が保持するルーティングテーブルの大きさが大きくなってしまうという問題がある。ネットワーク中のノード装置をクラスタやグループに分ける方法であっても、形成されるクラスタやグループの規模が大きくなると、ルーティングテーブルが大きくなるという問題がある。
本発明は、ノード装置が保持するルーティングテーブルの容量を抑えることを目的とする。
実施形態に係る装置は、受信部、参加要求部、ルーティングテーブル、生成要求部、および、送信部を備える。受信部は、ネットワークの経路情報を通知する経路情報パケットを受信する。参加要求部は、隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置の中から選択した第1のノード装置に、自身が所属している第1のクラスタへの参加を要求するための参加要求パケットを生成する。ルーティングテーブルは、前記第1のクラスタに所属している各所属ノード装置までの経路を記憶する。生成要求部は、前記第1のクラスタに所属する所属ノード装置の数が閾値を超えると、前記第1のクラスタに所属していない第2のノード装置に、前記第1のクラスタとは異なる第2のクラスタの生成を要求するための生成要求パケットを生成する。送信部は、前記参加要求パケットを前記第1のノード装置に送信し、前記生成要求パケットを前記第2のノード装置に送信する。
ルーティングテーブルの容量が抑制される。
図2は、生成されたクラスタの例を示す。図2の例では、図1に示したアドホックネットワークがクラスタC1〜C3の3つに分けられている。アドホックネットワークに含まれるノード装置の各々は、ネットワークの経路情報を通知する経路情報パケットを送受信することにより、隣接ノード装置を認識する。以下の説明では、経路情報パケットはHelloパケットであるものとする。ここで、あるノード装置の「隣接ノード装置」は、あるノード装置から送信されたパケットを受信することができる範囲内に位置するノード装置のことを指すものとする。
起点ノード装置は、隣接ノード装置に対して、起点ノード装置が所属するクラスタと同じクラスタに所属するように要求するための制御パケットを送信する。ここで、起点ノード装置は、予め、1つのクラスタに含めることができるノード装置の数を表す閾値を記憶しており、閾値以下の数のノード装置を1つのクラスタに含める。クラスタに参加すると、ノード装置は、参加したクラスタを識別する識別子を含めたHelloパケットを送信する。ノード装置は、同じクラスタに所属しているノード装置までの経路をルーティングテーブルに記録する。しかし、ノード装置は、所属するクラスタが異なるノード装置の情報はルーティングテーブルに記録しない。
各クラスタでは、隣接するクラスタ中のノード装置と通信可能なノード装置から「サブゲートウェイ」(sub gateway、SGW)が選択される。図2の例では、四角で示すノード(SG11〜SG32)がサブゲートウェイであるものとする。サブゲートウェイとして動作するノード装置は、そのノード装置が所属しているクラスタに隣接するクラスタ中に含まれているサブゲートウェイの情報もルーティングテーブルに含めるものとする。例えば、サブゲートウェイSG21は、SG12の情報を保持している。従って、ノード装置は、所属するクラスタとは異なるクラスタ中のノード装置に、サブゲートウェイを介してパケットを送信することができる。例えば、クラスタC2に属するノード装置は、サブゲートウェイSG21とSG12を介してクラスタC1に所属しているノード装置にパケットを送信することができる。
このように、各クラスタに所属するノード装置の数に上限を設け、サブゲートウェイ以外のノード装置が保持するルーティングテーブルには各クラスタ中のノード装置までの経路を記録するようにすると、ノード装置中のルーティングテーブルの肥大化を抑えることができる。また、サブゲートウェイは、サブゲートウェイが所属しているクラスタ中のノード装置への経路に加えて、隣接するクラスタ中のノードの情報も含む。このため、ノード装置は、サブゲートウェイを介して異なるクラスタに所属するノードにパケットを送信することができる。また、サブゲートウェイが保持する経路情報も、サブゲートウェイが所属しているクラスタ中のノード装置までの経路と、隣接するクラスタに所属するノード装置までの経路である。このため、サブゲートウェイに選択されたノード装置であっても、ルーティングテーブルに含まれる経路の数は、ネットワーク全体に含まれているノード装置の各々への経路の数に比べて小さくなる。従って、実施形態にかかる方法により、ネットワーク中のノード装置が保持するルーティングテーブルの大きさを小さくすることができる。
<装置構成>
図3は、ノード装置10の構成の例を示す。ノード装置10は、受信部11、パケット分岐処理部12、FID(frame identification)生成部13、上位処理部14、Hello生成部15、送信部16、Hello処理部20、受信処理部30、クラスタ処理部40、検索処理部70、データ処理部80、記憶部90を備える。受信部11は、隣接するノード装置10からパケットを受信する。
図3は、ノード装置10の構成の例を示す。ノード装置10は、受信部11、パケット分岐処理部12、FID(frame identification)生成部13、上位処理部14、Hello生成部15、送信部16、Hello処理部20、受信処理部30、クラスタ処理部40、検索処理部70、データ処理部80、記憶部90を備える。受信部11は、隣接するノード装置10からパケットを受信する。
図4(a)は、ノード装置10の間で送受信されるパケットの構成の例を示す。パケットは、ヘッダとペイロードを有する。ヘッダは、パケットの種類によらず共通の形式であり、Typeフィールド、Lengthフィールド、グローバル宛先(Global Destination、GD)フィールド、グローバル送信元(Global Source、GS)フィールド、ローカル送信元(Local Source、LS)フィールド、ローカル宛先(Local Destination、LD)フィールドを含む。以下の説明で、「グローバル宛先」は、パケットの最終的な宛先のノード装置10を示すものとする。一方、「ローカル宛先」は、パケットをグローバル宛先に送信するために行われる1ホップの転送の際に、宛先として指定されるノード装置10を示す。「ローカル送信元」は、パケットが1ホップ転送される場合の転送元のノード装置10を指す。「グローバル送信元アドレス」は、パケットを生成したノード装置10を示すものである。装置を示すものは(MAC)アドレス等、装置固有の識別子(ID)であっても良い。
Typeフィールドは、ペイロードに含まれるデータの種類を示す。Typeフィールドの値とパケットの種類の関係の例を図4(b)のテーブルに表す。Helloパケットでは、Typeフィールドの値が「0」に設定されている。Typeフィールドの値が「1」であるパケットはクラスタデータパケット(CDP)である。また、Typeフィールドの値が「2」であるパケットはハイウェイデータパケット(HDP)、「3」であるパケットはデータパケット(DP)である。また、Typeフィールドの値が「4」であるパケットは、検索データパケット(SDP)である。個々のパケットについては後で詳しく説明する。これらのパケットのうち、クラスタデータパケット、検索データパケット、および、Helloパケットは、ノード装置10の制御に用いられる。以下の記載では、クラスタデータパケット、検索データパケット、もしくは、Helloパケットのことを「制御パケット」と記載することがある。Lengthフィールドは、パケットの長さを表す。
パケット分岐処理部12は、受信パケットのヘッダ中にあるTypeフィールドの値によって受信パケットの種類を判別し、パケットの種類ごとに予め決められた出力先に出力する。パケット分岐処理部12は、HelloパケットをHello処理部20に出力する。クラスタデータパケットは、クラスタ処理部40に出力され、ハイウェイデータパケットは、データ処理部80に出力される。データパケットは、Acknowledgment(ACK)パケットである場合は受信処理部30に出力されるが、ACKパケット以外のデータパケットはデータ処理部80に出力される。また、パケット分岐処理部12は、検索データパケットを検索処理部70に出力する。なお、パケットに含まれている情報などについては後述する。
Hello処理部20は、経路管理部21、未所属ノード特定部22を備える。Hello処理部20は、Helloパケットに含まれている情報を取得して、リンクテーブル91、クラスタテーブル92、未所属テーブル93、ルーティングテーブル95を更新する。リンクテーブル91、クラスタテーブル92、未所属テーブル93、ルーティングテーブル95は、記憶部90に格納されている。リンクテーブル91は、隣接するノード装置10の識別子に対応付けて、隣接するノード装置10が参加しているクラスタの識別子や、隣接するノード装置10がサブゲートウェイに指定されているかなどの情報を保持する。クラスタテーブル92は、ノード装置10が所属しているクラスタと同じクラスタに所属しているノード装置10の情報などを記録する。未所属テーブル93は、クラスタに所属していないノード装置10についての情報を記録している。なお、以下の説明では、クラスタに所属していないノード装置10を「未所属ノード装置」と記載することがある。ルーティングテーブル95は、ノード装置10が所属するクラスタと同じクラスタに所属しているノード装置10までの経路を記録する。リンクテーブル91、クラスタテーブル92、未所属テーブル93、ルーティングテーブル95については、後で詳しく説明する。
クラスタ処理部40は、クラスタ生成部50、サブゲートウェイ生成部60、デフォルトGW決定部41、クラスタ検索テーブル(CCT)42、隣接クラスタテーブル(NCT)43、ゲートウェイ候補テーブル(SGWCT)44を備える。クラスタ生成部50は、参加要求部51、参加処理部52、生成要求部53、未所属ノード特定部54を備える。起点ノード装置として選択されたノード装置10では、参加要求部51、生成要求部53、未所属ノード特定部54が動作する。一方、起点ノード装置として選択されていないノード装置10では、参加処理部52が動作する。参加要求部51、参加処理部52、生成要求部53、未所属ノード特定部54の動作については後で説明する。クラスタ構築テーブル42は、生成要求部53により新たに起点ノード装置に指定されたノード装置10で参加要求部51が動作するときに使用されるテーブルであり、起点ノード装置に指定したノード装置10の情報などが記録される。また、未所属ノード特定部54は、未所属テーブル93の情報を使用し、適宜、更新する。
サブゲートウェイ生成部60は、隣接クラスタ通知部61、候補テーブル生成部62、サブゲートウェイ決定部63を備える。候補テーブル生成部62とサブゲートウェイ決定部63は、起点ノード装置として動作しているノード装置10で動作する。一方、隣接クラスタ通知部61は、起点ノード装置として動作していないノード装置10と、起点ノード装置の両方で動作できるものとする。隣接クラスタテーブル43とゲートウェイ候補テーブル44は、サブゲートウェイ決定部63および候補テーブル生成部62の動作で参照される。デフォルトGW決定部41は、サブゲートウェイに設定されていないノード装置10で動作する。デフォルトGW決定部41は、ノード装置10が他のクラスタに所属するノード装置10にパケットを送信するために使用するサブゲートウェイ(デフォルトゲートウェイ)を決定する。隣接クラスタ通知部61、候補テーブル生成部62、サブゲートウェイ決定部63、隣接クラスタテーブル43、ゲートウェイ候補テーブル44についても、後で詳しく説明する。
検索処理部70は、検索先決定部71、検索実行部72、サーチログテーブル73を備える。検索先決定部71と検索実行部72は、サブゲートウェイで動作する。検索先決定部71や検索実行部72は、ハイウェイデータパケットの送信先を検索するために、サーチログテーブル73、ハイウェイテーブル94を用いる。ハイウェイデータパケットを用いた通信については後述する。
データ処理部80は、データパケット(DP)処理部81、ハイウェイデータパケット(HDP)処理部82、ペンディングデータテーブル83を備える。ハイウェイデータパケット処理部82は、パケット分岐処理部12から受信したハイウェイデータパケットをデータパケットに変換することができる。ハイウェイデータパケット処理部82は、変換により得られたデータパケットをデータパケット処理部81に出力する。また、データパケット処理部81からのデータパケットをハイウェイデータパケットに変換して送信部16に出力できる。データパケット処理部81は、パケット分岐処理部12から入力されたデータパケットと、ハイウェイデータパケット処理部82から入力されたデータパケット、上位処理部14からのデータパケットを処理する。また、データパケット処理部81は、適宜、データパケットに含まれている情報を上位処理部14に出力することができる。上位処理部14では、上位レイヤのアプリケーションによる処理が行われる。また、データパケット処理部81やハイウェイデータパケット処理部82は、FID生成部13から入力されたFIDを用いてパケットを生成する。ハイウェイデータパケットの処理についても後述する。
受信処理部30は、ACK処理部31とバッファ部32を備える。ACK処理部31は、パケット分岐処理部12から受信したデータパケットの内容を確認し、受信の成功と失敗のいずれが通知されているかを認識する。バッファ部32は、データパケットの送信の失敗と再送に備えて、送信済みのデータパケットを格納している。そこで、受信の成功を表すACKパケットが入力されると、ACK処理部31は、受信したACKパケットで特定されるデータパケットをバッファ部32から削除する。
Hello生成部15は、ノード装置10への経路と、ルーティングテーブル95に記録されている経路を、隣接ノード装置10に通知するためのHelloパケットを生成する。送信部16は、Hello生成部15、クラスタ処理部40、検索処理部70、データ処理部80から入力されたパケットを、隣接ノードに送信する。
記憶部90は、リンクテーブル91、クラスタテーブル92、未所属テーブル93、ハイウェイテーブル94、ルーティングテーブル95のほかに、FID管理テーブル96を備える。FID管理テーブル96は、データパケットが送受信される経路のループ検出に用いられる。データパケット処理部80は、データパケットのGSとFIDを対応付けてFID管理テーブル96に記録する。受信処理部30は、受信したデータパケットのFIDとGSの組み合わせをFID管理テーブル96に記録されている情報と比較する。受信したデータパケットのGSとFIDの組み合わせが既にFID管理テーブル96に記録されている場合、受信処理部30は、データパケットがループによって戻ってきたと判断する。
図5は、ノード装置10のハードウェア構成の例を示す図である。ノード装置10は、MicroProcessingUnit(MPU)100、バス101(101a〜101c)、PHYsical layer(PHY)チップ102、タイマIC104、Dynamic Random access Memory(DRAM)106、フラッシュメモリ107、無線モジュール108を備える。バス101a〜101cは、MPU100、PHYチップ102、タイマIC104、DRAM106、フラッシュメモリ107、無線モジュール108の間でデータの入出力が可能になるように接続する。
MPU100は、フラッシュメモリ107に格納されたファームウェアなどのプログラムを読み込んで処理を行う。このとき、MPU100は、DRAM106をワーキングメモリとして使用できる。MPU100は、パケット分岐処理部12、FID生成部13、上位処理部14、Hello生成部15、Hello処理部20、受信処理部30、クラスタ処理部40、検索処理部70、データ処理部80として動作する。DRAM106は、記憶部90として動作する。PHYチップ102や無線モジュール108は、受信部11および送信部16として動作する。ここで、PHYチップ102はオプションであり、ノード装置10は、PHYチップ102を介して回線による通信を行うことができる。例えば、L3ネットワークとアドホックネットワークとの間のゲートウェイとして動作するノード装置10は、L3ネットワーク中のノード装置とPHYチップ102を用いて通信することができる。タイマIC104は、参加要求部51や生成要求部53が送信したパケットに対する応答パケットを受信するまでの時間を計測する際に用いられ、参加要求部51や生成要求部53の一部として動作する。
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置10にインストールされてもよい。または、プログラムは、ネットワークからPHYチップ102や無線モジュール108を介してダウンロードされることによりノード装置10にインストールされてもよい。また、実施形態に応じて、DRAM106やフラッシュメモリ107以外の他の種類の記憶装置が利用されることがある。また、ノード装置10は、コンピュータによって実現されても良い。
<クラスタの生成前のHelloパケットの処理>
まず、クラスタが生成される前に、ネットワーク中のノード装置10は、Helloパケットを用いて隣接ノードや未所属ノードを確認する。Helloパケットの例を図4(c)に示す。以下、ノード装置10aがHelloパケットをブロードキャスト送信することにより、ノード装置10aに隣接しているノード装置10bにノード装置10aの情報を通知する場合を例として述べる。
まず、クラスタが生成される前に、ネットワーク中のノード装置10は、Helloパケットを用いて隣接ノードや未所属ノードを確認する。Helloパケットの例を図4(c)に示す。以下、ノード装置10aがHelloパケットをブロードキャスト送信することにより、ノード装置10aに隣接しているノード装置10bにノード装置10aの情報を通知する場合を例として述べる。
Helloパケットでは、GDとLDがブロードキャストアドレス、GSとLSがHelloパケットを送信するノード装置10のアドレスに設定されている。また、Typeフィールドの値は「0」である。ペイロードには、クラスタフィールド、Sgwフラグ、データが含まれる。クラスタフィールドには、Helloパケットの送信元であるノード装置10aが所属しているクラスタのクラスタ識別子が記録されるが、ここでは、クラスタが形成されていないため、クラスタの識別子は格納されない。Sgwフラグは、送信元のノード装置10aがサブゲートウェイであるかを表す。以下の説明では、Sgwフラグが「0」に設定されていることは、サブゲートウェイに設定されていないことを表し、Sgwフラグが「1」に設定されていることは、サブゲートウェイに設定されていることを表すものとする。クラスタの形成前は、いずれのノード装置10もサブゲートウェイに設定されていないため、Sgwフラグの値は0である。データフィールドには、ルーティングテーブル95に記録されているGDについての情報が記録される。しかし、クラスタが生成される前は、ルーティングテーブル95も生成されていないので、データフィールドにデータが含まれていないHelloパケットが送信される。
次に、図6〜図9を参照しながら、Helloパケットを受信したときのノード装置10bの動作について説明する。ノード装置10bに備えられている経路管理部21と未所属ノード特定部22は、パケット分岐処理部12を介してHelloパケットを受信すると、受信したHelloパケットに基づいて、リンクテーブル91と未所属テーブル93を更新する。
図6は、リンクテーブル91の例を示す。リンクテーブル91は、ノード装置10の隣接ノード装置の各々について、隣接ノードのアドレス、クラスタ識別子、ホップ数、隣接ノード装置に対して設定されているSgwフラグの値が記録される。リンクテーブル91中のクラスタ識別子は、隣接ノード装置が所属しているクラスタを識別する識別子である。なお、図6はリンクテーブル91の例であり、例えば、リンクテーブル91はホップ数を含めないなど、リンクテーブル91に含まれる情報を変更することができる。
図7は、リンクテーブル91を更新するときの経路管理部21の動作の例を説明するフローチャートである。経路管理部21は、受信したHelloパケットのLSを抽出し、LSをキーとしてリンクテーブル91のアドレスの欄を検索する(ステップS1)。キーとして用いたLSのアドレスがリンクテーブル91に登録されていない場合、経路管理部21は、LSに対応するエントリを作成する(ステップS2でNo、ステップS3)。次に、経路管理部21は、追加したエントリにHelloパケットのLS、クラスタID、Sgwフラグの値を設定し、ホップ数を記録する(ステップS4)。すなわち、経路管理部21は、アドレスの欄にHelloパケットのLSを登録し、ホップ数に1を設定する。このとき、まだクラスタが生成されていないので、経路管理部21は、クラスタIDの欄の値を初期化し、Sgwフラグの値を0に設定する。一方、ステップS2でLSのアドレスがリンクテーブル91に登録されている場合、経路管理部21は、エントリの作成を行わずにリンクテーブル91を更新する(ステップS2でYes)。この場合、経路管理部21は、ステップS1の検索でヒットしたエントリについてステップS4の処理を行う。
図8は、未所属テーブル93の例を示す。未所属テーブル93は、未所属ノードを未所属ノードの隣接ノードと対応付けて記録している。図9は、未所属テーブル93を更新するときの未所属ノード特定部22の動作の例を説明するフローチャートである。ステップS11〜S15はクラスタに所属していないノード装置10からHelloパケットを受信した場合の動作であり、ステップS16〜S18は、クラスタに所属しているノード装置10からHelloパケットを受信した場合の動作である。ここでは、ステップS11〜S15を参照しながらノード装置10bで行われる処理を説明し、ステップS16〜S18の処理については、後述する。
未所属ノード特定部22は、受信したHelloパケットのクラスタフィールドにクラスタ識別子が設定されているかを確認する(ステップS11)。クラスタ識別子が設定されていない場合、未所属ノード特定部22は、クラスタに所属していないノード装置10からHelloパケットを受信したと判断し、Helloパケットの送信元を未所属テーブル(UKT)93に記録するための処理を行う。まず、未所属ノード特定部22は、受信したHelloパケットのLSを抽出し、LSをキーとして未所属テーブル93の未所属ノードの欄を検索する(ステップS12)。キーとして用いたLSのアドレスが未所属テーブル93に登録されていない場合、未所属ノード特定部22は、LSに対応するエントリを作成する(ステップS13でNo、ステップS14)。さらに、未所属ノード特定部22は、追加したエントリの未所属ノードにHelloパケットのLSを設定し、隣接ノードの欄にHelloパケットを受信したノード装置10のアドレスを設定する(ステップS15)。例えば、ノード装置10bがノード装置10aから初めてHelloパケットを受信した場合、ノード装置10aは未所属テーブル93に記録されていない。そこで、ノード装置10bの未所属ノード特定部22は、新たに生成したエントリの未所属ノードの欄にノード装置10aを記録し、ノード装置10aの隣接ノードとして、ノード装置10bを記録する。一方、ステップS13で、キーとして用いたLSのアドレスが未所属テーブル93に登録されていることが確認された場合、未所属ノード特定部22は処理を終了する(ステップS13でYes)。
<クラスタの生成>
図10は、クラスタの生成方法の例を示す。以下の説明では、クラスタの生成を開始するノード装置10のことを「起点ノード装置」と記載することがある。また、ノード装置10が所属しているクラスタを、そのノード装置10の「所属クラスタ」と記載することがある。さらに、クラスタに所属しているノード装置10を「所属ノード」と記載することもある。また、起点ノード装置は、予め、1つのクラスタに含めることができるノード装置10の数を表す閾値を記憶しているものとする。
図10は、クラスタの生成方法の例を示す。以下の説明では、クラスタの生成を開始するノード装置10のことを「起点ノード装置」と記載することがある。また、ノード装置10が所属しているクラスタを、そのノード装置10の「所属クラスタ」と記載することがある。さらに、クラスタに所属しているノード装置10を「所属ノード」と記載することもある。また、起点ノード装置は、予め、1つのクラスタに含めることができるノード装置10の数を表す閾値を記憶しているものとする。
起点ノード装置は、Helloパケットの送受信により隣接ノード装置を認識すると、隣接ノード装置を含むクラスタの生成を開始する。まず、起点ノード装置中の参加要求部51は、生成するクラスタを識別するクラスタ識別子を決定する。次に、起点ノード装置を、決定したクラスタ識別子で識別されるクラスタに所属させる。以下の説明では、起点ノード装置O1はクラスタC4を生成するものとする。
次に、図10(a)に示すように、起点ノード装置O1は、隣接ノード装置10に、クラスタC4への参加を要求すると共に、クラスタC4を識別するクラスタ識別子を送信する(取り込み)。参加を要求されたノード装置10は、いずれのクラスタにも所属していない場合、クラスタC4に所属すると共に、起点ノード装置O1にクラスタC4に参加した旨を通知(参加通知)する。ここで、起点ノード装置O1は、クラスタに関する情報を、適宜、クラスタテーブル92に記録するものとする。図11は、クラスタテーブル92の例を示す。クラスタテーブル92には、ノード装置10の所属クラスタのクラスタ識別子と起点ノード装置O1のアドレスが記録されるものとする。例えば、起点ノード装置O1が保持するクラスタテーブル92では、クラスタ識別子はC4である。起点ノード装置O1は、参加通知を受け取ると、参加通知の送信元を所属ノードとしてクラスタテーブル92に記録する。なお、クラスタテーブル92には、所属クラスタに含まれているサブゲートウェイも記録されるが、サブゲートウェイの設定や記録については、後述する。
起点ノード装置O1は、参加通知を受信すると、クラスタC4に所属しているノードの数をインクリメントし、閾値と比較する。クラスタC4に所属しているノード装置10の数が閾値未満である場合、起点ノード装置O1は、他の隣接ノード装置にクラスタC4への参加を要求する。全ての隣接ノードに参加を要求しても、まだクラスタC4の所属ノードの総数が閾値に達しない場合、起点ノード装置O1は、隣接ノード装置を介して通信可能なノード装置10に対しても、クラスタC4への参加を要求する。起点ノード装置O1は、クラスタC4に含まれるノード装置10の数が閾値に達するまでクラスタC4への参加の要求を繰り返す。
クラスタC4の所属ノードの数が閾値と同数になると、起点ノード装置O1は、クラスタC4への参加の要求を停止する。さらに、起点ノード装置O1は、図10(b)に示すように、未所属ノードから選択したノード装置10に対して、新たな起点ノード装置O2として動作することを要求する。また、起点ノード装置O1は、起点ノード装置として動作することを要求する際に、閾値を起点ノード装置O2に通知するものとする。
図10(c)に示すように、起点ノード装置O2はクラスタC5を生成する。クラスタC5の生成の際の起点ノード装置O2の動作は、起点ノード装置O1がクラスタC4を生成するときと同様である。クラスタC5の所属ノードの数が閾値に達すると、起点ノード装置O2は、起点ノード装置O3に新たなクラスタの生成を要求する。起点ノード装置O3は、クラスタC6を生成する。起点ノード装置O3は、参加を要求できる未所属ノードが無い場合、クラスタの作成終了を起点ノード装置O2に通知する。すると、起点ノード装置O2は、図10(d)に示すように、新たな起点ノード装置O4にクラスタの生成を要求する。
図10(a)〜図10(d)に示す手順を繰り返されることにより、アドホックネットワーク中の全てのノード装置10(ノード)がいずれかのクラスタに分類される。次に、図12に示すアドホックネットワークでクラスタが生成される場合を例として、クラスタ生成部50の動作を詳しく説明する。図12に示すネットワークは、15個のノード装置10を含み、ノードSは起点ノード装置として動作するものとする。図12には、ノードS、ノードA、ノードCの各々についての隣接ノードを示している。ノードSの隣接ノードは、NSの円で示される範囲のノードであるとする。同様に、ノードAの隣接ノードはNAの円、ノードCの隣接ノードはNCの楕円で囲まれた範囲に位置するノードであるとする。また、ここでは、起点ノード装置が記憶している閾値は9であるものとする。なお、図12中の数字は、図13を参照しながら説明する手順の番号を示す。
図13は、クラスタの生成の際に行われる処理の例を説明するシーケンス図を示す。
(1)ノードSの参加要求部51は、隣接ノードの情報を取得すると、クラスタCSの生成を開始する。参加要求部51は、ノードSのクラスタテーブル(CT)92のクラスタIDに「CS」を登録する。このとき、ノードS以外のノードでは、クラスタテーブル92にクラスタIDは登録されていない。
(1)ノードSの参加要求部51は、隣接ノードの情報を取得すると、クラスタCSの生成を開始する。参加要求部51は、ノードSのクラスタテーブル(CT)92のクラスタIDに「CS」を登録する。このとき、ノードS以外のノードでは、クラスタテーブル92にクラスタIDは登録されていない。
(2)ノードSの参加要求部51は、未所属テーブル(UKT)93を参照し、未所属テーブル93に登録されているノードから、クラスタCSへの参加を要求するノードを選択する。ここでは、ノードAが選択されたとする。このとき、参加要求部51は、未所属テーブル93からノードSがノードAの隣接ノード(Nei)であることも認識する。
(3)参加要求部51は、参加を要求するクラスタデータパケットを生成する。クラスタデータパケットの構成の例を図14に示す。クラスタデータパケットでは、Typeフィールドの値は1に設定される。参加要求部51は、ノードAがノードSの隣接ノードであるため、GDとLDの両方にノードAのアドレスを設定する。また、参加要求部51は、GSとLSの両方にノードSのアドレスを設定する。クラスタデータパケットのペイロードには、クラスタタイプフィールド、クラスタIDフィールド、データが含まれる。参加要求部51は、クラスタタイプフィールドに参加要求を表す値(=2)、クラスタIDフィールドにクラスタCSの識別子であるCSを設定する。参加要求部51は、送信部16を介して、生成したクラスタデータパケットをノードAに送信する。
(4)ノードAの参加処理部52は、パケット分岐処理部12を介して、ノードSから送信されたクラスタデータパケットを受信する。参加処理部52はクラスタタイプフィールドの値を確認することにより、クラスタへの参加が要求されたことを認識する。参加処理部52は、ノードAがいずれかのクラスタに参加しているかを、ノードAのクラスタテーブル92を参照して確認する。ここでは、クラスタテーブル92にクラスタIDが登録されていないので、参加処理部52は、ノードAがいずれのクラスタにも参加していないと認識する。そこで、参加処理部52は、クラスタCSに参加する。また、参加処理部52は、クラスタテーブル92のクラスタIDの欄にCSを設定し、合わせてノードSのアドレスをクラスタCSの起点ノードのアドレスとして記録する。
(5)ノードAの参加処理部52は、起点ノード装置Sに送信する参加通知を生成する。参加処理部52は、クラスタデータパケットのGDとLDをノードSのアドレスに設定し、さらに、GSとLSをノードAのアドレスに設定する。さらに、クラスタタイプフィールドに「3」を設定する。ここで、クラスタタイプフィールド=3は、クラスタデータパケットのGSに設定されたノードから送信されたクラスタデータパケットに対する応答メッセージであることを示すものとする(図14)。また、参加処理部52は、クラスタIDフィールドにCSを設定する。さらに、参加処理部52は、データフィールドに、ノードAが保持している未所属テーブル93のデータを含める。図13の例では、ノードAの未所属テーブル93に基づいて、ノードS、ノードB、ノードCが未所属ノードとしてデータフィールドに記録される。クラスタデータパケットの生成が終わると、参加処理部52は、生成したパケットをノードSに送信する。
(6)ノードSの未所属ノード特定部54は、ノードAからクラスタデータパケットを受信すると、クラスタIDフィールドの値を確認する。ここでは、クラスタIDフィールドの値がCSであるので、未所属ノード特定部54は、ノードAがクラスタCSに所属していることを認識する。そこで、未所属ノード特定部54は、ノードAのエントリを未所属テーブル93から削除する。また、未所属ノード特定部54は、ノードSに記憶されているクラスタテーブル92の所属ノードの欄に、ノードAを登録する。
さらに、未所属ノード特定部54は、ノードAから受信したクラスタデータパケットのデータフィールドのデータを用いて、未所属テーブル93を更新する。未所属ノード特定部54は、クラスタデータパケットで通知されたノードの各々について、
(α)起点ノード装置として動作するノード、
(β)未所属テーブル93に登録されているノード、
(γ)クラスタテーブル92に登録されているノード
のいずれかに該当するかを確認する。(α)〜(γ)のいずれにも該当しない場合、未所属ノード特定部54は、通知されたノードを未所属テーブル93に登録する。ここでは、ノードS、ノードB、ノードCが未所属ノードとして通知されているが、未所属ノード特定部54は、ノードSは起点ノードであることを認識すると、ノードSを未所属テーブル93に追加しない。さらに、未所属ノード特定部54は、未所属テーブル93に記録されているノードとノードB、ノードCを比較する。すると、ノードBはすでに未所属テーブル93に登録されているので、未所属ノード特定部54は、ノードBも未所属テーブル93に追加しない。ノードCは起点ノードではなく、未所属テーブル93にも登録されていないので、未所属ノード特定部54は、ノードCを未所属テーブル93に登録する。このとき、ノードCを通知してきたノードであるノードAが、ノードCの隣接ノードに指定される。登録後の未所属テーブル93の例を図13に示す。
(α)起点ノード装置として動作するノード、
(β)未所属テーブル93に登録されているノード、
(γ)クラスタテーブル92に登録されているノード
のいずれかに該当するかを確認する。(α)〜(γ)のいずれにも該当しない場合、未所属ノード特定部54は、通知されたノードを未所属テーブル93に登録する。ここでは、ノードS、ノードB、ノードCが未所属ノードとして通知されているが、未所属ノード特定部54は、ノードSは起点ノードであることを認識すると、ノードSを未所属テーブル93に追加しない。さらに、未所属ノード特定部54は、未所属テーブル93に記録されているノードとノードB、ノードCを比較する。すると、ノードBはすでに未所属テーブル93に登録されているので、未所属ノード特定部54は、ノードBも未所属テーブル93に追加しない。ノードCは起点ノードではなく、未所属テーブル93にも登録されていないので、未所属ノード特定部54は、ノードCを未所属テーブル93に登録する。このとき、ノードCを通知してきたノードであるノードAが、ノードCの隣接ノードに指定される。登録後の未所属テーブル93の例を図13に示す。
(7)ノードSの参加要求部51は、クラスタテーブル92に記録されている所属ノードの数を閾値と比較する。所属ノード数は2(ノードSとノードA)であり、閾値よりも小さい。そこで、参加要求部51は、未所属テーブル93から、新たにクラスタCSへの参加を要求するノードを選択する。参加要求部51は、参加を要求するノードとしてノードCを選択し、ノードAがノードCの隣接ノードであることを認識したとする。
すると、参加要求部51は、参加を要求するためのクラスタデータパケットを生成する。このとき、GDにノードCのアドレス、LDにノードAのアドレス、GSとLSの両方にノードSのアドレスが設定される。クラスタデータパケットのペイロードは、手順(3)で生成されたクラスタデータパケットと同様である。参加要求部51は、生成したクラスタデータパケットをノードAに送信する。
(8)ノードAは、手順(7)で送信されたパケットを受信する。ノードAの参加処理部52は、GDにノードCのアドレスが設定されているので、受信したパケットがノードA宛てではないことを認識する。そこで、参加処理部52は、受信したパケットのヘッダ中のLSをノードAのアドレスに変更し、LDをノードCのアドレスに変更した上で、ノードCに送信する。なお、ルーティングテーブル95が生成される前は、参加処理部52は、適宜、リンクテーブル91を使用してクラスタデータパケットを転送しているものとする。
(9)ノードCの参加処理部52は、パケットを受信すると、手順(4)と同様の処理を行う。さらに、参加処理部52は、クラスタデータパケットのGSに設定されていたノード(起点ノード装置)に送信するクラスタデータパケットを生成する。参加処理部52は、クラスタデータパケットのGDをノードSのアドレス、LDをノードAのアドレスに設定し、さらに、GSとLSをノードCのアドレスに設定する。ペイロードの情報は、手順(5)と同様に生成される。なお、ここでは、ノードCの未所属テーブル93に基づいて、ノードA、ノードL、ノードMが未所属ノードとしてデータフィールドに記録される。生成されたクラスタデータパケットは、ノードAに送信される。
(10)ノードAの参加処理部52は、ノードCからのクラスタデータパケットを受信すると、GDを確認する。GDにはノードSが指定されているので、参加処理部52は、受信したパケットのヘッダ中のLSをノードAのアドレスに変更し、LDをノードSのアドレスに変更した上で、ノードSに送信する。
(11)ノードSの未所属ノード特定部54は、受信したクラスタデータパケットを、手順(6)と同様に処理する。すなわち、未所属ノード特定部54は、ノードCのエントリを未所属テーブル93から削除し、クラスタテーブル92の所属ノードの欄に、ノードCを登録する。さらに、未所属ノード特定部54は、ノードCから通知された未所属ノードのうち、未所属テーブル93への登録の対象となるノードを検索する。ここでは、ノードAがすでにクラスタテーブル92に登録されているので、未所属ノード特定部54は、ノードLとノードMを未所属テーブル93に登録する。なお、ノードLとノードMの隣接ノードとして、ノードCが登録される。
なお、ノードSは、ノードA以外の隣接ノードにも、手順(2)〜(6)の処理を繰り返すことにより、全ての隣接ノードをクラスタCSの所属ノードとすることができる。さらに、図13を参照して説明した手順は一例であり、実装に応じて変更されることがある。例えば、起点ノード装置は、起点ノード装置の隣接ノードに対して優先的に参加を要求し、起点ノード装置の隣接ノードへの参加要求が終わった後に、隣接ノード以外のノードに参加を要求することができる。
図12および図13を参照しながら説明した処理により、クラスタCSにノードA〜HとノードSが参加したとする。すると、クラスタCSの所属ノードの数は9であり、閾値に到達する。所属ノードの数が閾値と一致すると、参加要求部51は処理を停止し、未所属テーブル93に登録されているノードがあるかを確認する。未所属テーブル93に登録されているノードが無い場合、参加要求部51は、クラスタの生成が終了したと認識する。一方、未所属テーブル93に未所属ノードが登録されている場合、参加要求部51は、所属ノードの数が閾値に達していることと、未所属ノードがあることを生成要求部53に通知する。生成要求部53は、参加要求部51からの通知を受けると、新たな起点ノード装置を指定する。
図15は、新たな起点ノード装置の指定とクラスタの生成の例を示す。また、図16は、新たな起点ノード装置の指定とクラスタの生成において行われる通信の例を説明するシーケンス図である。なお、図15の数字は、図16の説明で用いられる手順の番号を表す。
(21)ノードSの生成要求部53は、ノードSが生成しているクラスタCSの所属ノードの数は閾値に達しているが、未所属ノードが残っていることを、参加要求部51から通知される。すると、生成要求部53は、未所属テーブル93を確認して、新たな起点ノードに指定するノードを決定する。ここでは、生成要求部53が、ノードLを新たな起点ノードに指定したとする。
(22)生成要求部53は、起点ノードに設定するためのクラスタデータパケットを生成する。新たなクラスタの生成を要求する場合、図14に示すように、クラスタデータパケットのクラスタタイプフィールドの値は「1」に設定される。さらに、生成要求部53は、クラスタデータパケットのヘッダを設定する。また、生成要求部53は、クラスタデータパケットを経由させるノードを識別する情報を、クラスタデータパケットのデータフィールドに含める。
後述するように、クラスタが形成されると、クラスタに所属しているノード装置10同士で送受信されたHelloパケットにより、ルーティングテーブル95が生成される。ルーティングテーブル95には、所属しているクラスタと同一のクラスタ中のノード装置10までの経路が保持される。そこで、生成要求部53は、クラスタデータパケットの宛先の隣接ノードまでの経路についてのルーティングテーブル95のデータを用いてアドレスを設定する。例えば、ここでは宛先となるノードLは、ノードCに隣接していることが未所属テーブル93から認識される。ノードSのルーティングテーブル95には、ノードC宛てのパケットをノードAを経由して送信できることが記録されている。そこで、生成要求部53は、GDにノードC、LDにノードA、GSとLSとにノードSを指定する。さらに、生成要求部53は、生成開始の宛先となるノードLは、クラスタIDフィールドに記録する。生成要求部53は、生成したクラスタデータパケットをノードAに送信する。
(23)ノードAの参加処理部52は、他のノード宛のクラスタデータパケットであって、クラスタタイプフィールドの値が「1」に設定されているパケットを受け取ると、GDフィールドを参照する。参加処理部52は、GDフィールドに記録されているノードに向けて、クラスタデータパケットを転送する。ここでは、GDフィールドにノードCの情報が含まれているので、生成要求部53は、クラスタデータパケットのLSをノードA、LDをノードCに変更して、ノードCに送信する。
(24)ノードCの参加処理部52は、ノードAから受信したクラスタデータパケットのLSをノードC、LDをノードL、GDをクラスタデータパケットのクラスタIDフィールドに記録されているノードLに変更して、ノードLに送信する。このとき、参加処理部52は、リンクテーブル91を参照して転送を行うものとする。
(25)ノードLの参加要求部51は、ノードSからのクラスタデータパケットを受信すると、クラスタCLの生成を開始する。参加要求部51は、ノードLのクラスタテーブル(CT)92のクラスタIDに「CL」を登録する。さらに、参加要求部51は、クラスタ構築テーブル(CCT)42に、クラスタの生成開始を要求してきたパケットのGSとLSを記録する。ここでは、GSとしてノードSのアドレスが記録され、LSとしてノードCのアドレスが記録される。
(26)ノードLの参加要求部51は、未所属テーブル93に基づいて、クラスタCLへの参加を要求するノードを決定する。図15の例では、ノードLはノードMに参加を要求する。参加を要求する際に行われる動作は、図12と図13を参照しながら説明した動作と同様である。
(27)参加要求部51は、未所属テーブル93に未所属ノードがなくなると、クラスタの生成が終了したことを、クラスタデータパケット(終了通知メッセージ)を用いて、クラスタ構築テーブル42に記録されているGSに通知する。このとき、参加要求部51は、生成したクラスタに所属しているノードのリストを、終了通知メッセージのデータフィールドに記録する。ここでは、ノードLの参加要求部51は、生成したクラスタにノードLとノードMが含まれていることを通知する。
生成終了を通知するクラスタデータパケットのヘッダでは、GDとしてクラスタ構築テーブル42に記録されているGSのアドレスが指定される。ここでは、ノードLは、ノードSに、クラスタ生成の終了を通知する。終了通知メッセージでは、クラスタタイプフィールドの値は「4」に設定されており、クラスタIDはCLに設定されている。ノードLの参加要求部51は、LDにノードCを指定した上で、生成したパケットをノードCに送信する。さらに、終了通知メッセージを送信すると、参加要求部51は、クラスタ検索テーブル42のエントリを削除する。
(28)ノードCの参加処理部52は、ノードLから受信したクラスタデータパケットのGDがノードSであることを認識すると、ルーティングテーブル95を用いてクラスタデータパケットを転送する。このとき、参加処理部52は、クラスタデータパケットのLSをノードCのアドレス、LDをノードAのアドレスに設定した上で、ノードAに送信する。
(29)ノードAの参加処理部52も、ルーティングテーブル95を用いて、クラスタデータパケットの転送処理を行う。参加処理部52は、クラスタデータパケットのGDがノードSであることを認識すると、パケットのLSをノードAのアドレス、LDをノードSのアドレスに設定した上で、ノードSに送信する。
(30)ノードSの生成要求部53は、ノードAから、ノードLで生成された終了通知メッセージを受信する。すると、生成要求部53は、ノードLのエントリを未所属テーブル93から削除する。さらに、生成要求部53は、生成終了通知のデータフィールドに記録されているノードについても、未所属テーブル93からエントリを削除する。ここでは、ノードLとノードMのエントリが未所属テーブル93から削除される。
図17は、クラスタ生成の手順の例を説明するフローチャートである。起点ノードの参加要求部51は、クラスタの生成を開始する(ステップS21)。参加要求部51は、未所属テーブル(UKT)93に登録があるかを確認する(ステップS21でYes、ステップS22)。未所属テーブル93に未所属ノードが登録されている場合、参加要求部51は、生成しているクラスタの所属ノード数と閾値を比較することにより、新たなノードをクラスタに追加できるかを確認する(ステップS22でYes、ステップS23)。新たなノードをクラスタに追加できる場合、参加要求部51は、クラスタへの参加要求を行う(ステップS23でYes、ステップS24)。新たなノードをクラスタに追加できない場合、参加要求部51は、生成要求部53に新たなクラスタの生成を依頼する(ステップS23でNo、ステップS25)。一方、ステップS22で未所属テーブル93に未所属ノードが登録されていないと判定した場合、参加要求部51は処理を終了する(ステップS22でNo)。また、ステップS21で起点ノードではないと判定されたノードでも、処理が終了される(ステップS21でNo)。
図18は、未所属ノードにクラスタへの参加を要求するときの動作の例を説明するフローチャートである。なお、図18のフローチャートは一例である。例えば、ステップS37〜S39の順序は任意に変更することができる。また、ステップS41はオプションであり、ノード装置10の性能に応じて省略することもできる。
参加要求部51は、未所属テーブル93に記録されている未所属ノードの1つを選択し、クラスタデータパケットを生成する(ステップS31、S32)。このとき、クラスタデータパケットのGDにはステップS31で選択されたノードのアドレスが指定される。また、クラスタタイプフィールドの値は2(CREATE)に設定される。さらに、クラスタIDには、参加要求部51が生成しているクラスタのIDが記録される。参加要求部51は、生成したクラスタデータパケットを送信し、送信時刻を記録する(ステップS33、S34)。クラスタデータパケットの参加通知メッセージ(ACK)を受信するまで、未所属ノード特定部54は待機する(ステップS35、S36)。参加通知メッセージを受信すると、未所属ノード特定部54は、参加通知メッセージの送信元のノードのエントリを、未所属テーブル93から削除する(ステップS36でYes、ステップS37)。さらに、未所属ノード特定部54は、参加通知メッセージのデータに未所属ノードの情報が含まれている場合、得られたノードの情報を未所属テーブル93に追加する(ステップS38)。さらに、未所属ノード特定部54は、クラスタテーブル92に参加通知メッセージの送信元を追加する(ステップS39)。
一方、ステップS36で参加通知メッセージを受け取っていないと判定した場合、未所属ノード特定部54は、参加を要求するクラスタデータパケットの送信時刻から経過した時間が所定の時間よりも長いかを確認する(ステップS36でNo、ステップS40)。所定の時間を経過していない場合、ステップS35以降の処理が繰り返される。所定の時間を経過しても参加通知メッセージを受信できない場合、参加を要求したノードについては、次に未所属テーブル93からノードを選択する際の優先順位を低くする(ステップS41)。
図19は、新たなクラスタの生成が開始される場合の動作の例を説明するフローチャートである。なお、図19のフローチャートは一例である。例えば、ノード装置10の性能に応じてステップS59を省略するなどの変更が加えられることがある。
生成要求部53は、未所属テーブル93に登録されている未所属ノードの1つを選択する(ステップS51)。生成要求部53は、選択した未所属ノードに送信するためのクラスタデータパケットを生成する(ステップS52)。このとき、クラスタデータパケットのGDはステップS51で選択された未所属ノードに対する隣接ノードのアドレスが指定される。また、クラスタタイプフィールドの値は1(START)に設定される。さらに、クラスタIDには、新たに生成されるクラスタを識別するクラスタIDが記録される。なお、クラスタIDにより、新たな起点ノードとされるノード装置10は、一意に識別できるものとする。生成要求部53は、生成したクラスタデータパケットを送信し、送信時刻を記録する(ステップS53、S54)。クラスタデータパケットの終了通知メッセージ(FINISH)を受信するまで、生成要求部53は待機する(ステップS55、S56)。終了通知メッセージを受信すると、生成要求部53は、終了通知メッセージの送信元のノードのエントリを、未所属テーブル93から削除する(ステップS56でYes、ステップS57)。さらに、生成要求部53は、ステップS53で送信したクラスタデータパケットに基づいて生成されたクラスタの所属ノードについても、未所属テーブル93から削除する。
一方、ステップS56で参加通知メッセージを受け取っていないと判定した場合、生成要求部53は、クラスタの生成を要求するクラスタデータパケットの送信時刻から経過した時間が所定の時間よりも長いかを確認する(ステップS56でNo、ステップS58)。所定の時間を経過していない場合、ステップS55以降の処理が繰り返される(ステップS58でNo)。所定の時間を経過しても終了通知メッセージを受信できない場合、クラスタの生成を要求したノードについては、次に未所属テーブル93からノードを選択する際の優先順位を低くする(ステップS58でYes、ステップS59)。
<クラスタ所属後のHelloパケットの処理>
クラスタの生成中やクラスタの生成後も、ノード装置10の間でHelloパケットの送受信が行われる。以下、クラスタの生成が開始された後で、いずれのノード装置10もサブゲートウェイに設定されていない場合について、Helloパケットの処理を説明する。サブゲートウェイが設定された後の処理は、後述する。
クラスタの生成中やクラスタの生成後も、ノード装置10の間でHelloパケットの送受信が行われる。以下、クラスタの生成が開始された後で、いずれのノード装置10もサブゲートウェイに設定されていない場合について、Helloパケットの処理を説明する。サブゲートウェイが設定された後の処理は、後述する。
ノード装置10の動作は、Helloパケットを受信したノード装置10がクラスタに所属しているかによって変化する。クラスタに所属していないノード装置10がHelloパケットを受信した場合の動作は、先に図6〜図9を参照しながら説明したとおりである。一方、クラスタに所属しているノード装置10では、Helloパケットを用いてルーティングテーブル95やクラスタテーブル92の更新が行われることがある。また、クラスタに所属しているノード装置10は、Helloパケットを生成する際に、ノード装置10が記憶しているルーティングテーブル95の経路情報をHelloパケットのデータフィールドに含めることができる。
図20は、クラスタに所属しているノード装置10aでのHelloパケットの生成の例を示す。図20(a)は、Helloパケットのフォーマットの例を示す。図20(b)は、データフィールドのフォーマットの例を示す。データフィールドには、GDについての情報が含まれる。データフィールドに含まれているGDの数は、Lenフィールドに記録される。ノード装置10aのHello生成部15は、ルーティングテーブル95に記録されているGDについて、クラスタID、ホップ数、Sgwフラグの値を読み出して、データに含める。
ルーティングテーブル95の例を図20(c)に示す。ルーティングテーブル95は、GDごとに、TTL(Time to Live)エントリ生存カウンタの値、GDクラスタID、GD−Sgwフラグの値、LDが記録されている。ここで、「GD−Sgwフラグ」は、ルーティングテーブル95でGDに対応付けて記録されているSgwフラグの値である。ここでは、いずれのノード装置10もサブゲートウェイに指定されていないので、GD−Sgwフラグの値は、いずれのノードでも0であるものとする。TTLエントリ生存カウンタの値は、GDについての記録が更新されてから経過した時間に応じて減少し、TTLエントリ生存カウンタの値が正の値である場合、GDに関する情報が有効であることを示す。GDクラスタIDは、GDが所属しているクラスタを識別する識別子である。また、図20(c)の例では、GDにパケットを送信するためにノード装置10が設定するLDが、GDごとに3つ記録されており、各LDに応じてホップ数が記録されている。
Hello生成部15は、GD、クラスタID、GD−Sgwフラグ、ホップ数の各々について、ルーティングテーブル95に記録されている値を取得してデータに設定する。このとき、Hello生成部15は、ノード装置10aからGDにパケットを送信する際に第1候補として用いられるLSに対応付けられたホップ数をデータに含めるものとする。
図21は、ノード装置10がHelloパケットを受信した場合に行う動作の例を説明するフローチャートである。ここでは、ノード装置10aからブロードキャストされたHelloパケットをノード装置10b、10cが受信する場合の例を、図21を参照しながら説明する。ここで、ノード装置10aとノード装置10bはクラスタに所属しており、ノード装置10cは未所属ノードであるとする。なお、図21は動作の例であり、例えば、ステップS61とS62の順序の変更、ステップS65とS66の順序の変更、ステップS71とS72の順序の変更などの変更が加えられる場合がある。
ノード装置10b、10cのいずれも、Helloパケットを受信すると、リンクテーブル91と未所属テーブル93を更新する(ステップS61、S62)。なお、ステップS61は図7で説明した動作と同様であり、ステップS62は図9のステップS16〜S18の動作と同様である。ノード装置10aから送信されたHelloパケットによりクラスタが通知されているので、ノード装置10b、10cは、Helloパケット中のLSをキーとして未所属テーブル93の未所属ノードの欄を検索する(ステップS11でYes、ステップS16)。未所属ノードがヒットしたら未所属ノード特定部22は、ヒットしたノードのエントリを削除する(ステップS17、S18)。
次に、ノード装置10は、クラスタテーブル92にクラスタIDが記録されているかを確認する(ステップS63)。クラスタに所属していないノード装置10cは処理を終了する(ステップS63でNo)。
クラスタに所属しているノード装置10bは、クラスタテーブル92に記録されているクラスタ識別子と、Helloパケット中のクラスタ識別子を比較する(ステップS64)。両者が一致すると、ノード装置10bの経路管理部21は、ノード装置10a(HelloパケットのLS)について、ルーティングテーブル95を更新する(ステップS64でYes、ステップS65)。また、経路管理部21は、クラスタテーブル92を更新するための処理も行う(ステップS66)。
ノード装置10bの経路管理部21は、Helloパケットのデータフィールドに含まれているリストから、未処理のエントリを1つ取得する(ステップS67、S68)。未処理のエントリに有効な値が記録されていない場合、経路管理部21は処理を終了する(ステップS68でNo)。
一方、未処理のエントリを取得できた場合、経路管理部21は、取得したエントリのGDがノード装置10b(経路管理部21が備えられているノード装置10)のアドレスと一致するかを確認する(ステップS68でYes、ステップS69)。取得したエントリのGDとノード装置10bのアドレスが一致した場合、経路管理部21は、ルーティングテーブル95を更新せずに他のエントリの処理を行うため、ステップS67に戻る(ステップS69でYes)。一方、取得したエントリのGDとノード装置10bのアドレスが一致しない場合、経路管理部21は、さらに、取得したエントリについて記録されているクラスタIDが、ノード装置10bが所属しているクラスタを識別するクラスタIDであるかを確認する(ステップS70)。取得したエントリについて記録されているクラスタIDが、ノード装置10bの所属クラスタを識別するクラスタIDである場合、経路管理部21は、ルーティングテーブル95とクラスタテーブル92を更新する(ステップS70でYes、ステップS71、S72)。その後、経路管理部21はステップS67以降の処理を繰り返す。一方、取得したエントリについて記録されているクラスタIDが、ノード装置10bが所属しているクラスタを識別するクラスタIDではない場合、経路管理部21はステップS67以降の処理を繰り返す(ステップS70でNo)。
ステップS64においてクラスタテーブル92に記録されているクラスタ識別子と、Helloパケット中のクラスタ識別子が一致しない場合、ノード装置10bの経路管理部21は、ノード装置10bがサブゲートウェイであるかを確認する(ステップS73)。ノード装置10bがサブゲートウェイではない場合、ノード装置10bは処理を終了する(ステップS73でNo)。ノード装置10bがサブゲートウェイの場合は、ルーティングテーブル95とクラスタテーブル92が更新される(ステップS74、S75)。ノード装置10bがサブゲートウェイである場合の動作については、後述する。
図22は、ルーティングテーブル95の更新のための動作の例を説明するフローチャートである。図22は、図21のステップS65の処理を詳細に表している。ノード装置10bの経路管理部21は、HelloパケットのLSに登録されているアドレスをキーとして、ルーティングテーブル95のGDの欄を検索することにより、LSまでの経路が既に登録されているかを確認する(ステップS81、S82)。HelloパケットのLSまでの経路が登録されていない場合、経路管理部21は、ルーティングテーブル95に新たなエントリを作成し、作成したエントリにLSに対応する値を記録する(ステップS82でNo、ステップS83、S84)。一方、HelloパケットのLSまでの経路が登録されている場合、経路管理部21は、検索で得られたエントリの値をHelloパケットで通知された値に更新する(ステップS82でNo、ステップS84)。
図23は、クラスタテーブル92の更新のための動作の例を説明するフローチャートである。図23は、図21のステップS66の処理を詳細に表している。図23のステップS91で表されているように、Helloパケットの送信元のノード装置10がサブゲートウェイではない場合は、クラスタテーブル92は更新されない。ここでは、ノード装置10aがサブゲートウェイに設定されていないため、ノード装置10bの経路管理部21はクラスタテーブル92を更新せずに処理を終了する。Helloパケットの送信元がサブゲートウェイである場合については、後述する。
図24は、ルーティングテーブル95の更新のための動作の例を説明するフローチャートである。図24は、図21のステップS71の処理を詳細に表している。ノード装置10bの経路管理部21は、データフィールドのGDに登録されているアドレスをキーとして、ルーティングテーブル95のGDの欄を検索する(ステップS101)。ステップS102〜S104の処理は、図22を参照しながら説明したステップS82〜S84の処理と同様である。
図25は、クラスタテーブル92の更新のための動作の例を説明するフローチャートである。図25は、図21のステップS72の処理を詳細に表している。図25のステップS111に表されているように、Helloパケットのデータフィールドに記録されているGDがサブゲートウェイではない場合は、クラスタテーブル92は更新されない。ここでは、サブゲートウェイの設定がまだ開始されていないので、ノード装置10bの経路管理部21はクラスタテーブル92を更新せずに処理を終了する。データフィールド中のGDがサブゲートウェイである場合については、後述する。
図21のステップS68〜S72の処理により、ノード装置10bは、ノード装置10bが所属しているクラスタの所属ノードについての情報を取得したときに、Helloパケットから取得した情報を用いてルーティングテーブル95を更新する。このため、ルーティングテーブル95には、ノード装置10bと同じクラスタに所属するノード装置10までの経路情報が記録される。換言すると、ノード装置10は、所属しているクラスタと同じクラスタに所属するノード装置10までの経路をルーティングテーブル95に記録する。このため、本実施形態に係るノード装置10では、ルーティングテーブル95の大きさは、各ノード装置がアドホックネットワーク中の全てのノード装置までの経路を記録する場合に比べて小さくなる。
<サブゲートウェイの決定>
図26は、サブゲートウェイの決定方法の例を示す。まず、ノード装置10は、所属しているクラスタ(所属クラスタ)に隣接する隣接クラスタを認識し、図26(a)に示すように、隣接クラスタのクラスタIDを起点ノード装置O1に通知する。起点ノード装置O1は、隣接クラスタのクラスタIDを通知してきたノード装置10の中からサブゲートウェイを選択する。さらに、起点ノード装置O1は、図26(b)に示すように、選択したノード装置10に、サブゲートウェイとして動作することを依頼するメッセージ(SGW依頼)を送信する。次に、図26(c)に示すように、SGW依頼を受信したノード装置10は、起点ノード装置O1にSGW応答メッセージを送信すると共に、サブゲートウェイとしての動作を開始する。さらに、SGW依頼を受信したノード装置10は、隣接クラスタ中のノード装置10であって、Helloパケットを受信することができるノード装置10に対して、SGW依頼を送信してサブゲートウェイとする。また、図26(d)に示すように、隣接クラスタでもサブゲートウェイの決定が行われる。
図26は、サブゲートウェイの決定方法の例を示す。まず、ノード装置10は、所属しているクラスタ(所属クラスタ)に隣接する隣接クラスタを認識し、図26(a)に示すように、隣接クラスタのクラスタIDを起点ノード装置O1に通知する。起点ノード装置O1は、隣接クラスタのクラスタIDを通知してきたノード装置10の中からサブゲートウェイを選択する。さらに、起点ノード装置O1は、図26(b)に示すように、選択したノード装置10に、サブゲートウェイとして動作することを依頼するメッセージ(SGW依頼)を送信する。次に、図26(c)に示すように、SGW依頼を受信したノード装置10は、起点ノード装置O1にSGW応答メッセージを送信すると共に、サブゲートウェイとしての動作を開始する。さらに、SGW依頼を受信したノード装置10は、隣接クラスタ中のノード装置10であって、Helloパケットを受信することができるノード装置10に対して、SGW依頼を送信してサブゲートウェイとする。また、図26(d)に示すように、隣接クラスタでもサブゲートウェイの決定が行われる。
以下、図26で示した方法について、図27〜33を参照しながら詳しく説明する。
図27は、所属クラスタに隣接するクラスタのIDを認識する方法の例を示す。ノード装置10は、前述のように、Helloパケットを送受信することにより、リンクテーブル91を更新する。リンクテーブル91は、図27(a)に示すように、隣接ノードが所属するクラスタのクラスタIDを記録している。そこで、隣接クラスタ通知部61は、リンクテーブル91のクラスタIDの欄に記録されている値を、所属クラスタのクラスタIDと比較する。隣接クラスタ通知部61は、所属クラスタのクラスタIDとは異なるクラスタのIDを検出すると、所属クラスタの隣接クラスタに所属するノード装置10からHelloパケットを受信していることを認識する。図27(a)と図27(b)の例では、ノード装置10の所属クラスタは、CID1、CID2、CIDkで特定できるクラスタと隣接していることが認識される。そこで、隣接クラスタ通知部61は、検出したクラスタIDを図27(c)に示すように、起点ノード装置O1に送信するクラスタデータパケットのデータフィールドに含める。さらに、隣接クラスタ通知部61は、クラスタタイプフィールドの値を「5」(図14のNEI_CLUSTER)に設定する。隣接クラスタ通知部61は、生成したパケットを起点ノード装置に送信する。
図27は、所属クラスタに隣接するクラスタのIDを認識する方法の例を示す。ノード装置10は、前述のように、Helloパケットを送受信することにより、リンクテーブル91を更新する。リンクテーブル91は、図27(a)に示すように、隣接ノードが所属するクラスタのクラスタIDを記録している。そこで、隣接クラスタ通知部61は、リンクテーブル91のクラスタIDの欄に記録されている値を、所属クラスタのクラスタIDと比較する。隣接クラスタ通知部61は、所属クラスタのクラスタIDとは異なるクラスタのIDを検出すると、所属クラスタの隣接クラスタに所属するノード装置10からHelloパケットを受信していることを認識する。図27(a)と図27(b)の例では、ノード装置10の所属クラスタは、CID1、CID2、CIDkで特定できるクラスタと隣接していることが認識される。そこで、隣接クラスタ通知部61は、検出したクラスタIDを図27(c)に示すように、起点ノード装置O1に送信するクラスタデータパケットのデータフィールドに含める。さらに、隣接クラスタ通知部61は、クラスタタイプフィールドの値を「5」(図14のNEI_CLUSTER)に設定する。隣接クラスタ通知部61は、生成したパケットを起点ノード装置に送信する。
図28は、隣接クラスタの通知を受けたときの起点ノード装置の動作の例を表す。起点ノード装置の候補テーブル生成部62は、受信したクラスタデータパケット(図28(a))に基づいて、隣接クラスタテーブル43とゲートウェイ候補テーブル44を生成する。なお、隣接クラスタテーブル43は、サブゲートウェイ決定部63がサブゲートウェイを設定する対象となる隣接クラスタを認識するために用いられる。一方、ゲートウェイ候補テーブル44は、サブゲートウェイ決定部63がサブゲートウェイとして指定できるノード装置10を認識するために用いられる。
隣接クラスタテーブル43は、図28(b)に示すように、隣接クラスタのIDと、その隣接クラスタとの間で用いられるサブゲートウェイの設定状況を示す確定フラグを対応付けている。ここで、確定フラグが「0」に設定されている場合は、その隣接クラスタとの間で通信する際に用いられるサブゲートウェイが確定していないことを示す。一方、サブゲートウェイが確定している場合、確定フラグは「1」に設定される。つまり、サブゲートウェイ決定部63は、確定フラグの値が「0」のエントリに記録されているクラスタを、サブゲートウェイを決定する対象として認識する。候補テーブル生成部62は、受信したクラスタデータパケットのデータフィールドに含まれているクラスタIDを、隣接クラスタテーブル43の隣接クラスタIDの欄に記録されている値と比較する。隣接クラスタテーブル43に含まれていないクラスタIDがクラスタデータパケットにより通知された場合、候補テーブル生成部62は、隣接クラスタテーブル43に新たなエントリを生成して、隣接クラスタIDを記録する。このとき、確定フラグは0に設定される。
ゲートウェイ候補テーブル44は、図28(c)に示すように、サブゲートウェイに指定する候補のノード装置10(候補ノード)、候補ノードが隣接しているクラスタのID、状態フラグが対応付けられている。状態フラグ=0は、その候補ノードがサブゲートウェイとして動作していないことを示す。一方、状態フラグ=1は、その候補ノードがサブゲートウェイとして選択されていることを示す。候補テーブル生成部62は、隣接クラスタを通知するクラスタデータパケット(図28(a))でのGSと、データフィールドで通知されたクラスタIDの組み合わせをゲートウェイ候補テーブル44から検索する。GSとクラスタIDの組み合わせが無い場合、候補テーブル生成部62は、ゲートウェイ候補テーブル44にエントリを生成して、GSとクラスタIDの組み合わせを記録する。このとき、GSは候補ノードの欄に記録される。また、新たに生成されたエントリでは状態フラグの値を0に設定される。
図29は、サブゲートウェイの決定の際に行われる動作の例を説明するシーケンス図である。図29の例では、クラスタCSとクラスタCLの間で用いられるサブゲートウェイの設定について述べる。ここで、ノードSはクラスタCSの起点ノード装置であり、ノードLはクラスタCLの起点ノード装置であるものとする。また、ノードA、CはクラスタCSに所属し、ノードMはクラスタCLに所属しているものとする。なお、以下の手順は一例であり、例えば、手順(52)以降の処理を手順(49)〜(51)よりも前に行うように変更することができる。
(41)ノードCの隣接クラスタ通知部61は、リンクテーブル(LT)91に記録されているクラスタIDとノードCの所属クラスタのクラスタID(CS)を比較して、隣接クラスタを検出する。ここでは、ノードCのリンクテーブル91にノードA、L、Mが記録されているとする。ノードL、Mの所属クラスタはクラスタCLであるため、ノードCの隣接クラスタ通知部61は、クラスタCLと隣接していることを認識する。
(42)ノードCは、データフィールドに隣接クラスタのリスト(クラスタIDリスト)を含むクラスタデータパケットを生成する。図29では、隣接クラスタを通知するクラスタデータパケットは、送信先となる起点ノード装置および送信元のノード装置10と対応付けて、(NEIGHBOR_CLUSTOR,S,C)のように表記されている。NEIGHBOR_CLUSTORは隣接クラスタを通知するクラスタデータパケットを表す。クラスタデータパケットの種類を表す記述の後に、起点ノード装置がノードSであることと、送信元がノードCであることが記載されている。
(43)手順(42)でノードCから送信されたクラスタデータパケットは、ノードAによってノードSに送信される。
(44)ノードSの候補テーブル生成部62は、受信したパケットを用いて、隣接クラスタテーブル(NCT)43とゲートウェイ候補テーブル(SGWCT)44を更新する。隣接クラスタテーブル43とゲートウェイ候補テーブル44の更新方法は、図28を参照しながら説明したとおりである。図29の例では、隣接クラスタテーブル43にクラスタCLのIDが登録される。また、ゲートウェイ候補テーブル44には、ノードCがクラスタCLに含まれるノード装置10に隣接していることが記録される。
(45)サブゲートウェイ決定部63は、隣接クラスタテーブル43から、確定フラグが0に設定されているクラスタのIDを取得する。次に、サブゲートウェイ決定部63はゲートウェイ候補テーブル44を確認することにより、取得したクラスタIDに対応付けられた候補ノードのうちで、状態フラグが0に設定されているノード装置10を検索する。サブゲートウェイ決定部63は、検索したノード装置10の中から、サブゲートウェイに指定するノード装置10を決定する。例えば、図29の例では、クラスタCLのIDに対応付けられた確定フラグの値は0である。そこで、サブゲートウェイ決定部63は、クラスタCLとの間の通信に用いられるサブゲートウェイが決定されていないと判断し、ゲートウェイ候補テーブル44に登録されている候補ノードのうちで状態フラグ=0であるノード装置10を検索する。ここで、ノードCは、クラスタCL中のノードに隣接していて状態フラグの値が0である。そこで、ノードSのサブゲートウェイ決定部63は、ノードCをサブゲートウェイに決定する。
(46)サブゲートウェイ決定部63は、サブゲートウェイに指定するノード装置10に対して、サブゲートウェイとして動作することを要求するクラスタデータパケット(SGW要求、REQ_SGW)を送信する。図14に示すように、SGW要求の場合、クラスタタイプフィールドの値は「6」に設定される。また、クラスタIDフィールドには、隣接クラスタのIDが記録される。サブゲートウェイ決定部63は、SGW要求のクラスタデータパケットを手順(45)で決定した候補ノードに送信する。さらに、サブゲートウェイ決定部63は、隣接クラスタテーブル43について、SGW要求のクラスタIDフィールドにIDが記録されている隣接クラスタに対応付けられた確定フラグを「1」に設定する。
例えば、ノードSのサブゲートウェイ決定部63は、クラスタIDフィールドにクラスタCLのID、クラスタタイプフィールドに6を設定したクラスタデータパケットを生成し、ノードCにむけて送信する。図29では、SGW要求は、隣接クラスタID、および、送信先のノード装置10と対応付けて、(REQ_SGW,CL,C)のように表記されている。SGW要求の送信後、サブゲートウェイ決定部63は、隣接クラスタテーブル43でクラスタCLに対応付けられた確定フラグを1に設定する。
(47)ノードAは、ルーティングテーブル95を参照することにより、ノードSから受信したSGW要求をノードCに送信する。
(48)ノードCは、SGW要求を受信すると、ノードCがサブゲートウェイであることを認識し、サブゲートウェイとしての動作を開始する。例えば、ノードCは、ノードCの所属クラスタとは異なるクラスタに所属するノード装置10からHelloパケットを受信した場合でも、Helloパケットに応じてルーティングテーブル95を更新する。また、ノードCから送信されるHelloパケットでは、SGWフラグが1に設定される。サブゲートウェイとしての動作については、後で詳しく述べる。
(49)ノードCは、ノードSにSGW応答(ACK_SGW)であるクラスタデータパケットを送信する。図14に示すように、SGW応答の場合、クラスタタイプフィールドの値は「7」に設定される。また、クラスタIDフィールドには、隣接クラスタのIDが記録される。図29では、SGW応答は、隣接クラスタID、および、送信元のノード装置10と対応付けて、(REQ_ACK,CL,C)のように表記されている。
(50)ノードAは、ルーティングテーブル95を参照することにより、ノードCから受信したSGW応答をノードSに送信する。
(51)起点ノードは、SGW応答を受信すると、ゲートウェイ候補テーブル44において、SGW応答の送信元のノード装置に対応する状態フラグを1に設定する。ここでは、ノードSは、SGW応答を受信すると、ノードCについて隣接クラスタがCLであるエントリの状態フラグを1に設定する。
(52)サブゲートウェイに設定されたノードCは、クラスタCL中のノード装置10であり、かつ、ノードCに隣接しているノード装置10に対して、サブゲートウェイとして動作することを要求する。このとき、ノードCのサブゲートウェイ決定部63は、クラスタテーブル92を参照し、クラスタCLに含まれているノード装置をサブゲートウェイに設定するために選択する。ここでは、サブゲートウェイ決定部63がノードMを選択したものとする。サブゲートウェイ決定部63は、SGW要求を生成してノードMに送信する。なお、SGW要求の生成は、手順(42)と同様である。さらに、サブゲートウェイ決定部63は、ルーティングテーブル(RT)95にノードMのエントリを追加する。このとき、ノードMがサブゲートウェイであることも合せて登録される。
(53)ノードMは、SGW要求を受信すると、ノードMの所属クラスタ(クラスタCL)とは異なるクラスタ(クラスタCS)に所属するノードからSGW要求を受信したことを認識する。すると、ノードMは、サブゲートウェイとしての動作を開始する。また、所属ノードの起点ノード装置に、SGW応答を送信することにより、サブゲートウェイとして動作していることを通知する。ここでは、ノードMは、ノードLにSGW応答を送信する。SGW応答の生成方法は、手順(49)で述べたとおりである。さらに、ノードMのサブゲートウェイ決定部63は、ルーティングテーブル95にノードCのエントリを追加する。このとき、ノードCがサブゲートウェイであることを登録する。
(54)起点ノードの動作は手順(51)と同様である。すなわち、ノードLは、SGW応答を受信すると、ゲートウェイ候補テーブル44において、ノードMの隣接クラスタがCLであるエントリの状態フラグを1に設定する。
図30は、隣接クラスタ通知部61の動作の例を説明するフローチャートである。隣接クラスタ通知部61は、リンクテーブル91に登録されている未処理のエントリを1つ取得する(ステップS121、ステップS122でYes)。次に、隣接クラスタ通知部61は、取得したエントリに含まれているクラスタIDは、所属クラスタのクラスタIDであるかを確認する(ステップS123)。所属クラスタのクラスタIDが含まれている場合、隣接クラスタ通知部61はステップS121に戻って他のエントリの処理を開始する(ステップS123でYes)。一方、取得したエントリのクラスタIDが所属クラスタのクラスタIDとは異なる場合、隣接クラスタ通知部61は、取得したエントリに含まれているクラスタIDを隣接クラスタテーブル43に記録して、ステップS121に戻る(ステップS123でNo、ステップS124)。リンクテーブル91に含まれている全てのエントリについて処理が終わると、隣接クラスタ通知部61は、隣接クラスタテーブル43にクラスタIDが記録されているかを確認する(ステップS125)。隣接クラスタテーブル43にクラスタIDが記録されている場合、隣接クラスタ通知部61は、隣接クラスタを通知するためのクラスタデータパケットを生成して、所属クラスタの起点ノード装置に送信する(ステップS125でYes、ステップS126、S127)。一方、隣接クラスタテーブル43にクラスタIDが記録されていない場合、隣接クラスタ通知部61は処理を終了する(ステップS125でNo)。
図31は、隣接クラスタを通知されたときの候補テーブル生成部62の動作の例を説明するフローチャートである。図31は、図29を参照しながら説明した手順(44)で行われる動作の例を示す。候補テーブル生成部62は隣接クラスタの通知を受信すると、クラスタデータパケットにクラスタIDが含まれているかを確認する(ステップS131、ステップS132)。未処理のクラスタリストがクラスタデータパケットに含まれていない場合、候補テーブル生成部62は処理を終了する(ステップS132でNo)。一方、クラスタIDが含まれている場合、候補テーブル生成部62は、クラスタデータパケットの送信元のアドレス(GS)と、受信パケット中のクラスタID(隣接クラスタ)の組み合わせで、ゲートウェイ候補テーブル44を検索する(ステップS133)。GSと隣接クラスタの組み合わせがゲートウェイ候補テーブル44に記録されていない場合、候補テーブル生成部62は、ゲートウェイ候補テーブル44に、GSと隣接クラスタの組み合わせのエントリを追加する(ステップS134でNo、ステップS135、S136)。GSと隣接クラスタの組み合わせがゲートウェイ候補テーブル44に記録されている場合は、ステップS135とS136は行われない(ステップS134でYes)。次に、候補テーブル生成部62は、隣接クラスタIDをキーとして、隣接クラスタテーブル43を検索する(ステップS137)。隣接クラスタIDが隣接クラスタテーブル43に記録されている場合、候補テーブル生成部62は、ステップS131以降の処理を繰り返す(ステップS138でYes)。一方、隣接クラスタIDが隣接クラスタテーブル43に記録されていない場合、候補テーブル生成部62は、隣接クラスタテーブル43に、隣接クラスタIDを記録したエントリを追加する(ステップS138でNo、ステップS139、S140)。
図32は、サブゲートウェイを生成する際の起点ノード装置の動作の例を説明するフローチャートである。起点ノード装置中のサブゲートウェイ決定部63は、隣接クラスタテーブル43に含まれている未処理のエントリを読み込む(ステップS151、ステップS152でYes)。なお、隣接クラスタテーブル43に未処理のエントリが残っていない場合、サブゲートウェイ決定部63は、処理を終了する(ステップS152でNo)。未処理のエントリを読み込んだ場合、サブゲートウェイ決定部63は、確定フラグの値を確認する(ステップS153)。確定フラグの値が1であり、すでにサブゲートウェイが確定されている場合、サブゲートウェイ決定部63はステップS151に戻る(ステップS153でNo)。
一方、確定フラグの値が0であり、サブゲートウェイが決まっていない場合、サブゲートウェイ決定部63はゲートウェイ候補テーブル44から未処理のエントリを取得する(ステップS154、ステップS155でYes)。なお、ゲートウェイ候補テーブル44から未処理のエントリが取得できない場合、サブゲートウェイ決定部63は処理を終了する(ステップS155でNo)。次に、サブゲートウェイ決定部63は、取得したエントリの状態フラグが未確定(状態フラグ=0)であることを示しているかを確認する(ステップS155でYes、ステップS156)。取得したエントリの状態フラグが未確定ではない(状態フラグ=1)場合、ステップS154以降の処理が繰り返される(ステップS156でNo)。一方、取得したエントリの状態フラグが未確定を表す場合、サブゲートウェイ決定部63は、隣接クラスタテーブル43のクラスタIDとゲートウェイ候補テーブル44のクラスタIDが一致しているかを確認する(ステップS157)。両者が一致していない場合、ステップS154以降の処理が繰り返される(ステップS157でNo)。
隣接クラスタテーブル43のクラスタIDとゲートウェイ候補テーブル44のクラスタIDが一致している場合、サブゲートウェイ決定部63は、SGW要求を生成する(ステップS157でYes、ステップS158)。さらに、サブゲートウェイ決定部63は、ステップS155で読み込んだゲートウェイ候補テーブル44のエントリに記録されているノードに、SGW要求を送信する(ステップS159)。さらに、サブゲートウェイ決定部63は、ステップS151で読み込んだ隣接クラスタテーブル43のエントリについて、確定フラグを確定(確定フラグ=1)に設定する(ステップS160)。このフローでは、起点ノードが、サブゲートウェイが未設定である隣接クラスタに対してサブゲートウェイを設定する処理を1度だけ行う方法を表している。サブゲートウェイが未設定である複数の隣接クラスタに対して処理を行うために、ステップS151からステップS160の処理を同時に並行して実行しても良い。
図33は、サブゲートウェイに指定されたノードの動作の例を説明するフローチャートである。SGW要求を受信したノードは、サブゲートウェイに設定されたことを認識すると共に、SGW応答を生成する(ステップS171、S172)。サブゲートウェイ決定部63は、生成したSGW応答を、所属クラスタの起点ノード装置に送信する(ステップS173)。さらに、サブゲートウェイ決定部63は、SGW要求の送信元(GS)が起点ノード装置であるかを確認する(ステップS174)。SGW要求の送信元が起点ノード装置ではない場合は、処理を終了する(ステップS174でNo)。
一方、SGW要求の送信元が起点ノード装置である場合、サブゲートウェイ決定部63は、SGW要求のクラスタIDで識別されるクラスタに所属する隣接ノードをリンクテーブル91から選択する(ステップS174でYes、ステップS175)。リンクテーブル91に該当するエントリが存在する場合、サブゲートウェイ決定部63は、SGW要求を生成して選択したノードに送信する(ステップS176でYes、ステップS177、S178)。さらに、サブゲートウェイ決定部63は、選択したリンクテーブル91のエントリをルーティングテーブル95に登録する(ステップS179)。一方、ステップS176で、SGW要求のクラスタIDで識別されるクラスタに所属する隣接ノードがリンクテーブル91に含まれていない場合、サブゲートウェイ決定部63は処理を終了する(ステップS176でNo)。
サブゲートウェイが決定されると、デフォルトGW決定部41は、所属クラスタに所属していないノード装置10にパケットを送信する際に用いるサブゲートウェイを選択する。以下の説明では、所属クラスタに所属していないノード装置10にパケットを送信する際に用いるサブゲートウェイのことを「デフォルトゲートウェイ」と記載する。
クラスタ内の各ノード装置10は、ホップ数が一番小さいサブゲートウェイをデフォルトゲートウェイとすることができる。なお、ホップ数を用いる方法は、デフォルトゲートウェイの決定方法の例であって、デフォルトゲートウェイの決定方法は、実装に応じて任意に変更することができる。例えば、通信品質(到達率、輻輳など)も用いてデフォルトゲートウェイを決定することもできる。
<サブゲートウェイが決定された後のHelloパケットの処理>
次に、図21を参照しながら、サブゲートウェイが決定された後で、Helloパケットが処理される場合の動作について説明する。サブゲートウェイが所属クラスタに所属するノードからHelloパケットを受信したときの処理は、ステップS61〜S72の通りである。ここで、ステップS66のクラスタテーブル92の更新の処理について図23を参照しながら説明する。Helloパケットを受信したノードは、Helloパケットの送信元(LS)はサブゲートウェイであるかを、HelloパケットのSGWフラグによって確認する(ステップS91)。送信元がサブゲートウェイである場合、Helloパケットを受信したノードは、Helloパケットの送信元がクラスタテーブル92のサブゲートウェイリストに記録されているかを確認する(ステップS92、S93)。サブゲートウェイがクラスタテーブル92に登録されている場合、クラスタテーブル92の更新処理が終了される(ステップS93でYes)。一方、サブゲートウェイがクラスタテーブル92に登録されていない場合、Helloパケットを受信したノードは、クラスタテーブル92のサブゲートウェイリストに、Helloパケットの送信元を記録する(ステップS93でNo、ステップS94)。なお、Helloパケットの送信元がサブゲートウェイではない場合の処理は、前述のとおりである。
次に、図21を参照しながら、サブゲートウェイが決定された後で、Helloパケットが処理される場合の動作について説明する。サブゲートウェイが所属クラスタに所属するノードからHelloパケットを受信したときの処理は、ステップS61〜S72の通りである。ここで、ステップS66のクラスタテーブル92の更新の処理について図23を参照しながら説明する。Helloパケットを受信したノードは、Helloパケットの送信元(LS)はサブゲートウェイであるかを、HelloパケットのSGWフラグによって確認する(ステップS91)。送信元がサブゲートウェイである場合、Helloパケットを受信したノードは、Helloパケットの送信元がクラスタテーブル92のサブゲートウェイリストに記録されているかを確認する(ステップS92、S93)。サブゲートウェイがクラスタテーブル92に登録されている場合、クラスタテーブル92の更新処理が終了される(ステップS93でYes)。一方、サブゲートウェイがクラスタテーブル92に登録されていない場合、Helloパケットを受信したノードは、クラスタテーブル92のサブゲートウェイリストに、Helloパケットの送信元を記録する(ステップS93でNo、ステップS94)。なお、Helloパケットの送信元がサブゲートウェイではない場合の処理は、前述のとおりである。
また、ステップS72で行われるクラスタテーブル92の更新について、図25を参照しながら説明する。Helloパケットを受信したノードは、Helloパケットのデータ部分に含まれる経路情報のリストについて、GDがサブゲートウェイであるかを確認する(ステップS111)。GDがサブゲートウェイである場合、Helloパケットを受信したノードは、GDがクラスタテーブル92のサブゲートウェイリストに記録されているかを確認する(ステップS112、S113)。サブゲートウェイがクラスタテーブル92に登録されている場合、クラスタテーブル92の更新処理が終了される(ステップS113でYes)。一方、サブゲートウェイがクラスタテーブル92に登録されていない場合、Helloパケットを受信したノードは、クラスタテーブル92のサブゲートウェイリストに、GDを記録する(ステップS113でNo、ステップS114)。なお、Helloパケットにより通知された経路のGDがサブゲートウェイではない場合の処理は、前述のとおりである。
次に、Helloパケットを所属クラスタとは異なるクラスタから受信した場合の処理について(図21のステップS64でNo)、図21を参照しながら説明する。Helloパケットを受信したノード装置10は、サブゲートウェイであるかを確認する(ステップS73)。Helloパケットを受信したノード装置10がサブゲートウェイである場合、経路管理部21は、ルーティングテーブル95とクラスタテーブル92を更新する(ステップS73でYes、ステップS74、S75)。ここで、ステップS74の処理は図22を参照しながら説明した処理と同様である。また、ステップS75の処理は、図23を参照しながら説明した処理と同様である。一方、Helloパケットを受信したノード装置10は、サブゲートウェイではない場合、ノード装置10は処理を終了する(ステップS73でNo)。
<クラスタ内でのデータパケットの送受信>
図34は、データパケットのフォーマットの例を示す。データパケット処理部81は、データパケットを生成する。このとき、データパケットのヘッダのTypeフィールドの値は、図4にも示すように「3」に設定される。Lengthフィールドの値はデータパケットに含まれているデータの長さを表す。データパケット処理部81は、データパケットの宛先のアドレスをGDに設定する。さらにデータパケット処理部81は、ルーティングテーブル95のGDの欄を宛先アドレスで検索し、ヒットしたエントリ中にLDとして登録されているノードをLDに設定する。また、データパケット処理部81は、GSとLSを送信元ノードのアドレスに設定する。ホップ数は送信元ノードからのホップ数をカウントするために用いられ、送信元ノードでは0に設定される。FIDフィールドには、FID生成部13から入力された値が記録される。データフィールドには、送信データが含まれる。GSとFIDを組み合わせて、パケットにネットワーク上での唯一性を表している。
図34は、データパケットのフォーマットの例を示す。データパケット処理部81は、データパケットを生成する。このとき、データパケットのヘッダのTypeフィールドの値は、図4にも示すように「3」に設定される。Lengthフィールドの値はデータパケットに含まれているデータの長さを表す。データパケット処理部81は、データパケットの宛先のアドレスをGDに設定する。さらにデータパケット処理部81は、ルーティングテーブル95のGDの欄を宛先アドレスで検索し、ヒットしたエントリ中にLDとして登録されているノードをLDに設定する。また、データパケット処理部81は、GSとLSを送信元ノードのアドレスに設定する。ホップ数は送信元ノードからのホップ数をカウントするために用いられ、送信元ノードでは0に設定される。FIDフィールドには、FID生成部13から入力された値が記録される。データフィールドには、送信データが含まれる。GSとFIDを組み合わせて、パケットにネットワーク上での唯一性を表している。
図35は、データパケットの受信に際して行われる動作の例を説明するフローチャートである。データパケット処理部81は、パケット分岐処理部12を介して受信したデータパケットのGDと、パケットを受信したノード装置10に割り当てられているアドレスが一致するかを確認する(ステップS191)。データパケットのGDと、ノード装置10に割り当てられているアドレスが一致した場合、データパケット処理部81は、データパケットが上位処理部14での処理対象であると判断し、上位処理部14に通知する(ステップS191でYes、ステップS192)。また、データパケット処理部81は、適宜、データパケットを上位処理部14に出力することもできる。
一方、データパケットのGDと、ノード装置10に割り当てられているアドレスが一致しない場合、データパケット処理部81は、受信パケットを他のノードに転送することを決定する(ステップS191でNo)。データパケット処理部81は、ルーティングテーブル95のGDの欄を、データパケットのGDに記録されているアドレスをキーとして検索し、ヒットするエントリがあるかを確認する(ステップS193、S194)。GDに設定されているノードが所属クラスタと同じクラスタに所属している場合、ルーティングテーブル95にヒットするエントリがある(ステップS194でYes)。データパケット処理部81は、データパケットのLDを、ヒットしたエントリにLDとして記録されているノードのアドレスに変更し、LSをそのデータパケットを処理しているノード装置10のアドレスに変更する。さらに、ホップ数の値を1つインクリメントする(ステップS195)。データパケット処理部81は、ホップ数の値を、予め記憶しているHop限界値と比較する(ステップS196)。ホップ数の値がHop限界値以下である場合、データパケット処理部81は、送信部16を介してデータパケットを転送する(ステップS196でYes、ステップS197)。一方、ホップ数の値がHop限界値を超えた場合、データパケット処理部81は、データパケットを破棄して処理を終了する(ステップS196でNo)。
ステップS194においてNoと判定された場合は、GDに設定されているノードが所属クラスタと同じクラスタに所属していない。この場合に行われる処理については後で説明する。
<所属クラスタに含まれないノード装置との通信方法>
サブゲートウェイではないノード装置10は、所属クラスタに所属していないノード装置10までの経路をルーティングテーブル95に記録していない。そこで、所属クラスタに含まれていないノード装置10にパケットを送信する場合、ノード装置10は、そのノード装置10のデフォルトゲートウェイにハイウェイデータパケットを送信する。
サブゲートウェイではないノード装置10は、所属クラスタに所属していないノード装置10までの経路をルーティングテーブル95に記録していない。そこで、所属クラスタに含まれていないノード装置10にパケットを送信する場合、ノード装置10は、そのノード装置10のデフォルトゲートウェイにハイウェイデータパケットを送信する。
図36は、ハイウェイデータパケットのフォーマットの例を示す。ハイウェイデータパケットはハイウェイデータパケット処理部82によって生成される。ハイウェイデータパケットは、データパケットの先頭に、さらにヘッダを含んでいる。以下、区別をし易くするために、ハイウェイデータパケットの先頭に付されているヘッダを「アウターヘッダ」、ハイウェイデータパケット中のデータパケットに含まれているヘッダを「インナーヘッダ」と記載する。アウターヘッダのフォーマットは、インナーヘッダのフォーマットと同様である。
アウターヘッダのTypeフィールドには、ハイウェイデータパケットであることを表す値が設定される。図36の例では、ハイウェイデータパケットの先頭のTypeフィールドは、2に設定される。アウターヘッダのGDにはハイウェイデータパケットの宛先ノードのアドレスが記録される。例えば、送信元のノードは、ハイウェイデータパケットの宛先ノードを送信元ノードのデフォルトゲートウェイとする。アウターヘッダのGS、LS、LDは、データパケットの場合と同様に設定される。一方、インナーヘッダでは、LSとLDは設定されなくても良い。インナーヘッダのGDはデータパケットの宛先ノードのアドレス、GSはデータパケットの送信元ノードのアドレスに設定される。
図37は、所属クラスタに含まれないノード装置との通信方法の例を示す。図37(a)に示すように、まず、送信元ノードは、ハイウェイデータパケットを生成すると、送信元ノードのデフォルトゲートウェイにハイウェイデータパケットを送信する。すると、ハイウェイデータパケットを受信したサブゲートウェイは、ハイウェイデータパケットのインナーヘッダのGDを取得し、取得したGDが所属しているクラスタを検索する。クラスタの検索には、検索データパケットが用いられる。
検索データパケットのフォーマットの例を図38に示す。検索データパケットは、検索実行部72により生成される。検索データパケットのペイロードは、SearchTypeフィールド、foundフラグ、Search IDフィールド、Hop数、KeyGSフィールド、KeyFIDフィールド、Checkedaddrフィールドが含まれる。SearchTypeフィールドは、その検索データパケットが検索を要求しているか、検索結果を通知しているかを区別するために用いられる。以下の説明では、検索を要求する検索データパケットでは、SearchTypeフィールドの値が0に設定され、検索結果を通知する検索データパケットではSearchTypeフィールドの値が1に設定されるものとする。Search IDフィールドは、検索の対象となるノードのアドレスを記録する。foundフラグは検索対象のノードが検出されたかを示す。foundフラグ=0は未検出を表し、foundフラグ=1は検出成功を表す。Hop数は、検索データパケットの送信元から検出されたノードまでのホップ数を示す。KeyGSフィールドは、ハイウェイデータパケット中のインナーヘッダ(データパケットのヘッダ)に設定されているGSを記録し、KeyFIDフィールドは、インナーヘッダのFIDを記録する。Checkedaddrフィールドは、検索対象とされたクラスタの情報が記録される。
検索データパケットのTypeフィールドは検索データパケットであることを表す値に設定される。例えば、図4の例では、Typeフィールドは「4」に設定される。検索データパケットのGDは、検索を行う対象となるクラスタ中のサブゲートウェイのアドレスである。LSは、検索データパケットを送信するノードのアドレス、GSは、検索データパケットの送信元のアドレス、LDはGDへの転送先のアドレスである。なお、データパケット処理部81は、ルーティングテーブル95を参照してLDを取得する。
クラスタの検索を行うサブゲートウェイ中の検索実行部72は、そのサブゲートウェイの所属クラスタが隣接しているクラスタの各々について、検索データパケットを送信する。検索データパケットが送信される場合の例を図37(b)に示す。検索データパケットを受信したサブゲートウェイの各々は、所属クラスタに検索の対象となっているノード装置10が所属しているかを確認する。検索の対象となっているノード装置10が検出できない場合、サブゲートウェイは、新たに検索データパケットを生成し、所属クラスタに隣接しているクラスタに送信する。検索の対象となっているノード装置10が検出できた場合、サブゲートウェイは、そのサブゲートウェイに問合せを行ったノード装置10に向けて検索結果を通知する。検索結果の通知の様子を図37(c)に示す。ハイウェイデータパケットを受信したサブゲートウェイは、検索結果を取得すると、検索の対象となっているノード装置10が所属するクラスタへハイウェイデータパケットを送信する。ハイウェイデータパケットを受信したサブゲートウェイは、ハイウェイデータパケットのアウターヘッダを除去し、データパケットの宛先にデータパケットを送信する。データパケットが送信されたときの例を図37(d)に示す。
次に、図39を参照しながらデータパケットの送信で行われる動作について詳しく説明する。
図39は、データパケットの宛先の検索方法とデータパケットの送信の例を示す。図39の例では、クラスタC1に所属するノードSがクラスタC3に所属するノードGにデータパケットを送信するものとする。ここで、ノードSおよびノードAはクラスタC1、ノードBおよびノードCはクラスタC2、ノードDおよびノードGがクラスタC3に所属しているものとする。また、ノードAはノードSのデフォルトゲートウェイであるとする。さらに、クラスタC1はクラスタC2に隣接しているが、クラスタC3には隣接しておらず、クラスタC2はクラスタC1およびクラスタC3に隣接しているものとする。
図39は、データパケットの宛先の検索方法とデータパケットの送信の例を示す。図39の例では、クラスタC1に所属するノードSがクラスタC3に所属するノードGにデータパケットを送信するものとする。ここで、ノードSおよびノードAはクラスタC1、ノードBおよびノードCはクラスタC2、ノードDおよびノードGがクラスタC3に所属しているものとする。また、ノードAはノードSのデフォルトゲートウェイであるとする。さらに、クラスタC1はクラスタC2に隣接しているが、クラスタC3には隣接しておらず、クラスタC2はクラスタC1およびクラスタC3に隣接しているものとする。
(61)ノードSのデータパケット処理部81は、ノードG宛のデータパケットを生成する。データパケットのGDはノードG、GSとLSはノードSに設定されている。しかし、データパケット処理部81は、ルーティングテーブル95にノードGが記録されていないことを認識すると、LDを設定せずに、生成したデータパケットをハイウェイデータパケット処理部82に出力する。
ハイウェイデータパケット処理部82は、入力されたデータパケットにアウターヘッダを付加する。ハイウェイデータパケット処理部82は、アウターヘッダのGDを、ノードSのデフォルトゲートウェイであるノードAに設定する。アウターヘッダのGSとLSはノードSに設定される。ハイウェイデータパケット処理部82は、ルーティングテーブル95を参照することにより、ノードAにパケットを送信するために指定するLDを取得し、取得した値をアウターヘッダのLDに設定する。ここで生成されたパケットは図39(a)に示すとおりである。ハイウェイデータパケット処理部82は、ハイウェイデータパケットをノードAに向けて送信する。
(62)ノードAは、ハイウェイデータパケットを受信すると、ハイウェイテーブル94を確認する。ハイウェイテーブル94は、ハイウェイデータパケットの転送や、経路の検索をしたことがあるために、LDを認識しているノードについての情報が記録されている。ハイウェイテーブル94は、所属クラスタ以外に所属するGDと、そのGDに対応するLDを記録している。なお、サブゲートウェイではないノード装置10は、ハイウェイテーブル94を保持しないことができる。
ノードAのハイウェイデータパケット処理部82は、受信したハイウェイデータパケットのGDがハイウェイテーブル94に記録されていない場合、ハイウェイデータパケットをペンディングデータテーブル83に記録する。ペンディングデータテーブル83は、ハイウェイデータパケットを記録できる任意の形式とすることができる。ハイウェイデータパケット処理部82は、ハイウェイデータパケットのインナーヘッダのGDを検索先決定部71に通知し、経路の検索を要求する。
検索先決定部71は、サーチログテーブル(SLT)73を確認する。サーチログテーブル73は、これまでに検索された経路に付いての情報が記録されている。サーチログテーブル73の各エントリには、LS、FID、GS、doneフラグ、および、アドレスリストが含まれている。図39中のサーチログテーブル73の記載では、エントリごとに、左側からLS、FID、GS、doneフラグ、アドレスリストの順にデータが記録されているものとする。サーチログテーブル73のLSの欄には、検索データパケットの送信元となるノード装置10のアドレスが記録される。FIDにはハイウェイデータパケットに含まれているデータパケットのFID、GSにはハイウェイデータパケットの送信元ノードのアドレスが記録される。doneフラグは、検索が終了したかを表す。以下の説明では、doneフラグ=0は検索が終わっていないことを表し、doneフラグ=1は検索が終わっていることを表すものとする。アドレスリストには、検索データパケットの送信先のノード装置10のアドレスが記録される。
サーチログテーブル73の例を図39(b)に示す。検索先決定部71は、通知されたGDについてのエントリがサーチログテーブル73に含まれていない場合、エントリを生成して通知されたGDについての情報をサーチログテーブル73に記録する。ここでは、LSはノードA、GSはノードSである。また、doneフラグ=0、FIDはFID0に設定される。検索先決定部71は、隣接クラスタから検索先を選択して、検索実行部72に通知する。検索実行部72は、検索先のクラスタのサブゲートウェイのうちでノードAの隣接ノードであるノードを検索データパケットの送信先に決定する。ここではクラスタC2が検索先に指定され、検索データパケットの送信先はノードBに決定されたものとする。さらに、検索実行部72は、サーチログテーブル73のアドレスリストに、検索データパケットの送信先(ノードB)を記録する。
検索実行部72は、検索データパケットを生成する。ノードAが生成する検索データパケットの例を図39(c)に示す。ノードAで生成された検索データパケットは、GSとLSがノードAとなる。GDおよびLDは、検索データパケットの送信先のノードBとなる。検索実行部72は、SearchTypeフィールドの値を0、foundフラグ=0、ホップ数=0、KeyGSフィールドの値をノードSに設定する。さらに、検索実行部72は、CheckedaddrフィールドにクラスタC1を指定することにより、クラスタC1が検索済みであることをノードBに通知する。ノードAの検索実行部72は、生成した検索データパケットをノードBに向けて送信する。
(63)ノードBの検索先決定部71は、SearchTypeフィールドの値が0に設定された検索データパケットを受信すると検索を行う。まず、検索先決定部71は、Checkedaddrフィールドの値を確認する。ここでは、Checkedaddrフィールドの値から、所属クラスタ(クラスタC2)が検索されていないことを認識する。すると、ノードBの検索先決定部71は、検索データパケットのSearch IDフィールドに記録されているノードがルーティングテーブル95に記録されているかを確認する。ここでは、ノードBが保持するルーティングテーブル95にはノードGが記録されていない。すると、検索先決定部71は、ノードGはクラスタC2に所属していないことを認識する。
次に、ノードBの検索先決定部71は、検索データパケットのKeyGSフィールドの値とKeyFIDフィールドの値を抽出し、抽出した値の組み合わせに対応付けられたエントリがサーチログテーブル73に記録されているかを確認する。ここでは、KeyGSフィールドの値とKeyFIDフィールドの値に対応するエントリがサーチログテーブル73に含まれていないものとする。すると、検索先決定部71は、エントリをサーチログテーブル73に追加し、LS、FID、GS、doneフラグの値を設定する。次に、ノードBの検索先決定部71は、隣接クラスタのうちで、まだ検索が行われていないクラスタを検索先に決定する。ここでは、検索先決定部71は、クラスタC3を検索先に指定して検索実行部72に通知する。
検索実行部72は、所属クラスタのサブゲートウェイであって、かつ、クラスタC3に含まれているサブゲートウェイに隣接しているサブゲートウェイ(ノードC)を検索データパケットの送信先に決定する。従って、サーチログテーブル73には、
LS :ノードA
FID :FID0
GS :ノードS
doneフラグ:0
GD :ノードC
の情報が記録される。サーチログテーブル73の例を図39(d)に示す。
LS :ノードA
FID :FID0
GS :ノードS
doneフラグ:0
GD :ノードC
の情報が記録される。サーチログテーブル73の例を図39(d)に示す。
さらに、検索実行部72は、ノードCに、検索データパケットを送信する。検索データパケットの生成方法は、手順(62)で説明した方法と同様である。ノードBが生成する検索データパケットの例を図39(e)に示す。ノードBの検索実行部72は、検索データパケットのGDをノードC、GSとLSをノードBに設定する。さらに、ノードBの検索実行部72は、ホップ数を1に設定し、さらに、クラスタC1とクラスタC2が検索済みであることをCheckedaddrフィールドに記録する。ノードBの検索実行部72は、ルーティングテーブル95を参照してLDを決定し、生成した検索データパケットを送信する。
(64)ノードBからノードCに至る経路のノード装置10は、検索データパケットを受信するたびに、適宜、LSとLDを変更し、ホップ数を1つインクリメントした上で、検索データパケットを転送する。
(65)ノードCの検索先決定部71は、検索を要求する検索データパケットを受信すると、Checkedaddrフィールドの値から、所属クラスタ(クラスタC2)が検索済みであることを認識する。すると、ノードCの検索先決定部71はルーティングテーブル95の検索を行わない。
次に、ノードCの検索先決定部71は、検索データパケットのKeyGSフィールドの値とKeyFIDフィールドの値の組み合わせに対応するエントリがサーチログテーブル73に記録されているかを確認する。ここでは、検索データパケットから得られた値の組み合わせに対応するエントリがサーチログテーブル73に含まれていないので、検索先決定部71は、
LS :ノードB
FID :FID0
GS :ノードS
doneフラグ:0
GD :ノードD
を示すエントリをサーチログテーブル73に追加する。追加されたエントリの例を、図39(f)に示す。なお、サーチログテーブル73のLSは、検索データパケットの送信元ノードであるので、ノードBとなる。ノードCの検索先決定部71は、隣接クラスタからクラスタC3を検索先に指定して検索実行部72に通知する。
LS :ノードB
FID :FID0
GS :ノードS
doneフラグ:0
GD :ノードD
を示すエントリをサーチログテーブル73に追加する。追加されたエントリの例を、図39(f)に示す。なお、サーチログテーブル73のLSは、検索データパケットの送信元ノードであるので、ノードBとなる。ノードCの検索先決定部71は、隣接クラスタからクラスタC3を検索先に指定して検索実行部72に通知する。
検索実行部72は、隣接ノードであって、かつ、クラスタC3に含まれているサブゲートウェイに隣接しているサブゲートウェイ(ノードD)に、検索データパケットを送信する。検索データパケットの生成方法は、手順(62)で説明した方法と同様である。ノードCが生成する検索データパケットの例を図39(g)に示す。ノードCの検索実行部72は、検索データパケットのGDをノードD、GSとLSをノードCに設定する。また、ホップ数はノードBからノードCに至るまでのホップ数に1を加えた値になる。すなわち、ホップ数は、ノードAを起点としたホップ数である。
(66)ノードDの検索先決定部71は、検索を要求する検索データパケットを受信すると、Checkedaddrフィールドの値を確認する。ここでは、CheckedaddrフィールドにC3が含まれていないため、検索先決定部71は、クラスタC3が検索されていないことを認識する。すると、ノードDの検索先決定部71は、Search IDフィールドに記録されているノードがルーティングテーブル95に記録されているかを確認する。ここでは、ノードDが保持するルーティングテーブル95にはノードGが記録されているものとする。
すると、検索先決定部71は検索が終了したと判断し、検索結果を通知するための検索データパケットを生成する。ノードDで生成される検索データパケットの例を図39(h)に示す。ノードDの検索先決定部71は、検索データパケットのSearchTypeフィールドの値を1、foundフラグを1に設定し、検索結果を通知するための応答であることを示す。さらにCheckedaddrフィールドにクラスタC1〜C3を記録する。検索先決定部71は、ホップ数フィールドに、ノードDからノードGに至るまでのホップ数を記録する。検索先決定部71は、KeyGSフィールド、KeyFIDフィールド、Search IDフィールドの値は、検索を要求してきた検索データパケットと同じ値とする。検索先決定部71は、GDに検索を要求してきた検索データパケットの送信元を設定する。従って、GDにノードCが設定される。さらに、GSとLSがノードDに設定される。検索先決定部71は、生成した検索データパケットをノードCに向けて送信する。
(67)ノードCの検索先決定部71は、SearchTypeフィールドの値が1である検索データパケットを受信すると、検索結果が通知されていると認識する。また、検索データパケットのホップ数フィールドの値を1つインクリメントする。
検索先決定部71は、SearchTypeフィールド=1の検索データパケットの内容をハイウェイテーブル94に記録する。ハイウェイテーブル94に追加されるエントリの例を図39(i)に示す。GDにはSearch IDフィールドの値、LDは、検索データパケットの送信元ノード、Lenの欄には、インクリメント後の検索データパケットのホップ数フィールドの値が記録される。すなわち、Lenの値は、ハイウェイテーブル94を記録しているノードからそのエントリのGDまでのホップ数になる。ここでは、ホップ数は、ノードCからノードGまでのホップ数である。もしハイウェイテーブル94にGDが同じエントリがある場合は、ホップ数が小さい方の値が採用される。
ノードCの検索先決定部71は、サーチログテーブル73を確認して、検索データパケットのペイロードに記録されている情報を通知する対象を特定する。このとき、検索先決定部71は、検索データパケットのKeyGSフィールドとKeyFIDフィールドの値の組合せをキーとして、サーチログテーブル73のGSとFIDの欄を検索する。なお、図39の例では、サーチログテーブル73のGSとFIDの欄は、サーチログテーブル73のエントリの2番目と3番目の欄である。さらに、サーチログテーブル73中の、ヒットしたエントリについては、doneフラグを1に変更する。従って、変更後のサーチログテーブル73のエントリは、
LS :ノードB
FID :FID0
GS :ノードS
doneフラグ:1
GD :ノードD
となる。図39(k)にサーチログテーブル73のエントリが変更されたときの例を示す。検索先決定部71は、ヒットしたエントリのLSに指定されているノードに向けて、ノードDから通知された情報を通知する。このとき、検索先決定部71は図39(j)に示す検索データパケットを生成して、ノードBに向けて送信する。
LS :ノードB
FID :FID0
GS :ノードS
doneフラグ:1
GD :ノードD
となる。図39(k)にサーチログテーブル73のエントリが変更されたときの例を示す。検索先決定部71は、ヒットしたエントリのLSに指定されているノードに向けて、ノードDから通知された情報を通知する。このとき、検索先決定部71は図39(j)に示す検索データパケットを生成して、ノードBに向けて送信する。
(68)ノードBの検索先決定部71は、SearchTypeフィールドの値が1である検索データパケットを受信すると、(67)で説明した手順と同様の処理により、ハイウェイテーブル94とサーチログテーブル73を更新する。ハイウェイテーブル94の例を図39(l)に示す。サーチログテーブル73の変更後のエントリには、
LS :ノードA
FID :FID0
GS :ノードS
doneフラグ:1
GD :ノードC
のデータが記録される。変更後のサーチログテーブル73の例を図39(m)に示す。また、ノードBの検索先決定部71は、図39(n)に示す検索データパケットを生成して、ノードAに送信する。
LS :ノードA
FID :FID0
GS :ノードS
doneフラグ:1
GD :ノードC
のデータが記録される。変更後のサーチログテーブル73の例を図39(m)に示す。また、ノードBの検索先決定部71は、図39(n)に示す検索データパケットを生成して、ノードAに送信する。
(69)ノードAの検索先決定部71は、検索データパケットを受信すると、(67)で説明した手順と同様の処理により、ハイウェイテーブル94とサーチログテーブル73を更新する。ハイウェイテーブル94の例を図39(o)に示す。変更後のサーチログテーブル73には、
LS :ノードA
FID :FID0
GS :ノードS
doneフラグ:1
GD :ノードB
のデータが記録される。サーチログテーブル73の例を図39(p)に示す。
LS :ノードA
FID :FID0
GS :ノードS
doneフラグ:1
GD :ノードB
のデータが記録される。サーチログテーブル73の例を図39(p)に示す。
(70)ノードAのハイウェイデータパケット処理部82は、ハイウェイテーブル94にノードGのエントリができたため、ペンディングデータテーブル83に格納されていたハイウェイデータパケットをノードBに転送する。このとき、ハイウェイデータパケットのアウターヘッダのGDはノードB、GSおよびLSはノードAに変更される。
(71)ノードBのハイウェイデータパケット処理部82は、ノードAからハイウェイデータパケットを受信すると、ハイウェイデータパケットのインナーヘッダのGDをキーとして、ルーティングテーブル95を参照する。ルーティングテーブル95にGDが含まれていない場合、ハイウェイデータパケット処理部82は、ハイウェイテーブル94を参照する。ハイウェイテーブル94にGD=ノードGのエントリができたため、ノードBは、このエントリのLDに登録されているノードCをアウターヘッダのGDに設定して、ハイウェイデータパケットをノードCに転送する。
(72)ノードCがノードBからハイウェイデータパケットを受信した場合の処理も手順(71)と同様である。ノードCは、アウターヘッダに含まれるアドレスを変更して、ハイウェイデータパケットをノードDに転送する。
(73)ノードDのハイウェイデータパケット処理部82は、ノードCからハイウェイデータパケットを受信すると、ハイウェイデータパケットのインナーヘッダのGDをキーとして、ルーティングテーブル95を検索する。ルーティングテーブル95にGDが記録されているので、ハイウェイデータパケット処理部82は、ハイウェイデータパケットのアウターヘッダを除去し、データパケット処理部81に出力する。データパケット処理部81に出力されるデータパケットの例を図39(q)に示す。データパケット処理部81は、ルーティングテーブル95を参照してデータパケットをノードGに転送する。
図40は、検索データパケット(SDP)の処理の例を説明するフローチャートである。図40は、検索データパケットを受信したノードの動作を表しており、図40の説明では、検索データパケットを受信したノードのことを「自ノード」と記載することがある。
検索データパケットを受信したノードの検索先決定部71は、SearchTypeフィールドに基づいて、検索が要求されているかを判定する(ステップS221)。検索が要求されている場合、検索先決定部71は、自ノードが検索データパケットのGDと一致するかを確認する(ステップS221でYes、ステップS222)。自ノードが検索データパケットのGDでない場合、検索データパケットを宛先に転送するための処理を行う(ステップS222でNo、ステップS227)。自ノードが検索データパケットのGDである場合、検索先決定部71は、さらに、自ノードがサブゲートウェイであるかを確認する(ステップS222でYes、ステップS223)。自ノードがサブゲートウェイでない場合、検索先決定部71は処理を終了する(ステップS223でNo)。自ノードがサブゲートウェイである場合、Search IDフィールドに記録されているノードが自ノード、もしくは、ルーティングテーブル95に記録されているノードのいずれかであるかを判定する(ステップS224)。Search IDフィールドに記録されているノードが自ノード、もしくは、ルーティングテーブル95に記録されているノードのいずれかである場合、検索は終了する(ステップS224でYes)。そこで、検索先決定部71は、検索結果を通知するための検索データパケットを生成する(ステップS225)。このとき、検索先決定部71は、受信した検索データパケットのGDとGSを入れ替え、foundフラグを1に設定する。また、検索先決定部71は、SearchTypeフィールドの値を1に変更する。次に、検索先決定部71は、検索データパケットの探索済みのクラスタリストに自ノードの所属クラスタを識別するクラスタIDを記録する(ステップS226)。その後、検索先決定部71は、生成した検索データパケットを送信する(ステップS227)。このとき、検索先決定部71は、検索データパケットのGDでルーティングテーブル95を検索し、得られたLDを検索データパケットのLDに設定する。さらに、検索データパケットのLSに自ノードを設定する。
ステップS224で、Search IDフィールドに記録されているノードが自ノードではなく、ルーティングテーブル95に記録されているノードでもない場合、検索先決定部71は、サーチログテーブル73への登録処理を行う(ステップS228)。また、検索先決定部71は、隣接クラスタのうちでまだ検索が行われていないクラスタを検索先として特定し、検索先のクラスタに所属するサブゲートウェイを選択する(ステップS229)。検索データパケットの転送先が得られた場合、検索先決定部71は、転送先のノードをサーチログテーブル73に記録し、ステップS226以降の処理を行う(ステップS231でYes)。一方、全ての隣接クラスタの検索が終わっているなどの理由により、検索データパケットの転送先が得られなかった場合、検索実行部72は、サーチログテーブル73のdoneフラグを1に設定する(ステップS231でNo、ステップS232)。さらに、検索実行部72は、検索データパケットの送信元に対して、検索が終わったことを通知するための検索データパケットを返信する(ステップS233)。ステップS233で送信される検索データパケットでは、SearchTypeフィールド=1が設定されているので、検索データパケットに対する応答であることが宛先のノードで認識される。ここでは検索先のノードまでの経路が発見されていないので、検索データパケットのfoundフラグは0に設定される。
受信した検索データパケットが検索結果を通知している場合、検索先決定部71は、自ノードが検索データパケットのGDと一致するかを確認する(ステップS221でNo、ステップS234)。自ノードが検索データパケットのGDでない場合、検索データパケットを宛先に転送するための処理を行う(ステップS234でNo、ステップS241)。自ノードが検索データパケットのGDである場合、検索先決定部71は、さらに、自ノードがサブゲートウェイであるかを確認する(ステップS235)。自ノードがサブゲートウェイでない場合、検索先決定部71は処理を終了する(ステップS235でNo)。自ノードがサブゲートウェイである場合、検索データパケットのfoundフラグが1であるかを確認する(ステップS236)。foundフラグが1である場合、検索先決定部71は、検索データパケットで通知された内容をハイウェイテーブル94に記録する(ステップS236でYes、ステップS237)。このとき、ハイウェイテーブル94のGDに、検索データパケットのSearch IDフィールドに記録されているノードが記録される。また、ハイウェイテーブル94のLDに、検索データパケットのGSが記録される。さらに、検索先決定部71は、ハイウェイテーブル94のホップ数を設定する。一方、foundフラグが1でない場合、検索先決定部71はステップS237の処理を行わずにステップS238の処理を行う(ステップS236でNo)。ノード装置10は、自ノードが検索データパケットを用いた問い合わせを開始した場合、ハイウェイテーブル94を用いてハイウェイデータパケットを送信する(ステップS238でYes、ステップS239)。自ノードが検索データパケットを用いた問い合わせを開始したかどうかは、検索データパケットのKeyGSフィールド、KeyFIDフィールドの値の組み合わせでサーチログテーブル73を検索することにより判定される。検索データパケットのKeyGSフィールド、KeyFIDフィールドの値の組み合わせに一致するエントリのLSが自ノードである場合、自ノードが問い合わせを開始したと判定される。一方、検索データパケットを用いた問い合わせを開始したノードではない場合、検索実行部72は、KeyGSフィールド、KeyFIDフィールドの値の組み合わせに一致するエントリのLSをサーチログテーブル73から取得する(ステップS240)。検索実行部72は、検索データパケットのGDに、サーチログテーブル73から得られたLSを設定する。その後、検索先決定部71は、生成した検索データパケットを送信する(ステップS241)。ステップS241で送信される検索データパケットの生成方法は、ステップS227と同様である。
図41は、ハイウェイデータパケットの処理の例を説明するフローチャートである。図41は、ハイウェイデータパケットを受信したノードの動作を表しており、図41の説明では、ハイウェイデータパケットを受信したノードのことを「自ノード」と記載することがある。
ハイウェイデータパケット処理部82は、受信したハイウェイデータパケットのGDが自ノードであるかを判定する(ステップS251)。ハイウェイデータパケットのGDが自ノードである場合、ハイウェイデータパケット処理部82は、自ノードがサブゲートウェイであるかを確認する(ステップS251でYes、ステップS252)。自ノードがサブゲートウェイではない場合、ハイウェイデータパケット処理部82はデータを廃棄した上で処理を終了する(ステップS252でNo、ステップS253)。
一方、自ノードがサブゲートウェイである場合、ハイウェイデータパケット処理部82は、インナーヘッダのGD(データパケットのGD)が自ノードかを確認する(ステップS252でYes、ステップS254)。GDが自ノードである場合、ハイウェイデータパケット処理部82は、上位処理部14にデータを出力して処理を終了する(ステップS254でYes、ステップS255)。GDが自ノードではない場合、インナーヘッダのGDがルーティングテーブル95に登録されているかを確認する(ステップS254でNo、ステップS256)。GDがルーティングテーブル95に登録されている場合、所属クラスタ内にGDがいることになる(ステップS257でYes)。そこで、ハイウェイデータパケット処理部82は、ハイウェイデータパケットをデータパケットに変換してデータパケット処理部81に出力する。さらに、データパケット処理部81は、データパケットのLSを自ノードとし、データパケットのLDをGDに対応付けてルーティングテーブル95に記録されているLDとする(ステップS258)。データパケット処理部81は、データパケットを転送する(ステップS259)。
ステップS257で、GDがルーティングテーブル95に登録されていないと判定された場合、ハイウェイデータパケット処理部82は、インナーヘッダのGDがハイウェイテーブル94に登録されているかを確認する(ステップS257でNo、ステップS260)。GDがハイウェイテーブル94に登録されていない場合、検索データパケットの送信が行われる(ステップS261でNo、ステップS262)。一方、GDがハイウェイテーブル94に登録されている場合、ハイウェイテーブル94のLDをハイウェイデータパケットのGD(アウターヘッダのGD)に設定する(ステップS261でYes、ステップS263)。その後、ハイウェイデータパケット処理部82は、ハイウェイデータパケットのアウターヘッダのGDがルーティングテーブル95に登録されているかを確認する(ステップS264、S265)。アウターヘッダのGDがルーティングテーブル95に登録されていない場合、ハイウェイデータパケット処理部82は、データを廃棄して処理を終了する(ステップS265でNo、ステップS268)。
一方、GDがルーティングテーブル95に登録されている場合、ルーティングテーブル95の該当するエントリに記録されているLDをアウターヘッダのLDに設定する。また、アウターヘッダのLSを自ノードにし、データパケットのホップ数を1つインクリメントする(ステップS265でYes、ステップS266)。ハイウェイデータパケット処理部82は、ホップ数の値が予め記憶しているホップ限界以下の場合、ハイウェイデータパケットを転送する(ステップS269)。一方、ホップ数の値を予め記憶しているホップ限界を超えている場合、ハイウェイデータパケット処理部82は、データを廃棄する(ステップS267でNo、ステップS268)。また、ステップS251でハイウェイデータパケットのGDは自ノードではないと判定された場合は、ステップS264以降の処理が行われる。
さらに、図35を参照しながら、ハイウェイデータパケットが生成される場合の動作について説明する。データパケットのGDが所属クラスタと異なるクラスタに所属している場合、ステップS194でNoと判定され、ハイウェイデータパケットの作成が開始される(ステップS198)。以下の説明では、ステップS198〜S210を参照しながら、ハイウェイデータパケットを生成するノードの動作を説明する。また、ステップS198〜S210の説明では、ハイウェイデータパケットを生成するノードを「自ノード」と記載する。
ハイウェイデータパケット処理部82は、自ノードがサブゲートウェイであるかを確認する(ステップS199)。自ノードがサブゲートウェイではない場合、ハイウェイデータパケット処理部82は、デフォルトゲートウェイまでの経路をルーティングテーブル95から取得する(ステップS200、S201)。ハイウェイデータパケット処理部82は、ハイウェイデータパケットのアドレス等を設定する(ステップS202)。すなわち、ハイウェイデータパケット処理部82は、デフォルトゲートウェイをハイウェイデータパケットのGDに設定し、自ノードをハイウェイデータパケットのGSに設定する。さらに、ハイウェイデータパケット処理部82は、ハイウェイデータパケットのLDをデフォルトゲートウェイまでの経路のLDに設定し、さらに、データパケットのホップ数を1つインクリメントする。ホップ数がホップ限界以下であれば、ハイウェイデータパケット処理部82は、ハイウェイデータパケットを転送する(ステップS208でYes、ステップS209)。一方、ホップ数がホップ限界を超えていれば、ハイウェイデータパケット処理部82は、ハイウェイデータパケットを廃棄する(ステップS208でNo)。
ステップS199で自ノードがサブゲートウェイであると判定された場合、インナーヘッダのGD(データパケットのGD)がハイウェイテーブル94に登録されているかを確認する(ステップS203、S204)。インナーヘッダのGDがハイウェイテーブル94に記録されている場合、ハイウェイデータパケット処理部82は、ハイウェイテーブル94でGDへの経路のLDとして登録されているノードを、アウターヘッダのGDに設定する。さらに、ハイウェイデータパケット処理部82は、ハイウェイデータパケットのGSを自ノードに設定する(ステップS205)。次に、ハイウェイデータパケット処理部82は、ハイウェイデータパケットのアウターヘッダのGDと一致するエントリをルーティングテーブル95から取得する(ステップS206)。ハイウェイデータパケット処理部82は、取得したエントリにLDとして記録されているノードを、ハイウェイデータパケットのアウターヘッダのLDに指定し、LSを自ノードとする。さらに、ハイウェイデータパケット処理部82は、データパケットのホップ数を1つインクリメントする(ステップS207)。ハイウェイデータパケット処理部82は、ホップ数がホップ限界以下の場合、ハイウェイデータパケットを転送し、ホップ数がホップ限界を超えている場合、ハイウェイデータパケットを廃棄する(ステップS208、S209)。なお、ステップS204でハイウェイテーブル94に登録されていないと判定されると、サブゲートウェイは、検索データパケットの送信処理を行う(ステップS210)。
<その他>
以上の説明では、クラスタ中のノード数が閾値まで達したときに新たなクラスタの生成が開始される場合を例としたが、新たなクラスタの生成が開始されるタイミングは実装に応じて変更されることがある。例えば、クラスタ中のノード数が閾値の80%に達したときに新たなクラスタの生成が開始されても良い。
以上の説明では、クラスタ中のノード数が閾値まで達したときに新たなクラスタの生成が開始される場合を例としたが、新たなクラスタの生成が開始されるタイミングは実装に応じて変更されることがある。例えば、クラスタ中のノード数が閾値の80%に達したときに新たなクラスタの生成が開始されても良い。
これまでの説明で図示したパケットのフォーマットは一例である。実装に応じてパケットのフォーマットが適宜変更される場合もある。
さらに、前述の説明では、クラスタの生成を行っている起点ノード装置が1つの場合を例として説明したが、クラスタの生成を行う起点ノード装置の数は複数でもよい。この場合も個々の起点ノード装置の動作は前述のとおりである。
さらに、前述の説明では、クラスタの生成を行っている起点ノード装置が1つの場合を例として説明したが、クラスタの生成を行う起点ノード装置の数は複数でもよい。この場合も個々の起点ノード装置の動作は前述のとおりである。
また、クラスタIDをクラスタの起点ノード装置のアドレスとすることができる。この場合、クラスタIDと起点ノード装置のアドレスは一致するため、クラスタテーブル92は、クラスタIDと起点ノード装置のアドレスのうちの一方を記憶することができ、メモリ領域を節約できる。
10 ノード装置
11 受信部
12 パケット分岐処理部
13 FID生成部
14 上位処理部
15 Hello生成部
16 送信部
20 Hello処理部
21 経路管理部
22 未所属ノード特定部
30 受信処理部
31 ACK処理部
32 バッファ部
40 クラスタ処理部
41 デフォルトGW決定部
42 クラスタ検索テーブル
43 隣接クラスタテーブル
44 ゲートウェイ候補テーブル
50 クラスタ生成部
51 参加要求部
52 参加処理部
53 生成要求部
54 未所属ノード特定部
60 サブゲートウェイ生成部
61 隣接クラスタ通知部
62 候補テーブル生成部
63 サブゲートウェイ決定部
70 検索処理部
71 検索先決定部
72 検索実行部
73 サーチログテーブル
80 データ処理部
81 データパケット処理部
82 ハイウェイデータパケット処理部
83 ペンディングデータテーブル
90 記憶部
91 リンクテーブル
92 クラスタテーブル
93 未所属テーブル
94 ハイウェイテーブル
95 ルーティングテーブル
96 FID管理テーブル
100 MPU
101 バス
102 PHYチップ
104 タイマIC
106 DRAM
107 フラッシュメモリ
108 無線モジュール
11 受信部
12 パケット分岐処理部
13 FID生成部
14 上位処理部
15 Hello生成部
16 送信部
20 Hello処理部
21 経路管理部
22 未所属ノード特定部
30 受信処理部
31 ACK処理部
32 バッファ部
40 クラスタ処理部
41 デフォルトGW決定部
42 クラスタ検索テーブル
43 隣接クラスタテーブル
44 ゲートウェイ候補テーブル
50 クラスタ生成部
51 参加要求部
52 参加処理部
53 生成要求部
54 未所属ノード特定部
60 サブゲートウェイ生成部
61 隣接クラスタ通知部
62 候補テーブル生成部
63 サブゲートウェイ決定部
70 検索処理部
71 検索先決定部
72 検索実行部
73 サーチログテーブル
80 データ処理部
81 データパケット処理部
82 ハイウェイデータパケット処理部
83 ペンディングデータテーブル
90 記憶部
91 リンクテーブル
92 クラスタテーブル
93 未所属テーブル
94 ハイウェイテーブル
95 ルーティングテーブル
96 FID管理テーブル
100 MPU
101 バス
102 PHYチップ
104 タイマIC
106 DRAM
107 フラッシュメモリ
108 無線モジュール
Claims (9)
- ネットワークの経路情報を通知する経路情報パケットを受信する受信部と、
隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置の中から選択した第1のノード装置に、自身が所属している第1のクラスタへの参加を要求するための参加要求パケットを生成する参加要求部と、
前記第1のクラスタに所属している各所属ノード装置までの経路を記憶するルーティングテーブルと、
前記第1のクラスタに所属する所属ノード装置の数が閾値を超えると、前記第1のクラスタに所属していない第2のノード装置に、前記第1のクラスタとは異なる第2のクラスタの生成を要求するための生成要求パケットを生成する生成要求部と、
前記参加要求パケットを前記第1のノード装置に送信し、前記生成要求パケットを前記第2のノード装置に送信する送信部
を備えることを特徴とするノード装置。 - 前記隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置のうち、いずれのクラスタにも所属していない未所属ノード装置を特定すると共に、前記未所属ノード装置を未所属テーブルに記録する未所属ノード特定部をさらに備え、
前記参加要求部は、前記未所属テーブルに記録されているノード装置から、前記第1のクラスタへの参加を要求するノード装置を選択し、
前記未所属ノード特定部は、前記所属ノード装置を前記未所属テーブルから削除し、前記所属ノード装置から通知された情報から、前記所属ノード装置に隣接しているノード装置のうちでいずれのクラスタにも所属していないノード装置を特定し、前記未所属テーブルに記録する
ことを特徴とする請求項1に記載のノード装置。 - 前記所属ノード装置から、前記所属ノード装置に隣接するノード装置が前記第2のクラスタに所属していることを通知する隣接クラスタ通知を受信すると、前記隣接クラスタ通知の送信元を前記第2のクラスタと対応付けて、候補テーブルに記録する候補テーブル生成部と
前記候補テーブルから選択したノード装置を、前記第2のクラスタと前記第1のクラスタの間のゲートウェイとして動作するノード装置であるサブゲートウェイに決定するサブゲートウェイ決定部
をさらに備える
ことを特徴とする請求項1もしくは2に記載のノード装置。 - 前記サブゲートウェイ決定部は、前記サブゲートウェイに、前記第1のクラスタに所属しておらず、かつ、前記サブゲートウェイに隣接するノード装置までの経路をルーティングテーブルに記憶することと、前記隣接クラスタ通知で通知したクラスタに含まれるノード装置を前記サブゲートウェイとして動作させることを要求する
ことを特徴とする請求項3に記載のノード装置。 - 所属しているクラスタ中に複数のサブゲートウェイがある場合、通信条件が所定の条件よりも良いサブゲートウェイを、前記所属しているクラスタに含まれていないノード装置宛のデータパケットの中継先として優先的に選択するデフォルトゲートウェイに決定するデフォルトゲートウェイ決定部をさらに備える
ことを特徴とする請求項3もしくは4に記載のノード装置。 - 第1のノード装置は、前記第1のノード装置の隣接ノード装置、および、前記隣接ノード装置から通信可能なノード装置に、第1のクラスタへの参加を要求することにより、前記第1のノード装置を含む第1のクラスタを生成し、
前記第1のクラスタに所属している所属ノード装置は、経路情報を通知する経路情報パケットを送受信することにより、他の所属ノード装置までの経路をルーティングテーブルに記憶し、
前記第1のノード装置は、前記所属ノード装置の数が閾値を超えるまで、前記第1のクラスタへの参加の要求と、前記ルーティングテーブルへの経路の記憶を繰り返し、
前記所属ノードの数が前記閾値を超えると、前記第1のクラスタに所属していない第2のノード装置に、前記第1のクラスタとは異なる第2のクラスタの生成を要求する
ことを特徴とする通信方法。 - 前記第1のノード装置は、前記第1のクラスタに所属しており、かつ、前記第2のクラスタに所属する第3のノード装置に隣接するノード装置を、前記第1のクラスタと前記第2のクラスタの間のゲートウェイとして動作するノード装置である第1のサブゲートウェイに決定し、
前記第1のサブゲートウェイは、前記第3のノード装置を、第1のクラスタと前記第2のクラスタの間のゲートウェイとして動作する第2のサブゲートウェイに設定し、
前記第1のサブゲートウェイは前記第2のサブゲートウェイまでの経路を前記ルーティングテーブルに記憶する
ことを特徴とする請求項6に記載の通信方法。 - 前記第1のサブゲートウェイは、前記所属ノード装置から前記第1のクラスタとは異なるクラスタに所属する第4のノード装置へ送信されるデータを含むデータパケットを記憶し、
前記第1のサブゲートウェイは、前記第4のノード装置への経路を前記第2のサブゲートウェイに問い合わせ、
前記第2のサブゲートウェイが格納しているルーティングテーブルに前記第4のノード装置が記録されている場合、前記第2のサブゲートウェイは前記第4のノード装置への経路を前記第1のサブゲートウェイに通知し、
前記第1のサブゲートウェイは、通知された経路を用いて、前記データパケットを前記第4のノード装置へ送信する
ことを特徴とする請求項6もしくは7に記載の通信方法。 - ネットワークの経路情報を通知する経路情報パケットを受信し、
隣接するノード装置である隣接ノード装置と前記隣接ノード装置を介して通信可能なノード装置に、第1のクラスタへの参加を要求する制御パケットを送信し、
前記第1のクラスタに所属している所属ノード装置までの経路をルーティングテーブルに記憶し、
前記所属ノード装置の数が閾値を超えると、前記第1のクラスタに所属していないノード装置に、前記第1のクラスタとは異なる第2のクラスタの生成を要求する制御パケットを送信する
処理をコンピュータに行わせることを特徴とする通信プログラム。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2011/071402 WO2013042208A1 (ja) | 2011-09-20 | 2011-09-20 | ノード装置および通信方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP5673840B2 true JP5673840B2 (ja) | 2015-02-18 |
JPWO2013042208A1 JPWO2013042208A1 (ja) | 2015-03-26 |
Family
ID=47914020
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2013534492A Expired - Fee Related JP5673840B2 (ja) | 2011-09-20 | 2011-09-20 | ノード装置および通信方法 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20140198770A1 (ja) |
JP (1) | JP5673840B2 (ja) |
WO (1) | WO2013042208A1 (ja) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6206483B2 (ja) * | 2013-03-29 | 2017-10-04 | 富士通株式会社 | 通信方法、通信プログラム、および、ノード装置 |
JP6217189B2 (ja) * | 2013-07-04 | 2017-10-25 | 富士通株式会社 | 無線通信装置、無線通信方法、無線通信プログラムおよび無線通信システム |
CN108541044B (zh) * | 2013-08-13 | 2019-12-24 | 华为终端有限公司 | 用于加入邻近感知网络设备群的方法及设备 |
CN105814850B (zh) * | 2014-11-21 | 2019-04-12 | 华为技术有限公司 | 路由数据包的方法、节点和通信系统 |
CN105208622B (zh) * | 2015-08-26 | 2019-05-10 | 江苏林洋能源股份有限公司 | 一种高效动态自动维护的路由表结构的路由选择方法及路由表管理方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004056787A (ja) * | 2002-06-19 | 2004-02-19 | Harris Corp | 移動アドホックネットワークおよび重み係数を乗じたサービス品質メトリックに基づいて機能を実行するための方法 |
JP2006033855A (ja) * | 2004-07-15 | 2006-02-02 | Samsung Electronics Co Ltd | アドホックネットワークにおけるプレフィックス割当て方法 |
JP2006186446A (ja) * | 2004-12-27 | 2006-07-13 | Hiroshima Industrial Promotion Organization | 通信方法 |
JP2011520327A (ja) * | 2008-04-15 | 2011-07-14 | テレフオンアクチーボラゲット エル エム エリクソン(パブル) | 通信の信頼性を提供する方法及びシステム |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7466663B2 (en) * | 2000-10-26 | 2008-12-16 | Inrotis Technology, Limited | Method and apparatus for identifying components of a network having high importance for network integrity |
US6744740B2 (en) * | 2001-12-21 | 2004-06-01 | Motorola, Inc. | Network protocol for wireless devices utilizing location information |
US7881229B2 (en) * | 2003-08-08 | 2011-02-01 | Raytheon Bbn Technologies Corp. | Systems and methods for forming an adjacency graph for exchanging network routing data |
KR101394357B1 (ko) * | 2007-10-09 | 2014-05-13 | 삼성전자주식회사 | 무선 센서 네트워크 시스템 및 그의 클러스터 관리 방법 |
CN101540714B (zh) * | 2008-03-21 | 2012-02-01 | 华为技术有限公司 | 网络路径建立与数据发送的方法及网络节点 |
CN102498694A (zh) * | 2009-09-14 | 2012-06-13 | 日本电气株式会社 | 通信系统、转发节点、路径管理服务器、通信方法和程序 |
KR101612475B1 (ko) * | 2010-04-19 | 2016-04-27 | 삼성전자주식회사 | 가십 기반의 p2p 서비스의 파트너쉽 형성 방법 및 장치 |
FI20105658A (fi) * | 2010-06-10 | 2011-12-11 | Defendec Inc | Laite ja menetelmä liikkuvaa ad hoc -monijänneverkkoa varten |
JP2012085115A (ja) * | 2010-10-12 | 2012-04-26 | Panasonic Corp | 通信端末およびクラスター監視方法 |
EP2737642B1 (en) * | 2011-07-29 | 2015-08-19 | ViaSat, Inc. | Incremental gateway deployment in a hub-spoke satellite communication system using static spot beams |
-
2011
- 2011-09-20 JP JP2013534492A patent/JP5673840B2/ja not_active Expired - Fee Related
- 2011-09-20 WO PCT/JP2011/071402 patent/WO2013042208A1/ja active Application Filing
-
2014
- 2014-03-17 US US14/216,462 patent/US20140198770A1/en not_active Abandoned
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004056787A (ja) * | 2002-06-19 | 2004-02-19 | Harris Corp | 移動アドホックネットワークおよび重み係数を乗じたサービス品質メトリックに基づいて機能を実行するための方法 |
JP2006033855A (ja) * | 2004-07-15 | 2006-02-02 | Samsung Electronics Co Ltd | アドホックネットワークにおけるプレフィックス割当て方法 |
JP2006186446A (ja) * | 2004-12-27 | 2006-07-13 | Hiroshima Industrial Promotion Organization | 通信方法 |
JP2011520327A (ja) * | 2008-04-15 | 2011-07-14 | テレフオンアクチーボラゲット エル エム エリクソン(パブル) | 通信の信頼性を提供する方法及びシステム |
Also Published As
Publication number | Publication date |
---|---|
WO2013042208A1 (ja) | 2013-03-28 |
US20140198770A1 (en) | 2014-07-17 |
JPWO2013042208A1 (ja) | 2015-03-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5928582B2 (ja) | ノード装置および通信方法 | |
US9450830B2 (en) | Node apparatus and communication method | |
US7330694B2 (en) | Method for setting up route path through route discovery in a mobile ad hoc network using partial route discovery | |
US7787361B2 (en) | Hybrid distance vector protocol for wireless mesh networks | |
US8213352B2 (en) | Wireless communication system, wireless communication device, wireless communication method, and program | |
US8284775B2 (en) | Six-address scheme for multiple hop forwarding in wireless mesh networks | |
TWI793361B (zh) | 用於藍芽網路之獨立冗餘路徑探索 | |
JP5673840B2 (ja) | ノード装置および通信方法 | |
JP5839041B2 (ja) | ノード装置および通信方法 | |
CN108809825B (zh) | 建立双向路由的方法及计算机可读存储介质 | |
US20170245132A1 (en) | Radio communication system, radio communication device, and radio relay device | |
WO2018019056A1 (zh) | 传输数据的方法和中继节点 | |
CN109068367B (zh) | 一种无线令牌传递方法、装置、设备及可读存储介质 | |
WO2020156340A1 (zh) | 一种传输数据的方法及装置 | |
WO2019119346A1 (zh) | 一种通信路径确定方法及网络设备 | |
US20140198666A1 (en) | Data transfer method and node apparatus that uses the same | |
Mu | An improved AODV routing for the zigbee heterogeneous networks in 5G environment | |
JP5958293B2 (ja) | 通信方法、通信プログラム、および、ノード装置 | |
JP4299343B2 (ja) | 通信システムにおけるパスを用いた情報伝送方法 | |
US20160182252A1 (en) | Wireless and Powerline Communication Mesh Network | |
CN110996266B (zh) | 自组网系统的多播组数据传输方法 | |
JP2004336786A (ja) | 個人通信無線ネットワークにおけるルーチン経路設定装置および方法 | |
Gupta et al. | Enhanced flooding scheme for aodv routing protocol in mobile ad hoc networks | |
JP4913208B2 (ja) | アドレス解決方法 | |
JP2011109412A (ja) | ノード装置、アドホックネットワークシステムおよびネットワーク参加方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20141202 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20141215 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5673840 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |