以下、発明の実施形態について、図面を参照しながら説明する。具体的には、まず、実施形態に係るネットワークの構成、および各ノード装置の構成について説明する。続いて、データ転送の効率化を図る手法の概要を説明する。さらに、フローチャートを参照しながら各ノード装置の動作を詳しく説明する。その後、他の実施形態について説明する。
図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内でのデータの送受信はフレームを用いて行われるが、フレームの、ネットワーク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のように、隣接ノード装置さえ認識していればよい。したがって、ネットワークの規模が増大しても「各ノード装置がネットワークトポロジを認識するために制御情報の通信を行い、制御情報の通信のせいでネットワークの負荷が高まり、通信システム全体としての性能が悪化する」といった事態に陥ることはない。
図3は、第1実施形態におけるノード装置の構成を示す機能ブロック図である。図1または図2の各ノード装置は、具体的には、例えば、図3に示すノード装置100に相当する。
ノード装置100は、フレームを受信する受信部101と、フレームを送信する送信部102を備える。また、ノード装置100は、フレームの送信のために用いる各種情報を格納するため、隣接ノード管理テーブル103、重み付けテーブル104、およびFID(Frame IDentification)管理テーブル105を備える。
ノード装置100はさらに、受信部101が受信したフレームの種類を判別するフレーム分岐処理部106を備える。第1実施形態では、「データフレーム」、「ハローフレーム」、「ACK(ACKnowledgment)フレーム」が使用される。また、フレームの転送効率を高めるために、「空データフレーム」も使用される。さらに、必要に応じて「集約空データフレーム」も使用される。
ノード装置100は、ACKフレームに関する処理を行うACK処理部107と、ハローフレームの受信に応じて処理を行うリンク管理部108を備える。また、ノード装置100は、データフレームの受信に応じた処理を行うために、バッファ部109とデータフレーム処理部110を備えている。ノード装置100はさらに、上位層処理部111、ハローフレーム生成部112、およびFID生成部113も備えている。さらに、ノード装置100は、送信キュー114を備えている。
ノード装置100の各部は以下のように動作する。
受信部101がフレームを受信し、受信したフレームをフレーム分岐処理部106に出力する。すると、フレーム分岐処理部106がフレームの種別を判別する。
ハローフレームが受信された場合、フレーム分岐処理部106は、受信されたハローフレームをリンク管理部108に出力する。リンク管理部108は、隣接ノード管理テーブル103を管理しており、さらに、重み付けテーブル104の管理にも関与している。
ここで、ハローフレームは、制御情報を通信するための制御フレームの一種であり、具体的には、ノード装置100が自分自身の存在を他のノード装置に通知するためのフレームである。よって、詳しくは図25とともに後述するとおり、リンク管理部108は、ハローフレームの受信を契機として隣接ノード装置の存在を認識し、認識結果を隣接ノード管理テーブル103に反映させる。すなわち、隣接ノード管理テーブル103は、ノード装置100に隣接する他のノード装置を、ノード装置100が記憶しておくためのテーブルである。
なお、ネットワークの状況は動的に変化しうるので、場合によっては、今まで隣接ノード装置としてリンク管理部108に認識されていた他のノード装置が、隣接ノード装置として認識不能となるかもしれない。よって、詳しくは図27とともに後述するとおり、リンク管理部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は、詳しくは図25および図27とともに後述するとおり、隣接ノード装置の変化に応じて重み付けテーブル104を追加、更新、または削除する。
また、ACKフレームが受信された場合、フレーム分岐処理部106は、受信されたACKフレームをACK処理部107に出力する。ここで、ACKフレームは、制御フレームの一種であり、ノード装置100が送信したデータフレームのLDであるノード装置から、ノード装置100に、データフレームの受信を通知するためのフレームである。
したがって、ACKフレームの受信は、データフレームの送信が成功したことを意味し、所定の時間が経過してもACKフレームが受信されずにタイムアウトとなることは、データフレームの送信に失敗したことを意味する。ACK処理部107は、後述の図37に示すACKフレーム受信のタイムアウト監視を行う。
バッファ部109は、データフレームの送信失敗と再送に備えて、データフレームを格納している。よって、詳しくは図37とともに後述するとおり、ACK処理部107は、ACKフレームの受信を契機としてデータフレームの送信成功を認識すると、不要になったデータフレームをバッファ部109から削除可能な状態にする。ただし、バッファ部109において、データフレームは、対応するACKフレームの受信時に即座に削除可能な状態にされるのではない。すなわち、対応するACKフレームが受信された場合であっても、バッファ部109に書き込まれたデータフレームは、所定時間Gが経過するまではそのまま保持される。所定時間Gは、後で詳しく説明するが、例えば、FID管理テーブル105のエージング時間に相当する。また、ACK処理部107は、データフレームの送信の成否をデータフレーム処理部110に通知する。
また、データフレームが受信された場合、フレーム分岐処理部106は、受信されたデータフレームをバッファ部109に格納するとともに、後述の図30〜図35の処理を行うようデータフレーム処理部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に関する説明と、図32に関する(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、送信キュー114は、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の実施形態のように、有線リンクが存在する実施形態も可能である。
タイマ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フレームの返信も含めた一連の処理の流れは、図42とともに後述する。
ステップ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全体で実現される自律分散協調動作について、更に詳細に説明してゆく。
第1実施形態におけるデータフレームは、図7に示すデータフレーム302のように、LD、LS、GD、GS、FID、タイプ、長さの各フィールドを含むヘッダ情報、およびペイロードを含む。例えば図5のデータフレーム301も、データフレーム302と同様の形式である。
なお、特に限定されるものではないが、ヘッダ情報の一部はアドホックヘッダに格納され、ヘッダ情報の残りの部分はデータヘッダに格納されるようにしてもよい。この場合、例えば、LD(ローカル宛先アドレス)、LS(ローカル差出アドレス)、タイプ(フレームタイプ)、長さ(フレームサイズ)はアドホックヘッダに格納される。また、GD、GS、FIDは、データヘッダに格納される。
データフレーム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は後述の図42のステップ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フレームである。後述の図42では、このノード装置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におけるエントリの作成の詳細は、図24とともに後述する。また、タイムアウト時刻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の送信に失敗したと判断する。
なお、詳しくは図32、図38、および図40に示すように、バッファ部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にデータフレームを送信する。その後、図42においてステップ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として選択してデータフレームを送信する。その後、図42においてステップ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に示す例では、ノード装置Xは、GD(最終宛先)としてノード装置Yが指定されたデータフレームを、まず、ノード装置aへ送信している。ここで、ノード装置bとノード装置Yとの間のリンクは切断されているものとする。そうすると、図6を参照しながら説明したように、ノード装置aからノード装置bへ送信されたデータフレームは、ノード装置cを経由してノード装置aに戻ってくる。これにより、ノード装置aは、ノード装置bへの送信が失敗したことを検出する。続いて、ノード装置は、上記データフレームをノード装置cへ送信する。しかし、このデータフレームは、ノード装置bを経由してノード装置aに戻ってくる。これにより、ノード装置aは、ノード装置bへの送信も失敗したことを検出する。したがって、ノード装置aは、「ノード装置YをGDとするデータフレームを転送することはできない」と判定し、バックトラックを実行する。すなわち、ノード装置aは、最初にノード装置Xから受信したデータフレームを、そのデータフレームのOLS(オリジナル送信元隣接ノード)であるノード装置Xへ送信する。
この後、ノード装置Xは、ノード装置aから受信したデータフレームを、他の隣接ノード(ここでは、ノードd)へ送信する。この結果、上記データフレームは、最終宛先であるノード装置Yへ到着する。
図15は、図14に示すノード装置X、a間でバックトラックが発生したときのシーケンスを示す図である。すなわち、ノード装置Xは、まず、ノード装置aへデータフレームを送信する。このとき、ノード装置Xは、ノード装置aへ送信したデータフレームを、図3に示すバッファ部109に保持している。
ノード装置aは、時刻TEにおいて、ノード装置Xから送信されたデータフレームを受信する。そうすると、ノード装置aは、FID管理テーブル105に新たなエントリを作成し、受信データフレームに係わる情報を記録する。
図16は、FID管理テーブル105の実施例である。FID管理テーブル105は、図12〜図13を参照しながら説明したが、より具体的には、FIDおよびGSのペアに対して、LD、OLS、最終更新時刻だけでなく、さらにACK受信フラグ、空データ送信回数、通常データ送信回数、エントリ時刻を管理する。エントリ時刻は、ノード装置が隣接ノードからデータフレームを最初に受信した時刻、または、ノード装置が隣接ノード装置から受信したデータフレームを他の隣接ノード装置へ転送した時刻を表す。前者の場合、エントリ時刻は、受信開始時刻であってもよいし、受信終了時刻であってもよい。また、後者の場合、エントリ時刻は、転送開始時刻であってもよいし、転送終了時刻であってもよい。以下の説明では、特に限定されるものではないが、エントリ時刻は、データフレームを隣接ノード装置から最初に受信した時刻を表すものとする。なお、ACK受信フラグ、空データ送信回数、通常データ送信回数については、後で説明する。
ノード装置aは、ノード装置Xから送信されたデータフレームを時刻TEにおいて受信すると、図16に示すような新たなエントリを作成する。この例では、FIDフィールドには、GSであるノード装置Xにより生成された一意の値FXが記録される。GSフィールドには「ノードX」が記録される。LDフィールドには、この例では、データフレームはノード装置bへ送信されるので、「ノードb」が記録される。OLSフィールドには、「ノードX」が記録される。そして、エントリ時刻TEおよび最終更新時刻TFとして、ノード装置Xから送信されたデータフレームを受信した時刻が記録される。
ノード装置aは、ノード装置Xから送信されたデータフレームをノード装置bへ転送すると共に、ノード装置XへACKフレームを返送する。ノード装置Xは、ノード装置aからACKフレームを受信することで、送信したデータフレームがノード装置aに到着したことを認識する。ただし、ノード装置Xは、ACKフレームを受信しても、バッファ部109に格納されているデータフレーム廃棄することなく、ノード装置aへの送信時刻から所定の保持期間Gが経過するまでは、そのデータフレームを保持する。
一方、ノード装置aからノード装置bへ送信されたデータフレームは、図14に示すように、ノード装置aに戻ってくる。そうすると、ノード装置aは、「ノード装置YをGDとするデータフレームを転送できない」ことをノード装置Xに通知するために、バックトラックを実行する。このとき、ノード装置aは、例えば、図14を参照しながら説明したように、上記データフレームをノード装置Xに送信する。そうすると、ノード装置Xは、自分が先にノード装置aへ送信したデータフレームを検出するので、「ノード装置aは、ノード装置YをGDとするデータフレームを転送することはできない」と判定する。この結果、ノード装置Xは、上記データフレームを他の隣接ノード(この例では、ノードd)へ送信する。
しかし、ノード装置Xのバッファ部109は、ノード装置aへデータフレームを送信したときから保持期間Gが経過するまでは、そのデータフレームを保持する。すなわち、時刻Tg以前は、ノード装置Xからノード装置aへ先に送信されたデータフレームは、ノード装置Xのバッファ部109に保持されている。したがって、ノード装置aによるバックトラック動作が、時刻Tgよりも前に実行されるのであれば、ノード装置aは、上記データフレーム全体をノード装置Xへ送信する必要はなく、「指定されたGDへの転送はできない」ことをノード装置Xへ通知すればよい。この場合、ノード装置Xは、ノード装置aからの通知に応じて、バッファ部109に保持されているデータフレームを取り出してノード装置dへ送信することができる。
上記動作を実現するために、ノード装置aは、バックトラック動作の実行時に、ノード装置Xからデータフレームを受信した時刻を表すエントリ時刻TEから現在時刻Tまでの経過時間を算出する。すなわち、経過時間「T−TE」が算出される。そして、この経過時間「T−TE」が保持期間Gよりも短ければ、ノード装置aは、ノード装置Xのバッファ部109にバックトラックに対応するデータフレームが保持されていると判定する。この場合、ノード装置aは、上記データフレーム全体を送信する代わりに、上記データフレームを識別するフレーム識別情報を通知するためのフレーム(以下、空データフレームと呼ぶ)をノード装置Xへ送信する。なお、保持期間Gは、この実施形態では、各ノード装置において同じであるものとする。
図17は、バックトラックで使用するフレームのフォーマットを示す図である。なお、データフレーム、ハローフレーム、ACKフレームのフォーマットの一例については、図7を参照して説明した。しかし、実施形態のノード装置によって送受信されるフレームのフォーマットは、所定のヘッダ情報が設定されている限りは、特に限定されるものではない。したがって、以下では、例えばデータフレームは、図17(a)に示すフォーマットを有しているものとする。
すなわち、データフレームは、アドホックヘッダおよびペイロードを有する。アドホックヘッダには、LD(ローカル宛先アドレス)、LS(ローカル差出アドレス)、フレームタイプ(タイプ)、フレームサイズ(長さ)が設定される。これらの各情報要素については、上述した通りである。また、ペイロード領域には、データヘッダおよび「データ」が格納される。データヘッダには、GS、GD、FIDが設定される。なお、この実施例では、データヘッダにはGS、GD、FIDのみが格納されるが、GS、GD、FIDに加えて他の情報が格納されるようにしてもよい。ペイロード領域に格納される「データ」は、GDに送信すべきデータである。
なお、ハローフレームおよびACKフレームのペイロードには、データヘッダは格納されるが、「データ」は格納されていない。また、ハローフレーム、データフレーム、ACKフレームは、フレームタイプにより識別される。特に限定されるものではないが、ハローフレーム、データフレーム、ACKフレームのフレームタイプには、この実施例では、例えば、それぞれ「0x0001」「0x0002」「0x0003」が割り当てられる。
図17(b)は、バックトラック動作において送信される空データフレームのフォーマットを示す。空データフレームのアドホックヘッダには、図17(a)に示す通常のデータフレームと同様に、LD、LS、フレームタイプ、フレームサイズが設定される。例えば、図14に示す例において、ノード装置aからノード装置Xへのバックトラック時に作成される空データフレームの場合は、「LD=X」「LS=a」が設定される。また、空データフレームのフレームタイプには、この例では、「0x0004」が割り当てられる。さらに、フレームサイズは、ペイロードのデータサイズが設定される。
空データフレームのペイロードには、データヘッダのみが格納され、最終宛先へ伝送すべきデータは格納されない。データヘッダには、上述したように、GS、GD、FIDが設定される。なお、データヘッダは、基本的に、各ノード装置により転送される過程で変更されることはなく、GSにおいて生成される情報がそのまま設定される。したがって、例えば、図14に示す例において、ノード装置aからノード装置Xへのバックトラック時に作成される空データフレームの場合は、「GS=X」「GD=Y」が設定され、FIDはノード装置Xで生成された値がそのまま設定される。
ノード装置aは、経過時間「T−TE」が保持期間Gよりも短ければ、バックトラック動作において、OLSであるノード装置Xへ空データフレームを送信する。この場合、ノード装置Xは、空データフレームのアドホックヘッダおよびデータヘッダを参照し、バッファ部109から対応するデータフレームを抽出する。そして、ノード装置Xは、バッファ部109から抽出したデータフレームを、他の隣接ノード(この例では、隣接ノードd)へ送信する。
なお、各ノード装置は、それぞれ自律的に、上述したバックトラック動作を実行することができる。例えば、図14に示す例では、ノード装置cは、ノード装置bに対するバックトラック動作において空データフレームを送信することができる。同様に、ノード装置bは、ノード装置aに対するバックトラック動作において空データフレームを送信することができる。
このように、実施形態のノード装置は、データフレームを最初に受信したとき(エントリ時刻)からの経過時間が保持期間Gを超える前にバックトラック動作を行う場合には、データフレーム全体を送信することなく、そのデータフレームを識別するためのフレーム識別情報のみを送信する。したがって、バックトラック時に転送されるフレームのサイズが小さくなり、フレームの転送効率が改善する。
ところで、サイズの大きなデータを送信する場合、そのデータは、複数のデータユニットに分割され、複数のデータフレームを利用して連続して伝送される。この場合、実施形態に係るネットワークにおいては、上述の複数の連続するデータフレームは、同じ経路で伝送される可能性が高い。そうすると、図14に示す例では、ノード装置aは、上述の複数の連続するデータフレームのそれぞれについて「GDへ転送不能」と判定することになる。この結果、ノード装置aは、複数のバックトラック動作を実行する必要がある。
そこで、実施形態のノード装置は、複数の空データフレームの送信先隣接ノードが同じときは、それら複数の空データフレームを集約して1つのフレームで送信する。図18に示す例では、4つのデータフレームが同じ経路で伝送され、いずれもノード装置aに戻ってきている。ここで、ノード装置aにとって、上記4つのデータフレームのOLSは、いずれもノード装置Xである。すなわち、ノード装置aは、ノード装置Xへ送信すべき4つの空データフレームを有している。この場合、ノード装置aは、これら4つの空データフレームを集約することにより生成される1つのフレームをノード装置Xへ送信する。以下では、複数の空データフレームを集約することで得られるフレームを「集約空データフレーム」と呼ぶことにする。
集約空データフレームのフォーマットを図17(c)に示す。集約空データフレームのアドホックヘッダには、図17(a)に示す通常データフレームまたは図17(b)に示す空データフレームと同様に、LD、LS、フレームタイプ、フレームサイズが設定される。ここで、集約空データフレームのアドホックヘッダに設定されるLD、LSは、集約される各空データフレームのアドホックヘッダに設定されている値がそのまま使用される。したがって、図18に示す例において、ノード装置aからノード装置Xへ送信される集約空データフレームのアドホックヘッダには「LD=X」「LS=a」が設定される。なお、集約空データフレームのフレームタイプには、この例では、「0x0005」が割り当てられる。また、集約空データフレームのフレームサイズは、ペイロードに格納されるデータヘッダの個数に応じて決まる。
集約空データフレームのペイロードには、同じ隣接ノードへ送信される複数の空データフレームの「データヘッダ」が格納される。図17(c)に示す例では、1つの集約空データフレームのペイロードにn個のデータヘッダが格納されている。
ノード装置Xは、集約空データフレームを受信すると、ペイロードから複数のデータヘッダを抽出する。そして、ノード装置Xは、バッファ部109から各データヘッダに対応するデータフレームを抽出し、それぞれ他の隣接ノード(この例では、隣接ノードd)へ送信する。
なお、集約空データフレームは、同じLDが設定された複数の空データフレームを集約することで作成される。このとき、異なるGDが設定された複数の空データフレームから集約空データフレームを作成するようにしてもよい。この場合、集約空データフレームを受信したノード装置は、対応する複数のデータフレームを異なる隣接ノードに送信することがある。
このように、実施形態に係るネットワークでは、データフレームを最終宛先まで伝送するために、バックトラック動作が必要になることがある。このとき、実施形態のノード装置は、バックトラック時に送信するデータがバックトラックの送信先隣接ノードに保持されていると見込まれる場合には、空データフレームを送信する。これにより、バックトラックの送信先隣接ノードに保持されているデータを有効に利用でき、バックトラックに係わるデータ量を削減できる。また、集約空データフレームを利用して複数のデータヘッダを一括して送信する場合には、バックトラックに係わるデータ量をさらに削減できる。したがって、実施形態のフレーム送信方法によれば、フレームの転送効率が改善する。
なお、各ノード装置が搭載する電池の寿命を長くするためには、ビットレートの低い通信方式が採用されることが多い。この場合、一般に、フレームサイズが小さくなる。そうすると、サイズの大きなデータを送信する場合、多数のデータフレームを利用してデータが伝送される。したがって、実施形態に係る集約空データフレームを利用してバックトラックを行う構成を採用すれば、各ノード装置の消費電力を抑えることができ、各ノード装置が搭載する電池の寿命を長くすることができる。
例えば、フレームサイズの最大値が128バイトであるネットワークにおいて、1500バイトのデータを送信するケースを考える。ここで、例えば、アドホックヘッダが20バイトであるものとする。また、図17では、データヘッダの要素がGS、DS、FIDのみであり、そのデータ長は18バイトであるが、ここではデータヘッダのデータ長が22バイトであるものとする。そうすると、各フレームについてデータを格納できる領域は86バイトであり、上記1500バイトのデータは、18個のデータフレームを利用して伝送されることになる。
ここで、仮に、上記18個のデータフレームが連続して送信され、その全てについてバックトラックが発生するものとする。そうすると、実施形態のフレーム送信方法を使用しないと、18個のバックトラックフレームが送信されることになる。これに対して、実施形態のフレーム送信方法による集約空データフレームを使用すれば、各フレームのペイロードに4個のデータヘッダを格納することができる。したがって、上記18個のデータフレームに応じてバックトラックで送信される集約空データフレームの数は、5個になる。このように、実施形態の方法によれば、バックトラック時に送信されるフレームの数が削減され、フレームの転送効率が向上する。
図19は、バックトラックを実行するノード装置の動作を示すフローチャートである。このフローチャートの処理は、例えば、バックトラックが必要と判定されたときにデータフレーム処理部110により実行される。図14に示す例では、ノード装置aのデータフレーム処理部110は、ノード装置Xから受信したデータフレームを最終宛先へ伝送できないと判断したときに、図19に示すフローチャートの処理を開始する。なお、以下の説明では、バックトラック動作に係るデータフレームを「対象データフレーム」と呼ぶことがある。
ステップS1において、データフレーム処理部110は、現在時刻Tを抽出する。各データ装置は、それぞれ時計を備えているものとする。この場合、各ノード装置が備える時計は、互いに同期していることが好ましい。
ステップS2において、データフレーム処理部110は、バッファ部109のエージング時間Gを抽出する。なお、バッファ部109のエージング時間Gは、図14〜図18を参照した説明では「保持時間G」として記載したものである。また、バッファ部109のエージング時間Gは、この例では、各ノード装置において同じ値が使用される。そして、各ノード装置において、エージング時間Gは、予め決められたメモリ領域に記録されている。
バッファ部109のエージング時間Gは、ノード装置がデータフレームを送信したときから、そのデータフレームが隣接ノード装置のバックトラック動作によりそのノード装置に戻ってくるまでの時間に対して十分に長く設定される。よって、エージング時間Gは、ネットワークの構成にもよるが、例えば、30秒程度に設定される。
ステップS3において、データフレーム処理部110は、対象データフレームのFIDおよびGSのペアでFID管理テーブル105を参照し、対応するエントリ時刻TEを抽出する。なお、図14に示す例では、ノード装置aは、ノード装置Xから対象データフレームを受信したときに、FID管理テーブル105にその対象データフレームに係るエントリを作成する。このとき、対象データフレームにFIDおよびGS等が記録される。そして、対象データフレームが最初に転送されたときに(すなわち、ノード装置bへ送信されたときに)、エントリ時刻TEが記録される。したがって、データフレーム処理部110は、上述のようにして記録されたエントリ時刻TEを抽出する。
ステップS4〜S5において、データフレーム処理部110は、バックトラック動作の宛先ノード装置において、対象データフレームが保持されているか否かを判定する。ここで、バックトラック動作の宛先ノード装置は、対象データフレームのOLSであり、FID管理テーブル105に記録されている。以下では、バックトラック動作の宛先ノード装置を「OLSノード装置」と呼ぶことがある。そして、ステップS4〜S5では、具体的には、対象データフレームのエントリ時刻TEから現在時刻Tまでの経過時間「T−TE」が、バッファ部109のエージング時間Gよりも短ければ、対象データフレームがバッファ部109に保持されていると判定される。
このとき「G>T−TE」であれば(ステップS5:Yes)、データフレーム処理部110は、対象データフレームがOLSノード装置に保持されていると判定する。この場合、OLSノード装置は、対象データフレームを新たに受信しなくても、バッファ部109に保持されている対象データフレームを利用して送信処理を行うことができる。したがって、データフレーム処理部110は、ステップS6において、対象データフレームのフレーム識別情報を通知するための空データフレームを作成する。空データフレームは、図17(b)に示すように、アドホックヘッダおよびペイロードを有する。そして、ペイロードには、対象データフレームのデータヘッダのみが格納される。
図14に示す例では、ノード装置aにより作成される空データフレームのアドホックヘッダには「LD=X」「LS=a」「フレームタイプ=0x0004」「フレームサイズ=データヘッダのデータ長」が設定される。また、ペイロードに格納されるデータヘッダには、「GS=X」「GD=Y」「FID=ノード装置Xにより生成された値」が記録されている。
一方、「G>T−TE」でなければ(ステップS5:No)、データフレーム処理部110は、対象データフレームがOLSノード装置に保持されていないと判定する。この場合、OLSノード装置は、最終宛先へデータを送信するために、対象データフレームを新たに受信しなければならない。したがって、データフレーム処理部110は、ステップS7において、通常のデータフレームを作成する。通常のデータフレームは、上述した空データフレームのペイロードにおいて、データヘッダに加えて、GSに伝送すべきデータが格納される。
ステップS8において、データフレーム処理部110は、ステップS6またはS7で生成したフレームを利用してバックトラックを実行する。すなわち、データフレーム処理部110は、ステップS6またはS7で生成したフレームを送信キュー114に保存する。そうすると、送信部102は、例えば、定期的に送信キュー114に保存されているフレームを読み出して送信する。フレームの送信先は、アドホックヘッダに設定されているLDである。
図20は、送信キュー114の実施例である。送信キュー114には、ノード装置から送信されるフレームが格納される。すなわち、送信キュー114には、データフレーム処理部110により生成されるデータフレーム(空データフレームを含む)が格納される。また、送信キュー114には、ハローフレームおよびACKクレームも格納されるようにしてもよい。
送信キュー114に新たなフレームが保存されるときは、図20(a)に示すように、各フレームにエントリ番号が割り当てられる。そして、送信キュー114は、各エントリ番号に対して、LD、LS、フレームタイプ、ACK受信済みフラグ、ペイロードを保存する。ここで、LD、LS、フレームタイプは、送信フレームのアドホックヘッダに相当する。なお、図20(a)では示されていないが、LD、LS、フレームタイプに加えてフレームサイズも合わせて保存されるようにしてもよい。ACK受信済みフラグは、フレームが送信された後に、送信先ノード装置から対応するACKフレームを受信したか否かを表す。よって、各エントリのACK受信済みフラグは、送信キュー114に格納された時点では「未」が設定される。
送信キュー114のペイロード領域には、それぞれ、各フレームのペイロードデータが格納される。ただし、空データフレームのペイロードには、図17(b)に示すように、データヘッダのみが格納されている。したがって、送信キュー114に空データフレームが保存されるときは、ペイロード領域には1つのデータヘッダのみが保存される。
例えば、図20(a)に示すエントリ0x0001には、図14においてノード装置aからバックトラック動作でノード装置Xへ送信される空データフレームが保存されている。すなわち、アドホックヘッダから得られる「LD=X」「LS=a」「フレームタイプ=0x0004」が保存されている。このとき、ACK受信済みフラグには「未」が設定される。また、このエントリのペイロード領域には、上記空データフレームのデータヘッダが保存される。
なお、ノード装置が図18に示す空データフレームの集約を行わない場合は、送信部102は、ステップS6またはS7で生成されたフレームを即座に送信してもよい。この場合、ノード装置は、送信キュー114を備えなくてもよい。すなわち、データフレーム処理部110は、作成したフレームを送信部102に渡し、送信部102は、そのフレームを即座に送信してもよい。
図21および図22は、バックトラック動作において空データフレームを集約する処理を示すフローチャートである。このフローチャートの処理は、所定の時間間隔でデータフレーム処理部110により繰り返し実行される。なお、ノード装置は、一定値が設定されるタイマを備える。このタイマは、クロック信号等によりカウントダウンし、ゼロになった時点でイベントを発生すると共に、再び上記一定値に戻る。そして、データフレーム処理部110は、このタイマにより生成されるイベントをトリガとして図21〜図22に示すフローチャートの処理を開始する。
ステップS11において、データフレーム処理部110は、バックトラック動作に係わる変数を初期化する。例えば、FID管理テーブル105において、各エントリの空データ送信回数および通常データ送信回数が「ゼロ」に初期化される。また、送信キュー114の各エントリを順番に指定するための変数iは、「1」に初期化される。
ステップS12において、データフレーム処理部110は、送信キュー114をロックする。なお、送信キュー114がロックされている期間は、送信部102は、送信キュー114からフレームを読み出して送信することはできない。
ステップS13〜S17において、データフレーム処理部110は、送信キュー114の各エントリにアクセスし、未処理状態の空データフレームを抽出する。すなわち、ステップS13〜S14では、i番目のエントリにフレームが保存されているか否かがチェックされる。このとき、i番目のエントリにフレームが保存されていれば、ステップS15の処理が実行される。一方、送信キュー114に保存されているすべてのフレーム対してステップS15以降の処理が実行されたときは(ステップS14:No)、ステップS31の処理が実行される。
ステップS15〜S16において、データフレーム処理部110は、対象エントリに保存されているフレームのフレームタイプおよびACK受信済みフラグをチェックする。そして、対象エントリに未送信の集約されていない空データフレームが保存されていたときは、ステップS21に進む。この実施例では、ハローフレーム、通常データフレーム、ACKフレーム、空データフレーム(集約されていない空データフレーム)、集約空データフレームのフレームタイプは、それぞれ、0x0001、0x0002、0x0003、0x0004、0x0005である。したがって、対象エントリにおいて「フレームタイプ=0x0004」および「ACK受信済みフラグ=未」が検出されれば、ステップS21に進む。例えば、図20(a)に示す例では、エントリ0x0001に対してステップS15〜S16を実行すると「Yes」と判定され、エントリ0x0002に対してステップS15〜S16を実行すると「No」と判定される。
なお、対象エントリのフレームタイプが0x0004でなかった場合、或いは、ACK受信済みフラグが「済み」であったときは、ステップS17において変数iがインクリメントされる。この場合、ステップS13に戻って送信キュー114の次のエントリが選択される。
ステップS21〜S22において、データフレーム処理部110は、作業領域に格納されている空データフレームを確認する。ここで、作業領域は、送信キュー114から取り出した空データフレームを一時的に格納するバッファメモリである。また、作業領域は、複数の空データフレームを集約するために使用される。そして、データフレーム処理部110は、対象エントリと同じLDが設定されている空データフレームが作業領域に存在するか否かをチェックする。
対象エントリの空データフレームと同じLDが設定されている空データフレームが作業領域に存在しないときは、データフレーム処理部110は、ステップS23において、対象エントリのACK受信済みフラグに「済み」を設定する。なお、ACK受信済みフラグが「済み」に設定されているエントリのフレームは、実際に送信される前であっても、図21〜図22に示すフローチャートの中では、既に送信されて対応するACKフレームを受け取ったものとして扱われる。したがって、ACK受信済みフラグが「済み」に設定されているエントリのフレームは、空データフレームであっても、ステップS16で選択されることはない。
ステップS24において、データフレーム処理部110は、対象エントリの空データフレームを作業領域に保存する。以降、この空データフレームは、集約処理状態となる。そして、ステップS25において、データフレーム処理部110は、変数iをインクリメントしてステップS13に戻る。すなわち、次のエントリが選択される。
対象エントリの空データフレームと同じLDが設定されている空データフレームが作業領域に存在するときは(ステップS22:Yes)、ステップS26が実行される。ステップS26においては、データフレーム処理部110は、ステップS22において検出された作業領域内の空データフレームに、対象エントリの空データフレームを追加する。このとき、これらの2つの空データフレームのアドホックヘッダ(LD、LS、フレームタイプ)は互いに同じである。よって、ステップS26では、作業領域内の空データフレームに、対象エントリの空データフレームのペイロードが追加される。このとき、対象エントリのACK受信済みフラグに「済み」が設定される。
ステップS27において、データフレーム処理部110は、ステップS26で得られる空データフレームのサイズが予め決められた閾値以下であるかをチェックする。この閾値は、作業領域に格納されている集約処理状態の空データフレームに、さらに他の空データフレームのペイロードを追加できるか否かを判断するために使用される。よって、この閾値は、例えば、実施形態に係るネットワークで規定される最大フレームサイズよりも、データヘッダ長だけ小さい値に決定される。そして、上記空データフレームのサイズが閾値以下であれば、上記集約処理状態の空データフレームにさらにデータヘッダを追加可能と判断される。この場合、ステップS25において変数iがインクリメントされた後、ステップS13に戻る。すなわち、次のエントリが選択される。
一方、上記空データフレームのサイズが閾値を超えていれば、データフレーム処理部110は、ステップS28において、上記空データフレームのフレームタイプに、集約空データフレームを表す値を設定する。この例では「0x0005」が設定される。すなわち、集約空データフレームが生成される。そして、データフレーム処理部110は、送信キュー114に新たなエントリを生成し、生成した集約空データフレームをそのエントリに保存する。このとき、このエントリのACK受信済みフラグには「未」が設定される。この後、ステップS25において変数iがインクリメントされた後、ステップS13に戻る。すなわち、次のエントリが選択される。
送信キュー114のすべてのエントリが選択されると(ステップS14:No)、データフレーム処理部110は、ステップS31の処理を実行する。ステップS31は、作業領域内の各空データフレームに対して実行されるが、基本的には、ステップS28と同じである。すなわち、ステップS31では、まず、作業領域内の各空データフレームのフレームタイプに、それぞれ集約空データフレームを表す値が設定される。これにより、集約空データフレームが生成される。続いて、各集約空データフレームは、送信キュー114に保存される。このとき、対応するACK受信済みフラグには「未」が設定される。
ステップS32において、データフレーム処理部110は、送信キュー114のロックを解除する。したがって、以降、送信部102は、送信キュー114からフレームを読み出して送信することができる。
次に、図21〜図22に示す集約処理の実施例を説明する。以下では、集約処理の開始時に、送信キュー114は図20(a)に示す状態であるものとする。また、作業領域は初期化されているものとする。
(1)送信キュー114のエントリ0x0001が選択される。このエントリには「フレームタイプ=0x0004(空データフレーム)」および「ACK受信済みフラグ=未」が設定されている。よって、ステップS16で「Yes」と判定され、ステップS21以降の処理が実行される。
(2)この時点では、作業領域には空データフレームが格納されていないので、ステップS22で「No」と判定される。よって、ステップS23においてエントリ0x0001のACK受信済みフラグに「済み」が設定される。また、ステップS24において、エントリ0x0001の空データフレームが作業領域に保存される。なお、この空データフレームのペイロードには「データヘッダ1」が格納されているものとする。
(3)エントリ0x0002〜0x0009には、空データフレームは保存されていない。この場合、各エントリについてステップS16において「No」と判定されるので、ステップS21以降の処理は実行されない。
(4)エントリ0x0010が選択される。このエントリについては、エントリ0x0001と同様に、ステップS16で「Yes」と判定される。よって、ステップS21以降の処理が実行される。
(5)エントリ0x0010のLDは「X」である。また、作業領域には、エントリ0x0001から取り出された空データフレームが保存されている。すなわち、作業領域に保存されている空データフレームのLDも「X」である。よって、ステップS26において、作業領域に保存されている空データフレームに、エントリ0x0010から取り出した空データフレームが追加される。これにより、作業領域には、ペイロードに「データヘッダ1+データヘッダ2」が格納された集約空データフレームが保存されることになる。なお、この集約空データフレームのLDは「X」のままである。さらに、エントリ0x0010のACK受信済みフラグに「済み」が設定される。
(6)上記(5)で作成された集約空データフレームのサイズが閾値よりも小さいものとする。そうすると、次のエントリが選択される。しかし、エントリ0x0011には、空データフレームは保存されていない。よって、ステップS21以降の処理が実行されることなく、さらに次のエントリが選択される。
(7)エントリ0x0012が選択される。このエントリについては、エントリ0x0001またはエントリ0x0010と同様に、ステップS16で「Yes」と判定される。よって、ステップS21以降の処理が実行される。
(8)エントリ0x0012のLDは「X」である。また、作業領域に保存されている集約空データフレームのLDも「X」である。したがって、ステップS26において、作業領域に保存されている集約空データフレームに、エントリ0x0012から取り出した空データフレームが追加される。これにより、作業領域には、ペイロードに「データヘッダ1+データヘッダ2+データヘッダ3」が格納された集約空データフレームが保存されることになる。なお、この集約空データフレームのLDも、「X」のままである。さらに、エントリ0x0012のACK受信済みフラグに「済み」が設定される。
(9)上記(8)で作成された集約空データフレームのサイズが閾値よりも小さいものとする。そうすると、次のエントリがサーチされる。しかし、この例では、未選択のエントリは残されていない。よって、ステップS31の処理が実行される。
(10)送信キュー114に新たなエントリ0x0013が作成され、上記(8)で生成された集約空データフレームは、このエントリに保存される。このとき、フレームタイプには「0x0005」が設定される。また、ACK受信済みフラグには「未」が設定される。
上記手順(1)〜(10)により、送信キュー114は、図20(b)に示す状態に更新される。この後、送信キュー114のロックが解除されると、送信部102は、送信キュー114においてACK受信済みフラグに「未」が設定されているフレームを抽出して送信する。したがって、送信部102は、エントリ0x0013に保存されている集約空データフレームを送信する。このとき、集約空データフレームは、LDにより指定される隣接ノードに送信される。すなわち、図20(b)に示す例では、集約空データフレームは、ノード装置Xへ送信される。
このように、実施形態のノード装置は、同じLDが指定された複数の空データフレームが送信キュー114に保存されているときは、それら複数の空データフレームを集約して送信する。したがって、バックトラック動作の回数が削減され、データ転送効率が改善される。
図23は、空データフレームの受信処理を示すフローチャートである。このフローチャートの処理は、ノード装置が隣接ノード装置から空データフレームまたは集約空データフレームを受信し、後述する図30のデータフレーム受信処理のステップS801aで、空データフレームまたは集約空データフレームと判定されたときに、データフレーム処理部110により実行される。ここで、空データフレームおよび集約空データフレームは、受信フレームのアドホックヘッダに設定されているフレームタイプの値により識別される。なお、このフローチャートの説明では、「空データフレーム」は、空データフレームおよび集約空データフレームの双方を含むものとする。
ステップS42において、データフレーム処理部110は、受信した空データフレームのペイロードに格納されているデータヘッダを切り出す。ここで、データヘッダのデータ長が予は決めされている。例えば、図17に示す例では、データヘッダには8バイトのGS、8バイトのGD、2バイトのFIDが格納されるので、データヘッダのデータ長は18バイトである。よって、この場合、受信した空データフレームのペイロードの先頭から18バイト単位でデータ(すなわち、各データヘッダ)が抽出される。
ステップS43において、データフレーム処理部110は、受信した空データフレーム内に集約されているデータヘッダの数をカウントする。ここでは、集約されているデータヘッダの数は「N」で表わされている。このとき、変数iが「1」に初期化される。変数iは、このフローチャートでは、空データフレームから抽出された各データヘッダを識別する。
ステップS44〜S49は、空データフレームから抽出された各データヘッダについてそれぞれ実行される。すなわち、データフレーム処理部110は、ステップS44においてi番目のデータヘッダを抽出し、ステップS45〜S48の処理を実行する。
ステップS45〜S46において、データフレーム処理部110は、i番目のデータヘッダのFIDおよびGSのペアに基づいて、FID管理テーブル105を検索する。ここで、FID管理テーブル105のエントリは、後で図29を参照しながら説明するが、最終更新時刻からエージング時間Gfが経過した時点で削除される。換言すれば、FID管理テーブル105のエントリは、最終更新時刻からエージング時間Gfが経過するまでの期間は存在している。なお、FID管理テーブル105のエージング時間Gfは、図15に示す保持期間Gに相当する。
受信空データフレームに対応するエントリがFID管理テーブル105に存在するときは、データフレーム処理部110は、ステップS47において、上述したFIDおよびGSのペアで特定されるデータフレームをバッファ部109から抽出(復元)する。なお、後で図24を参照しながら説明するが、ノード装置は、隣接ノードからデータフレームを受信すると、そのデータフレームをバッファ部109に保持する。そして、この受信データフレームのFIDおよびGSのペアを利用してFID管理テーブル105のエントリが作成される。ここで、FID管理テーブル105にエントリが存在する期間は、対応するデータフレームはバッファ部109に保持される。すなわち、上述したFIDおよびGSのペアで特定されるエントリが存在している期間(最終更新時刻からエージング時間Gfが経過するまでの期間)は、対応するデータフレームがバッファ部109により保持されている。
ステップS48において、データフレーム処理部110は、ステップS47で抽出したデータフレームに対応するACKフレームを生成し、ACKフレームの送信を送信部102に依頼する。そして、送信部102がACKフレームを、空データフレームの送信元ノード装置へ返送する。これにより、バックトラックを実行したノード装置は、バックトラックが成功したことを認識する。
FID管理テーブル105に対応するエントリが存在しないときは(ステップS46:No)、データフレーム処理部110は、ステップS47〜S48は実行されない。すなわち、この場合、空データフレームに対応する受信データフレームはないため、この受信データフレームに対応するACKフレームは、バックトラックを実行したノード装置に返送されない。
ステップS49において、データフレーム処理部110は、変数iがデータヘッダ数Nに達したか否かをチェックする。変数iがNよりも小さければ、未選択のデータヘッダが残っていると判断される。この場合、変数iがインクリメントされた後、ステップS44〜S48が実行される。すなわち、集約空データフレームから抽出された次のデータヘッダに対してステップS44〜S48の処理が実行される、一方、変数iがNに達していれば、このフローチャートの処理は終了する。
なお、バックトラック動作に際して空データフレームの集約が行われない場合には、図23のフローチャートにおいて、ステップS43、S44、S49の処理は不要である。或いは、図23のフローチャートにおいて、「N=1」が与えられるようにしてもよい。
このように、実施形態のフレーム送信方法では、ノード装置(以下、バックトラック実行ノード装置)は、OLSノード装置から受信したデータフレームの転送が不可能と判定したときは、OLSノード装置へ通常のデータフレームまたは空データフレームを送信する。OLSノード装置は、バックトラック実行ノード装置から通常のデータフレームを受信したときは、そのデータフレームを他の隣接ノード装置へ転送する。また、OLSノード装置は、バックトラック実行ノード装置から空データフレームを受信したときは、その空データフレームに対応するデータフレームをバッファ部109から取り出して他の隣接ノード装置へ転送する。このとき、OLSノード装置は、いずれのケースでも、バックトラック実行ノード装置へACKフレームを返送する。そうすると、バックトラック実行ノード装置は、バックトラック動作を終了する。
ただし、OLSノード装置は、バックトラック実行ノード装置から受信した空データフレームに対応するデータフレームがバッファ部109に格納されていなかったときは、バックトラック実行ノード装置へACKフレームを返送しない。そうすると、バックトラック実行ノード装置は、所定時間経過後、通常のデータフレームをOLSノード装置へ送信する。或いは、バックトラック動作において空データフレームを繰り返し送信する構成においては、バックトラック実行ノード装置は、所定時間経過後、再度、空データフレームをOLSノード装置へ送信するようにしてもよい。そして、バックトラック実行ノード装置は、所定回数繰り返し空データフレームを送信したにもかかわらずACKフレームを受信できなかったときに、OLSノード装置へ通常のデータフレームを送信するようにしてもよい。
なお、実施形態に係るネットワークは、空データフレームを処理可能なノード装置および空データフレームを処理できないノード装置が混在してもよい。例えば、図14に示す実施例において、ノード装置Xが空データフレームを処理できないものとする。そして、ノード装置aが、バックトラック動作において、ノード装置Xへ空データフレームを送信したものとする。この場合、ノード装置Xは、受信した空データフレームを処理できないので、ノード装置aへACKフレームを返送しない。そうすると、ノード装置aは、空データフレームを送信したときから所定時間経過後、通常のデータフレームをノード装置Xへ送信する。そして、ノード装置Xは、受信した通常のデータフレームをノード装置dへ転送する。このように、ネットワーク内に空データフレームを処理できないノード装置が設けられている場合であっても、データフレーム転送が遮断されることはない。
また、実施形態のフレーム送信方法では、バックトラック実行ノード装置(図14〜図15では、ノード装置a)は、対象データフレームのエントリ時刻からの経過時間が保持期間Gよりも短いときに空データフレームを送信する。一方、OLSノード装置(図14〜図15では、ノード装置X)は、後で図32を参照しながら説明するが、対象データフレームをバックトラック実行ノード装置へ送信した時刻(最終更新時刻)からの経過時間が保持期間Gに達するまではその対象データフレームをバッファ部109に保持ししている。ここで、各ノード装置の時計が同期しているものとすると、バックトラック実行ノード装置におけるエントリ時刻は、OLSノード装置における最終更新時刻よりも必ず後になる。このため、バックトラック実行ノード装置におけるエントリ時刻から保持期間Gが経過する前であれば、OLSノード装置に対象データフレームが保持されている可能性は高い。したがって、上記条件下でバックトラック実行ノード装置から空データフレームが送信された場合、OLSノード装置においてバッファ部109に保持されている対象データフレームが有効に利用される可能性が高い。
<各ノード装置の動作を示すフローチャート>
続いて、図24〜図41に示すフローチャートを参照して、ノード装置100の動作の詳細を説明する。
図24は、フレーム受信処理のフローチャートである。フレーム受信処理は、ノード装置100に電源が入れられると開始される。
ステップS201で受信部101は、フレームを受信するまで待機する。つまり、受信部101は、フレームを受信していなければステップS201を繰り返す。フレームを受信すると、受信部101は受信したフレームをフレーム分岐処理部106に出力し、処理はステップS202に移行する。
ステップS202では、フレーム分岐処理部106が、ステップS201で受信部101が受信したフレームのタイプフィールドの値を参照し、フレームのタイプを判定する。受信したフレームのタイプがハローフレームの場合、処理はステップS203に移行し、データフレームの場合、処理はステップS204に移行し、ACKフレームの場合、処理はステップS206に移行する。なお、バックトラック動作において使用される空データフレームおよび集約空データフレームは、特に明記しない限りは、各ノード装置において通常のデータフレームと同様に処理される。したがって、図24〜図41に係る説明において、特に明記しないときは、「データフレーム」は、空データフレームおよび集約空データフレームを含むものとする。
ステップS203では、受信されたハローフレームをフレーム分岐処理部106がリンク管理部108へ出力し、リンク管理部108が図25のハローフレーム受信処理を行う。そして処理はステップ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が中継専用装置である場合)、データフレーム受信処理は図30〜図35のとおりである。他方、ノード装置100がGSにもなりうるタイプの装置である場合、データフレーム受信処理は、図30〜図32、図41のとおりである。
データフレーム処理部110が指示にしたがってデータフレーム受信処理を行うと、処理はステップS201に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部106がデータフレーム処理部110にデータフレーム受信処理を行うよう指示したら、データフレーム受信処理の終了を待たずに処理がステップS201に移行してもよい。
また、ステップS206では、受信されたACKフレームをフレーム分岐処理部106がACK処理部107へ出力し、ACK処理部107が図37のACKフレーム受信処理を行う。そして処理はステップS201に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部106がACKフレームを出力したら、ACKフレーム受信処理の終了を待たずに処理がステップS201に移行してもよい。
図25は、図24のステップS203におけるハローフレーム受信処理のフローチャートである。図25の処理は、フレーム分岐処理部106からハローフレームがリンク管理部108に出力されると開始される。
ステップS301でリンク管理部108は、受信したハローフレームのLSと同じ値をノードIDとして持つエントリが、隣接ノード管理テーブル103(図9参照)に存在するか否かを判断する。エントリが見つかれば処理はステップS302に移行し、エントリが見つからなければ処理はステップS303に移行する。
なお、図25の説明における「受信したハローフレーム」とは、図24のステップS201で受信部101が受信したハローフレームである。つまり、図25の説明における「受信したハローフレーム」とは、ステップS202でフレーム分岐処理部106がリンク管理部108に出力して図25の処理の開始の契機となったハローフレームである。
ステップS302でリンク管理部108は、ステップS301で見つかったエントリの最終更新時刻として、現在時刻を設定する。そして、図25の処理は終了する。
例えば、ノード装置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に注目し終わっていれば、図25の処理は終了し、まだ注目していない重み付けテーブル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に戻る。
図26は、ハローフレーム送信処理のフローチャートである。図26の処理は、図24の処理とは独立して並行に、ハローフレーム生成部112により実行される。具体的には、ノード装置100に電源が入れられると、ハローフレーム生成部112が図26の処理を開始する。
ステップ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に戻る。
続いて、各種テーブルのエージング処理について図27〜図29を参照して説明する。各エージング処理は、例えば、図4のタイマIC203からの割り込み信号を契機として開始されてもよい。
図27は、隣接ノード管理テーブル103のエージング処理のフローチャートである。例えば、タイマIC203が所定の間隔Iaで割り込み信号をリンク管理部108に出力し、割り込み信号を契機としてリンク管理部108が所定の間隔Iaで図27の処理を行ってもよい。
ステップS501でリンク管理部108は、隣接ノード管理テーブル103(図9を参照)の1つ目のエントリに注目する。以下、図27に関する説明においては、リンク管理部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のすべてのエントリに注目し終わっていれば、図27の処理は終了する。他方、まだリンク管理部108が注目していないエントリが隣接ノード管理テーブル103に残っていれば、処理はステップS506に移行する。
ステップS506でリンク管理部108は、隣接ノード管理テーブル103のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップS502に戻る。
以上の図27のエージング処理により、ノード装置100は、今まで隣接ノード装置として認識していたノード装置からのハローフレームの受信が途絶えると、「当該ノード装置は、もはやノード装置100に隣接していない」と認識することができるようになる。つまり、図27の処理により、ノード装置100は、潜在的なLDの候補としての隣接ノード装置を、環境の変化に追従して適切に管理することができるようになる。
なお、上記の所定の間隔Iaおよび所定の値Gaは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。なお、第1実施形態では、ネットワーク内のすべてのノード装置に同じハローフレームの送信間隔ΔThelloが設定されており、隣接ノード管理テーブル103のエージング時間である上記の所定の値Gaは、Ga>ΔThelloを満たす。
図28は、重み付けテーブル104のエージング処理のフローチャートである。例えば、タイマIC203が所定の間隔Iwで割り込み信号をデータフレーム処理部110に出力し、割り込み信号を契機としてデータフレーム処理部110が所定の間隔Iwで図28の処理を行ってもよい。
ステップS601でデータフレーム処理部110は、重み付けテーブル104(図10と図11を参照)のうち1枚目の重み付けテーブル104−1に注目する。以下、図28に関する説明においては、データフレーム処理部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に注目し終わっていれば、図28の処理は終了する。他方、まだデータフレーム処理部110が注目していない重み付けテーブル104−j(1≦j≦M)が重み付けテーブル104の中に残っていれば、処理はステップS610に移行する。
ステップS610でデータフレーム処理部110は、重み付けテーブル104の中でまだ注目していない次の重み付けテーブル104−jに注目する(すなわち、重み付けテーブル104−jを注目テーブル104−iとして選ぶ)。そして処理はステップS602に戻る。
以上の図28のエージング処理により、ノード装置100は、「過去の障害の影響が累積されて、どの隣接ノード装置もLDとして選択することが不能となる」といった事態に陥らずに済む。
例えば、図6の例において、ステップS112の後、ノード装置N6とN7の間のリンクに障害が発生し、ノード装置N4とN7の間のリンクが障害から復旧したという状況を想定する。もし図28のエージング処理が行われないと、実際には障害からの復旧により、例えば経路〈N1,N2,N3,N4,N7〉でのデータフレームの送信が可能になっていても、自律分散協調の結果としてこの経路が選択されることがなくなってしまう。しかし、図28のエージング処理が行われれば、上記で想定した状況において、経路〈N1,N2,N3,N4,N7〉が選択されうるようになる。
なお、上記の所定の間隔Iwおよび所定の値Gwは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。
図29は、FID管理テーブル105のエージング処理のフローチャートである。例えば、タイマIC203が所定の間隔Ifで割り込み信号をデータフレーム処理部110に出力し、割り込み信号を契機としてデータフレーム処理部110が所定の間隔Ifで図29の処理を行ってもよい。
ステップS701でデータフレーム処理部110は、FID管理テーブル105(図12と図13を参照)のうち1つ目のエントリに注目する。以下、図29に関する説明においては、データフレーム処理部110が注目しているエントリを「注目エントリ」という。
続いてステップS702でデータフレーム処理部110は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Gf以上か否かを判断する。なお、実施形態によって、Gf=Ifでもよいし、Gf<Ifでもよいし、Gf>Ifでもよい。
また、図31のステップ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のすべてのエントリに注目し終わっていれば、図29の処理は終了する。他方、まだデータフレーム処理部110が注目していないエントリがFID管理テーブル105に残っていれば、処理はステップS705に移行する。
ステップS705でデータフレーム処理部110は、FID管理テーブル105のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップS702に戻る。
以上の図29のエージング処理により、「FID管理テーブル105のエントリが増え続けて記憶領域を使い尽くしてしまう」といった事態を防ぐことができる。なお、上記の所定の値Gfは、例えば、何度もバックトラックが生じる最悪ケースにおいてデータフレームがGSからGDに到達するのにかかると予測される時間の長さ以上になるよう、決められていてもよい。一般には、ネットワークの規模が大きいほど、所定の値Gfも大きく設定しておくことが望ましい。
図30〜図35は、図24のステップS205におけるデータフレーム受信処理のフローチャートである。なお、説明の便宜上、まず、ノード装置100がGSとはならいタイプである場合のデータフレーム受信処理について、図30〜図35を参照して説明する。ノード装置100がGSにもなりうるタイプの場合については、図34〜図35の部分が後述の図41の処理に置き換わる。
図24のステップS205でフレーム分岐処理部106からデータフレーム受信処理を行うよう指示されると、データフレーム処理部110は図30の処理を開始する。なお、前述のとおり、フレーム分岐処理部106からの指示は、受信したデータフレームのGSとFIDの値の通知をともなっている。
ステップS801でデータフレーム処理部110は、受信したデータフレームのLDの値が自ノードIDであるか否かを判断する。受信したデータフレームのLDの値が自ノードIDでなければ、処理はステップS802に移行し、受信したデータフレームのLDの値が自ノードIDであれば、処理はステップS801aに移行する。
なお、データフレーム受信処理の説明において、「受信したデータフレーム」とは、図24のステップS201で受信部101が受信し、ステップS204でバッファ部109に格納され、図30の処理の開始の契機となったデータフレームのことである。
また、フレーム分岐処理部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と等しい場合は、ステップS801aでデータフレーム処理部110は、受信したフレームのタイプフィールドの値を参照し、フレームのタイプが空データフレーム及び集約空データフレームのいずれかであるか否かを判定する。受信したフレームのタイプが空データフレーム及び集約空データフレームのいずれかであると判定した場合には、処理はステップS801bに移行する。
ステップS801bにおいて、受信された空データフレームまたは集約空データフレームについて、データフレーム処理部110が、上述した図23の空データフレームの受信処理を実行する。そして処理はステップS801cに移行する。
ステップS801cにおいて、データフレーム処理部110は、空データフレームの受信処理でバッファ部109から抽出(復元)したデータフレームがあるか否かを判定する。バッファ部109から抽出(復元)したデータフレームがあると判定した場合には、処理はステップS804に移行する。なお、以降はこの抽出(復元)したデータフレームを受信データフレームとして扱う。また、抽出(復元)したデータフレームが複数ある場合には、それぞれのデータフレームについて、ステップS804以降のデータフレーム受信処理が実行される。
ステップS801cで、バッファ部109から抽出(復元)したデータフレームがないと判定した場合には、データフレーム受信処理は終了する。
ステップS801aにおいて、受信したフレームのタイプが空データフレーム及び集約空データフレームのいずれかではないと判定した場合、すなわち、通常のデータフレームである場合には、ステップS803に移行する。
ステップ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と異なれば、処理は図31のステップS806に移行する。
ステップS805でデータフレーム処理部110は、上位層処理部111に、受信したデータフレームのペイロードを渡し、データフレーム受信処理を終了する。具体的には、データフレーム処理部110は、ステップS801で見つけたバッファ部109のエントリからペイロードを取り出して上位層処理部111に出力し、当該エントリをバッファ部109から削除する。そしてデータフレーム受信処理は終了する。
例えば、図6のステップS112でデータフレームをノード装置N6から受信したノード装置N7では、受信したデータフレームのペイロードは上位層処理部111−N7に出力され、上位層処理部111−N7において処理される。
図31のステップS806以降の処理は、受信したデータフレームのLDの値が自ノードIDと等しく、かつ受信したデータフレームのGDの値が自ノードIDと異なる場合に実行される。
ステップS806でデータフレーム処理部110は、受信したデータフレームのFIDとGSの値を検索キーとして用いて、FID管理テーブル105を検索する。なお、上記のように、受信したデータフレームのFIDとGSの値は、図30の処理の開始時にフレーム分岐処理部106から通知されている。
続いて、ステップS807でデータフレーム処理部110は、ステップS806の検索の結果エントリがヒットしたか否かを判断する。エントリがヒットした場合、ノード装置100が以前送信したことのあるデータフレームと同じデータフレームが受信されたということなので、処理はステップS808に移行する。他方、エントリがヒットしなかった場合、ノード装置100が送信したことのないデータフレームが受信されたということなので、処理はステップS810に移行する。
なお、正確には、「ノード装置100が以前送信したことのあるデータフレームと同じデータフレームが受信されたが、検索対象のエントリは既にエージングにより消滅してしまった」という場合も、エントリはヒットしない。このような場合が生じないように、ネットワーク内でバックトラックが繰り返される最悪の時間の見積もりなどに基づいて、適切にFID管理テーブル105のエージング時間Gfが定められることが望ましい。
ステップS808でデータフレーム処理部110は、ステップS806の検索でヒットしたFID管理テーブル105のエントリのLDとOLSの値を取り出し、例えば図4のDRAM204などの記憶領域に記憶する。
続いてステップS809でデータフレーム処理部110は、受信したデータフレームのGDの値に対応する重み付けテーブル(以下、図31〜図35の説明においては「104−i」という参照符号で参照する)を次のように更新する。すなわち、データフレーム処理部110は、重み付けテーブル104−iにおいて、ステップS808で取り出したLDに対応する重みを、最大値に変更する。なお、第1実施形態では重みの最大値は1である。重みの変更後、処理はステップS817に移行する。
なお、ステップS807、S808、S809と処理が進む場合、ステップS808で取り出したLDに対応するエントリが、受信したデータフレームのGDの値に対応する重み付けテーブル104−iに存在することが、ステップS809では保証されている。その理由は以下のとおりである。
図12と図13に関して説明したように、FID管理テーブル105のエントリにおいて最終更新時刻は、データフレームの送信時に設定される。また、図29に関して説明したように、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が実行する時点のことである。
したがって、図31のステップ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の重み付けテーブル調整処理は、詳しくは図36とともに後述するが、エージング処理の副作用を中和する処理である。
ステップ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の中に追加される。
ここで、具体例の説明から図31の処理一般の説明に戻る。ステップ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として選択可能な隣接ノード装置は残っていないので、処理は図34のステップ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内のエントリに格納されているデータフレーム、または、図23のステップS47でバッファ部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に移行する。
なお、ステップS822は、ステップS821で「Yes」と判定されたときに実行される。ここで、ステップS821で「Yes」と判定される状況は、ステップS819で送信されるデータフレームが過去に別の隣接ノード装置に送信されており、その隣接ノード装置から対応するACKフレームを受信しているときに生じる。すなわち、ステップS822が実行される時点では、FID管理テーブル105の当該エントリのACK受信フラグには「済み」が設定されているはずである。したがって、データフレーム処理部110は、ステップS819でデータフレームを送信すると、ステップS822でACK受信フラグを「NULL」に更新する。
一方、ステップS823では、データフレーム処理部110は、FID管理テーブル105に新規エントリを追加する。そして、次のステップS824でデータフレーム処理部110は、新規エントリに値を設定する。具体的には、データフレーム処理部110は、図16に示すFID管理テーブル105に作成した新規エントリにおいて、FIDフィールド、GSフィールド、LDフィールドには、それぞれステップS819で送信したデータフレームの値をコピーする。また、データフレーム処理部110は、新規エントリにおいて、エントリ時刻フィールドおよび最終更新時刻フィールドに現在時刻を設定すると共に、OLSフィールドには、ステップS810で記憶したOLSの値をコピーする。そして、処理はステップS825に移行する。なお、ACK受信フラグには「NULL」が設定され、空データ送信回数フィールドおよび通常データ送信回数フィールドには「ゼロ」が設定される。
なお、このとき記録されるエントリ時刻は、バックトラック動作において、通常データフレームを送信するか空データフレームを送信するのかを判断するために使用される。例えば、図15に示すシーケンス図および図19に示すフローチャートでは、このエントリ時刻は「時刻TE」として使用されている。
ステップS825でデータフレーム処理部110は、ステップS819における送信の成否の通知を待つ。例えば、データフレーム処理部110が、所定のプログラムのスレッドを実行する図4のMPU201により実現される場合、ステップS825ではスレッドがスリープしてもよい。その場合、「送信成功」または「送信失敗」の通知は、スレッドを起こす処理である。
ステップS819における送信が成功した場合は、ステップS819で送信したデータフレームにおいてLDとして指定されている隣接ノード装置からACKフレームが返信される。そして、ACK処理部107が後述の図37の処理を行い、データフレーム処理部110に「送信成功」を通知する。これにより、FID管理テーブル105の対応するエントリのACKフラグは「済み」に更新される。
また、ステップS819における送信の失敗とは、ステップS819で送信したデータフレームにおいてLDとして指定されている隣接ノード装置からのACKフレームが、式(5)の時刻Ttimeoutになってもノード装置100で受信されないことである。ACKフレームの受信は、ACK処理部107による後述の図38の処理により監視されており、ACKフレームがタイムアウト時刻Ttimeoutになっても受信されないと、ACK処理部107がデータフレーム処理部110に「送信失敗」を通知する。この場合、FID管理テーブル105の対応するエントリのACKフラグは「NULL」のまま保持される。
データフレーム処理部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では、少しだけ重みが調整されるのである。
なお、図32に示す手順は、図33に示す手順に置き換えられてもよい。図33に示す手順は、図32に示すステップS822およびS824を、それぞれステップS822aおよびS824aに置き換えることにより実現される。
図33に示す手順は、例えば、FID管理テーブル105がエントリ時刻を管理しない構成に適用される。このような構成においては、データフレーム処理部110は、ステップS824aにおいて、最終更新時刻フィールドに現在時刻を記録する。また、データフレーム処理部110は、ステップS822aにおいては、最終時刻フィールドを更新しない。この手順によれば、「最終更新時刻」は、データフレームを最初に隣接ノード装置へ送信した時刻を表すことになる。すなわち、この場合、「最終更新時刻」は、図16に示すエントリ時刻に相当する。そうすると、データフレーム処理部110は、バックトラック動作において通常データフレームまたは空データフレームのどちらを送信するのかの判断において、最終更新時刻を使用することができる。
上記構成によれば、FID管理テーブル105を実現するために消費されるメモリ量が削減される。ただし、この構成においては、図32に示す手順が実行される場合と比較して、FID管理テーブル105の各エントリがエージングにより削除されるタイミングが早まることがある。
ステップS818の分岐の説明に戻る。ステップS818で2つの条件(F1)と(F2)のいずれかが成立すると判断されると、もはやLDとして選択可能な隣接ノード装置は残っていないので、処理は図34のステップS830に移行する。すなわち、バックトラック動作が実行される。
ステップS830〜S831において、データフレーム処理部110は、受信したデータフレームのFIDおよびGSの値を検索キーとして用いてFID管理テーブル105を検索する。そして、データフレーム処理部110は、上記検索の結果、対応するエントリがヒットしたか否かを判断する。対応するエントリがヒットしていれば、処理はステップS832に移行し、対応するエントリがヒットしていなければ、処理はステップS849に移行する。以下では、ステップS830においてFID管理テーブル105から検索されたエントリを「対象エントリ」と呼ぶことがある。
なお、ステップS807で「エントリがヒットした」と判断されている場合に、ステップS830の検索により見つかるエントリは、ステップS806の検索により見つかったエントリである。また、ステップS807で「エントリがヒットしない」と判定され、かつステップS823において新規エントリが作成された場合は、ステップS830の検索により、ステップS823で作成された新規エントリが見つかる。
ステップS831で「エントリがヒットしない」と判断されるのは、(I1)かつ(I2)の場合であり、換言すれば、(J1)かつ(J2)の場合である。
(I1)ステップS807で「エントリがヒットしない」と判断された。
(I2)1回目にステップS818が実行された直後に、ステップS830に処理が移行した。
(J1)ノード装置100が今までに受信したことのないデータフレームが受信された。
(J2)受信したデータフレームのGSの値に対応する重み付けテーブル104−iでは、すべてのLDに最大値の重みが対応付けられている。
ステップS832において、データフレーム処理部110は、バックトラック動作に係わる変数を初期化する。具体的には、FID管理テーブル105において、受信フレームのFIDおよびGDのペアにより特定されるエントリの空データ送信回数および通常データ送信回数が「ゼロ」に初期化される。
ステップS833〜S834において、データフレーム処理部110は、対象エントリの空データ送信回数が、予め決められた上限回数以内であるかチェックする。空データ送信回数の上限回数は、特に限定されるものではないが、例えば「3」である。そして、空データ送信回数が上限回数以内であれば、処理はステップS835に移行する。一方、空データ送信回数が上限回数を超えていれば、処理はステップS840に移行する。
ステップS835において、データフレーム処理部110は、FID管理テーブル105の対応するエントリからエントリ時刻TEを抽出する。なお、エントリ時刻TEは、S824において記録された時刻を表す。すなわち、エントリ時刻TEは、この実施例では、ノード装置が隣接ノード装置から受信したデータフレームを最初に他の隣接ノード装置へ転送した時刻を表している。
ステップS836〜S837において、データフレーム処理部110は、ステップS201で受信したデータフレームがOLSノード装置に保持されているか否かを判断する。具体的には、「T−TE」とバッファ部109の保持時間Gとが比較される。「T」は現在時刻である。TEは、上述したエントリ時刻である。すなわち、「T−TE」は、エントリ時刻から現在時刻までの経過時間を表す。また、Gは、各ノード装置においてデータフレームがバッファ部109に保持されている期間を表し、各ノード装置において共通である。
「T−TE」が保存時間Gよりも短いときは、ステップS201で受信したデータフレームがOLSノード装置に保持されていると判断される。この場合、処理はステップS838に移行する。一方、「T−TE」が保存時間G以上であるときは、ステップS201で受信したデータフレームがOLSノード装置に保持されていないと判断される。この場合、処理はステップS840に移行する。
ステップS838において、データフレーム処理部110は、OLSノード装置へ送信する空データフレームを作成し、送信キュー114に保存する。このとき、この空データフレームのLDには、FID管理テーブル105の対象エントリに記録されているOLSが設定される。また、この空データフレームのペイロードには、ステップS201で受信したデータフレームのデータヘッダのみが格納される。さらに、データフレーム処理部110は、FID管理テーブル105の対象エントリの最終更新時刻に、現在時刻を書き込む。
ステップS839において、データフレーム処理部110は、FID管理テーブル105の対象エントリの空データ送信回数をインクリメントする。このように、データフレーム処理部110は、空データ送信回数が上限回数以下であり、且つ、エントリ時刻TEからの経過時間が保持時間Gよりも短いときに、空データフレームを作成して送信キュー114に保存する。
空データ送信回数が上限回数を超えている場合、或いは、エントリ時刻TEからの経過時間が保持時間G以上である場合は、ステップS840の処理が実行される。ステップS840において、データフレーム処理部110は、データフレーム処理部110は、OLSノード装置へ送信する通常データフレームを作成し、送信キュー114に保存する。このとき、この通常データフレームのLDには、FID管理テーブル105の対象エントリに記録されているOLSが設定される。また、この通常データフレームのペイロードは、ステップS201で受信したデータフレームのペイロードと同じである。さらに、データフレーム処理部110は、FID管理テーブル105の対象エントリの最終更新時刻に、現在時刻を書き込む。
ステップS841において、データフレーム処理部110は、FID管理テーブル105の対象エントリの通常データ送信回数をインクリメントする。このように、データフレーム処理部110は、空データ送信回数が上限回数を超えているとき、或いは、エントリ時刻TEからの経過時間が保持時間G以上であるときは、通常データフレームを作成して送信キュー114に保存する。
この結果、送信キュー114には、送信待ちのフレーム(通常データフレーム、空データフレームを含む)が保存される。このとき、データフレーム処理部110は、ステップS205のデータフレーム受信処理とは独立して、例えば定期的に、図21〜図22に示す空データフレーム集約処理を実行する。したがって、送信キュー114には、集約空データフレームが保存されていることもある。
送信キュー114に保存されているフレームは、送信部102により定期的に読み出されて送信される。或いは、送信部102は、他の契機に応じて送信キュー114に保存されているフレームを送信するようにしてもよい。ただし、送信部102は、図21〜図22に示す空データフレームの集約処理が実行されている期間は、送信キュー114にアクセスできない。
送信部102は、送信キュー114に保存されているフレームを、そのフレームのアドホックヘッダに設定されているLDへ送信する。そして、隣接ノード装置は、このフレームを受信すると、ACKフレームを返送する。
データフレーム処理部110は、ステップS842〜S843において、送信部102によるフレーム送信の成否を確認する。すなわち、データフレーム処理部110は、所定時間内に、ステップS838で作成した空データフレームまたはステップS840で作成した通常データフレームに対応するACKフレームをOLSノード装置から受信するか否かをチェックする。なお、この「所定時間」は、バッファ部109の保持時間Gと比較して十分に短いものとする。
データフレーム処理部110は、上記ACKフレームを受信すると、フレーム送信が成功したものと判定する。この場合、処理はステップS844に移行する。一方、データフレーム処理部110は、所定時間内に上記ACKフレームを受信できなかったときは、フレーム送信が失敗したものと判定する。この場合、処理はステップS846に移行する。
ステップS844において、データフレーム処理部110は、重み付けテーブル104において、ステップS838で作成した空データフレームまたはステップS840で作成した通常データフレームのGDおよびLDの値の組に対応する重みを小さくする。換言すれば、データフレーム処理部110は、受信したデータフレームのGDに対応する重み付けテーブル104−iにおいて、送信したデータフレームのLD(つまりステップS808またはS810で記憶したOLS)に対応する重みを更新する。
ステップS844の詳細はステップS827と同様なので詳しい説明は省略するが、データフレーム処理部110は、例えば式(6)を使って重みを更新してもよい。また、データフレーム処理部110は、重み付けテーブル104−iの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
ステップS838またはS840で作成したフレームの送信に失敗した場合(ステップS843:No)、ステップS846およびS847の処理が実行される。すなわち、データフレーム処理部110は、FID管理テーブル105の対象エントリの通常データ送信回数が、予め決められた上限回数以上か否かをチェックする。ここで、通常データ送信回数の上限回数は、特に限定されるものではないが、例えば「3」である。
対象エントリの通常データ送信回数が上限回数に達していれば、データフレーム処理部110は、ステップS848において、ステップS201で受信したデータフレームをバッファ部109から削除する。この場合、バックトラック動作は終了する。
対象エントリの通常データ送信回数が上限回数に達していなければ、処理はステップS833に戻る。すなわち、ステップS838またはS840で作成したフレームの送信に失敗すると、ステップS833以降の処理が、再度、実行される。
このように、実施形態のノード装置は、エントリ時刻TEからの経過時間がバッファ部109の保持時間Gに達するまでは、バックトラック動作において、OLSノード装置へ空データフレームを送信する。このとき、空データフレームの送信は、上限回数に達するまで繰り返し実行される。ただし、OLSノード装置により空データフレームが受信されことが検出されると、バックトラック動作は終了する。また、実施形態のノード装置は、エントリ時刻TEからの経過時間がバッファ部109の保持時間Gを超えた後、或いは、空データフレームの送信回数が上限回数に達した後は、バックトラック動作において、OLSノード装置へ通常データフレームを送信する。このとき、通常データフレームの送信は、上限回数に達するまで繰り返し実行される。ただし、OLSノード装置により通常データフレームが受信されたことが検出されると、バックトラック動作は終了する。
FID管理テーブル105に対象エントリが存在しないときは(ステップS831:No)、データフレーム処理部110は、ステップS849において、OLSが存在しないと判断する。すなわち、通信路がループを形成していると判定される。そして、データフレーム処理部110は、ステップS850において、ステップS201で受信したデータフレームをバッファ部109から削除する。この場合、バックトラック動作は終了する。
続いて、図36を参照して、図31のステップS812aの重み付けテーブル調整処理の詳細を説明する。なお、図36の重み付けテーブル調整処理は、後述の図39のステップS1108aでも呼び出される。図36の説明において「ヒットした重み付けテーブル104−i」とは、図31のステップS811の検索または図39のステップS1107の検索でヒットしたテーブルを意味する。
ステップS861でデータフレーム処理部110は、隣接ノード管理テーブル103(図9参照)の1つ目のエントリに注目する。なお、以下の図36の説明において、データフレーム処理部110が注目している隣接ノード管理テーブル103のエントリを「注目エントリ」という。
次に、ステップS862では、ヒットした重み付けテーブル104−iに注目エントリのノードIDの値をLDとして含むエントリがあるか否かを、データフレーム処理部110が判断する。ヒットした重み付けテーブル104−iに、注目エントリのノードIDの値をLDとして含むエントリがあれば、処理はステップS865に移行する。逆に、ヒットした重み付けテーブル104−iに、注目エントリのノードIDの値をLDとして含むエントリがなければ、処理はステップS863に移行する。
ステップS863でデータフレーム処理部110は、ヒットした重み付けテーブル104−iに新規エントリを追加する。続いて、ステップS864でデータフレーム処理部110は、ステップS863で重み付けテーブル104−iに追加した新規エントリに値を設定する。つまり、データフレーム処理部110は、新規エントリにおいて、隣接ノード管理テーブル103の注目エントリのノードIDの値をLDフィールドに、初期重み付け値を重みフィールドに、現在時刻を最終更新時刻フィールドに、それぞれ設定する。
なお、ステップS864における初期重み付け値は、図25のステップS308における初期重み付け値とは異なる。具体的には、ステップS864での初期重み付け値は、ヒットした重み付けテーブル104−iの重みフィールドにおいて、1未満の重みのうちの最大値である。
例えば、ヒットした重み付けテーブル104−iの重みフィールドに4つのエントリが存在し、それぞれの重みフィールドの値が0.4、0.7、1、および0.5であれば、ステップS864での初期重み付け値は、0.7である。なお、ヒットした重み付けテーブル104−iの重みフィールドの値が、全エントリで1の場合は、ステップS864での初期重み付け値は、1未満の任意の値であり、例えば図25のステップS308での初期重み付け値と同様に0.5でもよい。
以上のような初期重み付け値をステップS864で用いることにより、重み付けテーブル104−iの既存のエントリに反映されている学習結果が優先的に考慮される。その結果、経路が必要以上に変動することがなくなり、換言すれば、経路が安定する。
例えば、4つのエントリの重みフィールドの値がそれぞれ0.4、0.7、1、および0.5である上記の例において、ステップS864で初期重み付け値として図25のステップS308と同様に0.5が使われるとする。すると、重みが何も学習されていない隣接ノード装置(すなわちステップS863で追加された新規エントリにLDとしてノードIDが記録されている隣接ノード装置)が、重みが0.7の隣接ノード装置よりも優先的にLDとして選択されてしまう。つまり、今までの学習の蓄積としての重み0.7が無視されてしまう。
そこで、第1実施形態では、重みが何も学習されていない隣接ノード装置が、重みが学習済みの隣接ノード装置よりも優先的にLDとして選択されることを防ぎ、今までの学習結果を優先的に考慮するために、上記のように定義される初期重み付け値が利用される。
ステップS865でデータフレーム処理部110は、隣接ノード管理テーブル103にまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部110が隣接ノード管理テーブル103のすべてのエントリに注目し終えていれば、図36の処理は終了する。他方、まだデータフレーム処理部110が注目していないエントリが隣接ノード管理テーブル103に残っていれば、処理はステップS866に移行する。
そして、ステップS866でデータフレーム処理部110は、隣接ノード管理テーブル103のまだ注目していないエントリのうち、次のエントリに注目する。そして処理はステップS862に戻る。
なお、図36の処理の意義は以下のとおりである。
重み付けテーブル104−iにおけるエントリごとのエージング処理の副作用として、図36の処理の直前には、次のような状況の可能性もある。すなわち、隣接ノード管理テーブル103に登録されているある隣接ノード装置のノードIDを、LDとして有するエントリが、重み付けテーブル104−iに存在しない可能性がある。
ここで、ノード装置100の隣接ノード装置は、データフレームを送信する際にデータフレーム処理部110が選択するLDの潜在的な候補である。よって、ヒットした重み付けテーブル104−iのLDフィールドにおいて全隣接ノード装置が網羅されるようにすることが、ノード装置100の適切な動作のためには望ましい。
以上の図36の重み付けテーブル調整処理によれば、エージング処理の副作用として生じる可能性のある上記のような状況が解消される。つまり、隣接ノード管理テーブル103に登録されているすべてのノードIDが、ヒットした重み付けテーブル104−iにLDとして登録されていることが、保証される。
以上、図30〜図36を参照して、図24のステップS205におけるデータフレーム受信処理について詳しく説明した。続いて、データフレーム受信処理のステップS826およびS843における送信成否の通知に関連する処理について、図37および図38を参照して説明する。
図37は、図24のステップS206におけるACKフレーム受信処理のフローチャートである。図37の処理は、フレーム分岐処理部106からACKフレームがACK処理部107に出力されると開始される。
ステップS901でACK処理部107は、フレーム分岐処理部106から受け取ったACKフレームのLDの値が自ノードIDと等しいか否かを判断する。ACKフレームのLDの値が自ノードIDと等しければ、処理はステップS902に移行し、ACKフレームのLDの値が自ノードIDと異なれば、図37の処理は終了する。ACK処理部107も、例えばフラッシュメモリ205などに予め格納された自ノードIDを参照することができる。
例えば、図6のステップS105でノード装置N4が送信したデータフレームに対するACKフレームを、図42にステップS105aとして示すようにノード装置N5が送信すると、無関係なノード装置N3もACKフレームを受信する。なぜなら、ノード装置N3はノード装置N5に隣接しているからである。
しかし、ノード装置N3のACK処理部107−N3は、ステップS901の判断の結果、直ちに図37の処理を終了するので、ノード装置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が図37の処理を行う場合について詳しく説明すると、以下のとおりである。
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で特定した送信済みのデータフレームに関して、データフレーム処理部110に「送信成功」を通知する。そして、図37の処理は終了する。
例えば、データフレーム処理部110は、図4のMPU201がプログラムを実行することにより実現されていてもよい。その場合、MPU201をデータフレーム処理部110として機能させるスレッドは、データフレームの送信後、ACKフレームを受信するまでスリープしていてもよい。ステップS903における「送信成功」の通知は、スリープしているスレッドを起こす処理である。
また、ステップS903の通知は、ステップS902で特定したデータフレームのGSとFIDの値の通知をともなう。例えば上記の例においては、ACK処理部107−N2は、データフレーム303を識別するためのGSとFIDの値(すなわちN1とFa)も、データフレーム処理部110に通知する。
なお、ステップS902において特定されたデータフレームは、バッファ部109から削除可能な状態にされる。ただし、バッファ部109において、データフレームは、対応するACKフレームの受信時に即座に削除可能な状態にされるのではなく、FID管理テーブル105の対応するエントリが削除された後に、削除可能な状態にされる。「削除可能」とは、他のデータにより上書きされることを許容する状態を意味する。
図38は、ACKフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。図38の処理は、例えば、図4のタイマIC203が所定の間隔で発生させる割り込み信号を契機として、定期的に行われる。
ステップS1001でACK処理部107は、バッファ部109(図8を参照)の1つ目のエントリに注目する。以下、図38に関する説明においては、ACK処理部107が注目しているバッファ部109のエントリを「注目エントリ」という。
続いてステップS1002でACK処理部107は、現在時刻と注目エントリのタイムアウト時刻フィールドの値を比較する。そして、現在時刻がタイムアウト時刻以降であれば、処理はステップS1003に移行する。他方、現在時刻がまだタイムアウト時刻に達していなければ、処理はステップS1005に移行する。
ステップS1003でACK処理部107は、バッファ部109の注目エントリに格納されているデータフレームに関して、「送信失敗」をデータフレーム処理部110に通知する。ステップS1003の通知は、図37のステップS903の通知と同様に、具体的には、例えばスリープしているスレッドを起こす処理であってもよい。
また、ステップS903の通知と同様に、ステップ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のすべてのエントリに注目し終わっていれば、図38の処理は終了する。他方、まだACK処理部107が注目していないエントリがバッファ部109に残っていれば、処理はステップS1006に移行する。
ステップS1006でACK処理部107は、バッファ部109の中でまだ注目していない次のエントリに注目する。そして処理はステップS1002に戻る。
ところで、図30〜図35を参照して説明したデータフレーム受信処理は、上記のとおり、ノード装置100がGSとならないタイプのノード装置である場合の例である。以下では、図39〜図41を参照して、GSとなりうるタイプのノード装置に特有の処理について説明する。
図39および図40は、ノード装置100がGSとなってデータフレームを送信する場合の送信処理のフローチャートである。図39の処理は、上位層処理部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は、図36の重み付けテーブル調整処理を行い、エージング処理の副作用を中和する。そして、処理はステップS1110に移行する。
ステップS1109でデータフレーム処理部110は、ステップS1101で指定されたGDの値に対応する新規重み付けテーブルを重み付けテーブル104の中に追加する。具体的には、データフレーム処理部110は、ステップS1109において、図31のステップS813〜S816と類似の処理を行う。
すなわち、データフレーム処理部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などの記憶領域に記憶する。
続いて、処理は図40のステップS1111に移行し、ステップS1111でデータフレーム処理部110は、下記の2つの条件(K1)と(K2)のいずれかが成立するか否かを判断する。
(K1)ステップS1110で取得したLDの値に対応する重みが、重みの最大値(第1実施形態では、具体的には1.0)である。
(K2)重み付けテーブル104−iに登録されているすべてのLDへの送信が、いずれも失敗した。
条件(K1)または(K2)が成立する場合、もはやLDとして選択可能な隣接ノード装置は残っていないので、処理はステップS1112に移行する。
他方、条件(K1)と(K2)のいずれも成立しない場合、まだLDとして選択可能な隣接ノード装置が残っている。換言すれば、データフレーム受信処理のステップS818に関して説明した(G1)〜(G3)のいずれにも該当しない隣接ノード装置が、少なくとも1つは存在する。そして、LDとして選択可能な隣接ノード装置のノードIDが、ステップS1110(または後述のステップS1125)で取得されている。そこで、ステップS1111で条件(K1)と(K2)のいずれも成立しないと判断されると、処理はステップS1114に移行する。
条件(K1)または(K2)が成立する場合、ステップS1112でデータフレーム処理部110は、データフレームを破棄する。つまり、データフレーム処理部110は、ステップS1106で新たに作成してデータフレームを格納したエントリを、バッファ部109から削除する。
そして、続くステップS1113でデータフレーム処理部110は、上位層処理部111に「送信失敗」を通知する。つまり、データフレーム処理部110は、どの隣接ノード装置にもデータフレームを成功裡に送信することはできなかったことを、上位層処理部111に通知する。そして図39〜図40の処理が終了する。
他方、ステップS1111において、条件(K1)と(K2)のいずれも成立しないと判断されると、取得済みの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の詳細は、図32のステップ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の、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、図39〜図40の処理は終了する。
逆に、送信が失敗した場合、ステップS1124でデータフレーム処理部110は、重み付けテーブル104において、ステップS1114で送信したデータフレームのGDとLDの組に対応する重みを大きくする。
つまり、データフレーム処理部110は、上位層処理部111から指定されたGDの値に対応する重み付けテーブル104−iにおいて、送信したデータフレームのLDに対応する重みを、例えば式(7)を使って更新する。
なお、データフレーム処理部110はステップS1124でさらに、送信したデータフレームのLDの値を、例えば図4のDRAM204などのワークエリアに「送信に失敗したLD」として記憶する。図32のステップ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に戻る。
図41は、GSにもなりうるノード装置100が、データフレーム受信処理の一部として図34〜図35の処理の代わりに行う処理のフローチャートである。
ノード装置100がGSにもなりうるノード装置である場合、データフレーム受信処理におけるステップS801〜S829は、ノード装置100がGSにはならない場合と同様であり、図30〜図32に示したとおりである。しかし、ノード装置100がGSにもなりうるノード装置の場合は、図32のステップS818においてデータフレーム処理部110が「条件(F1)と(F2)のいずれかが成立する」と判断すると、処理は図41のステップS871に移行する。
ステップS871において、データフレーム処理部110は、受信したデータフレームのGSの値が自ノードIDであるか否かを判断する。受信したデータフレームのGSの値が自ノードIDに一致すれば、処理はステップS872に移行する。一方、受信したデータフレームのGSの値が自ノードIDと異なっていれば、処理はステップS874に移行する。なお、ステップS874は、実施形態のフレーム送信方法によるバックトラック動作であり、基本的に、図34〜図35に示すステップS830〜S850と同じである。よって、ステップS874の処理は省略する。
ステップS872においてデータフレーム処理部110は、上位層処理部111に「送信失敗」を通知する。通知にあたって、データフレーム処理部110は、例えば受信したデータフレームからペイロードを取り出し、ペイロードまたはペイロードの一部を上位層処理部111に出力してもよい。すると、上位層処理部111は、どのデータの送信に失敗したのかを、データフレーム処理部110から受け取ったペイロードの内容に基づいて認識することができる。
ステップS873において、データフレーム処理部110は、受信したデータフレームを破棄する。すなわち、データフレーム処理部110は、ステップS801で見つけたエントリをバッファ部109から削除する。なお、ステップS873は、下記の(L1)または(L2)において実行される。
(L1)ノード装置100自身がGSとなって送信したデータフレームがバックトラックによりノード装置100に戻ってきて受信されたのであり、かつ、ノード装置100の隣接ノード装置はすべて(L1−1)または(L1−2)である。
(L1−1)最大値の重みと対応付けられている。
(L1−2)LDとして指定してデータフレームを送信すると、送信に失敗する。
(L2)受信したデータフレームのGSは、ノード装置100以外の他のノード装置であり、かつ、OLS以外のすべての隣接ノード装置が(L2−1)または(L2−2)であり、かつ、OLSへのデータフレームの送信は失敗した。
(L2−1)最大値の重みと対応付けられている。
(L2−2)LDとして指定してデータフレームを送信すると、送信に失敗する。
図42は、ハローフレームの送受信による隣接ノードの認識および図6の経路選択を示すタイミングチャートである。
図1のネットワーク1において、各ノード装置N1〜N7は、独立してそれぞれ図26のハローフレーム送信処理を行う。どのノード装置が先にハローフレームを送信するかは任意であるが、図42の例では、まずステップS1201でノード装置N2が図26のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N2に隣接するノード装置N1、N3、およびN6でそれぞれ受信される。そして、ノード装置N1、N3、およびN6は、それぞれ図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N2を隣接ノード装置として認識する。
また、図42の例では、続いてステップS1202で、ノード装置N4が図26のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N4に隣接するノード装置N3、N5、およびN7でそれぞれ受信される。そして、ノード装置N3、N5、およびN7は、それぞれ図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N4を隣接ノード装置として認識する。
さらに、ステップS1203では、ノード装置N3が図26のステップS403を実行し、図7のハローフレーム312を送信する。すると、ハローフレーム312はノード装置N3に隣接するノード装置N2、N4、およびN5でそれぞれ受信される。そして、ノード装置N2、N4、およびN5は、それぞれ図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N3を隣接ノード装置として認識する。
また、ステップS1204では、ノード装置N7が図26のステップS403を実行し、ハローフレームを送信する。なお、ステップS1204の時点では、ノード装置N4とN7の間のリンクには障害がまだ生じていないものとする。よって、ハローフレームはノード装置N7に隣接するノード装置N4とN6でそれぞれ受信される。そして、ノード装置N4とN6は、それぞれ図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N7を隣接ノード装置として認識する。
また、ステップS1205では、ノード装置N1が図26のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N1に隣接するノード装置N2で受信される。そして、ノード装置N2は、図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N1を隣接ノード装置として認識する。
さらに、ステップS1206では、ノード装置N6が図26のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N6に隣接するノード装置N2とN7でそれぞれ受信される。そして、ノード装置N2とN7は、それぞれ図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N6を隣接ノード装置として認識する。
そして、ステップS1207では、ノード装置N5が図26のステップS403を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置N5に隣接するノード装置N3とN4でそれぞれ受信される。そして、ノード装置N3とN4は、それぞれ図24のステップS203で図25のハローフレーム受信処理を呼び出して実行し、ノード装置N5を隣接ノード装置として認識する。
以上のステップS1201〜S1207により、図1および図6に示すネットワーク1内のノード装置N1〜N7は、それぞれ隣接ノード装置を認識し、隣接ノード管理テーブル103−N1〜103−N7を更新する。また、図25に示すように、ノード装置N1〜N7は、ハローフレームの受信を契機として、場合によっては重み付けテーブル104−N1〜104−N7)を更新することもある。
その後、ステップS1208でノード装置N4とN7の間のリンクに障害が発生するものとする。また、上記障害の発生とは関係なく、ステップS101でノード装置N1が、ノード装置N7をGDとして指定するデータフレームを、ノード装置N2をLDとして指定して送信する。つまり、ステップS101でノード装置N1は、図39〜図40に示すフレーム送信処理を行う。
すると、データフレームを受信したノード装置N2は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N2がACKフレームを送信することが、図42ではステップS101aとして表現されている。
他方、ノード装置N1は、図40のステップS1121でACKフレームの受信を待っている。そして、ノード装置N1は、ステップS101aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS1121の待機を終え、ステップS1122とS1123を実行し、図40の処理を終える。
また、ステップS101aに示すように図30のステップS803でACKフレームを送信したノード装置N2は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N3を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS102に相当する。なお、図7には、ステップS102で送信されるデータフレーム303が例示されている。
すると、データフレームを受信したノード装置N3は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N3がACKフレームを送信することが、図42ではステップS102aとして表現されている。なお、図7には、ステップS102aで送信されるACKフレーム322が例示されている。
他方、ノード装置N2は、図32のステップS825でACKフレームの受信を待っている。そして、ノード装置N2は、ステップS102aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図32の処理を終える。
また、ステップS102aに示すように図30のステップS803でACKフレームを送信したノード装置N3は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N4を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS103に相当する。なお、図7には、ステップS103で送信されるデータフレーム304が例示されている。
すると、データフレームを受信したノード装置N4は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N4がACKフレームを送信することが、図42ではステップS103aとして表現されている。
他方、ノード装置N3は、図32のステップS825でACKフレームの受信を待っている。そして、ノード装置N3は、ステップS103aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図32の処理を終える。
また、ステップS103aに示すように図30のステップS803でACKフレームを送信したノード装置N4は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N7を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS104に相当する。
しかし、ステップS1208でノード装置N4とN7の間のリンクには障害が発生しており、データフレームはノード装置N7に到達しない。そのため、図42ではステップS104の矢印は、途中から破線になっている。
ノード装置N4は、図32のステップS825でACKフレームの受信を待っている。しかし、ノード装置N7からACKフレームが受信されないため、ノード装置N4は、定期的に実行している図38の処理のステップS1003において、ノード装置N7へのデータフレームの送信が失敗したと認識する。
その結果、ノード装置N4は、ステップS825の待機を終え、ステップS826、S828、S829、S818の処理を順に実行する。そして、ノード装置N4は、続くステップS819において、LDとしてノード装置N5を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS105に相当する。
すると、データフレームを受信したノード装置N5は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N5がACKフレームを送信することが、図42ではステップS105aとして表現されている。
他方、ノード装置N4は、図32のステップS825でACKフレームの受信を待っている。そして、ノード装置N4は、ステップS105aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図32の処理を終える。
また、ステップS105aに示すように図30のステップS803でACKフレームを送信したノード装置N5は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N3を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS106に相当する。
すると、データフレームを受信したノード装置N3は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N3がACKフレームを送信することが、図42ではステップS106aとして表現されている。
他方、ノード装置N5は、図32のステップS825でACKフレームの受信を待っている。そして、ノード装置N5は、ステップS106aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図32の処理を終える。
また、ステップS106aに示すように図30のステップS803でACKフレームを送信したノード装置N3は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N5を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS107に相当する。
すると、データフレームを受信したノード装置N5は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N5がACKフレームを送信することが、図42ではステップS107aとして表現されている。
他方、ノード装置N3は、図32のステップS825でACKフレームの受信を待っている。そして、ノード装置N3は、ステップS107aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図32の処理を終える。
また、ステップS107aに示すように図30のステップS803でACKフレームを送信したノード装置N5は、ステップS804以降の処理を続行する。具体的には、処理が図32のステップS818から図34のステップS830へと進み、ノード装置N5は、OLSであるノード装置N4をLDとして指定してデータフレームを送信する。このフレーム送信が、図42のステップS108に相当する。このとき、ノード装置N4にデータフレームが保存されていると見込まれるときは、ノード装置N5は、通常のデータフレームの代わりに空データフレームを送信する。このように、ノード装置N5は、バックトラック動作により、ノード装置N4へ通常のデータフレームまたは空データフレームを送信する。
すると、データフレームを受信したノード装置N4は、図24のステップS205から図30〜図35の処理を呼び出して実行する。このとき、ノード装置N4は、空データフレームを受信したときは、対応するデータフレームをバッファ部109から抽出する。図30のステップS803でノード装置N4がACKフレームを送信することが、図42ではステップS108aとして表現されている。
他方、ノード装置N5は、図35のステップS842でACKフレームの受信を待っている。そして、ノード装置N5は、ステップS108aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS842の待機を終え、ステップS844を実行し、図34〜図35の処理を終える。
また、ステップS108aに示すように図30のステップS803でACKフレームを送信したノード装置N4は、ステップS804以降の処理を続行する。具体的には、処理が図32のステップS818から図34のステップS830へと進み、ノード装置N4は、OLSであるノード装置N3をLDとして指定してデータフレームを送信する。このフレーム送信が、図42のステップS109に相当する。このとき、ノード装置N3にデータフレームが保存されていると見込まれるときは、ノード装置N4は、通常のデータフレームの代わりに空データフレームを送信する。このように、ノード装置N4は、バックトラック動作により、ノード装置N3へ通常のデータフレームまたは空データフレームを送信する。
すると、データフレームを受信したノード装置N3は、図24のステップS205から図30〜図35の処理を呼び出して実行する。このとき、ノード装置N3は、空データフレームを受信したときは、対応するデータフレームをバッファ部109から抽出する。図30のステップS803でノード装置N3がACKフレームを送信することが、図42ではステップS109aとして表現されている。
他方、ノード装置N4は、図35のステップS842でACKフレームの受信を待っている。そして、ノード装置N4は、ステップS109aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS842の待機を終え、ステップS844を実行し、図34〜図35の処理を終える。
また、ステップS109aに示すように図30のステップS803でACKフレームを送信したノード装置N3は、ステップS804以降の処理を続行する。具体的には、処理が図32のステップS818から図34のステップS830へと進み、ノード装置N3は、OLSであるノード装置N2をLDとして指定してデータフレームを送信する。このフレーム送信が、図42のステップS110に相当する。このとき、ノード装置N2にデータフレームが保存されていると見込まれるときは、ノード装置N3は、通常のデータフレームの代わりに空データフレームを送信する。このように、ノード装置N3は、バックトラック動作により、ノード装置N2へ通常のデータフレームまたは空データフレームを送信する。
すると、データフレームを受信したノード装置N2は、図24のステップS205から図30〜図35の処理を呼び出して実行する。このとき、ノード装置N2は、空データフレームを受信したときは、対応するデータフレームをバッファ部109から抽出する。図30のステップS803でノード装置N2がACKフレームを送信することが、図42ではステップS110aとして表現されている。
他方、ノード装置N3は、図35のステップS842でACKフレームの受信を待っている。そして、ノード装置N3は、ステップS110aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS842の待機を終え、ステップS844を実行し、図34〜図35の処理を終える。
また、ステップS110aに示すように図30のステップS803でACKフレームを送信したノード装置N2は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N6を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS111に相当する。
すると、データフレームを受信したノード装置N6は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N6がACKフレームを送信することが、図42ではステップS111aとして表現されている。
他方、ノード装置N2は、図32のステップS825でACKフレームの受信を待っている。そして、ノード装置N2は、ステップS111aで送信されるACKフレームを受信すると、図24のステップS206から図37の処理を呼び出して実行し、その結果、ステップS825の待機を終え、ステップS826とS827を実行し、図32の処理を終える。
また、ステップS111aに示すように図30のステップS803でACKフレームを送信したノード装置N6は、ステップS804以降の処理を続行し、図32のステップS819で、LDとしてノード装置N7を指定してデータフレームを送信する。ステップS819での送信が、図42のステップS112に相当する。
すると、データフレームを受信したノード装置N7は、図24のステップS205から図30〜図35の処理を呼び出して実行する。図30のステップS803でノード装置N7がACKフレームを送信することが、図42ではステップS112aとして表現されている。
以上説明した一連の処理により、ネットワーク1全体では、たとえステップS1208で障害が発生しようとも、ノード装置N1〜N7の自律分散協調の結果として、動的に経路〈N1,N2,N6,N7〉が選択され、学習される。すなわち、以上の一連の処理によりノード装置N1〜N6では重み付けテーブル104−N1〜104−N6が更新されている。
したがって、ステップS112aの後には、学習の結果として、ノード装置N7をGDとして指定するデータフレームは、図6のようにネットワーク1内で試行錯誤的にバックトラックしながら転送される代わりに、初めから効率よく転送される。
続いて、第2実施形態について説明する。第2実施形態では、ノード装置間が有線接続されている。
第1実施形態では、図3の受信部101と送信部102が図4の無線モジュール206により実現され、ノード装置間は無線リンクにより接続される。すなわち、第1実施形態は、無線アドホックネットワークを想定している。これに対して、第2実施形態では、例えば図1または図2に示すネットワークのノード装置間が有線リンクで接続される。すなわち、第2実施形態は、有線アドホックネットワークを想定している。以下、第2実施形態の具体例について、図43〜図44を参照して説明する。
図43は、第2実施形態が適用される有線ネットワークの例を示す図である。図43のネットワーク4は、複数のノード装置100a〜100iを含み、有線アドホックネットワークの一例である。まず、ノード装置100aの構成の概略を説明する。
なお、ノード装置100a〜100iの構成は同様である。互いに同様のコンポーネントには、「211a−1」、「211a−2」、「211b−1」などのように、添え字を除いて同じ参照符号を割り当て、詳しい説明を省略することがある。
ノード装置100a〜100iは、無線モジュール206により実現される図3の受信部101および送信部102の代わりに、有線通信のための物理ポート(以下単に「ポート」という)とPHYチップにより実現される不図示の受信部および送信部を有する。図43の例では、ノード装置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チップが複数のポートの入出力処理を行うことも可能である。
また、第2実施形態では、ACKフレームとハローフレームが使われない。よって、ノード装置100aは、図3のACK処理部107とハローフレーム生成部112を含まない。また、第2実施形態では、フレーム分岐処理部106、リンク管理部108、データフレーム処理部110の動作の一部が、第1実施形態とは異なる。さらに、第2実施形態では、図9に示す第1実施形態の隣接ノード管理テーブル103の代わりに、図44に示す隣接ノード管理テーブル103aが使われる。第2実施形態では、隣接ノード管理テーブル103aにより、隣接ノード装置との接続に使用されるポートを識別するポートIDも管理される。
ところで、第1実施形態では、外部ネットワークとの接続のためにノード装置100が図4のPHYチップ202を備えている場合を例示した。第2実施形態のノード装置100aも同様に、外部ネットワークとの接続のため、汎用LANポート212aを備えている。
汎用LANポート212aは、例えばイーサネット規格にのっとった有線接続用の物理ポートであり、不図示のPHYチップと接続されている。図43では、汎用LANポート212a〜212iを斜線で示して、ポート211a−1〜211i−4とは区別してある。なお、本実施形態における汎用LANポート212a〜212iは有線LANポートであるが、実施形態によっては無線LANインタフェイスを代わりに用いることもできる。
そして、上記のごとき構成を有する各ノード装置100a〜100iは、ネットワーク4において、ケーブル(例えば、銅ケーブルなどの金属線ケーブル、または光ファイバケーブル)により、物理的にはメッシュ状(換言すれば格子状)に接続されている。もちろん、ネットワークにおける物理的な接続トポロジは、実施形態に応じて任意であり、必ずしもメッシュ状でなくてもよい。
図43に示すメッシュ状の物理的なトポロジは、この実施例では、次の(M1)〜(M12)のようなケーブル配線により実現されている。
(M1)ノード装置100aと100dは、ポート211a−1と211d−1の間のリンク515により接続されている。
(M2)ノード装置100aと100bは、ポート211a−4と211b−1の間のリンク516により接続されている。
(M3)ノード装置100bと100eは、ポート211b−2と211e−2の間のリンク517により接続されている。
(M4)ノード装置100bと100cは、ポート211b−4と211c−1の間のリンク518により接続されている。
(M5)ノード装置100cと100fは、ポート211c−3と211f−3の間のリンク519により接続されている。
(M6)ノード装置100dと100gは、ポート211d−2と211g−2の間のリンク521により接続されている。
(M7)ノード装置100dと100eは、ポート211d−4と211e−1の間のリンク522により接続されている。
(M8)ノード装置100eと100hは、ポート211e−3と211h−3の間のリンク523により接続されている。
(M9)ノード装置100eと100fは、ポート211e−4と211f−1の間のリンク524により接続されている。
(M10)ノード装置100fと100iは、ポート211f−4と211i−4の間のリンク525により接続されている。
(M11)ノード装置100gと100hは、ポート211g−4と211h−1の間のリンク526により接続されている。
(M12)ノード装置100hと100iは、ポート211h−4と211i−1の間のリンク527により接続されている。
もちろん、実施形態に応じて、図43に例示した以外の組み合せのポート間をケーブルで接続することで図43と等価なメッシュトポロジを実現することも可能である。
ところで、図43の例では、ネットワーク4は孤立したネットワークではなく、LANやWAN(Wide Area Network)などの外部ネットワークとも接続される。例えば、図43の例では、ネットワーク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も、不図示の他の外部ネットワークに接続されていてもよい。
また、説明の便宜上、図43には9個のノード装置100a〜100iを含むネットワーク4を例示したが、実施形態によっては、例えば数千個〜数十万個といった多数のノード装置を有線アドホックネットワークが含んでいてもよい。例えば、いたる所に配置された多数のセンサから様々な情報を収集するためのネットワークであるセンサネットワークに、本実施形態の有線アドホックネットワークが適用されてもよい。その場合、多数のセンサに対応して、有線アドホックネットワークは、数千個〜数十万個のオーダの、多数のノード装置を含んでもよい。センサネットワークでは、例えば、画像センサ、温度センサ、湿度センサ、圧力センサ、加速度センサなど、任意の種類のセンサが利用される。
図43も、本実施形態による有線アドホックネットワークの、センサネットワークへの適用例の1つを示している。すなわち、図43においてノード装置100eと100iそれぞれの汎用LANポート212eと212iには、LANインタフェイスを備えたセンサ504と507が、それぞれリンク520と530を介して接続されている。センサ504と507は、感知した結果を示すデータを、LANインタフェイスを介してイーサネットフレームとして出力する。これらのセンサ504と507の種類は任意である。
このように、第2実施形態は、ノード装置間が有線リンクで接続されたネットワークを前提とする。このため、第2実施形態のノード装置の動作は、上述した第1実施形態とは異なるところもあるが、基本的には同じである。そして、第2実施形態においても、第1実施形態と同様に、バックトラック動作において空データフレームまたは集約空データフレームを使用することで、フレームの転送効率が向上する。さらに、特に図示しないが、無線リンクおよび有線リンクが混在するネットワークにおいても、第1または第2実施形態と同様に、フレームの転送効率が向上する。
<その他>
実施形態のノード装置は、複数の隣接ノード装置のうち任意の1つからフレームを受信する受信手段として、例えば図3の受信部101、図4の無線モジュール206、図43のポート211a−1〜211a−4とそこに接続されたPHYチップなどを備える。
また、図3のFID管理テーブル105は、例えば、図4のDRAM20またはフラッシュメモリ205により実現され、図12、図13、図16に示す情報を格納している。このFID管理テーブル105は、以下の(N1)〜(N3)の各情報を対応付けて記憶する記憶手段の一例である。
(N1)送信対象フレームを識別するフレーム識別情報
(N2)複数の隣接ノード装置のうちで、送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報
(N3)送信対象フレームを最初に送信してきた隣接ノード装置を識別する起源ノード識別情報
なお、上記(N1)の送信対象フレームは、例えば、図17に示すデータフレーム、空データフレーム、集約空データフレームである。そして、フレーム識別情報の例は、GSフィールドの値とFIDフィールドの値の組み合わせである。
また、上記(N2)の送信先隣接ノード識別情報の具体例は、FID管理テーブル105のLDフィールドに格納される、隣接ノード装置のノードIDである。
そして、上記(N3)の起源ノード識別情報の具体例は、FID管理テーブル105のOLSフィールドに格納されるノードIDである。
上記のとおり、ノード装置100がデータフレームを中継する場合には、ノード装置100が最初に当該データフレームを受信したときの当該データフレームのLSフィールドの値が、FID管理テーブル105のOLSフィールドに格納される。つまり、送信対象フレームを最初に送信してきた隣接ノード装置のノードIDが、OLSフィールドに格納される。
また、図3の重み付けテーブル104は、図4のDRAM204やフラッシュメモリ205により実現され、図10〜図11に示す情報を格納している。この重み付けテーブル104は、データフレームの最終宛先であるGDに対応付けて、複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する記憶手段の一例である。
なお、送信可能性情報は、上記実施形態では、具体的にはLDフィールドのノードIDと重みの値との組をそれぞれ含む、1つまたは複数のエントリで表されている。そして、送信可能性は、例えば「重みの値が1ならば送信不能であり、重みの値が1未満ならば送信可能である」というように表される。
また、図3のデータフレーム処理部110は、例えば図4のMPU201とDRAM204により実現され、送信可能性情報を更新する更新手段の一例である。受信部101などの受信手段が受信した受信フレームを識別する受信フレーム識別情報が、FID管理テーブル105などの記憶手段に(N1)のフレーム識別情報として記憶されている場合、更新手段としてのデータフレーム処理部110は、送信可能性情報を更新する。
また、データフレーム処理部110および送信部102は、協働して、複数の隣接ノード装置の中から、フレームを送信可能な第2の隣接ノード装置を選択し、第2の隣接ノード装置へ受信フレームを送信する送信手段として機能する。送信手段の一部としてのデータフレーム処理部110は、受信フレーム宛先に対応付けられて重み付けテーブル104などの記憶手段に記憶されている送信可能性情報に基づいて、第2の隣接ノード装置を選択する。
また、データフレーム処理部110および送信部102は、協働してバックトラック手段としても機能する。バックトラック手段としてのデータフレーム処理部110および送信部102は、重み付けテーブル104などの記憶手段の送信可能性情報において、複数の隣接ノード装置の中に送信可能なものがなく、かつ受信フレーム識別情報がFID管理テーブル105などの記憶手段に(N1)のフレーム識別情報として記憶されている場合に、起源ノード識別情報により識別される第3の隣接ノード装置へ受信フレームの少なくとも一部を送信する。
バックトラックを実行するノード装置は、受信フレームが第3の隣接ノード装置に保持されていると見込まれるときは、受信フレームの一部であるフレーム識別情報を第3の隣接ノードへ送信する。「受信フレームが第3の隣接ノード装置に保持されていると見込まれるとき」とは、例えば、「受信フレームを受信したときからの経過時間が、各ノード装置において処理フレームが保持される期間よりも短いとき」、或いは、「受信フレームを第2の隣接ノード装置へ送信したときからの経過時間が、各ノード装置において処理フレームが保持される期間よりも短いとき」に相当する。ここで、「受信フレームを受信したとき」または「受信フレームを第2の隣接ノード装置へ送信したとき」は、上述の実施例では、FID管理テーブル105に記録されるエントリ時刻に相当する。また、フレーム識別情報は、上述の実施例では、データヘッダに含まれるFIDおよびGDに相当する。そして、フレーム識別情報は、上述の実施例では、空データフレームにより送信される。
第3の隣接ノード装置へ送信するフレーム識別情報が複数あるときは、それら複数のフレーム識別情報は1つのフレームに格納して送信される。複数のフレーム識別情報を格納するフレームは、上述の実施例では、集約空データフレームに相当する。
また、ノード装置は、フレーム保持手段として、第2の隣接ノード装置へ送信した受信フレームを保持する送信キューを備える。送信キューは、例えば、受信フレームを第2の隣接ノード装置へ送信したときから少なくとも予め決められた保持期間が経過するまで、その受信フレームを保持する。この保持時間は、上述の実施例では、例えば、FID管理テーブル105において各エントリを保持するエージング時間に相当する。
さらに、ノード装置は、上述した第2の隣接ノード装置からフレーム識別情報が通知されると、その通知されたフレーム識別情報に対応するフレームをフレーム保持手段としての送信キューから抽出する。そして、ノード装置は、送信可能性情報基としての重み値に基づいて決まる隣接ノード装置へ抽出したフレームを送信する。