以下、いくつかの実施形態について、図面を参照しながら詳細に説明する。具体的には、まず図1と図2を参照してネットワーク構成の例を説明し、図3〜31を参照して第1実施形態について説明する。その後、図32〜33を参照して第2実施形態について説明し、その他の実施形態についても説明する。最後に、図34〜36に示す2つの比較例と比べながら、各実施形態に共通の利点について説明する。
図1はネットワーク構成の第1の例を示す図である。図1のネットワーク1は、以下の各実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。なお、以下では、ネットワークトポロジの観点からの説明においては、「ノード装置」を単に「ノード」ということもある。
ネットワーク1内の各ノード装置には、ネットワーク1内で一意な識別情報(以下、「ノードID(identification)」という)が予め割り当てられている。以下では、参照符号「Ni」がノードIDを示すものとし、例えば、ノードIDとしてNiが割り当てられたノード装置を「ノード装置Ni」のように参照する。なお、以下では、ノード装置Niにとって自分自身に割り当てられたノードIDであるNiを、ノード装置Niの「自ノードID」ともいう(図1では1≦i≦7)。
また、図1ではリンクを実線で表している。具体的には、ネットワーク1のトポロジは次のとおりである。すなわち、ノード装置N1とN2の間、ノード装置N2とN3の間、ノード装置N2とN6の間、ノード装置N3とN4の間、ノード装置N3とN5の間、ノード装置N4とN5の間、ノード装置N4とN7の間、およびノード装置N6とN7の間に、各々リンクが存在する。
なお、以下で「リンク」とは、無線リンクでもよく、有線リンクでもよい。ノード装置NiとNjが、他のノード装置Nkによる中継を経ずに直接、無線により情報を通信しあうことができるとき、「ノード装置NiとNjの間に無線リンクが存在する」という(図1では1≦i,j,k≦7)。また、ノード装置NiとNjの間が直接ケーブルで接続されており、ノード装置NiとNjがケーブルを介して情報を通信しあうことができるとき、「ノード装置NiとNjの間に有線リンクが存在する」という。
また、ノード装置NiとNjの間に無線または有線のリンクが存在するとき、「ノード装置NiとNjは互いに隣接している」という。換言すれば、ノード装置Niにとってノード装置Njは隣接ノード装置であり、ノード装置Njにとってノード装置Niは隣接ノード装置である。
なお、図1のネットワーク1には、新たなノード装置が追加されることもありうるし、ノード装置N1〜N7のいずれかが撤去されてネットワーク1からは消滅することもありうる。また、リンクは固定的ではなく、動的に変化しうる。
例えば、天候や遮蔽物などの影響で、ノード装置NiとNjの間に無線リンクが新たに確立されたり、今まで確立されていた無線リンクが消滅したりすることがある。ノード装置が可動式であれば、ノード装置間の距離の変動によってリンクの有無が変化することもある。また、ケーブルの接続替えにより、新たな有線リンクが確立されたり、今まで存在していた有線リンクが消滅したりすることがあり、ケーブルの切断等の障害によって有線リンクが消滅することもある。
以下に説明する各実施形態によれば、このようにノードやリンクが動的に変化する環境においても、データが送信される時点でのネットワーク1の状況に応じて、利用可能で適切な経路が動的に見出されて選択されながら、データの送信が行われる。しかも、動的に変化するネットワーク1全体のトポロジを各ノード装置N1〜N7が認識する必要なしに、動的なトポロジの変化に応じた経路選択が自律分散的に実現される。
ところで、詳しくは図7とともに後述するが、以下ではノード装置間で送受信されるPDU(Protocol
Data Unit)を「フレーム」と称する。ネットワーク1内でのデータの送受信はフレームを用いて行われるが、フレームの送信元のノード装置を以下では「GS(Global Source)」といい、フレームの宛先のノード装置を以下では「GD(Global
Destination)」という。
例えば、ノード装置N1がGSでノード装置N7がGDの場合、ネットワーク1においてノード装置N1とN7は隣接していないので、他のノード装置によってフレームが中継され、その結果として、フレームはノード装置N7に到達する。例えば、フレームは、ノード装置N1からノード装置N2へ送信され、ノード装置N2からノード装置N6へ送信され、ノード装置N6からノード装置N7へ送信されるかもしれない。以下では経路を、〈N1,N2,N6,N7〉のようなタプル(tuple)で表す。
経路〈N1,N2,N6,N7〉の例において、例えばノード装置N1からノード装置N2へフレームが送信されるとき、フレームの最終的な宛先は、GDであるノード装置N7だが、フレームの直接的な宛先は、ノード装置N1に隣接するノード装置N2である。以下では、このように互いに隣接する2つのノード装置間でのフレームの送信において、フレームの送信元のノード装置を「LS(Local Source)」といい、フレームの宛先のノード装置を「LD(Local
Destination)」という。例えば、上記のようにフレームがノード装置N1からノード装置N2とN6を経由してノード装置N7へと中継される場合のLSとLDは次のとおりである。
GSでもあるノード装置N1から、ノード装置N1に隣接するノード装置N2へと、最初にフレームが送信されるとき、LSはノード装置N1であり、LDはノード装置N2である。続いて、ノード装置N2から、ノード装置N2に隣接するノード装置N6へと、フレームが送信されるとき、LSはノード装置N2であり、LDはノード装置N6である。そして、ノード装置N6から、ノード装置N6に隣接しておりGDでもあるノード装置N7へとフレームが送信されるとき、LSはノード装置N6であり、LDはノード装置N7である。
なお、ネットワーク1内の1つまたは複数のノード装置が、ネットワーク1とは別のネットワーク(以下「外部ネットワーク」という)に属する不図示のネットワーク機器と接続されていてもよい。
例えば、データ管理サーバを含む外部ネットワークのゲートウェイ装置に、有線リンクまたは無線リンクによってノード装置N7が接続されていてもよい。そして、ノード装置N7がGDとして指定されてネットワーク1内で送信されるデータは、ノード装置N7からゲートウェイ装置を介してデータ管理サーバに送信され、データ管理サーバで管理されてもよい。
続いて、図2を参照して他のネットワークの例について説明する。図2は、ネットワーク構成の第2の例を示す図である。図2のネットワーク2も、以下の各実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。また、図1のネットワーク1と同様に、ネットワーク2も、不図示の外部ネットワークと接続されていてもよい。
ネットワーク2はノード装置N101〜N120を含む。図2は、ノード装置N101〜N120のうち、1つのノード装置N105に注目して表現した図である。すなわち、太い実線の丸で示したノード装置N105は、直接通信することが可能な、隣接する3つのノード装置N107、N111、およびN112の存在とノードIDさえ認識していればよく、ネットワーク2全体のトポロジを認識する必要はない。ノード装置N105は、ネットワーク2のトポロジどころか、ネットワーク2内に存在するノード装置の個数を認識する必要もないし、ノード装置N105に隣接していないノード装置のノードIDを予め知っている必要もない。
図2では、ノード装置N105が認識する部分を実線で表し、ノード装置N105が認識する必要のない部分を破線で表してある。すなわち、図2では、ノード装置N105から見てホップ数1以内の範囲に存在する以下のものだけが、実線で示してある。
・ノード装置N105自身
・ノード装置N105に隣接する3つのノード装置N107、N111、およびN112
・ノード装置N105を3つの隣接ノード装置N107、N111、およびN112にそれぞれ接続する3本のリンク
以下に説明する各実施形態によれば、ネットワーク内の各ノード装置は、上記のノード装置N105のように、隣接ノード装置さえ認識していればよい。したがって、ネットワークの規模が増大しても「各ノード装置がネットワークトポロジを認識するために制御情報の通信を行い、制御情報の通信のせいでネットワークの負荷が高まり、通信システム全体としての性能が悪化する」といった事態に陥ることはない。
以下では具体的に、図1のネットワーク1や図2のネットワーク2など任意のトポロジを有するネットワークに適用可能な実施形態について説明する。まず、図3〜図31を参照して第1実施形態について説明し、他の実施形態については、第1実施形態との違いを中心に説明する。
第1実施形態に関しては、まず、図3と図4を参照してノード装置の構成を説明し、図5を参照してノード装置の動作の概要を説明する。そして、「各ノード装置が自律分散的に図5のように振る舞うことで、図1のネットワーク1全体ではどのようにして動的な経路選択が実現されるのか」ということについて、図6を参照して概要を説明する。
その後、図7を参照してフレームの例を説明し、図8〜図13を参照して各ノード装置が記憶する各種情報の例を説明し、図14〜図29を参照して各ノード装置が行う処理の
詳細を説明する。そして、図7〜図29の詳細を踏まえて、再度、ネットワーク1全体としての振る舞いについて、図30と図31を参照して説明する。
さて、図3は、第1実施形態におけるノード装置の構成を示す機能ブロック図である。図1または図2の各ノード装置は、具体的には、例えば図3に示されるノード装置100である。
ノード装置100は、フレームを受信する受信部101と、フレームを送信する送信部102を備える。また、ノード装置100は、フレームの送信のために用いる各種情報を格納するため、隣接ノード管理テーブル103、重み付けテーブル104、およびFID(Frame IDentification)管理テーブル105を備える。
ノード装置100はさらに、受信部101が受信したフレームの種類を判別するフレーム分岐処理部106を備える。詳しい形式は図7とともに後述するが、第1実施形態では、「データフレーム」、「ハローフレーム」、および「ACK(ACKnowledgment)フレーム」という少なくとも3種類のフレームが使われる。
ノード装置100は、ACKフレームに関する処理を行うACK処理部107と、ハローフレームの受信に応じて処理を行うリンク管理部108を備える。また、ノード装置100は、データフレームの受信に応じた処理を行うために、バッファ部109とデータフレーム処理部110を備えている。ノード装置100はさらに、上位層処理部111、ハローフレーム生成部112、およびFID生成部113も備えている。
ノード装置100の各部は以下のように動作する。
受信部101がフレームを受信し、受信したフレームをフレーム分岐処理部106に出力する。すると、フレーム分岐処理部106がフレームの種別を判別する。
ハローフレームが受信された場合、フレーム分岐処理部106は、受信されたハローフレームをリンク管理部108に出力する。リンク管理部108は、隣接ノード管理テーブル103を管理しており、さらに、重み付けテーブル104の管理にも関与している。
ここで、ハローフレームは、制御情報を通信するための制御フレームの一種であり、具体的には、ノード装置100が自分自身の存在を他のノード装置に通知するためのフレームである。よって、詳しくは図15とともに後述するとおり、リンク管理部108は、ハローフレームの受信を契機として隣接ノード装置の存在を認識し、認識結果を隣接ノード管理テーブル103に反映させる。すなわち、隣接ノード管理テーブル103は、ノード装置100に隣接する他のノード装置を、ノード装置100が記憶しておくためのテーブルである。
なお、ネットワークの状況は動的に変化しうるので、場合によっては、今まで隣接ノード装置としてリンク管理部108に認識されていた他のノード装置が、隣接ノード装置として認識不能となるかもしれない。よって、詳しくは図17とともに後述するとおり、リンク管理部108は、隣接ノード装置として認識不能となったノード装置に関するエントリを隣接ノード管理テーブル103から削除するためのエージング処理も行う。
また、第1実施形態においてリンク管理部108は、隣接ノード装置の変化にともなって重み付けテーブル104の追加、削除、あるいは更新を行う。
ここで、重み付けテーブル104は、フレームをどの隣接ノード装置に送信するかを決定するための情報をGDごとに管理するためのテーブルである。図3にはM個のGDそれぞれに対応して設けられた重み付けテーブル104−1〜104−Mが示されている。本明細書において「重み付けテーブル104」とは、重み付けテーブル104−1〜104−Mの総称である。また、ノード装置100の運用が開始される時点では、重み付けテーブル104は存在せず、M=0である。
具体的には、重み付けテーブル104は、「最終的にフレームをGDに到達させるためには、ノード装置100自身はどの隣接ノード装置をLDとして選択することができるか」ということをGDごとに管理している。換言すれば、重み付けテーブル104は、フレームのGDごとに、ノード装置100に隣接する1つ以上のノード装置に関して、LDとして選択する際の優先度を、重みとして表して保持している。
別の観点から言えば、ある隣接ノード装置が「LDとして選択可能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信可能」であることを意味する。また、ある隣接ノード装置が「LDとして選択不能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信不能」であることを意味し、当該隣接ノード装置の優先度が、「送信不能」に対応する所定の最低優先度であることを意味する。
したがって、ネットワークの状況の変化に応じてノード装置100の隣接ノード装置が変化すると、リンク管理部108は、詳しくは図15および図17とともに後述するとおり、隣接ノード装置の変化に応じて重み付けテーブル104を追加、更新、または削除する。
また、ACKフレームが受信された場合、フレーム分岐処理部106は、受信されたACKフレームをACK処理部107に出力する。ここで、ACKフレームは、制御フレームの一種であり、ノード装置100が送信したデータフレームのLDであるノード装置から、ノード装置100に、データフレームの受信を通知するためのフレームである。
したがって、ACKフレームの受信は、データフレームの送信が成功したことを意味し、所定の時間が経過してもACKフレームが受信されずにタイムアウトとなることは、データフレームの送信に失敗したことを意味する。ACK処理部107は、後述の図25に示すACKフレーム受信のタイムアウト監視を行う。
バッファ部109は、データフレームの送信失敗と再送に備えて、データフレームを格納している。よって、詳しくは図25とともに後述するとおり、ACK処理部107は、ACKフレームの受信を契機としてデータフレームの送信成功を認識すると、不要になったデータフレームをバッファ部109から削除する。また、ACK処理部107はデータフレームの送信の成否をデータフレーム処理部110に通知する。
また、データフレームが受信された場合、フレーム分岐処理部106は、受信されたデータフレームをバッファ部109に格納するとともに、後述の図20〜図23の処理を行うようデータフレーム処理部110に依頼する。
ここで、データフレームは、GSであるノード装置が、GDであるノード装置に伝達しようとするデータを、ペイロードとして含むフレームである。換言すれば、第1実施形態におけるフレームが定義される層よりも上位の層で定義されるプロトコルのPDUが、ペイロードとしてデータフレームに含まれる。上位層処理部111は、ノード装置100がGSまたはGDである場合に、データフレームにペイロードとして含まれる上位層のPDUを処理する。
フレーム分岐処理部106からデータフレームの処理の依頼を受けたデータフレーム処理部110の動作の概要は、以下のとおりである。
データフレーム処理部110は、受信部101が受信したデータフレームに対するACKフレームの送信を送信部102に依頼する。また、データフレーム処理部110は、受信されたデータフレームのGDの値がノード装置100の自ノードIDと等しいか否かを判断する。そして、受信されたデータフレームのGDの値がノード装置100の自ノードIDと異なる場合、データフレーム処理部110は、FID管理テーブル105を参照することにより、今回の受信が下記(A1)と(A2)のどちらに該当するのかを判断する。
(A1)過去にノード装置100がLSとなって送信したデータフレームが、ネットワーク内を中継されているうちにノード装置100に戻ってきて、受信部101で受信された。
(A2)上記(A1)以外の新たなデータフレームが受信部101で受信された。
データフレーム処理部110は、今回の受信が(A2)に該当すると判断すると、重み付けテーブル104を参照して、受信したデータフレームを転送するためにLDとして指定する隣接ノード装置を選択し、データフレームの転送を送信部102に依頼する。
他方、データフレーム処理部110は、今回の受信が(A1)に該当すると判断すると、過去にLDとして選択した隣接ノード装置が、適切なLDではなかったと認識し、認識の結果を重み付けテーブル104に反映させる。そして、データフレーム処理部110は、重み付けテーブル104を参照して、LDとして選択可能な隣接ノード装置が他にまだ残っているか否かを判断する。
データフレーム処理部110は、また、ACK処理部107からのデータフレーム送信成功あるいは送信失敗の通知を受け、該データフレームのLDとして選択した隣接ノード装置が適切か否かの認識をし、その認識結果を重み付けテーブル104に反映させる。
なお、ノード装置100に隣接する、あるノード装置Niが「LDとして選択可能である」とは、直感的には「隣接ノード装置NiをLDとして選択してみて、フレームが成功裡にGDまで到達するか否かを試してみる価値がある」という意味である。具体的には、ノード装置Niが「LDとして選択可能である」とは、「下記(B1)でもなく下記(B2)でもない」という意味である。なお、「選択可能」という語の、より詳細な意味については、後述の図5に関する説明と、図22に関する(F1)〜(F2)と(G1)〜(G4)の説明から明らかである。
(B1)ノード装置100が隣接ノード装置Niを過去にLDとして選択した結果、ループ等の何らかの失敗が発生したことがあり、「ノード装置NiはLDとして不適切である」と既に判明している。
(B2)今回受信部101が受信したデータフレームを、かつて受信部101が初めて受信したときのLS(以下「Original
Local Source」と称し、「OLS」と略す)が、ノード装置Niであった。
データフレーム処理部110は、もしLDとして選択可能な隣接ノード装置が他にまだ残っていれば、選択可能な隣接ノード装置を選んでLDとして指定し、データフレームの転送を送信部102に依頼する。逆に、LDとして選択可能な隣接ノード装置がもう残っていなければ、データフレーム処理部110は、下記(C1)または(C2)のように動作する。
(C1)今回受信したデータフレームのGSがノード装置100以外である場合、データフレーム処理部110は、OLSへデータフレームを返送するため、OLSをLDとして選択し、データフレームの転送を送信部102に依頼する。この動作は、OLSである隣接ノード装置に「ノード装置100をLDとして選択することは不適切である」と認識させるための動作であり、後述するとおり経路探索におけるバックトラックに相当する。
(C2)今回受信したデータフレームのGSがノード装置100自身である場合、このデータフレームを元々生成したのは上位層処理部111である。よって、データフレーム処理部110は、上位層処理部111に対してデータフレームの送信失敗を通知し、バッファ部109に格納されているデータフレームを破棄する。
なお、以上のようなデータフレーム処理部110の動作を実現するためには、データフレーム処理部110は上記(A1)と(A2)の区別をすることが必要である。そのため第1実施形態では、データフレームを一意に識別することのできるフレーム識別情報が各データフレームに含まれており、フレーム識別情報をFID管理テーブル105が記憶している。
第1実施形態でのフレーム識別情報は、具体的には、データフレームのGSであるノード装置のノードIDと、FIDとの組み合わせである。FIDは、ある1つのノード装置がGSとなって送信する複数のフレームの各々を一意に識別する識別情報であり、例えば所定のビット数のシーケンス番号でもよいし、タイムスタンプでもよい。
つまり、個々のノード装置は独立にFIDを生成するため、異なる複数のノード装置が偶然同じFIDを生成することもありうる。しかし、フレーム識別情報は、FID単独ではなく、データフレームのGSであるノード装置のノードIDと、FIDとの組み合わせである。そして、ノードIDは、上記のとおりネットワーク内でノード装置を一意に識別する情報である。したがって、たとえ異なる複数のノード装置が偶然同じFIDを生成したとしても、異なるノード装置がそれぞれGSとなって送信したフレームは、異なるフレーム識別情報を有するので、区別可能である。
なお、フレーム識別情報は、データフレームが1つ以上のノード装置を経由してネットワーク内を転送されても、データフレームを中継するノード装置によって書き換えられることはなく、したがって変化しない。データフレーム処理部110は、送信部102に送信を依頼したデータフレームのフレーム識別情報をFID管理テーブル105に記録することにより、後にデータフレームがノード装置100自身に戻ってきたとき、上記(A1)に該当すると認識することができる。
なお、ノード装置100は、フレームの受信を契機としないその他の処理も行う。具体的には、ハローフレーム生成部112が、FID生成部113の生成するFIDを利用して定期的にハローフレームを生成し、送信部102に出力する。すると送信部102がハローフレームを送信するので、ノード装置100は、ノード装置100自身の存在を定期的に周囲に通知することができる。
また、上位層処理部111は任意のタイミングで、データフレームにペイロードとして含めて送信する対象のデータをデータフレーム処理部110に出力することができる。すると、データフレーム処理部110は、上位層処理部111の要求に応じてデータフレームを生成し、送信部102にデータフレームの送信を指示する。こうして、ノード装置100は、自らGSとなることができる。
図4は、第1実施形態におけるノード装置のハードウェア構成を示す図である。図3のノード装置100は、例えば図4に示す各種ハードウェアにより実現されてもよい。
図4の例では、ノード装置100は、MPU(MicroProcessing Unit)201、PHY(PHYsical layer)チップ202、およびタイマIC(Integrated
Circuit)203を備える。また、ノード装置100は、DRAM(Dynamic Random access
Memory)204、フラッシュメモリ205、および無線モジュール206を備える。
MPU201とPHYチップ202の間を接続する通信インタフェースは、MII/MDIO(Media
Independent Interface or Management Data Input/Output)207である。MIIとMDIOはいずれも、物理層とMAC副層(Media Access Control sublayer)との間のインタフェースである。また、MPU201とタイマIC203は、I2C/PIO(Inter-Integrated Circuit or Parallel Input/Output)バス208を介して接続されている。そして、DRAM204とフラッシュメモリ205と無線モジュール206は、PCI(Peripheral Component Interconnect)バス209を介してMPU201に接続されている。
MPU201は、不揮発性記憶装置の一種であるフラッシュメモリ205に格納されたファームウェアなどのプログラムをDRAM204にロードし、DRAM204をワーキングメモリとして使いながら各種処理を実行する。MPU201は、プログラムを実行することで、図3のフレーム分岐処理部106、ACK処理部107、リンク管理部108、データフレーム処理部110、上位層処理部111、ハローフレーム生成部112、およびFID生成部113として動作することができる。
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置100にインストールされてもよい。または、プログラムは、ネットワークからPHYチップ202もしくは無線モジュール206を介してダウンロードされ、ノード装置100にインストールされてもよい。
なお、実施形態に応じて、DRAM204やフラッシュメモリ205以外の他の種類の記憶装置が利用されてもよい。例えば、ノード装置100は、CAM(Content Addressable Memory)、SRAM(Static
Random Access Memory)、SDRAM(Synchronous Dynamic Random
Access Memory)などの記憶装置を有してもよい。
図3の隣接ノード管理テーブル103、重み付けテーブル104、FID管理テーブル105、およびバッファ部109は、DRAM204、フラッシュメモリ205、あるいは不図示のその他の記憶装置により実現される。また、フラッシュメモリ205は、プログラムだけでなく、ノード装置100のノードIDなど、ノード装置100に固有の情報も記憶している。
PHYチップ202は、有線接続における物理層の処理を行う回路である。第1実施形態は無線ネットワークに適用されるので、第1実施形態では、ノード装置100はPHYチップ202を備えなくてもよい。しかし、ノード装置100と外部ネットワークとの接続のために、ノード装置100はPHYチップ202を備えていてもよい。
例えば、ノード装置100は、イーサネット(登録商標)規格にしたがった有線LANポートを備え、有線LANポートに接続されたケーブルを介して外部ネットワークのゲートウェイ装置などに接続されていてもよい。
その場合、MPU201は、イーサネットフレームを生成し、MII/MDIO207を介してPHYチップ202に出力することができる。そして、PHYチップ202は、MPU201からの出力(すなわちイーサネットフレームを表す論理信号)を、ケーブルの種類に応じた信号(つまり電気信号または光信号)に変換し、ケーブルに出力する。こうして、ノード装置100はPHYチップ202を用いて外部ネットワークにデータを送信することができる。
また、PHYチップ202は、ケーブルと有線LANポートを介して外部ネットワークから入力される電気信号または光信号を、論理信号に変換し、MII/MDIO207を介してMPU201に出力することもできる。こうして、ノード装置100はPHYチップ202を用いて外部ネットワークからデータを受信することができる。
無線モジュール206は、無線接続における物理層の処理を行うハードウェアである。無線モジュール206は、例えば、アンテナ、ADC(Analog-to-Digital Converter)、DAC(Digital-to-Analog
Converter)、変調器、復調器、符号化器、復号器などを含む。
第1実施形態では、図3の受信部101と送信部102は、図4の無線モジュール206により実現される。つまり、第1実施形態では、ネットワーク内のリンクは無線リンクである。もちろん、後述の第2および第3実施形態のように、有線リンクが存在する実施形態も可能である。
タイマIC203は、設定された時間が経過するまでカウントアップ動作を行い、設定された時間が経過すると割り込み信号を出力する。例えば、タイマIC203は、隣接ノード管理テーブル103、重み付けテーブル104、FID管理テーブル105のエージング処理をそれぞれ所定の間隔で実行するための割り込み信号を出力してもよい。
なお、実施形態に応じて、ノード装置のハードウェア構成は図4とは異なっていてもよく、図4に例示した規格・種類以外のその他のハードウェアをノード装置に利用することもできる。
例えば、図3のフレーム分岐処理部106、ACK処理部107、リンク管理部108、データフレーム処理部110、上位層処理部111、ハローフレーム生成部112、またはFID生成部113は、ハードウェア回路により実現されてもよい。具体的には、MPU201の代わりに、FPGA(Field Programmable Gate Array)などのリコンフィギュラブル回路や、ASIC(Application Specific Integrated Circuit)などにより、これら図3の各部が実現されてもよい。もちろん、MPU201とハードウェア回路の双方により、図3の各部が実現されてもよい。
なお、以下の説明においては、説明の明確化のため、図3および図4の各部の参照符号の後にノードIDを付けた参照符号を用いることがある。例えば、ノード装置N1が有する図3の隣接ノード管理テーブル103を「103−N1」という参照符号で参照する場合がある。
続いて、個々のノード装置の動作の概要について図5を参照して説明し、個々のノード装置の動作の結果としてネットワーク全体として実現される経路選択について図6を参照して説明する。
図5は、1つのノード装置に注目して重みの学習について説明する図である。図5には、ネットワーク3内の6つのノード装置が「ノードα」〜「ノードζ」として抜粋されて示されている。図5に示すように、ノードβにはノードα、γ、δ、ε、およびζが隣接しており、図5では下記5本のリンクが実線で示されている。
・ノードβとαの間のリンクLβ,α
・ノードβとγの間のリンクLβ,γ
・ノードβとδの間のリンクLβ,δ
・ノードβとεの間のリンクLβ,ε
・ノードβとζの間のリンクLβ,ζ
また、図5において雲の形で模式的に表現されたネットワーク3aは、ネットワーク3のうちの一部分である。ネットワーク3aは、具体的には、ノードδとζの間を直接的に接続するリンク、または、1つ以上の不図示のノードと2本以上の不図示のリンクを介してノードδとζの間を間接的に接続する経路を含む。
以下では、図5においてノードβに注目し、ノードβにおける重みの学習について説明する。
あるとき、ノードβが、ネットワーク3内の不図示のあるノード(以下、便宜的に「ノードη」という)をGDとするデータフレーム301を、リンクLβ,αを介してノードαから受信する。ノードβは図3の重み付けテーブル104を有しており、このうちノードηに対応する重み付けテーブルを、図5の説明では便宜的に「104−h」という参照符号で参照する。
詳しくは図10および図11とともに後述するが、GDごとに管理される重み付けテーブル104のそれぞれは、隣接ノードと重みの対応付けを記憶している。ノードβにはノードα、γ、δ、ε、およびζが隣接しているので、重み付けテーブル104−hでは、ノードαと重みWα、ノードγと重みWγ、ノードδと重みWδ、ノードεと重みWε、およびノードζと重みWζが、それぞれ対応付けられている。
説明の便宜上、ノードβがノードαからデータフレーム301を受信した時点での重み付けの関係が、式(1)のとおりであったとする。
Wγ<Wδ<Wε<Wζ (1)
以下、第1実施形態においては説明の便宜上、重みが0以上1以下の値をとり、重みの値が小さいほど当該重みに対応するノードの優先度が高いことを示すものとする。
したがって、式(1)に基づいてノードβは、最も軽い重みWγと対応付けられたノードγの優先度が、隣接ノードγ、δ、ε、およびζの中で最も高いことを認識する。よって、ノードβは、データフレーム301を転送するためのLDとして、隣接ノードγ、δ、ε、およびζの中から、まずノードγを選択し、ノードγにデータフレーム301を送信する。
ここで、ノードβからノードγへの送信が失敗すると、ノードβは、「ノードηをGDとするデータフレームの送信時にノードγをLDとして選択することは不適切である」と学習する。そして、学習の結果として、ノードβは、ノードγの優先度を下げる。すなわち、ノードβは、重みWγの値を大きくする。
送信失敗には何種類かあり、具体的には、ノードβは下記(D1)または(D2)のようにして、「ノードηをGDとするデータフレームの送信時にノードγをLDとして選択することは不適切である」と学習する。
(D1)リンク障害の場合
ノードβがデータフレーム301をノードγに転送した時点で、偶然リンクLβ,γ、あるいは、ノードγに障害が発生していると、ノードβはノードγへの送信が失敗したと認識する。
例えばリンクLβ,γが無線リンクである場合、ノードγからデータフレーム301に対するACKフレームが所定時間内に返信されてこなければ、ノードβはタイムアウトして、「ノードγへのデータフレーム301の送信に失敗した」と判断する。そして、ノードβは、「ノードηをGDとするデータフレームの送信時にノードγをLDとして選択することは不適切である」と学習し、LDとして選択したノードγに対応付けられた重みWγの値を大きくする。
なお、無線リンクはその品質環境が変化しやすいため、リンク障害が再び解消されている可能性がある。そのため、第1実施形態においては、リンク障害時に一挙に重みWγを最大値にするのではなく、所定の値だけ大きくすることにしている。このようにすれば、1回のリンク障害発生だけでそのLDが不適切となることを防ぐことができる。
(D2)ノードγからノードβにデータフレーム301が戻ってくる場合
ノードβは、一旦、ノードγへのデータフレーム301の送信に成功する。例えば、ノードβは、データフレーム301に対するACKフレームをノードγから受け取ることで、ノードγへのデータフレーム301の送信が成功したことを認識する。よって、一旦ノードβは、LDとして選択したノードγに対応付けられた重みWγの値を小さくする。
しかしながら、その後、ノードγからノードηまでデータフレーム301を転送することのできる経路がネットワーク3内で見つからなければ、後述するバックトラック動作により、ノードγはノードβにデータフレーム301を送り返す。例えば、ノードγがノードβにのみ隣接している場合、ノードγはノードηまでデータフレーム301を転送することのできる経路を見つけることができない。また、ノードγがノードβ以外にいくつかのノードに隣接している場合でも、ネットワーク3のトポロジによっては、ノードγからノードηまで到達不能なこともある。
ノードγがバックトラック動作を行うと、ノードβは、ノードβ自身が過去にノードγに送信したデータフレーム301をノードγから受信するので、「ノードγへの送信が失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをGDとするデータフレームの送信時にノードγをLDとして選択することは不適切である」と学習し、LDとして選択したノードγに対応付けられた重みWγの値を大きくする。
第1実施形態では、(D2)のように、ノードβ自身が過去に送信したデータフレーム301を受信することでノードβが送信失敗を認識する場合、ノードβは具体的には重みWγの値を最大値に設定する。
以下では説明の便宜上、図5の例において(D2)のようにしてノードβが送信失敗を認識し、重みWγの値を最大値に設定したとする。その結果、式(2)が成立する。
Wδ<Wε<Wζ<Wγ (2)
続いてノードβは、GDである不図示のノードηへデータフレーム301を到達させるため、不適切と判明したノードγ以外の隣接ノードをLDとして選択し、データフレーム301の再送信を試みる。具体的には式(2)に基づいて、ノードβは、現時点で最も軽い重みWδと対応付けられたノードδをLDとして選択し、ノードδにデータフレーム301を送信する。
図5の例では、データフレーム301に対するACKフレームをノードβがノードδから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、LDとして選択したノードδに対応付けられた重みWδの値を小さくする。その結果、やはり式(2)が成立する。
続いて、データフレーム301はネットワーク3aを介してノードδからノードζに到達したとする。そして、ノードζがLDとしてノードβを選択したとする。
すると、ノードβは、ノードβ自身が過去にノードδに送信したデータフレーム301をノードζから受信するので、「ノードδへの送信は、ループの存在により失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをGDとするデータフレームの送信時にノードδをLDとして選択することは不適切である」と学習し、重みWδの値を大きくする。
ここで、ループして戻ってきたデータフレーム301をノードβがノードζから受信する場合も、「ノードβ自身が過去に送信したデータフレーム301を受信することでノードβが送信失敗を認識する」という点では上記(D2)の場合と同様である。したがって、ノードβは、「ノードηをGDとするデータフレームの送信時にノードδをLDとして選択することは不適切である」と学習し、LDとして選択したノードδに対応付けられた重みWδの値を最大値に設定する。その結果、式(3)が成立する。
Wε<Wζ<Wγ=Wδ (3)
図5には、ノードζから同一データフレーム301を受信して重み付けを更新した結果の新しい重み付けの関係として、式(3)を示してある。
続いてノードβは、GDである不図示のノードηへデータフレーム301を到達させるため、不適切と判明したノードγおよびδ以外の隣接ノードをLDとして選択し、データフレーム301の再送信を試みる。具体的には式(3)に基づいて、ノードβは、現時点で最も軽い重みWεと対応付けられたノードεをLDとして選択し、ノードεにデータフレーム301を送信する。
図5の例では、データフレーム301に対するACKフレームをノードβがノードεから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、LDとして選択したノードεに対応付けられた重みWεの値を小さくする。その結果、やはり式(3)が成立する。
ここで仮に、ノードεからバックトラックによってデータフレーム301がノードβへと返信されることがないとする。また、データフレーム301がネットワーク3内をループして、ノードβのいずれかの隣接ノードからノードβに送信され、ノードβで受信されることもないとする。
すると、式(3)から、ノードβは、データフレーム301と同じくノードηをGDとする別のデータフレームを隣接ノードα、γ、δ、ζのいずれかから受け取った場合に、最も軽い重みWεと対応付けられたノードεをLDとして優先して選択するようになる。
図6は、図1のネットワーク1において動的かつ自律分散的に経路が選択される様子を説明する図である。具体的には、図6は、ノード装置N1がGSとなって、ノード装置N7をGDとして指定したデータフレームを送信する場合の、ネットワーク1内での経路選択の様子を示す。
図6には図1のネットワーク1と、ノード装置N4とN7の間で発生した障害が示されている。また、図6の12本の太い矢印は、ネットワーク1内で経路が動的に選択されながらデータフレームがGS(すなわちノード装置N1)からGD(すなわちノード装置N7)まで転送される様子を表す。
なお、以下では、ノード装置Niの重み付けテーブル104−Niのうち、ノード装置N7に対応するものを便宜的に「104−hi−Ni」という参照符号で参照することにする(1≦i≦6)。
また、図6の説明においては、特に断らない限りデータフレームの送信が成功してACKフレームが返信されるものとし、ACKフレームの返信については省略して説明を簡略化する。ACKフレームの返信も含めた一連の処理の流れは、図31とともに後述する。
ステップS101で、GSであるノード装置N1は、唯一ノード装置N1に隣接するノード装置N2をLDとして選択し、データフレームをノード装置N2に送信する。
ノード装置N2には、ステップS101で送信されたデータフレームのLSであるノード装置N1のほかに、ノード装置N3とN6が隣接している。そして、この2つの隣接ノード装置N3とN6のうちでノード装置N3の方が、重み付けテーブル104−h2−N2において、より軽い重みと対応付けられているとする。
すると、ステップS102でノード装置N2は、ステップS101で受信したデータフレームを転送するためのLDとしてノード装置N3を選択し、ノード装置N3にデータフレームを送信する。
ノード装置N3には、ステップS102で送信されたデータフレームのLSであるノード装置N2のほかに、ノード装置N4とN5が隣接している。そして、この2つの隣接ノード装置N4とN5のうちでノード装置N4の方が、重み付けテーブル104−h3−N3において、より軽い重みと対応付けられているとする。
すると、ステップS103でノード装置N3は、ステップS102で受信したデータフレームを転送するためのLDとしてノード装置N4を選択し、ノード装置N4にデータフレームを送信する。
ノード装置N4には、ステップS103で送信されたデータフレームのLSであるノード装置N3のほかに、ノード装置N5とN7が隣接している。そして、この2つの隣接ノード装置N5とN7のうちでノード装置N7の方が、重み付けテーブル104−h4−N4において、より軽い重みと対応付けられているとする。
すると、ステップS104でノード装置N4は、ステップS103で受信したデータフレームを転送するためのLDとして、GDでもあるノード装置N7を選択し、ノード装置N7にデータフレームを送信する。
しかし、図6に示すように、ノード装置N4がノード装置N7にデータフレームを送信した時点で、ノード装置N4とN7の間のリンクには障害が発生しており、したがって送信は失敗する。すなわち、ノード装置N4は、所定時間待機してもノード装置N7からACKフレームが返信されてこないため、タイムアウトし、送信失敗を認識する。
なお、ステップS104におけるノード装置N4は、図5でノードγへのデータフレームの送信に上記(D1)のようにして失敗したノードβに相当する。よって、ノード装置N4は、送信失敗に応じて重み付けテーブル104−h4−N4を更新する(具体的には、ステップS104の送信でのLDであるノード装置N7に対応付けられた重みの値を大きくする)。
そして、ステップS105でノード装置N4は、ステップS103で受信したデータフレームを転送するためのLDとして、まだ試していない他の隣接ノード装置N5を選択し、ノード装置N5にデータフレームを送信する。
ノード装置N5には、ステップS105で送信されたデータフレームのLSであるノード装置N4のほかには、ノード装置N3のみが隣接している。
そこで、ステップS106でノード装置N5は、ステップS105で受信したデータフレームを転送するためのLDとしてノード装置N3を選択し、ノード装置N3にデータフレームを送信する。
すると、ステップS106でノード装置N3は、「ノード装置N3自身がステップS103で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップS106におけるノード装置N3は、図5においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置N3は、図5と同様にして重み付けテーブル104−h3−N3を更新する(具体的には、ステップS103の送信のLDであるノード装置N4に対応付けられた重みの値を最大値に設定する)。
そして、ステップS107でノード装置N3は、OLS(すなわち、ステップS102で最初に当該データフレームをノード装置N3が受信したときのLSであるノード装置N2)以外の隣接ノード装置の中から、まだLDとして試していないものを探す。ここで、OLS以外の隣接ノード装置はノード装置N4とN5であり、ノード装置N4はステップS103で選択済みである。
よって、ステップS107でノード装置N3は、未選択のノード装置N5をLDとして選択し、ノード装置N5にデータフレームを送信する。つまり、ステップS107におけるノード装置N3は、図5においてノードεをLDとして選択しなおしてノードεにデータフレームを送信するノードβに相当する。
すると、ステップS107でノード装置N5は、「ノード装置N5自身がステップS106で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップS107におけるノード装置N5は、図5においてノードγへのデータフレームの送信に(D2)のようにして失敗したノードβに相当する。よって、ノード装置N5は、図5と同様にして重み付けテーブル104−h5−N5を更新する(具体的には、ステップS106の送信のLDであるノード装置N3に対応付けられた重みの値を最大値に設定する)。
そして、ノード装置N5にとって、OLS(すなわちステップS105で最初に当該データフレームをノード装置N5が受信したときのLSであるノード装置N4)以外で隣接しているノード装置は、既に送信失敗と判明したノード装置N3のみである。したがって、もはやLDとして選択可能な隣接ノード装置がない。
よってステップS108でノード装置N5は、OLSであるノード装置N4にデータフレームを送り返す。ステップS108はバックトラック動作であり、バックトラック動作によってノード装置N5は、「ノード装置N7をGDとするデータフレームの送信においては、ノード装置N5自身から先の経路は袋小路(dead end)になっている」ということをノード装置N4に知らせることができる。
すると、ステップS108でノード装置N4は、「ノード装置N4自身がステップS105で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップS108におけるノード装置N4は、図5においてノードγへのデータフレームの送信に(D2)のようにして失敗したノードβに相当する。よって、ノード装置N4は、図5と同様にして重み付けテーブル104−h4−N4を更新する(具体的には、ステップS105の送信のLDであるノード装置N5に対応付けられた重みの値を最大値に設定する)。
しかし、図5のノードβには、ノードγへのデータフレームの送信に失敗しても、まだLDとして選択可能なノードδ等が残っていたが、図6のステップS108のノード装置N4にとっては、LDとして選択可能な隣接ノード装置が残っていない。すなわち、OLS以外の2つの隣接ノード装置N7とN5は、ステップS104とS105でそれぞれLDとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
したがって、ステップS109でノード装置N4は、OLSであるノード装置N3にデータフレームを送り返す。ステップS109もバックトラック動作であり、ノード装置N4はノード装置N3に「ノード装置N7をGDとするデータフレームの送信においては、ノード装置N4自身から先の経路は袋小路になっている」ということを知らせることができる。
すると、ステップS109でノード装置N3は、「ノード装置N3自身がステップS107で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップS109におけるノード装置N4は、図5においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置N3は、図5と同様にして重み付けテーブル104−h3−N3を更新する(具体的には、ステップS107の送信のLDであるノード装置N5に対応付けられた重みの値を最大値に設定する)。
しかし、図5のノードβには、ノードδへのデータフレームの送信が失敗すると判明しても、まだLDとして選択可能なノードεが残っていたが、図6のステップS109のノード装置N3にとっては、LDとして選択可能な隣接ノード装置が残っていない。すなわち、OLS以外の2つの隣接ノード装置N4とN5は、ステップS103とS107でそれぞれLDとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
したがって、ステップS110でノード装置N3は、OLSであるノード装置N2にデータフレームを送り返す。ステップS110もバックトラック動作であり、ノード装置N3はノード装置N2に「ノード装置N7をGDとするデータフレームの送信においては、ノード装置N3自身から先の経路は袋小路になっている」ということを知らせることができる。
すると、ステップS110でノード装置N2は、「ノード装置N2自身がステップS102で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップS110におけるノード装置N2は、図5でノードγへのデータフレームの送信に(D2)のようにして失敗したノードβに相当する。よって、ノード装置N2は、図5と同様にして重み付けテーブル104−h2−N2を更新する(具体的には、ステップS102の送信のLDであるノード装置N3に対応付けられた重みの値を最大値に設定する)。
そして、ステップS111でノード装置N2は、データフレームを転送するためのLDとして、まだ試していない他の隣接ノード装置N6を選択し、ノード装置N6にデータフレームを送信する。
ノード装置N6には、ステップS111で送信されたデータフレームのLSであるノード装置N2のほかには、GDでもあるノード装置N7のみが隣接している。
そこで、ステップS112でノード装置N6は、ステップS111で受信したデータフレームを転送するためのLDとしてノード装置N7を選択し、ノード装置N7にデータフレームを送信する。
以上のようにして、ネットワーク1内に障害が発生しても、各ノード装置が自律分散的に振る舞うことで、データフレームは成功裡にGDまで到達する。
また、データフレームの転送において、局所的に不適切なノード装置がLDとして選択されても、最終的にはネットワーク全体としては、GSからGDに至る経路が選択される。なぜなら、各ノード装置がLDとして選択可能なノード装置を次々と選択し、選択可能なノード装置がなくなればバックトラック動作をするからである。
具体的には、図6の例では、ステップS102でノード装置N2がノード装置N3をLDとして選択したことは、結果的には不適切であるとステップS110で判明する。しかし、ステップS103〜S110の動作により、ネットワーク1全体としては、最終的にはGSからGDに至る経路〈N1,N2,N6,N7〉の選択に成功する。
こうして選択された経路は学習され、次回以降のデータフレームの転送の効率化に寄与する。学習による効率化について具体的に説明すれば次のとおりである。
ステップS110でのデータフレームの受信の結果、ノード装置N2は重み付けテーブル104−h2−N2の学習を行い、ノード装置N3に対応付けられた重みを最大値に設定している。したがって、ノード装置N2は、ノード装置N7をGDとする新たなデータフレームを隣接ノード装置N1から受信すると、最初からノード装置N6をLDとして選択する。つまり、ネットワーク1全体としては、自律分散的な学習の結果、バックトラックを含む試行錯誤なしに、データフレームを効率的に経路〈N1,N2,N6,N7〉によりGDまで送信することが可能となる。
さらに、第1実施形態によれば、不適切なLDの選択の影響または局所的な障害の影響は、ネットワーク1全体には及ばず、局所的に限定される。すなわち、第1実施形態によれば、例えばノード装置N4とN7の間のリンクに障害が発生しても、代替経路を問い合わせるための制御フレームがネットワーク1全体の全ノード装置へとフラッディングされたりはしない。よって、第1実施形態によれば、障害やループが局所的に発生しても、ネットワーク1全体にブロードキャストストームを引き起こすといった事態には陥らない。
また、図6の例においてノード装置N1は、ノード装置N4とN7の間のリンクの障害や、ループ〈N3,N4,N5,N3〉については全く認識することがないのは明らかである。このことは、不適切なLDの選択や局所的な障害の影響が、局所的に限定され、ネットワーク1全体には及ばないということを意味している。
問題の影響が局所的に限定されるということは、局所的な問題がネットワーク1全体にポジティブにフィードバックされて発散することがないということであり、ネットワーク1が系として安定しているということである。問題が局所的に限定されることの別の例を挙げれば、例えば以下のとおりである。
例えば、仮にネットワーク1においてノード装置N5とN7の間にもリンクが存在し、重み付けテーブル104−h5−N5においてノード装置N3よりもノード装置N7の方が軽い重みに対応づけられているとする。すると、ステップS105の直後にノード装置N5がノード装置N7をLDとして選択してデータフレームをノード装置N7に送信する。その結果、ステップS108〜S112の送信は行われず、ノード装置N1だけでなくノード装置N2とN3も、障害の発生を全く認識しない。このように、リンクの障害やループの発生などの問題は、問題が生じた場所に応じて最小限の局所的な範囲にしか影響を及ぼさない。
続いて、以上説明したノード装置100の構成および動作、ならびにネットワーク1全体で実現される自律分散協調動作について、更に詳細に説明してゆく。
図7は、フレームの例を示す図である。
第1実施形態におけるデータフレームは、図7のデータフレーム302のように、LD、LS、GD、GS、FID、タイプ、長さの各フィールドを含むヘッダと、ペイロードとを含む。例えば図5のデータフレーム301も、データフレーム302と同様の形式である。
データフレーム302のLDフィールド、LSフィールド、GDフィールド、およびGSフィールドには、データフレーム302のLD、LS、GD、およびGSである各ノード装置のノードIDがそれぞれ指定される。また、データフレーム302のFIDフィールドには、データフレーム302のGSであるノード装置が生成してデータフレーム302に割り当てたFIDが指定される。
データフレーム302のタイプフィールドには、「データフレーム」というタイプを示す所定の定数が指定される。また、データフレーム302の長さフィールドには、ペイロードの長さが指定される。データフレーム302のペイロードは、データフレーム302が定義されるプロトコルよりも上位の層のプロトコルのPDUである。
例えば、MAC副層を仮想的にさらに2つの副層に分割することを想定する。第1実施形態のフレームは、この仮想的な2つの副層のうちの下の方の副層で定義されてもよく、すなわち、MAC副層で定義される他のプロトコル(例えばイーサネットなど)のPDUをペイロードに含んでもよい。換言すれば、第1実施形態のフレームは、第2層で定義されるイーサネットフレームをカプセル化するフレームであってもよい。この場合、上位層処理部111はイーサネットフレームを処理する処理部であるから、公知のMACチップを用いて実現することもできる。
以下では説明の便宜上、データフレーム302のペイロードは、MAC層プロトコルのフレーム(具体的には例えばイーサネットフレーム)であるものとする。
しかし、もちろん実施形態によっては、データフレーム302のペイロードは、ネットワーク層(第3層)以上で定義されるプロトコルのPDUであってもよいし、特定の通信プロトコルとは無関係な生のデータであってもよい。例えば、データフレーム302のペイロードがIP(Internet Protocol)データグラムであってもよい。この場合、上位層処理部111はIPデータグラムを処理する処理部である。
データフレーム302の形式は以上説明したとおりであるが、具体的な値を使ってより詳しく例示すれば、データフレーム303および304のごとくである。
データフレーム303は、図6のステップS102でノード装置N2がノード装置N3に送信するデータフレームである。データフレーム303の具体的な内容は以下のとおりである。
・LDフィールドには、ステップS102の送信においてLDとして選択されたノード装置N3のノードID(すなわちN3)が指定されている。
・LSフィールドには、ステップS102の送信におけるLSであるノード装置N2のノードID(すなわちN2)が指定されている。
・GDフィールドには、GSであるノード装置N1がステップS101の送信のときに指定したノード装置N7のノードID(すなわちN7)が指定されている。
・GSフィールドには、GSであるノード装置N1のノードID(すなわちN1)が指定されている。
・FIDフィールドには、GSであるノード装置N1が生成したFID(以下Faとする)が指定されている。
・タイプフィールドには、「データフレーム」というタイプを示す所定の定数Dが指定されている。例えば、タイプは2ビットによって表すこともでき、D=(00)2でもよい。
・長さフィールドには、データフレーム302のペイロードの長さPaが指定される。なお、長さは例えばバイト単位で表されてもよいし、その他の単位で表されてもよい。
・ペイロードとして、MAC層プロトコルのフレーム(例えばイーサネットフレーム)が含まれる。
また、データフレーム303を受信したノード装置N3が図6のステップS103でノード装置N4に送信するのが、図7のデータフレーム304である。データフレーム304の具体的な内容は以下のとおりである。
・LDフィールドには、ステップS103の送信においてLDとして選択されたノード装置N4のノードID(すなわちN4)が指定されている。つまり、転送にあたって、ノード装置N3はLDフィールドを書き換える。
・LSフィールドには、ステップS103の送信におけるLSであるノード装置N3のノードID(すなわちN3)が指定されている。つまり、転送にあたって、ノード装置N3はLSフィールドを書き換え、自ノードIDを設定する。
・GD、GS、FID、タイプ、長さの各フィールドと、ペイロードの内容は、ノード装置N3が受信したデータフレーム303と同じである。
また、第1実施形態におけるハローフレームは、図7のハローフレーム311のように、LD、LS、GD、GS、FID、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ハローフレーム311の具体例はハローフレーム312であり、ハローフレーム312は後述の図31のステップS1203でノード装置N3により送信されるものである。
ハローフレーム311のLDフィールドには、ハローフレーム311を送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値が指定される。なおここでの「ブロードキャスト」は「隣接するすべてのノード装置へのブロードキャスト」であり、「ネットワーク1全体へのフラッディング」ではないので注意されたい。
以下、説明の便宜上、第1実施形態においてはノードIDが3バイトで表されるものとし、「0x」は16進数を表すものとする。また、0x000000と0xFFFFFFは予約されており、通常のノードIDとしては使われないものとする。
第1実施形態におけるすべてのハローフレームでは、ハローフレーム312と同様、LDフィールドに、当該ハローフレームを送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値として、0xFFFFFFが指定されている。
ハローフレーム311のLSフィールドには、ハローフレーム311を送信するノード装置自身のノードIDが指定される。よって、ノード装置N3が送信するハローフレーム312のLSフィールドには、ノード装置N3のノードIDであるN3が指定される。
また、第1実施形態におけるすべてのハローフレームでは、GDフィールドに、ヌル(null)を表す特殊な値0x000000が指定される。なぜなら、ハローフレームは隣接ノード装置が利用するだけであり、転送されないからである。
ハローフレーム311のGSフィールドには、LSフィールドと同じく、ハローフレーム311を送信するノード装置自身のノードIDが指定される。よって、ハローフレーム312のGSフィールドには、ノード装置N3のノードIDであるN3が指定される。
ハローフレーム311のFIDフィールドには、ハローフレーム311を送信するノード装置が生成してハローフレーム311に割り当てたFIDが指定される。同様に、ハローフレーム312のFIDフィールドには、ハローフレーム312を送信するノード装置N3が生成してハローフレーム312に割り当てたFID(以下Fbとする)が指定される。
ハローフレーム311のタイプフィールドには、「ハローフレーム」というタイプを示す所定の定数が指定される。具体的には、「ハローフレーム」というタイプは、ハローフレーム312に例示するように所定の定数Hにより表され、例えばH=(10)2でもよい。
また、第1実施形態におけるACKフレームは、図7のACKフレーム321のように、LD、LS、GD、GS、FID、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ACKフレーム321の具体例はACKフレーム322である。また、ACKフレーム322は、図6のステップS102でノード装置N2がノード装置N3にデータフレーム303を送信したとき、ノード装置N3がノード装置N2に返信するACKフレームである。後述の図31では、このノード装置N3からノード装置N2へのACKフレーム322の返信をステップS102aとして表している。
ACKフレーム321のLDフィールドには、ACKフレーム321の送信の契機となったデータフレームを送信した隣接ノード装置のノードIDが指定される。よって、例えばACKフレーム322のLDフィールドには、ACKフレーム322をノード装置N3が送信する契機となったデータフレーム303を送信した、ノード装置N3の隣接ノード装置N2のノードIDであるN2が指定される。
ACKフレーム321のLSフィールドには、ACKフレーム321を送信するノード装置自身のノードIDが指定される。よって、ノード装置N3が送信するACKフレーム322のLSフィールドには、ノード装置N3のノードIDであるN3が指定される。
また、ハローフレームと同様にACKフレームも転送されないので、第1実施形態におけるすべてのACKフレームでは、GDフィールドに、ヌルを表す特殊な値0x000000が指定される。
ACKフレーム321のGSフィールドとFIDフィールドには、ACKフレーム321の送信の契機となったデータフレームのGSフィールドとFIDフィールドの値がコピーされる。上記のように、GSフィールドとFIDフィールドの値の組み合わせにより、データフレームがネットワーク内で一意に識別される。よって、ACKフレーム321を送信するノード装置が、受信したデータフレームから値をコピーすることで、ACKフレーム321がどのデータフレームに対するものなのかを、ACKフレーム321を受信したノード装置において識別することが可能となる。
よって、例えばデータフレーム303の受信を契機として送信されるACKフレーム322では、GSフィールドとFIDフィールドの値は、データフレーム303と同じく、それぞれN1とFaである。
ACKフレーム321のタイプフィールドには、「ACKフレーム」というタイプを示す所定の定数が指定される。具体的には、「ACKフレーム」というタイプは、ACKフレーム322に例示するように所定の定数Aにより表され、例えばA=(11)2でもよい。
なお、図7に示したフレームの形式は一例にすぎず、実施形態に応じて、フレームに含まれるフィールドの並び順は適宜決めることができ、また、不図示の他のフィールドをフレームが含んでいてもよい。また、フレームがFCS(Frame Check Sequence)などのトレイラをさらに含んでいてもよい。
また、以下では記載の簡単化のため、混乱のおそれがない場合は、例えば「LDフィールド」を単に「LD」と称することもある。他のフィールドについても同様である。
図8は、図3のバッファ部109に格納されるデータの例を示す図である。
バッファ部109は、受信部101が受信した個々のデータフレームにそれぞれ対応する複数のエントリを含む。そして、各エントリは、タイムアウト時刻と受信したデータフレームを含む。
図8は、ノード装置N3のバッファ部109−N3内のあるエントリを例示している。具体的には、図6のステップS102において、ノード装置N2からノード装置N3が図7のデータフレーム303を受信すると、バッファ部109−N3には、タイムアウト時刻TI3,jとデータフレーム303とを含むエントリが作成される。バッファ部109におけるエントリの作成の詳細は、図14とともに後述する。また、タイムアウト時刻TI3,jの意味は次のとおりである。
ノード装置N3は、ステップS102で受信したデータフレーム303のヘッダを、ステップS103で図7のデータフレーム304のように書き換える。そしてノード装置N3は、ステップS103でデータフレーム304を送信する。
図8のタイムアウト時刻TI3,jは、ノード装置N3が、データフレーム304を送信した後、データフレーム304に対するACKフレームの受信をいつまで待つのかを示す。つまり、ノード装置N3は、タイムアウト時刻TI3,jまでにデータフレーム304に対するACKフレームをノード装置N4から受信することができなければ、タイムアウトして、ノード装置N4へのデータフレーム304の送信に失敗したと判断する。
なお、詳しくは図22、図26、および図28に示すように、バッファ部109に設定されるタイムアウト時刻は、上書きされることもある。
例えば、図6のステップS104でノード装置N7へのデータフレームの送信に失敗したノード装置N4は、ステップS105において、ノード装置N3から受信したデータフレームに対応するバッファ部109−N4内のタイムアウト時刻を更新する。更新後のタイムアウト時刻は、具体的には、ステップS105でノード装置N5に送信したデータフレームへのACKフレームの受信をいつまでノード装置N4が待つかを表す。
図9は、図3の隣接ノード管理テーブル103の例を示す図である。隣接ノード管理テーブル103には、ノードIDフィールドと最終更新時刻フィールドがある。
例えば、図1のネットワーク1では、ノード装置N2にはノード装置N1、N3、およびN6が隣接している。したがって、ノード装置N2の隣接ノード管理テーブル103−N2は、これら3つの隣接ノード装置N1、N3、およびN6にそれぞれ対応する3つのエントリがある。そして、隣接ノード装置Ni(i=1,3,6)に対応する各エントリにおいて、ノードIDフィールドには隣接ノード装置NiのノードIDであるNiが格納
されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻TA2,iが格納されている。
また、図1のネットワーク1では、ノード装置N3にはノード装置N2、N4、およびN5が隣接している。したがって、ノード装置N3の隣接ノード管理テーブル103−N3は、これら3つの隣接ノード装置N2、N4、およびN5にそれぞれ対応する3つのエントリがある。そして、隣接ノード装置Ni(i=2,4,5)に対応する各エントリにおいて、ノードIDフィールドには隣接ノード装置NiのノードIDであるNiが格納されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻TA3,iが格納されている。
図10は、図3の重み付けテーブル104の例を示す図である。図10は、具体例として、図1のノード装置N3の重み付けテーブル104−N3を示している。
図3に示すとおり、「重み付けテーブル104」とは、GDごとに管理される複数の重み付けテーブル104−1〜104−Mの総称である。各重み付けテーブル104−i(1≦i≦M)は、対応するGDを記憶している。
そして、各重み付けテーブル104−i(1≦i≦M)は1つ以上のエントリを有し、各エントリは、最終更新時刻フィールドとLDフィールドと重みフィールドを有する。最終更新時刻フィールドには重みの学習のためにエントリが最後に更新された時刻が格納され、LDフィールドには隣接ノード装置のノードIDが格納され、重みフィールドには当該隣接ノード装置に対応付けられた重みの値が格納される。
図10の例では、1枚目の重み付けテーブル104−1−N3は、ノード装置N7がGDとして指定されているデータフレームの送信用のテーブルなので、GDとしてノード装置N7のノードIDであるN7を記憶している。
また、図1のネットワーク1では、ノード装置N3にはノード装置N2、N4、およびN5が隣接している。したがって、重み付けテーブル104−1−N3は、これら3つの隣接ノード装置N2、N4、およびN5にそれぞれ対応する3つのエントリを有する。重み付けテーブル104−1−N3において隣接ノード装置Ni(i=2,4,5)に対応する各エントリの内容は、次のとおりである。
・最終更新時刻フィールドには、エントリの最終更新時刻TW3,7,iが格納されている。
・LDフィールドには、隣接ノード装置NiのノードIDであるNiが格納されている。
・重みフィールドには、隣接ノード装置Niに対応付けられる重みW3,7,iが格納されている。
すなわち、重みW3,7,iは、ノード装置N7(つまり重み付けテーブル104−1−N3に対応するGD)をGDとして指定するデータフレームをノード装置N3が送信する場合に参照される、隣接ノード装置Niに対応する重みである。
同様に、図10の例では、2枚目の重み付けテーブル104−2−N3は、ノード装置N4がGDとして指定されているデータフレームの送信用のテーブルなので、GDとしてノード装置N4のノードIDであるN4を記憶している。
そして、図1のネットワーク1では、ノード装置N3にはノード装置N2、N4、およびN5が隣接しているので、重み付けテーブル104−2−N3も、これら3つの隣接ノード装置N2、N4、およびN5にそれぞれ対応する3つのエントリを有する。重み付けテーブル104−1−N3において隣接ノード装置Ni(i=2,4,5)に対応する各エントリの内容は、次のとおりである。
・最終更新時刻フィールドには、エントリの最終更新時刻TW3,4,iが格納されている。
・LDフィールドには、隣接ノード装置NiのノードIDであるNiが格納されている。
・重みフィールドには、隣接ノード装置Niに対応付けられる重みW3,4,iが格納されている。
もちろん、重み付けテーブル104−N3には、さらに別のGDと対応づけられた重み付けテーブル104−j−N3(j>2)が含まれていてもよい。
なお、次の点は注意すべきである。すなわち、重み付けテーブル104は、同一のGDであれば、たとえFIDとGSの組み合わせが異なるデータフレームを送信したとしても、送信の度に、送信先となったLDの重みが更新される。例えば、あるデータフレームの送信時に、リンク障害のため特定のLDの重みが大きくなっても(優先度が低くなっても)、すぐに別データフレーム(GDとLDは同一)の送信で、リンク障害が解消されていて送信成功となれば、該LDの重みは小さくなる(優先度は高くなる)。逆に、複数の異なるデータフレーム(GDとLDは同一)が立て続けに、リンク障害のため送信失敗となれば、たとえ同一のFIDとGSの組み合わせのデータフレームは1度しか送信を試していなくても、該当のLDの重みが最大値になってしまうこともありうる。
図11は、図10の重み付けテーブル104−1−N3の変化を説明する図である。図11の例では、Ta<Tb<Tc<Td<Teである。
例えば、図6のステップS102でノード装置N2からデータフレームを受信した時点では、ノード装置N3の重み付けテーブル104−N3には、ノード装置N7に対応する重み付けテーブル104−1−N3が存在しなかったとする。そして、ステップS102の受信を契機として、以下のような内容の新たな重み付けテーブル104−1−N3が重み付けテーブル104−N3に作成されたとする。
・3つのエントリの最終更新時刻はいずれも時刻Taである。
・3つのエントリにおいて、隣接ノード装置Ni(i=2,4,5)に対応付けられる重みW3,7,iは、いずれも0.5である。
なお、図6に関しては説明の簡単化のため、「2つの隣接ノード装置N4とN5のうちでノード装置N4の方が、重み付けテーブル104−h3−N3において、より軽い重みと対応付けられているとする」と説明した。つまり、図10と図11はh3=1の例であり、図6の説明ではW3,7,4<W3,7,5と仮定している。
しかし、例えば図11に示すように、W3,7,2=W3,7,4=W3,7,5=0.5という場合もありうる。図11の例では、ノード装置N4とN5が同じ重み0.5に対応付けられているので、ノード装置N3はステップS103での送信のLDとしてノード装置N4とN5のいずれを選ぶこともできるが、仮に、図6の例と同様に、ノード装置N4をLDとして選んだとする。
すると、ステップS103でノード装置N3がノード装置N4にデータフレームを送信する。その後、図31においてステップS103aとして示すようにノード装置N4がノード装置N3にACKフレームを送信すると、ノード装置N3は、ノード装置N4へのデータフレームの送信が成功したと認識する。
そして、図5の例と同様にして、ノード装置N3は、ノード装置N4に対応付けられた重みW3,7,4の値を小さくする。図11の例では、具体的には、ノード装置N3はW3,7,4の値を0.5から0.4に更新する。また、ノード装置N3は、ノード装置N4に対応するエントリの最終更新時刻フィールドに、現在時刻Tbを設定する。
その後、図6に示すように、ノード装置N3はステップS106で再び同一のデータフレームを受信する。その結果、ノード装置N3は、図6に関して説明したように、重み付けテーブル104−1−N3においてノード装置N4と対応付けられている重みW3,7,4の値を、0.4から最大値である1.0に更新する。また、ノード装置N3は、ノード装置N4に対応するエントリの最終更新時刻フィールドに、現在時刻Tcを設定する。
続いて、図6のステップS107に示すように、ノード装置N3はノード装置N5をLDとして選択してデータフレームを送信する。その後、図31においてステップS107aとして示すようにノード装置N5がノード装置N3にACKフレームを送信すると、ノード装置N3は、ノード装置N5へのデータフレームの送信が成功したと認識する。
そして、図5の例と同様にして、ノード装置N3は、ノード装置N5に対応付けられた重みW3,7,5の値を小さくする。図11の例では、具体的には、ノード装置N3はW3,7,5の値を0.5から0.4に更新する。また、ノード装置N3は、ノード装置N5に対応するエントリの最終更新時刻フィールドに、現在時刻Tdを設定する。
その後、図6に示すように、ノード装置N3はステップS109で再び同一のデータフレームを受信する。その結果、図6に関して説明したように、重み付けテーブル104−1−N3においてノード装置N5と対応付けられている重みW3,7,5の値を、0.4から最大値である1.0に更新する。また、ノード装置N3は、ノード装置N5に対応するエントリの最終更新時刻フィールドに、現在時刻Teを設定する。
以上のように、重み付けテーブル104−1−N3は、ACKフレームの受信を契機として、あるいは、送信済みのデータフレームと同一のデータフレームの受信を契機として、更新される。
図12と図13は、図3のFID管理テーブル105の例を示す図である。図12と図13に示すように、FID管理テーブル105には、FID、GS、LD、OLS、最終更新時刻の各フィールドがある。
FID管理テーブル105におけるFIDフィールドとGSフィールドは、データフレームを一意に識別するためのフィールドであり、受信したデータフレームのFIDフィールドとGSフィールドから値がそれぞれコピーされる。
FID管理テーブル105のLDフィールドには、FIDフィールドとGSフィールドの値により識別されるデータフレームを送信するために、最後にLDとして選択した隣接ノード装置のノードIDが格納される。
また、FID管理テーブル105のOLSフィールドには、FIDフィールドとGSフィールドの値により識別されるデータフレームを最初に受信したときに当該データフレームのLSフィールドに指定されていた隣接ノード装置のノードIDが格納される。OLSフィールドは、データフレームの転送のためにLDを選択するにあたって、LDの候補の中からOLSを除くためにも利用され、バックトラック動作のときのLDを決定するため
にも利用される。
そして、FID管理テーブル105の最終更新時刻フィールドには、エントリが最後に更新された時刻が格納される。
さて、図12と図13は、図6のステップS101〜S112での各ノード装置のFID管理テーブル105を具体例として示している。以下、ステップS101〜S112がそれぞれ実行される時刻をTF101〜TF112と表す。
ステップS101でノード装置N1がノード装置N2にデータフレームを送信するとき、ノード装置N1はFID管理テーブル105−N1に新たなエントリE1を作成する。
そして、ノード装置N1は、エントリE1のFIDフィールドとGSフィールドに、送信したデータフレームのFIDとGSの値を設定する。
ここで、データフレームのGSとFIDの値は、前述のとおり、データフレームがネットワーク1内を転送されても書き換えられない。したがって、図6でネットワーク1内をステップS101〜S112で送信されるデータフレームのFIDとGSの値は、図7のデータフレーム303および304と同じく、それぞれFaとN1である。よって、ステップS101でノード装置N1は、エントリE1のFIDフィールドとGSフィールドに、それぞれFaとN1という値を設定する。
なお、以下の各ステップS102〜S112で他のノード装置がそれぞれのFID管理テーブル105のエントリのFIDフィールドとGSフィールドに設定する値も、同じくFaとN1である。よって、以下ではFIDフィールドとGSフィールドに関する説明を省略する。
また、ステップS101でノード装置N1は、LDとして選択したノード装置N2のノードIDであるN2を、エントリE1のLDフィールドに設定する。
ところで、GSとFIDの値の組により一意に識別される、ある特定のデータフレームに関して、OLSとは、当該特定のデータフレームを最初に受信したときの当該特定のデータフレームのLSに指定されたノードIDで識別される隣接ノード装置のことである。
しかしこのようにOLSを定義すると、例えばノード装置N1がGSとなってデータフレームを送信する場合に、ノード装置N1自身にとっては、送信したデータフレームに関してOLSが未定義となってしまう。そこで、以下ではOLSの定義を拡張する。具体的には、「ノード装置Ni自身がGSとなってデータフレームを送信する場合には、当該データフレームに関するノード装置Ni自身にとってのOLSとは、ノード装置Ni自身である」と定義する。
換言すれば、OLSとは、ノード装置Ni自身が直接認識しているネットワークの範囲内において、ノード装置Niにとってデータフレームの起源として認識されるノード装置である。なおここで、「ノード装置Ni自身が直接認識しているネットワークの範囲」とは、ノード装置Niから見てホップ数1以下の範囲であり、具体的にはノード装置Ni自身と、ノード装置Niの隣接ノード装置のみが含まれる。例えば、図2の例では、ノード装置N105自身が直接認識しているネットワークの範囲のみが実線で示されている。
以上の拡張されたOLSの定義より、ステップS101でノード装置N1がエントリE1のOLSフィールドに設定する値は、ノード装置N1自身のノードID(すなわちN1)である。ノード装置N1は、もし今後GSの値がN1でFIDの値がFaのデータフレームを受信することがあれば、以上のようにして作成したエントリE1に基づいて、「かつてノード装置N1自身が送信したデータフレームを受信した」と認識することができる
。
また、ステップS101でノード装置N1は、現在時刻TF101をエントリE1の最終更新時刻フィールドに設定する。なお、以下の各ステップS102〜S112で他のノード装置がそれぞれのFID管理テーブル105のエントリの最終更新時刻フィールドに設定する値は、同様に、各ステップS102〜S112が実行される時刻TF102〜TF112である。よって、以下では最終更新時刻フィールドに関する説明も省略する。
そして、ステップS101でノード装置N1からデータフレームを受信したノード装置N2は、ステップS102でノード装置N3にデータフレームを送信するときにFID管理テーブル105−N2に新たなエントリE2を作成する。そして、ノード装置N2はエントリE2において、OLSフィールドにはN1と設定し、LDフィールドにはN3と設定する。
続いて、ステップS102でノード装置N2からデータフレームを受信したノード装置N3は、ステップS103でノード装置N4にデータフレームを送信するときにFID管理テーブル105−N3に新たなエントリE3を作成する。そして、ノード装置N3はエントリE3において、OLSフィールドにはN2と設定し、LDフィールドにはN4と設定する。
続いて、ステップS103でノード装置N3からデータフレームを受信したノード装置N4は、ステップS104でノード装置N7にデータフレームを送信するときにFID管理テーブル105−N4に新たなエントリE4を作成する。そして、ノード装置N4はエントリE4において、OLSフィールドにはN3と設定し、LDフィールドにはN7と設定する。
ところが、ステップS104での送信は、ノード装置N4とN7の間のリンクの障害のために失敗する。すなわち、ノード装置N4は、ノード装置N7からACKフレームを受信することができないため、タイムアウトする。その結果、ノード装置N4は、ステップS105のように、他の隣接ノード装置N5を次のLDとして再選択し、ノード装置N5にデータフレームを送信する。
ここで、ステップS104とS105でそれぞれ送信されるデータフレームは、FIDの値がFaでありGSの値がN1であるから、同一のデータフレームである。したがって、ステップS105でノード装置N4は、新たなエントリを作成するのではなく、既存のエントリE4を更新する。
具体的には、ステップS105でノード装置N4は、エントリE4において、LDフィールドの値をN5に上書きする。なお、GSの値がN1でFIDの値がFaである同じデータフレームをノード装置N4が何度送信しようとも、「ノード装置N4が当該データフレームを最初に受信したのはノード装置N3からである」という事実は変わらない。よって、エントリE4のOLSフィールドの値は、書き換えられることはなく、N3のままである。
続いて、ステップS105でノード装置N4からデータフレームを受信したノード装置N5は、ステップS106でノード装置N3にデータフレームを送信するときにFID管理テーブル105−N5に新たなエントリE5を作成する。そして、ノード装置N5はエントリE5において、OLSフィールドにはN4と設定し、LDフィールドにはN3と設定する。
そして、ステップS106でノード装置N5からデータフレームを受信したノード装置N3は、受信したデータフレームのGSとFIDの値をキーにしてFID管理テーブル105−N3を検索し、エントリE3を見つける。エントリE3が見つかったことから、ノード装置N3は、「ノード装置N3自身がかつてステップS103で送信したのと同一のデータフレームをステップS106で受信した」と認識することができる。
したがって、ノード装置N3は、次のステップS107でデータフレームをノード装置N5に送信するに際して、FID管理テーブル105−N3に新たなエントリを作成するのではなく、既存のエントリE3を更新する。具体的には、ステップS107でノード装置N3は、エントリE3において、LDフィールドの値をN5に上書きする。なお、エントリE3のOLSフィールドの値は書き換えられることはなく、N2のままである。
すると、ステップS107でノード装置N3からデータフレームを受信したノード装置N5は、受信したデータフレームのGSとFIDの値をキーにしてFID管理テーブル105−N5を検索し、エントリE5を見つける。エントリE5が見つかったことから、ノード装置N5は、「ノード装置N5自身がかつてステップS106で送信したのと同一のデータフレームをステップS107で受信した」と認識することができる。
したがって、ノード装置N5は、次のステップS108でデータフレームをノード装置N4に送信するに際して、FID管理テーブル105−N5に新たなエントリを作成するのではなく、既存のエントリE5を更新する。具体的には、ステップS108でノード装置N5は、エントリE5において、LDフィールドの値をN4に上書きする。なお、エントリE5のOLSフィールドの値は書き換えられることはなく、N4のままである。
すると、ステップS108でノード装置N5からデータフレームを受信したノード装置N4は、受信したデータフレームのGSとFIDの値をキーにしてFID管理テーブル105−N4を検索し、エントリE4を見つける。エントリE4が見つかったことから、ノード装置N4は、「ノード装置N4自身がかつてステップS105で送信したのと同一のデータフレームをステップS108で受信した」と認識することができる。
したがって、ノード装置N4は、次のステップS109でデータフレームをノード装置N3に送信するに際して、FID管理テーブル105−N4に新たなエントリを作成するのではなく、既存のエントリE4を更新する。具体的には、ステップS109でノード装置N4は、エントリE4において、LDフィールドの値をN3に上書きする。なお、エントリE4のOLSフィールドの値は書き換えられることはなく、N3のままである。
すると、ステップS109でノード装置N4からデータフレームを受信したノード装置N3は、受信したデータフレームのGSとFIDの値をキーにしてFID管理テーブル105−N3を検索し、エントリE3を見つける。エントリE3が見つかったことから、ノード装置N3は、「ノード装置N3自身がかつてステップS103で送信したのと同一のデータフレームをステップS109で受信した」と認識することができる。
したがって、ノード装置N3は、次のステップS110でデータフレームをノード装置N2に送信するに際して、FID管理テーブル105−N3に新たなエントリを作成するのではなく、既存のエントリE3を更新する。具体的には、ステップS110でノード装置N3は、エントリE3において、LDフィールドの値をN2に上書きする。なお、エントリE3のOLSフィールドの値は書き換えられることはなく、N2のままである。
すると、ステップS110でノード装置N3からデータフレームを受信したノード装置N2は、受信したデータフレームのGSとFIDの値をキーにしてFID管理テーブル105−N2を検索し、エントリE2を見つける。エントリE2が見つかったことから、ノード装置N2は、「ノード装置N2自身がかつてステップS102で送信したのと同一のデータフレームをステップS110で受信した」と認識することができる。
したがって、ノード装置N2は、次のステップS111でデータフレームをノード装置N6に送信するに際して、FID管理テーブル105−N2に新たなエントリを作成するのではなく、既存のエントリE2を更新する。具体的には、ステップS111でノード装置N2は、エントリE2において、LDフィールドの値をN6に上書きする。なお、エントリE2のOLSフィールドの値は書き換えられることはなく、N1のままである。
そして、ステップS111でノード装置N2からデータフレームを受信したノード装置N6は、ステップS112でノード装置N7にデータフレームを送信するときにFID管理テーブル105−N6に新たなエントリE6を作成する。そして、ノード装置N6はエントリE6において、OLSフィールドにはN2と設定し、LDフィールドにはN7と設定する。
続いて、図14〜図29のフローチャートを参照して、ノード装置100の動作の詳細を説明する。
図14は、フレーム受信処理のフローチャートである。フレーム受信処理は、ノード装置100に電源が入れられると開始される。
ステップS201で受信部101は、フレームを受信するまで待機する。つまり、受信部101は、フレームを受信していなければステップS201を繰り返す。フレームを受信すると、受信部101は受信したフレームをフレーム分岐処理部106に出力し、処理はステップS202に移行する。
ステップS202では、フレーム分岐処理部106が、ステップS201で受信部101が受信したフレームのタイプフィールドの値を参照し、フレームのタイプを判定する。受信したフレームのタイプがハローフレームの場合、処理はステップS203に移行し、データフレームの場合、処理はステップS204に移行し、ACKフレームの場合、処理はステップS206に移行する。
ステップS203では、受信されたハローフレームをフレーム分岐処理部106がリンク管理部108へ出力し、リンク管理部108が図15のハローフレーム受信処理を行う。そして処理はステップS201に戻る。もちろん、図4のMPU201が図3の各部に対応する複数のタスクを並行して実行するマルチタスク環境では、フレーム分岐処理部106がハローフレームを出力したら、ハローフレーム受信処理の終了を待たずに処理がステップS201に移行してもよい。
また、ステップS204では、フレーム分岐処理部106が、ステップS201で受信されたデータフレームをバッファ部109に格納する。つまり、フレーム分岐処理部106は、バッファ部109内に新たなエントリの領域を確保し、確保した領域にステップS201で受信されたデータフレームを格納する。また、フレーム分岐処理部106は、次のステップS205のためにデータフレームからGSとFIDの値を取り出して記憶しておく。
なお、図8のとおりバッファ部109はタイムアウト時刻フィールドを有するが、ステップS204の時点では、タイムアウト時刻はまだ設定されない。
そして、ステップS205でフレーム分岐処理部106は、データフレーム処理部110にデータフレーム受信処理を行うよう指示する。指示に際してフレーム分岐処理部106は、ステップS204で記憶しておいたデータフレームのGSとFIDの値をデータフレーム処理部110に通知する。
なお、ノード装置100がGSとならないタイプの装置である場合(すなわち、ノード装置100が中継専門の装置である場合)、データフレーム受信処理は図20〜23のとおりである。他方、ノード装置100がGSにもなりうるタイプの装置である場合、データフレーム受信処理は、図20〜22、29のとおりである。
データフレーム処理部110が指示にしたがってデータフレーム受信処理を行うと、処理はステップS201に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部106がデータフレーム処理部110にデータフレーム受信処理を行うよう指示したら、データフレーム受信処理の終了を待たずに処理がステップS201に移行してもよい。
また、ステップS206では、受信されたACKフレームをフレーム分岐処理部106がACK処理部107へ出力し、ACK処理部107が図25のACKフレーム受信処理を行う。そして処理はステップS201に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部106がACKフレームを出力したら、ACKフレーム受信処理の終了を待たずに処理がステップS201に移行してもよい。
図15は、図14のステップS203におけるハローフレーム受信処理のフローチャートである。図15の処理は、フレーム分岐処理部106からハローフレームがリンク管理部108に出力されると開始される。
ステップS301でリンク管理部108は、受信したハローフレームのLSと同じ値をノードIDとして持つエントリが、隣接ノード管理テーブル103(図9参照)に存在するか否かを判断する。エントリが見つかれは処理はステップS302に移行し、エントリが見つからなければ処理はステップS303に移行する。
なお、図15の説明における「受信したハローフレーム」とは、図14のステップS201で受信部101が受信したハローフレームである。つまり、図15の説明における「受信したハローフレーム」とは、ステップS202でフレーム分岐処理部106がリンク管理部108に出力して図15の処理の開始の契機となったハローフレームである。
ステップS302でリンク管理部108は、ステップS301で見つかったエントリの最終更新時刻として、現在時刻を設定する。そして、図15の処理は終了する。
例えば、ノード装置N2においてステップS302が実行された結果として、図9のように隣接ノード管理テーブル103−N2において、N1というノードIDに対応する最終更新時刻フィールドの値がTA2,1と更新される。その結果、ノード装置N2は「時刻TA2,1にはノード装置N2がノード装置N1を隣接ノード装置として認識可能な状況であった」と記憶しておくことができる。
他方、ステップS301でエントリが見つからない場合は、今まで隣接ノード装置として認識していなかった新たなノード装置からハローフレームが受信されたということである。よって、続くステップS303〜S308において、当該新たなノード装置を隣接ノード装置として登録するための処理が行われる。
ステップS303でリンク管理部108は、隣接ノード管理テーブル103に新規エントリを追加する。
そして、ステップS304でリンク管理部108は、ステップS303で追加した新規エントリに、受信したハローフレームのLSの値と現在時刻を設定する。例えば、図7のハローフレーム312を初めて受信したとき、ノード装置N2は、新規エントリのノードIDフィールドに、ハローフレーム312のLSの値であるN3を設定し、新規エントリの最終更新時刻フィールドに現在時刻を設定する。
続いて、ステップS305でリンク管理部108は、重み付けテーブル104−1〜104−M(図10と図11を参照)の中に、まだ注目していない重み付けテーブル104−i(1≦i≦M)があるか否かを判断する。既にすべての重み付けテーブル104−1〜104−Mに注目し終わっていれば、図15の処理は終了し、まだ注目していない重み付けテーブル104−iがあれば、処理はステップS306に移行する。
ステップS306でリンク管理部108は、重み付けテーブル104−1〜104−Mのうちでまだ注目していないものの中から、次の重み付けテーブルに注目する。以下では説明の便宜上、ステップS306では重み付けテーブル104−iが注目されたとする。
そして、ステップS307でリンク管理部108は、注目している重み付けテーブル104−iに新規エントリを追加する。
さらに、ステップS308でリンク管理部108は、ステップS307で追加した新規エントリのLD、重み、最終更新時刻の各フィールドに、受信したハローフレームのLSの値と、初期重み付け値と、現在時刻を、それぞれ設定する。初期重み付け値は、実施形態に応じて任意に決められる定数である。
第1実施形態では、上記のとおり重みの値は0以上1以下であり、1はLDとして選択不能なことを示す特別な値であるから、初期重み付け値は、0以上1未満の任意の値でよい。より具体的には、初期重み付け値は、例えば0.5でもよい。例えば、図11の1番上に示した重み付けテーブル104−1−N3の最初のエントリは、次のようにして作成されたものであってもよい(ただし、正確にはその場合、最初のエントリの最終更新時刻には、他の2つのエントリの最終更新時刻Taとは異なる値が設定され、図11とまったく同じとはならない)。
・GDとしてノード装置N7に対応付けられた重み付けテーブル104−1−N3が既に存在している。
・しかし、ノード装置N3は、ノード装置N2を隣接ノード装置として今まで認識していなかった。
・ノード装置N3は、ノード装置N2から初めてハローフレームを受信した。
・以上の状況において、ステップS306では重み付けテーブル104−1−N3が注目された。
・よって、ステップS308では、新規エントリのLDフィールドに、受信したハローフレームのLSの値であるN2が設定され、新規エントリの重みフィールドに、初期重み付け値である0.5が設定された。
ステップS308の実行後、処理はステップS305に戻る。
図16は、ハローフレーム送信処理のフローチャートである。図16の処理は、図14の処理とは独立して並行に、ハローフレーム生成部112により実行される。具体的には、ノード装置100に電源が入れられると、ハローフレーム生成部112が図16の処理を開始する。
ステップS401でハローフレーム生成部112は、現在時刻が送信予定時刻であるか否かを判断する。現在時刻が送信予定時刻であれば処理はステップS402に移行し、現在時刻が送信予定時刻でなければ処理はステップS401に戻る。つまり、ハローフレーム生成部112は送信予定時刻まで待機する。
例えば、基準時刻Trefとハローフレームの送信間隔ΔThelloが予め決められていてもよい。また、ハローフレーム生成部112は、例えば図4のMPU201のクロックに基づいて現在時刻Tnowを参照することができる。ハローフレーム生成部112は、式(4)のZが整数のときのみ、「現在時刻は送信予定時刻である」と判断してもよい。
Z=(Tref−Tnow)/ΔThello (4)
例えば、基準時刻Trefは予め決められた定数でもよいし、ノード装置100に電源が入れられた時刻でもよい。また、送信間隔ΔThelloは実施形態に応じて適宜決めることができ、例えば10秒などの比較的長い時間でもよい。
ステップS402では、ハローフレーム生成部112がFID生成部113に新たなFIDの生成を要求し、FID生成部113が新たなFIDを生成する。例えば、FIDはシーケンス番号でもよく、FID生成部113はカウンタ回路を使って実現されてもよい。もちろん、FID生成部113はMPU201がプログラムを実行することで実現されてもよい。
ステップS402ではさらに、FID生成部113が生成したFIDを用いてハローフレーム生成部112がハローフレームを生成する。
例えば、図7のハローフレーム312は、次のようにして生成される。すなわち、ノード装置N3のFID生成部113−N3が、新たなFIDとしてFbという値を生成する。すると、ノード装置N3のハローフレーム生成部112−N3は、新たなハローフレーム312を生成する。
その際、ハローフレーム生成部112−N3は、ハローフレーム312において、LDに0xFFFFFFという所定の値を設定し、LSとGSに自ノードIDであるN3を設定し、GDに0x000000という所定の値を設定する。また、ハローフレーム生成部112−N3は、ハローフレーム312において、FIDにはFID生成部113−N3により生成された値Fbを設定し、タイプには所定の値Hを設定する。
以上のようにしてステップS402でハローフレームが生成されると、続いて、ステップS403においてハローフレーム生成部112は、生成したハローフレームの送信を送信部102に依頼し、送信部102がハローフレームを送信する。そして、処理はステップS401に戻る。
続いて、各種テーブルのエージング処理について図17〜図19を参照して説明する。各エージング処理は、例えば、図4のタイマIC203からの割り込み信号を契機として開始されてもよい。
図17は、隣接ノード管理テーブル103のエージング処理のフローチャートである。例えば、タイマIC203が所定の間隔Iaで割り込み信号をリンク管理部108に出力し、割り込み信号を契機としてリンク管理部108が所定の間隔Iaで図17の処理を行ってもよい。
ステップS501でリンク管理部108は、隣接ノード管理テーブル103(図9を参照)の1つ目のエントリに注目する。以下、図17に関する説明においては、リンク管理部108が注目している隣接ノード管理テーブル103のエントリを「注目エントリ」という。
続いてステップS502でリンク管理部108は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ga以上か否かを判断する。なお、実施形態によって、Ga=Iaでもよいし、Ga<Iaでもよいし、Ga>Iaでもよい。
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ga以上であれば、処理はステップS503に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ga未満であれば、処理はステップS505に移行する。
ステップS503でリンク管理部108は、注目エントリのノードIDと同じ値をLDとして有するエントリを、重み付けテーブル104から削除する。
例えば、注目エントリが、図9の隣接ノード管理テーブル103−N3の3番目のエントリである場合、注目エントリのノードIDの値はN5である。したがって、ステップS503でリンク管理部108は、重み付けテーブル104−1−N3〜104−M−N3のそれぞれから、LDの値がN5であるエントリを削除する。例えば、ステップS503では、図10の重み付けテーブル104−1−N3の3つ目のエントリと、重み付けテーブル104−2−N3の3つ目のエントリが削除される。
そして、ステップS504でリンク管理部108は。注目エントリを隣接ノード管理テーブル103から削除する。そして処理はステップS505に移行する。
ステップS505でリンク管理部108は、まだ注目していないエントリが隣接ノード管理テーブル103に残っているか否かを判断する。リンク管理部108が、隣接ノード管理テーブル103のすべてのエントリに注目し終わっていれば、図17の処理は終了する。他方、まだリンク管理部108が注目していないエントリが隣接ノード管理テーブル103に残っていれば、処理はステップS506に移行する。
ステップS506でリンク管理部108は、隣接ノード管理テーブル103のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップS502に戻る。
以上の図17のエージング処理により、ノード装置100は、今まで隣接ノード装置として認識していたノード装置からのハローフレームの受信が途絶えると、「当該ノード装置は、もはやノード装置100に隣接していない」と認識することができるようになる。つまり、図17の処理により、ノード装置100は、潜在的なLDの候補としての隣接ノード装置を、環境の変化に追従して適切に管理することができるようになる。
なお、上記の所定の間隔Iaおよび所定の値Gaは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。なお、第1実施形態では、ネットワーク内のすべてのノード装置に同じハローフレームの送信間隔ΔThelloが設定されており、隣接ノード管理テーブル103のエージング時間である上記の所定の値Gaは、Ga>ΔThelloを満たす。
図18は、重み付けテーブル104のエージング処理のフローチャートである。例えば、タイマIC203が所定の間隔Iwで割り込み信号をデータフレーム処理部110に出力し、割り込み信号を契機としてデータフレーム処理部110が所定の間隔Iwで図18の処理を行ってもよい。
ステップS601でデータフレーム処理部110は、重み付けテーブル104(図10と図11を参照)のうち1枚目の重み付けテーブル104−1に注目する。以下、図18に関する説明においては、データフレーム処理部110が注目している重み付けテーブルを、「104−i」という参照符号で表し(1≦i≦M)、「注目テーブル」という。ステップS601の実行直後はi=1である。
続いてステップS602でデータフレーム処理部110は、注目テーブル104−iの1つ目のエントリに注目する。以下、注目テーブルのうちでデータフレーム処理部110が注目しているエントリを「注目エントリ」という。
続いてステップS603でデータフレーム処理部110は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gw以上か否かを判断する。なお、実施形態によって、Gw=Iwでもよいし、Gw<Iwでもよいし、Gw>Iwでもよい。
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gw以上であれば、処理はステップS604に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gw未満であれば、処理はステップS605に移行する。
ステップS604でデータフレーム処理部110は、注目テーブル104−iから注目エントリを削除する。そして処理はステップS605に移行する。
ステップS605でデータフレーム処理部110は、注目テーブル104−iにまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部110が注目テーブル104−iのすべてのエントリに注目し終わっていれば、処理はステップS607に移行する。他方、まだデータフレーム処理部110が注目していないエントリが注目テーブル104−iに残っていれば、処理はステップS606に移行する。
ステップS606でデータフレーム処理部110は、注目テーブル104−i内のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップS603に戻る。
ステップS607でデータフレーム処理部110は、注目テーブル104−iにエントリが存在するか否かを判断する。ステップS603〜S606の繰り返しの結果、注目テーブル104−iにエントリがなくなった場合は、処理はステップS608に移行する。他方、注目テーブル104−iに1つ以上エントリが存在すれば、処理はステップS609に移行する。
ステップS608でデータフレーム処理部110は、エントリの存在しない注目テーブル104−iを削除する。そして、処理はステップS609に移行する。
ステップS609でデータフレーム処理部110は、まだ注目していない重み付けテーブルが重み付けテーブル104の中に残っているか否かを判断する。データフレーム処理部110が、すべての重み付けテーブル104−1〜104−Mに注目し終わっていれば、図18の処理は終了する。他方、まだデータフレーム処理部110が注目していない重み付けテーブル104−j(1≦j≦M)が重み付けテーブル104の中に残っていれば、処理はステップS610に移行する。
ステップS610でデータフレーム処理部110は、重み付けテーブル104の中でまだ注目していない次の重み付けテーブル104−jに注目する(すなわち、重み付けテーブル104−jを注目テーブル104−iとして選ぶ)。そして処理はステップS602に戻る。
以上の図18のエージング処理により、ノード装置100は、「過去の障害の影響が累積されて、どの隣接ノード装置もLDとして選択することが不能となる」といった事態に陥らずに済む。
例えば、図6の例において、ステップS112の後、ノード装置N6とN7の間のリンクに障害が発生し、ノード装置N4とN7の間のリンクが障害から復旧したという状況を想定する。もし図18のエージング処理が行われないと、実際には障害からの復旧により、例えば経路〈N1,N2,N3,N4,N7〉でのデータフレームの送信が可能になっていても、自律分散協調の結果としてこの経路が選択されることがなくなってしまう。しかし、図18のエージング処理が行われれば、上記で想定した状況において、経路〈N1,N2,N3,N4,N7〉が選択されうるようになる。
なお、上記の所定の間隔Iwおよび所定の値Gwは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。
図19は、FID管理テーブル105のエージング処理のフローチャートである。例えば、タイマIC203が所定の間隔Ifで割り込み信号をデータフレーム処理部110に出力し、割り込み信号を契機としてデータフレーム処理部110が所定の間隔Ifで図19の処理を行ってもよい。
ステップS701でデータフレーム処理部110は、FID管理テーブル105(図12と図13を参照)のうち1つ目のエントリに注目する。以下、図19に関する説明においては、データフレーム処理部110が注目しているエントリを「注目エントリ」という。
続いてステップS702でデータフレーム処理部110は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gf以上か否かを判断する。なお、実施形態によって、Gf=Ifでもよいし、Gf<Ifでもよいし、Gf>Ifでもよい。
また、図21のステップS807に関して後述する理由から、第1実施形態では、重み付けテーブル104のエージング時間である所定の値Gwと、FID管理テーブル105のエージング時間である所定の値Gfは、Gf<Gwを満たす。
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gf以上であれば、処理はステップS703に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gf未満であれば、処理はステップS704に移行する。
ステップS703でデータフレーム処理部110は、注目エントリをFID管理テーブル105から削除する。そして処理はステップS704に移行する。
そして、ステップS704でデータフレーム処理部110は、まだ注目していないエントリがFID管理テーブル105に残っているか否かを判断する。データフレーム処理部110がFID管理テーブル105のすべてのエントリに注目し終わっていれば、図19の処理は終了する。他方、まだデータフレーム処理部110が注目していないエントリがFID管理テーブル105に残っていれば、処理はステップS705に移行する。
ステップS705でデータフレーム処理部110は、FID管理テーブル105のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップS702に戻る。
以上の図19のエージング処理により、「FID管理テーブル105のエントリが増え続けて記憶領域を使い尽くしてしまう」といった事態を防ぐことができる。
なお、上記の所定の値Gfは、例えば、何度もバックトラックが生じる最悪ケースにおいてデータフレームがGSからGDに到達するのにかかると予測される時間の長さ以上になるよう、決められていてもよい。なお、「最悪ケース」とは、詳しくは図30とともに後述するが、探索空間において、刈り込まれていない全探索ノードをバックトラックしながら深さ優先探索順にたどる場合を意味する。一般には、ネットワークの規模が大きいほど、所定の値Gfも大きく設定しておくことが望ましい。
図20〜図23は、図14のステップS205におけるデータフレーム受信処理のフローチャートである。なお、説明の便宜上、まず、ノード装置100がGSとはならず中継専門のタイプである場合のデータフレーム受信処理について、図20〜図23を参照して説明する。ノード装置100がGSにもなりうるタイプの場合については、図23の部分が後述の図29の処理に置き換わる。
図14のステップS205でフレーム分岐処理部106からデータフレーム受信処理を行うよう指示されると、データフレーム処理部110は図20の処理を開始する。なお、前述のとおり、フレーム分岐処理部106からの指示は、受信したデータフレームのGSとFIDの値の通知をともなっている。
ステップS801でデータフレーム処理部110は、受信したデータフレームのLDの値が自ノードIDであるか否かを判断する。受信したデータフレームのLDの値が自ノードIDでなければ、処理はステップS802に移行し、受信したデータフレームのLDの値が自ノードIDであれば、処理はステップS803に移行する。
なお、データフレーム受信処理の説明において、「受信したデータフレーム」とは、図14のステップS201で受信部101が受信し、ステップS204でバッファ部109に格納され、図20の処理の開始の契機となったデータフレームのことである。
また、フレーム分岐処理部106は、データフレーム受信処理の開始をデータフレーム処理部110に指示するとき、受信したデータフレームのGSとFIDの値をデータフレーム処理部110に通知している。よって、データフレーム処理部110は、通知されたGSとFIDの値をキーにしてバッファ部109を検索することで、受信したデータフレームを含むエントリを見つけることができる。したがって、データフレーム処理部110は、見つけたエントリから、受信したデータフレームのヘッダに含まれる各フィールドの値を読み出すことができる。
正確には、ステップS801では、データフレーム処理部110はまず、以上のようにして、受信したデータフレームのヘッダに含まれる各フィールドの値をバッファ部109から読み出して記憶する。そして、記憶したLDの値(すなわち受信したデータフレームのLDの値)を自ノードIDと比較する。なお、ノード装置100自身のノードIDである自ノードIDは、例えば、図4のフラッシュメモリ205に予め記録されているので、データフレーム処理部110は自ノードIDを参照することができる。
受信したデータフレームのLDの値が自ノードIDと異なるとき、ノード装置100はノード装置100自身には無関係なデータフレームを偶然受信したということである。よって、ステップS802でデータフレーム処理部110は、受信したデータフレームを破棄する。つまり、データフレーム処理部110は、ステップS801で見つけたバッファ部109のエントリを削除する。そして、データフレーム受信処理は終了する。
他方、受信したデータフレームのLDの値が自ノードIDと等しい場合は、ステップS803でデータフレーム処理部110は、ACKフレームを生成し、ACKフレームの送信を送信部102に依頼する。そして、送信部102がACKフレームを送信する。
例えば、図7のデータフレーム303をノード装置N3が受信すると、ノード装置N3のデータフレーム処理部110−N3は、ステップS803において図7のACKフレーム322を生成する。そして、送信部102−N3がACKフレーム322を送信する。
具体的には、データフレーム処理部110−N3は、受信したデータフレーム303のLSの値であるN2をACKフレーム322のLDに設定し、自ノードID(すなわちノード装置N3自身のノードIDであるN3)をACKフレーム322のLSに設定する。また、ACKフレーム322は、対応するデータフレーム303のLSであるノード装置N2以外には無関係なので、データフレーム処理部110−N3は、ACKフレーム322のGDには、ヌルを表す特殊な値0x000000を設定する。
また、データフレーム処理部110−N3は、ACKフレーム322を受信したノード装置N2が「ACKフレーム322はデータフレーム303に対するACKフレームである」と認識することができるように、ACKフレーム322のGSとFIDを設定する。すなわち、データフレーム処理部110−N3は、ACKフレーム322のGSとFIDに、それぞれ、受信したデータフレーム303のGSとFIDの値N1とFaを設定する。
そして、データフレーム処理部110−N3は、ACKフレーム322のタイプとして、「ACKフレーム」を示す所定の値Aを設定する。ステップS803では、以上のようにしてデータフレーム処理部110−N3がACKフレーム322を生成し、送信部102−N3がACKフレーム322を送信する。
続いて、ステップS804でデータフレーム処理部110は、受信したデータフレームのGDの値が自ノードIDであるか否かを判断する。受信したデータフレームのGDの値が自ノードIDであれば、処理はステップS805に移行する。他方、受信したデータフレームのGDの値が自ノードIDと異なれば、処理は図21のステップS806に移行する。
ステップS805でデータフレーム処理部110は、上位層処理部111に、受信したデータフレームのペイロードを渡し、データフレーム受信処理を終了する。具体的には、データフレーム処理部110は、ステップS801で見つけたバッファ部109のエントリからペイロードを取り出して上位層処理部111に出力し、当該エントリをバッファ部109から削除する。そしてデータフレーム受信処理は終了する。
例えば、図6のステップS112でデータフレームをノード装置N6から受信したノード装置N7では、受信したデータフレームのペイロードは上位層処理部111−N7に出力され、上位層処理部111−N7において処理される。
図21のステップS806以降の処理は、受信したデータフレームのLDの値が自ノードIDと等しく、かつ受信したデータフレームのGDの値が自ノードIDと異なる場合に実行される。
ステップS806でデータフレーム処理部110は、受信したデータフレームのFIDとGSの値を検索キーとして用いて、FID管理テーブル105を検索する。なお、上記のように、受信したデータフレームのFIDとGSの値は、図20の処理の開始時にフレーム分岐処理部106から通知されている。
続いて、ステップS807でデータフレーム処理部110は、ステップS806の検索の結果エントリがヒットしたか否かを判断する。エントリがヒットした場合、ノード装置
100が以前送信したことのあるデータフレームと同じデータフレームが受信されたということなので、処理はステップS808に移行する。他方、エントリがヒットしなかった場合、ノード装置100が送信したことのないデータフレームが受信されたということなので、処理はステップS810に移行する。
なお、正確には、「ノード装置100が以前送信したことのあるデータフレームと同じデータフレームが受信されたが、検索対象のエントリは既にエージングにより消滅してしまった」という場合も、エントリはヒットしない。このような場合が生じないように、ネットワーク内でバックトラックが繰り返される最悪の時間の見積もりなどに基づいて、適切にFID管理テーブル105のエージング時間Gfが定められることが望ましい。
ステップS808でデータフレーム処理部110は、ステップS806の検索でヒットしたFID管理テーブル105のエントリのLDとOLSの値を取り出し、例えば図4のDRAM204などの記憶領域に記憶する。
続いてステップS809でデータフレーム処理部110は、受信したデータフレームのGDの値に対応する重み付けテーブル(以下、図21〜23の説明においては「104−i」という参照符号で参照する)を次のように更新する。すなわち、データフレーム処理部110は、重み付けテーブル104−iにおいて、ステップS808で取り出したLDに対応する重みを、最大値に変更する。なお、第1実施形態では重みの最大値は1である。重みの変更後、処理はステップS817に移行する。
なお、ステップS807、S808、S809と処理が進む場合、ステップS808で取り出したLDに対応するエントリが、受信したデータフレームのGDの値に対応する重み付けテーブル104−iに存在することが、ステップS809では保証されている。その理由は以下のとおりである。
図12と図13に関して説明したように、FID管理テーブル105のエントリにおいて最終更新時刻は、データフレームの送信時に設定される。また、図19に関して説明したように、FID管理テーブル105のエージング時間Gfは、例えば、最悪ケースで予測される時間以上に設定される。よって、ノード装置100が過去に送信したデータフレームがネットワーク内を巡ってノード装置100で受信されるとき、当該データフレームに対応するエントリは、まだFID管理テーブル105に残っていることが保証される。
そして、図11に関して説明したように、データフレームが送信されてACKフレームが返信されると、重みが更新され、重み付けテーブル104−1〜101−M内の各エントリにおいては、重みが更新されるときに最終更新時刻も設定される。
したがって、時系列を追うと下記(E1)〜(E5)の順となる。
(E1)GDの値がNGDで、GSの値がNGSで、LDの値がNLDで、FIDの値がFcのデータフレームがノード装置100から送信される。このとき、FID管理テーブル105において最終更新時刻が設定される。例えば、図6のノード装置N3において、ステップS103で図12のエントリE3に最終更新時刻T103が設定される。
(E2)上記データフレームに対するACKフレームが受信されると、ノード装置NGDに対応する重み付けテーブル104−iにおいて、LDフィールドの値がNLDであるエントリの重みが更新される。このとき、当該エントリの最終更新時刻が設定される。例えば、ノード装置N3において、図11に示すようにステップS103aで重み付けテーブル104−1−N3の、LDフィールドの値がN4であるエントリの最終更新時刻がTbに設定される。
(E3)GSの値がNGSで、FIDの値がFcの同じデータフレームが、ノード装置100で受信される。例えば、図6のステップS106でノード装置N3がデータフレームを受信する。なお、データフレームのGDの値は中継に際して書きかえられることはないので、(E3)で受信されるデータフレームのGDの値は、上記(E1)より当然、NGDである。
(E4)上記(E1)の時点から、FID管理テーブル105のエージング時間Gfが経過する。
(E5)上記(E2)の時点から、重み付けテーブル104のエージング時間Gwが経過する。
以上のとおり、(E3)の時点は(E5)の時点より前である。よって、(E3)の時点では、ノード装置NGDに対応する重み付けテーブル104−iにおいて、LDフィールドの値がNLDであるエントリの存在が保証される。
例えば、上記の例では、重み付けテーブル104−1−N3の、LDフィールドの値がN4であるエントリの存在が、図6のステップS106の時点保証されている。なお、ここでの「ステップS106の時点」とは、より詳しくは、ステップS106での受信を契機とするデータフレーム受信処理に含まれるステップS809の処理を、ノード装置N3が実行する時点のことである。
したがって、図21のステップS806の検索でFID管理テーブル105にエントリが見つかった場合、ステップS809では必ず、ステップS808で取り出したLDに対応するエントリが、重み付けテーブル104−iに存在する。よって、ステップS809でデータフレーム処理部110は、存在が保証されているエントリにおいて、重みの値を最大値に設定している。
逆に、ステップS806の検索でエントリが見つからなかった場合、ステップS810でデータフレーム処理部110は、受信したデータフレームのLSの値を、例えば図4のDRAM204などの記憶領域に、OLSとして記憶する。
そして、ステップS811でデータフレーム処理部110は、受信したデータフレームのGDの値を検索キーとして用いて、重み付けテーブル104を検索する。
続いて、ステップS812でデータフレーム処理部110は、ステップS811の検索の結果、テーブルがヒットしたか否かを判断する。
受信したデータフレームのGDの値に対応する重み付けテーブルが重み付けテーブル104の中に存在すれば、処理はステップS812aに移行する。なお、ステップS809で導入した「104−i」という参照符号は、受信したデータフレームのGDの値に対応する重み付けテーブルを指すので、ステップS811の検索の結果ヒットしたテーブルも、「重み付けテーブル104−i」である。
他方、受信したデータフレームのGDの値に対応する重み付けテーブルが重み付けテーブル104の中に存在しなければ、処理はステップS813に移行する。
ステップS812aでデータフレーム処理部110は、ステップS811の検索でヒットした重み付けテーブル104−iを調整する。ステップS812aの重み付けテーブル調整処理は、詳しくは図24とともに後述するが、エージング処理の副作用を中和する処理である。
ステップS812aの結果、隣接ノード管理テーブル103で管理されているすべての隣接ノード装置に対応するエントリが重み付けテーブル104−iに存在することが保証される。そして、処理はステップS817に移行する。
ステップS813でデータフレーム処理部110は、受信したデータフレームのGDの値に対応する新規重み付けテーブルを追加する。なお、ステップS813で追加されるテーブルも、「重み付けテーブル104−i」である。
そして、ステップS814でデータフレーム処理部110は、新規重み付けテーブル104−iにおいて、受信したデータフレームのGDの値を、重み付けテーブル104−iのGDとして設定する。
さらに、ステップS815でデータフレーム処理部110は、隣接ノード管理テーブル103のエントリ数と同数の新規エントリを、新規重み付けテーブル104−iに作成する。
そして、ステップS816でデータフレーム処理部110は、ステップS815で作成した各エントリに、それぞれ、隣接ノード管理テーブル103の各エントリのノードIDと、初期重み付け値と、現在時刻を設定する。
なお、以上のステップS811〜S816の具体例を挙げれば、以下のとおりである。
例えば、図6のステップS102でノード装置N2から図7のデータフレーム303を受信したとき、ノード装置N3の重み付けテーブル104−N3には、図11の重み付けテーブル104−1−N3が存在しなかったとする。すると、ノード装置N3が受信したデータフレーム303のGDの値であるN7を検索キーにしてノード装置N3のデータフレーム処理部110−N3がステップS811で重み付けテーブル104−N3を検索しても、テーブルはヒットしない。
そこで、データフレーム処理部110−N3は、ステップS813で新たに重み付けテーブル104−1−N3を作成し、ステップS814で重み付けテーブル104−1−N3のGDにN7を設定する。そして、データフレーム処理部110−N3は、ステップS815で、図9の隣接ノード管理テーブル103−N3と同数の(すなわち3つの)新規エントリを重み付けテーブル104−1−N3に作成する。
ここで、隣接ノード管理テーブル103−N3の各エントリのノードIDは、図10のとおり、N2とN4とN5である。よって、ステップS816でデータフレーム処理部110−N3は、ステップS815で作成した3つのエントリそれぞれに、LDとしてN2とN4とN5を設定する。また、データフレーム処理部110−N3は、これら3つのエントリの重みフィールドに、いずれも0.5という初期重み付け値を設定し、これら3つのエントリの最終更新時刻フィールドに、いずれも現在時刻を設定する。
以上のステップS813〜S816の結果として、図11の1段目のような重み付けテーブル104−1−N3が重み付けテーブル104−N3の中に追加される。
ここで、具体例の説明から図21の処理一般の説明に戻る。ステップS817が実行されるのは、ステップS809の実行後、ステップS816の実行後、またはステップS811の検索においてテーブルがヒットしたとステップS812で判断された後である。よって、ステップS817の実行時には、受信したデータフレームのGDの値に対応する重み付けテーブル104−iの存在が保証されている。
そこで、ステップS817においてデータフレーム処理部110は、受信したデータフ
レームのGDの値に対応する重み付けテーブル104−iにおいて、OLSとは異なるLDのうちで最小の重みと対応付けられているLDの値を取得する。
つまり、データフレーム処理部110は、重み付けテーブル104−iにおいて、ステップS808またはS810で記憶したOLSの値とは異なる値をLDとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部110は、選択したエントリのLDと重みの値を、例えば図4のDRAM204などの記憶領域に記憶する。
続いて、ステップS818でデータフレーム処理部110は、下記の2つの条件(F1)と(F2)のいずれかが成立するか否かを判断する。
(F1)ステップS817(または後述のS829)で取得したLDの値に対応する重みが、重みの最大値(第1実施形態では1.0)である。
(F2)ステップS808またはS810で記憶したOLSの値とは異なるLDへのデータフレームの転送がすべて失敗した(ただし、重み付けテーブル104−iにおけるLDが、もともとOLSしか存在しなかった場合も含む)。
条件(F1)または(F2)が成立する場合、もはやLDとして選択可能な隣接ノード装置は残っていないので、処理は図23のステップS830に移行する。
他方、条件(F1)と(F2)のいずれも成立しない場合、まだLDとして選択可能な隣接ノード装置が残っている。換言すれば、(G1)〜(G4)のいずれにも該当しない隣接ノード装置が、少なくとも1つは存在する。そして、LDとして選択可能な隣接ノード装置のノードIDが、ステップS817(または後述のS829)で取得されている。
(G1)当該隣接ノード装置から先の経路が袋小路またはループになっている、と判断されたため、当該隣接ノード装置は最大値の重みと対応付けられている。
(G2)過去に当該隣接ノード装置への同一GD宛てのデータフレームの送信に失敗した結果が累積したため、当該隣接ノード装置は最大値の重みと対応付けられている。
(G3)今回のデータフレーム受信処理において当該隣接ノード装置へのデータフレームの送信を試した結果として、「送信失敗」と判明した。すなわち、データフレームを送信した隣接ノード装置から、所定時間が経っても、ACKフレームを受信することができなかった。
(G4)当該隣接ノード装置はOLSである。
そこで、ステップS818で条件(F1)と(F2)のいずれも成立しないと判断されると、処理はステップS819に移行する。ステップS819以降の処理は、取得済みのLDの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理である。
ステップS819でデータフレーム処理部110は、以下のようにして新たなデータフレームを作成して送信部102に出力し、作成されたデータフレームを送信部102が送信する。
具体的には、データフレーム処理部110は、ステップS817(または後述のS829)で取得したLDの値を新たなデータフレームのLDに指定し、自ノードIDを新たなデータフレームのLSに指定する。また、データフレーム処理部110は、受信したデータフレームからGD、GS、FID、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップS801で見つかったバッファ部109内のエントリに格納されているデータフレームである。
ステップS819での送信後、処理はステップS820に移行し、データフレーム処理部110がバッファ部109のタイムアウト時刻を更新する。すなわち、データフレーム処理部110は、バッファ部109において、受信したデータフレームを格納しているエントリのタイムアウト時刻に、式(5)の時刻Ttimeoutを設定する。
Ttimeout=Tnow+Twait (5)
なお、式(5)において時刻Tnowは現在時刻であり、時間TwaitはACKフレーム待ち時間である。
そして、ステップS821でデータフレーム処理部110は、ステップS806のFID管理テーブル105の検索においてエントリがヒットしているか、または、後述するステップS823、および、ステップS824で、FID管理テーブル105に新規エントリを追加して値を設定しているか否かを確認する。つまり、受信したデータフレームのGSとFIDの値に等しい値を、GSおよびFIDとして有するエントリが、FID管理テーブル105に存在するか否かを、データフレーム処理部110は確認する。
ステップS806の検索でエントリがヒットしているか、ステップS823およびステップS824でFID管理テーブル105に新規エントリを追加して値を設定していれば、今回のデータフレーム受信処理は、過去にノード装置100自身が送信したのと同じデータフレームの受信を契機とする処理である。よって、データフレーム処理部110は続いてステップS822を実行する。他方、ステップS806の検索でエントリがヒットしておらず、かつ、ステップS823およびステップS824でFID管理テーブル105に新規エントリを追加して値を設定していなければ、ノード装置100は、初めて受信するデータフレームの初めての転送を試みているところである。よって、処理はステップS823に移行する。
ステップS822でデータフレーム処理部110は、ステップS806の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部110は、ステップS806の検索でヒットしたエントリにおいて、LDフィールドには、ステップS819で送信したデータフレームのLDの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップS825に移行する。
また、ステップS823でデータフレーム処理部110は、FID管理テーブル105に新規エントリを追加する。
そして、次のステップS824でデータフレーム処理部110は、新規エントリに値を設定する。具体的には、データフレーム処理部110は、新規エントリにおいて、FIDとGSとLDの各フィールドには、それぞれステップS819で送信したデータフレームの値をコピーする。また、データフレーム処理部110は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、OLSフィールドには、ステップS810で記憶したOLSの値をコピーする。そして、処理はステップS825に移行する。
ステップS825でデータフレーム処理部110は、ステップS819における送信の成否の通知を待つ。
例えば、データフレーム処理部110が、所定のプログラムのスレッドを実行する図4のMPU201により実現される場合、ステップS825ではスレッドがスリープしてもよい。その場合、「送信成功」または「送信失敗」の通知は、スレッドを起こす処理である。
ステップS819における送信が成功した場合は、ステップS819で送信したデータフレームにおいてLDとして指定されている隣接ノード装置からACKフレームが返信される。そして、ACK処理部107が後述の図25の処理を行い、データフレーム処理部110に「送信成功」を通知する。
また、ステップS819における送信の失敗とは、ステップS819で送信したデータフレームにおいてLDとして指定されている隣接ノード装置からのACKフレームが、式(5)の時刻Ttimeoutになってもノード装置100で受信されないことである。ACKフレームの受信は、ACK処理部107による後述の図26の処理により監視されており、ACKフレームがタイムアウト時刻Ttimeoutになっても受信されないと、ACK処理部107がデータフレーム処理部110に「送信失敗」を通知する。
データフレーム処理部110が、ステップS825での待機の後、ACK処理部107から「送信成功」または「送信失敗」の通知を受けると、処理はステップS826に移行する。
ステップS826でデータフレーム処理部110は、ACK処理部107から受けた通知に基づいて、ステップS819の送信が成功したか否かを判断する。送信が成功した場合、処理はステップS827に移行し、送信が失敗した場合、処理はステップS828に移行する。
送信が成功した場合、ステップS827でデータフレーム処理部110は、重み付けテーブル104において、ステップS819で送信したデータフレームのGDとLDの組に対応する重みを小さくする。ここで、データフレームのGDは転送によって書き換えられないことに注意して換言すれば、ステップS827でデータフレーム処理部110は、受信したデータフレームのGDに対応する重み付けテーブル104−iにおいて、重みの更新を行う。
つまり、データフレーム処理部110は、ステップS817(または後述のステップS829)で取得したLDの値をLDとして有するエントリを重み付けテーブル104−iで探し、見つかったエントリの重みの値を小さくする。重みの値を小さくすることは、対応するLDの優先度を上げることである。
ここで、見つかったエントリの現在の重みの値をWcurrentとすると、ステップS827でデータフレーム処理部110は、見つかったエントリの重みの値を例えば式(6)のWrevisedに更新してもよい。
Wrevised=max(Wmin,Wcurrent−ΔWsuccess)
(6)
なお、式(6)において、Wminは重みの最小値であり、第1実施形態ではWmin=0である。また、ΔWsuccessは、送信が成功したときに重みを減らす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔWsuccess=0.1でもよい。
さらに、データフレーム処理部110はステップS827で、ステップS817(または後述のステップS829)で取得したLDの値をLDとして有する重み付けテーブル104−iのエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
他方、送信が失敗した場合、ステップS828でデータフレーム処理部110は、重み付けテーブル104において、ステップS819で送信したデータフレームのGDとLDの組に対応する重みを大きくする。つまり、ステップS828でデータフレーム処理部110は、ステップS817(または後述のステップS829)で取得したLDの値をLDとして有するエントリを重み付けテーブル104−iで探し、見つかったエントリの重みの値を大きくする。重みの値を大きくすることは、対応するLDの優先度を下げることである。
例えば、ステップS828でデータフレーム処理部110は、見つかったエントリの重みの値を式(7)のWrevisedに更新してもよい。
Wrevised=min(Wmax,Wcurrent+ΔWfailure)
(7)
なお、式(7)において、Wmaxは重みの最大値であり、第1実施形態ではWmax=1である。また、ΔWfailureは、送信が失敗したときに重みを増やす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔWfailure=0.1でもよい。もちろん、ΔWfailure≠ΔWsuccessでもよい。
なお、データフレーム処理部110はステップS828で、ステップS817(または後述のステップS829)で取得したLDの値を、例えば図4のDRAM204などのワークエリアに「転送に失敗したLD」として記憶する。例えば、データフレーム処理部110は、DRAM204上の線形リストをステップS817で空に初期化し、ステップS828の実行のたびに、ステップS817(または後述のステップS829)で取得したLDの値を保持する要素を線形リストに追加してもよい。もちろん、「転送に失敗したLD」の記憶のために配列など他のデータ構造が使われてもよい。
さらに、データフレーム処理部110はステップS828で、ステップS817(または後述のステップS829)で取得したLDの値をLDとして有する重み付けテーブル104−iのエントリにおいて、最終更新時刻に現在時刻を設定する。そして処理はステップS829に移行する。
ステップS829でデータフレーム処理部110は、今までにLDとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部110は、受信したデータフレームのGDの値に対応する重み付けテーブル104−iにおいて、転送に失敗したLD以外で、かつOLSとは異なるLDのうちで、最小の重みと対応付けられているLDの値を取得する。なお、転送に失敗したLDは、ステップS828において例えば図4のDRAM204などのワークエリアに、例えば線形リストなどの形で、記憶されている。
つまり、データフレーム処理部110は、重み付けテーブル104−iにおいて、(H1)かつ(H2)である値をLDとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部110は、選択したエントリのLDと重みの値を、例えば図4のDRAM204などの記憶領域に記憶する。
(H1)過去にステップS817またはS829で取得したLDの値とは異なる値
(H2)ステップS808またはS810で記憶したOLSの値とは異なる値
したがって、例えば、ステップS828で0.2に更新された重みと対応付けられた隣接ノード装置は、ステップS829でLDとして選択されず、ステップS829では0.2より大きな、0.8などの重みの隣接ノード装置が選択されることもありうる。
以上のステップS817〜S829の具体例を挙げれば、以下のとおりである。例えば、図6のノード装置N4には、ノード装置N3、N5、およびN7が隣接している。そして、図12のとおり、ノード装置N4のFID管理テーブル105−N4のエントリE4のOLSの値は、N3である。
図6の例では、ノード装置N4のデータフレーム処理部110−N4が、最初にステップS817でLDの値N7を取得するので、ステップS104のようにノード装置N7へのデータフレームの送信が行われる。しかし、図6に示すとおりステップS104の送信は失敗するので、データフレーム処理部110−N4はステップS826で「送信失敗」と判断する。
すると、データフレーム処理部110−N4がステップS829を実行する時点で、転送に失敗したLD(すなわちN7)以外で、かつOLS(すなわちN3)とは異なるLDの値は、N5のみである。よって、ステップS829ではLDの値N5が取得される。
こうしてステップS829でLDの値が取得されると、処理はステップS829からステップS818へ戻る。
よって、上記のノード装置N4の例では、ステップS829の後、再度ステップS818〜S826が実行される。そして、図6にステップS105として示すように、今度はステップS826で「送信成功」と判断され、ステップS827が実行されて、データフレーム受信処理が終了する。
なお、ステップS828で、例えば式(7)のように重みを更新することの影響について具体例を挙げて説明すれば、以下のとおりである。
例えば、図2のネットワーク2において、ノード装置N106が隣接ノード装置N108から、ノード装置N118をGDとして指定する第1のデータフレームを時刻Trcv1に受信したとする。そして、時刻Trcv1にノード装置N106には、ノード装置N118に対応する重み付けテーブル104−g106−N106が存在したとする。また、時刻Trcv1の重み付けテーブル104−g106−N106においては、ノード装置N102には重み0.4が、ノード装置N103には重み0.7が、ノード装置N107には重み0.1が、ノード装置N108には重み0.5が、それぞれ対応付けられていたとする。
すると、ステップS817では、最小の重み0.1と対応付けられているノード装置N107がLDとして選択される。ところが、ステップS819でデータフレームが送信されるとき、偶然、ノード装置N106とN107の間に遮蔽物が置かれるなどの理由で、一時的に、ノード装置N106とN107の無線リンクが通信不能になったとする。
すると、ACKフレームが返信されないので、ステップS828では、ノード装置N107の重みが0.1から0.2に更新される。そして、ステップS829では、重み0.4と対応付けられているノード装置N102がLDとして選択される。ここで、ステップS819におけるデータフレームの送信が成功し、ノード装置N102からACKフレームが返信されたとする。すると、ステップS827でノード装置N102の重みが0.4から0.3に更新され、データフレーム受信処理が終了する。
ここで、ノード装置N106からノード装置N102へ送信された第1のデータフレームは、ノード装置N106にバックトラックすることなく、ノード装置N118に到達したとする。つまり、重み付けテーブル104−g106−N106においては、第1のデータフレームの転送にともなって重みが1に更新されるエントリはなかったとする。
すると、ノード装置N106が、その後の時刻Trcv2に、同じくノード装置N118をGDとして指定する第2のデータフレームを今度はノード装置N103から受信したとき、重み付けテーブル104−g106−N106の内容は次のとおりである。すなわち、ノード装置N102には重み0.3が、ノード装置N103には重み0.7が、ノード装置N107には重み0.2が、ノード装置N108には重み0.5が、それぞれ対応付けられている。
よって、ステップS817では、第1のデータフレームの転送に失敗したとはいえ、なお最小の重みと対応付けられているノード装置N107が、LDとして選択される。そして、もし時刻Trcv2にノード装置N106とN107の間の無線リンクの通信品質が好転しており、ステップS819での第2のデータフレームの送信が成功すれば、ステップS827でノード装置N107の重みは再度0.1に戻る。
ここで、第2のデータフレームのノード装置N107への転送の結果、バックトラックが生じないものとすると、ノード装置N107の重みは0.1のままである。よって、さらにその後の時刻Trcv3に、同じくノード装置N118をGDとして指定する第3のデータフレームを、ノード装置N107以外の隣接ノード装置からノード装置N106が受信すれば、LDとして最も優先的に選択されるのは、やはりノード装置N107である。
このように、ステップS829で重みを急激に最大値に設定するのではなく少しだけ大きくすると、重み付けテーブル104が通信環境の変化に過剰に反応することはない。よって、同じノード装置をGDとして指定する複数のデータフレームを次々とノード装置N106が受信しているうちに、一時的に障害の生じていたリンクが障害から回復すれば、環境の好転に追従して、過去の学習結果が再びLDの選択に活かされるようになる。つまり、上記の例では、LDとして適切だと過去に学習済みのノード装置N107が、再びLDとして優先的に選択されるようになる。
あるいは、時刻Trcv2においてノード装置N106とN107の間の無線リンクが障害から復旧していない場合もありうる。その場合、第2のデータフレームの送信時のLDとして、一旦は重み0.2のノード装置N107が選択されるが、ACKフレームが受信されないために、ノード装置N107の重みは0.3に更新される。そして、最終的には重み0.3と対応付けられたノード装置N102がLDとして選択され、送信が成功して重みが0,2に更新されることもありうる。
すると、時刻Trcv3に、例えばノード装置N103から、ノード装置N106が第3のデータフレームを受信すると、重み0.2に対応付けられたノード装置N102がLDとして選択され、また送信が成功し、ノード装置N102の重みが0.1になるかもしれない。そして、その後しばらくは、ノード装置N118をGDとして指定するデータフレームのLDとして、ノード装置N106はノード装置N102を選択し続けるかもしれない。
しかし、さらにその後、ノード装置N106とN102の間の無線リンクに障害が生じたとすると、ノード装置N102からはACKフレームが返信されてこない。するとステップS829でLDの再選択が行われる。
その場合、時刻Trcv1以前にLDとして好適であると学習されていたノード装置N107が、重み0.5や0.7と対応付けられており相対的にLDとしてあまり適切ではないノード装置N108やN103よりも、優先的にLDとして選ばれる。その理由は、第1と第2のデータフレームの送信時の重みの学習は、ステップS828に示すように重みをなだらかに変化させるものであり、ノード装置N107の重みは、なおノード装置N108やN103の重みよりも小さいからである。
そして、この時点でノード装置N106とN107の間の無線リンクが障害から復旧していれば、再度、ノード装置N107の重み0.2に減らされる。このように、多少復旧に時間がかかっても、一時的な環境の変化が過剰に重み付けテーブル104に反映されないため、過去の学習の成果が緩やかに反映される。したがって、適切なLDが選択される蓋然性も高まる。
以上のとおり、一時的な障害の影響を過剰に受けないようにするため、ステップS828では、少しだけ重みが調整されるのである。
さてここで、ステップS818の分岐の説明に戻る。ステップS818で2つの条件(F1)と(F2)のいずれかが成立すると判断されると、もはやLDとして選択可能な隣接ノード装置は残っていないので、処理は図23のステップS830に移行する。
ステップS830でデータフレーム処理部110は、以下のようにして新たなデータフレームを作成して送信部102に出力し、作成されたデータフレームを送信部102が送信する。
具体的には、データフレーム処理部110は、ステップS808またはS810で記憶したOLSの値を新たなデータフレームのLDに指定し、自ノードIDを新たなデータフレームのLSに指定する。また、データフレーム処理部110は、受信したデータフレームからGD、GS、FID、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップS801で見つかったバッファ部109内のエントリに格納されているデータフレームである。ステップS830で行われる送信処理が、すなわち、バックトラック動作である。
なお、ステップS830の送信の具体例は、図6のステップS110である。
ステップS830での送信後、処理はステップS831に移行する。ステップS831でデータフレーム処理部110は、受信したデータフレームのFIDとGSの値を検索キーとして用いてFID管理テーブル105を検索する。
そして、ステップS832でデータフレーム処理部110は、ステップS831の検索の結果、エントリがヒットしたか否かを判断する。エントリがヒットしていれば処理はステップS833に移行し、エントリがヒットしていなければ処理はステップS834に移行する。
なお、ステップS807で「エントリがヒットした」と判断されている場合に、ステップS831の検索の結果見つかるエントリは、ステップS806の検索の結果見つかったエントリである。また、ステップS807で「エントリがヒットしなかった」と判定され、かつステップS823において新規エントリが作成された場合は、ステップS831の検索の結果、ステップS823で作成された新規エントリが見つかる。
ステップS832で「エントリがヒットしなかった」と判断されるのは、(I1)かつ(I2)の場合であり、換言すれば、(J1)かつ(J2)の場合である。
(I1)ステップS807で「エントリがヒットしなかった」と判断された。
(I2)1回目にステップS818が実行された直後に、ステップS830に処理が移行した。
(J1)ノード装置100が今までに受信したことのないデータフレームが受信された。
(J2)受信したデータフレームのGSの値に対応する重み付けテーブル104−iでは、すべてのLDに最大値の重みが対応付けられている。
ステップS833でデータフレーム処理部110は、ステップS831の検索の結果ヒットしたエントリを更新する。具体的には、データフレーム処理部110は、ヒットしたエントリにおいて、LDには、ヒットしたエントリ自身のOLSの値をコピーし、最終更新時刻には、現在時刻を設定する。そして処理はステップS836に移行する。
他方、ステップS834では、データフレーム処理部110はFID管理テーブル105に新規エントリを追加する。
そして、次のステップS835でデータフレーム処理部110は、ステップS834で追加した新規エントリに値を設定する。具体的には、データフレーム処理部110は、新規エントリにおいて、FIDとGSには、受信したデータフレームの値をそれぞれコピーし、最終更新時刻には、現在時刻を設定し、OLSとLDには、受信したデータフレームのLSの値をコピーする。そして処理はステップS836に移行する。
ステップS836でデータフレーム処理部110は、ステップS830で送信したデータフレームに関する送信成否の通知を待つ。そして、「送信成功」または「送信失敗」の通知をデータフレーム処理部110がACK処理部107から受けると、処理はステップS837に移行する。ステップS836はステップS825と類似しているので、詳しい説明は省略する。
そして、ステップS837でデータフレーム処理部110は、ステップS830におけるデータフレームの送信が成功したか否かを判断する。送信が失敗した場合、処理はステップS838に移行し、送信が成功した場合、処理はステップS839に移行する。
ステップS838が実行されるのは、(K1)かつ(K2)という、例外的な場合である。
(K1)OLS以外のすべての隣接ノード装置が、(K1−1)または(K1−2)である。
(K1−1)最大値の重みと対応付けられている。
(K1−2)LDとして指定してデータフレームを送信すると、送信に失敗する。
(K2)OLSへのデータフレームの送信(つまりバックトラック動作)は失敗した。
この場合、データフレーム処理部110はステップS838で、受信したデータフレームを破棄する。すなわち、データフレーム処理部110は、ステップS801で見つけたエントリをバッファ部109から削除する。そして、データフレーム受信処理は終了する。
なお、ステップS838の影響について、具体例とともに説明すれば以下のとおりである。
例えば、図6のステップS110は、ノード装置N3がステップS830で行う送信である。図6の例では、ステップS110でのノード装置N3からノード装置N2へのデータフレームの送信に対して、ノード装置N2がACKフレームをノード装置N3に返信する。
ここで、逆に、ステップS110の時点でノード装置N2とN3の間のリンクに障害が発生し、ステップS110(すなわちステップS830)でノード装置N3が送信したデータフレームが、ノード装置N2には届かなかったと仮定する。すると、当然ノード装置N3がノード装置N2からACKフレームを受信することもないので、ノード装置N3は、ステップS837で「送信失敗」と判断し、ステップS838を実行する。つまり、ステップS101でノード装置N1が送信したデータフレームは、GDであるノード装置N7に到達する前に、ネットワーク1内で消滅してしまう。
しかも、ノード装置N2にとっては、「ステップS102で送信が成功した後、どの隣接ノード装置からも同じデータフレームは受信されていない」という状態である。したがって、ノード装置N2には、「GDとしてノード装置N7が指定されているとき、ノード装置N2がLDとしてノード装置N3を選択することは不適切である」とは認識されない。つまり、図6の例のように、ノード装置N2が「GDとしてノード装置N7が指定されているとき、ノード装置N2はLDとしてノード装置N6を選択するのが適切である」と学習することはできない。
その結果、GDとしてノード装置N7が指定されている新たな別のデータフレームをノード装置N2が受信した場合(またはそのようなデータフレームをノード装置N2がGSとなって送信する場合)、ノード装置N2は、LDとしてノード装置N3を選択する。
仮に、その時点でもまだノード装置N2とN3の間のリンクが障害から復旧していなければ(例えば、悪い電波状況が続いていれば)、ノード装置N2から送信されたデータフレームがノード装置N3には届かない。したがって、ノード装置N2はACKフレームを受信することができず、図22のステップS826で「送信失敗」と判断する。
その結果、ノード装置N2はステップS828で、GDであるノード装置N7に対応する重み付けテーブル104−h2−N2(この参照符号は図6の説明と同様)においてノード装置N2に対応する重みを大きくする。そして、ノード装置N2は、続くステップS829で、LDとしてノード装置N6を再選択する。
このように、データフレームがネットワーク1内のノード装置N3においてステップS838で破棄されると、破棄されたデータフレームに関するOLSである他のノード装置N2における重み付けテーブル104−h2−N2の学習が、遅れることがある。
しかしながら、上記の例示から明らかなとおり、ノード装置N2における学習は単に少し遅れるだけである。ノード装置N2は、先のデータフレームと同じくノード装置N7をGDとする次のデータフレームを受信した後、その受信を契機とする一連の処理により、適切な重みを学習することができる。つまり、複数のデータフレームが次々に流通するネットワーク1全体の動作として見れば、OLSへのバックトラックのためのデータフレームの送信失敗により局所的に重みの学習が遅れるノード装置があっても、学習の遅れはすぐに挽回することができる。
ここで、図23のフローチャートの説明に戻る。ステップS839は、OLSへのデータフレームの送信に成功した場合に実行される。
ステップS839でデータフレーム処理部110は、重み付けテーブル104において、ステップS830で送信したデータフレームのGDとLDの組に対応する重みを小さくする。換言すれば、データフレーム処理部110は、受信したデータフレームのGDに対応する重み付けテーブル104−iにおいて、送信したデータフレームのLD(つまりステップS808またはS810で記憶したOLS)に対応する重みを更新する。
ステップS839の詳細はステップS827と同様なので詳しい説明は省略するが、データフレーム処理部110は、例えば式(6)を使って重みを更新してもよい。データフレーム処理部110はさらに、重み付けテーブル104−iの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
続いて、図24を参照して、図21のステップS812aの重み付けテーブル調整処理の詳細を説明する。なお、図24の重み付けテーブル調整処理は、後述の図27のステップS1108aでも呼び出される。図24の説明において「ヒットした重み付けテーブル104−i」とは、図21のステップS811の検索または図27のステップS1107の検索でヒットしたテーブルを意味する。
ステップS851でデータフレーム処理部110は、隣接ノード管理テーブル103(図9参照)の1つ目のエントリに注目する。なお、以下の図24の説明において、データフレーム処理部110が注目している隣接ノード管理テーブル103のエントリを「注目エントリ」という。
次に、ステップS852では、ヒットした重み付けテーブル104−iに注目エントリのノードIDの値をLDとして含むエントリがあるか否かを、データフレーム処理部110が判断する。ヒットした重み付けテーブル104−iに、注目エントリのノードIDの値をLDとして含むエントリがあれば、処理はステップS855に移行する。逆に、ヒットした重み付けテーブル104−iに、注目エントリのノードIDの値をLDとして含むエントリがなければ、処理はステップS853に移行する。
ステップS853でデータフレーム処理部110は、ヒットした重み付けテーブル104−iに新規エントリを追加する。
続いてステップS854でデータフレーム処理部110は、ステップS853で重み付けテーブル104−iに追加した新規エントリに値を設定する。つまり、データフレーム処理部110は、新規エントリにおいて、隣接ノード管理テーブル103の注目エントリのノードIDの値をLDフィールドに、初期重み付け値を重みフィールドに、現在時刻を最終更新時刻フィールドに、それぞれ設定する。
なお、ステップS854における初期重み付け値は、図15のステップS308における初期重み付け値とは異なる。具体的には、ステップS854での初期重み付け値は、ヒットした重み付けテーブル104−iの重みフィールドにおいて、1未満の重みのうちの最大値である。
例えば、ヒットした重み付けテーブル104−iの重みフィールドに4つのエントリが存在し、それぞれの重みフィールドの値が0.4、0.7、1、および0.5であれば、ステップS854での初期重み付け値は、0.7である。なお、ヒットした重み付けテーブル104−iの重みフィールドの値が、全エントリで1の場合は、ステップS854での初期重み付け値は、1未満の任意の値であり、例えば図15のステップS308での初期重み付け値と同様に0.5でもよい。
以上のような初期重み付け値をステップS854で用いることにより、重み付けテーブル104−iの既存のエントリに反映されている学習結果が優先的に考慮される。その結果、経路が必要以上に変動することがなくなり、換言すれば、経路が安定する。
例えば、4つのエントリの重みフィールドの値がそれぞれ0.4、0.7、1、および0.5である上記の例において、ステップS854で初期重み付け値として図15のステップS308と同様に0.5が使われるとする。すると、重みが何も学習されていない隣接ノード装置(すなわちステップS853で追加された新規エントリにLDとしてノードIDが記録されている隣接ノード装置)が、重みが0.7の隣接ノード装置よりも優先的にLDとして選択されてしまう。つまり、今までの学習の蓄積としての重み0.7が無視されてしまう。
そこで、第1実施形態では、重みが何も学習されていない隣接ノード装置が、重みが学習済みの隣接ノード装置よりも優先的にLDとして選択されることを防ぎ、今までの学習結果を優先的に考慮するために、上記のように定義される初期重み付け値が利用される。
ステップS855でデータフレーム処理部110は、隣接ノード管理テーブル103にまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部110が隣接ノード管理テーブル103のすべてのエントリに注目し終えていれば、図24の処理は終了する。他方、まだデータフレーム処理部110が注目していないエントリが隣接ノード管理テーブル103に残っていれば、処理はステップS856に移行する。
そして、ステップS856でデータフレーム処理部110は、隣接ノード管理テーブル103のまだ注目していないエントリのうち、次のエントリに注目する。そして処理はステップS852に戻る。
なお、図24の処理の意義は以下のとおりである。
重み付けテーブル104−iにおけるエントリごとのエージング処理の副作用として、図24の処理の直前には、次のような状況の可能性もある。すなわち、隣接ノード管理テーブル103に登録されているある隣接ノード装置のノードIDを、LDとして有するエントリが、重み付けテーブル104−iに存在しない可能性がある。
ここで、ノード装置100の隣接ノード装置は、データフレームを送信する際にデータフレーム処理部110が選択するLDの潜在的な候補である。よって、ヒットした重み付けテーブル104−iのLDフィールドにおいて全隣接ノード装置が網羅されるようにすることが、ノード装置100の適切な動作のためには望ましい。
以上の図24の重み付けテーブル調整処理によれば、エージング処理の副作用として生じる可能性のある上記のような状況が解消される。つまり、隣接ノード管理テーブル103に登録されているすべてのノードIDが、ヒットした重み付けテーブル104−iにLDとして登録されていることが、保証される。
以上、図20〜24を参照して、図14のステップS205におけるデータフレーム受信処理について詳しく説明した。続いて、データフレーム受信処理のステップS826およびS837における送信成否の通知に関連する処理について、図25と図26を参照して説明する。
図25は、図14のステップS206におけるACKフレーム受信処理のフローチャートである。図25の処理は、フレーム分岐処理部106からACKフレームがACK処理部107に出力されると開始される。
ステップS901でACK処理部107は、フレーム分岐処理部106から受け取ったACKフレームのLDの値が自ノードIDと等しいか否かを判断する。ACKフレームのLDの値が自ノードIDと等しければ、処理はステップS902に移行し、ACKフレームのLDの値が自ノードIDと異なれば、図25の処理は終了する。ACK処理部107も、例えばフラッシュメモリ205などに予め格納された自ノードIDを参照することができる。
例えば、図6のステップS105でノード装置N4が送信したデータフレームに対するACKフレームを、図31にステップS105aとして示すようにノード装置N5が送信すると、無関係なノード装置N3もACKフレームを受信する。なぜなら、ノード装置N3はノード装置N5に隣接しているからである。
しかし、ノード装置N3のACK処理部107−N3は、ステップS901の判断の結果、直ちに図25の処理を終了するので、ノード装置N3は、ノード装置N3と無関係なACKフレームによる副作用を受けることはない。
ステップS902でACK処理部107は、ACKフレームのGSとFIDの値から、ACKフレームに対応する送信済みのデータフレームを特定する。
例えば、図6のステップS102でノード装置N2がノード装置N3へ送信する図7のデータフレーム303に対して、ノード装置N3は図7のACKフレーム322をノード装置N2に返信する。ここで、ACKフレーム322の受信を契機にノード装置N2のACK処理部107−N2が図25の処理を行う場合について詳しく説明すると、以下のとおりである。
ACK処理部107−N2は、ステップS902において、ACKフレーム322のGSとFIDの値(すなわちN1とFa)を取り出す。また、バッファ部109−N2は、図8と同様の形式であるから、バッファ部109−N2には、ノード装置N2から送信済みのデータフレーム303が格納されている。よって、ACK処理部107−N2は、取り出したGSとFIDの値(すなわちN1とFa)をキーにしてバッファ部109−N2のエントリを検索し、データフレーム303を含むエントリを特定する。
続いて、ステップS903でACK処理部107は、ステップS902で特定した送信済みのデータフレームをバッファ部109から削除する。つまり、ステップS902の検索で見つかったエントリを、ACK処理部107はバッファ部109から削除する。
また、ステップS904でACK処理部107は、ステップS902で特定した送信済みのデータフレームに関して、データフレーム処理部110に「送信成功」を通知する。そして、図25の処理は終了する。
例えば、データフレーム処理部110は、図4のMPU201がプログラムを実行することにより実現されていてもよい。その場合、MPU201をデータフレーム処理部110として機能させるスレッドは、データフレームの送信後、ACKフレームを受信するまでスリープしていてもよい。ステップS904における「送信成功」の通知は、スリープしているスレッドを起こす処理である。
なお、ステップS904の通知は、ステップS902で特定したデータフレームのGSとFIDの値の通知をともなう。例えば上記の例においては、ACK処理部107−N2は、データフレーム303を識別するためのGSとFIDの値(すなわちN1とFa)も、データフレーム処理部110に通知する。
図26は、ACKフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。図26の処理は、例えば、図4のタイマIC203が所定の間隔で発生させる割り込み信号を契機として、定期的に行われる。
ステップS1001でACK処理部107は、バッファ部109(図8を参照)の1つ目のエントリに注目する。以下、図26に関する説明においては、ACK処理部107が注目しているバッファ部109のエントリを「注目エントリ」という。
続いてステップS1002でACK処理部107は、現在時刻と注目エントリのタイムアウト時刻フィールドの値を比較する。そして、現在時刻がタイムアウト時刻以降であれば、処理はステップS1003に移行する。他方、現在時刻がまだタイムアウト時刻に達していなければ、処理はステップS1005に移行する。
ステップS1003でACK処理部107は、バッファ部109の注目エントリに格納されているデータフレームに関して、「送信失敗」をデータフレーム処理部110に通知する。ステップS1003の通知は、図25のステップS904の通知と同様に、具体的には、例えばスリープしているスレッドを起こす処理であってもよい。
また、ステップS904の通知と同様に、ステップS1003の通知も、データフレームのGSとFIDの値の通知をともなう。具体的には、ACK処理部107は、注目エントリに格納されているデータフレームのGSとFIDの値を読み取り、読み取ったGSとFIDの値によりデータフレームを特定して、特定したデータフレームの「送信失敗」をデータフレーム処理部110に通知する。
なお、送信失敗の場合、データフレーム処理部110が今までLDとして試していない隣接ノード装置を新たなLDとして選択してデータフレームの再送を試みることがある。よって、ステップS1003の時点では、注目エントリはバッファ部109から削除されない。
続いてステップS1004でACK処理部107は、注目エントリのタイムアウト時刻に、式(5)の時刻Ttimeoutを設定する。そして、処理はステップS1005に移行する。
ステップS1005では、まだ注目していないエントリがバッファ部109に残っているか否かをACK処理部107が判断する。ACK処理部107が、バッファ部109のすべてのエントリに注目し終わっていれば、図26の処理は終了する。他方、まだACK処理部107が注目していないエントリがバッファ部109に残っていれば、処理はステップS1006に移行する。
ステップS1006でACK処理部107は、バッファ部109の中でまだ注目していない次のエントリに注目する。そして処理はステップS1002に戻る。
ところで、図20〜図23を参照して説明したデータフレーム受信処理は、上記のとおり、ノード装置100がGSとならないタイプのノード装置である場合の例である。以下では、図27〜図29を参照して、GSとなりうるタイプのノード装置に特有の処理について説明する。
図27と図28は、ノード装置100がGSとなってデータフレームを送信する場合の送信処理のフローチャートである。図27の処理は、上位層処理部111からデータフレーム処理部110への要求を契機として開始される。
ステップS1101でデータフレーム処理部110は、上位層処理部111から、上位層処理部111における上位層のプロトコルの処理の結果として、データフレームのGDの値とペイロードを取得する。
例えば、「上位層のプロトコル」がイーサネットプロトコルであってもよい。その場合、上位層処理部111は、第1実施形態で定義されるデータフレームのペイロードとして、イーサネットフレームをデータフレーム処理部110に出力する。また、上位層処理部111は、第1実施形態におけるデータフレームのGDに設定する値を、データフレーム処理部110に通知する。
そして、データフレーム処理部110は、上位層処理部111から取得したペイロードを含む新たなデータフレームを作成し、作成したデータフレームのGDに、上位層処理部111から取得した値を設定する。例えば、図6の例では、ノード装置N1のデータフレーム処理部110−N1は、上位層処理部111−N1からGDの値としてN7を取得し、データフレームのGDにN7と設定する。
続いて、ステップS1102でデータフレーム処理部110は、ステップS1101で取得したペイロードの長さを求め、作成したデータフレームの長さフィールドに設定する。例えば、図6の例では、図7のデータフレーム302と303に例示するように、ペイロードの長さはPaであるから、ノード装置N1のデータフレーム処理部110−N1は、作成したデータフレームの長さフィールドにPaと設定する。
そして、ステップS1103でデータフレーム処理部110は、作成したデータフレームのGSとLSに自ノードIDを設定する。例えば、図6の例では、ノード装置N1のデータフレーム処理部110−N1は、作成したデータフレームのGSとLSにそれぞれN1と設定する。
そして、ステップS1104でデータフレーム処理部110は、FID生成部113に新たなFIDの生成を要求する。するとFID生成部113が新たなFIDを生成してデータフレーム処理部110に出力するので、データフレーム処理部110は、生成されたFIDを作成したデータフレームのFIDフィールドに設定する。
さらに、ステップS1105でデータフレーム処理部110は、「データフレーム」を示す所定の値D(図7を参照)を、作成したデータフレームのタイプフィールドに設定する。なお、以上のステップS1102〜S1105の実行順序は順不同である。
以上のようにして、送信するデータフレームを作成し終わると、ステップS1106でデータフレーム処理部110は、作成したデータフレームをバッファ部109に格納する。すなわち、データフレーム処理部110は、バッファ部109内に新たなエントリの領域を確保し、確保した領域に、作成したデータフレームを格納する。なお、図8に示すようにバッファ部109にはタイムアウト時刻フィールドがあるが、この時点ではタイムアウト時刻は設定されない。
続いてステップS1107でデータフレーム処理部110は、ステップS1101で上位層処理部111から指定されたGDの値を用いて重み付けテーブル104を検索する。
そしてステップS1108でデータフレーム処理部110は、指定されたGDの値に対応する重み付けテーブルが、ステップS1107の検索の結果としてヒットしたか否かを判断する。指定されたGDの値に対応する重み付けテーブルがヒットした場合、処理はステップS1108aに移行し、指定されたGDの値に対応する重み付けテーブルが存在しない場合、処理はステップS1009に移行する。
ステップS1108aでデータフレーム処理部110は、図24の重み付けテーブル調整処理を行い、エージング処理の副作用を中和する。そして、処理はステップS1110に移行する。
ステップS1109でデータフレーム処理部110は、ステップS1101で指定されたGDの値に対応する新規重み付けテーブルを重み付けテーブル104の中に追加する。具体的には、図21のステップS813〜S816と類似の処理をデータフレーム処理部110はステップS1109で行う。
すなわち、データフレーム処理部110はステップS1109で、上位層処理部111から指定されたGDの値に対応する新規重み付けテーブルを追加し、新規重み付けテーブルにおいて、上位層処理部111から指定されたGDの値をGDとして設定する。さらに、データフレーム処理部110は、隣接ノード管理テーブル103と同数の新規エントリを新規重み付けテーブル内に作成する。そして、データフレーム処理部110は、作成した各エントリに、それぞれ、隣接ノード管理テーブル103の各エントリのノードIDと初期重み付け値と現在時刻を設定する。
なお、以下では説明の便宜上、ステップS1101で指定されたGDの値に対応する重み付けテーブルを、「104−i」という参照符号で参照する。すなわち、重み付けテーブル104−iは、ステップS1107の検索でヒットしたテーブルまたはステップS1109で追加されたテーブルである。
以上のようにして、重み付けテーブル104−iがヒットしたとステップS1108で判断された後、またはステップS1109で重み付けテーブル104−iが作成された後、処理はステップS1110に移行する。
そして、ステップS1110でデータフレーム処理部110は、上位層処理部111から指定されたGDの値に対応する重み付けテーブル104−iにおいて、最小の重みと対応付けられているLDの値を取得する。なお、図11に例示するように、重み付けテーブル104−iにおいて複数のエントリが同じ最小の重みを有する場合もありうる。その場合、データフレーム処理部110は、最小の重みと対応付けられている複数のLDの値のうち任意の1つをステップS1110で選択して取得する。データフレーム処理部110は、取得したLDの値および対応する重みの値を、例えば図4のDRAM204などの記憶領域に記憶する。
続いて、処理は図28のステップS1111に移行し、ステップS1111でデータフレーム処理部110は、下記の2つの条件(L1)と(L2)のいずれかが成立するか否かを判断する。
(L1)ステップS1110で取得したLDの値に対応する重みが、重みの最大値(第1実施形態では、具体的には1.0)である。
(L2)重み付けテーブル104−iに登録されているすべてのLDへの送信が、いずれも失敗した。
条件(L1)または(L2)が成立する場合、もはやLDとして選択可能な隣接ノード装置は残っていないので、処理はステップS1112に移行する。
他方、条件(L1)と(L2)のいずれも成立しない場合、まだLDとして選択可能な隣接ノード装置が残っている。換言すれば、データフレーム受信処理のステップS818に関して説明した(G1)〜(G3)のいずれにも該当しない隣接ノード装置が、少なくとも1つは存在する。そして、LDとして選択可能な隣接ノード装置のノードIDが、ステップS1110(または後述のステップS1125)で取得されている。そこで、ステップS1111で条件(L1)と(L2)のいずれも成立しないと判断されると、処理はステップS1114に移行する。
条件(L1)または(L2)が成立する場合、ステップS1112でデータフレーム処理部110は、データフレームを破棄する。つまり、データフレーム処理部110は、ステップS1106で新たに作成してデータフレームを格納したエントリを、バッファ部109から削除する。
そして、続くステップS1113でデータフレーム処理部110は、上位層処理部111に「送信失敗」を通知する。つまり、データフレーム処理部110は、どの隣接ノード装置にもデータフレームを成功裡に送信することはできなかったことを、上位層処理部111に通知する。そして図27〜図28の処理が終了する。
他方、ステップS1111において、条件(L1)と(L2)のいずれも成立しないと判断されると、取得済みのLDの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理が、ステップS1114〜S1125で行われる。
ステップS1114では、データフレーム処理部110が、ステップS1106でバッファ部109に格納したデータフレームのLDに、ステップS1110または後述のステップS1125で取得したLDの値を設定する。そして、データフレーム処理部110は、LDの値を設定したデータフレームの送信を、送信部102に依頼する。すると、送信部102がデータフレームを送信する。
続いてステップS1115でデータフレーム処理部110は、ステップS1106でデータフレームを格納したバッファ部109内のエントリのタイムアウト時刻に、式(5)の時刻Ttimeoutを設定する。
そして、ステップS1116でデータフレーム処理部110は、自ノードIDと、ステップS1104でFID生成部113が生成したFIDを使ってFID管理テーブル105を検索する。
次にステップS1117でデータフレーム処理部110は、ステップS1116のFID管理テーブル105の検索においてエントリがヒットしたか否かを判断する。なお、ステップS1117が1回目に実行される場合には「エントリがヒットしなかった」と判断され、ステップS1117が2回目以降に実行されるときは「エントリがヒットした」と判断される。
ステップS1116の検索でエントリがヒットしていれば、処理はステップS1118に移行する。他方、ステップS1116の検索でエントリがヒットしていなければ、処理はステップS1119に移行する。
ステップS1118でデータフレーム処理部110は、ステップS1116の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部110は、ステップS1116の検索でヒットしたエントリにおいて、LDフィールドには、ステップS1114で送信したデータフレームのLDの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップS1121に移行する。
また、ステップS1119でデータフレーム処理部110は、FID管理テーブル105に新規エントリを追加する。
そして、次のステップS1120でデータフレーム処理部110は、新規エントリに値を設定する。具体的には、データフレーム処理部110は、新規エントリにおいて、FIDとGSとLDの各フィールドには、それぞれステップS1114で送信したデータフレームの値をコピーする。また、データフレーム処理部110は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、OLSフィールドには、自ノードIDをコピーする。
例えば、図12に示した、ノード装置N1のFID管理テーブル105−N1のエントリE1は、ノード装置N1のデータフレーム処理部110−N1が以上の処理により作成したものである。
ステップS1121でデータフレーム処理部110は、ステップS1114における送信の成否の通知を待つ。ステップS1121の詳細は、図22のステップS825と同様である。データフレーム処理部110が、ステップS1121での待機の後、ACK処理部107から「送信成功」または「送信失敗」の通知を受けると、処理はステップS1122に移行する。
ステップS1122でデータフレーム処理部110は、ACK処理部107から受けた通知に基づいて、ステップS1114の送信が成功したか否かを判断する。送信が成功した場合、処理はステップS1123に移行し、送信が失敗した場合、処理はステップS1124に移行する。
送信が成功した場合、ステップS1123でデータフレーム処理部110は、重み付けテーブル104において、ステップS1114で送信したデータフレームのGDとLDの組に対応する重みを小さくする。
つまり、データフレーム処理部110は、上位層処理部111から指定されたGDの値に対応する重み付けテーブル104−iにおいて、送信したデータフレームのLDに対応する重みを、例えば式(6)を使って更新する。データフレーム処理部110はさらに、重み付けテーブル104−iの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、図27〜図28の処理は終了する。
逆に、送信が失敗した場合、ステップS1124でデータフレーム処理部110は、重み付けテーブル104において、ステップS1114で送信したデータフレームのGDとLDの組に対応する重みを大きくする。
つまり、データフレーム処理部110は、上位層処理部111から指定されたGDの値に対応する重み付けテーブル104−iにおいて、送信したデータフレームのLDに対応する重みを、例えば式(7)を使って更新する。
なお、データフレーム処理部110はステップS1124でさらに、送信したデータフレームのLDの値を、例えば図4のDRAM204などのワークエリアに「送信に失敗したLD」として記憶する。図22のステップS828と同様に、「送信に失敗したLD」の記憶のためには、線形リストや配列などのデータ構造が利用されてもよい。
また、データフレーム処理部110はステップS1124でさらに、重み付けテーブル104−iの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、処理はステップS1125に移行する。
ステップS1125でデータフレーム処理部110は、今までにLDとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部110は、上位層処理部111から指定されたGDの値に対応する重み付けテーブル104−iにおいて、送信に失敗したLD以外のLDのうちで、最小の重みと対応付けられているLDの値を取得する。ここで、送信に失敗したLDは、ステップS1124において例えば図4のDRAM204などのワークエリアに、例えば線形リストや配列の形で記憶されている。
つまり、データフレーム処理部110は、重み付けテーブル104−iにおいて、過去にステップS1110またはS1125で取得されていないLDの値のうちで、最小の重みと対応付けられているものを取得する。データフレーム処理部110は、取得したLDの値および対応する重みの値を、例えば図4のDRAM204などの記憶領域に記憶する。そして、処理はステップS1111に戻る。
さて、図29は、GSにもなりうるノード装置100が、データフレーム受信処理の一部として図23の処理の代わりに行う処理のフローチャートである。
ノード装置100がGSにもなりうるタイプの装置である場合、データフレーム受信処理におけるステップS801〜S829は、ノード装置100が中継専用の場合と同様であり、図20〜図22に示したとおりである。しかし、ノード装置100がGSにもなりうるタイプの装置の場合は、図22のステップS818においてデータフレーム処理部110が「条件(F1)と(F2)のいずれかが成立する」と判断すると、処理は図29のステップS830aに移行する。
ステップS830aでデータフレーム処理部110は、受信したデータフレームのGSの値が自ノードIDであるか否かを判断する。受信したデータフレームのGSの値が自ノードIDと異なれば、処理はステップS830bに移行し、受信したデータフレームのGSの値が自ノードIDであれば、処理はステップS830cに移行する。
ステップS830bでデータフレーム処理部110は、以下のようにして新たなデータフレームを作成して送信部102に出力し、作成されたデータフレームを送信部102が送信する。
具体的には、データフレーム処理部110は、ステップS808またはS810で記憶したOLSの値を新たなデータフレームのLDに指定し、自ノードIDを新たなデータフレームのLSに指定する。また、データフレーム処理部110は、受信したデータフレームからGD、GS、FID、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。データフレームの送信後、処理はステップS831aに移行する。
また、ステップS830cでは、データフレーム処理部110は、上位層処理部111に「送信失敗」を通知する。通知にあたって、データフレーム処理部110は、例えば受信したデータフレームからペイロードを取り出し、ペイロードまたはペイロードの一部を上位層処理部111に出力してもよい。すると、上位層処理部111はどのデータの送信に失敗したのかを、データフレーム処理部110から受け取ったペイロードの内容に基づいて認識することができる。送信失敗の通知の後、処理はステップS838aに移行する。
さて、ステップS831aでは、データフレーム処理部110が、受信したデータフレームのFIDとGSの値を検索キーとして用いてFID管理テーブル105を検索する。なお、以下のステップS831a〜S839aは、それぞれ図23のステップS831〜S839と類似のステップである。
次のステップS832aでデータフレーム処理部110は、ステップS831aの検索の結果、エントリがヒットしたか否かを判断する。エントリがヒットしていれば処理はステップS833aに移行し、エントリがヒットしていなければ処理はステップS834aに移行する。
なお、ステップS807で「エントリがヒットした」と判断されている場合に、ステップS831aの検索の結果見つかるエントリは、ステップS806の検索の結果見つかったエントリである。また、ステップS807で「エントリがヒットしなかった」と判定され、かつステップS823において新規エントリが作成された場合は、ステップS831aの検索の結果、ステップS823で作成された新規エントリが見つかる。
ステップS832aで「エントリがヒットしなかった」と判断されるのは、(M1)かつ(M2)の場合である。
(M1)ステップS807で「エントリがヒットしなかった」と判断された。
(M2)1回目にステップS818が実行された直後に、ステップS830aに処理が移行した。
ステップS833aでデータフレーム処理部110は、ステップS831aの検索の結果ヒットしたエントリを更新する。具体的には、データフレーム処理部110は、ヒットしたエントリにおいて、LDには、ヒットしたエントリ自身のOLSの値をコピーし、最終更新時刻には、現在時刻を設定する。そして処理はステップS836aに移行する。
他方、ステップS834aでは、データフレーム処理部110はFID管理テーブル105に新規エントリを追加する。
そして、次のステップS835aでデータフレーム処理部110は、ステップS834aで追加した新規エントリに値を設定する。具体的には、データフレーム処理部110は、新規エントリにおいて、FIDとGSには、受信したデータフレームの値をそれぞれコピーし、最終更新時刻には、現在時刻を設定し、OLSとLDには、受信したデータフレームのLSの値をコピーする。そして処理はステップS836aに移行する。
ステップS836aでデータフレーム処理部110は、ステップS830bで送信したデータフレームに関する送信成否の通知を待つ。そして、「送信成功」または「送信失敗」の通知をデータフレーム処理部110がACK処理部107から受けると、処理はステップS837aに移行する。
ステップS837aでデータフレーム処理部110は、ステップS830bにおけるデータフレームの送信が成功したか否かを判断する。送信が失敗した場合、処理はステップS838aに移行し、送信が成功した場合、処理はステップS839aに移行する。
ステップS838aが実行されるのは、(N1)または(N2)の場合である。
(N1)ノード装置100自身がGSとなって送信したデータフレームがバックトラックによりノード装置100に戻ってきて受信されたのであり、かつ、ノード装置100の隣接ノード装置はすべて(N1−1)または(N1−2)である。
(N1−1)最大値の重みと対応付けられている。
(N1−2)LDとして指定してデータフレームを送信すると、送信に失敗する。
(N2)受信したデータフレームのGSは、ノード装置100以外の他のノード装置であり、かつ、OLS以外のすべての隣接ノード装置が(N2−1)または(N2−2)であり、かつ、OLSへのデータフレームの送信は失敗した。
(N2−1)最大値の重みと対応付けられている。
(N2−2)LDとして指定してデータフレームを送信すると、送信に失敗する
。
この場合、データフレーム処理部110はステップS838aで、受信したデータフレームを破棄する。すなわち、データフレーム処理部110は、ステップS801で見つけたエントリをバッファ部109から削除する。そして、データフレーム受信処理は終了する。
他方、ステップS839aは、ノード装置100ではない別のノード装置がGSであるデータフレームに関して、ノード装置100からノード装置100のOLSへの送信が成功した場合に実行される。ステップS839aでデータフレーム処理部110は、重み付けテーブル104において、ステップS830bで送信したデータフレームのGDとLDの組に対応する重みを小さくする。換言すれば、データフレーム処理部110は、受信したデータフレームのGDに対応する重み付けテーブル104−iにおいて、送信したデータフレームのLD(つまりステップS808またはS810で記憶したOLS)に対応する重みを更新する。
例えば、ステップS829やS839と同様に、データフレーム処理部110は、式(6)を使って重みを更新してもよい。データフレーム処理部110はさらに、重み付けテーブル104−iの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
続いて、以上の詳細な説明を踏まえて、再度、図6の例について説明する。
図30は、経路を探索するための探索空間を表す探索木の形式で、図6における経路選択を説明する図である。人工知能の分野では、探索空間はしばしば探索木の形式で表現される。図30は、第1実施形態におけるデータフレームの転送を、ネットワーク内で動的に行われる経路探索という観点から見て、探索空間を探索木400として表現した図である。なお、探索木400は、ノード装置内に作成されるデータ構造ではなく、ネットワークトポロジそのものでもない。
探索木400に含まれる各探索ノードには、ネットワーク1内のノード装置のノードIDのラベルが付けられる。なお、図30では、各探索ノードを、円、正方形、六画形の3種類の図形で表しているが、円、正方形、六画形の意味の違いについては後述する。
また、図6の例では、データフレームのGSとGDは、それぞれノード装置N1とN7なので、探索木400のルートノードは、N1というラベルが付けられた探索ノード401である。そして、経路探索のゴールは、探索木400においてN7というラベルが付けられた探索ノード409を発見することである。
ここで、図6のネットワーク1においてノード装置NiとNjが隣接していれば、(1≦i,j≦7)、ノード装置Niにとって隣接ノード装置Njは潜在的なLDの候補であり、ノード装置Njにとっても隣接ノード装置Niは潜在的なLDの候補である。よって、探索木400内において、Niというラベルが付けられた探索ノードは、Njというラベルが付けられた探索ノードを子ノードとして有する。
したがって、探索木400では、Niというラベルが付けられた第1の探索ノードが、Njというラベルが付けられた第2の探索ノードを子ノードとして有し、第2の探索ノードが、Niというラベルが付けられた第3の探索ノードを子ノードとして有する。以下同様であるから、探索木400は、潜在的には無限の探索ノードを有する。
潜在的には無限に大きい探索木400の探索においては、探索空間の刈り込み(pruning)が行われつつ、深さ優先探索が行われる。「探索空間の刈り込み」とは、探索効率を上げるために探索木の1つ以上の枝を無視するという技法であり、探索アルゴリズムの研究分野においては、応用分野に応じて種々の刈り込み手法が提案されている。
第1実施形態のノード装置100の自律分散協調の結果としての刈り込みには2種類ある。以下、便宜的に「第1種の刈り込み」と「第2種の刈り込み」と称する。
第1種の刈り込みは、親ノードと同じラベルを有する子ノードの刈り込みである。例えば、上記の第1〜第3の探索ノードの例では、第2の探索ノードの子ノードである第3の探索ノードのラベルは、第2の探索ノードの親ノードである第1の探索ノードのラベルと等しい。そこで、第2の探索ノードから先の探索においては、第3の探索ノードが刈り込まれる。第1種の刈り込みによって刈り込まれる探索ノードは、図30において正方形で表されている。
第2種の刈り込みは、祖先ノードと同じラベルを有する子ノードの刈り込みである。第2種の刈り込みは、第1実施形態のFID管理テーブル105によって可能となっている。第2種の刈り込みによって刈り込まれる探索ノードは、図30において六画形で表されている。
なお、図30において円は、刈り込まれずに探索された探索ノードを表す。
以下、具体的に図6の例と探索木400との関係について説明する。
上記のように、探索木400のルートノードである探索ノード401のラベルは、データフレームのGSであるノード装置N1のノードID・N1である。そして、ネットワーク1においてノード装置N1にはノード装置N2のみが隣接するので、探索ノード401は1つの探索ノード402のみを子ノードとして有し、探索ノード402のラベルはN2である。
また、ノード装置N1にはノード装置N2のみが隣接するので、図6のステップS101のように、データフレームがノード装置N1からノード装置N2へと送信される。ステップS101の送信は、図30では、探索ノード401から探索ノード402へと探索が進むことに対応する。
そして、ネットワーク1においてノード装置N2には、ノード装置N1とN3とN6が隣接している。よって、探索ノード402は、3つの探索ノード403と404と405を子ノードとして有し、探索ノード403と404と405それぞれのラベルはN3とN6とN1である。
図6においてノード装置N2が、最初にノード装置N3をLDとして選択して、ステップS102でノード装置N3へデータフレームを送信することは、図30では、探索ノード402から探索ノード403へ探索が進むことに対応する。
そして、ネットワーク1においてノード装置N3には、ノード装置N2とN4とN5が隣接している。よって、探索ノード403は、3つの探索ノード406、407および408を子ノードとして有し、探索ノード406、407、および408それぞれのラベルは、N4とN2とN5である。
図6においてノード装置N3が、最初にノード装置N4をLDとして選択して、ステップS103でノード装置N4へデータフレームを送信することは、図30では、探索ノード403から探索ノード406へ探索が進むことに対応する。
そして、ネットワーク1においてノード装置N4には、ノード装置N7とN5とN3が隣接する。よって、探索ノード406は、3つの探索ノード411、412、および413を子ノードとして有し、探索ノード411、412、および413それぞれのラベルは、N7とN5とN3である。
図6においてノード装置N4が、最初にノード装置N7をLDとして選択して、ステップS104でノード装置N7へデータフレームを送信することは、図30では、探索ノード406から探索ノード411へ探索が進むことに対応する。
ところが、図6に示すように、ステップS104ではノード装置N4とN7の間のリンクの障害により、送信が失敗する。つまり、探索木400においては、探索ノード411で探索が失敗してバックトラックが生じる。なお、探索ノード411から探索ノード406への、探索木400上でのバックトラックは、実際のネットワーク1上では、ACKフレームが受信されずにノード装置N4がタイムアウトするという現象である。
図6においては、ステップS104の送信失敗の後、ノード装置N4は、次にノード装置N5をLDとして選択してステップS105でノード装置N5へデータフレームを送信する。このステップS105での送信は、図30では、探索ノード406から探索ノード412へ探索が進むことに対応する。
そして、ネットワーク1においてノード装置N5にはノード装置N3とN4が隣接するので、探索ノード412は、2つの探索ノード414と415を子ノードとして有し、探索ノード414と415それぞれのラベルは、N3とN4である。
図6においてノード装置N5が最初にノード装置N3をLDとして選択してステップS106でノード装置N3へデータフレームを送信することは、図30では、探索ノード412から探索ノード414へと探索が進むことに対応する。
なお、探索木400において、探索ノード414は、祖先ノードである探索ノード403と同じラベルを持つ。しかし、探索ノード403と414の間には、2つの探索ノード406と412がはさまっているため、この時点では探索ノード414は刈り込まれない。
そして、ネットワーク1においてノード装置N3にはノード装置N2とN4とN5が隣接するので、探索ノード414は、3つの探索ノード416、417、および418を子ノードとして有し、探索ノード416、417、および418それぞれのラベルは、N2とN4とN5である。
ところで、ステップS106でデータフレームを受信した時点で、ノード装置N3のFID管理テーブル105−N3には、図12のとおりエントリE3が既に存在している。このことは、次の(O1)と(O2)を意味する。
(O1)探索木400において、探索ノード414から見た祖先ノードとして、探索ノード414自身と同じラベルN3を有する探索ノード403が存在している。
(O2)したがって、探索ノード414の子ノードである探索ノード416、417、および418は、刈り込み対象である。
そして、刈り込みは次のようにして実現される。
ラベルN3を有する探索ノード414の祖先ノードにラベルN4を有する探索ノード406があることは、ノード装置N3のFID管理テーブル105−N3のエントリE3において、ステップS106の時点でLDの値がN4であることに対応する(図12参照)。そして、ステップS106でデータフレームを受信すると、ノード装置N3は、ステップS103でLDとして選択したノード装置N4に対応する重みを、図11に示すように最大値に設定している。
換言すれば、ステップS106でのデータフレームの受信を契機として、ノード装置N3は、ノード装置N4を潜在的なLDの候補から除外している。そして、潜在的なLDの候補からの除外とは、探索木400における刈り込みであるから、ラベルN4を持つ探索ノード417は刈り込まれる。
また、探索ノード414の祖先ノードにラベルN2を有する探索ノード402があることは、ノード装置N3のFID管理テーブル105−N3のエントリE3において、OLSの値がN2であることに対応する(図12参照)。
そして、ステップS106でデータフレームを受信した時点では、OLS以外で潜在的にLDとして選択可能なノード装置N5が存在しているので、ノード装置N3は、OLSであるノード装置N2をLDとして選択しない。つまり、ラベルN2を持つ探索ノード416は刈り込まれる。
また、ステップS106の受信を契機に、ノード装置N3はLDとしてノード装置N5を選択する。ここで、探索木400において探索ノード414の子ノードである探索ノード418は、探索ノード414の親ノードである探索ノード412と同じラベルN5を有することに注目すると、探索ノード418は第1種の刈り込みの対象である。
実際、ステップS107でのノード装置N3からノード装置N5へのデータフレームの送信は、図30に示すように、探索木400上での探索ノード414から親ノードである探索ノード412へのバックトラックとして表すことができる。換言すれば、探索ノード414の子ノードであり、親ノードの探索ノード412と同じラベルN5を有する探索ノード418は、刈り込まれる。
次のステップS108では、図6に示すように、ノード装置N5はOLSであるノード装置N4へとデータフレームをバックトラックさせている。このステップS108の動作は、図30では、探索木400においてラベルN5を有する探索ノード412からラベルN4を有する探索ノード406へのバックトラックとして表現される。換言すれば、探索ノード412の子ノードであり、探索ノード412の親ノードの探索ノード406と同じラベルN4を有する探索ノード415は、刈り込まれる。
そして、次のステップS109でも、図6に示すように、ノード装置N4がOLSであるノード装置N3へとデータフレームをバックトラックさせている。このステップS109の動作も、図30では、探索木400においてラベルN4を有する探索ノード406からラベルN3を有する探索ノード403へのバックトラックとして表現される。換言すれば、探索ノード406の子ノードであり、探索ノード406の親ノードの探索ノード403と同じラベルN3を有する探索ノード413は、刈り込まれる。
この段階で、ラベルN3を有する探索ノード403の子ノードのうち未探索なのは、ラベルN2を有する探索ノード407と、ラベルN5を有する探索ノード408である。
しかし、ノード装置N3はステップS107でノード装置N5にデータフレームを送信済みであり、ステップS109でのデータフレームの受信を契機として、図11に示すように、ノード装置N5に対応する重みは最大値に設定されている。よって、ノード装置N5はLDの候補から除外され、ラベルN5を有する探索ノード408は刈り込まれる。
結局、ステップS110では、図6に示すように、ノード装置N3はOLSであるノード装置N2へとデータフレームをバックトラックさせている。このステップS110の動作は、図30では、探索木400においてラベルN3を有する探索ノード403からラベルN2を有する探索ノード402へのバックトラックとして表現される。換言すれば、探索ノード403の子ノードであり、探索ノード403の親ノードの探索ノード402と同じラベルN2を有する探索ノード407は、刈り込まれる。
続いて、ステップS111で、ノード装置N2はLDとして新たにノード装置N6を選択し、ノード装置N6にデータフレームを送信する。ステップS111の送信は、図30では、ラベルN2を有する探索ノード402からラベルN6を有する探索ノード404へ探索が進むことに対応する。
そして、ネットワーク1においてノード装置N6にはノード装置N7とN2が隣接するので、探索ノード404は、2つの探索ノード409と410を子ノードとして有し、探索ノード409と410それぞれのラベルは、N7とN2である。
図6においてノード装置N6は、OLSであるノード装置N2ではなく、まずノード装置N7をLDとして選択してデータフレームをステップS112で送信する。つまり、ラベルN2を有する探索ノード410は刈り込まれる。そして、ステップS112の送信により、GDであるノード装置N7のノードID・N7をラベルとして有する探索ノード409へと探索が進み、探索が終了する。なお、ステップS112で探索が終了するので、探索ノード402の子ノードである探索ノード405は探索されないが、探索ノード405は、第1種の刈り込みの対象でもあるから、図30では便宜的に正方形で表現してある。
なお、探索木400において、ルートノードである探索ノード401から、以上のようにして探索により見つかったリーフノードである探索ノード409に至る、経路上の各探索ノードのラベルを順に並べてタプルで表すと、〈N1,N2,N6,N7〉となる。そして、このタプルは、図6のネットワーク1において学習された経路〈N1,N2,N6,N7〉である。
第1実施形態によれば、データフレームが転送されながら動的に経路が探索されるが、その探索順を探索木400で表すと、図30のとおり深さ優先探索順である。幅優先探索ではなく深さ優先探索が行われることは、データフレームがマルチキャストされず常にユニキャストされることからも理解される。
そして、以上の説明から明らかなとおり、FID管理テーブル105のエントリのエージング時間Gfが適切に設定されていれば、ネットワーク1内でGSからGDに至る経路が見つかるまで、潜在的に可能な経路が深さ優先探索により調べつくされる。すなわち、エージング時間Gfが短すぎなければ、GSからGDに至る経路が存在さえすれば、経路は必ず見つかる。なお、図19に関して述べた「最悪ケース」とは、探索木400の深さ優先探索順でのトラバース(traverse)において、GDのノード装置のノードIDをラベルとして有する探索ノードが、一番最後に見つかる場合のことである。
続いて、さらに別の観点から第1実施形態について説明する。
図31は、ハローフレームの送受信による隣接ノードの認識と図6の経路選択とを示すタイミングチャートである。
図1のネットワーク1において、各ノード装置N1〜N7は、独立してそれぞれ図16のハローフレーム送信処理を行う。どのノード装置が先にハローフレームを送信するかは任意であるが、図31の例では、まずステップS1201でノード装置N2が図16のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N2に隣接するノード装置N1、N3、およびN6でそれぞれ受信される。そして、ノード装置N1、N3、およびN6は、それぞれ図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N2を隣接ノード装置として認識する。
また、図31の例では、続いてステップS1202で、ノード装置N4が図16のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N4に隣接するノード装置N3、N5、およびN7でそれぞれ受信される。そして、ノード装置N3、N5、およびN7は、それぞれ図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N4を隣接ノード装置として認識する。
さらに、ステップS1203では、ノード装置N3が図16のステップS403を実行し、図7のハローフレーム312を送信する。すると、ハローフレーム312はノード装置N3に隣接するノード装置N2、N4、およびN5でそれぞれ受信される。そして、ノード装置N2、N4、およびN5は、それぞれ図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N3を隣接ノード装置として認識する。
また、ステップS1204では、ノード装置N7が図16のステップS403を実行し、ハローフレームを送信する。なお、ステップS1204の時点では、ノード装置N4とN7の間のリンクには障害がまだ生じていないものとする。よって、ハローフレームはノード装置N7に隣接するノード装置N4とN6でそれぞれ受信される。そして、ノード装置N4とN6は、それぞれ図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N7を隣接ノード装置として認識する。
また、ステップS1205では、ノード装置N1が図16のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N1に隣接するノード装置N2で受信される。そして、ノード装置N2は、図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N1を隣接ノード装置として認識する。
さらに、ステップS1206では、ノード装置N6が図16のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N6に隣接するノード装置N2とN7でそれぞれ受信される。そして、ノード装置N2とN7は、それぞれ図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N6を隣接ノード装置として認識する。
そして、ステップS1207では、ノード装置N5が図16のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N5に隣接するノード装置N3とN4でそれぞれ受信される。そして、ノード装置N3とN4は、それぞれ図14のステップS203で図15のハローフレーム受信処理を呼び出して実行し、ノード装置N5を隣接ノード装置として認識する。
以上のステップS1201〜S1207により、図1および図6に示すネットワーク1内のノード装置N1〜N7は、それぞれ隣接ノード装置を認識し、隣接ノード管理テーブル103−N1〜103−N7を更新する。また、図15に示すように、ノード装置N1〜N7は、ハローフレームの受信を契機として、場合によっては重み付けテーブル104−N1〜104−N7)を更新することもある。
その後、ステップS1208でノード装置N4とN7の間のリンクに障害が発生する。
また、障害の発生とは関係なく、ステップS101でノード装置N1が、ノード装置N7をGDとして指定するデータフレームを、ノード装置N2をLDとして指定して送信する。つまり、ステップS101でノード装置N1は、図27〜28の処理を行う。
すると、データフレームを受信したノード装置N2は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N2がACKフレームを送信することが、図31ではステップS101aとして表現されている。
他方、ノード装置N1は、図28のステップS1121でACKフレームの受信を待っている。そして、ノード装置N1は、ステップS101aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS1121の待機を終え、ステップS1122とS1123を実行し、図28の処理を終える。
また、ステップS101aに示すように図20のステップS803でACKフレームを送信したノード装置N2は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N3を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS102に相当する。なお、図7には、ステップS102で送信されるデータフレーム303が例示されている。
すると、データフレームを受信したノード装置N3は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N3がACKフレームを送信することが、図31ではステップS102aとして表現されている。なお、図7には、ステップS102aで送信されるACKフレーム322が例示されている。
他方、ノード装置N2は、図22のステップS825でACKフレームの受信を待っている。そして、ノード装置N2は、ステップS102aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図22の処理を終える。
また、ステップS102aに示すように図20のステップS803でACKフレームを送信したノード装置N3は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N4を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS103に相当する。なお、図7には、ステップS103で送信されるデータフレーム304が例示されている。
すると、データフレームを受信したノード装置N4は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N4がACKフレームを送信することが、図31ではステップS103aとして表現されている。
他方、ノード装置N3は、図22のステップS825でACKフレームの受信を待っている。そして、ノード装置N3は、ステップS103aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図22の処理を終える。
また、ステップS103aに示すように図20のステップS803でACKフレームを送信したノード装置N4は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N7を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS104に相当する。
しかし、ステップS1208でノード装置N4とN7の間のリンクには障害が発生しており、データフレームはノード装置N7に到達しない。そのため、図31ではステップS104の矢印は、途中から破線になっている。
ノード装置N4は、図22のステップS825でACKフレームの受信を待っている。しかし、ノード装置N7からACKフレームが受信されないため、ノード装置N4は、定期的に実行している図26の処理のステップS1003において、ノード装置N7へのデータフレームの送信が失敗したと認識する。
その結果、ノード装置N4は、ステップS825の待機を終え、ステップS826、S828、S829、S818の処理を順に実行する。そして、ノード装置N4は、続くステップS819において、LDとしてノード装置N5を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS105に相当する。
すると、データフレームを受信したノード装置N5は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N5がACKフレームを送信することが、図31ではステップS105aとして表現されている。
他方、ノード装置N4は、図22のステップS825でACKフレームの受信を待っている。そして、ノード装置N4は、ステップS105aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図22の処理を終える。
また、ステップS105aに示すように図20のステップS803でACKフレームを送信したノード装置N5は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N3を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS106に相当する。
すると、データフレームを受信したノード装置N3は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N3がACKフレームを送信することが、図31ではステップS106aとして表現されている。
他方、ノード装置N5は、図22のステップS825でACKフレームの受信を待っている。そして、ノード装置N5は、ステップS106aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図22の処理を終える。
また、ステップS106aに示すように図20のステップS803でACKフレームを送信したノード装置N3は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N5を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS107に相当する。
すると、データフレームを受信したノード装置N5は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N5がACKフレームを送信することが、図31ではステップS107aとして表現されている。
他方、ノード装置N3は、図22のステップS825でACKフレームの受信を待っている。そして、ノード装置N3は、ステップS107aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図22の処理を終える。
また、ステップS107aに示すように図20のステップS803でACKフレームを送信したノード装置N5は、ステップS804以降の処理を続行する。具体的には、処理が図22のステップS818から図23のステップS830へと進み、ノード装置N5はステップS830で、OLSであるノード装置N4をLDとして指定してデータフレームを送信する。ステップS830での送信が、図31のステップS108に相当する。
すると、データフレームを受信したノード装置N4は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N4がACKフレームを送信することが、図31ではステップS108aとして表現されている。
他方、ノード装置N5は、図23のステップS836でACKフレームの受信を待っている。そして、ノード装置N5は、ステップS108aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS836の待機を終え、ステップS837とS839を実行し、図23の処理を終える。
また、ステップS108aに示すように図20のステップS803でACKフレームを送信したノード装置N4は、ステップS804以降の処理を続行する。具体的には、処理が図22のステップS818から図23のステップS830へと進み、ノード装置N4はステップS830で、OLSであるノード装置N3をLDとして指定してデータフレームを送信する。ステップS830での送信が、図31のステップS109に相当する。
すると、データフレームを受信したノード装置N3は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N3がACKフレームを送信することが、図31ではステップS109aとして表現されている。
他方、ノード装置N4は、図23のステップS836でACKフレームの受信を待っている。そして、ノード装置N4は、ステップS109aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS836の待機を終え、ステップS837とS839を実行し、図23の処理を終える。
また、ステップS109aに示すように図20のステップS803でACKフレームを送信したノード装置N3は、ステップS804以降の処理を続行する。具体的には、処理が図22のステップS818から図23のステップS830へと進み、ノード装置N3はステップS830で、OLSであるノード装置N2をLDとして指定してデータフレームを送信する。ステップS830での送信が、図31のステップS110に相当する。
すると、データフレームを受信したノード装置N2は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N2がACKフレームを送信することが、図31ではステップS110aとして表現されている。
他方、ノード装置N3は、図23のステップS836でACKフレームの受信を待っている。そして、ノード装置N3は、ステップS110aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS836の待機を終え、ステップS837とS839を実行し、図23の処理を終える。
また、ステップS110aに示すように図20のステップS803でACKフレームを送信したノード装置N2は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N6を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS111に相当する。
すると、データフレームを受信したノード装置N6は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N6がACKフレームを送信することが、図31ではステップS111aとして表現されている。
他方、ノード装置N2は、図22のステップS825でACKフレームの受信を待っている。そして、ノード装置N2は、ステップS111aで送信されるACKフレームを受信すると、図14のステップS206から図25の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図22の処理を終える。
また、ステップS111aに示すように図20のステップS803でACKフレームを送信したノード装置N6は、ステップS804以降の処理を続行し、図22のステップS819で、LDとしてノード装置N7を指定してデータフレームを送信する。ステップS819での送信が、図31のステップS112に相当する。
すると、データフレームを受信したノード装置N7は、図14のステップS205から図20〜23の処理を呼び出して実行する。図20のステップS803でノード装置N7がACKフレームを送信することが、図31ではステップS112aとして表現されている。
以上説明した一連の処理により、ネットワーク1全体では、たとえステップS1208で障害が発生しようとも、ノード装置N1〜N7の自律分散協調の結果として、動的に経路〈N1,N2,N6,N7〉が選択され、学習される。すなわち、以上の一連の処理によりノード装置N1〜N6では重み付けテーブル104−N1〜104−N6が更新されている。
したがって、ステップS112aの後には、学習の結果として、ノード装置N7をGDとして指定するデータフレームは、図6のようにネットワーク1内で試行錯誤的にバックトラックしながら転送される代わりに、初めから効率よく転送される。具体例をいくつか挙げれば、下記のとおりである。
(P1)ノード装置N1がGSとなって、ノード装置N7をGDとして指定するデータフレームを隣接するノード装置N2に送信すると、ノード装置N2は、学習された重み付けテーブル104−N2に基づき、最初からLDとしてノード装置N6を選択する。そして、データフレームはノード装置N6からGDであるノード装置N7へと送信される。
(P2)同様に、ノード装置N2がGSとなって、ノード装置N7をGDとして指定するデータフレームを送信するときも、ノード装置N2は、学習された重み付けテーブル104−N2に基づき、最初からLDとしてノード装置N6を選択する。そして、データフレームはノード装置N6からGDであるノード装置N7へと送信される。
(P3)ノード装置N5がGSとなって、ノード装置N7をGDとして指定するデータフレームを送信するとき、ノード装置N5は、学習された重み付けテーブル104−N5に基づき、バックトラックの生じたノード装置N3ではなく、ノード装置N4を最初にLDとして選択する。以下同様にして、ノード装置N4はLDとしてノード装置N3を選択し、ノード装置N3はLDとしてノード装置N2を選択し、ノード装置N2はLDとしてノード装置N6を選択し、ノード装置N6はLDとしてノード装置N7を選択する。
(P4)ノード装置N3がGSとなって、ノード装置N7をGDとして指定するデータフレームを送信するとき、ノード装置N3は、学習された重み付けテーブル104−N3に基づき、ノード装置N2をLDとして選択する。したがって、データフレームは、最初から効率よく経路〈N3,N2,N6,N7〉に沿って転送される。
以上のように第1実施形態によれば、図6のようにバックトラックによってネットワーク1内で試行錯誤的かつ動的に経路が選択されると、バックトラックの過程で経由した各ノード装置において、重み付けテーブル104の重みという形で、適切な経路が学習される。よって、GDとして同じくノード装置N7が指定されたデータフレームが今後送信される場合には、上記(P1)〜(P4)の例のように、学習の結果にしたがって、経路選択が効率化される。
続いて、有線ネットワークに適用される第2実施形態について説明する。第1実施形態では、図3の受信部101と送信部102が図4の無線モジュール206により実現され、図1のネットワーク1が無線ネットワークである場合を例として説明した。しかし、第2実施形態では、例えば図1や図2のネットワーク1や2が、有線リンクで接続された有線アドホックネットワークであってもよい。以下、具体例について、図32を参照して説明する。
図32は、第2実施形態が適用される有線ネットワークの例を示す図である。図32のネットワーク4は、複数のノード装置100a〜100iを含み、有線アドホックネットワークの一例である。まず、ノード装置100aの構成の概略を説明する。
なお、ノード装置100a〜100iの構成は同様である。互いに同様のコンポーネントには、「211a−1」、「211a−2」、「211b−1」などのように、添え字を除いて同じ参照符号を割り当て、詳しい説明を省略することがある。
ノード装置100a〜100iは、無線モジュール206により実現される図3の受信部101および送信部102の代わりに、有線通信のための物理ポート(以下単に「ポート」という)とPHYチップにより実現される不図示の受信部および送信部を有する。図32の例では、ノード装置100aは、4つのポート211a−1〜211a−4を備えるが、ポートの数は実施形態に応じて任意である。
なお、ポート211a−1〜211a−4は、第2実施形態によるフレームの通信を行うためのポートである。つまり、図7に示す第1実施形態と同様のデータフレームが、ポート211a−1〜211a−4を介して送受信される。換言すれば、ポート211a−1〜211a−4は、ノード装置100aが隣接ノード装置と有線接続するためのポートである。
以下では説明の便宜上、1つのポートに対応して1つのPHYチップがあるものと仮定するが、物理的には1つのPHYチップが4つのポートの入出力処理を行うことも可能である。
また、第2実施形態ではACKフレームとハローフレームが使われない。よって、ノード装置100aは、図3のACK処理部107とハローフレーム生成部112を含まない。また、詳しくは後述するが、第2実施形態では、フレーム分岐処理部106とリンク管理部108とデータフレーム処理部110の動作の一部が、第1実施形態とは異なる。そして、図9に示す第1実施形態の隣接ノード管理テーブル103の代わりに、図33に示す隣接ノード管理テーブル103aが使われる。
ところで、第1実施形態では、外部ネットワークとの接続のためにノード装置100が図4のPHYチップ202を備えている場合を例示した。第2実施形態のノード装置100aも同様に、外部ネットワークとの接続のため、汎用LANポート212aを備えている。
汎用LANポート212aは、例えばイーサネット規格にのっとった有線接続用の物理ポートであり、不図示のPHYチップと接続されている。図32では、汎用LANポート212a〜212iを斜線で示して、ポート211a−1〜211i−4とは区別してある。なお、本実施形態における汎用LANポート212a〜212iは有線LANポートであるが、実施形態によっては無線LANインタフェイスを代わりに用いることもできる。
そして、上記のごとき構成を有する各ノード装置100a〜100iは、ネットワーク4において、ケーブル(例えば、銅ケーブルなどの金属線ケーブル、または光ファイバケーブル)により、物理的にはメッシュ状(換言すれば格子状)に接続されている。
もちろん、ネットワークにおける物理的な接続トポロジは、実施形態に応じて任意であり、必ずしもメッシュ状でなくてもよい。
図32に示すメッシュ状の物理的なトポロジは、具体的には、次の(Q1)〜(Q12)のようなケーブル配線により実現されている。
(Q1)ノード装置100aと100dは、ポート211a−1と211d−1の間のリンク515により接続されている。
(Q2)ノード装置100aと100bは、ポート211a−4と211b−1の間のリンク516により接続されている。
(Q3)ノード装置100bと100eは、ポート211b−2と211e−2の間のリンク517により接続されている。
(Q4)ノード装置100bと100cは、ポート211b−4と211c−1の間のリンク518により接続されている。
(Q5)ノード装置100cと100fは、ポート211c−3と211f−3の間のリンク519により接続されている。
(Q6)ノード装置100dと100gは、ポート211d−2と211g−2の間のリンク521により接続されている。
(Q7)ノード装置100dと100eは、ポート211d−4と211e−1の間のリンク522により接続されている。
(Q8)ノード装置100eと100hは、ポート211e−3と211h−3の間のリンク523により接続されている。
(Q9)ノード装置100eと100fは、ポート211e−4と211f−1の間のリンク524により接続されている。
(Q10)ノード装置100fと100iは、ポート211f−4と211i−4の間のリンク525により接続されている。
(Q11)ノード装置100gと100hは、ポート211g−4と211h−1の間のリンク526により接続されている。
(Q12)ノード装置100hと100iは、ポート211h−4と211i−1の間のリンク527により接続されている。
もちろん、実施形態に応じて、図32に例示した以外の組み合せのポート間をケーブルで接続することで図32と等価なメッシュトポロジを実現することも可能である。
ところで、図32の例では、ネットワーク4は孤立したネットワークではなく、LANやWAN(Wide Area
Network)などの外部ネットワークとも接続される。
例えば、図32の例では、ネットワーク4は次のようにして外部ネットワークと接続される。すなわち、リンク511を介してPC(Personal Computer)501と接続されたL2SW(Layer 2
Switch)502が、ノード装置100aと100bそれぞれの汎用LANポート212aと212bに、それぞれリンク512と513を介して接続されている。また、PC503、505、506が、ノード装置100c、100g、100hそれぞれの汎用LANポート212c、212g、212hに、それぞれリンク514、528、529を介して接続されている。
なお、L2SW502は、不図示のルータや、不図示の他のPCとさらに接続されていてもよい。また、PC503、505、および506も、不図示の他の外部ネットワークに接続されていてもよい。
また、説明の便宜上、図32には9個のノード装置100a〜100iを含むネットワーク4を例示したが、実施形態によっては、例えば数千個〜数十万個といった多数のノード装置を有線アドホックネットワークが含んでいてもよい。
例えば、いたる所に配置された多数のセンサから様々な情報を収集するためのネットワークであるセンサネットワークに、本実施形態の有線アドホックネットワークが適用されてもよい。その場合、多数のセンサに対応して、有線アドホックネットワークは、数千個〜数十万個のオーダの、多数のノード装置を含んでもよい。センサネットワークでは、例えば、画像センサ、温度センサ、湿度センサ、圧力センサ、加速度センサなど、任意の種類のセンサが利用される。
図32も、本実施形態による有線アドホックネットワークの、センサネットワークへの適用例の1つを示している。すなわち、図32においてノード装置100eと100iそれぞれの汎用LANポート212eと212iには、LANインタフェイスを備えたセンサ504と507が、それぞれリンク520と530を介して接続されている。センサ504と507は、感知した結果を示すデータを、LANインタフェイスを介してイーサネットフレームとして出力する。これらのセンサ504と507の種類は任意である。
図32に示すような本実施形態による有線アドホックネットワークを利用すると、無線通信では通信困難な環境でも有線通信ならば通信可能な場合が多いため、過酷な環境においてもセンサネットワークを構築することが可能となる。
例えば、畑や崖などの土中、水田や河川や海などの水中、建物の壁や柱などの構造物中などに、センサと、汎用LANポートを介して当該センサに接続されたノード装置とが埋め込まれてもよい。そのような場合でも、ノード装置は有線接続によって他のノード装置と確実に通信することが可能である。よって、本実施形態による有線アドホックネットワークを利用すると、土中、水中、構造物中などの、無線通信が困難な環境においても、センサネットワークを構築することが可能である。
続いて、図32のようなネットワーク4における各ノード装置100a〜100iの構成と動作について、第1実施形態に関する図7〜29を順に参照しながら、第1実施形態との違いを説明する。
まず図7を参照すると、第2実施形態では、ハローフレームとACKフレームが利用されない。その理由は、有線リンクは無線リンクと比べて格段に通信品質が良いからである。つまり、物理ポート間を1対1に接続する有線通信においては、伝送媒体上の搬送波信号が検出されさえすれば、通信は事実上100%成功する。
例えば、ノード装置100aは、ハローフレームの受信を契機として隣接ノード装置を認識する必要はなく、単にポート211a−1〜211a−4を監視して、搬送波信号が検出されるか否かを調べればよい。搬送波信号が検出されれば、隣接ノード装置が存在する。
また、例えば、ケーブルの切断などによりポート211a−4がリンクダウン状態でない限り、ノード装置100aがポート211a−4からリンク516を介して隣接するノード装置100bにデータフレームを送信すると、送信の成功が保証される。したがってACKフレームも不要である。
次に、図8を参照すると、第2実施形態ではACKフレームが使われないので、バッファ部109においてタイムアウト時刻フィールドは不要である。
また、第2実施形態においては、図9のような形式の隣接ノード管理テーブル103の代わりに、図33のような隣接ノード管理テーブル103aが使われる。図33は、第2実施形態における隣接ノード管理テーブル103aの例を示す図である。
なお、以下ではノード装置100aにおいて、4つのポート211a−1〜211a−4をそれぞれ識別するポートIDが、各ポート211a−1〜211a−4に予め割り当てられているものとする。
図33を図9と比較すると、図33ではポートIDフィールドが追加されている点のみが異なる。例えば、図1のネットワーク1が、有線ネットワークである場合、ノード装置N2の隣接ノード管理テーブル103a−N2は、図9と同様にノード装置N2に隣接する3つのノード装置N1、N3、およびN6にそれぞれ対応する3つのエントリを有する。そして、各エントリにおいて、ポートIDフィールドの値Q2,i(i=1,3,6)は、「ノード装置N2においてポートIDとしてQ2,iが割り当てられたポートには、ノード装置Niが接続されている」ということを示す。
例えば、ノード装置N2は、あるポートID・Q2,iが割り当てられたポートにおいて受信したデータフレームからLSの値Niを取り出し、取り出した値NiとポートID・Q2,iとを対応付けて、図33のような隣接ノード管理テーブル103aを作成する。
次に、図10と図11を参照すると、第2実施形態でも重み付けテーブル104の形式は第1実施形態と同様である。しかし、第2実施形態では重みの値が「0」と「1」の2値である。
第1実施形態では、無線リンクの品質も考慮して、より適切な隣接ノード装置をLDとして選択するために、ACKフレームが受信されるか否かに応じて式(6)または(7)により重みが小刻みに調整される。しかし、ポート間が1対1に接続されている有線リンクの状態は、以下の(R1)と(R2)の二者択一である。
(R1)搬送波信号が検出されているので、事実上100%通信が成功すると保証されている。
(R2)搬送波信号が検出されないリンクダウン状態なので、通信が失敗することは明らかである。
そのため、第2実施形態においては、重みの値は2値でよい。重みの値の操作の詳細は後述する。
続いて図12と図13を参照すると、第2実施形態でもFID管理テーブル105の形式は、第1実施形態と同様である。
次に図14を参照すると、第2実施形態では受信したフレームのタイプによるステップS202での分岐がなく、したがって、ステップS203とS206も存在しない。
ただし、第2実施形態では、ステップS203から呼び出される図15の処理の代わりに、リンク管理部108は、定期的に各ポートの状態を監視する。そして、リンク管理部108は、搬送波信号が検出されたポートのポートIDを有するエントリが図33の隣接ノード管理テーブル103aに存在するか否かを調べる。
エントリが存在すれば、リンク管理部108は、見つかったエントリの最終更新時刻フィールドの値を現在時刻に更新する。エントリが見つからなければ、リンク管理部108は、新規エントリを作成し、搬送波信号が検出されたポートのポートIDと現在時刻を新規エントリに登録する。この段階ではノードIDフィールドは空である。
また、第2実施形態では、図14のステップS201でデータフレームが受信されたとき、フレーム分岐処理部106はステップS204の処理に加えて、さらに次の処理を行う。すなわち、フレーム分岐処理部106は、データフレームのLSの値と、データフレームを受信したポートのポートIDとを、リンク管理部108に通知する。
すると、リンク管理部108は図33の隣接ノード管理テーブル103aを検索し、以下の(S1)〜(S4)の操作を行う。
(S1)ノードIDフィールドの値がデータフレームのLSの値に一致し、かつポートIDフィールドの値が、データフレームを受信したポートのポートIDに一致するエントリがある場合。
リンク管理部108は、当該エントリの最終更新時刻として現在時刻を設定する。
(S2)ノードIDフィールドが空であり、かつポートIDフィールドの値が、データフレームを受信したポートのポートIDに一致するエントリがある場合。
リンク管理部108は、当該エントリにおいて、ノードIDとしてデータフレームのLSの値を設定し、最終更新時刻として現在時刻を設定する。また、図15における「受信したハローフレームのLSの値」の代わりに、受信したデータフレームのLSの値を用いて、リンク管理部108は、図15のステップS305〜S308の処理を行う。
(S3)ポートIDフィールドの値が、データフレームを受信したポートのポートIDに一致するエントリがない場合。
リンク管理部108は、隣接ノード管理テーブル103aに新規エントリを作成し、新規エントリに、データフレームのLSの値と、データフレームを受信したポートのポートIDと、現在時刻を設定する。また、図15における「受信したハローフレームのLSの値」の代わりに、受信したデータフレームのLSの値を用いて、リンク管理部108は、図15のステップS305〜S308の処理を行う。
(S4)ノードIDフィールドの値がデータフレームのLSの値に一致するが、ポートIDフィールドの値は、データフレームを受信したポートのポートIDに一致しないエントリがある場合。
リンク管理部108は当該エントリを削除する。つまり、リンク管理部108はケーブルの接続替えを隣接ノード管理テーブル103aに反映させる。
続いて、図16を参照して第1実施形態との違いを説明すると、第2実施形態ではハローフレームは使われないので、図16の処理も行われない。
また、図17〜19の各種エージング処理は、第2実施形態でも第1実施形態と同様である。
第2実施形態において、図20〜23のデータフレーム受信処理は次のように変形される。
図20において、ステップS803は省略される。また、図21のステップS816では、初期重み付け値として、送信可能であることを示す「0」が使われる。
また、第2実施形態ではACKフレームが存在しないため、当然、タイムアウトを契機としたLDの再選択も行われない。そして、第2実施形態では重みが2値である。したがって、図22のステップS818は次のように変形される。すなわち、データフレーム処理部110は、取得したLDの値に対応する重みが1であるか否かを判断し、当該重みが1ならば処理は図23のステップS830に移行し、当該重みが0ならば処理はステップS819に移行する。
そして、ステップS819では、データフレーム処理部110は、第1実施形態と同様にして新たなデータフレームを作成して送信部102に出力する。すると、第2実施形態の送信部102は、隣接ノード管理テーブル103aを参照して、LDとして指定された隣接ノード装置に対応するポートIDを特定する。そして、送信部102は、データフレーム処理部110から受け取った新たなデータフレームを、特定したポートIDの割り当てられたポートに出力する。
その後、第2実施形態ではステップS820が省略される。ステップS821〜S824は第1実施形態と同様である。
また、第2実施形態ではACKフレームがないため、ステップS825とS826は省略される。そして、データフレーム処理部110は、ステップS819で送信部102に送信を依頼し終わった時点で、「送信成功」と認識し、受信したデータフレームをバッファ部109から削除する。
よって、ステップS822またはS824の直後に、データフレーム処理部110はステップS827を実行することになる。ただし、第2実施形態では、ステップS827において、データフレーム処理部110は重みの更新は行わない。なぜなら第2実施形態での重みは0と1の2値であり、重みは0のままでよいからである。
また、ステップS819でデータフレーム処理部110が既に「送信成功」と認識しているので、ステップS828とS829は、第2実施形態では存在しない。
そして、図23では、ステップS830での送信が、ステップS819と同様に変形される。また、ステップS836およびS837は、ステップS825およびS826と同様に省略される。ステップS838はステップS828と同様に省略される。そして、ステップS839では、ステップS827と同様に、重みの更新が省略され、最終更新時刻のみが更新される。
そして、第2実施形態ではACKフレームが存在しないので、図25と26の処理も存在しない。
また、図27〜28のデータフレーム送信処理は、第2実施形態では次のように変形される。
図27のステップS1101〜S1110は第1実施形態と同様である。しかし、図28のステップS1111は、ステップS818と同様に変形される。すなわち、データフレーム処理部110はステップS1111において、取得したLDの値に対応する重みが1であるか否かを判断し、当該重みが1ならば処理はステップS1112に移行し、当該重みが0ならば処理はステップS1114に移行する。
また、ステップS1114での送信はステップS819と同様に変形され、受信したデータフレームは、新たなデータフレームの送信後すぐにバッファ部109から削除される。よってステップS1115は省略される。
ステップS1116〜S1120は第1実施形態と同様だが、ステップS1121、S1122、S1124、およびS1125は第2実施形態には存在しない。また、ステップS1123はステップS827と同様に変形される。すなわち、データフレーム処理部110はステップS1123において、重みは更新せず、最終更新時刻のみを更新する。
また、図29の処理は図23の処理と同様に、第2実施形態において変形される。
続いて、第3実施形態について説明する。第3実施形態は、第1および第2実施形態を合わせた実施形態であり、有線接続と無線接続が混在するネットワークに適用される実施形態である。
具体的には、第3実施形態では、下記の3種類のノード装置がネットワーク内に混在している。
(T1)第1実施形態のノード装置100のように無線リンクを介して隣接ノード装置と通信を行う、無線タイプのノード装置。
(T2)第2実施形態のノード装置100a〜100hのように有線リンクを介して隣接ノード装置と通信を行う、有線タイプのノード装置。
(T3)第1実施形態のノード装置100のように無線モジュール206により実現される受信部101および送信部102を有し、さらに、第2実施形態のノード装置100a〜100hのように有線接続用のポートとPHYチップを備える、混合タイプのノード装置。つまり、無線リンクを介して隣接ノード装置と通信を行うこともでき、かつ有線リンクを介して隣接ノード装置と通信を行うこともできる、混合タイプのノード装置。
なお、混合タイプのノード装置においては、例えば、図33のような隣接ノード管理テーブルが使われてもよい。その場合、ポートIDフィールドには、有線リンクを介した隣接ノード装置に関しては、ポートIDの値が格納され、無線リンクを介した隣接ノード装置に関しては、ポートIDとしては利用されない特定の値が格納されてもよい。混合タイプのノード装置は、無線リンクを介したフレームの送受信に関しては、第1実施形態のノード装置100と同様に動作し、有線リンクを介したデータフレームの送受信に関しては、第2実施形態のノード装置100a〜100hと同様に動作する。
続いて、第4実施形態について説明する。第4実施形態は、ACKフレームを利用しないように、無線ネットワークに関する第1実施形態を変形した実施形態である。
ここで、まず先に、無線ネットワークにおいてACKフレームを利用しないことの意味について説明する。
一般に、ACKフレームを利用することで、データフレームが隣接ノード装置に成功裡に到達したという到達保証が得られる。しかし、データフレームに対してACKフレームを返信することで、レイテンシの増大、実質的なスループットの低下といった影響が出るので、ネットワークシステム全体としてパフォーマンスが低下することもある。
また、図22に示すように、ACKフレームが受信されないことが原因でノード装置100が次々と別の隣接ノード装置をLDとして選択する場合がある。すると、経路が次々と切り替わり、結果として、同じGSから同じGDへと宛てられた複数のデータフレーム間で、順序が保たれない可能性がある。つまり、複数のデータフレームがGSから送信された順序と、それら複数のデータフレームがGDに到達する順序が異なるかもしれない。
他方で、無線ネットワークにおいてACKフレームをなくすと、データフレームが隣接ノード装置に到達するという保証はされなくなるが、逆に、GDへの到達順序は保たれる。
つまり、到達保証と順序保証はトレードオフの関係にある。よって、ネットワークの用途、あるいはデータフレームのペイロードに何のプロトコルのPDUが含まれるか、といった要素を考慮して、無線ネットワークにおいてACKフレームを利用するか否かが決められてもよい。
例えば、データフレームのペイロードがイーサネットフレームであり、イーサネットフレームのペイロードがIPデータグラムであり、IPデータグラムのペイロードがTCP(Transmission Control Protocol)セグメントである、という場合がありうる。この場合、TCPは、TCPセグメントがドロップすることを前提に設計されているので、ACKフレームによる到達保証はなくてもよい。つまり、到達しないデータフレームがあったとしても、上位層のプロトコルであるTCPにより、再送制御が行われるので、問題は生じない。逆に、TCPでは順序保証が必要である。
よって、ACKフレームを利用しない第4実施形態は、例えば上記のようにTCPセグメントが図7のデータフレーム301のペイロードの中に含まれている場合などに好適である。
具体的には、第4実施形態は、ACKフレームが存在しないという点で第2実施形態と同様である。ただし、第4実施形態では、隣接ノード装置は第1実施形態と同様にハローフレームを利用して管理される。
よって、第4実施形態では、図14からステップS206が省略されるが、図15〜19の処理は第1実施形態と同様である。また、図20では第2実施形態と同様にステップS803が省略されるが、続く図21の処理は第1実施形態と同様である。
図22において、ステップS818は第2実施形態と同様に変形され、ステップS819は第1実施形態と同様である。ただし、第4実施形態でデータフレーム処理部110は、ステップS819で送信部102に送信を依頼し終わった時点で、「送信成功」と認識し、受信したデータフレームをバッファ部109から削除する。よって、ステップS820は第2実施形態と同様に省略される。
ステップS821〜S824は第1実施形態と同様である。そして、ステップS825とS826は第2実施形態と同様に省略される。よって、ステップS822またはS824の直後に、データフレーム処理部110はステップS827を実行することになり、ステップS828とS829は存在しない。したがって、重みが式(7)により更新されることはない。
なお、ステップS827は第1実施形態と同様でもよいし、第2実施形態と同様に重みの更新が省略されたステップであってもよい。
そして、図23では、ステップS830での送信が、ステップS819と同様に変形される。また、ステップS836およびS837は、ステップS825およびS826と同様に省略され、ステップS838はステップS828と同様に省略される。ステップS839は、第1実施形態と同様でもよいし、第2実施形態と同様に重みの更新が省略されたステップであってもよい。
第4実施形態ではACKフレームが存在しないので、図25と26の処理も存在しない。
また、図27〜28のデータフレーム送信処理は、第4実施形態では次のように変形される。
図27のステップS1101〜S1110は第1実施形態と同様であるが、図28のステップS1111は、ステップS818と同様に変形される。すなわち、データフレーム処理部110はステップS1111において、取得したLDの値に対応する重みが1であるか否かを判断し、当該重みが1ならば処理はステップS1112に移行し、当該重みが0ならば処理はステップS1114に移行する。
また、ステップS1114での送信はステップS819と同様に変形され、受信したデータフレームは、新たなデータフレームの送信後すぐにバッファ部109から削除される。よってステップS1115は省略される。
ステップS1116〜S1120は第1実施形態と同様だが、ステップS1121、S1122、S1124、およびS1125は第4実施形態には存在しない。したがって、重みが式(7)により更新されることはない。
また、ステップS1123は、第1実施形態と同様でもよいし、第2実施形態と同様に重みの更新が省略されたステップであってもよい。
また、図29の処理は図23の処理と同様に、第4実施形態において変形される。
続いて、第5実施形態について説明する。第5実施形態は、第1実施形態と第4実施形態を折衷した実施形態であり、ACKフレームの頻度が調整される実施形態である。
すなわち、第5実施形態では、ACKフレームを要求する第1種のデータフレームと、ACKフレームを要求しない第2種のデータフレームが利用される。第1種と第2種のデータフレームは、図7に示すタイプフィールドの値により区別される。
例えば、第1種のデータフレームのタイプフィールドには、図7のデータフレーム303と同様に、所定の定数Dが指定され、第2種のデータフレームのタイプフィールドには、別の定数Cが指定される。具体的には、タイプフィールドが2ビットのとき、例えば、D=(00)2かつC=(01)2でもよい。
ところで、ACKフレームを利用する目的の1つは、第4実施形態に関して述べたとおり到達保証であるが、他の目的は、リンクの品質の良さの把握のためである。
一般に、ノード装置NiとNjの間の無線リンクLi,jの通信品質が非常に悪ければ、ノード装置Niからノード装置Njへ(あるいはノード装置Njからノード装置Niへ)の無線リンクLi,jを介した通信はほぼ不可能である。ハローフレームのようにごく短いフレームでさえも、非常に通信品質の悪い無線リンクLi,jを介してノード装置Niからノード装置Njへ(あるいはノード装置Njからノード装置Niへ)到達することは難しい。
他方、ノード装置NiとNjの間の無線リンクLi,jの通信品質が非常に良ければ、データフレームのように長いフレームでさえも、無線リンクLi,jを介してノード装置Niからノード装置Njへ(あるいはノード装置Njからノード装置Niへ)成功裡に到達する。
しかし、ノード装置NiとNjの間の無線リンクLi,jの通信品質が中程度であれば、「ごく短いフレームに関しては無線リンクLi,jを介した送信が成功するが、長いフレームに関しては無線リンクLi,jを介した送信が失敗する」という場合もありうる。図22のステップS826などで送信失敗と判断される場合の中には、一時的にリンクに障害が発生じた場合だけでなく、上記のように、無線リンクの通信品質が、ハローフレームの送信には十分だがデータフレームの送信には不十分である場合も含まれる。
ここで図22のステップS827とS828に注目すると、ACKフレームが受信されるか否かによって、重みが漸減または漸増する。よって、学習された結果の重みの値は、ACKフレームが受信される割合を反映しており、すなわち、通信品質の良さを反映している。つまり、通信品質が良いリンクを介して隣接しているノード装置に対応する重みほど、値が小さく、したがって、LDとしてより優先的に選択される。
さて、このようにACKフレームは、到達保証のほかにリンクの品質の良さの把握のためにも使えるが、第4実施形態に関して述べたとおり、ネットワークシステム全体のパフォーマンス低下を招くこともある。そこで、第5実施形態では、上記のように第1種と第2種のデータフレームが使われる。
例えば、ノード装置100は、基本的にはパフォーマンス向上のために第2種のデータフレームを利用し、時々、リンクの品質の良さを把握するために抜き打ち検査的に第1種のデータフレームを利用してもよい。あるいは、上位層のプロトコルなどに応じて、GSとしてデータフレームを送信するノード装置100が、第1種と第2種のどちらが適切かを判断して、データフレームのタイプフィールドに値を設定してもよい。
第5実施形態には、例えば、以下の(U1)〜(U4)のような、様々なバリエーションがありうる。
(U1)GSとしてデータフレームを送信するノード装置100において、データフレーム処理部110は、最後にデータフレームを送信した時刻Tlastを記憶する。そして、データフレームの送信時に、現在時刻Tnowと最終送信時刻Tlastの差が所定の間隔Iack以上である場合のみ、データフレーム処理部110は、第1種を示す所定の値Dをデータフレームのタイプフィールドに設定する。その他の場合、データフレーム処理部110は、第2種を示す所定の値Eをデータフレームのタイプフィールドに設定する。例えば、間隔Iackは、10秒などの比較的長い時間でもよい。
(U2)GSとしてデータフレームを送信するノード装置100において、データフレーム処理部110は、GDごと、あるいは選択したLDごとに、時刻Tlastを記憶するようにして、上記(U1)と同様に動作してもよい。
(U3)GSとしてデータフレームを送信するノード装置100において、データフレーム処理部110は、送信したデータフレームの数Cを数える。つまり、データフレームの送信時に、データフレーム処理部110はCをインクリメントする。数えた値Cが所定の値Cackと等しい場合のみ、データフレーム処理部110は、第1種を示す所定の値Dをデータフレームのタイプフィールドに設定し、Cをゼロにリセットする。その他の場合、データフレーム処理部110は、第2種を示す所定の値Eをデータフレームのタイプフィールドに設定する。例えば、所定の値Cackは、数千といった比較的大きな数でもよい。
(U4)GSとしてデータフレームを送信するノード装置100において、データフレーム処理部110は、GDごと、あるいは選択したLDごとに、送信したデータフレームの数Cを数えるようにして、上記(U3)と同様に動作してもよい。
なお、隣接ノード装置から受信したデータフレームを転送するノード装置100において、データフレーム処理部110は、受信したデータフレームに指定されたタイプの値をそのまま、送信するデータフレームのタイプフィールドにコピーする。
あるいは、選択したLDに対応付けられた重みの値に応じて、データフレーム処理部110は、タイプフィールドの値を書き換えてもよい。例えば、選択したLDに対応付けられた重みが所定の閾値以上の場合、リンク品質が悪いと推測される。そこで、データフレーム処理部110は、受信したデータフレームにおけるタイプフィールドの値にかかわらず、送信するデータフレームのタイプフィールドに、第2種を示す所定の値Eを設定してもよい。
または、タイプフィールドが3ビット以上で表され、データフレームに以下の(V1)〜(V4)のような複数のサブタイプがあってもよい。
(V1)ACKフレームを要求しており、中継時のタイプフィールドの値の書き換えが許されないデータフレーム。
(V2)ACKフレームを要求しており、中継時のタイプフィールドの値の書き換えが許されるデータフレーム。
(V3)ACKフレームを要求せず、中継時のタイプフィールドの値の書き換えが許されないデータフレーム。
(V4)ACKフレームを要求せず、中継時のタイプフィールドの値の書き換えが許
されるデータフレーム。
以上、第1〜第5実施形態について詳細に説明したが、これらの実施形態の利点の理解を助けるため、続いて第1および第2比較例について説明する。なお、以下では説明の便宜上、「受信したデータフレームのGSとFIDの値が、過去に送信したデータフレームのGSとFIDの値に等しいのか否か」という判定(つまり図21のステップS807)を、「ループ判定」と称する。
図34と図35は、ループ判定があるがバックトラック動作のない第1比較例について説明する図である。図34と図35には、図6と同様に、図1のネットワーク1におけるデータフレームの転送の様子が示されている。
第1比較例のノード装置は、第1実施形態と同様のFID管理テーブルを有し、ループ判定を行う。つまり、図21のステップS809と同様に、第1比較例のノード装置も、過去に送信したデータフレームが受信された場合、送信の際に選択したLDに対応する重みを最大値に設定する。
しかし、第1比較例のノード装置は、バックトラック動作を行わない。つまり、第1比較例のノード装置では、FID管理テーブルのOLSフィールドは、OLSにあたるノード装置をLDの候補から除外するために参照される(図21のステップS817と図22のステップS829を参照)だけである。そして、第1比較例では、図23のステップS830〜S839の処理の代わりに、単にステップS838と同様に、受信したデータフレームを破棄する処理だけが行われる。
よって、図1のノード装置N1〜N7がいずれも第1比較例のノード装置である場合に、ノード装置N1がGDとしてノード装置N7を指定し、ノード装置N4とN7の間のリンクに障害が発生していると、データフレームは図34または図35のように転送される。
図34において、ステップS106までは図6の第1実施形態と同様なので、説明を省略する。
第1実施形態と同様に、ステップS106でデータフレームを受信したノード装置N3は、ステップS103でLDとして選択したノード装置N4に対応する重みを1に設定する。そして、新たにノード装置N5をLDとして選択し、ステップS107でデータフレームを送信する。
すると、ステップS107でデータフレームを受信したノード装置N5は、FID管理テーブルに基づいて、ステップS106で送信したのと同じデータフレームが受信されたと認識する。そして、ノード装置N5は、ステップS106でLDとして選択したノード装置N3の重みを最大値に設定する。
ここで、ノード装置N5には、OLSであるノード装置N4と、重みが最大値に設定されたノード装置N3しか隣接していない。よって、ノード装置N5は、LDとして選択可能な隣接ノード装置がないと判断し、ステップS107で受信したデータフレームを破棄する。こうしてデータフレームは、GDであるノード装置N7に到達することなく、ネットワーク1から消滅してしまう。
そして、ノード装置N3にとっては、「ステップS107の送信の後、どの隣接ノード装置からも同じデータフレームが返ってこない」という状況である。よって、ノード装置N3は、「GDとしてノード装置N7が指定されているデータフレームの送信時にLDとしてノード装置N5を選択することは適切である」と誤った学習をしてしまう。同様に、
ノード装置N2も、「GDとしてノード装置N7が指定されているデータフレームの送信時にLDとしてノード装置N3を選択することは適切である」と誤った学習をしてしまう。
つまり、第1実施形態の図6の例では、ステップS109やS110のバックトラック動作によって誤った学習結果が正されるが、第1比較例では、誤った学習結果が正されない。
すると、図34のデータフレームの転送の後、再度ノード装置N1がGDとしてノード装置N7を指定し、ノード装置N4とN7の間のリンクは障害から復旧していないとすると、次は図35のようにデータフレームが転送される。
図35のステップS101とS102は図6と同様なので説明を省略する。ステップS102でデータフレームを受信したノード装置N3は、図34での学習の結果に基づいて、ステップS103bでLDとしてノード装置N5を選択し、データフレームを転送する。
すると、図34のステップS107の受信により、「GDとしてノード装置N7が指定されている場合、LDとしてノード装置N3は選択不能である」と学習したノード装置N5は、他の隣接ノード装置N4をLDとして選択する。そして、ノード装置N5は、ノード装置N4をLDとして指定して、ステップS104bでデータフレームを送信する。
この時点のノード装置N4において、GDであるノード装置N7に対応する重み付けテーブルでは、図34のステップS104で送信失敗と判定されて値が増やされたノード装置N7の重みよりも、ノード装置N3の重みの方が、値が小さいとする。すると、ード装置N4は、ノード装置N3をLDとして選択し、ステップS105bでデータフレームを送信する。
すると、ノード装置N3は、ステップS103bで送信したのと同じデータフレームが受信されたと認識し、ノード装置N5の重みを最大値に設定する。そして、ノード装置N3は、まだLDとして選択していない隣接ノード装置N4を新たにLDとして選択し、ステップS106bでデータフレームを送信する。
すると、データフレームを受信したノード装置N4は、ステップS105bで送信したのと同じデータフレームが受信されたと認識し、ノード装置N3の重みを最大値に設定する。その結果、ノード装置N4は、LDとして選択可能な隣接ノード装置が残っていないと判断し、ステップS106bで受信したデータフレームを破棄する。こうしてデータフレームは、GDであるノード装置N7に到達することなく、ネットワーク1から消滅してしまう。
しかしながら、ノード装置N2にとっては、「ステップS102の送信の後、どの隣接ノード装置からも同じデータフレームが返ってこない」という状況である。よって、ノード装置N2は、「GDとしてノード装置N7が指定されているデータフレームの送信時にLDとしてノード装置N3を選択することは適切である」と誤った学習をしてしまう。
よって、その後もノード装置N2は、GDとしてノード装置N7が指定されているデータフレームの送信時にLDとしてノード装置N3を選択し続ける。そのため、ード装置N4とN7の間のリンクが障害から復旧しない限り、データフレームはネットワーク内で消滅してしまう。
以上のように、ノード装置がループ判定を行ったとしても、バックトラック動作を行わなければ、GSのノード装置は、データフレームがネットワーク内で破棄されて消滅することを認識せずに、データフレームを送り続ける。その結果、送り続けられるデータフレームは、ネットワークのどこかで廃棄し続けられる。よって、第1比較例は、好ましくない。
図35は、擬似的なバックトラック動作は行うがループ判定を行わない第2比較例について説明する図である。
第2比較例のノード装置は、FID管理テーブル105を持たず、ループ判定も行わない。また、第2比較例のノード装置は、擬似的なバックトラック動作を行う。
すなわち、第2比較例のノード装置は、GDとして自ノード装置以外が指定されたデータフレームを受信すると、データフレームのLS以外の隣接ノード装置のうち、最大値でない重みと対応付けられているものをLDとして選択し、データフレームを送信する。そして、第2比較例のノード装置は、送信が成功するまで順次、選択可能な隣接ノードを選択してゆく。
その結果、重みが最大値の隣接ノードおよび受信したデータフレームのLS以外の、すべての隣接ノード装置をLDとして試しても送信が成功しなかった場合に、第2比較例のノード装置は、受信したデータフレームのLSへとデータフレームを返送する。この返送が、第2比較例における擬似的なバックトラック動作である。
図35において、ステップS101〜S106は第1実施形態の図6と同様であるから、説明を省略する。
第2比較例のノード装置はFID管理テーブル105を持たず、ループ判定を行わない。よって、ノード装置N3は、ステップS106でデータフレームを受信すると、ステップS103と同様にして再度ノード装置N4をLDとして選択し、ステップS107bでデータフレームを送信する。
すると、やはりFID管理テーブル105を持たないノード装置N4は、ステップS107bでデータフレームを受信すると、ステップS105と同様にして再度ノード装置N5をLDとして選択し、ステップS108bでデータフレームを送信する。
以下同様にして、ループ判定が行われない第2比較例においては、閉路〈N3,N4,N5〉内でデータフレームが永遠に転送され続けるという、無限ループに陥ってしまう。よって、第2比較例も好ましくない。
それに対し、第1〜第5実施形態のノード装置は、ループ判定とバックトラック動作をともに行うので、アドホックネットワークに適した装置である。
なお、上記で説明した各実施形態は、互いに矛盾しない限り、適宜組み合わせることが可能である。例えば、第3実施形態と第5実施形態を組み合わせた実施形態(すなわち、有線接続と無線接続が混在するネットワークにおいて、ACKフレームの頻度調整が行われる実施形態)などが可能である。
また、本発明は上記の実施形態に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
変形の第1の観点は、データ構造である。図8〜13はテーブル形式で表されているが、実施形態に応じて、各種データの形式は任意であり、テーブル、有限FIFO(First In First Out)、線形リストなど任意のデータ構造を利用することができる。
例えば、FID管理テーブル105は、有限FIFOにより実現されてもよい。この場合、エントリは、古いものから順に、有限FIFOから追い出される。よって、図19に示すFID管理テーブル105のエージング処理は不要である。したがって、FID管理テーブル105の最終更新時刻フィールドも不要である。
具体的には、図22のステップS822、図23のステップS833、図28のステップS1118、および図29のステップS833aにおいて、既存のエントリを更新する代わりに、新規エントリの作成と、作成した新規エントリでの値の設定が行われてもよい。
例えば、ステップS822は、以下の(W1)〜(W3)の処理に置き換えられる。
(W1)データフレーム処理部110は、FID管理テーブル105に新規エントリを作成する。
(W2)データフレーム処理部110は、受信したデータフレームのGSとFIDに等しい値をGSおよびFIDとして有する既存のエントリから、FID、GS、OLSの各フィールドの値を新規エントリにコピーする。
(W3)データフレーム処理部110は、送信したデータフレームのLDの値を新規エントリのLDとして設定する。
なお、図21のステップS806、図23のステップS831、図28のステップS1116、および図29のステップS831aでは、有限FIFOの最も新しいエントリから古いエントリへと向かう順で、各エントリが順々に調べられる。
変形の第2の観点は、重みの表現である。重みを表す数値の範囲は実施形態によって任意である。例えば、上記の例のように0から1の範囲の値で重みを表す代わりに、0から255の範囲の整数により重みを表してもよい。また、上記各実施形態では、優先度が高いほど重みの値は小さいが、実施形態によっては逆に、優先度が高いほど重みの値が大きくてもよい。その場合、重みを変更する各ステップの動作が適宜変更される。
変形の第3の観点は、ポーリング処理と割り込み処理の置き換えである。例えば、タイマIC203は、データフレームの送信の後ACKフレームが返信されないときにタイムアウトするための割り込み信号を出力することもできる。つまり、図26のようにACK処理部107がバッファ部109の各エントリの最終更新時刻の値をポーリングにより調べる代わりに、バッファ部109の各エントリの最終更新時刻になったらタイマIC203が割り込み信号を発するような実施形態も可能である。
変形の第4の観点は、隣接ノード装置の管理に関する。
他のノード装置がハローフレームを送信する間隔が既知の場合、リンク管理部108は、現在隣接ノード装置として認識しているノード装置から次にハローフレームを受信する時刻を予測することができる。例えば、ネットワーク内のすべてのノード装置においてハローフレームの送信間隔ΔThelloが等しい場合には、他のノード装置がハローフレームを送信する間隔が既知である。
また、図7のハローフレーム311の代わりに、ハローフレームの送信間隔を示すフィールドをさらに有する別の形式のハローフレームが使われてもよい。その場合、リンク管理部108は、受信済みのハローフレームから、隣接ノード装置から次にハローフレームを受信する時刻を予測することができる。
このように、他のノード装置がハローフレームを送信する間隔が既知の場合は、例えば、隣接ノード管理テーブル103(図9参照)において、最終更新時刻フィールドが省略され、代わりに次のようなフィールドが追加されてもよい。
(X1)ハローフレームの受信に連続して失敗した回数を記録するための連続失敗回数フィールド
(X2)次にハローフレームが受信されると予測される時刻を記録するための予測時刻フィールド
そして、リンク管理部108は、図15のステップS302とS304で、現在時刻を最終更新時刻として設定する代わりに、連続失敗回数の値を0にクリアし、ハローフレームの既知の送信間隔を現在時刻に足した時刻を、予測時刻として設定してもよい。また、図17のステップS502の代わりに、次のような処理が行われてもよい。
すなわち、注目エントリの予測時刻フィールドの値が現在時刻よりも前の時刻を示す場合、リンク管理部108は、注目エントリの連続失敗回数の値をインクリメントし、予測時刻フィールドの値を、ハローフレームの既知の送信間隔の分だけ後ろにずらす。そして、注目エントリの連続失敗回数の値が所定の回数(例えば3回)以上であれば、処理はステップS503に移行し、注目エントリの連続失敗回数の値が所定の回数未満であれば、処理はステップS505に移行する。
また、隣接ノード装置の管理という上記第4の観点から、上記各実施形態は、次のように変形されてもよい。
すなわち、データフレームの受信時にも、受信したデータフレームのLSの値に基づいて、ハローフレーム受信処理と同様にして、必要に応じてリンク管理部108が隣接ノード管理テーブル103と重み付けテーブル104を更新してもよい。同様に、ACKフレームの受信時にも、受信したACKフレームのLSの値に基づいて、ハローフレーム受信処理と同様にして、必要に応じてリンク管理部108が隣接ノード管理テーブル103と重み付けテーブル104を更新してもよい。
変形の第5の観点は、LDを選択する際の基準である。すなわち、上記の各実施形態では、データフレームの送信時に重みに基づいてLDが選択されるが、LDの選択において、さらにリンク品質が考慮されてもよい。例えば、ノード装置100は、受信電波強度などに基づいて無線リンクのリンク品質を計測してもよい。そして、データフレーム処理部110は、重みとリンク品質の関数として表される評価値に基づいてLDを選択してもよい。
変形の第6の観点は、ACKフレームが受信されないときの処理に関する。
例えば、図22のステップS829では、一度ステップS826で「送信失敗」と判断された隣接ノード装置が、LDの候補から除外されている。しかし、一度ステップS826で「送信失敗」と判断された隣接ノード装置も候補から除外せず、ステップS829で選択可能とする実施形態も可能である。
その場合、ステップS818は次のように変形される。すなわち、データフレーム処理部110は、取得したLDの値に対応する重みが最大値であるか否かを判断する。そして、当該重みが最大値のとき、処理は図23のステップS830に移行し、当該重みが最大値未満のとき、処理はステップS819に移行する。
同様に、図28のステップS1125も、一度ステップS1122で「送信失敗」と判断された隣接ノード装置をLDの候補から除外しないように、変形することができる。そして、ステップS1111は、取得したLDの値に対応する重みが最大値であるか否かをデータフレーム処理部110が判断するように、変形される。
ステップS819とS819が上記のように変形されると、例えば、図2のノード装置N111が、GDとしてノード装置N101を指定するデータフレームをノード装置N116から受信したとき、次のようにノード装置N111が動作する。
上記データフレームの受信時に、ノード装置N111が有するノード装置N101に対応する重み付けテーブルにおいて、隣接ノード装置N105、N109、N115それぞれの重みが0.1、0.6、0.7だったとする。すると、まずLDとして隣接ノード装置N105が選択される。
仮に、ノード装置N105からACKフレームが返ってこないとすると、ノード装置N105の重みは0.2に更新される。そして、第1実施形態では、送信に失敗したノード装置N105はLDの候補から除外されて、次に隣接ノード装置N109がLDとして選択されるが、この変形例においては、0.2<0.6<0.7なので、再度ノード装置N105がLDとして選択される。
そして、またもやノード装置N105からはACKフレームが返ってこないとすると、ノード装置N105の重みは0.3に更新され、0.3<0.6<0.7なので、再度ノード装置N105がLDとして選択される。ノード装置N111とN105の間のリンクの状態が改善しない限り、以下同様にして繰り返しノード装置N105がLDとして選択されては送信が失敗する。そして、ノード装置N105の重みが0.6(または0.7)になった段階で、初めて、重み0.6と対応付けられたノード装置N109がLDとして選択される。
以上例示したように、一度「送信失敗」と判断された隣接ノード装置をLDの候補から除外しないことも可能である。この変形例は、「リンクに一時的に障害が発生しても、すぐにリンクが障害から復旧する」といった場合に好適である。例えば、ステップS818〜S829の繰り返しループの実行中にリンクが障害から復旧すれば、ノード装置100は、「LDとして好適」と今までの学習の結果から判っている隣接ノード装置を、瞬間的な障害の影響を受けずに、LDとして選択することができる。
ただし、障害からの復旧が常に瞬間的であるとは限らない。そこで、第1実施形態では、経路の収束にかかる時間を短縮するために、一度「送信失敗」と判断された隣接ノード装置はLDの候補から除外されている。つまり、一度「送信失敗」と判断された隣接ノード装置をLDの候補から除外することで、ある1つのデータフレームに関してノード装置100がLDを最終的に決定するのにかかる時間が短縮される。その結果、ネットワーク全体としても、データフレームがGSで送信されてからGDに到着するまでのレイテンシが短縮される。
また、上記の第6の観点からの変形例として、図22のステップS828において式(7)の代わりに下記の式(8)を用いてデータフレーム処理部110が重みの更新を行う変形例も可能である。
Wrevised=Wmax (8)
式(8)による重みの更新は、障害が生じているリンクを介してノード装置100に隣接するノード装置を、重みが更新される当該エントリがエージング処理により消去されるまで、LDの候補から除外し続けることを意味する。
さらに、上記の第6の観点からは、次のような変形も可能である。
すなわち、第1実施形態では、図26に示すように、1度データフレームの送信を試みてもACKフレームが所定のACKフレーム待ち時間Twaitのうちに受信されなければ、送信失敗と見なされる。しかし、所定の回数(例えば3回)データフレームの送信を試みてもACKフレームが返信されないときにはじめて、「送信失敗」と見なす実施形態も可能である。
例えば、送信済みのデータフレームを送信回数と対応付けて格納する送信バッファを、送信部102が備えていてもよい。送信部102は、最初にデータフレーム処理部110からデータフレームの送信を依頼されたとき、送信回数として1を設定し、データフレーム処理部110から出力されたデータフレームを送信バッファに格納する。そして、ACK処理部107は、図26のステップS1003の処理を行う代わりに、次のように動作してもよい。
すなわち、ACK処理部107は、バッファ部109の注目エントリに格納されているデータフレームに対応する、送信バッファ中の送信済みデータフレームを、GSフィールドとFIDフィールドの値に基づいて特定する。
そして、ACK処理部107が特定した送信済みデータフレームに対応付けられている送信回数の値が、所定の回数に達していれば、ACK処理部107はステップS1003の処理を行い、処理は続いてステップS1004へと移行する。
他方、ACK処理部107が特定した送信済みデータフレームに対応付けられている送信回数の値が、所定の回数未満であれば、ステップS1003の処理は行われず、代わりにACK処理部107は送信回数の値をインクリメントする。そして、処理はステップS1004へと移行する。
なお、上記の様々な実施形態とその変形例についてまとめれば、以下のとおりである。
ノード装置は、複数の隣接ノード装置のうち任意の1つからフレームを受信する受信手段として、例えば図3の受信部101、図4の無線モジュール206、図21のポート211a−1〜211a−4とそこに接続されたPHYチップなどを備える。
また、図3のFID管理テーブル105は、図4のDRAM20ネットワーク4やフラッシュメモリ205により実現され、図12や図13のような情報を格納している。このFID管理テーブル105は、以下の(Y1)〜(Y3)の各情報を対応付けて記憶する記憶手段の一例である。
(Y1)送信対象フレームを識別するフレーム識別情報
(Y2)複数の隣接ノード装置のうちで、送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報
(Y3)送信対象フレームを最初に送信してきた隣接ノード装置を識別する起源ノード識別情報
なお、上記(Y1)の送信対象フレームの例は、図22のステップS819、図23のステップS830、図28のステップS1114、図29のステップS830bなどで送信されるデータフレームである。そして、フレーム識別情報の例は、GSフィールドの値とFIDフィールドの値の組み合わせである。
また、上記(Y2)の送信先隣接ノード識別情報の具体例は、FID管理テーブル105のLDフィールドに格納される、隣接ノード装置のノードIDである。
そして、上記(Y3)の起源ノード識別情報の具体例は、FID管理テーブル105のOLSフィールドに格納されるノードIDである。
上記のとおり、ノード装置100がデータフレームを中継する場合には、ノード装置100が最初に当該データフレームを受信したときの当該データフレームのLSフィールドの値が、FID管理テーブル105のOLSフィールドに格納される。つまり、送信対象フレームを最初に送信してきた隣接ノード装置のノードIDが、OLSフィールドに格納される。
なお、拡張されたOLSの定義にしたがい、ノード装置100自身がGSとなる場合はFID管理テーブル105のOLSフィールドには自ノードIDが格納される。つまり、ノード装置100自身が送信対象フレームを生成した場合、OLSフィールドには、ノード装置100自身の識別情報である自ノードIDが格納される。換言すれば、OLSフィールドに格納されるノードIDは、ノード装置100自身を中心としたホップ数1以下の範囲において、ノード装置100が送信対象フレームの起源として認識するノード装置のノードIDである。
また、図3の重み付けテーブル104は、図4のDRAM204やフラッシュメモリ205により実現され、図10や図11のような情報を格納している。この重み付けテーブル104は、データフレームの最終宛先であるGDに対応付けて、複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する記憶手段の一例である。
なお、送信可能性情報は、上記実施形態では、具体的にはLDフィールドのノードIDと重みの値との組をそれぞれ含む、1つまたは複数のエントリで表されている。そして、送信可能性は、例えば「重みの値が1ならば送信不能であり、重みの値が1未満ならば送信可能である」というように表される。
また、図3のデータフレーム処理部110は、例えば図4のMPU201とDRAM204により実現され、送信可能性情報を更新する更新手段の一例である。受信部101などの受信手段が受信した受信フレームを識別する受信フレーム識別情報が、FID管理テーブル105などの記憶手段に(Y1)のフレーム識別情報として記憶されている場合、更新手段としてのデータフレーム処理部110は、送信可能性情報を更新する。
具体的には、この場合に更新される送信可能性情報は、受信フレームに指定された最終宛先(つまりGD)である受信フレーム宛先に対応付けられて、重み付けテーブル104などの記憶手段に記憶されている送信可能性情報である。送信可能性情報は、FID管理テーブル105などの記憶手段に、受信フレーム識別情報と対応付けられて記憶されている、(Y2)の送信先隣接ノード識別情報により識別される第1の隣接ノード装置への送信可能性が「送信不能」を示すように、更新される。
具体的には、例えば、「FID管理テーブル105のLDフィールドと同じ値をLDフィールドに持つ、重み付けテーブル104−iのエントリにおいて、重みを1に設定する」という動作が、更新手段としてのデータフレーム処理部110により行われる。
また、データフレーム処理部110と送信部102は、協働して、複数の隣接ノード装置の中から、送信可能な第2の隣接ノード装置を選択し、第2の隣接ノード装置へ受信フレームを送信する送信手段として機能する。送信手段の一部としてのデータフレーム処理部110は、受信フレーム宛先に対応付けられて重み付けテーブル104などの記憶手段に記憶されている送信可能性情報に基づいて、第2の隣接ノード装置を選択する。
ここで、FID管理テーブル105などの記憶手段において、受信フレーム識別情報に対応付けられた(Y3)の起源ノード識別情報として第3の隣接ノード装置が記憶されているとする。
すると、受信フレーム識別情報が、FID管理テーブル105などの記憶手段に(Y1)のフレーム識別情報として記憶されている場合、送信手段としてのデータフレーム処理部110は、第3の隣接ノード装置を送信可能性情報によらず送信不能と見なす。
つまり、データフレーム処理部110は、「OLSである隣接ノード装置は、重みの値によらず、送信不能である」と見なして、OLSである隣接ノード装置をLDの候補から除外する。そして、送信手段としてのデータフレーム処理部110は、第3の隣接ノード装置とは異なる、送信可能な第2の隣接ノード装置を選択する。
また、データフレーム処理部110と送信部102は、協働してバックトラック手段としても機能する。バックトラック手段としてのデータフレーム処理部110と送信部102は、重み付けテーブル104などの記憶手段の送信可能性情報において、複数の隣接ノード装置の中に送信可能なものがなく、かつ受信フレーム識別情報がFID管理テーブル105などの記憶手段に(Y1)のフレーム識別情報として記憶されている場合に、第3の隣接ノード装置へ受信フレームを送信する。
なお、ここで「複数の隣接ノード装置の中に送信可能なものがない」とは、「重みが1であるなど、送信可能性情報により送信不能と示されている隣接ノード装置か、上記のように送信可能性情報によらず送信不能と見なされている第3の隣接ノード装置しかない」という意味である。つまり、バックトラック手段としてのデータフレーム処理部110と送信部102は、第3の隣接ノード装置以外の(0個、1個、または複数の)隣接ノード装置の中に送信可能なものがない場合に、第3の隣接ノード装置へ受信フレームを送信する。
また、ノード装置は、新規フレームを生成する生成手段を備えてもよい。生成手段のいくつかの例は、下記(Z1)〜(Z4)のとおりである。
(Z1)図3の上位層処理部111
(Z2)図31において汎用LANポート212eを介してセンサ504に接続されているノード装置100eが備える、不図示のMACチップとMPU
(Z3)図31において汎用LANポート212gを介してPC505と接続されているノード装置100gが備える、不図示のMACチップとMPU
(Z4)図31において汎用LANポート212aを介してL2SW502と接続されているノード装置100aが備える、不図示のMACチップとMPU
なお、上記の様々な実施形態とその変形例によれば、データ伝送フェーズとは独立した事前の経路生成フェーズが別途存在する訳ではなく、データ伝送フェーズで動的に経路生成が行われる。その利点を説明すれば、下記のとおりである。
一般に、データ伝送フェーズとは独立した事前の経路生成フェーズを有する通信プロトコルでは、制御用の短いPDUを用いて経路が生成される。しかし無線リンクの通信品質には、「制御用の短いPDUの通信には十分だが、データ伝送用の長いPDUの通信には不十分」という、中間的なレベルもありうる。その理由の一つは、PDUの長さによって、通信可能な距離が異なるからである。
そのため、経路生成フェーズでは有効と思われた経路が、データ伝送フェーズになってはじめて、現実的には使用不能であると判明するかもしれない。また、電波状況は常に変わりうるし、有線ネットワークであっても、ノード装置の増設もしくは撤去、またはケーブルの接続替えなどは、常に起こりうる。
しかし、上記の様々な実施形態とその変形例によれば、データ伝送フェーズで、データフレームを送信しながら、データフレームの送信が可能な経路が動的に生成されていく。したがって、「現実的なデータフレームの伝送には使用不能な経路が、データ伝送フェーズとは独立した経路生成フェーズで作られてしまう」といった無駄は生じない。
また、上記の様々な実施形態とその変形例によれば、データ伝送フェーズにおけるネットワーク環境の動的な変化にも、動的に応じつつ、経路が選択される。そして、上記の説明から明らかなとおり、人手による設定なしに、各ノード装置の自律分散協調の結果として、動的に適切な経路が見出される。
さらに、図6の例からも明らかなとおり、上記の様々な実施形態とその変形例によれば、たとえバックトラックが生じても、必ずしもGSまで影響が及ぶ訳ではない。つまり、局所的に起こる変化に応じて、限られた局所的な範囲の中だけで経路が修正される。よって、「局所的な変化がネットワーク全体にポジティブにフィードバックし、その結果ネットワーク全体が過負荷状態に陥る」といった事態は生じない。