(57)【特許請求の範囲】
【請求項１】
複数の隣接ノード装置のうちの１つからデータを受信する受信手段と、
送信対象データを識別するデータ識別情報と、前記複数の隣接ノード装置のうちで前記送信対象データの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、前記送信対象データを最初に送信してきた隣接ノード装置である起源隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段と、
データの最終宛先に対応付けて、前記複数の隣接ノード識別情報毎に該最終宛先へのデータの送信可能性を表す送信可能性情報を記憶する第２の記憶手段と、
前記受信手段が受信した受信データを識別するデータ識別情報が、前記第１の記憶手段に前記データ識別情報として記憶されていることに基づいて、該データ識別情報に対応づけられた送信先隣接ノード識別情報を特定し、前記第２の記憶手段において、前記受信データに設定される最終宛先に対応づけられた隣接ノードの前記送信可能性情報のうち、特定した該隣接ノード識別情報の送信可能性を送信不能に更新する更新手段と、
前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報に基づいて、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置に前記受信データを送信する送信手段と、
前記送信手段により送信されたデータを、所定時間、保持するデータ保持手段と、
前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報が全て送信不能であることに基づき、前記第１の記憶手段において前記受信データ識別情報に対応付けられた前記起源隣接ノード装置に対して前記受信データの一部または全部を送信するバックトラック手段、を有し、
前記受信データのデータ識別情報が前記第１の記憶手段に記憶されていないときに、前記第１の記憶手段の対応するエントリが作成され、
前記受信データのデータ識別情報が前記第１の記憶手段に記憶されており、かつ、前記受信データが前記送信手段により選択された隣接ノード装置へ送信されたときに、前記第１の記憶手段に格納されている送信先隣接ノード識別情報は、前記送信手段により選択された隣接ノード装置に応じて更新され、
前記バックトラック手段は、前記受信手段が前記受信データを受信したときからの経過時間、または前記送信手段が前記受信データを前記送信先隣接ノード装置へ送信したときからの経過時間が、前記起源隣接ノード装置の送信手段により送信されたデータが前記起源隣接ノード装置のデータ保持手段に保持される所定時間よりも短いときは、前記受信データのデータ識別情報を含む前記受信データの一部を前記起源ノード識別情報が示す前記起源隣接ノード装置へ送信する
ことを特徴とするノード装置。
【請求項２】
請求項１に記載のノード装置であって、
前記バックトラック手段は、前記起源隣接ノード装置へ送信するデータ識別情報が複数あるときは、それら複数のデータ識別情報を１つの送信単位データに格納して送信する
ことを特徴とするノード装置。
【請求項３】
請求項１に記載のノード装置であって、
前記バックトラック手段は、前記受信手段が前記受信データを受信したときからの経過時間、または前記送信手段が前記受信データを前記送信先隣接ノード装置へ送信したときからの経過時間が、前記起源隣接ノード装置においてデータが前記データ保持手段に保持される前記所定時間以上であれば、前記受信データを該起源隣接ノード装置へ送信する
ことを特徴とするノード装置。
【請求項４】
複数の隣接ノード装置のうちの１つからデータを受信する受信手段と、
送信対象データを識別するデータ識別情報と、前記複数の隣接ノード装置のうちで前記送信対象データの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、前記送信対象データを最初に送信してきた隣接ノード装置である起源隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段と、
データの最終宛先に対応付けて、前記複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する第２の記憶手段と、
前記受信手段が受信した受信データを識別する受信データ識別情報が、前記第１の記憶手段に前記データ識別情報として記憶されている場合に、該データ識別情報に対応づけられた送信先隣接ノード識別情報を特定し、前記第２の記憶手段において、前記受信データに設定される最終宛先に対応づけられた隣接ノードの前記送信可能性情報のうち、特定した該隣接ノード識別情報の送信可能性を送信不能に更新する更新手段と、
前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報に基づいて、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置にデータを送信する送信手段と、
前記送信手段が前記隣接ノード装置へ送信したデータ識別情報を含むデータを保持するデータ保持手段、を備え、
前記受信データのデータ識別情報が前記第１の記憶手段に記憶されていないときに、前記第１の記憶手段の対応するエントリが作成され、
前記受信データのデータ識別情報が前記第１の記憶手段に記憶されており、かつ、前記受信データが前記送信手段により選択された隣接ノード装置へ送信されたときに、前記第１の記憶手段に格納されている送信先隣接ノード識別情報は、前記送信手段により選択された隣接ノード装置に応じて更新され、
前記送信手段は、自ノード装置が先に送信したデータのデータ識別情報を含むデータの一部を前記受信手段が前記送信先隣接ノード装置から受信した場合、前記データ保持手段からデータを抽出して、該データを、自ノード装置が先にデータを送信した隣接ノード装置以外の他の隣接ノード装置へ送信する
ことを特徴とするノード装置。
【請求項５】
請求項４に記載のノード装置であって、
前記受信手段が前記送信先隣接ノード装置から複数のデータ識別情報を格納するデータを受信した場合、前記送信手段は、前記複数のデータ識別情報に対応する複数のデータを前記データ保持手段から抽出し、抽出した複数の該データを自ノード装置が先にデータを送信した隣接ノード装置以外の他の隣接ノード装置へそれぞれ送信する
ことを特徴とするノード装置。
【請求項６】
複数の隣接ノード装置が存在するノード装置により使用されるデータ送信方法であって、
前記ノード装置が、
前記複数の隣接ノード装置のうちの１つから受信したデータから、該データを識別するデータ識別情報を抽出する抽出ステップと、
送信対象データを識別するデータ識別情報と、前記複数の隣接ノード装置のうちで前記送信対象データの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、該送信対象データを最初に送信してきた前記隣接ノード装置である起源隣接ノードを識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段を参照して、前記抽出ステップにて抽出した前記データ識別情報が第１の記憶手段に記憶されているか否か判断する判断ステップと、
前記データ識別情報が前記第１の記憶手段に記憶されていないときに、前記第１の記憶手段に対応するエントリを作成する作成ステップと、
前記データ識別情報が前記第１の記憶手段に記憶されている場合、該データ識別情報に対応づけられた送信隣接ノード識別情報を特定した上で、データの最終宛先に対応付けて前記複数の隣接ノード識別情報毎に該最終宛先へのデータの送信可能性を表す送信可能性情報を記憶する第２の記憶手段を参照し、該第２の記憶手段において、該受信データに設定される最終宛先に対応づけられた隣接ノードの前記送信可能性情報のうち、特定した該隣接ノード識別情報の送信可能性を送信不能に更新する更新ステップと、
前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報に基づいて、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置に前記受信データを送信する送信ステップと、
前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報が全て送信不能であることに基づき、前記第１の記憶手段において前記受信データ識別情報に対応付けられた前記起源隣接ノード装置に対して該受信データのデータ識別情報を含む前記受信データの一部または全部を送信するバックトラックステップ、を有し、
前記起源隣接ノード装置は、前記起源隣接ノード装置が送信したデータを、所定時間、保持する保持手段を有し、
前記受信データのデータ識別情報が前記第１の記憶手段に記憶されており、かつ、前記受信データが選択された隣接ノード装置へ送信されたときに、前記第１の記憶手段に格納されている送信先隣接ノード識別情報は、前記選択された隣接ノード装置に応じて更新され、
前記バックトラックステップにおいて、前記受信データを受信したときからの経過時間、または前記受信データを前記送信先隣接ノード装置へ送信したときからの経過時間が、前記起源隣接ノード装置により送信されたデータが前記起源隣接ノード装置のデータ保持手段に保持される所定時間よりも短いときは、前記受信データのデータ識別情報を含む前記受信データの一部を前記起源ノード識別情報が示す前記起源隣接ノード装置へ送信する
ことを特徴とするノード装置のデータ送信方法。
【請求項７】
複数の隣接ノード装置が存在するノード装置のデータ送信方法であって、
前記ノード装置が、
前記複数の隣接ノード装置のうちの１つから受信したデータから、該データを識別するデータ識別情報を抽出する抽出ステップと、
送信対象データを識別するデータ識別情報と、前記複数の隣接ノード装置のうちで前記送信対象データの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、該送信対象データを最初に送信してきた前記隣接ノード装置である起源隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段に、前記抽出したデータ識別情報が記憶されているか否か判断する判断ステップと、
前記データ識別情報が前記第１の記憶手段に記憶されていないときに、前記第１の記憶手段に対応するエントリを作成する作成ステップと、
前記データ識別情報が前記第１の記憶手段に記憶されている場合、該データ識別情報に対応づけられた送信先隣接ノード識別情報を特定した上で、データの最終宛先に対応付けて前記複数の隣接ノード識別情報毎の該最終宛先へのデータの送信可能性を表す送信可能性情報を記憶する第２の記憶手段を参照し、該第２の記憶手段において、該受信データに設定される最終宛先に対応づけられた隣接ノードの前記送信可能性情報のうち、特定した該隣接ノード識別情報の送信可能性を送信不能に更新する更新ステップと、
前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報に基づいて、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置に前記受信データを送信する送信ステップと、
前記送信先隣接ノード装置へ送信された、データ識別情報を含むデータをデータ保持手段に保持する保持ステップ、を備え、
前記受信データのデータ識別情報が前記第１の記憶手段に記憶されており、かつ、前記受信データが選択された隣接ノード装置へ送信されたときに、前記第１の記憶手段に格納されている送信先隣接ノード識別情報は、前記選択された隣接ノード装置に応じて更新され、
前記送信ステップでは、自ノード装置が先に送信したデータのデータ識別情報を含むデータの一部を前記送信先隣接ノード装置から受信した場合、前記データ保持手段からデータを抽出して、該抽出したデータを、自ノード装置が先にデータを送信した隣接ノード装置以外の他の隣接ノード装置へ送信する
ことを特徴とするデータ送信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のノード装置を含むネットワークにおいて使用されるノード装置およびデータの送信方法に係わる。
【背景技術】
【０００２】
複数のノード装置を含むネットワークの１つの形態として、アドホックネットワークが実用化されている。アドホックネットワークでは、各ノード装置において自律的な経路選択が行われる。すなわち、アドホックネットワークの各ノード装置は、ルータまたはスイッチとして動作する機能を備えている。ここで、各ノード装置は、隣接するノード装置とメッセージ等を授受することにより、周辺のネットワーク構成を認識することができる。したがって、アドホック（特に、無線アドホック）方式を採用すると、ネットワーク全体を管理する管理装置を設けることなく、ネットワークを構築したい環境にノード装置を配置するだけで、所望のネットワークを構築することができる。さらに、アドホックネットワークでは、ノード装置の追加または削除が容易であり、ネットワーク構成を容易に変更することができる。【０００３】
ところが、アドホックネットワークにおいては、各ノード装置が自律的に経路を選択するので、必ずしも最適な経路が選択されるわけではない。すなわち、アドホックネットワークでは、データ転送の効率が悪いことがある。このため、アドホックネットワークにおけるデータ転送効率の向上が要求されている。【０００４】
関連する技術として、送信側の処理占有時間を改善するために、コネクション要求に対してダミーのコネクション確立応答を返す処理と、送信データを受信した時にダミーの送信データ受信応答（ＡＣＫ）を返す処理と、送信データバッファに送信データを一時保存する処理と、前記送信データバッファに送信データがある場合は、前記コネクションを確立し、相手側に送信する処理と、を有する通信方法が提案されている。（例えば、特許文献１）
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１１−４２５９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の目的は、各ノード装置により自律的に経路選択が行われるネットワークにおいて、データの転送効率を向上させることである。
【課題を解決するための手段】
【０００７】
本発明の１つの態様のノード装置は、受信手段、第１の記憶手段、第２の記憶手段、更新手段、送信手段、バックトラック手段を備える。受信手段は、複数の隣接ノード装置のうちの１つからデータを受信する。第１の記憶手段は、送信対象データを識別するデータ識別情報と、前記複数の隣接ノード装置のうちで前記送信対象データの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、前記送信対象データを最初に送信してきた隣接ノード装置である起源隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する。第２の記憶手段は、データの最終宛先に対応付けて、前記複数の隣接ノード識別情報毎に該最終宛先へのデータの送信可能性を表す送信可能性情報を記憶する。更新手段は、前記受信手段が受信したデータを識別するデータ識別情報が、前記第１の記憶手段に前記データ識別情報として記憶されていることに基づいて、該データ識別情報に対応づけられた送信先隣接ノード識別情報を特定し、前記第２の記憶手段において、該受信データに設定される最終宛先に対応づけられた隣接ノードの前記送信可能性情報のうち、特定した該隣接ノード識別情報の送信可能性を送信不能に更新する。送信手段は、前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報に基づいて、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置に前記受信データを送信する。バックトラック手段は、前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報が全て送信不能であることに基づき、前記第１の記憶手段において前記受信データ識別情報に対応付けられた前記起源隣接ノード装置に対して、少なくとも該受信データのデータ識別情報を含む前記受信データの一部を送信する。【０００８】
本発明の他の態様のノード装置は、受信手段、第１の記憶手段、第２の記憶手段、更新手段、送信手段、データ保持手段を備える。受信手段は、複数の隣接ノード装置のうちの１つからデータを受信する。第１の記憶手段は、送信対象データを識別するデータ識別情報と、前記複数の隣接ノード装置のうちで前記送信対象データの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、前記送信対象データを最初に送信してきた隣接ノード装置である起源隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する。第２の記憶手段は、データの最終宛先に対応付けて、前記複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する。更新手段は、前記受信手段が受信した受信データを識別する受信データ識別情報が、前記第１の記憶手段に前記データ識別情報として記憶されている場合に、該データ識別情報に対応づけられた送信先隣接ノード識別情報を特定し、前記第２の記憶手段において、該受信データに設定される最終宛先に対応づけられた隣接ノードの前記送信可能性情報のうち、特定した該隣接ノード識別情報の送信可能性を送信不能に更新する。送信手段は、前記第２の記憶手段において前記受信データの最終宛先に対応付けられた送信先隣接ノード識別情報の前記送信可能性情報に基づいて、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置にデータを送信する。データ保持手段は、前記送信手段が前記隣接ノード装置へ送信したデータ識別情報を含むデータを保持する。そして、前記送信手段は、前記受信手段が前記送信先隣接ノード装置から少なくとも自ノード装置が前記送信したデータのデータ識別情報を含むデータの一部を受信したことに基づき、前記データ保持手段からデータを抽出して、該データを送信する。
【発明の効果】
【０００９】
実施形態の構成または方法によれば、各ノード装置により自律的に経路選択が行われるネットワークにおいて、データの転送効率が向上する。
【図面の簡単な説明】
【００１０】
【図１】ネットワーク構成の第１の例を示す図である。
【図２】ネットワーク構成の第２の例を示す図である。
【図３】第１実施形態におけるノード装置の構成を示す機能ブロック図である。
【図４】第１実施形態におけるノード装置のハードウェア構成を示す図である。
【図５】１つのノード装置に注目して重みの学習について説明する図である。
【図６】図１のネットワークにおいて動的かつ自律分散的に経路が選択される様子を説明する図である。
【図７】フレームの例を示す図である。
【図８】図３のバッファ部に格納されるデータの例を示す図である。
【図９】図３の隣接ノード管理テーブルの例を示す図である。
【図１０】図３の重み付けテーブルの例を示す図である。
【図１１】図１０の重み付けテーブルの変化を説明する図である。
【図１２】図３のＦＩＤ管理テーブルの例を示す図（その１）である。
【図１３】図３のＦＩＤ管理テーブルの例を示す図（その２）である。
【図１４】バックトラック動作を模式的に示す図である。
【図１５】図１４に示すバックトラック動作を示すシーケンス図である。
【図１６】ＦＩＤ管理テーブルの実施例である。
【図１７】バックトラックで使用するフレームのフォーマットを示す図である。
【図１８】空データフレームの集約について説明する図である。
【図１９】バックトラックを実行するノード装置の動作を示すフローチャートである。
【図２０】送信キューの実施例である。
【図２１】空データフレーム集約処理を示すフローチャート（その１）である。
【図２２】空データフレーム集約処理を示すフローチャート（その２）である。
【図２３】空データフレームの受信処理を示すフローチャートである。
【図２４】フレーム受信処理のフローチャートである。
【図２５】ハローフレーム受信処理のフローチャートである。
【図２６】ハローフレーム送信処理のフローチャートである。
【図２７】隣接ノード管理テーブルのエージング処理のフローチャートである。
【図２８】重み付けテーブルのエージング処理のフローチャートである。
【図２９】ＦＩＤ管理テーブルのエージング処理のフローチャートである。
【図３０】データフレーム受信処理のフローチャート（その１）である。
【図３１】データフレーム受信処理のフローチャート（その２）である。
【図３２】データフレーム受信処理のフローチャート（その３）である。
【図３３】図３２に示す手順の別実施例を示すフローチャートである。
【図３４】データフレーム受信処理のフローチャート（その４）である。
【図３５】データフレーム受信処理のフローチャート（その５）である。
【図３６】図３１のステップＳ８１２ａにおける重み付けテーブル調整処理のフローチャートである。
【図３７】ＡＣＫフレーム受信処理のフローチャートである。
【図３８】ＡＣＫフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。
【図３９】ノード装置がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その１）である。
【図４０】ノード装置がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その２）である。
【図４１】ＧＳにもなりうるノード装置が、データフレーム受信処理の一部として図３４〜図３５の処理の代わりに行う処理のフローチャートである。
【図４２】ハローフレームの送受信による隣接ノードの認識および図６の経路選択を示すタイミングチャートである。
【図４３】第２実施形態が適用される有線ネットワークの例を示す図である。
【図４４】第２実施形態における隣接ノード管理テーブルの例を示す図である。
【発明を実施するための形態】
【００１１】
以下、発明の実施形態について、図面を参照しながら説明する。具体的には、まず、実施形態に係るネットワークの構成、および各ノード装置の構成について説明する。続いて、データ転送の効率化を図る手法の概要を説明する。さらに、フローチャートを参照しながら各ノード装置の動作を詳しく説明する。その後、他の実施形態について説明する。
【００１２】
図１はネットワーク構成の第１の例を示す図である。図１のネットワーク１は、以下の各実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。なお、以下では、ネットワークトポロジの観点からの説明においては、「ノード装置」を単に「ノード」ということもある。
【００１３】
ネットワーク１内の各ノード装置には、ネットワーク１内で一意な識別情報（以下、「ノードＩＤ（identification）」という）が予め割り当てられている。以下では、参照符号「Ｎｉ」がノードＩＤを示すものとし、例えば、ノードＩＤとしてＮｉが割り当てられたノード装置を「ノード装置Ｎｉ」のように参照する。なお、以下では、ノード装置Ｎｉにとって自分自身に割り当てられたノードＩＤであるＮｉを、ノード装置Ｎｉの「自ノードＩＤ」ともいう（図１では１≦ｉ≦７）。
【００１４】
また、図１ではリンクを実線で表している。具体的には、ネットワーク１のトポロジは次のとおりである。すなわち、ノード装置Ｎ１とＮ２の間、ノード装置Ｎ２とＮ３の間、ノード装置Ｎ２とＮ６の間、ノード装置Ｎ３とＮ４の間、ノード装置Ｎ３とＮ５の間、ノード装置Ｎ４とＮ５の間、ノード装置Ｎ４とＮ７の間、およびノード装置Ｎ６とＮ７の間に、各々リンクが存在する。
【００１５】
なお、以下で「リンク」とは、無線リンクでもよく、有線リンクでもよい。ノード装置ＮｉとＮｊが、他のノード装置Ｎｋによる中継を経ずに直接、無線により情報を通信しあうことができるとき、「ノード装置ＮｉとＮｊの間に無線リンクが存在する」という（図１では１≦ｉ，ｊ，ｋ≦７）。また、ノード装置ＮｉとＮｊの間が直接ケーブルで接続されており、ノード装置ＮｉとＮｊがケーブルを介して情報を通信しあうことができるとき、「ノード装置ＮｉとＮｊの間に有線リンクが存在する」という。
【００１６】
また、ノード装置ＮｉとＮｊの間に無線または有線のリンクが存在するとき、「ノード装置ＮｉとＮｊは互いに隣接している」という。換言すれば、ノード装置Ｎｉにとってノード装置Ｎｊは隣接ノード装置であり、ノード装置Ｎｊにとってノード装置Ｎｉは隣接ノード装置である。
【００１７】
なお、図１のネットワーク１には、新たなノード装置が追加されることもありうるし、ノード装置Ｎ１〜Ｎ７のいずれかが撤去されてネットワーク１からは消滅することもありうる。また、リンクは固定的ではなく、動的に変化しうる。
【００１８】
例えば、天候や遮蔽物などの影響で、ノード装置ＮｉとＮｊの間に無線リンクが新たに確立されたり、今まで確立されていた無線リンクが消滅したりすることがある。ノード装置が可動式であれば、ノード装置間の距離の変動によってリンクの有無が変化することもある。また、ケーブルの接続替えにより、新たな有線リンクが確立されたり、今まで存在していた有線リンクが消滅したりすることがあり、ケーブルの切断等の障害によって有線リンクが消滅することもある。
【００１９】
以下に説明する各実施形態によれば、このようにノードやリンクが動的に変化する環境においても、データが送信される時点でのネットワーク１の状況に応じて、利用可能で適切な経路が動的に見出されて選択されながら、データの送信が行われる。しかも、動的に変化するネットワーク１全体のトポロジを各ノード装置Ｎ１〜Ｎ７が認識する必要なしに、動的なトポロジの変化に応じた経路選択が自律分散的に実現される。
【００２０】
ところで、詳しくは図７とともに後述するが、以下ではノード装置間で通信手順（プロトコル）に従って送受信されるデータの単位であるＰＤＵ（Protocol Data Unit）、および、送受信の単位データそのものを「フレーム」と称する。ネットワーク１内でのデータの送受信はフレームを用いて行われるが、フレームの、ネットワーク１内における最初の送信元のノード装置を以下では「ＧＳ（Global Source）」といい、フレームの宛先のノード装置を以下では「ＧＤ（Global Destination）」という。
【００２１】
例えば、ノード装置Ｎ１がＧＳでノード装置Ｎ７がＧＤの場合、ネットワーク１においてノード装置Ｎ１とＮ７は隣接していないので、他のノード装置によってフレームが中継され、その結果として、フレームはノード装置Ｎ７に到達する。例えば、フレームは、ノード装置Ｎ１からノード装置Ｎ２へ送信され、ノード装置Ｎ２からノード装置Ｎ６へ送信され、ノード装置Ｎ６からノード装置Ｎ７へ送信されるかもしれない。以下では経路を、〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉のようなタプル（tuple）で表す。
【００２２】
経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉の例において、例えばノード装置Ｎ１からノード装置Ｎ２へフレームが送信されるとき、フレームの最終的な宛先は、ＧＤであるノード装置Ｎ７だが、フレームの直接的な宛先は、ノード装置Ｎ１に隣接するノード装置Ｎ２である。以下では、このように互いに隣接する２つのノード装置間でのフレームの送信において、フレームの送信元のノード装置を「ＬＳ（Local Source）」といい、フレームの宛先のノード装置を「ＬＤ（Local Destination）」という。例えば、上記のようにフレームがノード装置Ｎ１からノード装置Ｎ２とＮ６を経由してノード装置Ｎ７へと中継される場合のＬＳとＬＤは次のとおりである。
【００２３】
ＧＳでもあるノード装置Ｎ１から、ノード装置Ｎ１に隣接するノード装置Ｎ２へと、最初にフレームが送信されるとき、ＬＳはノード装置Ｎ１であり、ＬＤはノード装置Ｎ２である。続いて、ノード装置Ｎ２から、ノード装置Ｎ２に隣接するノード装置Ｎ６へと、フレームが送信されるとき、ＬＳはノード装置Ｎ２であり、ＬＤはノード装置Ｎ６である。そして、ノード装置Ｎ６から、ノード装置Ｎ６に隣接しておりＧＤでもあるノード装置Ｎ７へとフレームが送信されるとき、ＬＳはノード装置Ｎ６であり、ＬＤはノード装置Ｎ７である。
【００２４】
なお、ネットワーク１内の１つまたは複数のノード装置が、ネットワーク１とは別のネットワーク（以下「外部ネットワーク」という）に属する不図示のネットワーク機器と接続されていてもよい。
【００２５】
例えば、データ管理サーバを含む外部ネットワークのゲートウェイ装置に、有線リンクまたは無線リンクによってノード装置Ｎ７が接続されていてもよい。そして、ノード装置Ｎ７がＧＤとして指定されてネットワーク１内で送信されるデータは、ノード装置Ｎ７からゲートウェイ装置を介してデータ管理サーバに送信され、データ管理サーバで管理されてもよい。
【００２６】
続いて、図２を参照して他のネットワークの例について説明する。図２は、ネットワーク構成の第２の例を示す図である。図２のネットワーク２も、以下の各実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。また、図１のネットワーク１と同様に、ネットワーク２も、不図示の外部ネットワークと接続されていてもよい。
【００２７】
ネットワーク２はノード装置Ｎ１０１〜Ｎ１２０を含む。図２は、ノード装置Ｎ１０１〜Ｎ１２０のうち、１つのノード装置Ｎ１０５に注目して表現した図である。すなわち、太い実線の丸で示したノード装置Ｎ１０５は、直接通信することが可能な、隣接する３つのノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２の存在とノードＩＤさえ認識していればよく、ネットワーク２全体のトポロジを認識する必要はない。ノード装置Ｎ１０５は、ネットワーク２のトポロジどころか、ネットワーク２内に存在するノード装置の個数を認識する必要もないし、ノード装置Ｎ１０５に隣接していないノード装置のノードＩＤを予め知っている必要もない。
【００２８】
図２では、ノード装置Ｎ１０５が認識する部分を実線で表し、ノード装置Ｎ１０５が認識する必要のない部分を破線で表してある。すなわち、図２では、ノード装置Ｎ１０５から見てホップ数１以内の範囲に存在する以下のものだけが、実線で示してある。
・ノード装置Ｎ１０５自身
・ノード装置Ｎ１０５に隣接する３つのノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２
・ノード装置Ｎ１０５を３つの隣接ノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２にそれぞれ接続する３本のリンク
【００２９】
以下に説明する各実施形態によれば、ネットワーク内の各ノード装置は、上記のノード装置Ｎ１０５のように、隣接ノード装置さえ認識していればよい。したがって、ネットワークの規模が増大しても「各ノード装置がネットワークトポロジを認識するために制御情報の通信を行い、制御情報の通信のせいでネットワークの負荷が高まり、通信システム全体としての性能が悪化する」といった事態に陥ることはない。
【００３０】
図３は、第１実施形態におけるノード装置の構成を示す機能ブロック図である。図１または図２の各ノード装置は、具体的には、例えば、図３に示すノード装置１００に相当する。
【００３１】
ノード装置１００は、フレームを受信する受信部１０１と、フレームを送信する送信部１０２を備える。また、ノード装置１００は、フレームの送信のために用いる各種情報を格納するため、隣接ノード管理テーブル１０３、重み付けテーブル１０４、およびＦＩＤ（Frame IDentification）管理テーブル１０５を備える。
【００３２】
ノード装置１００はさらに、受信部１０１が受信したフレームの種類を判別するフレーム分岐処理部１０６を備える。第１実施形態では、「データフレーム」、「ハローフレーム」、「ＡＣＫ（ACKnowledgment）フレーム」が使用される。また、フレームの転送効率を高めるために、「空データフレーム」も使用される。さらに、必要に応じて「集約空データフレーム」も使用される。
【００３３】
ノード装置１００は、ＡＣＫフレームに関する処理を行うＡＣＫ処理部１０７と、ハローフレームの受信に応じて処理を行うリンク管理部１０８を備える。また、ノード装置１００は、データフレームの受信に応じた処理を行うために、バッファ部１０９とデータフレーム処理部１１０を備えている。ノード装置１００はさらに、上位層処理部１１１、ハローフレーム生成部１１２、およびＦＩＤ生成部１１３も備えている。さらに、ノード装置１００は、送信キュー１１４を備えている。
【００３４】
ノード装置１００の各部は以下のように動作する。
受信部１０１がフレームを受信し、受信したフレームをフレーム分岐処理部１０６に出力する。すると、フレーム分岐処理部１０６がフレームの種別を判別する。
【００３５】
ハローフレームが受信された場合、フレーム分岐処理部１０６は、受信されたハローフレームをリンク管理部１０８に出力する。リンク管理部１０８は、隣接ノード管理テーブル１０３を管理しており、さらに、重み付けテーブル１０４の管理にも関与している。
【００３６】
ここで、ハローフレームは、制御情報を通信するための制御フレームの一種であり、具体的には、ノード装置１００が自分自身の存在を他のノード装置に通知するためのフレームである。よって、詳しくは図２５とともに後述するとおり、リンク管理部１０８は、ハローフレームの受信を契機として隣接ノード装置の存在を認識し、認識結果を隣接ノード管理テーブル１０３に反映させる。すなわち、隣接ノード管理テーブル１０３は、ノード装置１００に隣接する他のノード装置を、ノード装置１００が記憶しておくためのテーブルである。
【００３７】
なお、ネットワークの状況は動的に変化しうるので、場合によっては、今まで隣接ノード装置としてリンク管理部１０８に認識されていた他のノード装置が、隣接ノード装置として認識不能となるかもしれない。よって、詳しくは図２７とともに後述するとおり、リンク管理部１０８は、隣接ノード装置として認識不能となったノード装置に関するエントリを隣接ノード管理テーブル１０３から削除するためのエージング処理も行う。
【００３８】
また、第１実施形態においてリンク管理部１０８は、隣接ノード装置の変化にともなって重み付けテーブル１０４の追加、削除、あるいは更新を行う。
ここで、重み付けテーブル１０４は、フレームをどの隣接ノード装置に送信するかを決定するための情報をＧＤごとに管理するためのテーブルである。図３にはＭ個のＧＤそれぞれに対応して設けられた重み付けテーブル１０４−１〜１０４−Ｍが示されている。本明細書において「重み付けテーブル１０４」とは、重み付けテーブル１０４−１〜１０４−Ｍの総称である。また、ノード装置１００の運用が開始される時点では、重み付けテーブル１０４は存在せず、Ｍ＝０である。
【００３９】
具体的には、重み付けテーブル１０４は、「最終的にフレームをＧＤに到達させるためには、ノード装置１００自身はどの隣接ノード装置をＬＤとして選択することができるか」ということをＧＤごとに管理している。換言すれば、重み付けテーブル１０４は、フレームのＧＤごとに、ノード装置１００に隣接する１つ以上のノード装置に関して、ＬＤとして選択する際の優先度を、重みとして表して保持している。
【００４０】
別の観点から言えば、ある隣接ノード装置が「ＬＤとして選択可能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信可能」であることを意味する。また、ある隣接ノード装置が「ＬＤとして選択不能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信不能」であることを意味し、当該隣接ノード装置の優先度が、「送信不能」に対応する所定の最低優先度であることを意味する。
【００４１】
したがって、ネットワークの状況の変化に応じてノード装置１００の隣接ノード装置が変化すると、リンク管理部１０８は、詳しくは図２５および図２７とともに後述するとおり、隣接ノード装置の変化に応じて重み付けテーブル１０４を追加、更新、または削除する。
【００４２】
また、ＡＣＫフレームが受信された場合、フレーム分岐処理部１０６は、受信されたＡＣＫフレームをＡＣＫ処理部１０７に出力する。ここで、ＡＣＫフレームは、制御フレームの一種であり、ノード装置１００が送信したデータフレームのＬＤであるノード装置から、ノード装置１００に、データフレームの受信を通知するためのフレームである。
【００４３】
したがって、ＡＣＫフレームの受信は、データフレームの送信が成功したことを意味し、所定の時間が経過してもＡＣＫフレームが受信されずにタイムアウトとなることは、データフレームの送信に失敗したことを意味する。ＡＣＫ処理部１０７は、後述の図３７に示すＡＣＫフレーム受信のタイムアウト監視を行う。
【００４４】
バッファ部１０９は、データフレームの送信失敗と再送に備えて、データフレームを格納している。よって、詳しくは図３７とともに後述するとおり、ＡＣＫ処理部１０７は、ＡＣＫフレームの受信を契機としてデータフレームの送信成功を認識すると、不要になったデータフレームをバッファ部１０９から削除可能な状態にする。ただし、バッファ部１０９において、データフレームは、対応するＡＣＫフレームの受信時に即座に削除可能な状態にされるのではない。すなわち、対応するＡＣＫフレームが受信された場合であっても、バッファ部１０９に書き込まれたデータフレームは、所定時間Ｇが経過するまではそのまま保持される。所定時間Ｇは、後で詳しく説明するが、例えば、ＦＩＤ管理テーブル１０５のエージング時間に相当する。また、ＡＣＫ処理部１０７は、データフレームの送信の成否をデータフレーム処理部１１０に通知する。
【００４５】
また、データフレームが受信された場合、フレーム分岐処理部１０６は、受信されたデータフレームをバッファ部１０９に格納するとともに、後述の図３０〜図３５の処理を行うようデータフレーム処理部１１０に依頼する。
【００４６】
ここで、データフレームは、ＧＳであるノード装置が、ＧＤであるノード装置に伝達しようとするデータを、ペイロードとして含むフレームである。換言すれば、第１実施形態におけるフレームが定義される層よりも上位の層で定義されるプロトコルのＰＤＵが、ペイロードとしてデータフレームに含まれる。上位層処理部１１１は、ノード装置１００がＧＳまたはＧＤである場合に、データフレームにペイロードとして含まれる上位層のＰＤＵを処理する。
【００４７】
フレーム分岐処理部１０６からデータフレームの処理の依頼を受けたデータフレーム処理部１１０の動作の概要は、以下のとおりである。
データフレーム処理部１１０は、受信部１０１が受信したデータフレームに対するＡＣＫフレームの送信を送信部１０２に依頼する。また、データフレーム処理部１１０は、受信されたデータフレームのＧＤの値がノード装置１００の自ノードＩＤと等しいか否かを判断する。そして、受信されたデータフレームのＧＤの値がノード装置１００の自ノードＩＤと異なる場合、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５を参照することにより、今回の受信が下記（Ａ１）と（Ａ２）のどちらに該当するのかを判断する。
【００４８】
（Ａ１）過去にノード装置１００がＬＳとなって送信したデータフレームが、ネットワーク内を中継されているうちにノード装置１００に戻ってきて、受信部１０１で受信された。
【００４９】
（Ａ２）上記（Ａ１）以外の新たなデータフレームが受信部１０１で受信された。
データフレーム処理部１１０は、今回の受信が（Ａ２）に該当すると判断すると、重み付けテーブル１０４を参照して、受信したデータフレームを転送するためにＬＤとして指定する隣接ノード装置を選択し、データフレームの転送を送信部１０２に依頼する。
【００５０】
他方、データフレーム処理部１１０は、今回の受信が（Ａ１）に該当すると判断すると、過去にＬＤとして選択した隣接ノード装置が、適切なＬＤではなかったと認識し、認識の結果を重み付けテーブル１０４に反映させる。そして、データフレーム処理部１１０は、重み付けテーブル１０４を参照して、ＬＤとして選択可能な隣接ノード装置が他にまだ残っているか否かを判断する。
【００５１】
データフレーム処理部１１０は、また、ＡＣＫ処理部１０７からのデータフレーム送信成功あるいは送信失敗の通知を受け、該データフレームのＬＤとして選択した隣接ノード装置が適切か否かの認識をし、その認識結果を重み付けテーブル１０４に反映させる。
【００５２】
なお、ノード装置１００に隣接する、あるノード装置Ｎｉが「ＬＤとして選択可能である」とは、直感的には「隣接ノード装置ＮｉをＬＤとして選択してみて、フレームが成功裡にＧＤまで到達するか否かを試してみる価値がある」という意味である。具体的には、ノード装置Ｎｉが「ＬＤとして選択可能である」とは、「下記（Ｂ１）でもなく下記（Ｂ２）でもない」という意味である。なお、「選択可能」という語の、より詳細な意味については、後述の図５に関する説明と、図３２に関する（Ｆ１）〜（Ｆ２）と（Ｇ１）〜（Ｇ４）の説明から明らかである。
【００５３】
（Ｂ１）ノード装置１００が隣接ノード装置Ｎｉを過去にＬＤとして選択した結果、ループ等の何らかの失敗が発生したことがあり、「ノード装置ＮｉはＬＤとして不適切である」と既に判明している。
【００５４】
（Ｂ２）今回受信部１０１が受信したデータフレームを、かつて受信部１０１が初めて受信したときのＬＳ（以下「Original Local Source」と称し、「ＯＬＳ」と略す）が、ノード装置Ｎｉであった。
【００５５】
データフレーム処理部１１０は、もしＬＤとして選択可能な隣接ノード装置が他にまだ残っていれば、選択可能な隣接ノード装置を選んでＬＤとして指定し、データフレームの転送を送信部１０２に依頼する。逆に、ＬＤとして選択可能な隣接ノード装置がもう残っていなければ、データフレーム処理部１１０は、下記（Ｃ１）または（Ｃ２）のように動作する。
【００５６】
（Ｃ１）今回受信したデータフレームのＧＳがノード装置１００以外である場合、データフレーム処理部１１０は、ＯＬＳへデータフレームを返送するため、ＯＬＳをＬＤとして選択し、データフレームの転送を送信部１０２に依頼する。この動作は、ＯＬＳである隣接ノード装置に「ノード装置１００をＬＤとして選択することは不適切である」と認識させるための動作であり、後述するとおり経路探索におけるバックトラックに相当する。
【００５７】
（Ｃ２）今回受信したデータフレームのＧＳがノード装置１００自身である場合、このデータフレームを元々生成したのは上位層処理部１１１である。よって、データフレーム処理部１１０は、上位層処理部１１１に対してデータフレームの送信失敗を通知し、バッファ部１０９に格納されているデータフレームを破棄する。
【００５８】
なお、以上のようなデータフレーム処理部１１０の動作を実現するためには、データフレーム処理部１１０は上記（Ａ１）と（Ａ２）の区別をすることが必要である。そのため第１実施形態では、データフレームを一意に識別することのできるフレーム識別情報が各データフレームに含まれており、フレーム識別情報をＦＩＤ管理テーブル１０５が記憶している。
【００５９】
第１実施形態でのフレーム識別情報は、具体的には、データフレームのＧＳであるノード装置のノードＩＤと、ＦＩＤとの組み合わせである。ＦＩＤは、ある１つのノード装置がＧＳとなって送信する複数のフレームの各々を一意に識別する識別情報であり、例えば所定のビット数のシーケンス番号でもよいし、タイムスタンプでもよい。
【００６０】
つまり、個々のノード装置は独立にＦＩＤを生成するため、異なる複数のノード装置が偶然同じＦＩＤを生成することもありうる。しかし、フレーム識別情報は、ＦＩＤ単独ではなく、データフレームのＧＳであるノード装置のノードＩＤと、ＦＩＤとの組み合わせである。そして、ノードＩＤは、上記のとおりネットワーク内でノード装置を一意に識別する情報である。したがって、たとえ異なる複数のノード装置が偶然同じＦＩＤを生成したとしても、異なるノード装置がそれぞれＧＳとなって送信したフレームは、異なるフレーム識別情報を有するので、区別可能である。
【００６１】
なお、フレーム識別情報は、データフレームが１つ以上のノード装置を経由してネットワーク内を転送されても、データフレームを中継するノード装置によって書き換えられることはなく、したがって変化しない。データフレーム処理部１１０は、送信部１０２に送信を依頼したデータフレームのフレーム識別情報をＦＩＤ管理テーブル１０５に記録することにより、後にデータフレームがノード装置１００自身に戻ってきたとき、上記（Ａ１）に該当すると認識することができる。
【００６２】
なお、ノード装置１００は、フレームの受信を契機としないその他の処理も行う。具体的には、ハローフレーム生成部１１２が、ＦＩＤ生成部１１３の生成するＦＩＤを利用して定期的にハローフレームを生成し、送信部１０２に出力する。すると送信部１０２がハローフレームを送信するので、ノード装置１００は、ノード装置１００自身の存在を定期的に周囲に通知することができる。
【００６３】
また、上位層処理部１１１は任意のタイミングで、データフレームにペイロードとして含めて送信する対象のデータをデータフレーム処理部１１０に出力することができる。すると、データフレーム処理部１１０は、上位層処理部１１１の要求に応じてデータフレームを生成し、送信部１０２にデータフレームの送信を指示する。こうして、ノード装置１００は、自らＧＳとなることができる。
【００６４】
図４は、第１実施形態におけるノード装置のハードウェア構成を示す図である。図３のノード装置１００は、例えば図４に示す各種ハードウェアにより実現されてもよい。
図４の例では、ノード装置１００は、ＭＰＵ（MicroProcessing Unit）２０１、ＰＨＹ（PHYsical layer）チップ２０２、およびタイマＩＣ（Integrated Circuit）２０３を備える。また、ノード装置１００は、ＤＲＡＭ（Dynamic Random access Memory）２０４、フラッシュメモリ２０５、および無線モジュール２０６を備える。
【００６５】
ＭＰＵ２０１とＰＨＹチップ２０２の間を接続する通信インタフェイスは、ＭＩＩ／ＭＤＩＯ（Media Independent Interface or Management Data Input/Output）２０７である。ＭＩＩとＭＤＩＯはいずれも、物理層とＭＡＣ副層（Media Access Control sublayer）との間のインタフェイスである。また、ＭＰＵ２０１とタイマＩＣ２０３は、Ｉ２Ｃ／ＰＩＯ（Inter-Integrated Circuit or Parallel Input/Output）バス２０８を介して接続されている。そして、ＤＲＡＭ２０４とフラッシュメモリ２０５と無線モジュール２０６は、ＰＣＩ（Peripheral Component Interconnect）バス２０９を介してＭＰＵ２０１に接続されている。
【００６６】
ＭＰＵ２０１は、不揮発性記憶装置の一種であるフラッシュメモリ２０５に格納されたファームウェアなどのプログラムをＤＲＡＭ２０４にロードし、ＤＲＡＭ２０４をワーキングメモリとして使いながら各種処理を実行する。ＭＰＵ２０１は、プログラムを実行することで、図３のフレーム分岐処理部１０６、ＡＣＫ処理部１０７、リンク管理部１０８、データフレーム処理部１１０、上位層処理部１１１、ハローフレーム生成部１１２、およびＦＩＤ生成部１１３として動作することができる。
【００６７】
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置１００にインストールされてもよい。または、プログラムは、ネットワークからＰＨＹチップ２０２もしくは無線モジュール２０６を介してダウンロードされ、ノード装置１００にインストールされてもよい。
【００６８】
なお、実施形態に応じて、ＤＲＡＭ２０４やフラッシュメモリ２０５以外の他の種類の記憶装置が利用されてもよい。例えば、ノード装置１００は、ＣＡＭ（Content Addressable Memory）、ＳＲＡＭ（Static Random Access Memory）、ＳＤＲＡＭ（Synchronous Dynamic Random Access Memory）などの記憶装置を有してもよい。
【００６９】
図３の隣接ノード管理テーブル１０３、重み付けテーブル１０４、ＦＩＤ管理テーブル１０５、バッファ部１０９、送信キュー１１４は、ＤＲＡＭ２０４、フラッシュメモリ２０５、あるいは不図示のその他の記憶装置により実現される。また、フラッシュメモリ２０５は、プログラムだけでなく、ノード装置１００のノードＩＤなど、ノード装置１００に固有の情報も記憶している。
【００７０】
ＰＨＹチップ２０２は、有線接続における物理層の処理を行う回路である。第１実施形態は無線ネットワークに適用されるので、第１実施形態では、ノード装置１００はＰＨＹチップ２０２を備えなくてもよい。しかし、ノード装置１００と外部ネットワークとの接続のために、ノード装置１００はＰＨＹチップ２０２を備えていてもよい。
【００７１】
例えば、ノード装置１００は、イーサネット（登録商標）規格にしたがった有線ＬＡＮポートを備え、有線ＬＡＮポートに接続されたケーブルを介して外部ネットワークのゲートウェイ装置などに接続されていてもよい。
【００７２】
その場合、ＭＰＵ２０１は、イーサネットフレームを生成し、ＭＩＩ／ＭＤＩＯ２０７を介してＰＨＹチップ２０２に出力することができる。そして、ＰＨＹチップ２０２は、ＭＰＵ２０１からの出力（すなわちイーサネットフレームを表す論理信号）を、ケーブルの種類に応じた信号（つまり電気信号または光信号）に変換し、ケーブルに出力する。こうして、ノード装置１００はＰＨＹチップ２０２を用いて外部ネットワークにデータを送信することができる。
【００７３】
また、ＰＨＹチップ２０２は、ケーブルと有線ＬＡＮポートを介して外部ネットワークから入力される電気信号または光信号を、論理信号に変換し、ＭＩＩ／ＭＤＩＯ２０７を介してＭＰＵ２０１に出力することもできる。こうして、ノード装置１００はＰＨＹチップ２０２を用いて外部ネットワークからデータを受信することができる。
【００７４】
無線モジュール２０６は、無線接続における物理層の処理を行うハードウェアである。無線モジュール２０６は、例えば、アンテナ、ＡＤＣ（Analog-to-Digital Converter）、ＤＡＣ（Digital-to-Analog Converter）、変調器、復調器、符号化器、復号器などを含む。
【００７５】
第１実施形態では、図３の受信部１０１と送信部１０２は、図４の無線モジュール２０６により実現される。つまり、第１実施形態では、ネットワーク内のリンクは無線リンクである。なお、後述する第２の実施形態のように、有線リンクが存在する実施形態も可能である。
【００７６】
タイマＩＣ２０３は、設定された時間が経過するまでカウントアップ動作を行い、設定された時間が経過すると割り込み信号を出力する。例えば、タイマＩＣ２０３は、隣接ノード管理テーブル１０３、重み付けテーブル１０４、ＦＩＤ管理テーブル１０５のエージング処理をそれぞれ所定の間隔で実行するための割り込み信号を出力してもよい。
【００７７】
なお、実施形態に応じて、ノード装置のハードウェア構成は図４とは異なっていてもよく、図４に例示した規格・種類以外のその他のハードウェアをノード装置に利用することもできる。
【００７８】
例えば、図３のフレーム分岐処理部１０６、ＡＣＫ処理部１０７、リンク管理部１０８、データフレーム処理部１１０、上位層処理部１１１、ハローフレーム生成部１１２、またはＦＩＤ生成部１１３は、ハードウェア回路により実現されてもよい。具体的には、ＭＰＵ２０１の代わりに、ＦＰＧＡ（Field Programmable Gate Array）などのリコンフィギュラブル回路や、ＡＳＩＣ（Application Specific Integrated Circuit）などにより、これら図３の各部が実現されてもよい。もちろん、ＭＰＵ２０１とハードウェア回路の双方により、図３の各部が実現されてもよい。
【００７９】
なお、以下の説明においては、説明の明確化のため、図３および図４の各部の参照符号の後にノードＩＤを付けた参照符号を用いることがある。例えば、ノード装置Ｎ１が有する図３の隣接ノード管理テーブル１０３を「１０３−Ｎ１」という参照符号で参照する場合がある。
【００８０】
続いて、個々のノード装置の動作の概要について図５を参照して説明し、個々のノード装置の動作の結果としてネットワーク全体として実現される経路選択について図６を参照して説明する。
【００８１】
図５は、１つのノード装置に注目して重みの学習について説明する図である。図５には、ネットワーク３内の６つのノード装置が「ノードα」〜「ノードζ」として抜粋されて示されている。図５に示すように、ノードβにはノードα、γ、δ、ε、およびζが隣接しており、図５では下記５本のリンクが実線で示されている。
・ノードβとαの間のリンクＬβ，α
・ノードβとγの間のリンクＬβ，γ
・ノードβとδの間のリンクＬβ，δ
・ノードβとεの間のリンクＬβ，ε
・ノードβとζの間のリンクＬβ，ζ
【００８２】
また、図５において雲の形で模式的に表現されたネットワーク３ａは、ネットワーク３のうちの一部分である。ネットワーク３ａは、具体的には、ノードδとζの間を直接的に接続するリンク、または、１つ以上の不図示のノードと２本以上の不図示のリンクを介してノードδとζの間を間接的に接続する経路を含む。
【００８３】
以下では、図５においてノードβに注目し、ノードβにおける重みの学習について説明する。
あるとき、ノードβが、ネットワーク３内の不図示のあるノード（以下、便宜的に「ノードη」という）をＧＤとするデータフレーム３０１を、リンクＬβ，αを介してノードαから受信する。ノードβは図３の重み付けテーブル１０４を有しており、このうちノードηに対応する重み付けテーブルを、図５の説明では便宜的に「１０４−ｈ」という参照符号で参照する。
【００８４】
詳しくは図１０および図１１とともに後述するが、ＧＤごとに管理される重み付けテーブル１０４のそれぞれは、隣接ノードと重みの対応付けを記憶している。ノードβにはノードα、γ、δ、ε、およびζが隣接しているので、重み付けテーブル１０４−ｈでは、ノードαと重みＷα、ノードγと重みＷγ、ノードδと重みＷδ、ノードεと重みＷε、およびノードζと重みＷζが、それぞれ対応付けられている。
【００８５】
説明の便宜上、ノードβがノードαからデータフレーム３０１を受信した時点での重み付けの関係が、式（１）のとおりであったとする。
Ｗγ＜Ｗδ＜Ｗε＜Ｗζ  （１）
以下、第１実施形態においては説明の便宜上、重みが０以上１以下の値をとり、重みの値が小さいほど当該重みに対応するノードの優先度が高いことを示すものとする。
【００８６】
したがって、式（１）に基づいてノードβは、最も軽い重みＷγと対応付けられたノードγの優先度が、隣接ノードγ、δ、ε、およびζの中で最も高いことを認識する。よって、ノードβは、データフレーム３０１を転送するためのＬＤとして、隣接ノードγ、δ、ε、およびζの中から、まずノードγを選択し、ノードγにデータフレーム３０１を送信する。
【００８７】
ここで、ノードβからノードγへの送信が失敗すると、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習する。そして、学習の結果として、ノードβは、ノードγの優先度を下げる。すなわち、ノードβは、重みＷγの値を大きくする。
【００８８】
送信失敗には何種類かあり、具体的には、ノードβは下記（Ｄ１）または（Ｄ２）のようにして、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習する。
【００８９】
（Ｄ１）リンク障害の場合
ノードβがデータフレーム３０１をノードγに転送した時点で、偶然リンクＬβ，γ、あるいは、ノードγに障害が発生していると、ノードβはノードγへの送信が失敗したと認識する。
【００９０】
例えばリンクＬβ，γが無線リンクである場合、ノードγからデータフレーム３０１に対するＡＣＫフレームが所定時間内に返信されてこなければ、ノードβはタイムアウトして、「ノードγへのデータフレーム３０１の送信に失敗した」と判断する。そして、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードγに対応付けられた重みＷγの値を大きくする。
【００９１】
なお、無線リンクはその品質環境が変化しやすいため、リンク障害が再び解消されている可能性がある。そのため、第１実施形態においては、リンク障害時に一挙に重みＷγを最大値にするのではなく、所定の値だけ大きくすることにしている。このようにすれば、１回のリンク障害発生だけでそのＬＤが不適切となることを防ぐことができる。
【００９２】
（Ｄ２）ノードγからノードβにデータフレーム３０１が戻ってくる場合
ノードβは、一旦、ノードγへのデータフレーム３０１の送信に成功する。例えば、ノードβは、データフレーム３０１に対するＡＣＫフレームをノードγから受け取ることで、ノードγへのデータフレーム３０１の送信が成功したことを認識する。よって、一旦ノードβは、ＬＤとして選択したノードγに対応付けられた重みＷγの値を小さくする。
【００９３】
しかしながら、その後、ノードγからノードηまでデータフレーム３０１を転送することのできる経路がネットワーク３内で見つからなければ、後述するバックトラック動作により、ノードγはノードβにデータフレーム３０１を送り返す。例えば、ノードγがノードβにのみ隣接している場合、ノードγはノードηまでデータフレーム３０１を転送することのできる経路を見つけることができない。また、ノードγがノードβ以外にいくつかのノードに隣接している場合でも、ネットワーク３のトポロジによっては、ノードγからノードηまで到達不能なこともある。
【００９４】
ノードγがバックトラック動作を行うと、ノードβは、ノードβ自身が過去にノードγに送信したデータフレーム３０１をノードγから受信するので、「ノードγへの送信が失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードγに対応付けられた重みＷγの値を大きくする。
【００９５】
第１実施形態では、（Ｄ２）のように、ノードβ自身が過去に送信したデータフレーム３０１を受信することでノードβが送信失敗を認識する場合、ノードβは具体的には重みＷγの値を最大値に設定する。
【００９６】
以下では説明の便宜上、図５の例において（Ｄ２）のようにしてノードβが送信失敗を認識し、重みＷγの値を最大値に設定したとする。その結果、式（２）が成立する。
Ｗδ＜Ｗε＜Ｗζ＜Ｗγ  （２）
続いてノードβは、ＧＤである不図示のノードηへデータフレーム３０１を到達させるため、不適切と判明したノードγ以外の隣接ノードをＬＤとして選択し、データフレーム３０１の再送信を試みる。具体的には式（２）に基づいて、ノードβは、現時点で最も軽い重みＷδと対応付けられたノードδをＬＤとして選択し、ノードδにデータフレーム３０１を送信する。
【００９７】
図５の例では、データフレーム３０１に対するＡＣＫフレームをノードβがノードδから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、ＬＤとして選択したノードδに対応付けられた重みＷδの値を小さくする。その結果、やはり式（２）が成立する。
【００９８】
続いて、データフレーム３０１はネットワーク３ａを介してノードδからノードζに到達したとする。そして、ノードζがＬＤとしてノードβを選択したとする。
すると、ノードβは、ノードβ自身が過去にノードδに送信したデータフレーム３０１をノードζから受信するので、「ノードδへの送信は、ループの存在により失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードδをＬＤとして選択することは不適切である」と学習し、重みＷδの値を大きくする。
【００９９】
ここで、ループして戻ってきたデータフレーム３０１をノードβがノードζから受信する場合も、「ノードβ自身が過去に送信したデータフレーム３０１を受信することでノードβが送信失敗を認識する」という点では上記（Ｄ２）の場合と同様である。したがって、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードδをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードδに対応付けられた重みＷδの値を最大値に設定する。その結果、式（３）が成立する。
Ｗε＜Ｗζ＜Ｗγ＝Ｗδ  （３）
図５には、ノードζから同一データフレーム３０１を受信して重み付けを更新した結果の新しい重み付けの関係として、式（３）を示してある。
【０１００】
続いてノードβは、ＧＤである不図示のノードηへデータフレーム３０１を到達させるため、不適切と判明したノードγおよびδ以外の隣接ノードをＬＤとして選択し、データフレーム３０１の再送信を試みる。具体的には式（３）に基づいて、ノードβは、現時点で最も軽い重みＷεと対応付けられたノードεをＬＤとして選択し、ノードεにデータフレーム３０１を送信する。
【０１０１】
図５の例では、データフレーム３０１に対するＡＣＫフレームをノードβがノードεから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、ＬＤとして選択したノードεに対応付けられた重みＷεの値を小さくする。その結果、やはり式（３）が成立する。
【０１０２】
ここで仮に、ノードεからバックトラックによってデータフレーム３０１がノードβへと返信されることがないとする。また、データフレーム３０１がネットワーク３内をループして、ノードβのいずれかの隣接ノードからノードβに送信され、ノードβで受信されることもないとする。
【０１０３】
すると、式（３）から、ノードβは、データフレーム３０１と同じくノードηをＧＤとする別のデータフレームを隣接ノードα、γ、δ、ζのいずれかから受け取った場合に、最も軽い重みＷεと対応付けられたノードεをＬＤとして優先して選択するようになる。
【０１０４】
図６は、図１のネットワーク１において動的かつ自律分散的に経路が選択される様子を説明する図である。具体的には、図６は、ノード装置Ｎ１がＧＳとなって、ノード装置Ｎ７をＧＤとして指定したデータフレームを送信する場合の、ネットワーク１内での経路選択の様子を示す。
【０１０５】
図６には図１のネットワーク１と、ノード装置Ｎ４とＮ７の間で発生した障害が示されている。また、図６の１２本の太い矢印は、ネットワーク１内で経路が動的に選択されながらデータフレームがＧＳ（すなわちノード装置Ｎ１）からＧＤ（すなわちノード装置Ｎ７）まで転送される様子を表す。
【０１０６】
なお、以下では、ノード装置Ｎｉの重み付けテーブル１０４−Ｎｉのうち、ノード装置Ｎ７に対応するものを便宜的に「１０４−ｈｉ−Ｎｉ」という参照符号で参照することにする（１≦ｉ≦６）。
【０１０７】
また、図６の説明においては、特に断らない限りデータフレームの送信が成功してＡＣＫフレームが返信されるものとし、ＡＣＫフレームの返信については省略して説明を簡略化する。ＡＣＫフレームの返信も含めた一連の処理の流れは、図４２とともに後述する。
【０１０８】
ステップＳ１０１で、ＧＳであるノード装置Ｎ１は、唯一ノード装置Ｎ１に隣接するノード装置Ｎ２をＬＤとして選択し、データフレームをノード装置Ｎ２に送信する。
ノード装置Ｎ２には、ステップＳ１０１で送信されたデータフレームのＬＳであるノード装置Ｎ１のほかに、ノード装置Ｎ３とＮ６が隣接している。そして、この２つの隣接ノード装置Ｎ３とＮ６のうちでノード装置Ｎ３の方が、重み付けテーブル１０４−ｈ２−Ｎ２において、より軽い重みと対応付けられているとする。
【０１０９】
すると、ステップＳ１０２でノード装置Ｎ２は、ステップＳ１０１で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３にデータフレームを送信する。
【０１１０】
ノード装置Ｎ３には、ステップＳ１０２で送信されたデータフレームのＬＳであるノード装置Ｎ２のほかに、ノード装置Ｎ４とＮ５が隣接している。そして、この２つの隣接ノード装置Ｎ４とＮ５のうちでノード装置Ｎ４の方が、重み付けテーブル１０４−ｈ３−Ｎ３において、より軽い重みと対応付けられているとする。
【０１１１】
すると、ステップＳ１０３でノード装置Ｎ３は、ステップＳ１０２で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ４を選択し、ノード装置Ｎ４にデータフレームを送信する。
【０１１２】
ノード装置Ｎ４には、ステップＳ１０３で送信されたデータフレームのＬＳであるノード装置Ｎ３のほかに、ノード装置Ｎ５とＮ７が隣接している。そして、この２つの隣接ノード装置Ｎ５とＮ７のうちでノード装置Ｎ７の方が、重み付けテーブル１０４−ｈ４−Ｎ４において、より軽い重みと対応付けられているとする。
【０１１３】
すると、ステップＳ１０４でノード装置Ｎ４は、ステップＳ１０３で受信したデータフレームを転送するためのＬＤとして、ＧＤでもあるノード装置Ｎ７を選択し、ノード装置Ｎ７にデータフレームを送信する。
【０１１４】
しかし、図６に示すように、ノード装置Ｎ４がノード装置Ｎ７にデータフレームを送信した時点で、ノード装置Ｎ４とＮ７の間のリンクには障害が発生しており、したがって送信は失敗する。すなわち、ノード装置Ｎ４は、所定時間待機してもノード装置Ｎ７からＡＣＫフレームが返信されてこないため、タイムアウトし、送信失敗を認識する。
【０１１５】
なお、ステップＳ１０４におけるノード装置Ｎ４は、図５でノードγへのデータフレームの送信に上記（Ｄ１）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ４は、送信失敗に応じて重み付けテーブル１０４−ｈ４−Ｎ４を更新する（具体的には、ステップＳ１０４の送信でのＬＤであるノード装置Ｎ７に対応付けられた重みの値を大きくする）。
【０１１６】
そして、ステップＳ１０５でノード装置Ｎ４は、ステップＳ１０３で受信したデータフレームを転送するためのＬＤとして、まだ試していない他の隣接ノード装置Ｎ５を選択し、ノード装置Ｎ５にデータフレームを送信する。
【０１１７】
ノード装置Ｎ５には、ステップＳ１０５で送信されたデータフレームのＬＳであるノード装置Ｎ４のほかには、ノード装置Ｎ３のみが隣接している。
そこで、ステップＳ１０６でノード装置Ｎ５は、ステップＳ１０５で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３にデータフレームを送信する。
【０１１８】
すると、ステップＳ１０６でノード装置Ｎ３は、「ノード装置Ｎ３自身がステップＳ１０３で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０６におけるノード装置Ｎ３は、図５においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置Ｎ３は、図５と同様にして重み付けテーブル１０４−ｈ３−Ｎ３を更新する（具体的には、ステップＳ１０３の送信のＬＤであるノード装置Ｎ４に対応付けられた重みの値を最大値に設定する）。
【０１１９】
そして、ステップＳ１０７でノード装置Ｎ３は、ＯＬＳ（すなわち、ステップＳ１０２で最初に当該データフレームをノード装置Ｎ３が受信したときのＬＳであるノード装置Ｎ２）以外の隣接ノード装置の中から、まだＬＤとして試していないものを探す。ここで、ＯＬＳ以外の隣接ノード装置はノード装置Ｎ４とＮ５であり、ノード装置Ｎ４はステップＳ１０３で選択済みである。
【０１２０】
よって、ステップＳ１０７でノード装置Ｎ３は、未選択のノード装置Ｎ５をＬＤとして選択し、ノード装置Ｎ５にデータフレームを送信する。つまり、ステップＳ１０７におけるノード装置Ｎ３は、図５においてノードεをＬＤとして選択しなおしてノードεにデータフレームを送信するノードβに相当する。
【０１２１】
すると、ステップＳ１０７でノード装置Ｎ５は、「ノード装置Ｎ５自身がステップＳ１０６で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０７におけるノード装置Ｎ５は、図５においてノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ５は、図５と同様にして重み付けテーブル１０４−ｈ５−Ｎ５を更新する（具体的には、ステップＳ１０６の送信のＬＤであるノード装置Ｎ３に対応付けられた重みの値を最大値に設定する）。
【０１２２】
そして、ノード装置Ｎ５にとって、ＯＬＳ（すなわちステップＳ１０５で最初に当該データフレームをノード装置Ｎ５が受信したときのＬＳであるノード装置Ｎ４）以外で隣接しているノード装置は、既に送信失敗と判明したノード装置Ｎ３のみである。したがって、もはやＬＤとして選択可能な隣接ノード装置がない。
【０１２３】
よってステップＳ１０８でノード装置Ｎ５は、ＯＬＳであるノード装置Ｎ４にデータフレームを送り返す。ステップＳ１０８はバックトラック動作であり、バックトラック動作によってノード装置Ｎ５は、「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ５自身から先の経路は袋小路（dead end）になっている」ということをノード装置Ｎ４に知らせることができる。
【０１２４】
すると、ステップＳ１０８でノード装置Ｎ４は、「ノード装置Ｎ４自身がステップＳ１０５で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０８におけるノード装置Ｎ４は、図５においてノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ４は、図５と同様にして重み付けテーブル１０４−ｈ４−Ｎ４を更新する（具体的には、ステップＳ１０５の送信のＬＤであるノード装置Ｎ５に対応付けられた重みの値を最大値に設定する）。
【０１２５】
しかし、図５のノードβには、ノードγへのデータフレームの送信に失敗しても、まだＬＤとして選択可能なノードδ等が残っていたが、図６のステップＳ１０８のノード装置Ｎ４にとっては、ＬＤとして選択可能な隣接ノード装置が残っていない。すなわち、ＯＬＳ以外の２つの隣接ノード装置Ｎ７とＮ５は、ステップＳ１０４とＳ１０５でそれぞれＬＤとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
【０１２６】
したがって、ステップＳ１０９でノード装置Ｎ４は、ＯＬＳであるノード装置Ｎ３にデータフレームを送り返す。ステップＳ１０９もバックトラック動作であり、ノード装置Ｎ４はノード装置Ｎ３に「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ４自身から先の経路は袋小路になっている」ということを知らせることができる。
【０１２７】
すると、ステップＳ１０９でノード装置Ｎ３は、「ノード装置Ｎ３自身がステップＳ１０７で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０９におけるノード装置Ｎ４は、図５においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置Ｎ３は、図５と同様にして重み付けテーブル１０４−ｈ３−Ｎ３を更新する（具体的には、ステップＳ１０７の送信のＬＤであるノード装置Ｎ５に対応付けられた重みの値を最大値に設定する）。
【０１２８】
しかし、図５のノードβには、ノードδへのデータフレームの送信が失敗すると判明しても、まだＬＤとして選択可能なノードεが残っていたが、図６のステップＳ１０９のノード装置Ｎ３にとっては、ＬＤとして選択可能な隣接ノード装置が残っていない。すなわち、ＯＬＳ以外の２つの隣接ノード装置Ｎ４とＮ５は、ステップＳ１０３とＳ１０７でそれぞれＬＤとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
【０１２９】
したがって、ステップＳ１１０でノード装置Ｎ３は、ＯＬＳであるノード装置Ｎ２にデータフレームを送り返す。ステップＳ１１０もバックトラック動作であり、ノード装置Ｎ３はノード装置Ｎ２に「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ３自身から先の経路は袋小路になっている」ということを知らせることができる。
【０１３０】
すると、ステップＳ１１０でノード装置Ｎ２は、「ノード装置Ｎ２自身がステップＳ１０２で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１１０におけるノード装置Ｎ２は、図５でノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ２は、図５と同様にして重み付けテーブル１０４−ｈ２−Ｎ２を更新する（具体的には、ステップＳ１０２の送信のＬＤであるノード装置Ｎ３に対応付けられた重みの値を最大値に設定する）。
【０１３１】
そして、ステップＳ１１１でノード装置Ｎ２は、データフレームを転送するためのＬＤとして、まだ試していない他の隣接ノード装置Ｎ６を選択し、ノード装置Ｎ６にデータフレームを送信する。
【０１３２】
ノード装置Ｎ６には、ステップＳ１１１で送信されたデータフレームのＬＳであるノード装置Ｎ２のほかには、ＧＤでもあるノード装置Ｎ７のみが隣接している。
そこで、ステップＳ１１２でノード装置Ｎ６は、ステップＳ１１１で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ７を選択し、ノード装置Ｎ７にデータフレームを送信する。
【０１３３】
以上のようにして、ネットワーク１内に障害が発生しても、各ノード装置が自律分散的に振る舞うことで、データフレームは成功裡にＧＤまで到達する。
また、データフレームの転送において、局所的に不適切なノード装置がＬＤとして選択されても、最終的にはネットワーク全体としては、ＧＳからＧＤに至る経路が選択される。なぜなら、各ノード装置がＬＤとして選択可能なノード装置を次々と選択し、選択可能なノード装置がなくなればバックトラック動作をするからである。
【０１３４】
具体的には、図６の例では、ステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３をＬＤとして選択したことは、結果的には不適切であるとステップＳ１１０で判明する。しかし、ステップＳ１０３〜Ｓ１１０の動作により、ネットワーク１全体としては、最終的にはＧＳからＧＤに至る経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉の選択に成功する。
【０１３５】
こうして選択された経路は学習され、次回以降のデータフレームの転送の効率化に寄与する。学習による効率化について具体的に説明すれば次のとおりである。
ステップＳ１１０でのデータフレームの受信の結果、ノード装置Ｎ２は重み付けテーブル１０４−ｈ２−Ｎ２の学習を行い、ノード装置Ｎ３に対応付けられた重みを最大値に設定している。したがって、ノード装置Ｎ２は、ノード装置Ｎ７をＧＤとする新たなデータフレームを隣接ノード装置Ｎ１から受信すると、最初からノード装置Ｎ６をＬＤとして選択する。つまり、ネットワーク１全体としては、自律分散的な学習の結果、バックトラックを含む試行錯誤なしに、データフレームを効率的に経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉によりＧＤまで送信することが可能となる。
【０１３６】
さらに、第１実施形態によれば、不適切なＬＤの選択の影響または局所的な障害の影響は、ネットワーク１全体には及ばず、局所的に限定される。すなわち、第１実施形態によれば、例えばノード装置Ｎ４とＮ７の間のリンクに障害が発生しても、代替経路を問い合わせるための制御フレームがネットワーク１全体の全ノード装置へとフラッディングされたりはしない。よって、第１実施形態によれば、障害やループが局所的に発生しても、ネットワーク１全体にブロードキャストストームを引き起こすといった事態には陥らない。
【０１３７】
また、図６の例においてノード装置Ｎ１は、ノード装置Ｎ４とＮ７の間のリンクの障害や、ループ〈Ｎ３，Ｎ４，Ｎ５，Ｎ３〉については全く認識することがないのは明らかである。このことは、不適切なＬＤの選択や局所的な障害の影響が、局所的に限定され、ネットワーク１全体には及ばないということを意味している。
【０１３８】
問題の影響が局所的に限定されるということは、局所的な問題がネットワーク１全体にポジティブにフィードバックされて発散することがないということであり、ネットワーク１が系として安定しているということである。問題が局所的に限定されることの別の例を挙げれば、例えば以下のとおりである。
【０１３９】
例えば、仮にネットワーク１においてノード装置Ｎ５とＮ７の間にもリンクが存在し、重み付けテーブル１０４−ｈ５−Ｎ５においてノード装置Ｎ３よりもノード装置Ｎ７の方が軽い重みに対応づけられているとする。すると、ステップＳ１０５の直後にノード装置Ｎ５がノード装置Ｎ７をＬＤとして選択してデータフレームをノード装置Ｎ７に送信する。その結果、ステップＳ１０８〜Ｓ１１２の送信は行われず、ノード装置Ｎ１だけでなくノード装置Ｎ２とＮ３も、障害の発生を全く認識しない。このように、リンクの障害やループの発生などの問題は、問題が生じた場所に応じて最小限の局所的な範囲にしか影響を及ぼさない。
【０１４０】
続いて、ノード装置１００の構成および動作、並びにネットワーク１全体で実現される自律分散協調動作について、更に詳細に説明してゆく。
第１実施形態におけるデータフレームは、図７に示すデータフレーム３０２のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドを含むヘッダ情報、およびペイロードを含む。例えば図５のデータフレーム３０１も、データフレーム３０２と同様の形式である。
【０１４１】
なお、特に限定されるものではないが、ヘッダ情報の一部はアドホックヘッダに格納され、ヘッダ情報の残りの部分はデータヘッダに格納されるようにしてもよい。この場合、例えば、ＬＤ（ローカル宛先アドレス）、ＬＳ（ローカル差出アドレス）、タイプ（フレームタイプ）、長さ（フレームサイズ）はアドホックヘッダに格納される。また、ＧＤ、ＧＳ、ＦＩＤは、データヘッダに格納される。
【０１４２】
データフレーム３０２のＬＤフィールド、ＬＳフィールド、ＧＤフィールド、およびＧＳフィールドには、データフレーム３０２のＬＤ、ＬＳ、ＧＤ、およびＧＳである各ノード装置のノードＩＤがそれぞれ指定される。また、データフレーム３０２のＦＩＤフィールドには、データフレーム３０２のＧＳであるノード装置が生成してデータフレーム３０２に割り当てたＦＩＤが指定される。
【０１４３】
データフレーム３０２のタイプフィールドには、「データフレーム」というタイプを示す所定の定数が指定される。また、データフレーム３０２の長さフィールドには、ペイロードの長さが指定される。データフレーム３０２のペイロードは、データフレーム３０２が定義されるプロトコルよりも上位の層のプロトコルのＰＤＵである。
【０１４４】
例えば、ＭＡＣ副層を仮想的にさらに２つの副層に分割することを想定する。第１実施形態のフレームは、この仮想的な２つの副層のうちの下の方の副層で定義されてもよく、すなわち、ＭＡＣ副層で定義される他のプロトコル（例えばイーサネットなど）のＰＤＵをペイロードに含んでもよい。換言すれば、第１実施形態のフレームは、第２層で定義されるイーサネットフレームをカプセル化するフレームであってもよい。この場合、上位層処理部１１１はイーサネットフレームを処理する処理部であるから、公知のＭＡＣチップを用いて実現することもできる。
【０１４５】
以下では説明の便宜上、データフレーム３０２のペイロードは、ＭＡＣ層プロトコルのフレーム（具体的には例えばイーサネットフレーム）であるものとする。
しかし、もちろん実施形態によっては、データフレーム３０２のペイロードは、ネットワーク層（第３層）以上で定義されるプロトコルのＰＤＵであってもよいし、特定の通信プロトコルとは無関係な生のデータであってもよい。例えば、データフレーム３０２のペイロードがＩＰ（Internet Protocol）データグラムであってもよい。この場合、上位層処理部１１１はＩＰデータグラムを処理する処理部である。
【０１４６】
データフレーム３０２の形式は以上説明したとおりであるが、具体的な値を使ってより詳しく例示すれば、データフレーム３０３および３０４のごとくである。
データフレーム３０３は、図６のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３に送信するデータフレームである。データフレーム３０３の具体的な内容は以下のとおりである。
【０１４７】
・ＬＤフィールドには、ステップＳ１０２の送信においてＬＤとして選択されたノード装置Ｎ３のノードＩＤ（すなわちＮ３）が指定されている。
・ＬＳフィールドには、ステップＳ１０２の送信におけるＬＳであるノード装置Ｎ２のノードＩＤ（すなわちＮ２）が指定されている。
【０１４８】
・ＧＤフィールドには、ＧＳであるノード装置Ｎ１がステップＳ１０１の送信のときに指定したノード装置Ｎ７のノードＩＤ（すなわちＮ７）が指定されている。
・ＧＳフィールドには、ＧＳであるノード装置Ｎ１のノードＩＤ（すなわちＮ１）が指定されている。
【０１４９】
・ＦＩＤフィールドには、ＧＳであるノード装置Ｎ１が生成したＦＩＤ（以下Ｆａとする）が指定されている。
・タイプフィールドには、「データフレーム」というタイプを示す所定の定数Ｄが指定されている。例えば、タイプは２ビットによって表すこともでき、Ｄ＝（００）２でもよい。
【０１５０】
・長さフィールドには、データフレーム３０２のペイロードの長さＰａが指定される。なお、長さは例えばバイト単位で表されてもよいし、その他の単位で表されてもよい。
・ペイロードとして、ＭＡＣ層プロトコルのフレーム（例えばイーサネットフレーム）が含まれる。
【０１５１】
また、データフレーム３０３を受信したノード装置Ｎ３が図６のステップＳ１０３でノード装置Ｎ４に送信するのが、図７のデータフレーム３０４である。データフレーム３０４の具体的な内容は以下のとおりである。
【０１５２】
・ＬＤフィールドには、ステップＳ１０３の送信においてＬＤとして選択されたノード装置Ｎ４のノードＩＤ（すなわちＮ４）が指定されている。つまり、転送にあたって、ノード装置Ｎ３はＬＤフィールドを書き換える。
【０１５３】
・ＬＳフィールドには、ステップＳ１０３の送信におけるＬＳであるノード装置Ｎ３のノードＩＤ（すなわちＮ３）が指定されている。つまり、転送にあたって、ノード装置Ｎ３はＬＳフィールドを書き換え、自ノードＩＤを設定する。
【０１５４】
・ＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドと、ペイロードの内容は、ノード装置Ｎ３が受信したデータフレーム３０３と同じである。
また、第１実施形態におけるハローフレームは、図７のハローフレーム３１１のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ハローフレーム３１１の具体例はハローフレーム３１２であり、ハローフレーム３１２は後述の図４２のステップＳ１２０３でノード装置Ｎ３により送信されるものである。
【０１５５】
ハローフレーム３１１のＬＤフィールドには、ハローフレーム３１１を送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値が指定される。なおここでの「ブロードキャスト」は「隣接するすべてのノード装置へのブロードキャスト」であり、「ネットワーク１全体へのフラッディング」ではないので注意されたい。
【０１５６】
以下、説明の便宜上、第１実施形態においてはノードＩＤが３バイトで表されるものとし、「０ｘ」は１６進数を表すものとする。また、０ｘ００００００と０ｘＦＦＦＦＦＦは予約されており、通常のノードＩＤとしては使われないものとする。
【０１５７】
第１実施形態におけるすべてのハローフレームでは、ハローフレーム３１２と同様、ＬＤフィールドに、当該ハローフレームを送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値として、０ｘＦＦＦＦＦＦが指定されている。
【０１５８】
ハローフレーム３１１のＬＳフィールドには、ハローフレーム３１１を送信するノード装置自身のノードＩＤが指定される。よって、ノード装置Ｎ３が送信するハローフレーム３１２のＬＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０１５９】
また、第１実施形態におけるすべてのハローフレームでは、ＧＤフィールドに、ヌル（null）を表す特殊な値０ｘ００００００が指定される。なぜなら、ハローフレームは隣接ノード装置が利用するだけであり、転送されないからである。
【０１６０】
ハローフレーム３１１のＧＳフィールドには、ＬＳフィールドと同じく、ハローフレーム３１１を送信するノード装置自身のノードＩＤが指定される。よって、ハローフレーム３１２のＧＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０１６１】
ハローフレーム３１１のＦＩＤフィールドには、ハローフレーム３１１を送信するノード装置が生成してハローフレーム３１１に割り当てたＦＩＤが指定される。同様に、ハローフレーム３１２のＦＩＤフィールドには、ハローフレーム３１２を送信するノード装置Ｎ３が生成してハローフレーム３１２に割り当てたＦＩＤ（以下Ｆｂとする）が指定される。
【０１６２】
ハローフレーム３１１のタイプフィールドには、「ハローフレーム」というタイプを示す所定の定数が指定される。具体的には、「ハローフレーム」というタイプは、ハローフレーム３１２に例示するように所定の定数Ｈにより表され、例えばＨ＝（１０）２でもよい。
【０１６３】
また、第１実施形態におけるＡＣＫフレームは、図７のＡＣＫフレーム３２１のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ＡＣＫフレーム３２１の具体例はＡＣＫフレーム３２２である。また、ＡＣＫフレーム３２２は、図６のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３にデータフレーム３０３を送信したとき、ノード装置Ｎ３がノード装置Ｎ２に返信するＡＣＫフレームである。後述の図４２では、このノード装置Ｎ３からノード装置Ｎ２へのＡＣＫフレーム３２２の返信をステップＳ１０２ａとして表している。
【０１６４】
ＡＣＫフレーム３２１のＬＤフィールドには、ＡＣＫフレーム３２１の送信の契機となったデータフレームを送信した隣接ノード装置のノードＩＤが指定される。よって、例えばＡＣＫフレーム３２２のＬＤフィールドには、ＡＣＫフレーム３２２をノード装置Ｎ３が送信する契機となったデータフレーム３０３を送信した、ノード装置Ｎ３の隣接ノード装置Ｎ２のノードＩＤであるＮ２が指定される。
【０１６５】
ＡＣＫフレーム３２１のＬＳフィールドには、ＡＣＫフレーム３２１を送信するノード装置自身のノードＩＤが指定される。よって、ノード装置Ｎ３が送信するＡＣＫフレーム３２２のＬＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０１６６】
また、ハローフレームと同様にＡＣＫフレームも転送されないので、第１実施形態におけるすべてのＡＣＫフレームでは、ＧＤフィールドに、ヌルを表す特殊な値０ｘ００００００が指定される。
【０１６７】
ＡＣＫフレーム３２１のＧＳフィールドとＦＩＤフィールドには、ＡＣＫフレーム３２１の送信の契機となったデータフレームのＧＳフィールドとＦＩＤフィールドの値がコピーされる。上記のように、ＧＳフィールドとＦＩＤフィールドの値の組み合わせにより、データフレームがネットワーク内で一意に識別される。よって、ＡＣＫフレーム３２１を送信するノード装置が、受信したデータフレームから値をコピーすることで、ＡＣＫフレーム３２１がどのデータフレームに対するものなのかを、ＡＣＫフレーム３２１を受信したノード装置において識別することが可能となる。
【０１６８】
よって、例えばデータフレーム３０３の受信を契機として送信されるＡＣＫフレーム３２２では、ＧＳフィールドとＦＩＤフィールドの値は、データフレーム３０３と同じく、それぞれＮ１とＦａである。
【０１６９】
ＡＣＫフレーム３２１のタイプフィールドには、「ＡＣＫフレーム」というタイプを示す所定の定数が指定される。具体的には、「ＡＣＫフレーム」というタイプは、ＡＣＫフレーム３２２に例示するように所定の定数Ａにより表され、例えばＡ＝（１１）２でもよい。
【０１７０】
なお、図７に示したフレームの形式は一例にすぎず、実施形態に応じて、フレームに含まれるフィールドの並び順は適宜決めることができ、また、不図示の他のフィールドをフレームが含んでいてもよい。また、フレームがＦＣＳ（Frame Check Sequence）などのトレイラをさらに含んでいてもよい。
また、以下では記載の簡単化のため、混乱のおそれがない場合は、例えば「ＬＤフィールド」を単に「ＬＤ」と称することもある。他のフィールドについても同様である。
【０１７１】
図８は、図３に示すバッファ部１０９に格納されるデータの例を示す図である。バッファ部１０９は、受信部１０１が受信した個々のデータフレームにそれぞれ対応する複数のエントリを含む。そして、各エントリは、タイムアウト時刻と受信したデータフレームを含む。
【０１７２】
図８は、ノード装置Ｎ３のバッファ部１０９−Ｎ３内のあるエントリを例示している。具体的には、図６のステップＳ１０２において、ノード装置Ｎ２からノード装置Ｎ３が図７のデータフレーム３０３を受信すると、バッファ部１０９−Ｎ３には、タイムアウト時刻ＴＩ３，ｊとデータフレーム３０３とを含むエントリが作成される。バッファ部１０９におけるエントリの作成の詳細は、図２４とともに後述する。また、タイムアウト時刻ＴＩ３，ｊの意味は次のとおりである。
【０１７３】
ノード装置Ｎ３は、ステップＳ１０２で受信したデータフレーム３０３のヘッダを、ステップＳ１０３で図７のデータフレーム３０４のように書き換える。そしてノード装置Ｎ３は、ステップＳ１０３でデータフレーム３０４を送信する。
【０１７４】
図８のタイムアウト時刻ＴＩ３，ｊは、ノード装置Ｎ３が、データフレーム３０４を送信した後、データフレーム３０４に対するＡＣＫフレームの受信をいつまで待つのかを示す。つまり、ノード装置Ｎ３は、タイムアウト時刻ＴＩ３，ｊまでにデータフレーム３０４に対するＡＣＫフレームをノード装置Ｎ４から受信することができなければ、タイムアウトして、ノード装置Ｎ４へのデータフレーム３０４の送信に失敗したと判断する。
【０１７５】
なお、詳しくは図３２、図３８、および図４０に示すように、バッファ部１０９に設定されるタイムアウト時刻は、上書きされることもある。
例えば、図６のステップＳ１０４でノード装置Ｎ７へのデータフレームの送信に失敗したノード装置Ｎ４は、ステップＳ１０５において、ノード装置Ｎ３から受信したデータフレームに対応するバッファ部１０９−Ｎ４内のタイムアウト時刻を更新する。更新後のタイムアウト時刻は、具体的には、ステップＳ１０５でノード装置Ｎ５に送信したデータフレームへのＡＣＫフレームの受信をいつまでノード装置Ｎ４が待つかを表す。
【０１７６】
図９は、図３の隣接ノード管理テーブル１０３の例を示す図である。隣接ノード管理テーブル１０３には、ノードＩＤフィールドと最終更新時刻フィールドがある。
例えば、図１のネットワーク１では、ノード装置Ｎ２にはノード装置Ｎ１、Ｎ３、およびＮ６が隣接している。したがって、ノード装置Ｎ２の隣接ノード管理テーブル１０３−Ｎ２は、これら３つの隣接ノード装置Ｎ１、Ｎ３、およびＮ６にそれぞれ対応する３つのエントリがある。そして、隣接ノード装置Ｎｉ（ｉ＝１，３，６）に対応する各エントリにおいて、ノードＩＤフィールドには隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻ＴＡ２，ｉが格納されている。
【０１７７】
また、図１のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接している。したがって、ノード装置Ｎ３の隣接ノード管理テーブル１０３−Ｎ３は、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリがある。そして、隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリにおいて、ノードＩＤフィールドには隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻ＴＡ３，ｉが格納されている。
【０１７８】
図１０は、図３の重み付けテーブル１０４の例を示す図である。図１０は、具体例として、図１のノード装置Ｎ３の重み付けテーブル１０４−Ｎ３を示している。
図３に示すとおり、「重み付けテーブル１０４」とは、ＧＤごとに管理される複数の重み付けテーブル１０４−１〜１０４−Ｍの総称である。各重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）は、対応するＧＤを記憶している。
【０１７９】
そして、各重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）は１つ以上のエントリを有し、各エントリは、最終更新時刻フィールドとＬＤフィールドと重みフィールドを有する。最終更新時刻フィールドには重みの学習のためにエントリが最後に更新された時刻が格納され、ＬＤフィールドには隣接ノード装置のノードＩＤが格納され、重みフィールドには当該隣接ノード装置に対応付けられた重みの値が格納される。
【０１８０】
図１０の例では、１枚目の重み付けテーブル１０４−１−Ｎ３は、ノード装置Ｎ７がＧＤとして指定されているデータフレームの送信用のテーブルなので、ＧＤとしてノード装置Ｎ７のノードＩＤであるＮ７を記憶している。
【０１８１】
また、図１のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接している。したがって、重み付けテーブル１０４−１−Ｎ３は、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリを有する。重み付けテーブル１０４−１−Ｎ３において隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリの内容は、次のとおりである。
【０１８２】
・最終更新時刻フィールドには、エントリの最終更新時刻ＴＷ３，７，ｉが格納されている。
・ＬＤフィールドには、隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されている。
【０１８３】
・重みフィールドには、隣接ノード装置Ｎｉに対応付けられる重みＷ３，７，ｉが格納されている。
すなわち、重みＷ３，７，ｉは、ノード装置Ｎ７（つまり重み付けテーブル１０４−１−Ｎ３に対応するＧＤ）をＧＤとして指定するデータフレームをノード装置Ｎ３が送信する場合に参照される、隣接ノード装置Ｎｉに対応する重みである。
【０１８４】
同様に、図１０の例では、２枚目の重み付けテーブル１０４−２−Ｎ３は、ノード装置Ｎ４がＧＤとして指定されているデータフレームの送信用のテーブルなので、ＧＤとしてノード装置Ｎ４のノードＩＤであるＮ４を記憶している。
【０１８５】
そして、図１のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接しているので、重み付けテーブル１０４−２−Ｎ３も、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリを有する。重み付けテーブル１０４−１−Ｎ３において隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリの内容は、次のとおりである。
【０１８６】
・最終更新時刻フィールドには、エントリの最終更新時刻ＴＷ３，４，ｉが格納されている。
・ＬＤフィールドには、隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されている。
【０１８７】
・重みフィールドには、隣接ノード装置Ｎｉに対応付けられる重みＷ３，４，ｉが格納されている。
もちろん、重み付けテーブル１０４−Ｎ３には、さらに別のＧＤと対応づけられた重み付けテーブル１０４−ｊ−Ｎ３（ｊ＞２）が含まれていてもよい。
【０１８８】
なお、次の点は注意すべきである。すなわち、重み付けテーブル１０４は、同一のＧＤであれば、たとえＦＩＤとＧＳの組み合わせが異なるデータフレームを送信したとしても、送信の度に、送信先となったＬＤの重みが更新される。例えば、あるデータフレームの送信時に、リンク障害のため特定のＬＤの重みが大きくなっても（優先度が低くなっても）、すぐに別データフレーム（ＧＤとＬＤは同一）の送信で、リンク障害が解消されていて送信成功となれば、該ＬＤの重みは小さくなる（優先度は高くなる）。逆に、複数の異なるデータフレーム（ＧＤとＬＤは同一）が立て続けに、リンク障害のため送信失敗となれば、たとえ同一のＦＩＤとＧＳの組み合わせのデータフレームは１度しか送信を試していなくても、該当のＬＤの重みが最大値になってしまうこともありうる。
【０１８９】
図１１は、図１０の重み付けテーブル１０４−１−Ｎ３の変化を説明する図である。図１１の例では、Ｔａ＜Ｔｂ＜Ｔｃ＜Ｔｄ＜Ｔｅである。
例えば、図６のステップＳ１０２でノード装置Ｎ２からデータフレームを受信した時点では、ノード装置Ｎ３の重み付けテーブル１０４−Ｎ３には、ノード装置Ｎ７に対応する重み付けテーブル１０４−１−Ｎ３が存在しなかったとする。そして、ステップＳ１０２の受信を契機として、以下のような内容の新たな重み付けテーブル１０４−１−Ｎ３が重み付けテーブル１０４−Ｎ３に作成されたとする。
【０１９０】
・３つのエントリの最終更新時刻はいずれも時刻Ｔａである。
・３つのエントリにおいて、隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応付けられる重みＷ３，７，ｉは、いずれも０．５である。
【０１９１】
なお、図６に関しては説明の簡単化のため、「２つの隣接ノード装置Ｎ４とＮ５のうちでノード装置Ｎ４の方が、重み付けテーブル１０４−ｈ３−Ｎ３において、より軽い重みと対応付けられているとする」と説明した。つまり、図１０と図１１はｈ３＝１の例であり、図６の説明ではＷ３，７，４＜Ｗ３，７，５と仮定している。
【０１９２】
しかし、例えば図１１に示すように、Ｗ３，７，２＝Ｗ３，７，４＝Ｗ３，７，５＝０．５という場合もありうる。図１１の例では、ノード装置Ｎ４とＮ５が同じ重み０．５に対応付けられているので、ノード装置Ｎ３はステップＳ１０３での送信のＬＤとしてノード装置Ｎ４とＮ５のいずれを選ぶこともできるが、仮に、図６の例と同様に、ノード装置Ｎ４をＬＤとして選んだとする。
【０１９３】
すると、ステップＳ１０３でノード装置Ｎ３がノード装置Ｎ４にデータフレームを送信する。その後、図４２においてステップＳ１０３ａとして示すようにノード装置Ｎ４がノード装置Ｎ３にＡＣＫフレームを送信すると、ノード装置Ｎ３は、ノード装置Ｎ４へのデータフレームの送信が成功したと認識する。
【０１９４】
そして、図５の例と同様にして、ノード装置Ｎ３は、ノード装置Ｎ４に対応付けられた重みＷ３，７，４の値を小さくする。図１１の例では、具体的には、ノード装置Ｎ３はＷ３，７，４の値を０．５から０．４に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ４に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｂを設定する。
【０１９５】
その後、図６に示すように、ノード装置Ｎ３はステップＳ１０６で再び同一のデータフレームを受信する。その結果、ノード装置Ｎ３は、図６に関して説明したように、重み付けテーブル１０４−１−Ｎ３においてノード装置Ｎ４と対応付けられている重みＷ３，７，４の値を、０．４から最大値である１．０に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ４に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｃを設定する。
【０１９６】
続いて、図６のステップＳ１０７に示すように、ノード装置Ｎ３はノード装置Ｎ５をＬＤとして選択してデータフレームを送信する。その後、図４２においてステップＳ１０７ａとして示すようにノード装置Ｎ５がノード装置Ｎ３にＡＣＫフレームを送信すると、ノード装置Ｎ３は、ノード装置Ｎ５へのデータフレームの送信が成功したと認識する。
【０１９７】
そして、図５の例と同様にして、ノード装置Ｎ３は、ノード装置Ｎ５に対応付けられた重みＷ３，７，５の値を小さくする。図１１の例では、具体的には、ノード装置Ｎ３はＷ３，７，５の値を０．５から０．４に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ５に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｄを設定する。
【０１９８】
その後、図６に示すように、ノード装置Ｎ３はステップＳ１０９で再び同一のデータフレームを受信する。その結果、図６に関して説明したように、重み付けテーブル１０４−１−Ｎ３においてノード装置Ｎ５と対応付けられている重みＷ３，７，５の値を、０．４から最大値である１．０に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ５に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｅを設定する。
【０１９９】
以上のように、重み付けテーブル１０４−１−Ｎ３は、ＡＣＫフレームの受信を契機として、あるいは、送信済みのデータフレームと同一のデータフレームの受信を契機として、更新される。
【０２００】
図１２および図１３は、図３のＦＩＤ管理テーブル１０５の例を示す図である。図１２および図１３に示すように、ＦＩＤ管理テーブル１０５には、ＦＩＤ、ＧＳ、ＬＤ、ＯＬＳ、最終更新時刻の各フィールドがある。
【０２０１】
ＦＩＤ管理テーブル１０５におけるＦＩＤフィールドとＧＳフィールドは、データフレームを一意に識別するためのフィールドであり、受信したデータフレームのＦＩＤフィールドとＧＳフィールドから値がそれぞれコピーされる。
【０２０２】
ＦＩＤ管理テーブル１０５のＬＤフィールドには、ＦＩＤフィールドとＧＳフィールドの値により識別されるデータフレームを送信するために、最後にＬＤとして選択した隣接ノード装置のノードＩＤが格納される。
【０２０３】
また、ＦＩＤ管理テーブル１０５のＯＬＳフィールドには、ＦＩＤフィールドとＧＳフィールドの値により識別されるデータフレームを最初に受信したときに当該データフレームのＬＳフィールドに指定されていた隣接ノード装置のノードＩＤが格納される。ＯＬＳフィールドは、データフレームの転送のためにＬＤを選択するにあたって、ＬＤの候補の中からＯＬＳを除くためにも利用され、バックトラック動作のときのＬＤを決定するためにも利用される。
【０２０４】
そして、ＦＩＤ管理テーブル１０５の最終更新時刻フィールドには、エントリが最後に更新された時刻が格納される。
さて、図１２および図１３は、図６のステップＳ１０１〜Ｓ１１２での各ノード装置のＦＩＤ管理テーブル１０５を具体例として示している。以下、ステップＳ１０１〜Ｓ１１２がそれぞれ実行される時刻をＴＦ１０１〜ＴＦ１１２と表す。
【０２０５】
ステップＳ１０１でノード装置Ｎ１がノード装置Ｎ２にデータフレームを送信するとき、ノード装置Ｎ１はＦＩＤ管理テーブル１０５−Ｎ１に新たなエントリＥ１を作成する。そして、ノード装置Ｎ１は、エントリＥ１のＦＩＤフィールドとＧＳフィールドに、送信したデータフレームのＦＩＤとＧＳの値を設定する。
【０２０６】
ここで、データフレームのＧＳとＦＩＤの値は、前述のとおり、データフレームがネットワーク１内を転送されても書き換えられない。したがって、図６でネットワーク１内をステップＳ１０１〜Ｓ１１２で送信されるデータフレームのＦＩＤとＧＳの値は、図７のデータフレーム３０３および３０４と同じく、それぞれＦａとＮ１である。よって、ステップＳ１０１でノード装置Ｎ１は、エントリＥ１のＦＩＤフィールドとＧＳフィールドに、それぞれＦａとＮ１という値を設定する。
【０２０７】
なお、以下の各ステップＳ１０２〜Ｓ１１２で他のノード装置がそれぞれのＦＩＤ管理テーブル１０５のエントリのＦＩＤフィールドとＧＳフィールドに設定する値も、同じくＦａとＮ１である。よって、以下ではＦＩＤフィールドとＧＳフィールドに関する説明を省略する。また、ステップＳ１０１でノード装置Ｎ１は、ＬＤとして選択したノード装置Ｎ２のノードＩＤであるＮ２を、エントリＥ１のＬＤフィールドに設定する。
【０２０８】
ところで、ＧＳとＦＩＤの値の組により一意に識別される、ある特定のデータフレームに関して、ＯＬＳとは、当該特定のデータフレームを最初に受信したときの当該特定のデータフレームのＬＳに指定されたノードＩＤで識別される隣接ノード装置のことである。
【０２０９】
しかしこのようにＯＬＳを定義すると、例えばノード装置Ｎ１がＧＳとなってデータフレームを送信する場合に、ノード装置Ｎ１自身にとっては、送信したデータフレームに関してＯＬＳが未定義となってしまう。そこで、以下ではＯＬＳの定義を拡張する。具体的には、「ノード装置Ｎｉ自身がＧＳとなってデータフレームを送信する場合には、当該データフレームに関するノード装置Ｎｉ自身にとってのＯＬＳとは、ノード装置Ｎｉ自身である」と定義する。
【０２１０】
換言すれば、ＯＬＳとは、ノード装置Ｎｉ自身が直接認識しているネットワークの範囲内において、ノード装置Ｎｉにとってデータフレームの起源として認識されるノード装置である。なおここで、「ノード装置Ｎｉ自身が直接認識しているネットワークの範囲」とは、ノード装置Ｎｉから見てホップ数１以下の範囲であり、具体的にはノード装置Ｎｉ自身と、ノード装置Ｎｉの隣接ノード装置のみが含まれる。例えば、図２の例では、ノード装置Ｎ１０５自身が直接認識しているネットワークの範囲のみが実線で示されている。
【０２１１】
以上の拡張されたＯＬＳの定義より、ステップＳ１０１でノード装置Ｎ１がエントリＥ１のＯＬＳフィールドに設定する値は、ノード装置Ｎ１自身のノードＩＤ（すなわちＮ１）である。ノード装置Ｎ１は、もし今後ＧＳの値がＮ１でＦＩＤの値がＦａのデータフレームを受信することがあれば、以上のようにして作成したエントリＥ１に基づいて、「かつてノード装置Ｎ１自身が送信したデータフレームを受信した」と認識することができる。
【０２１２】
また、ステップＳ１０１でノード装置Ｎ１は、現在時刻ＴＦ１０１をエントリＥ１の最終更新時刻フィールドに設定する。なお、以下の各ステップＳ１０２〜Ｓ１１２で他のノード装置がそれぞれのＦＩＤ管理テーブル１０５のエントリの最終更新時刻フィールドに設定する値は、同様に、各ステップＳ１０２〜Ｓ１１２が実行される時刻ＴＦ１０２〜ＴＦ１１２である。よって、以下では最終更新時刻フィールドに関する説明も省略する。
【０２１３】
そして、ステップＳ１０１でノード装置Ｎ１からデータフレームを受信したノード装置Ｎ２は、ステップＳ１０２でノード装置Ｎ３にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ２に新たなエントリＥ２を作成する。そして、ノード装置Ｎ２はエントリＥ２において、ＯＬＳフィールドにはＮ１と設定し、ＬＤフィールドにはＮ３と設定する。
【０２１４】
続いて、ステップＳ１０２でノード装置Ｎ２からデータフレームを受信したノード装置Ｎ３は、ステップＳ１０３でノード装置Ｎ４にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリＥ３を作成する。そして、ノード装置Ｎ３はエントリＥ３において、ＯＬＳフィールドにはＮ２と設定し、ＬＤフィールドにはＮ４と設定する。
【０２１５】
続いて、ステップＳ１０３でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ４は、ステップＳ１０４でノード装置Ｎ７にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ４に新たなエントリＥ４を作成する。そして、ノード装置Ｎ４はエントリＥ４において、ＯＬＳフィールドにはＮ３と設定し、ＬＤフィールドにはＮ７と設定する。
【０２１６】
ところが、ステップＳ１０４での送信は、ノード装置Ｎ４とＮ７の間のリンクの障害のために失敗する。すなわち、ノード装置Ｎ４は、ノード装置Ｎ７からＡＣＫフレームを受信することができないため、タイムアウトする。その結果、ノード装置Ｎ４は、ステップＳ１０５のように、他の隣接ノード装置Ｎ５を次のＬＤとして再選択し、ノード装置Ｎ５にデータフレームを送信する。
【０２１７】
ここで、ステップＳ１０４とＳ１０５でそれぞれ送信されるデータフレームは、ＦＩＤの値がＦａでありＧＳの値がＮ１であるから、同一のデータフレームである。したがって、ステップＳ１０５でノード装置Ｎ４は、新たなエントリを作成するのではなく、既存のエントリＥ４を更新する。
【０２１８】
具体的には、ステップＳ１０５でノード装置Ｎ４は、エントリＥ４において、ＬＤフィールドの値をＮ５に上書きする。なお、ＧＳの値がＮ１でＦＩＤの値がＦａである同じデータフレームをノード装置Ｎ４が何度送信しようとも、「ノード装置Ｎ４が当該データフレームを最初に受信したのはノード装置Ｎ３からである」という事実は変わらない。よって、エントリＥ４のＯＬＳフィールドの値は、書き換えられることはなく、Ｎ３のままである。
【０２１９】
続いて、ステップＳ１０５でノード装置Ｎ４からデータフレームを受信したノード装置Ｎ５は、ステップＳ１０６でノード装置Ｎ３にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ５に新たなエントリＥ５を作成する。そして、ノード装置Ｎ５はエントリＥ５において、ＯＬＳフィールドにはＮ４と設定し、ＬＤフィールドにはＮ３と設定する。
【０２２０】
そして、ステップＳ１０６でノード装置Ｎ５からデータフレームを受信したノード装置Ｎ３は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ３を検索し、エントリＥ３を見つける。エントリＥ３が見つかったことから、ノード装置Ｎ３は、「ノード装置Ｎ３自身がかつてステップＳ１０３で送信したのと同一のデータフレームをステップＳ１０６で受信した」と認識することができる。
【０２２１】
したがって、ノード装置Ｎ３は、次のステップＳ１０７でデータフレームをノード装置Ｎ５に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリを作成するのではなく、既存のエントリＥ３を更新する。具体的には、ステップＳ１０７でノード装置Ｎ３は、エントリＥ３において、ＬＤフィールドの値をＮ５に上書きする。なお、エントリＥ３のＯＬＳフィールドの値は書き換えられることはなく、Ｎ２のままである。
【０２２２】
すると、ステップＳ１０７でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ５は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ５を検索し、エントリＥ５を見つける。エントリＥ５が見つかったことから、ノード装置Ｎ５は、「ノード装置Ｎ５自身がかつてステップＳ１０６で送信したのと同一のデータフレームをステップＳ１０７で受信した」と認識することができる。
【０２２３】
したがって、ノード装置Ｎ５は、次のステップＳ１０８でデータフレームをノード装置Ｎ４に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ５に新たなエントリを作成するのではなく、既存のエントリＥ５を更新する。具体的には、ステップＳ１０８でノード装置Ｎ５は、エントリＥ５において、ＬＤフィールドの値をＮ４に上書きする。なお、エントリＥ５のＯＬＳフィールドの値は書き換えられることはなく、Ｎ４のままである。
【０２２４】
すると、ステップＳ１０８でノード装置Ｎ５からデータフレームを受信したノード装置Ｎ４は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ４を検索し、エントリＥ４を見つける。エントリＥ４が見つかったことから、ノード装置Ｎ４は、「ノード装置Ｎ４自身がかつてステップＳ１０５で送信したのと同一のデータフレームをステップＳ１０８で受信した」と認識することができる。
【０２２５】
したがって、ノード装置Ｎ４は、次のステップＳ１０９でデータフレームをノード装置Ｎ３に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ４に新たなエントリを作成するのではなく、既存のエントリＥ４を更新する。具体的には、ステップＳ１０９でノード装置Ｎ４は、エントリＥ４において、ＬＤフィールドの値をＮ３に上書きする。なお、エントリＥ４のＯＬＳフィールドの値は書き換えられることはなく、Ｎ３のままである。
【０２２６】
すると、ステップＳ１０９でノード装置Ｎ４からデータフレームを受信したノード装置Ｎ３は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ３を検索し、エントリＥ３を見つける。エントリＥ３が見つかったことから、ノード装置Ｎ３は、「ノード装置Ｎ３自身がかつてステップＳ１０３で送信したのと同一のデータフレームをステップＳ１０９で受信した」と認識することができる。
【０２２７】
したがって、ノード装置Ｎ３は、次のステップＳ１１０でデータフレームをノード装置Ｎ２に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリを作成するのではなく、既存のエントリＥ３を更新する。具体的には、ステップＳ１１０でノード装置Ｎ３は、エントリＥ３において、ＬＤフィールドの値をＮ２に上書きする。なお、エントリＥ３のＯＬＳフィールドの値は書き換えられることはなく、Ｎ２のままである。
【０２２８】
すると、ステップＳ１１０でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ２は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ２を検索し、エントリＥ２を見つける。エントリＥ２が見つかったことから、ノード装置Ｎ２は、「ノード装置Ｎ２自身がかつてステップＳ１０２で送信したのと同一のデータフレームをステップＳ１１０で受信した」と認識することができる。
【０２２９】
したがって、ノード装置Ｎ２は、次のステップＳ１１１でデータフレームをノード装置Ｎ６に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ２に新たなエントリを作成するのではなく、既存のエントリＥ２を更新する。具体的には、ステップＳ１１１でノード装置Ｎ２は、エントリＥ２において、ＬＤフィールドの値をＮ６に上書きする。なお、エントリＥ２のＯＬＳフィールドの値は書き換えられることはなく、Ｎ１のままである。
【０２３０】
そして、ステップＳ１１１でノード装置Ｎ２からデータフレームを受信したノード装置Ｎ６は、ステップＳ１１２でノード装置Ｎ７にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ６に新たなエントリＥ６を作成する。そして、ノード装置Ｎ６はエントリＥ６において、ＯＬＳフィールドにはＮ２と設定し、ＬＤフィールドにはＮ７と設定する。
【０２３１】
＜バックトラック動作について＞
上述のように、実施形態のフレーム送信方法においては、ノード装置は、受信データフレームを最終宛先へ向かって転送する際に「転送不能」と判定したときは、その受信データフレームを送信元ノード装置に変装する。すなわち、上記ノード装置は、バックトラックを実行する。
【０２３２】
例えば、図１４に示す例では、ノード装置Ｘは、ＧＤ（最終宛先）としてノード装置Ｙが指定されたデータフレームを、まず、ノード装置ａへ送信している。ここで、ノード装置ｂとノード装置Ｙとの間のリンクは切断されているものとする。そうすると、図６を参照しながら説明したように、ノード装置ａからノード装置ｂへ送信されたデータフレームは、ノード装置ｃを経由してノード装置ａに戻ってくる。これにより、ノード装置ａは、ノード装置ｂへの送信が失敗したことを検出する。続いて、ノード装置は、上記データフレームをノード装置ｃへ送信する。しかし、このデータフレームは、ノード装置ｂを経由してノード装置ａに戻ってくる。これにより、ノード装置ａは、ノード装置ｂへの送信も失敗したことを検出する。したがって、ノード装置ａは、「ノード装置ＹをＧＤとするデータフレームを転送することはできない」と判定し、バックトラックを実行する。すなわち、ノード装置ａは、最初にノード装置Ｘから受信したデータフレームを、そのデータフレームのＯＬＳ（オリジナル送信元隣接ノード）であるノード装置Ｘへ送信する。
【０２３３】
この後、ノード装置Ｘは、ノード装置ａから受信したデータフレームを、他の隣接ノード（ここでは、ノードｄ）へ送信する。この結果、上記データフレームは、最終宛先であるノード装置Ｙへ到着する。
【０２３４】
図１５は、図１４に示すノード装置Ｘ、ａ間でバックトラックが発生したときのシーケンスを示す図である。すなわち、ノード装置Ｘは、まず、ノード装置ａへデータフレームを送信する。このとき、ノード装置Ｘは、ノード装置ａへ送信したデータフレームを、図３に示すバッファ部１０９に保持している。
【０２３５】
ノード装置ａは、時刻ＴＥにおいて、ノード装置Ｘから送信されたデータフレームを受信する。そうすると、ノード装置ａは、ＦＩＤ管理テーブル１０５に新たなエントリを作成し、受信データフレームに係わる情報を記録する。
【０２３６】
図１６は、ＦＩＤ管理テーブル１０５の実施例である。ＦＩＤ管理テーブル１０５は、図１２〜図１３を参照しながら説明したが、より具体的には、ＦＩＤおよびＧＳのペアに対して、ＬＤ、ＯＬＳ、最終更新時刻だけでなく、さらにＡＣＫ受信フラグ、空データ送信回数、通常データ送信回数、エントリ時刻を管理する。エントリ時刻は、ノード装置が隣接ノードからデータフレームを最初に受信した時刻、または、ノード装置が隣接ノード装置から受信したデータフレームを他の隣接ノード装置へ転送した時刻を表す。前者の場合、エントリ時刻は、受信開始時刻であってもよいし、受信終了時刻であってもよい。また、後者の場合、エントリ時刻は、転送開始時刻であってもよいし、転送終了時刻であってもよい。以下の説明では、特に限定されるものではないが、エントリ時刻は、データフレームを隣接ノード装置から最初に受信した時刻を表すものとする。なお、ＡＣＫ受信フラグ、空データ送信回数、通常データ送信回数については、後で説明する。
【０２３７】
ノード装置ａは、ノード装置Ｘから送信されたデータフレームを時刻ＴＥにおいて受信すると、図１６に示すような新たなエントリを作成する。この例では、ＦＩＤフィールドには、ＧＳであるノード装置Ｘにより生成された一意の値ＦＸが記録される。ＧＳフィールドには「ノードＸ」が記録される。ＬＤフィールドには、この例では、データフレームはノード装置ｂへ送信されるので、「ノードｂ」が記録される。ＯＬＳフィールドには、「ノードＸ」が記録される。そして、エントリ時刻ＴＥおよび最終更新時刻ＴＦとして、ノード装置Ｘから送信されたデータフレームを受信した時刻が記録される。
【０２３８】
ノード装置ａは、ノード装置Ｘから送信されたデータフレームをノード装置ｂへ転送すると共に、ノード装置ＸへＡＣＫフレームを返送する。ノード装置Ｘは、ノード装置ａからＡＣＫフレームを受信することで、送信したデータフレームがノード装置ａに到着したことを認識する。ただし、ノード装置Ｘは、ＡＣＫフレームを受信しても、バッファ部１０９に格納されているデータフレーム廃棄することなく、ノード装置ａへの送信時刻から所定の保持期間Ｇが経過するまでは、そのデータフレームを保持する。
【０２３９】
一方、ノード装置ａからノード装置ｂへ送信されたデータフレームは、図１４に示すように、ノード装置ａに戻ってくる。そうすると、ノード装置ａは、「ノード装置ＹをＧＤとするデータフレームを転送できない」ことをノード装置Ｘに通知するために、バックトラックを実行する。このとき、ノード装置ａは、例えば、図１４を参照しながら説明したように、上記データフレームをノード装置Ｘに送信する。そうすると、ノード装置Ｘは、自分が先にノード装置ａへ送信したデータフレームを検出するので、「ノード装置ａは、ノード装置ＹをＧＤとするデータフレームを転送することはできない」と判定する。この結果、ノード装置Ｘは、上記データフレームを他の隣接ノード（この例では、ノードｄ）へ送信する。
【０２４０】
しかし、ノード装置Ｘのバッファ部１０９は、ノード装置ａへデータフレームを送信したときから保持期間Ｇが経過するまでは、そのデータフレームを保持する。すなわち、時刻Ｔg以前は、ノード装置Ｘからノード装置ａへ先に送信されたデータフレームは、ノード装置Ｘのバッファ部１０９に保持されている。したがって、ノード装置ａによるバックトラック動作が、時刻Ｔgよりも前に実行されるのであれば、ノード装置ａは、上記データフレーム全体をノード装置Ｘへ送信する必要はなく、「指定されたＧＤへの転送はできない」ことをノード装置Ｘへ通知すればよい。この場合、ノード装置Ｘは、ノード装置ａからの通知に応じて、バッファ部１０９に保持されているデータフレームを取り出してノード装置ｄへ送信することができる。
【０２４１】
上記動作を実現するために、ノード装置ａは、バックトラック動作の実行時に、ノード装置Ｘからデータフレームを受信した時刻を表すエントリ時刻ＴＥから現在時刻Ｔまでの経過時間を算出する。すなわち、経過時間「Ｔ−ＴＥ」が算出される。そして、この経過時間「Ｔ−ＴＥ」が保持期間Ｇよりも短ければ、ノード装置ａは、ノード装置Ｘのバッファ部１０９にバックトラックに対応するデータフレームが保持されていると判定する。この場合、ノード装置ａは、上記データフレーム全体を送信する代わりに、上記データフレームを識別するフレーム識別情報を通知するためのフレーム（以下、空データフレームと呼ぶ）をノード装置Ｘへ送信する。なお、保持期間Ｇは、この実施形態では、各ノード装置において同じであるものとする。
【０２４２】
図１７は、バックトラックで使用するフレームのフォーマットを示す図である。なお、データフレーム、ハローフレーム、ＡＣＫフレームのフォーマットの一例については、図７を参照して説明した。しかし、実施形態のノード装置によって送受信されるフレームのフォーマットは、所定のヘッダ情報が設定されている限りは、特に限定されるものではない。したがって、以下では、例えばデータフレームは、図１７（ａ）に示すフォーマットを有しているものとする。
【０２４３】
すなわち、データフレームは、アドホックヘッダおよびペイロードを有する。アドホックヘッダには、ＬＤ（ローカル宛先アドレス）、ＬＳ（ローカル差出アドレス）、フレームタイプ（タイプ）、フレームサイズ（長さ）が設定される。これらの各情報要素については、上述した通りである。また、ペイロード領域には、データヘッダおよび「データ」が格納される。データヘッダには、ＧＳ、ＧＤ、ＦＩＤが設定される。なお、この実施例では、データヘッダにはＧＳ、ＧＤ、ＦＩＤのみが格納されるが、ＧＳ、ＧＤ、ＦＩＤに加えて他の情報が格納されるようにしてもよい。ペイロード領域に格納される「データ」は、ＧＤに送信すべきデータである。
【０２４４】
なお、ハローフレームおよびＡＣＫフレームのペイロードには、データヘッダは格納されるが、「データ」は格納されていない。また、ハローフレーム、データフレーム、ＡＣＫフレームは、フレームタイプにより識別される。特に限定されるものではないが、ハローフレーム、データフレーム、ＡＣＫフレームのフレームタイプには、この実施例では、例えば、それぞれ「0x0001」「0x0002」「0x0003」が割り当てられる。
【０２４５】
図１７（ｂ）は、バックトラック動作において送信される空データフレームのフォーマットを示す。空データフレームのアドホックヘッダには、図１７（ａ）に示す通常のデータフレームと同様に、ＬＤ、ＬＳ、フレームタイプ、フレームサイズが設定される。例えば、図１４に示す例において、ノード装置ａからノード装置Ｘへのバックトラック時に作成される空データフレームの場合は、「ＬＤ＝Ｘ」「ＬＳ＝ａ」が設定される。また、空データフレームのフレームタイプには、この例では、「0x0004」が割り当てられる。さらに、フレームサイズは、ペイロードのデータサイズが設定される。
【０２４６】
空データフレームのペイロードには、データヘッダのみが格納され、最終宛先へ伝送すべきデータは格納されない。データヘッダには、上述したように、ＧＳ、ＧＤ、ＦＩＤが設定される。なお、データヘッダは、基本的に、各ノード装置により転送される過程で変更されることはなく、ＧＳにおいて生成される情報がそのまま設定される。したがって、例えば、図１４に示す例において、ノード装置ａからノード装置Ｘへのバックトラック時に作成される空データフレームの場合は、「ＧＳ＝Ｘ」「ＧＤ＝Ｙ」が設定され、ＦＩＤはノード装置Ｘで生成された値がそのまま設定される。
【０２４７】
ノード装置ａは、経過時間「Ｔ−ＴＥ」が保持期間Ｇよりも短ければ、バックトラック動作において、ＯＬＳであるノード装置Ｘへ空データフレームを送信する。この場合、ノード装置Ｘは、空データフレームのアドホックヘッダおよびデータヘッダを参照し、バッファ部１０９から対応するデータフレームを抽出する。そして、ノード装置Ｘは、バッファ部１０９から抽出したデータフレームを、他の隣接ノード（この例では、隣接ノードｄ）へ送信する。
【０２４８】
なお、各ノード装置は、それぞれ自律的に、上述したバックトラック動作を実行することができる。例えば、図１４に示す例では、ノード装置ｃは、ノード装置ｂに対するバックトラック動作において空データフレームを送信することができる。同様に、ノード装置ｂは、ノード装置ａに対するバックトラック動作において空データフレームを送信することができる。
【０２４９】
このように、実施形態のノード装置は、データフレームを最初に受信したとき（エントリ時刻）からの経過時間が保持期間Ｇを超える前にバックトラック動作を行う場合には、データフレーム全体を送信することなく、そのデータフレームを識別するためのフレーム識別情報のみを送信する。したがって、バックトラック時に転送されるフレームのサイズが小さくなり、フレームの転送効率が改善する。
【０２５０】
ところで、サイズの大きなデータを送信する場合、そのデータは、複数のデータユニットに分割され、複数のデータフレームを利用して連続して伝送される。この場合、実施形態に係るネットワークにおいては、上述の複数の連続するデータフレームは、同じ経路で伝送される可能性が高い。そうすると、図１４に示す例では、ノード装置ａは、上述の複数の連続するデータフレームのそれぞれについて「ＧＤへ転送不能」と判定することになる。この結果、ノード装置ａは、複数のバックトラック動作を実行する必要がある。
【０２５１】
そこで、実施形態のノード装置は、複数の空データフレームの送信先隣接ノードが同じときは、それら複数の空データフレームを集約して１つのフレームで送信する。図１８に示す例では、４つのデータフレームが同じ経路で伝送され、いずれもノード装置ａに戻ってきている。ここで、ノード装置ａにとって、上記４つのデータフレームのＯＬＳは、いずれもノード装置Ｘである。すなわち、ノード装置ａは、ノード装置Ｘへ送信すべき４つの空データフレームを有している。この場合、ノード装置ａは、これら４つの空データフレームを集約することにより生成される１つのフレームをノード装置Ｘへ送信する。以下では、複数の空データフレームを集約することで得られるフレームを「集約空データフレーム」と呼ぶことにする。
【０２５２】
集約空データフレームのフォーマットを図１７（ｃ）に示す。集約空データフレームのアドホックヘッダには、図１７（ａ）に示す通常データフレームまたは図１７（ｂ）に示す空データフレームと同様に、ＬＤ、ＬＳ、フレームタイプ、フレームサイズが設定される。ここで、集約空データフレームのアドホックヘッダに設定されるＬＤ、ＬＳは、集約される各空データフレームのアドホックヘッダに設定されている値がそのまま使用される。したがって、図１８に示す例において、ノード装置ａからノード装置Ｘへ送信される集約空データフレームのアドホックヘッダには「ＬＤ＝Ｘ」「ＬＳ＝ａ」が設定される。なお、集約空データフレームのフレームタイプには、この例では、「0x0005」が割り当てられる。また、集約空データフレームのフレームサイズは、ペイロードに格納されるデータヘッダの個数に応じて決まる。
【０２５３】
集約空データフレームのペイロードには、同じ隣接ノードへ送信される複数の空データフレームの「データヘッダ」が格納される。図１７（ｃ）に示す例では、１つの集約空データフレームのペイロードにｎ個のデータヘッダが格納されている。
【０２５４】
ノード装置Ｘは、集約空データフレームを受信すると、ペイロードから複数のデータヘッダを抽出する。そして、ノード装置Ｘは、バッファ部１０９から各データヘッダに対応するデータフレームを抽出し、それぞれ他の隣接ノード（この例では、隣接ノードｄ）へ送信する。
【０２５５】
なお、集約空データフレームは、同じＬＤが設定された複数の空データフレームを集約することで作成される。このとき、異なるＧＤが設定された複数の空データフレームから集約空データフレームを作成するようにしてもよい。この場合、集約空データフレームを受信したノード装置は、対応する複数のデータフレームを異なる隣接ノードに送信することがある。
【０２５６】
このように、実施形態に係るネットワークでは、データフレームを最終宛先まで伝送するために、バックトラック動作が必要になることがある。このとき、実施形態のノード装置は、バックトラック時に送信するデータがバックトラックの送信先隣接ノードに保持されていると見込まれる場合には、空データフレームを送信する。これにより、バックトラックの送信先隣接ノードに保持されているデータを有効に利用でき、バックトラックに係わるデータ量を削減できる。また、集約空データフレームを利用して複数のデータヘッダを一括して送信する場合には、バックトラックに係わるデータ量をさらに削減できる。したがって、実施形態のフレーム送信方法によれば、フレームの転送効率が改善する。
【０２５７】
なお、各ノード装置が搭載する電池の寿命を長くするためには、ビットレートの低い通信方式が採用されることが多い。この場合、一般に、フレームサイズが小さくなる。そうすると、サイズの大きなデータを送信する場合、多数のデータフレームを利用してデータが伝送される。したがって、実施形態に係る集約空データフレームを利用してバックトラックを行う構成を採用すれば、各ノード装置の消費電力を抑えることができ、各ノード装置が搭載する電池の寿命を長くすることができる。
【０２５８】
例えば、フレームサイズの最大値が１２８バイトであるネットワークにおいて、１５００バイトのデータを送信するケースを考える。ここで、例えば、アドホックヘッダが２０バイトであるものとする。また、図１７では、データヘッダの要素がＧＳ、ＤＳ、ＦＩＤのみであり、そのデータ長は１８バイトであるが、ここではデータヘッダのデータ長が２２バイトであるものとする。そうすると、各フレームについてデータを格納できる領域は８６バイトであり、上記１５００バイトのデータは、１８個のデータフレームを利用して伝送されることになる。
【０２５９】
ここで、仮に、上記１８個のデータフレームが連続して送信され、その全てについてバックトラックが発生するものとする。そうすると、実施形態のフレーム送信方法を使用しないと、１８個のバックトラックフレームが送信されることになる。これに対して、実施形態のフレーム送信方法による集約空データフレームを使用すれば、各フレームのペイロードに４個のデータヘッダを格納することができる。したがって、上記１８個のデータフレームに応じてバックトラックで送信される集約空データフレームの数は、５個になる。このように、実施形態の方法によれば、バックトラック時に送信されるフレームの数が削減され、フレームの転送効率が向上する。
【０２６０】
図１９は、バックトラックを実行するノード装置の動作を示すフローチャートである。このフローチャートの処理は、例えば、バックトラックが必要と判定されたときにデータフレーム処理部１１０により実行される。図１４に示す例では、ノード装置ａのデータフレーム処理部１１０は、ノード装置Ｘから受信したデータフレームを最終宛先へ伝送できないと判断したときに、図１９に示すフローチャートの処理を開始する。なお、以下の説明では、バックトラック動作に係るデータフレームを「対象データフレーム」と呼ぶことがある。
【０２６１】
ステップＳ１において、データフレーム処理部１１０は、現在時刻Ｔを抽出する。各データ装置は、それぞれ時計を備えているものとする。この場合、各ノード装置が備える時計は、互いに同期していることが好ましい。
【０２６２】
ステップＳ２において、データフレーム処理部１１０は、バッファ部１０９のエージング時間Ｇを抽出する。なお、バッファ部１０９のエージング時間Ｇは、図１４〜図１８を参照した説明では「保持時間Ｇ」として記載したものである。また、バッファ部１０９のエージング時間Ｇは、この例では、各ノード装置において同じ値が使用される。そして、各ノード装置において、エージング時間Ｇは、予め決められたメモリ領域に記録されている。
【０２６３】
バッファ部１０９のエージング時間Ｇは、ノード装置がデータフレームを送信したときから、そのデータフレームが隣接ノード装置のバックトラック動作によりそのノード装置に戻ってくるまでの時間に対して十分に長く設定される。よって、エージング時間Ｇは、ネットワークの構成にもよるが、例えば、３０秒程度に設定される。
【０２６４】
ステップＳ３において、データフレーム処理部１１０は、対象データフレームのＦＩＤおよびＧＳのペアでＦＩＤ管理テーブル１０５を参照し、対応するエントリ時刻ＴＥを抽出する。なお、図１４に示す例では、ノード装置ａは、ノード装置Ｘから対象データフレームを受信したときに、ＦＩＤ管理テーブル１０５にその対象データフレームに係るエントリを作成する。このとき、対象データフレームにＦＩＤおよびＧＳ等が記録される。そして、対象データフレームが最初に転送されたときに（すなわち、ノード装置ｂへ送信されたときに）、エントリ時刻ＴＥが記録される。したがって、データフレーム処理部１１０は、上述のようにして記録されたエントリ時刻ＴＥを抽出する。
【０２６５】
ステップＳ４〜Ｓ５において、データフレーム処理部１１０は、バックトラック動作の宛先ノード装置において、対象データフレームが保持されているか否かを判定する。ここで、バックトラック動作の宛先ノード装置は、対象データフレームのＯＬＳであり、ＦＩＤ管理テーブル１０５に記録されている。以下では、バックトラック動作の宛先ノード装置を「ＯＬＳノード装置」と呼ぶことがある。そして、ステップＳ４〜Ｓ５では、具体的には、対象データフレームのエントリ時刻ＴＥから現在時刻Ｔまでの経過時間「Ｔ−ＴＥ」が、バッファ部１０９のエージング時間Ｇよりも短ければ、対象データフレームがバッファ部１０９に保持されていると判定される。
【０２６６】
このとき「Ｇ＞Ｔ−ＴＥ」であれば（ステップＳ５：Ｙｅｓ）、データフレーム処理部１１０は、対象データフレームがＯＬＳノード装置に保持されていると判定する。この場合、ＯＬＳノード装置は、対象データフレームを新たに受信しなくても、バッファ部１０９に保持されている対象データフレームを利用して送信処理を行うことができる。したがって、データフレーム処理部１１０は、ステップＳ６において、対象データフレームのフレーム識別情報を通知するための空データフレームを作成する。空データフレームは、図１７（ｂ）に示すように、アドホックヘッダおよびペイロードを有する。そして、ペイロードには、対象データフレームのデータヘッダのみが格納される。
【０２６７】
図１４に示す例では、ノード装置ａにより作成される空データフレームのアドホックヘッダには「ＬＤ＝Ｘ」「ＬＳ＝ａ」「フレームタイプ＝0x0004」「フレームサイズ＝データヘッダのデータ長」が設定される。また、ペイロードに格納されるデータヘッダには、「ＧＳ＝Ｘ」「ＧＤ＝Ｙ」「ＦＩＤ＝ノード装置Ｘにより生成された値」が記録されている。
【０２６８】
一方、「Ｇ＞Ｔ−ＴＥ」でなければ（ステップＳ５：Ｎｏ）、データフレーム処理部１１０は、対象データフレームがＯＬＳノード装置に保持されていないと判定する。この場合、ＯＬＳノード装置は、最終宛先へデータを送信するために、対象データフレームを新たに受信しなければならない。したがって、データフレーム処理部１１０は、ステップＳ７において、通常のデータフレームを作成する。通常のデータフレームは、上述した空データフレームのペイロードにおいて、データヘッダに加えて、ＧＳに伝送すべきデータが格納される。
【０２６９】
ステップＳ８において、データフレーム処理部１１０は、ステップＳ６またはＳ７で生成したフレームを利用してバックトラックを実行する。すなわち、データフレーム処理部１１０は、ステップＳ６またはＳ７で生成したフレームを送信キュー１１４に保存する。そうすると、送信部１０２は、例えば、定期的に送信キュー１１４に保存されているフレームを読み出して送信する。フレームの送信先は、アドホックヘッダに設定されているＬＤである。
【０２７０】
図２０は、送信キュー１１４の実施例である。送信キュー１１４には、ノード装置から送信されるフレームが格納される。すなわち、送信キュー１１４には、データフレーム処理部１１０により生成されるデータフレーム（空データフレームを含む）が格納される。また、送信キュー１１４には、ハローフレームおよびＡＣＫクレームも格納されるようにしてもよい。
【０２７１】
送信キュー１１４に新たなフレームが保存されるときは、図２０（ａ）に示すように、各フレームにエントリ番号が割り当てられる。そして、送信キュー１１４は、各エントリ番号に対して、ＬＤ、ＬＳ、フレームタイプ、ＡＣＫ受信済みフラグ、ペイロードを保存する。ここで、ＬＤ、ＬＳ、フレームタイプは、送信フレームのアドホックヘッダに相当する。なお、図２０（ａ）では示されていないが、ＬＤ、ＬＳ、フレームタイプに加えてフレームサイズも合わせて保存されるようにしてもよい。ＡＣＫ受信済みフラグは、フレームが送信された後に、送信先ノード装置から対応するＡＣＫフレームを受信したか否かを表す。よって、各エントリのＡＣＫ受信済みフラグは、送信キュー１１４に格納された時点では「未」が設定される。
【０２７２】
送信キュー１１４のペイロード領域には、それぞれ、各フレームのペイロードデータが格納される。ただし、空データフレームのペイロードには、図１７（ｂ）に示すように、データヘッダのみが格納されている。したがって、送信キュー１１４に空データフレームが保存されるときは、ペイロード領域には１つのデータヘッダのみが保存される。
【０２７３】
例えば、図２０（ａ）に示すエントリ0x0001には、図１４においてノード装置ａからバックトラック動作でノード装置Ｘへ送信される空データフレームが保存されている。すなわち、アドホックヘッダから得られる「ＬＤ＝Ｘ」「ＬＳ＝ａ」「フレームタイプ＝0x0004」が保存されている。このとき、ＡＣＫ受信済みフラグには「未」が設定される。また、このエントリのペイロード領域には、上記空データフレームのデータヘッダが保存される。
【０２７４】
なお、ノード装置が図１８に示す空データフレームの集約を行わない場合は、送信部１０２は、ステップＳ６またはＳ７で生成されたフレームを即座に送信してもよい。この場合、ノード装置は、送信キュー１１４を備えなくてもよい。すなわち、データフレーム処理部１１０は、作成したフレームを送信部１０２に渡し、送信部１０２は、そのフレームを即座に送信してもよい。
【０２７５】
図２１および図２２は、バックトラック動作において空データフレームを集約する処理を示すフローチャートである。このフローチャートの処理は、所定の時間間隔でデータフレーム処理部１１０により繰り返し実行される。なお、ノード装置は、一定値が設定されるタイマを備える。このタイマは、クロック信号等によりカウントダウンし、ゼロになった時点でイベントを発生すると共に、再び上記一定値に戻る。そして、データフレーム処理部１１０は、このタイマにより生成されるイベントをトリガとして図２１〜図２２に示すフローチャートの処理を開始する。
【０２７６】
ステップＳ１１において、データフレーム処理部１１０は、バックトラック動作に係わる変数を初期化する。例えば、ＦＩＤ管理テーブル１０５において、各エントリの空データ送信回数および通常データ送信回数が「ゼロ」に初期化される。また、送信キュー１１４の各エントリを順番に指定するための変数ｉは、「１」に初期化される。
【０２７７】
ステップＳ１２において、データフレーム処理部１１０は、送信キュー１１４をロックする。なお、送信キュー１１４がロックされている期間は、送信部１０２は、送信キュー１１４からフレームを読み出して送信することはできない。
【０２７８】
ステップＳ１３〜Ｓ１７において、データフレーム処理部１１０は、送信キュー１１４の各エントリにアクセスし、未処理状態の空データフレームを抽出する。すなわち、ステップＳ１３〜Ｓ１４では、ｉ番目のエントリにフレームが保存されているか否かがチェックされる。このとき、ｉ番目のエントリにフレームが保存されていれば、ステップＳ１５の処理が実行される。一方、送信キュー１１４に保存されているすべてのフレーム対してステップＳ１５以降の処理が実行されたときは（ステップＳ１４：Ｎｏ）、ステップＳ３１の処理が実行される。
【０２７９】
ステップＳ１５〜Ｓ１６において、データフレーム処理部１１０は、対象エントリに保存されているフレームのフレームタイプおよびＡＣＫ受信済みフラグをチェックする。そして、対象エントリに未送信の集約されていない空データフレームが保存されていたときは、ステップＳ２１に進む。この実施例では、ハローフレーム、通常データフレーム、ＡＣＫフレーム、空データフレーム（集約されていない空データフレーム）、集約空データフレームのフレームタイプは、それぞれ、0x0001、0x0002、0x0003、0x0004、0x0005である。したがって、対象エントリにおいて「フレームタイプ＝0x0004」および「ＡＣＫ受信済みフラグ＝未」が検出されれば、ステップＳ２１に進む。例えば、図２０（ａ）に示す例では、エントリ0x0001に対してステップＳ１５〜Ｓ１６を実行すると「Ｙｅｓ」と判定され、エントリ0x0002に対してステップＳ１５〜Ｓ１６を実行すると「Ｎｏ」と判定される。
【０２８０】
なお、対象エントリのフレームタイプが0x0004でなかった場合、或いは、ＡＣＫ受信済みフラグが「済み」であったときは、ステップＳ１７において変数ｉがインクリメントされる。この場合、ステップＳ１３に戻って送信キュー１１４の次のエントリが選択される。
【０２８１】
ステップＳ２１〜Ｓ２２において、データフレーム処理部１１０は、作業領域に格納されている空データフレームを確認する。ここで、作業領域は、送信キュー１１４から取り出した空データフレームを一時的に格納するバッファメモリである。また、作業領域は、複数の空データフレームを集約するために使用される。そして、データフレーム処理部１１０は、対象エントリと同じＬＤが設定されている空データフレームが作業領域に存在するか否かをチェックする。
【０２８２】
対象エントリの空データフレームと同じＬＤが設定されている空データフレームが作業領域に存在しないときは、データフレーム処理部１１０は、ステップＳ２３において、対象エントリのＡＣＫ受信済みフラグに「済み」を設定する。なお、ＡＣＫ受信済みフラグが「済み」に設定されているエントリのフレームは、実際に送信される前であっても、図２１〜図２２に示すフローチャートの中では、既に送信されて対応するＡＣＫフレームを受け取ったものとして扱われる。したがって、ＡＣＫ受信済みフラグが「済み」に設定されているエントリのフレームは、空データフレームであっても、ステップＳ１６で選択されることはない。
【０２８３】
ステップＳ２４において、データフレーム処理部１１０は、対象エントリの空データフレームを作業領域に保存する。以降、この空データフレームは、集約処理状態となる。そして、ステップＳ２５において、データフレーム処理部１１０は、変数ｉをインクリメントしてステップＳ１３に戻る。すなわち、次のエントリが選択される。
【０２８４】
対象エントリの空データフレームと同じＬＤが設定されている空データフレームが作業領域に存在するときは（ステップＳ２２：Ｙｅｓ）、ステップＳ２６が実行される。ステップＳ２６においては、データフレーム処理部１１０は、ステップＳ２２において検出された作業領域内の空データフレームに、対象エントリの空データフレームを追加する。このとき、これらの２つの空データフレームのアドホックヘッダ（ＬＤ、ＬＳ、フレームタイプ）は互いに同じである。よって、ステップＳ２６では、作業領域内の空データフレームに、対象エントリの空データフレームのペイロードが追加される。このとき、対象エントリのＡＣＫ受信済みフラグに「済み」が設定される。
【０２８５】
ステップＳ２７において、データフレーム処理部１１０は、ステップＳ２６で得られる空データフレームのサイズが予め決められた閾値以下であるかをチェックする。この閾値は、作業領域に格納されている集約処理状態の空データフレームに、さらに他の空データフレームのペイロードを追加できるか否かを判断するために使用される。よって、この閾値は、例えば、実施形態に係るネットワークで規定される最大フレームサイズよりも、データヘッダ長だけ小さい値に決定される。そして、上記空データフレームのサイズが閾値以下であれば、上記集約処理状態の空データフレームにさらにデータヘッダを追加可能と判断される。この場合、ステップＳ２５において変数ｉがインクリメントされた後、ステップＳ１３に戻る。すなわち、次のエントリが選択される。
【０２８６】
一方、上記空データフレームのサイズが閾値を超えていれば、データフレーム処理部１１０は、ステップＳ２８において、上記空データフレームのフレームタイプに、集約空データフレームを表す値を設定する。この例では「0x0005」が設定される。すなわち、集約空データフレームが生成される。そして、データフレーム処理部１１０は、送信キュー１１４に新たなエントリを生成し、生成した集約空データフレームをそのエントリに保存する。このとき、このエントリのＡＣＫ受信済みフラグには「未」が設定される。この後、ステップＳ２５において変数ｉがインクリメントされた後、ステップＳ１３に戻る。すなわち、次のエントリが選択される。
【０２８７】
送信キュー１１４のすべてのエントリが選択されると（ステップＳ１４：Ｎｏ）、データフレーム処理部１１０は、ステップＳ３１の処理を実行する。ステップＳ３１は、作業領域内の各空データフレームに対して実行されるが、基本的には、ステップＳ２８と同じである。すなわち、ステップＳ３１では、まず、作業領域内の各空データフレームのフレームタイプに、それぞれ集約空データフレームを表す値が設定される。これにより、集約空データフレームが生成される。続いて、各集約空データフレームは、送信キュー１１４に保存される。このとき、対応するＡＣＫ受信済みフラグには「未」が設定される。
【０２８８】
ステップＳ３２において、データフレーム処理部１１０は、送信キュー１１４のロックを解除する。したがって、以降、送信部１０２は、送信キュー１１４からフレームを読み出して送信することができる。
【０２８９】
次に、図２１〜図２２に示す集約処理の実施例を説明する。以下では、集約処理の開始時に、送信キュー１１４は図２０（ａ）に示す状態であるものとする。また、作業領域は初期化されているものとする。
【０２９０】
（１）送信キュー１１４のエントリ0x0001が選択される。このエントリには「フレームタイプ＝0x0004（空データフレーム）」および「ＡＣＫ受信済みフラグ＝未」が設定されている。よって、ステップＳ１６で「Ｙｅｓ」と判定され、ステップＳ２１以降の処理が実行される。
【０２９１】
（２）この時点では、作業領域には空データフレームが格納されていないので、ステップＳ２２で「Ｎｏ」と判定される。よって、ステップＳ２３においてエントリ0x0001のＡＣＫ受信済みフラグに「済み」が設定される。また、ステップＳ２４において、エントリ0x0001の空データフレームが作業領域に保存される。なお、この空データフレームのペイロードには「データヘッダ１」が格納されているものとする。
【０２９２】
（３）エントリ0x0002〜0x0009には、空データフレームは保存されていない。この場合、各エントリについてステップS１６において「Ｎｏ」と判定されるので、ステップＳ２１以降の処理は実行されない。
【０２９３】
（４）エントリ0x0010が選択される。このエントリについては、エントリ0x0001と同様に、ステップＳ１６で「Ｙｅｓ」と判定される。よって、ステップＳ２１以降の処理が実行される。
【０２９４】
（５）エントリ0x0010のＬＤは「Ｘ」である。また、作業領域には、エントリ0x0001から取り出された空データフレームが保存されている。すなわち、作業領域に保存されている空データフレームのＬＤも「Ｘ」である。よって、ステップＳ２６において、作業領域に保存されている空データフレームに、エントリ0x0010から取り出した空データフレームが追加される。これにより、作業領域には、ペイロードに「データヘッダ１＋データヘッダ２」が格納された集約空データフレームが保存されることになる。なお、この集約空データフレームのＬＤは「Ｘ」のままである。さらに、エントリ0x0010のＡＣＫ受信済みフラグに「済み」が設定される。
【０２９５】
（６）上記（５）で作成された集約空データフレームのサイズが閾値よりも小さいものとする。そうすると、次のエントリが選択される。しかし、エントリ0x0011には、空データフレームは保存されていない。よって、ステップＳ２１以降の処理が実行されることなく、さらに次のエントリが選択される。
【０２９６】
（７）エントリ0x0012が選択される。このエントリについては、エントリ0x0001またはエントリ0x0010と同様に、ステップＳ１６で「Ｙｅｓ」と判定される。よって、ステップＳ２１以降の処理が実行される。
【０２９７】
（８）エントリ0x0012のＬＤは「Ｘ」である。また、作業領域に保存されている集約空データフレームのＬＤも「Ｘ」である。したがって、ステップＳ２６において、作業領域に保存されている集約空データフレームに、エントリ0x0012から取り出した空データフレームが追加される。これにより、作業領域には、ペイロードに「データヘッダ１＋データヘッダ２＋データヘッダ３」が格納された集約空データフレームが保存されることになる。なお、この集約空データフレームのＬＤも、「Ｘ」のままである。さらに、エントリ0x0012のＡＣＫ受信済みフラグに「済み」が設定される。
【０２９８】
（９）上記（８）で作成された集約空データフレームのサイズが閾値よりも小さいものとする。そうすると、次のエントリがサーチされる。しかし、この例では、未選択のエントリは残されていない。よって、ステップＳ３１の処理が実行される。
【０２９９】
（１０）送信キュー１１４に新たなエントリ0x0013が作成され、上記（８）で生成された集約空データフレームは、このエントリに保存される。このとき、フレームタイプには「0x0005」が設定される。また、ＡＣＫ受信済みフラグには「未」が設定される。
【０３００】
上記手順（１）〜（１０）により、送信キュー１１４は、図２０（ｂ）に示す状態に更新される。この後、送信キュー１１４のロックが解除されると、送信部１０２は、送信キュー１１４においてＡＣＫ受信済みフラグに「未」が設定されているフレームを抽出して送信する。したがって、送信部１０２は、エントリ0x0013に保存されている集約空データフレームを送信する。このとき、集約空データフレームは、ＬＤにより指定される隣接ノードに送信される。すなわち、図２０（ｂ）に示す例では、集約空データフレームは、ノード装置Ｘへ送信される。
【０３０１】
このように、実施形態のノード装置は、同じＬＤが指定された複数の空データフレームが送信キュー１１４に保存されているときは、それら複数の空データフレームを集約して送信する。したがって、バックトラック動作の回数が削減され、データ転送効率が改善される。
【０３０２】
図２３は、空データフレームの受信処理を示すフローチャートである。このフローチャートの処理は、ノード装置が隣接ノード装置から空データフレームまたは集約空データフレームを受信し、後述する図３０のデータフレーム受信処理のステップＳ８０１ａで、空データフレームまたは集約空データフレームと判定されたときに、データフレーム処理部１１０により実行される。ここで、空データフレームおよび集約空データフレームは、受信フレームのアドホックヘッダに設定されているフレームタイプの値により識別される。なお、このフローチャートの説明では、「空データフレーム」は、空データフレームおよび集約空データフレームの双方を含むものとする。
【０３０３】
ステップＳ４２において、データフレーム処理部１１０は、受信した空データフレームのペイロードに格納されているデータヘッダを切り出す。ここで、データヘッダのデータ長が予は決めされている。例えば、図１７に示す例では、データヘッダには８バイトのＧＳ、８バイトのＧＤ、２バイトのＦＩＤが格納されるので、データヘッダのデータ長は１８バイトである。よって、この場合、受信した空データフレームのペイロードの先頭から１８バイト単位でデータ（すなわち、各データヘッダ）が抽出される。
【０３０４】
ステップＳ４３において、データフレーム処理部１１０は、受信した空データフレーム内に集約されているデータヘッダの数をカウントする。ここでは、集約されているデータヘッダの数は「Ｎ」で表わされている。このとき、変数ｉが「１」に初期化される。変数ｉは、このフローチャートでは、空データフレームから抽出された各データヘッダを識別する。
【０３０５】
ステップＳ４４〜Ｓ４９は、空データフレームから抽出された各データヘッダについてそれぞれ実行される。すなわち、データフレーム処理部１１０は、ステップＳ４４においてｉ番目のデータヘッダを抽出し、ステップＳ４５〜Ｓ４８の処理を実行する。
【０３０６】
ステップＳ４５〜Ｓ４６において、データフレーム処理部１１０は、ｉ番目のデータヘッダのＦＩＤおよびＧＳのペアに基づいて、ＦＩＤ管理テーブル１０５を検索する。ここで、ＦＩＤ管理テーブル１０５のエントリは、後で図２９を参照しながら説明するが、最終更新時刻からエージング時間Ｇｆが経過した時点で削除される。換言すれば、ＦＩＤ管理テーブル１０５のエントリは、最終更新時刻からエージング時間Ｇｆが経過するまでの期間は存在している。なお、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆは、図１５に示す保持期間Ｇに相当する。
【０３０７】
受信空データフレームに対応するエントリがＦＩＤ管理テーブル１０５に存在するときは、データフレーム処理部１１０は、ステップＳ４７において、上述したＦＩＤおよびＧＳのペアで特定されるデータフレームをバッファ部１０９から抽出（復元）する。なお、後で図２４を参照しながら説明するが、ノード装置は、隣接ノードからデータフレームを受信すると、そのデータフレームをバッファ部１０９に保持する。そして、この受信データフレームのＦＩＤおよびＧＳのペアを利用してＦＩＤ管理テーブル１０５のエントリが作成される。ここで、ＦＩＤ管理テーブル１０５にエントリが存在する期間は、対応するデータフレームはバッファ部１０９に保持される。すなわち、上述したＦＩＤおよびＧＳのペアで特定されるエントリが存在している期間（最終更新時刻からエージング時間Ｇｆが経過するまでの期間）は、対応するデータフレームがバッファ部１０９により保持されている。
【０３０８】
ステップＳ４８において、データフレーム処理部１１０は、ステップＳ４７で抽出したデータフレームに対応するＡＣＫフレームを生成し、ＡＣＫフレームの送信を送信部１０２に依頼する。そして、送信部１０２がＡＣＫフレームを、空データフレームの送信元ノード装置へ返送する。これにより、バックトラックを実行したノード装置は、バックトラックが成功したことを認識する。
【０３０９】
ＦＩＤ管理テーブル１０５に対応するエントリが存在しないときは（ステップＳ４６：Ｎｏ）、データフレーム処理部１１０は、ステップＳ４７〜Ｓ４８は実行されない。すなわち、この場合、空データフレームに対応する受信データフレームはないため、この受信データフレームに対応するＡＣＫフレームは、バックトラックを実行したノード装置に返送されない。
【０３１０】
ステップＳ４９において、データフレーム処理部１１０は、変数ｉがデータヘッダ数Ｎに達したか否かをチェックする。変数ｉがＮよりも小さければ、未選択のデータヘッダが残っていると判断される。この場合、変数ｉがインクリメントされた後、ステップＳ４４〜Ｓ４８が実行される。すなわち、集約空データフレームから抽出された次のデータヘッダに対してステップＳ４４〜Ｓ４８の処理が実行される、一方、変数ｉがＮに達していれば、このフローチャートの処理は終了する。
【０３１１】
なお、バックトラック動作に際して空データフレームの集約が行われない場合には、図２３のフローチャートにおいて、ステップＳ４３、Ｓ４４、Ｓ４９の処理は不要である。或いは、図２３のフローチャートにおいて、「Ｎ＝１」が与えられるようにしてもよい。
【０３１２】
このように、実施形態のフレーム送信方法では、ノード装置（以下、バックトラック実行ノード装置）は、ＯＬＳノード装置から受信したデータフレームの転送が不可能と判定したときは、ＯＬＳノード装置へ通常のデータフレームまたは空データフレームを送信する。ＯＬＳノード装置は、バックトラック実行ノード装置から通常のデータフレームを受信したときは、そのデータフレームを他の隣接ノード装置へ転送する。また、ＯＬＳノード装置は、バックトラック実行ノード装置から空データフレームを受信したときは、その空データフレームに対応するデータフレームをバッファ部１０９から取り出して他の隣接ノード装置へ転送する。このとき、ＯＬＳノード装置は、いずれのケースでも、バックトラック実行ノード装置へＡＣＫフレームを返送する。そうすると、バックトラック実行ノード装置は、バックトラック動作を終了する。
【０３１３】
ただし、ＯＬＳノード装置は、バックトラック実行ノード装置から受信した空データフレームに対応するデータフレームがバッファ部１０９に格納されていなかったときは、バックトラック実行ノード装置へＡＣＫフレームを返送しない。そうすると、バックトラック実行ノード装置は、所定時間経過後、通常のデータフレームをＯＬＳノード装置へ送信する。或いは、バックトラック動作において空データフレームを繰り返し送信する構成においては、バックトラック実行ノード装置は、所定時間経過後、再度、空データフレームをＯＬＳノード装置へ送信するようにしてもよい。そして、バックトラック実行ノード装置は、所定回数繰り返し空データフレームを送信したにもかかわらずＡＣＫフレームを受信できなかったときに、ＯＬＳノード装置へ通常のデータフレームを送信するようにしてもよい。
【０３１４】
なお、実施形態に係るネットワークは、空データフレームを処理可能なノード装置および空データフレームを処理できないノード装置が混在してもよい。例えば、図１４に示す実施例において、ノード装置Ｘが空データフレームを処理できないものとする。そして、ノード装置ａが、バックトラック動作において、ノード装置Ｘへ空データフレームを送信したものとする。この場合、ノード装置Ｘは、受信した空データフレームを処理できないので、ノード装置ａへＡＣＫフレームを返送しない。そうすると、ノード装置ａは、空データフレームを送信したときから所定時間経過後、通常のデータフレームをノード装置Ｘへ送信する。そして、ノード装置Ｘは、受信した通常のデータフレームをノード装置ｄへ転送する。このように、ネットワーク内に空データフレームを処理できないノード装置が設けられている場合であっても、データフレーム転送が遮断されることはない。
【０３１５】
また、実施形態のフレーム送信方法では、バックトラック実行ノード装置（図１４〜図１５では、ノード装置ａ）は、対象データフレームのエントリ時刻からの経過時間が保持期間Ｇよりも短いときに空データフレームを送信する。一方、ＯＬＳノード装置（図１４〜図１５では、ノード装置Ｘ）は、後で図３２を参照しながら説明するが、対象データフレームをバックトラック実行ノード装置へ送信した時刻（最終更新時刻）からの経過時間が保持期間Ｇに達するまではその対象データフレームをバッファ部１０９に保持ししている。ここで、各ノード装置の時計が同期しているものとすると、バックトラック実行ノード装置におけるエントリ時刻は、ＯＬＳノード装置における最終更新時刻よりも必ず後になる。このため、バックトラック実行ノード装置におけるエントリ時刻から保持期間Ｇが経過する前であれば、ＯＬＳノード装置に対象データフレームが保持されている可能性は高い。したがって、上記条件下でバックトラック実行ノード装置から空データフレームが送信された場合、ＯＬＳノード装置においてバッファ部１０９に保持されている対象データフレームが有効に利用される可能性が高い。
【０３１６】
＜各ノード装置の動作を示すフローチャート＞
続いて、図２４〜図４１に示すフローチャートを参照して、ノード装置１００の動作の詳細を説明する。
【０３１７】
図２４は、フレーム受信処理のフローチャートである。フレーム受信処理は、ノード装置１００に電源が入れられると開始される。
ステップＳ２０１で受信部１０１は、フレームを受信するまで待機する。つまり、受信部１０１は、フレームを受信していなければステップＳ２０１を繰り返す。フレームを受信すると、受信部１０１は受信したフレームをフレーム分岐処理部１０６に出力し、処理はステップＳ２０２に移行する。
【０３１８】
ステップＳ２０２では、フレーム分岐処理部１０６が、ステップＳ２０１で受信部１０１が受信したフレームのタイプフィールドの値を参照し、フレームのタイプを判定する。受信したフレームのタイプがハローフレームの場合、処理はステップＳ２０３に移行し、データフレームの場合、処理はステップＳ２０４に移行し、ＡＣＫフレームの場合、処理はステップＳ２０６に移行する。なお、バックトラック動作において使用される空データフレームおよび集約空データフレームは、特に明記しない限りは、各ノード装置において通常のデータフレームと同様に処理される。したがって、図２４〜図４１に係る説明において、特に明記しないときは、「データフレーム」は、空データフレームおよび集約空データフレームを含むものとする。
【０３１９】
ステップＳ２０３では、受信されたハローフレームをフレーム分岐処理部１０６がリンク管理部１０８へ出力し、リンク管理部１０８が図２５のハローフレーム受信処理を行う。そして処理はステップＳ２０１に戻る。もちろん、図４のＭＰＵ２０１が図３の各部に対応する複数のタスクを並行して実行するマルチタスク環境では、フレーム分岐処理部１０６がハローフレームを出力したら、ハローフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０３２０】
また、ステップＳ２０４では、フレーム分岐処理部１０６が、ステップＳ２０１で受信されたデータフレームをバッファ部１０９に格納する。つまり、フレーム分岐処理部１０６は、バッファ部１０９内に新たなエントリの領域を確保し、確保した領域にステップＳ２０１で受信されたデータフレームを格納する。また、フレーム分岐処理部１０６は、次のステップＳ２０５のためにデータフレームからＧＳとＦＩＤの値を取り出して記憶しておく。なお、図８のとおりバッファ部１０９はタイムアウト時刻フィールドを有するが、ステップＳ２０４の時点では、タイムアウト時刻はまだ設定されない。
【０３２１】
そして、ステップＳ２０５でフレーム分岐処理部１０６は、データフレーム処理部１１０にデータフレーム受信処理を行うよう指示する。指示に際してフレーム分岐処理部１０６は、ステップＳ２０４で記憶しておいたデータフレームのＧＳとＦＩＤの値をデータフレーム処理部１１０に通知する。
【０３２２】
なお、ノード装置１００がＧＳとならないタイプの装置である場合（例えば、ノード装置１００が中継専用装置である場合）、データフレーム受信処理は図３０〜図３５のとおりである。他方、ノード装置１００がＧＳにもなりうるタイプの装置である場合、データフレーム受信処理は、図３０〜図３２、図４１のとおりである。
【０３２３】
データフレーム処理部１１０が指示にしたがってデータフレーム受信処理を行うと、処理はステップＳ２０１に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部１０６がデータフレーム処理部１１０にデータフレーム受信処理を行うよう指示したら、データフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０３２４】
また、ステップＳ２０６では、受信されたＡＣＫフレームをフレーム分岐処理部１０６がＡＣＫ処理部１０７へ出力し、ＡＣＫ処理部１０７が図３７のＡＣＫフレーム受信処理を行う。そして処理はステップＳ２０１に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部１０６がＡＣＫフレームを出力したら、ＡＣＫフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０３２５】
図２５は、図２４のステップＳ２０３におけるハローフレーム受信処理のフローチャートである。図２５の処理は、フレーム分岐処理部１０６からハローフレームがリンク管理部１０８に出力されると開始される。
【０３２６】
ステップＳ３０１でリンク管理部１０８は、受信したハローフレームのＬＳと同じ値をノードＩＤとして持つエントリが、隣接ノード管理テーブル１０３（図９参照）に存在するか否かを判断する。エントリが見つかれば処理はステップＳ３０２に移行し、エントリが見つからなければ処理はステップＳ３０３に移行する。
【０３２７】
なお、図２５の説明における「受信したハローフレーム」とは、図２４のステップＳ２０１で受信部１０１が受信したハローフレームである。つまり、図２５の説明における「受信したハローフレーム」とは、ステップＳ２０２でフレーム分岐処理部１０６がリンク管理部１０８に出力して図２５の処理の開始の契機となったハローフレームである。
【０３２８】
ステップＳ３０２でリンク管理部１０８は、ステップＳ３０１で見つかったエントリの最終更新時刻として、現在時刻を設定する。そして、図２５の処理は終了する。
例えば、ノード装置Ｎ２においてステップＳ３０２が実行された結果として、図９のように隣接ノード管理テーブル１０３−Ｎ２において、Ｎ１というノードＩＤに対応する最終更新時刻フィールドの値がＴＡ２，１と更新される。その結果、ノード装置Ｎ２は「時刻ＴＡ２，１にはノード装置Ｎ２がノード装置Ｎ１を隣接ノード装置として認識可能な状況であった」と記憶しておくことができる。
【０３２９】
他方、ステップＳ３０１でエントリが見つからない場合は、今まで隣接ノード装置として認識していなかった新たなノード装置からハローフレームが受信されたということである。よって、続くステップＳ３０３〜Ｓ３０８において、当該新たなノード装置を隣接ノード装置として登録するための処理が行われる。
【０３３０】
ステップＳ３０３でリンク管理部１０８は、隣接ノード管理テーブル１０３に新規エントリを追加する。また、ステップＳ３０４でリンク管理部１０８は、ステップＳ３０３で追加した新規エントリに、受信したハローフレームのＬＳの値と現在時刻を設定する。例えば、図７のハローフレーム３１２を初めて受信したとき、ノード装置Ｎ２は、新規エントリのノードＩＤフィールドに、ハローフレーム３１２のＬＳの値であるＮ３を設定し、新規エントリの最終更新時刻フィールドに現在時刻を設定する。
【０３３１】
続いて、ステップＳ３０５でリンク管理部１０８は、重み付けテーブル１０４−１〜１０４−Ｍ（図１０と図１１を参照）の中に、まだ注目していない重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）があるか否かを判断する。既にすべての重み付けテーブル１０４−１〜１０４−Ｍに注目し終わっていれば、図２５の処理は終了し、まだ注目していない重み付けテーブル１０４−ｉがあれば、処理はステップＳ３０６に移行する。
【０３３２】
ステップＳ３０６でリンク管理部１０８は、重み付けテーブル１０４−１〜１０４−Ｍのうちでまだ注目していないものの中から、次の重み付けテーブルに注目する。以下では説明の便宜上、ステップＳ３０６では重み付けテーブル１０４−ｉが注目されたとする。
【０３３３】
ステップＳ３０７でリンク管理部１０８は、注目している重み付けテーブル１０４−ｉに新規エントリを追加する。さらに、ステップＳ３０８でリンク管理部１０８は、ステップＳ３０７で追加した新規エントリのＬＤ、重み、最終更新時刻の各フィールドに、受信したハローフレームのＬＳの値と、初期重み付け値と、現在時刻を、それぞれ設定する。初期重み付け値は、実施形態に応じて任意に決められる定数である。
【０３３４】
第１実施形態では、上記のとおり重みの値は０以上１以下であり、１はＬＤとして選択不能なことを示す特別な値であるから、初期重み付け値は、０以上１未満の任意の値でよい。より具体的には、初期重み付け値は、例えば０．５でもよい。例えば、図１１の１番上に示した重み付けテーブル１０４−１−Ｎ３の最初のエントリは、次のようにして作成されたものであってもよい（ただし、正確にはその場合、最初のエントリの最終更新時刻には、他の２つのエントリの最終更新時刻Ｔａとは異なる値が設定され、図１１とまったく同じとはならない）。
【０３３５】
・ＧＤとしてノード装置Ｎ７に対応付けられた重み付けテーブル１０４−１−Ｎ３が既に存在している。
・しかし、ノード装置Ｎ３は、ノード装置Ｎ２を隣接ノード装置として今まで認識していなかった。
【０３３６】
・ノード装置Ｎ３は、ノード装置Ｎ２から初めてハローフレームを受信した。
・以上の状況において、ステップＳ３０６では重み付けテーブル１０４−１−Ｎ３が注目された。
【０３３７】
・よって、ステップＳ３０８では、新規エントリのＬＤフィールドに、受信したハローフレームのＬＳの値であるＮ２が設定され、新規エントリの重みフィールドに、初期重み付け値である０．５が設定された。
ステップＳ３０８の実行後、処理はステップＳ３０５に戻る。
【０３３８】
図２６は、ハローフレーム送信処理のフローチャートである。図２６の処理は、図２４の処理とは独立して並行に、ハローフレーム生成部１１２により実行される。具体的には、ノード装置１００に電源が入れられると、ハローフレーム生成部１１２が図２６の処理を開始する。
【０３３９】
ステップＳ４０１でハローフレーム生成部１１２は、現在時刻が送信予定時刻であるか否かを判断する。現在時刻が送信予定時刻であれば処理はステップＳ４０２に移行し、現在時刻が送信予定時刻でなければ処理はステップＳ４０１に戻る。つまり、ハローフレーム生成部１１２は送信予定時刻まで待機する。
【０３４０】
例えば、基準時刻Ｔｒｅｆとハローフレームの送信間隔ΔＴｈｅｌｌｏが予め決められていてもよい。また、ハローフレーム生成部１１２は、例えば図４のＭＰＵ２０１のクロックに基づいて現在時刻Ｔｎｏｗを参照することができる。ハローフレーム生成部１１２は、式（４）のＺが整数のときのみ、「現在時刻は送信予定時刻である」と判断してもよい。
Ｚ＝（Ｔｒｅｆ−Ｔｎｏｗ）／ΔＴｈｅｌｌｏ  （４）
例えば、基準時刻Ｔｒｅｆは予め決められた定数でもよいし、ノード装置１００に電源が入れられた時刻でもよい。また、送信間隔ΔＴｈｅｌｌｏは実施形態に応じて適宜決めることができ、例えば１０秒などの比較的長い時間でもよい。
【０３４１】
ステップＳ４０２では、ハローフレーム生成部１１２がＦＩＤ生成部１１３に新たなＦＩＤの生成を要求し、ＦＩＤ生成部１１３が新たなＦＩＤを生成する。例えば、ＦＩＤはシーケンス番号でもよく、ＦＩＤ生成部１１３はカウンタ回路を使って実現されてもよい。もちろん、ＦＩＤ生成部１１３はＭＰＵ２０１がプログラムを実行することで実現されてもよい。
【０３４２】
ステップＳ４０２ではさらに、ＦＩＤ生成部１１３が生成したＦＩＤを用いてハローフレーム生成部１１２がハローフレームを生成する。例えば、図７のハローフレーム３１２は、次のようにして生成される。すなわち、ノード装置Ｎ３のＦＩＤ生成部１１３−Ｎ３が、新たなＦＩＤとしてＦｂという値を生成する。すると、ノード装置Ｎ３のハローフレーム生成部１１２−Ｎ３は、新たなハローフレーム３１２を生成する。
【０３４３】
その際、ハローフレーム生成部１１２−Ｎ３は、ハローフレーム３１２において、ＬＤに０ｘＦＦＦＦＦＦという所定の値を設定し、ＬＳとＧＳに自ノードＩＤであるＮ３を設定し、ＧＤに０ｘ００００００という所定の値を設定する。また、ハローフレーム生成部１１２−Ｎ３は、ハローフレーム３１２において、ＦＩＤにはＦＩＤ生成部１１３−Ｎ３により生成された値Ｆｂを設定し、タイプには所定の値Ｈを設定する。
【０３４４】
以上のようにしてステップＳ４０２でハローフレームが生成されると、続いて、ステップＳ４０３においてハローフレーム生成部１１２は、生成したハローフレームの送信を送信部１０２に依頼し、送信部１０２がハローフレームを送信する。そして、処理はステップＳ４０１に戻る。
【０３４５】
続いて、各種テーブルのエージング処理について図２７〜図２９を参照して説明する。各エージング処理は、例えば、図４のタイマＩＣ２０３からの割り込み信号を契機として開始されてもよい。
【０３４６】
図２７は、隣接ノード管理テーブル１０３のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉａで割り込み信号をリンク管理部１０８に出力し、割り込み信号を契機としてリンク管理部１０８が所定の間隔Ｉａで図２７の処理を行ってもよい。
【０３４７】
ステップＳ５０１でリンク管理部１０８は、隣接ノード管理テーブル１０３（図９を参照）の１つ目のエントリに注目する。以下、図２７に関する説明においては、リンク管理部１０８が注目している隣接ノード管理テーブル１０３のエントリを「注目エントリ」という。
【０３４８】
続いてステップＳ５０２でリンク管理部１０８は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ以上か否かを判断する。なお、実施形態によって、Ｇａ＝Ｉａでもよいし、Ｇａ＜Ｉａでもよいし、Ｇａ＞Ｉａでもよい。
【０３４９】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ以上であれば、処理はステップＳ５０３に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ未満であれば、処理はステップＳ５０５に移行する。
【０３５０】
ステップＳ５０３でリンク管理部１０８は、注目エントリのノードＩＤと同じ値をＬＤとして有するエントリを、重み付けテーブル１０４から削除する。例えば、注目エントリが、図９の隣接ノード管理テーブル１０３−Ｎ３の３番目のエントリである場合、注目エントリのノードＩＤの値はＮ５である。したがって、ステップＳ５０３でリンク管理部１０８は、重み付けテーブル１０４−１−Ｎ３〜１０４−Ｍ−Ｎ３のそれぞれから、ＬＤの値がＮ５であるエントリを削除する。例えば、ステップＳ５０３では、図１０の重み付けテーブル１０４−１−Ｎ３の３つ目のエントリと、重み付けテーブル１０４−２−Ｎ３の３つ目のエントリが削除される。
【０３５１】
そして、ステップＳ５０４でリンク管理部１０８は、注目エントリを隣接ノード管理テーブル１０３から削除する。そして処理はステップＳ５０５に移行する。
ステップＳ５０５でリンク管理部１０８は、まだ注目していないエントリが隣接ノード管理テーブル１０３に残っているか否かを判断する。リンク管理部１０８が、隣接ノード管理テーブル１０３のすべてのエントリに注目し終わっていれば、図２７の処理は終了する。他方、まだリンク管理部１０８が注目していないエントリが隣接ノード管理テーブル１０３に残っていれば、処理はステップＳ５０６に移行する。
【０３５２】
ステップＳ５０６でリンク管理部１０８は、隣接ノード管理テーブル１０３のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ５０２に戻る。
【０３５３】
以上の図２７のエージング処理により、ノード装置１００は、今まで隣接ノード装置として認識していたノード装置からのハローフレームの受信が途絶えると、「当該ノード装置は、もはやノード装置１００に隣接していない」と認識することができるようになる。つまり、図２７の処理により、ノード装置１００は、潜在的なＬＤの候補としての隣接ノード装置を、環境の変化に追従して適切に管理することができるようになる。
【０３５４】
なお、上記の所定の間隔Ｉａおよび所定の値Ｇａは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。なお、第１実施形態では、ネットワーク内のすべてのノード装置に同じハローフレームの送信間隔ΔＴｈｅｌｌｏが設定されており、隣接ノード管理テーブル１０３のエージング時間である上記の所定の値Ｇａは、Ｇａ＞ΔＴｈｅｌｌｏを満たす。
【０３５５】
図２８は、重み付けテーブル１０４のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉｗで割り込み信号をデータフレーム処理部１１０に出力し、割り込み信号を契機としてデータフレーム処理部１１０が所定の間隔Ｉｗで図２８の処理を行ってもよい。
【０３５６】
ステップＳ６０１でデータフレーム処理部１１０は、重み付けテーブル１０４（図１０と図１１を参照）のうち１枚目の重み付けテーブル１０４−１に注目する。以下、図２８に関する説明においては、データフレーム処理部１１０が注目している重み付けテーブルを、「１０４−ｉ」という参照符号で表し（１≦ｉ≦Ｍ）、「注目テーブル」という。ステップＳ６０１の実行直後はｉ＝１である。
【０３５７】
続いてステップＳ６０２でデータフレーム処理部１１０は、注目テーブル１０４−ｉの１つ目のエントリに注目する。以下、注目テーブルのうちでデータフレーム処理部１１０が注目しているエントリを「注目エントリ」という。
【０３５８】
続いてステップＳ６０３でデータフレーム処理部１１０は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ以上か否かを判断する。なお、実施形態によって、Ｇｗ＝Ｉｗでもよいし、Ｇｗ＜Ｉｗでもよいし、Ｇｗ＞Ｉｗでもよい。
【０３５９】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ以上であれば、処理はステップＳ６０４に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ未満であれば、処理はステップＳ６０５に移行する。
【０３６０】
ステップＳ６０４でデータフレーム処理部１１０は、注目テーブル１０４−ｉから注目エントリを削除する。そして処理はステップＳ６０５に移行する。
ステップＳ６０５でデータフレーム処理部１１０は、注目テーブル１０４−ｉにまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部１１０が注目テーブル１０４−ｉのすべてのエントリに注目し終わっていれば、処理はステップＳ６０７に移行する。他方、まだデータフレーム処理部１１０が注目していないエントリが注目テーブル１０４−ｉに残っていれば、処理はステップＳ６０６に移行する。
【０３６１】
ステップＳ６０６でデータフレーム処理部１１０は、注目テーブル１０４−ｉ内のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ６０３に戻る。
【０３６２】
ステップＳ６０７でデータフレーム処理部１１０は、注目テーブル１０４−ｉにエントリが存在するか否かを判断する。ステップＳ６０３〜Ｓ６０６の繰り返しの結果、注目テーブル１０４−ｉにエントリがなくなった場合は、処理はステップＳ６０８に移行する。他方、注目テーブル１０４−ｉに１つ以上エントリが存在すれば、処理はステップＳ６０９に移行する。
【０３６３】
ステップＳ６０８でデータフレーム処理部１１０は、エントリの存在しない注目テーブル１０４−ｉを削除する。そして、処理はステップＳ６０９に移行する。
ステップＳ６０９でデータフレーム処理部１１０は、まだ注目していない重み付けテーブルが重み付けテーブル１０４の中に残っているか否かを判断する。データフレーム処理部１１０が、すべての重み付けテーブル１０４−１〜１０４−Ｍに注目し終わっていれば、図２８の処理は終了する。他方、まだデータフレーム処理部１１０が注目していない重み付けテーブル１０４−ｊ（１≦ｊ≦Ｍ）が重み付けテーブル１０４の中に残っていれば、処理はステップＳ６１０に移行する。
【０３６４】
ステップＳ６１０でデータフレーム処理部１１０は、重み付けテーブル１０４の中でまだ注目していない次の重み付けテーブル１０４−ｊに注目する（すなわち、重み付けテーブル１０４−ｊを注目テーブル１０４−ｉとして選ぶ）。そして処理はステップＳ６０２に戻る。
【０３６５】
以上の図２８のエージング処理により、ノード装置１００は、「過去の障害の影響が累積されて、どの隣接ノード装置もＬＤとして選択することが不能となる」といった事態に陥らずに済む。
【０３６６】
例えば、図６の例において、ステップＳ１１２の後、ノード装置Ｎ６とＮ７の間のリンクに障害が発生し、ノード装置Ｎ４とＮ７の間のリンクが障害から復旧したという状況を想定する。もし図２８のエージング処理が行われないと、実際には障害からの復旧により、例えば経路〈Ｎ１，Ｎ２，Ｎ３，Ｎ４，Ｎ７〉でのデータフレームの送信が可能になっていても、自律分散協調の結果としてこの経路が選択されることがなくなってしまう。しかし、図２８のエージング処理が行われれば、上記で想定した状況において、経路〈Ｎ１，Ｎ２，Ｎ３，Ｎ４，Ｎ７〉が選択されうるようになる。
なお、上記の所定の間隔Ｉｗおよび所定の値Ｇｗは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。
図２９は、ＦＩＤ管理テーブル１０５のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉｆで割り込み信号をデータフレーム処理部１１０に出力し、割り込み信号を契機としてデータフレーム処理部１１０が所定の間隔Ｉｆで図２９の処理を行ってもよい。
【０３６７】
ステップＳ７０１でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５（図１２と図１３を参照）のうち１つ目のエントリに注目する。以下、図２９に関する説明においては、データフレーム処理部１１０が注目しているエントリを「注目エントリ」という。
【０３６８】
続いてステップＳ７０２でデータフレーム処理部１１０は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ以上か否かを判断する。なお、実施形態によって、Ｇｆ＝Ｉｆでもよいし、Ｇｆ＜Ｉｆでもよいし、Ｇｆ＞Ｉｆでもよい。
【０３６９】
また、図３１のステップＳ８０７に関して後述する理由から、第１実施形態では、重み付けテーブル１０４のエージング時間である所定の値Ｇｗと、ＦＩＤ管理テーブル１０５のエージング時間である所定の値Ｇｆは、Ｇｆ＜Ｇｗを満たす。
【０３７０】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ以上であれば、処理はステップＳ７０３に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ未満であれば、処理はステップＳ７０４に移行する。
【０３７１】
ステップＳ７０３でデータフレーム処理部１１０は、注目エントリをＦＩＤ管理テーブル１０５から削除する。そして処理はステップＳ７０４に移行する。
そして、ステップＳ７０４でデータフレーム処理部１１０は、まだ注目していないエントリがＦＩＤ管理テーブル１０５に残っているか否かを判断する。データフレーム処理部１１０がＦＩＤ管理テーブル１０５のすべてのエントリに注目し終わっていれば、図２９の処理は終了する。他方、まだデータフレーム処理部１１０が注目していないエントリがＦＩＤ管理テーブル１０５に残っていれば、処理はステップＳ７０５に移行する。
【０３７２】
ステップＳ７０５でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ７０２に戻る。
【０３７３】
以上の図２９のエージング処理により、「ＦＩＤ管理テーブル１０５のエントリが増え続けて記憶領域を使い尽くしてしまう」といった事態を防ぐことができる。なお、上記の所定の値Ｇｆは、例えば、何度もバックトラックが生じる最悪ケースにおいてデータフレームがＧＳからＧＤに到達するのにかかると予測される時間の長さ以上になるよう、決められていてもよい。一般には、ネットワークの規模が大きいほど、所定の値Ｇｆも大きく設定しておくことが望ましい。
【０３７４】
図３０〜図３５は、図２４のステップＳ２０５におけるデータフレーム受信処理のフローチャートである。なお、説明の便宜上、まず、ノード装置１００がＧＳとはならいタイプである場合のデータフレーム受信処理について、図３０〜図３５を参照して説明する。ノード装置１００がＧＳにもなりうるタイプの場合については、図３４〜図３５の部分が後述の図４１の処理に置き換わる。
【０３７５】
図２４のステップＳ２０５でフレーム分岐処理部１０６からデータフレーム受信処理を行うよう指示されると、データフレーム処理部１１０は図３０の処理を開始する。なお、前述のとおり、フレーム分岐処理部１０６からの指示は、受信したデータフレームのＧＳとＦＩＤの値の通知をともなっている。
【０３７６】
ステップＳ８０１でデータフレーム処理部１１０は、受信したデータフレームのＬＤの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＬＤの値が自ノードＩＤでなければ、処理はステップＳ８０２に移行し、受信したデータフレームのＬＤの値が自ノードＩＤであれば、処理はステップＳ８０１ａに移行する。
【０３７７】
なお、データフレーム受信処理の説明において、「受信したデータフレーム」とは、図２４のステップＳ２０１で受信部１０１が受信し、ステップＳ２０４でバッファ部１０９に格納され、図３０の処理の開始の契機となったデータフレームのことである。
【０３７８】
また、フレーム分岐処理部１０６は、データフレーム受信処理の開始をデータフレーム処理部１１０に指示するとき、受信したデータフレームのＧＳとＦＩＤの値をデータフレーム処理部１１０に通知している。よって、データフレーム処理部１１０は、通知されたＧＳとＦＩＤの値をキーにしてバッファ部１０９を検索することで、受信したデータフレームを含むエントリを見つけることができる。したがって、データフレーム処理部１１０は、見つけたエントリから、受信したデータフレームのヘッダに含まれる各フィールドの値を読み出すことができる。
【０３７９】
正確には、ステップＳ８０１では、データフレーム処理部１１０はまず、以上のようにして、受信したデータフレームのヘッダに含まれる各フィールドの値をバッファ部１０９から読み出して記憶する。そして、記憶したＬＤの値（すなわち受信したデータフレームのＬＤの値）を自ノードＩＤと比較する。なお、ノード装置１００自身のノードＩＤである自ノードＩＤは、例えば、図４のフラッシュメモリ２０５に予め記録されているので、データフレーム処理部１１０は自ノードＩＤを参照することができる。
【０３８０】
受信したデータフレームのＬＤの値が自ノードＩＤと異なるとき、ノード装置１００はノード装置１００自身には無関係なデータフレームを偶然受信したということである。よって、ステップＳ８０２でデータフレーム処理部１１０は、受信したデータフレームを破棄する。つまり、データフレーム処理部１１０は、ステップＳ８０１で見つけたバッファ部１０９のエントリを削除する。そして、データフレーム受信処理は終了する。
【０３８１】
他方、受信したデータフレームのＬＤの値が自ノードＩＤと等しい場合は、ステップＳ８０１ａでデータフレーム処理部１１０は、受信したフレームのタイプフィールドの値を参照し、フレームのタイプが空データフレーム及び集約空データフレームのいずれかであるか否かを判定する。受信したフレームのタイプが空データフレーム及び集約空データフレームのいずれかであると判定した場合には、処理はステップＳ８０１ｂに移行する。
【０３８２】
ステップＳ８０１ｂにおいて、受信された空データフレームまたは集約空データフレームについて、データフレーム処理部１１０が、上述した図２３の空データフレームの受信処理を実行する。そして処理はステップＳ８０１ｃに移行する。
【０３８３】
ステップＳ８０１ｃにおいて、データフレーム処理部１１０は、空データフレームの受信処理でバッファ部１０９から抽出（復元）したデータフレームがあるか否かを判定する。バッファ部１０９から抽出（復元）したデータフレームがあると判定した場合には、処理はステップＳ８０４に移行する。なお、以降はこの抽出（復元）したデータフレームを受信データフレームとして扱う。また、抽出（復元）したデータフレームが複数ある場合には、それぞれのデータフレームについて、ステップＳ８０４以降のデータフレーム受信処理が実行される。
【０３８４】
ステップＳ８０１ｃで、バッファ部１０９から抽出（復元）したデータフレームがないと判定した場合には、データフレーム受信処理は終了する。
ステップＳ８０１ａにおいて、受信したフレームのタイプが空データフレーム及び集約空データフレームのいずれかではないと判定した場合、すなわち、通常のデータフレームである場合には、ステップＳ８０３に移行する。
【０３８５】
ステップＳ８０３でデータフレーム処理部１１０は、ＡＣＫフレームを生成し、ＡＣＫフレームの送信を送信部１０２に依頼する。そして、送信部１０２がＡＣＫフレームを送信する。
【０３８６】
例えば、図７のデータフレーム３０３をノード装置Ｎ３が受信すると、ノード装置Ｎ３のデータフレーム処理部１１０−Ｎ３は、ステップＳ８０３において図７のＡＣＫフレーム３２２を生成する。そして、送信部１０２−Ｎ３がＡＣＫフレーム３２２を送信する。
【０３８７】
具体的には、データフレーム処理部１１０−Ｎ３は、受信したデータフレーム３０３のＬＳの値であるＮ２をＡＣＫフレーム３２２のＬＤに設定し、自ノードＩＤ（すなわちノード装置Ｎ３自身のノードＩＤであるＮ３）をＡＣＫフレーム３２２のＬＳに設定する。また、ＡＣＫフレーム３２２は、対応するデータフレーム３０３のＬＳであるノード装置Ｎ２以外には無関係なので、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のＧＤには、ヌルを表す特殊な値０ｘ００００００を設定する。
【０３８８】
また、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２を受信したノード装置Ｎ２が「ＡＣＫフレーム３２２はデータフレーム３０３に対するＡＣＫフレームである」と認識することができるように、ＡＣＫフレーム３２２のＧＳとＦＩＤを設定する。すなわち、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のＧＳとＦＩＤに、それぞれ、受信したデータフレーム３０３のＧＳとＦＩＤの値Ｎ１とＦａを設定する。
【０３８９】
そして、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のタイプとして、「ＡＣＫフレーム」を示す所定の値Ａを設定する。ステップＳ８０３では、以上のようにしてデータフレーム処理部１１０−Ｎ３がＡＣＫフレーム３２２を生成し、送信部１０２−Ｎ３がＡＣＫフレーム３２２を送信する。
【０３９０】
続いて、ステップＳ８０４でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＧＤの値が自ノードＩＤであれば、処理はステップＳ８０５に移行する。他方、受信したデータフレームのＧＤの値が自ノードＩＤと異なれば、処理は図３１のステップＳ８０６に移行する。
【０３９１】
ステップＳ８０５でデータフレーム処理部１１０は、上位層処理部１１１に、受信したデータフレームのペイロードを渡し、データフレーム受信処理を終了する。具体的には、データフレーム処理部１１０は、ステップＳ８０１で見つけたバッファ部１０９のエントリからペイロードを取り出して上位層処理部１１１に出力し、当該エントリをバッファ部１０９から削除する。そしてデータフレーム受信処理は終了する。
【０３９２】
例えば、図６のステップＳ１１２でデータフレームをノード装置Ｎ６から受信したノード装置Ｎ７では、受信したデータフレームのペイロードは上位層処理部１１１−Ｎ７に出力され、上位層処理部１１１−Ｎ７において処理される。
【０３９３】
図３１のステップＳ８０６以降の処理は、受信したデータフレームのＬＤの値が自ノードＩＤと等しく、かつ受信したデータフレームのＧＤの値が自ノードＩＤと異なる場合に実行される。
【０３９４】
ステップＳ８０６でデータフレーム処理部１１０は、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いて、ＦＩＤ管理テーブル１０５を検索する。なお、上記のように、受信したデータフレームのＦＩＤとＧＳの値は、図３０の処理の開始時にフレーム分岐処理部１０６から通知されている。
【０３９５】
続いて、ステップＳ８０７でデータフレーム処理部１１０は、ステップＳ８０６の検索の結果エントリがヒットしたか否かを判断する。エントリがヒットした場合、ノード装置１００が以前送信したことのあるデータフレームと同じデータフレームが受信されたということなので、処理はステップＳ８０８に移行する。他方、エントリがヒットしなかった場合、ノード装置１００が送信したことのないデータフレームが受信されたということなので、処理はステップＳ８１０に移行する。
【０３９６】
なお、正確には、「ノード装置１００が以前送信したことのあるデータフレームと同じデータフレームが受信されたが、検索対象のエントリは既にエージングにより消滅してしまった」という場合も、エントリはヒットしない。このような場合が生じないように、ネットワーク内でバックトラックが繰り返される最悪の時間の見積もりなどに基づいて、適切にＦＩＤ管理テーブル１０５のエージング時間Ｇｆが定められることが望ましい。
【０３９７】
ステップＳ８０８でデータフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたＦＩＤ管理テーブル１０５のエントリのＬＤとＯＬＳの値を取り出し、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０３９８】
続いてステップＳ８０９でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル（以下、図３１〜図３５の説明においては「１０４−ｉ」という参照符号で参照する）を次のように更新する。すなわち、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、ステップＳ８０８で取り出したＬＤに対応する重みを、最大値に変更する。なお、第１実施形態では重みの最大値は１である。重みの変更後、処理はステップＳ８１７に移行する。
【０３９９】
なお、ステップＳ８０７、Ｓ８０８、Ｓ８０９と処理が進む場合、ステップＳ８０８で取り出したＬＤに対応するエントリが、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉに存在することが、ステップＳ８０９では保証されている。その理由は以下のとおりである。
【０４００】
図１２と図１３に関して説明したように、ＦＩＤ管理テーブル１０５のエントリにおいて最終更新時刻は、データフレームの送信時に設定される。また、図２９に関して説明したように、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆは、例えば、最悪ケースで予測される時間以上に設定される。よって、ノード装置１００が過去に送信したデータフレームがネットワーク内を巡ってノード装置１００で受信されるとき、当該データフレームに対応するエントリは、まだＦＩＤ管理テーブル１０５に残っていることが保証される。
【０４０１】
そして、図１１に関して説明したように、データフレームが送信されてＡＣＫフレームが返信されると、重みが更新され、重み付けテーブル１０４−１〜１０１−Ｍ内の各エントリにおいては、重みが更新されるときに最終更新時刻も設定される。したがって、時系列を追うと下記（Ｅ１）〜（Ｅ５）の順となる。
【０４０２】
（Ｅ１）ＧＤの値がＮＧＤで、ＧＳの値がＮＧＳで、ＬＤの値がＮＬＤで、ＦＩＤの値がＦｃのデータフレームがノード装置１００から送信される。このとき、ＦＩＤ管理テーブル１０５において最終更新時刻が設定される。例えば、図６のノード装置Ｎ３において、ステップＳ１０３で図１２のエントリＥ３に最終更新時刻Ｔ１０３が設定される。
【０４０３】
（Ｅ２）上記データフレームに対するＡＣＫフレームが受信されると、ノード装置ＮＧＤに対応する重み付けテーブル１０４−ｉにおいて、ＬＤフィールドの値がＮＬＤであるエントリの重みが更新される。このとき、当該エントリの最終更新時刻が設定される。例えば、ノード装置Ｎ３において、図１１に示すようにステップＳ１０３ａで重み付けテーブル１０４−１−Ｎ３の、ＬＤフィールドの値がＮ４であるエントリの最終更新時刻がＴｂに設定される。
【０４０４】
（Ｅ３）ＧＳの値がＮＧＳで、ＦＩＤの値がＦｃの同じデータフレームが、ノード装置１００で受信される。例えば、図６のステップＳ１０６でノード装置Ｎ３がデータフレームを受信する。なお、データフレームのＧＤの値は中継に際して書きかえられることはないので、（Ｅ３）で受信されるデータフレームのＧＤの値は、上記（Ｅ１）より当然、ＮＧＤである。
【０４０５】
（Ｅ４）上記（Ｅ１）の時点から、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆが経過する。
（Ｅ５）上記（Ｅ２）の時点から、重み付けテーブル１０４のエージング時間Ｇｗが経過する。
【０４０６】
以上のとおり、（Ｅ３）の時点は（Ｅ５）の時点より前である。よって、（Ｅ３）の時点では、ノード装置ＮＧＤに対応する重み付けテーブル１０４−ｉにおいて、ＬＤフィールドの値がＮＬＤであるエントリの存在が保証される。例えば、上記の例では、重み付けテーブル１０４−１−Ｎ３の、ＬＤフィールドの値がＮ４であるエントリの存在が、図６のステップＳ１０６の時点保証されている。なお、ここでの「ステップＳ１０６の時点」とは、より詳しくは、ステップＳ１０６での受信を契機とするデータフレーム受信処理に含まれるステップＳ８０９の処理を、ノード装置Ｎ３が実行する時点のことである。
【０４０７】
したがって、図３１のステップＳ８０６の検索でＦＩＤ管理テーブル１０５にエントリが見つかった場合、ステップＳ８０９では必ず、ステップＳ８０８で取り出したＬＤに対応するエントリが、重み付けテーブル１０４−ｉに存在する。よって、ステップＳ８０９でデータフレーム処理部１１０は、存在が保証されているエントリにおいて、重みの値を最大値に設定している。
【０４０８】
逆に、ステップＳ８０６の検索でエントリが見つからなかった場合、ステップＳ８１０でデータフレーム処理部１１０は、受信したデータフレームのＬＳの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に、ＯＬＳとして記憶する。そして、ステップＳ８１１でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値を検索キーとして用いて、重み付けテーブル１０４を検索する。
【０４０９】
続いて、ステップＳ８１２でデータフレーム処理部１１０は、ステップＳ８１１の検索の結果、テーブルがヒットしたか否かを判断する。
受信したデータフレームのＧＤの値に対応する重み付けテーブルが重み付けテーブル１０４の中に存在すれば、処理はステップＳ８１２ａに移行する。なお、ステップＳ８０９で導入した「１０４−ｉ」という参照符号は、受信したデータフレームのＧＤの値に対応する重み付けテーブルを指すので、ステップＳ８１１の検索の結果ヒットしたテーブルも、「重み付けテーブル１０４−ｉ」である。
【０４１０】
他方、受信したデータフレームのＧＤの値に対応する重み付けテーブルが重み付けテーブル１０４の中に存在しなければ、処理はステップＳ８１３に移行する。
ステップＳ８１２ａでデータフレーム処理部１１０は、ステップＳ８１１の検索でヒットした重み付けテーブル１０４−ｉを調整する。ステップＳ８１２ａの重み付けテーブル調整処理は、詳しくは図３６とともに後述するが、エージング処理の副作用を中和する処理である。
【０４１１】
ステップＳ８１２ａの結果、隣接ノード管理テーブル１０３で管理されているすべての隣接ノード装置に対応するエントリが重み付けテーブル１０４−ｉに存在することが保証される。そして、処理はステップＳ８１７に移行する。
【０４１２】
ステップＳ８１３でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する新規重み付けテーブルを追加する。なお、ステップＳ８１３で追加されるテーブルも、「重み付けテーブル１０４−ｉ」である。
【０４１３】
そして、ステップＳ８１４でデータフレーム処理部１１０は、新規重み付けテーブル１０４−ｉにおいて、受信したデータフレームのＧＤの値を、重み付けテーブル１０４−ｉのＧＤとして設定する。
【０４１４】
さらに、ステップＳ８１５でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３のエントリ数と同数の新規エントリを、新規重み付けテーブル１０４−ｉに作成する。
【０４１５】
そして、ステップＳ８１６でデータフレーム処理部１１０は、ステップＳ８１５で作成した各エントリに、それぞれ、隣接ノード管理テーブル１０３の各エントリのノードＩＤと、初期重み付け値と、現在時刻を設定する。
【０４１６】
なお、以上のステップＳ８１１〜Ｓ８１６の具体例を挙げれば、以下のとおりである。
例えば、図６のステップＳ１０２でノード装置Ｎ２から図７のデータフレーム３０３を受信したとき、ノード装置Ｎ３の重み付けテーブル１０４−Ｎ３には、図１１の重み付けテーブル１０４−１−Ｎ３が存在しなかったとする。すると、ノード装置Ｎ３が受信したデータフレーム３０３のＧＤの値であるＮ７を検索キーにしてノード装置Ｎ３のデータフレーム処理部１１０−Ｎ３がステップＳ８１１で重み付けテーブル１０４−Ｎ３を検索しても、テーブルはヒットしない。
【０４１７】
そこで、データフレーム処理部１１０−Ｎ３は、ステップＳ８１３で新たに重み付けテーブル１０４−１−Ｎ３を作成し、ステップＳ８１４で重み付けテーブル１０４−１−Ｎ３のＧＤにＮ７を設定する。そして、データフレーム処理部１１０−Ｎ３は、ステップＳ８１５で、図９の隣接ノード管理テーブル１０３−Ｎ３と同数の（すなわち３つの）新規エントリを重み付けテーブル１０４−１−Ｎ３に作成する。
【０４１８】
ここで、隣接ノード管理テーブル１０３−Ｎ３の各エントリのノードＩＤは、図１０のとおり、Ｎ２とＮ４とＮ５である。よって、ステップＳ８１６でデータフレーム処理部１１０−Ｎ３は、ステップＳ８１５で作成した３つのエントリそれぞれに、ＬＤとしてＮ２とＮ４とＮ５を設定する。また、データフレーム処理部１１０−Ｎ３は、これら３つのエントリの重みフィールドに、いずれも０．５という初期重み付け値を設定し、これら３つのエントリの最終更新時刻フィールドに、いずれも現在時刻を設定する。
【０４１９】
以上のステップＳ８１３〜Ｓ８１６の結果として、図１１の１段目のような重み付けテーブル１０４−１−Ｎ３が重み付けテーブル１０４−Ｎ３の中に追加される。
ここで、具体例の説明から図３１の処理一般の説明に戻る。ステップＳ８１７が実行されるのは、ステップＳ８０９の実行後、ステップＳ８１６の実行後、またはステップＳ８１１の検索においてテーブルがヒットしたとステップＳ８１２で判断された後である。よって、ステップＳ８１７の実行時には、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉの存在が保証されている。
【０４２０】
そこで、ステップＳ８１７においてデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、ＯＬＳとは異なるＬＤのうちで最小の重みと対応付けられているＬＤの値を取得する。
【０４２１】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なる値をＬＤとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部１１０は、選択したエントリのＬＤと重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０４２２】
続いて、ステップＳ８１８でデータフレーム処理部１１０は、下記の２つの条件（Ｆ１）と（Ｆ２）のいずれかが成立するか否かを判断する。
（Ｆ１）ステップＳ８１７（または後述のＳ８２９）で取得したＬＤの値に対応する重みが、重みの最大値（第１実施形態では１．０）である。
【０４２３】
（Ｆ２）ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なるＬＤへのデータフレームの転送がすべて失敗した（ただし、重み付けテーブル１０４−ｉにおけるＬＤが、もともとＯＬＳしか存在しなかった場合も含む）。
【０４２４】
条件（Ｆ１）または（Ｆ２）が成立する場合、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理は図３４のステップＳ８３０に移行する。この場合、バックトラック動作が実行される。
【０４２５】
他方、条件（Ｆ１）と（Ｆ２）のいずれも成立しない場合、まだＬＤとして選択可能な隣接ノード装置が残っている。換言すれば、（Ｇ１）〜（Ｇ４）のいずれにも該当しない隣接ノード装置が、少なくとも１つは存在する。そして、ＬＤとして選択可能な隣接ノード装置のノードＩＤが、ステップＳ８１７（または後述のＳ８２９）で取得されている。
【０４２６】
（Ｇ１）当該隣接ノード装置から先の経路が袋小路またはループになっている、と判断されたため、当該隣接ノード装置は最大値の重みと対応付けられている。
（Ｇ２）過去に当該隣接ノード装置への同一ＧＤ宛てのデータフレームの送信に失敗した結果が累積したため、当該隣接ノード装置は最大値の重みと対応付けられている。
【０４２７】
（Ｇ３）今回のデータフレーム受信処理において当該隣接ノード装置へのデータフレームの送信を試した結果として、「送信失敗」と判明した。すなわち、データフレームを送信した隣接ノード装置から、所定時間が経っても、ＡＣＫフレームを受信することができなかった。
【０４２８】
（Ｇ４）当該隣接ノード装置はＯＬＳである。
そこで、ステップＳ８１８で条件（Ｆ１）と（Ｆ２）のいずれも成立しないと判断されると、処理はステップＳ８１９に移行する。ステップＳ８１９以降の処理は、取得済みのＬＤの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理である。
【０４２９】
ステップＳ８１９でデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０４３０】
具体的には、データフレーム処理部１１０は、ステップＳ８１７（または後述のＳ８２９）で取得したＬＤの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップＳ８０１で見つかったバッファ部１０９内のエントリに格納されているデータフレーム、または、図２３のステップＳ４７でバッファ部１０９から抽出（復元）されたデータフレームである。
【０４３１】
ステップＳ８１９での送信後、処理はステップＳ８２０に移行し、データフレーム処理部１１０がバッファ部１０９のタイムアウト時刻を更新する。すなわち、データフレーム処理部１１０は、バッファ部１０９において、受信したデータフレームを格納しているエントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。
Ｔｔｉｍｅｏｕｔ＝Ｔｎｏｗ＋Ｔｗａｉｔ  （５）
なお、式（５）において時刻Ｔｎｏｗは現在時刻であり、時間ＴｗａｉｔはＡＣＫフレーム待ち時間である。
【０４３２】
そして、ステップＳ８２１でデータフレーム処理部１１０は、ステップＳ８０６のＦＩＤ管理テーブル１０５の検索においてエントリがヒットしているか、または、後述するステップＳ８２３およびステップＳ８２４で、ＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定しているか否かを確認する。つまり、受信したデータフレームのＧＳとＦＩＤの値に等しい値を、ＧＳおよびＦＩＤとして有するエントリが、ＦＩＤ管理テーブル１０５に存在するか否かを、データフレーム処理部１１０は確認する。
【０４３３】
ステップＳ８０６の検索でエントリがヒットしているか、ステップＳ８２３およびステップＳ８２４でＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定していれば、今回のデータフレーム受信処理は、過去にノード装置１００自身が送信したのと同じデータフレームの受信を契機とする処理である。よって、データフレーム処理部１１０は続いてステップＳ８２２を実行する。他方、ステップＳ８０６の検索でエントリがヒットしておらず、かつ、ステップＳ８２３およびステップＳ８２４でＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定していなければ、ノード装置１００は、初めて受信するデータフレームの初めての転送を試みているところである。よって、処理はステップＳ８２３に移行する。
【０４３４】
ステップＳ８２２でデータフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたエントリにおいて、ＬＤフィールドには、ステップＳ８１９で送信したデータフレームのＬＤの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップＳ８２５に移行する。
【０４３５】
なお、ステップＳ８２２は、ステップＳ８２１で「Ｙｅｓ」と判定されたときに実行される。ここで、ステップＳ８２１で「Ｙｅｓ」と判定される状況は、ステップＳ８１９で送信されるデータフレームが過去に別の隣接ノード装置に送信されており、その隣接ノード装置から対応するＡＣＫフレームを受信しているときに生じる。すなわち、ステップＳ８２２が実行される時点では、ＦＩＤ管理テーブル１０５の当該エントリのＡＣＫ受信フラグには「済み」が設定されているはずである。したがって、データフレーム処理部１１０は、ステップＳ８１９でデータフレームを送信すると、ステップＳ８２２でＡＣＫ受信フラグを「ＮＵＬＬ」に更新する。
【０４３６】
一方、ステップＳ８２３では、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを追加する。そして、次のステップＳ８２４でデータフレーム処理部１１０は、新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、図１６に示すＦＩＤ管理テーブル１０５に作成した新規エントリにおいて、ＦＩＤフィールド、ＧＳフィールド、ＬＤフィールドには、それぞれステップＳ８１９で送信したデータフレームの値をコピーする。また、データフレーム処理部１１０は、新規エントリにおいて、エントリ時刻フィールドおよび最終更新時刻フィールドに現在時刻を設定すると共に、ＯＬＳフィールドには、ステップＳ８１０で記憶したＯＬＳの値をコピーする。そして、処理はステップＳ８２５に移行する。なお、ＡＣＫ受信フラグには「ＮＵＬＬ」が設定され、空データ送信回数フィールドおよび通常データ送信回数フィールドには「ゼロ」が設定される。
【０４３７】
なお、このとき記録されるエントリ時刻は、バックトラック動作において、通常データフレームを送信するか空データフレームを送信するのかを判断するために使用される。例えば、図１５に示すシーケンス図および図１９に示すフローチャートでは、このエントリ時刻は「時刻ＴＥ」として使用されている。
【０４３８】
ステップＳ８２５でデータフレーム処理部１１０は、ステップＳ８１９における送信の成否の通知を待つ。例えば、データフレーム処理部１１０が、所定のプログラムのスレッドを実行する図４のＭＰＵ２０１により実現される場合、ステップＳ８２５ではスレッドがスリープしてもよい。その場合、「送信成功」または「送信失敗」の通知は、スレッドを起こす処理である。
【０４３９】
ステップＳ８１９における送信が成功した場合は、ステップＳ８１９で送信したデータフレームにおいてＬＤとして指定されている隣接ノード装置からＡＣＫフレームが返信される。そして、ＡＣＫ処理部１０７が後述の図３７の処理を行い、データフレーム処理部１１０に「送信成功」を通知する。これにより、ＦＩＤ管理テーブル１０５の対応するエントリのＡＣＫフラグは「済み」に更新される。
【０４４０】
また、ステップＳ８１９における送信の失敗とは、ステップＳ８１９で送信したデータフレームにおいてＬＤとして指定されている隣接ノード装置からのＡＣＫフレームが、式（５）の時刻Ｔｔｉｍｅｏｕｔになってもノード装置１００で受信されないことである。ＡＣＫフレームの受信は、ＡＣＫ処理部１０７による後述の図３８の処理により監視されており、ＡＣＫフレームがタイムアウト時刻Ｔｔｉｍｅｏｕｔになっても受信されないと、ＡＣＫ処理部１０７がデータフレーム処理部１１０に「送信失敗」を通知する。この場合、ＦＩＤ管理テーブル１０５の対応するエントリのＡＣＫフラグは「ＮＵＬＬ」のまま保持される。
【０４４１】
データフレーム処理部１１０が、ステップＳ８２５での待機の後、ＡＣＫ処理部１０７から「送信成功」または「送信失敗」の通知を受けると、処理はステップＳ８２６に移行する。
【０４４２】
ステップＳ８２６でデータフレーム処理部１１０は、ＡＣＫ処理部１０７から受けた通知に基づいて、ステップＳ８１９の送信が成功したか否かを判断する。送信が成功した場合、処理はステップＳ８２７に移行し、送信が失敗した場合、処理はステップＳ８２８に移行する。
【０４４３】
送信が成功した場合、ステップＳ８２７でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８１９で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。ここで、データフレームのＧＤは転送によって書き換えられないことに注意して換言すれば、ステップＳ８２７でデータフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、重みの更新を行う。
【０４４４】
つまり、データフレーム処理部１１０は、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有するエントリを重み付けテーブル１０４−ｉで探し、見つかったエントリの重みの値を小さくする。重みの値を小さくすることは、対応するＬＤの優先度を上げることである。
【０４４５】
ここで、見つかったエントリの現在の重みの値をＷｃｕｒｒｅｎｔとすると、ステップＳ８２７でデータフレーム処理部１１０は、見つかったエントリの重みの値を例えば式（６）のＷｒｅｖｉｓｅｄに更新してもよい。
Ｗｒｅｖｉｓｅｄ＝ｍａｘ（Ｗｍｉｎ，
Ｗｃｕｒｒｅｎｔ−ΔＷｓｕｃｃｅｓｓ）    （６）
なお、式（６）において、Ｗｍｉｎは重みの最小値であり、第１実施形態ではＷｍｉｎ＝０である。また、ΔＷｓｕｃｃｅｓｓは、送信が成功したときに重みを減らす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔＷｓｕｃｃｅｓｓ＝０．１でもよい。
【０４４６】
さらに、データフレーム処理部１１０はステップＳ８２７で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有する重み付けテーブル１０４−ｉのエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０４４７】
他方、送信が失敗した場合、ステップＳ８２８でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８１９で送信したデータフレームのＧＤとＬＤの組に対応する重みを大きくする。つまり、ステップＳ８２８でデータフレーム処理部１１０は、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有するエントリを重み付けテーブル１０４−ｉで探し、見つかったエントリの重みの値を大きくする。重みの値を大きくすることは、対応するＬＤの優先度を下げることである。
【０４４８】
例えば、ステップＳ８２８でデータフレーム処理部１１０は、見つかったエントリの重みの値を式（７）のＷｒｅｖｉｓｅｄに更新してもよい。
Ｗｒｅｖｉｓｅｄ＝ｍｉｎ（Ｗｍａｘ，
Ｗｃｕｒｒｅｎｔ＋ΔＷｆａｉｌｕｒｅ）    （７）
なお、式（７）において、Ｗｍａｘは重みの最大値であり、第１実施形態ではＷｍａｘ＝１である。また、ΔＷｆａｉｌｕｒｅは、送信が失敗したときに重みを増やす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔＷｆａｉｌｕｒｅ＝０．１でもよい。もちろん、ΔＷｆａｉｌｕｒｅ≠ΔＷｓｕｃｃｅｓｓでもよい。
【０４４９】
なお、データフレーム処理部１１０はステップＳ８２８で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値を、例えば図４のＤＲＡＭ２０４などのワークエリアに「転送に失敗したＬＤ」として記憶する。例えば、データフレーム処理部１１０は、ＤＲＡＭ２０４上の線形リストをステップＳ８１７で空に初期化し、ステップＳ８２８の実行のたびに、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値を保持する要素を線形リストに追加してもよい。もちろん、「転送に失敗したＬＤ」の記憶のために配列など他のデータ構造が使われてもよい。
【０４５０】
さらに、データフレーム処理部１１０はステップＳ８２８で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有する重み付けテーブル１０４−ｉのエントリにおいて、最終更新時刻に現在時刻を設定する。そして処理はステップＳ８２９に移行する。
【０４５１】
ステップＳ８２９でデータフレーム処理部１１０は、今までにＬＤとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、転送に失敗したＬＤ以外で、かつＯＬＳとは異なるＬＤのうちで、最小の重みと対応付けられているＬＤの値を取得する。なお、転送に失敗したＬＤは、ステップＳ８２８において例えば図４のＤＲＡＭ２０４などのワークエリアに、例えば線形リストなどの形で、記憶されている。
【０４５２】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、（Ｈ１）かつ（Ｈ２）である値をＬＤとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部１１０は、選択したエントリのＬＤと重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０４５３】
（Ｈ１）過去にステップＳ８１７またはＳ８２９で取得したＬＤの値とは異なる値
（Ｈ２）ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なる値
したがって、例えば、ステップＳ８２８で０．２に更新された重みと対応付けられた隣接ノード装置は、ステップＳ８２９でＬＤとして選択されず、ステップＳ８２９では０．２より大きな、０．８などの重みの隣接ノード装置が選択されることもありうる。
【０４５４】
以上のステップＳ８１７〜Ｓ８２９の具体例を挙げれば、以下のとおりである。例えば、図６のノード装置Ｎ４には、ノード装置Ｎ３、Ｎ５、およびＮ７が隣接している。そして、図１２のとおり、ノード装置Ｎ４のＦＩＤ管理テーブル１０５−Ｎ４のエントリＥ４のＯＬＳの値は、Ｎ３である。
【０４５５】
図６の例では、ノード装置Ｎ４のデータフレーム処理部１１０−Ｎ４が、最初にステップＳ８１７でＬＤの値Ｎ７を取得するので、ステップＳ１０４のようにノード装置Ｎ７へのデータフレームの送信が行われる。しかし、図６に示すとおりステップＳ１０４の送信は失敗するので、データフレーム処理部１１０−Ｎ４はステップＳ８２６で「送信失敗」と判断する。
【０４５６】
すると、データフレーム処理部１１０−Ｎ４がステップＳ８２９を実行する時点で、転送に失敗したＬＤ（すなわちＮ７）以外で、かつＯＬＳ（すなわちＮ３）とは異なるＬＤの値は、Ｎ５のみである。よって、ステップＳ８２９ではＬＤの値Ｎ５が取得される。
【０４５７】
こうしてステップＳ８２９でＬＤの値が取得されると、処理はステップＳ８２９からステップＳ８１８へ戻る。よって、上記のノード装置Ｎ４の例では、ステップＳ８２９の後、再度ステップＳ８１８〜Ｓ８２６が実行される。そして、図６にステップＳ１０５として示すように、今度はステップＳ８２６で「送信成功」と判断され、ステップＳ８２７が実行されて、データフレーム受信処理が終了する。
【０４５８】
なお、ステップＳ８２８で、例えば式（７）のように重みを更新することの影響について具体例を挙げて説明すれば、以下のとおりである。
例えば、図２のネットワーク２において、ノード装置Ｎ１０６が隣接ノード装置Ｎ１０８から、ノード装置Ｎ１１８をＧＤとして指定する第１のデータフレームを時刻Ｔｒｃｖ１に受信したとする。そして、時刻Ｔｒｃｖ１にノード装置Ｎ１０６には、ノード装置Ｎ１１８に対応する重み付けテーブル１０４−ｇ１０６−Ｎ１０６が存在したとする。また、時刻Ｔｒｃｖ１の重み付けテーブル１０４−ｇ１０６−Ｎ１０６においては、ノード装置Ｎ１０２には重み０．４が、ノード装置Ｎ１０３には重み０．７が、ノード装置Ｎ１０７には重み０．１が、ノード装置Ｎ１０８には重み０．５が、それぞれ対応付けられていたとする。
【０４５９】
すると、ステップＳ８１７では、最小の重み０．１と対応付けられているノード装置Ｎ１０７がＬＤとして選択される。ところが、ステップＳ８１９でデータフレームが送信されるとき、偶然、ノード装置Ｎ１０６とＮ１０７の間に遮蔽物が置かれるなどの理由で、一時的に、ノード装置Ｎ１０６とＮ１０７の無線リンクが通信不能になったとする。
【０４６０】
すると、ＡＣＫフレームが返信されないので、ステップＳ８２８では、ノード装置Ｎ１０７の重みが０．１から０．２に更新される。そして、ステップＳ８２９では、重み０．４と対応付けられているノード装置Ｎ１０２がＬＤとして選択される。ここで、ステップＳ８１９におけるデータフレームの送信が成功し、ノード装置Ｎ１０２からＡＣＫフレームが返信されたとする。すると、ステップＳ８２７でノード装置Ｎ１０２の重みが０．４から０．３に更新され、データフレーム受信処理が終了する。
【０４６１】
ここで、ノード装置Ｎ１０６からノード装置Ｎ１０２へ送信された第１のデータフレームは、ノード装置Ｎ１０６にバックトラックすることなく、ノード装置Ｎ１１８に到達したとする。つまり、重み付けテーブル１０４−ｇ１０６−Ｎ１０６においては、第１のデータフレームの転送にともなって重みが１に更新されるエントリはなかったとする。
【０４６２】
すると、ノード装置Ｎ１０６が、その後の時刻Ｔｒｃｖ２に、同じくノード装置Ｎ１１８をＧＤとして指定する第２のデータフレームを今度はノード装置Ｎ１０３から受信したとき、重み付けテーブル１０４−ｇ１０６−Ｎ１０６の内容は次のとおりである。すなわち、ノード装置Ｎ１０２には重み０．３が、ノード装置Ｎ１０３には重み０．７が、ノード装置Ｎ１０７には重み０．２が、ノード装置Ｎ１０８には重み０．５が、それぞれ対応付けられている。
【０４６３】
よって、ステップＳ８１７では、第１のデータフレームの転送に失敗したとはいえ、なお最小の重みと対応付けられているノード装置Ｎ１０７が、ＬＤとして選択される。そして、もし時刻Ｔｒｃｖ２にノード装置Ｎ１０６とＮ１０７の間の無線リンクの通信品質が好転しており、ステップＳ８１９での第２のデータフレームの送信が成功すれば、ステップＳ８２７でノード装置Ｎ１０７の重みは再度０．１に戻る。
【０４６４】
ここで、第２のデータフレームのノード装置Ｎ１０７への転送の結果、バックトラックが生じないものとすると、ノード装置Ｎ１０７の重みは０．１のままである。よって、さらにその後の時刻Ｔｒｃｖ３に、同じくノード装置Ｎ１１８をＧＤとして指定する第３のデータフレームを、ノード装置Ｎ１０７以外の隣接ノード装置からノード装置Ｎ１０６が受信すれば、ＬＤとして最も優先的に選択されるのは、やはりノード装置Ｎ１０７である。
【０４６５】
このように、ステップＳ８２９で重みを急激に最大値に設定するのではなく少しだけ大きくすると、重み付けテーブル１０４が通信環境の変化に過剰に反応することはない。よって、同じノード装置をＧＤとして指定する複数のデータフレームを次々とノード装置Ｎ１０６が受信しているうちに、一時的に障害の生じていたリンクが障害から回復すれば、環境の好転に追従して、過去の学習結果が再びＬＤの選択に活かされるようになる。つまり、上記の例では、ＬＤとして適切だと過去に学習済みのノード装置Ｎ１０７が、再びＬＤとして優先的に選択されるようになる。
【０４６６】
あるいは、時刻Ｔｒｃｖ２においてノード装置Ｎ１０６とＮ１０７の間の無線リンクが障害から復旧していない場合もありうる。その場合、第２のデータフレームの送信時のＬＤとして、一旦は重み０．２のノード装置Ｎ１０７が選択されるが、ＡＣＫフレームが受信されないために、ノード装置Ｎ１０７の重みは０．３に更新される。そして、最終的には重み０．３と対応付けられたノード装置Ｎ１０２がＬＤとして選択され、送信が成功して重みが０，２に更新されることもありうる。
【０４６７】
すると、時刻Ｔｒｃｖ３に、例えばノード装置Ｎ１０３から、ノード装置Ｎ１０６が第３のデータフレームを受信すると、重み０．２に対応付けられたノード装置Ｎ１０２がＬＤとして選択され、また送信が成功し、ノード装置Ｎ１０２の重みが０．１になるかもしれない。そして、その後しばらくは、ノード装置Ｎ１１８をＧＤとして指定するデータフレームのＬＤとして、ノード装置Ｎ１０６はノード装置Ｎ１０２を選択し続けるかもしれない。
【０４６８】
しかし、さらにその後、ノード装置Ｎ１０６とＮ１０２の間の無線リンクに障害が生じたとすると、ノード装置Ｎ１０２からはＡＣＫフレームが返信されてこない。するとステップＳ８２９でＬＤの再選択が行われる。
【０４６９】
その場合、時刻Ｔｒｃｖ１以前にＬＤとして好適であると学習されていたノード装置Ｎ１０７が、重み０．５や０．７と対応付けられており相対的にＬＤとしてあまり適切ではないノード装置Ｎ１０８やＮ１０３よりも、優先的にＬＤとして選ばれる。その理由は、第１と第２のデータフレームの送信時の重みの学習は、ステップＳ８２８に示すように重みをなだらかに変化させるものであり、ノード装置Ｎ１０７の重みは、なおノード装置Ｎ１０８やＮ１０３の重みよりも小さいからである。
【０４７０】
そして、この時点でノード装置Ｎ１０６とＮ１０７の間の無線リンクが障害から復旧していれば、再度、ノード装置Ｎ１０７の重み０．２に減らされる。このように、多少復旧に時間がかかっても、一時的な環境の変化が過剰に重み付けテーブル１０４に反映されないため、過去の学習の成果が緩やかに反映される。したがって、適切なＬＤが選択される蓋然性も高まる。
【０４７１】
以上のとおり、一時的な障害の影響を過剰に受けないようにするため、ステップＳ８２８では、少しだけ重みが調整されるのである。
なお、図３２に示す手順は、図３３に示す手順に置き換えられてもよい。図３３に示す手順は、図３２に示すステップＳ８２２およびＳ８２４を、それぞれステップＳ８２２ａおよびＳ８２４ａに置き換えることにより実現される。
【０４７２】
図３３に示す手順は、例えば、ＦＩＤ管理テーブル１０５がエントリ時刻を管理しない構成に適用される。このような構成においては、データフレーム処理部１１０は、ステップＳ８２４ａにおいて、最終更新時刻フィールドに現在時刻を記録する。また、データフレーム処理部１１０は、ステップＳ８２２ａにおいては、最終時刻フィールドを更新しない。この手順によれば、「最終更新時刻」は、データフレームを最初に隣接ノード装置へ送信した時刻を表すことになる。すなわち、この場合、「最終更新時刻」は、図１６に示すエントリ時刻に相当する。そうすると、データフレーム処理部１１０は、バックトラック動作において通常データフレームまたは空データフレームのどちらを送信するのかの判断において、最終更新時刻を使用することができる。
【０４７３】
上記構成によれば、ＦＩＤ管理テーブル１０５を実現するために消費されるメモリ量が削減される。ただし、この構成においては、図３２に示す手順が実行される場合と比較して、ＦＩＤ管理テーブル１０５の各エントリがエージングにより削除されるタイミングが早まることがある。
【０４７４】
ステップＳ８１８の分岐の説明に戻る。ステップＳ８１８で２つの条件（Ｆ１）と（Ｆ２）のいずれかが成立すると判断されると、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理は図３４のステップＳ８３０に移行する。すなわち、バックトラック動作が実行される。
【０４７５】
ステップＳ８３０〜Ｓ８３１において、データフレーム処理部１１０は、受信したデータフレームのＦＩＤおよびＧＳの値を検索キーとして用いてＦＩＤ管理テーブル１０５を検索する。そして、データフレーム処理部１１０は、上記検索の結果、対応するエントリがヒットしたか否かを判断する。対応するエントリがヒットしていれば、処理はステップＳ８３２に移行し、対応するエントリがヒットしていなければ、処理はステップＳ８４９に移行する。以下では、ステップＳ８３０においてＦＩＤ管理テーブル１０５から検索されたエントリを「対象エントリ」と呼ぶことがある。
【０４７６】
なお、ステップＳ８０７で「エントリがヒットした」と判断されている場合に、ステップＳ８３０の検索により見つかるエントリは、ステップＳ８０６の検索により見つかったエントリである。また、ステップＳ８０７で「エントリがヒットしない」と判定され、かつステップＳ８２３において新規エントリが作成された場合は、ステップＳ８３０の検索により、ステップＳ８２３で作成された新規エントリが見つかる。
【０４７７】
ステップＳ８３１で「エントリがヒットしない」と判断されるのは、（Ｉ１）かつ（Ｉ２）の場合であり、換言すれば、（Ｊ１）かつ（Ｊ２）の場合である。
（Ｉ１）ステップＳ８０７で「エントリがヒットしない」と判断された。
（Ｉ２）１回目にステップＳ８１８が実行された直後に、ステップＳ８３０に処理が移行した。
【０４７８】
（Ｊ１）ノード装置１００が今までに受信したことのないデータフレームが受信された。
（Ｊ２）受信したデータフレームのＧＳの値に対応する重み付けテーブル１０４−ｉでは、すべてのＬＤに最大値の重みが対応付けられている。
ステップＳ８３２において、データフレーム処理部１１０は、バックトラック動作に係わる変数を初期化する。具体的には、ＦＩＤ管理テーブル１０５において、受信フレームのＦＩＤおよびＧＤのペアにより特定されるエントリの空データ送信回数および通常データ送信回数が「ゼロ」に初期化される。
【０４７９】
ステップＳ８３３〜Ｓ８３４において、データフレーム処理部１１０は、対象エントリの空データ送信回数が、予め決められた上限回数以内であるかチェックする。空データ送信回数の上限回数は、特に限定されるものではないが、例えば「３」である。そして、空データ送信回数が上限回数以内であれば、処理はステップＳ８３５に移行する。一方、空データ送信回数が上限回数を超えていれば、処理はステップＳ８４０に移行する。
【０４８０】
ステップＳ８３５において、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５の対応するエントリからエントリ時刻ＴＥを抽出する。なお、エントリ時刻ＴＥは、Ｓ８２４において記録された時刻を表す。すなわち、エントリ時刻ＴＥは、この実施例では、ノード装置が隣接ノード装置から受信したデータフレームを最初に他の隣接ノード装置へ転送した時刻を表している。
【０４８１】
ステップＳ８３６〜Ｓ８３７において、データフレーム処理部１１０は、ステップＳ２０１で受信したデータフレームがＯＬＳノード装置に保持されているか否かを判断する。具体的には、「Ｔ−ＴＥ」とバッファ部１０９の保持時間Ｇとが比較される。「Ｔ」は現在時刻である。ＴＥは、上述したエントリ時刻である。すなわち、「Ｔ−ＴＥ」は、エントリ時刻から現在時刻までの経過時間を表す。また、Ｇは、各ノード装置においてデータフレームがバッファ部１０９に保持されている期間を表し、各ノード装置において共通である。
【０４８２】
「Ｔ−ＴＥ」が保存時間Ｇよりも短いときは、ステップＳ２０１で受信したデータフレームがＯＬＳノード装置に保持されていると判断される。この場合、処理はステップＳ８３８に移行する。一方、「Ｔ−ＴＥ」が保存時間Ｇ以上であるときは、ステップＳ２０１で受信したデータフレームがＯＬＳノード装置に保持されていないと判断される。この場合、処理はステップＳ８４０に移行する。
【０４８３】
ステップＳ８３８において、データフレーム処理部１１０は、ＯＬＳノード装置へ送信する空データフレームを作成し、送信キュー１１４に保存する。このとき、この空データフレームのＬＤには、ＦＩＤ管理テーブル１０５の対象エントリに記録されているＯＬＳが設定される。また、この空データフレームのペイロードには、ステップＳ２０１で受信したデータフレームのデータヘッダのみが格納される。さらに、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５の対象エントリの最終更新時刻に、現在時刻を書き込む。
【０４８４】
ステップＳ８３９において、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５の対象エントリの空データ送信回数をインクリメントする。このように、データフレーム処理部１１０は、空データ送信回数が上限回数以下であり、且つ、エントリ時刻ＴＥからの経過時間が保持時間Ｇよりも短いときに、空データフレームを作成して送信キュー１１４に保存する。
【０４８５】
空データ送信回数が上限回数を超えている場合、或いは、エントリ時刻ＴＥからの経過時間が保持時間Ｇ以上である場合は、ステップＳ８４０の処理が実行される。ステップＳ８４０において、データフレーム処理部１１０は、データフレーム処理部１１０は、ＯＬＳノード装置へ送信する通常データフレームを作成し、送信キュー１１４に保存する。このとき、この通常データフレームのＬＤには、ＦＩＤ管理テーブル１０５の対象エントリに記録されているＯＬＳが設定される。また、この通常データフレームのペイロードは、ステップＳ２０１で受信したデータフレームのペイロードと同じである。さらに、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５の対象エントリの最終更新時刻に、現在時刻を書き込む。
【０４８６】
ステップＳ８４１において、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５の対象エントリの通常データ送信回数をインクリメントする。このように、データフレーム処理部１１０は、空データ送信回数が上限回数を超えているとき、或いは、エントリ時刻ＴＥからの経過時間が保持時間Ｇ以上であるときは、通常データフレームを作成して送信キュー１１４に保存する。
【０４８７】
この結果、送信キュー１１４には、送信待ちのフレーム（通常データフレーム、空データフレームを含む）が保存される。このとき、データフレーム処理部１１０は、ステップＳ２０５のデータフレーム受信処理とは独立して、例えば定期的に、図２１〜図２２に示す空データフレーム集約処理を実行する。したがって、送信キュー１１４には、集約空データフレームが保存されていることもある。
【０４８８】
送信キュー１１４に保存されているフレームは、送信部１０２により定期的に読み出されて送信される。或いは、送信部１０２は、他の契機に応じて送信キュー１１４に保存されているフレームを送信するようにしてもよい。ただし、送信部１０２は、図２１〜図２２に示す空データフレームの集約処理が実行されている期間は、送信キュー１１４にアクセスできない。
【０４８９】
送信部１０２は、送信キュー１１４に保存されているフレームを、そのフレームのアドホックヘッダに設定されているＬＤへ送信する。そして、隣接ノード装置は、このフレームを受信すると、ＡＣＫフレームを返送する。
【０４９０】
データフレーム処理部１１０は、ステップＳ８４２〜Ｓ８４３において、送信部１０２によるフレーム送信の成否を確認する。すなわち、データフレーム処理部１１０は、所定時間内に、ステップＳ８３８で作成した空データフレームまたはステップＳ８４０で作成した通常データフレームに対応するＡＣＫフレームをＯＬＳノード装置から受信するか否かをチェックする。なお、この「所定時間」は、バッファ部１０９の保持時間Ｇと比較して十分に短いものとする。
【０４９１】
データフレーム処理部１１０は、上記ＡＣＫフレームを受信すると、フレーム送信が成功したものと判定する。この場合、処理はステップＳ８４４に移行する。一方、データフレーム処理部１１０は、所定時間内に上記ＡＣＫフレームを受信できなかったときは、フレーム送信が失敗したものと判定する。この場合、処理はステップＳ８４６に移行する。
【０４９２】
ステップＳ８４４において、データフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８３８で作成した空データフレームまたはステップＳ８４０で作成した通常データフレームのＧＤおよびＬＤの値の組に対応する重みを小さくする。換言すれば、データフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤ（つまりステップＳ８０８またはＳ８１０で記憶したＯＬＳ）に対応する重みを更新する。
【０４９３】
ステップＳ８４４の詳細はステップＳ８２７と同様なので詳しい説明は省略するが、データフレーム処理部１１０は、例えば式（６）を使って重みを更新してもよい。また、データフレーム処理部１１０は、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０４９４】
ステップＳ８３８またはＳ８４０で作成したフレームの送信に失敗した場合（ステップＳ８４３：Ｎｏ）、ステップＳ８４６およびＳ８４７の処理が実行される。すなわち、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５の対象エントリの通常データ送信回数が、予め決められた上限回数以上か否かをチェックする。ここで、通常データ送信回数の上限回数は、特に限定されるものではないが、例えば「３」である。
【０４９５】
対象エントリの通常データ送信回数が上限回数に達していれば、データフレーム処理部１１０は、ステップＳ８４８において、ステップＳ２０１で受信したデータフレームをバッファ部１０９から削除する。この場合、バックトラック動作は終了する。
【０４９６】
対象エントリの通常データ送信回数が上限回数に達していなければ、処理はステップＳ８３３に戻る。すなわち、ステップＳ８３８またはＳ８４０で作成したフレームの送信に失敗すると、ステップＳ８３３以降の処理が、再度、実行される。
【０４９７】
このように、実施形態のノード装置は、エントリ時刻ＴＥからの経過時間がバッファ部１０９の保持時間Ｇに達するまでは、バックトラック動作において、ＯＬＳノード装置へ空データフレームを送信する。このとき、空データフレームの送信は、上限回数に達するまで繰り返し実行される。ただし、ＯＬＳノード装置により空データフレームが受信されことが検出されると、バックトラック動作は終了する。また、実施形態のノード装置は、エントリ時刻ＴＥからの経過時間がバッファ部１０９の保持時間Ｇを超えた後、或いは、空データフレームの送信回数が上限回数に達した後は、バックトラック動作において、ＯＬＳノード装置へ通常データフレームを送信する。このとき、通常データフレームの送信は、上限回数に達するまで繰り返し実行される。ただし、ＯＬＳノード装置により通常データフレームが受信されたことが検出されると、バックトラック動作は終了する。
【０４９８】
ＦＩＤ管理テーブル１０５に対象エントリが存在しないときは（ステップＳ８３１：Ｎｏ）、データフレーム処理部１１０は、ステップＳ８４９において、ＯＬＳが存在しないと判断する。すなわち、通信路がループを形成していると判定される。そして、データフレーム処理部１１０は、ステップＳ８５０において、ステップＳ２０１で受信したデータフレームをバッファ部１０９から削除する。この場合、バックトラック動作は終了する。
【０４９９】
続いて、図３６を参照して、図３１のステップＳ８１２ａの重み付けテーブル調整処理の詳細を説明する。なお、図３６の重み付けテーブル調整処理は、後述の図３９のステップＳ１１０８ａでも呼び出される。図３６の説明において「ヒットした重み付けテーブル１０４−ｉ」とは、図３１のステップＳ８１１の検索または図３９のステップＳ１１０７の検索でヒットしたテーブルを意味する。
【０５００】
ステップＳ８６１でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３（図９参照）の１つ目のエントリに注目する。なお、以下の図３６の説明において、データフレーム処理部１１０が注目している隣接ノード管理テーブル１０３のエントリを「注目エントリ」という。
【０５０１】
次に、ステップＳ８６２では、ヒットした重み付けテーブル１０４−ｉに注目エントリのノードＩＤの値をＬＤとして含むエントリがあるか否かを、データフレーム処理部１１０が判断する。ヒットした重み付けテーブル１０４−ｉに、注目エントリのノードＩＤの値をＬＤとして含むエントリがあれば、処理はステップＳ８６５に移行する。逆に、ヒットした重み付けテーブル１０４−ｉに、注目エントリのノードＩＤの値をＬＤとして含むエントリがなければ、処理はステップＳ８６３に移行する。
【０５０２】
ステップＳ８６３でデータフレーム処理部１１０は、ヒットした重み付けテーブル１０４−ｉに新規エントリを追加する。続いて、ステップＳ８６４でデータフレーム処理部１１０は、ステップＳ８６３で重み付けテーブル１０４−ｉに追加した新規エントリに値を設定する。つまり、データフレーム処理部１１０は、新規エントリにおいて、隣接ノード管理テーブル１０３の注目エントリのノードＩＤの値をＬＤフィールドに、初期重み付け値を重みフィールドに、現在時刻を最終更新時刻フィールドに、それぞれ設定する。
【０５０３】
なお、ステップＳ８６４における初期重み付け値は、図２５のステップＳ３０８における初期重み付け値とは異なる。具体的には、ステップＳ８６４での初期重み付け値は、ヒットした重み付けテーブル１０４−ｉの重みフィールドにおいて、１未満の重みのうちの最大値である。
【０５０４】
例えば、ヒットした重み付けテーブル１０４−ｉの重みフィールドに４つのエントリが存在し、それぞれの重みフィールドの値が０．４、０．７、１、および０．５であれば、ステップＳ８６４での初期重み付け値は、０．７である。なお、ヒットした重み付けテーブル１０４−ｉの重みフィールドの値が、全エントリで１の場合は、ステップＳ８６４での初期重み付け値は、１未満の任意の値であり、例えば図２５のステップＳ３０８での初期重み付け値と同様に０．５でもよい。
【０５０５】
以上のような初期重み付け値をステップＳ８６４で用いることにより、重み付けテーブル１０４−ｉの既存のエントリに反映されている学習結果が優先的に考慮される。その結果、経路が必要以上に変動することがなくなり、換言すれば、経路が安定する。
【０５０６】
例えば、４つのエントリの重みフィールドの値がそれぞれ０．４、０．７、１、および０．５である上記の例において、ステップＳ８６４で初期重み付け値として図２５のステップＳ３０８と同様に０．５が使われるとする。すると、重みが何も学習されていない隣接ノード装置（すなわちステップＳ８６３で追加された新規エントリにＬＤとしてノードＩＤが記録されている隣接ノード装置）が、重みが０．７の隣接ノード装置よりも優先的にＬＤとして選択されてしまう。つまり、今までの学習の蓄積としての重み０．７が無視されてしまう。
【０５０７】
そこで、第１実施形態では、重みが何も学習されていない隣接ノード装置が、重みが学習済みの隣接ノード装置よりも優先的にＬＤとして選択されることを防ぎ、今までの学習結果を優先的に考慮するために、上記のように定義される初期重み付け値が利用される。
【０５０８】
ステップＳ８６５でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３にまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部１１０が隣接ノード管理テーブル１０３のすべてのエントリに注目し終えていれば、図３６の処理は終了する。他方、まだデータフレーム処理部１１０が注目していないエントリが隣接ノード管理テーブル１０３に残っていれば、処理はステップＳ８６６に移行する。
【０５０９】
そして、ステップＳ８６６でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３のまだ注目していないエントリのうち、次のエントリに注目する。そして処理はステップＳ８６２に戻る。
【０５１０】
なお、図３６の処理の意義は以下のとおりである。
重み付けテーブル１０４−ｉにおけるエントリごとのエージング処理の副作用として、図３６の処理の直前には、次のような状況の可能性もある。すなわち、隣接ノード管理テーブル１０３に登録されているある隣接ノード装置のノードＩＤを、ＬＤとして有するエントリが、重み付けテーブル１０４−ｉに存在しない可能性がある。
【０５１１】
ここで、ノード装置１００の隣接ノード装置は、データフレームを送信する際にデータフレーム処理部１１０が選択するＬＤの潜在的な候補である。よって、ヒットした重み付けテーブル１０４−ｉのＬＤフィールドにおいて全隣接ノード装置が網羅されるようにすることが、ノード装置１００の適切な動作のためには望ましい。
【０５１２】
以上の図３６の重み付けテーブル調整処理によれば、エージング処理の副作用として生じる可能性のある上記のような状況が解消される。つまり、隣接ノード管理テーブル１０３に登録されているすべてのノードＩＤが、ヒットした重み付けテーブル１０４−ｉにＬＤとして登録されていることが、保証される。
【０５１３】
以上、図３０〜図３６を参照して、図２４のステップＳ２０５におけるデータフレーム受信処理について詳しく説明した。続いて、データフレーム受信処理のステップＳ８２６およびＳ８４３における送信成否の通知に関連する処理について、図３７および図３８を参照して説明する。
【０５１４】
図３７は、図２４のステップＳ２０６におけるＡＣＫフレーム受信処理のフローチャートである。図３７の処理は、フレーム分岐処理部１０６からＡＣＫフレームがＡＣＫ処理部１０７に出力されると開始される。
【０５１５】
ステップＳ９０１でＡＣＫ処理部１０７は、フレーム分岐処理部１０６から受け取ったＡＣＫフレームのＬＤの値が自ノードＩＤと等しいか否かを判断する。ＡＣＫフレームのＬＤの値が自ノードＩＤと等しければ、処理はステップＳ９０２に移行し、ＡＣＫフレームのＬＤの値が自ノードＩＤと異なれば、図３７の処理は終了する。ＡＣＫ処理部１０７も、例えばフラッシュメモリ２０５などに予め格納された自ノードＩＤを参照することができる。
【０５１６】
例えば、図６のステップＳ１０５でノード装置Ｎ４が送信したデータフレームに対するＡＣＫフレームを、図４２にステップＳ１０５ａとして示すようにノード装置Ｎ５が送信すると、無関係なノード装置Ｎ３もＡＣＫフレームを受信する。なぜなら、ノード装置Ｎ３はノード装置Ｎ５に隣接しているからである。
【０５１７】
しかし、ノード装置Ｎ３のＡＣＫ処理部１０７−Ｎ３は、ステップＳ９０１の判断の結果、直ちに図３７の処理を終了するので、ノード装置Ｎ３は、ノード装置Ｎ３と無関係なＡＣＫフレームによる副作用を受けることはない。
【０５１８】
ステップＳ９０２でＡＣＫ処理部１０７は、ＡＣＫフレームのＧＳとＦＩＤの値から、ＡＣＫフレームに対応する送信済みのデータフレームを特定する。
例えば、図６のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３へ送信する図７のデータフレーム３０３に対して、ノード装置Ｎ３は図７のＡＣＫフレーム３２２をノード装置Ｎ２に返信する。ここで、ＡＣＫフレーム３２２の受信を契機にノード装置Ｎ２のＡＣＫ処理部１０７−Ｎ２が図３７の処理を行う場合について詳しく説明すると、以下のとおりである。
【０５１９】
ＡＣＫ処理部１０７−Ｎ２は、ステップＳ９０２において、ＡＣＫフレーム３２２のＧＳとＦＩＤの値（すなわちＮ１とＦａ）を取り出す。また、バッファ部１０９−Ｎ２は、図８と同様の形式であるから、バッファ部１０９−Ｎ２には、ノード装置Ｎ２から送信済みのデータフレーム３０３が格納されている。よって、ＡＣＫ処理部１０７−Ｎ２は、取り出したＧＳとＦＩＤの値（すなわちＮ１とＦａ）をキーにしてバッファ部１０９−Ｎ２のエントリを検索し、データフレーム３０３を含むエントリを特定する。
【０５２０】
ステップＳ９０３においてＡＣＫ処理部１０７は、ステップＳ９０２で特定した送信済みのデータフレームに関して、データフレーム処理部１１０に「送信成功」を通知する。そして、図３７の処理は終了する。
【０５２１】
例えば、データフレーム処理部１１０は、図４のＭＰＵ２０１がプログラムを実行することにより実現されていてもよい。その場合、ＭＰＵ２０１をデータフレーム処理部１１０として機能させるスレッドは、データフレームの送信後、ＡＣＫフレームを受信するまでスリープしていてもよい。ステップＳ９０３における「送信成功」の通知は、スリープしているスレッドを起こす処理である。
【０５２２】
また、ステップＳ９０３の通知は、ステップＳ９０２で特定したデータフレームのＧＳとＦＩＤの値の通知をともなう。例えば上記の例においては、ＡＣＫ処理部１０７−Ｎ２は、データフレーム３０３を識別するためのＧＳとＦＩＤの値（すなわちＮ１とＦａ）も、データフレーム処理部１１０に通知する。
【０５２３】
なお、ステップＳ９０２において特定されたデータフレームは、バッファ部１０９から削除可能な状態にされる。ただし、バッファ部１０９において、データフレームは、対応するＡＣＫフレームの受信時に即座に削除可能な状態にされるのではなく、ＦＩＤ管理テーブル１０５の対応するエントリが削除された後に、削除可能な状態にされる。「削除可能」とは、他のデータにより上書きされることを許容する状態を意味する。
【０５２４】
図３８は、ＡＣＫフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。図３８の処理は、例えば、図４のタイマＩＣ２０３が所定の間隔で発生させる割り込み信号を契機として、定期的に行われる。
【０５２５】
ステップＳ１００１でＡＣＫ処理部１０７は、バッファ部１０９（図８を参照）の１つ目のエントリに注目する。以下、図３８に関する説明においては、ＡＣＫ処理部１０７が注目しているバッファ部１０９のエントリを「注目エントリ」という。
【０５２６】
続いてステップＳ１００２でＡＣＫ処理部１０７は、現在時刻と注目エントリのタイムアウト時刻フィールドの値を比較する。そして、現在時刻がタイムアウト時刻以降であれば、処理はステップＳ１００３に移行する。他方、現在時刻がまだタイムアウト時刻に達していなければ、処理はステップＳ１００５に移行する。
【０５２７】
ステップＳ１００３でＡＣＫ処理部１０７は、バッファ部１０９の注目エントリに格納されているデータフレームに関して、「送信失敗」をデータフレーム処理部１１０に通知する。ステップＳ１００３の通知は、図３７のステップＳ９０３の通知と同様に、具体的には、例えばスリープしているスレッドを起こす処理であってもよい。
【０５２８】
また、ステップＳ９０３の通知と同様に、ステップＳ１００３の通知も、データフレームのＧＳとＦＩＤの値の通知をともなう。具体的には、ＡＣＫ処理部１０７は、注目エントリに格納されているデータフレームのＧＳとＦＩＤの値を読み取り、読み取ったＧＳとＦＩＤの値によりデータフレームを特定して、特定したデータフレームの「送信失敗」をデータフレーム処理部１１０に通知する。
【０５２９】
なお、送信失敗の場合、データフレーム処理部１１０が今までＬＤとして試していない隣接ノード装置を新たなＬＤとして選択してデータフレームの再送を試みることがある。よって、ステップＳ１００３の時点では、注目エントリはバッファ部１０９から削除されない。
【０５３０】
続いてステップＳ１００４でＡＣＫ処理部１０７は、注目エントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。そして、処理はステップＳ１００５に移行する。
【０５３１】
ステップＳ１００５では、まだ注目していないエントリがバッファ部１０９に残っているか否かをＡＣＫ処理部１０７が判断する。ＡＣＫ処理部１０７が、バッファ部１０９のすべてのエントリに注目し終わっていれば、図３８の処理は終了する。他方、まだＡＣＫ処理部１０７が注目していないエントリがバッファ部１０９に残っていれば、処理はステップＳ１００６に移行する。
【０５３２】
ステップＳ１００６でＡＣＫ処理部１０７は、バッファ部１０９の中でまだ注目していない次のエントリに注目する。そして処理はステップＳ１００２に戻る。
ところで、図３０〜図３５を参照して説明したデータフレーム受信処理は、上記のとおり、ノード装置１００がＧＳとならないタイプのノード装置である場合の例である。以下では、図３９〜図４１を参照して、ＧＳとなりうるタイプのノード装置に特有の処理について説明する。
【０５３３】
図３９および図４０は、ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャートである。図３９の処理は、上位層処理部１１１からデータフレーム処理部１１０への要求を契機として開始される。
【０５３４】
ステップＳ１１０１でデータフレーム処理部１１０は、上位層処理部１１１から、上位層処理部１１１における上位層のプロトコルの処理の結果として、データフレームのＧＤの値とペイロードを取得する。
【０５３５】
例えば、「上位層のプロトコル」がイーサネットプロトコルであってもよい。その場合、上位層処理部１１１は、第１実施形態で定義されるデータフレームのペイロードとして、イーサネットフレームをデータフレーム処理部１１０に出力する。また、上位層処理部１１１は、第１実施形態におけるデータフレームのＧＤに設定する値を、データフレーム処理部１１０に通知する。
【０５３６】
そして、データフレーム処理部１１０は、上位層処理部１１１から取得したペイロードを含む新たなデータフレームを作成し、作成したデータフレームのＧＤに、上位層処理部１１１から取得した値を設定する。例えば、図６の例では、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、上位層処理部１１１−Ｎ１からＧＤの値としてＮ７を取得し、データフレームのＧＤにＮ７と設定する。
【０５３７】
続いて、ステップＳ１１０２でデータフレーム処理部１１０は、ステップＳ１１０１で取得したペイロードの長さを求め、作成したデータフレームの長さフィールドに設定する。例えば、図６の例では、図７のデータフレーム３０２と３０３に例示するように、ペイロードの長さはＰａであるから、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、作成したデータフレームの長さフィールドにＰａと設定する。
【０５３８】
そして、ステップＳ１１０３でデータフレーム処理部１１０は、作成したデータフレームのＧＳとＬＳに自ノードＩＤを設定する。例えば、図６の例では、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、作成したデータフレームのＧＳとＬＳにそれぞれＮ１と設定する。
【０５３９】
そして、ステップＳ１１０４でデータフレーム処理部１１０は、ＦＩＤ生成部１１３に新たなＦＩＤの生成を要求する。するとＦＩＤ生成部１１３が新たなＦＩＤを生成してデータフレーム処理部１１０に出力するので、データフレーム処理部１１０は、生成されたＦＩＤを作成したデータフレームのＦＩＤフィールドに設定する。
【０５４０】
さらに、ステップＳ１１０５でデータフレーム処理部１１０は、「データフレーム」を示す所定の値Ｄ（図７を参照）を、作成したデータフレームのタイプフィールドに設定する。なお、以上のステップＳ１１０２〜Ｓ１１０５の実行順序は順不同である。
【０５４１】
以上のようにして、送信するデータフレームを作成し終わると、ステップＳ１１０６でデータフレーム処理部１１０は、作成したデータフレームをバッファ部１０９に格納する。すなわち、データフレーム処理部１１０は、バッファ部１０９内に新たなエントリの領域を確保し、確保した領域に、作成したデータフレームを格納する。なお、図８に示すようにバッファ部１０９にはタイムアウト時刻フィールドがあるが、この時点ではタイムアウト時刻は設定されない。
【０５４２】
続いてステップＳ１１０７でデータフレーム処理部１１０は、ステップＳ１１０１で上位層処理部１１１から指定されたＧＤの値を用いて重み付けテーブル１０４を検索する。
そしてステップＳ１１０８でデータフレーム処理部１１０は、指定されたＧＤの値に対応する重み付けテーブルが、ステップＳ１１０７の検索の結果としてヒットしたか否かを判断する。指定されたＧＤの値に対応する重み付けテーブルがヒットした場合、処理はステップＳ１１０８ａに移行し、指定されたＧＤの値に対応する重み付けテーブルが存在しない場合、処理はステップＳ１００９に移行する。
【０５４３】
ステップＳ１１０８ａでデータフレーム処理部１１０は、図３６の重み付けテーブル調整処理を行い、エージング処理の副作用を中和する。そして、処理はステップＳ１１１０に移行する。
【０５４４】
ステップＳ１１０９でデータフレーム処理部１１０は、ステップＳ１１０１で指定されたＧＤの値に対応する新規重み付けテーブルを重み付けテーブル１０４の中に追加する。具体的には、データフレーム処理部１１０は、ステップＳ１１０９において、図３１のステップＳ８１３〜Ｓ８１６と類似の処理を行う。
【０５４５】
すなわち、データフレーム処理部１１０はステップＳ１１０９で、上位層処理部１１１から指定されたＧＤの値に対応する新規重み付けテーブルを追加し、新規重み付けテーブルにおいて、上位層処理部１１１から指定されたＧＤの値をＧＤとして設定する。さらに、データフレーム処理部１１０は、隣接ノード管理テーブル１０３と同数の新規エントリを新規重み付けテーブル内に作成する。そして、データフレーム処理部１１０は、作成した各エントリに、それぞれ、隣接ノード管理テーブル１０３の各エントリのノードＩＤと初期重み付け値と現在時刻を設定する。
【０５４６】
なお、以下では説明の便宜上、ステップＳ１１０１で指定されたＧＤの値に対応する重み付けテーブルを、「１０４−ｉ」という参照符号で参照する。すなわち、重み付けテーブル１０４−ｉは、ステップＳ１１０７の検索でヒットしたテーブルまたはステップＳ１１０９で追加されたテーブルである。
【０５４７】
以上のようにして、重み付けテーブル１０４−ｉがヒットしたとステップＳ１１０８で判断された後、またはステップＳ１１０９で重み付けテーブル１０４−ｉが作成された後、処理はステップＳ１１１０に移行する。
【０５４８】
そして、ステップＳ１１１０でデータフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、最小の重みと対応付けられているＬＤの値を取得する。なお、図１１に例示するように、重み付けテーブル１０４−ｉにおいて複数のエントリが同じ最小の重みを有する場合もありうる。その場合、データフレーム処理部１１０は、最小の重みと対応付けられている複数のＬＤの値のうち任意の１つをステップＳ１１１０で選択して取得する。データフレーム処理部１１０は、取得したＬＤの値および対応する重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０５４９】
続いて、処理は図４０のステップＳ１１１１に移行し、ステップＳ１１１１でデータフレーム処理部１１０は、下記の２つの条件（Ｋ１）と（Ｋ２）のいずれかが成立するか否かを判断する。
【０５５０】
（Ｋ１）ステップＳ１１１０で取得したＬＤの値に対応する重みが、重みの最大値（第１実施形態では、具体的には１．０）である。
（Ｋ２）重み付けテーブル１０４−ｉに登録されているすべてのＬＤへの送信が、いずれも失敗した。
【０５５１】
条件（Ｋ１）または（Ｋ２）が成立する場合、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理はステップＳ１１１２に移行する。
他方、条件（Ｋ１）と（Ｋ２）のいずれも成立しない場合、まだＬＤとして選択可能な隣接ノード装置が残っている。換言すれば、データフレーム受信処理のステップＳ８１８に関して説明した（Ｇ１）〜（Ｇ３）のいずれにも該当しない隣接ノード装置が、少なくとも１つは存在する。そして、ＬＤとして選択可能な隣接ノード装置のノードＩＤが、ステップＳ１１１０（または後述のステップＳ１１２５）で取得されている。そこで、ステップＳ１１１１で条件（Ｋ１）と（Ｋ２）のいずれも成立しないと判断されると、処理はステップＳ１１１４に移行する。
【０５５２】
条件（Ｋ１）または（Ｋ２）が成立する場合、ステップＳ１１１２でデータフレーム処理部１１０は、データフレームを破棄する。つまり、データフレーム処理部１１０は、ステップＳ１１０６で新たに作成してデータフレームを格納したエントリを、バッファ部１０９から削除する。
【０５５３】
そして、続くステップＳ１１１３でデータフレーム処理部１１０は、上位層処理部１１１に「送信失敗」を通知する。つまり、データフレーム処理部１１０は、どの隣接ノード装置にもデータフレームを成功裡に送信することはできなかったことを、上位層処理部１１１に通知する。そして図３９〜図４０の処理が終了する。
【０５５４】
他方、ステップＳ１１１１において、条件（Ｋ１）と（Ｋ２）のいずれも成立しないと判断されると、取得済みのＬＤの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理が、ステップＳ１１１４〜Ｓ１１２５で行われる。
【０５５５】
ステップＳ１１１４では、データフレーム処理部１１０が、ステップＳ１１０６でバッファ部１０９に格納したデータフレームのＬＤに、ステップＳ１１１０または後述のステップＳ１１２５で取得したＬＤの値を設定する。そして、データフレーム処理部１１０は、ＬＤの値を設定したデータフレームの送信を、送信部１０２に依頼する。すると、送信部１０２がデータフレームを送信する。
【０５５６】
続いてステップＳ１１１５でデータフレーム処理部１１０は、ステップＳ１１０６でデータフレームを格納したバッファ部１０９内のエントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。
【０５５７】
そして、ステップＳ１１１６でデータフレーム処理部１１０は、自ノードＩＤと、ステップＳ１１０４でＦＩＤ生成部１１３が生成したＦＩＤを使ってＦＩＤ管理テーブル１０５を検索する。
【０５５８】
次にステップＳ１１１７でデータフレーム処理部１１０は、ステップＳ１１１６のＦＩＤ管理テーブル１０５の検索においてエントリがヒットしたか否かを判断する。なお、ステップＳ１１１７が１回目に実行される場合には「エントリがヒットしなかった」と判断され、ステップＳ１１１７が２回目以降に実行されるときは「エントリがヒットした」と判断される。
【０５５９】
ステップＳ１１１６の検索でエントリがヒットしていれば、処理はステップＳ１１１８に移行する。他方、ステップＳ１１１６の検索でエントリがヒットしていなければ、処理はステップＳ１１１９に移行する。
【０５６０】
ステップＳ１１１８でデータフレーム処理部１１０は、ステップＳ１１１６の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ステップＳ１１１６の検索でヒットしたエントリにおいて、ＬＤフィールドには、ステップＳ１１１４で送信したデータフレームのＬＤの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップＳ１１２１に移行する。
【０５６１】
また、ステップＳ１１１９でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを追加する。そして、次のステップＳ１１２０でデータフレーム処理部１１０は、新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳとＬＤの各フィールドには、それぞれステップＳ１１１４で送信したデータフレームの値をコピーする。また、データフレーム処理部１１０は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、ＯＬＳフィールドには、自ノードＩＤをコピーする。
【０５６２】
例えば、図１２に示した、ノード装置Ｎ１のＦＩＤ管理テーブル１０５−Ｎ１のエントリＥ１は、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１が以上の処理により作成したものである。
【０５６３】
ステップＳ１１２１でデータフレーム処理部１１０は、ステップＳ１１１４における送信の成否の通知を待つ。ステップＳ１１２１の詳細は、図３２のステップＳ８２５と同様である。データフレーム処理部１１０が、ステップＳ１１２１での待機の後、ＡＣＫ処理部１０７から「送信成功」または「送信失敗」の通知を受けると、処理はステップＳ１１２２に移行する。
【０５６４】
ステップＳ１１２２でデータフレーム処理部１１０は、ＡＣＫ処理部１０７から受けた通知に基づいて、ステップＳ１１１４の送信が成功したか否かを判断する。送信が成功した場合、処理はステップＳ１１２３に移行し、送信が失敗した場合、処理はステップＳ１１２４に移行する。
【０５６５】
送信が成功した場合、ステップＳ１１２３でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ１１１４で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。
【０５６６】
つまり、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤに対応する重みを、例えば式（６）を使って更新する。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、図３９〜図４０の処理は終了する。
【０５６７】
逆に、送信が失敗した場合、ステップＳ１１２４でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ１１１４で送信したデータフレームのＧＤとＬＤの組に対応する重みを大きくする。
【０５６８】
つまり、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤに対応する重みを、例えば式（７）を使って更新する。
【０５６９】
なお、データフレーム処理部１１０はステップＳ１１２４でさらに、送信したデータフレームのＬＤの値を、例えば図４のＤＲＡＭ２０４などのワークエリアに「送信に失敗したＬＤ」として記憶する。図３２のステップＳ８２８と同様に、「送信に失敗したＬＤ」の記憶のためには、線形リストや配列などのデータ構造が利用されてもよい。
【０５７０】
また、データフレーム処理部１１０はステップＳ１１２４でさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、処理はステップＳ１１２５に移行する。
【０５７１】
ステップＳ１１２５でデータフレーム処理部１１０は、今までにＬＤとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信に失敗したＬＤ以外のＬＤのうちで、最小の重みと対応付けられているＬＤの値を取得する。ここで、送信に失敗したＬＤは、ステップＳ１１２４において例えば図４のＤＲＡＭ２０４などのワークエリアに、例えば線形リストや配列の形で記憶されている。
【０５７２】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、過去にステップＳ１１１０またはＳ１１２５で取得されていないＬＤの値のうちで、最小の重みと対応付けられているものを取得する。データフレーム処理部１１０は、取得したＬＤの値および対応する重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。そして、処理はステップＳ１１１１に戻る。
【０５７３】
図４１は、ＧＳにもなりうるノード装置１００が、データフレーム受信処理の一部として図３４〜図３５の処理の代わりに行う処理のフローチャートである。
ノード装置１００がＧＳにもなりうるノード装置である場合、データフレーム受信処理におけるステップＳ８０１〜Ｓ８２９は、ノード装置１００がＧＳにはならない場合と同様であり、図３０〜図３２に示したとおりである。しかし、ノード装置１００がＧＳにもなりうるノード装置の場合は、図３２のステップＳ８１８においてデータフレーム処理部１１０が「条件（Ｆ１）と（Ｆ２）のいずれかが成立する」と判断すると、処理は図４１のステップＳ８７１に移行する。
【０５７４】
ステップＳ８７１において、データフレーム処理部１１０は、受信したデータフレームのＧＳの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＧＳの値が自ノードＩＤに一致すれば、処理はステップＳ８７２に移行する。一方、受信したデータフレームのＧＳの値が自ノードＩＤと異なっていれば、処理はステップＳ８７４に移行する。なお、ステップＳ８７４は、実施形態のフレーム送信方法によるバックトラック動作であり、基本的に、図３４〜図３５に示すステップＳ８３０〜Ｓ８５０と同じである。よって、ステップＳ８７４の処理は省略する。
【０５７５】
ステップＳ８７２においてデータフレーム処理部１１０は、上位層処理部１１１に「送信失敗」を通知する。通知にあたって、データフレーム処理部１１０は、例えば受信したデータフレームからペイロードを取り出し、ペイロードまたはペイロードの一部を上位層処理部１１１に出力してもよい。すると、上位層処理部１１１は、どのデータの送信に失敗したのかを、データフレーム処理部１１０から受け取ったペイロードの内容に基づいて認識することができる。
【０５７６】
ステップＳ８７３において、データフレーム処理部１１０は、受信したデータフレームを破棄する。すなわち、データフレーム処理部１１０は、ステップＳ８０１で見つけたエントリをバッファ部１０９から削除する。なお、ステップＳ８７３は、下記の（Ｌ１）または（Ｌ２）において実行される。
【０５７７】
（Ｌ１）ノード装置１００自身がＧＳとなって送信したデータフレームがバックトラックによりノード装置１００に戻ってきて受信されたのであり、かつ、ノード装置１００の隣接ノード装置はすべて（Ｌ１−１）または（Ｌ１−２）である。
【０５７８】
（Ｌ１−１）最大値の重みと対応付けられている。
（Ｌ１−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
（Ｌ２）受信したデータフレームのＧＳは、ノード装置１００以外の他のノード装置であり、かつ、ＯＬＳ以外のすべての隣接ノード装置が（Ｌ２−１）または（Ｌ２−２）であり、かつ、ＯＬＳへのデータフレームの送信は失敗した。
（Ｌ２−１）最大値の重みと対応付けられている。
（Ｌ２−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
【０５７９】
図４２は、ハローフレームの送受信による隣接ノードの認識および図６の経路選択を示すタイミングチャートである。
【０５８０】
図１のネットワーク１において、各ノード装置Ｎ１〜Ｎ７は、独立してそれぞれ図２６のハローフレーム送信処理を行う。どのノード装置が先にハローフレームを送信するかは任意であるが、図４２の例では、まずステップＳ１２０１でノード装置Ｎ２が図２６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ２に隣接するノード装置Ｎ１、Ｎ３、およびＮ６でそれぞれ受信される。そして、ノード装置Ｎ１、Ｎ３、およびＮ６は、それぞれ図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ２を隣接ノード装置として認識する。
【０５８１】
また、図４２の例では、続いてステップＳ１２０２で、ノード装置Ｎ４が図２６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ４に隣接するノード装置Ｎ３、Ｎ５、およびＮ７でそれぞれ受信される。そして、ノード装置Ｎ３、Ｎ５、およびＮ７は、それぞれ図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ４を隣接ノード装置として認識する。
【０５８２】
さらに、ステップＳ１２０３では、ノード装置Ｎ３が図２６のステップＳ４０３を実行し、図７のハローフレーム３１２を送信する。すると、ハローフレーム３１２はノード装置Ｎ３に隣接するノード装置Ｎ２、Ｎ４、およびＮ５でそれぞれ受信される。そして、ノード装置Ｎ２、Ｎ４、およびＮ５は、それぞれ図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ３を隣接ノード装置として認識する。
【０５８３】
また、ステップＳ１２０４では、ノード装置Ｎ７が図２６のステップＳ４０３を実行し、ハローフレームを送信する。なお、ステップＳ１２０４の時点では、ノード装置Ｎ４とＮ７の間のリンクには障害がまだ生じていないものとする。よって、ハローフレームはノード装置Ｎ７に隣接するノード装置Ｎ４とＮ６でそれぞれ受信される。そして、ノード装置Ｎ４とＮ６は、それぞれ図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ７を隣接ノード装置として認識する。
【０５８４】
また、ステップＳ１２０５では、ノード装置Ｎ１が図２６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ１に隣接するノード装置Ｎ２で受信される。そして、ノード装置Ｎ２は、図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ１を隣接ノード装置として認識する。
【０５８５】
さらに、ステップＳ１２０６では、ノード装置Ｎ６が図２６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ６に隣接するノード装置Ｎ２とＮ７でそれぞれ受信される。そして、ノード装置Ｎ２とＮ７は、それぞれ図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ６を隣接ノード装置として認識する。
【０５８６】
そして、ステップＳ１２０７では、ノード装置Ｎ５が図２６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ５に隣接するノード装置Ｎ３とＮ４でそれぞれ受信される。そして、ノード装置Ｎ３とＮ４は、それぞれ図２４のステップＳ２０３で図２５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ５を隣接ノード装置として認識する。
【０５８７】
以上のステップＳ１２０１〜Ｓ１２０７により、図１および図６に示すネットワーク１内のノード装置Ｎ１〜Ｎ７は、それぞれ隣接ノード装置を認識し、隣接ノード管理テーブル１０３−Ｎ１〜１０３−Ｎ７を更新する。また、図２５に示すように、ノード装置Ｎ１〜Ｎ７は、ハローフレームの受信を契機として、場合によっては重み付けテーブル１０４−Ｎ１〜１０４−Ｎ７）を更新することもある。
【０５８８】
その後、ステップＳ１２０８でノード装置Ｎ４とＮ７の間のリンクに障害が発生するものとする。また、上記障害の発生とは関係なく、ステップＳ１０１でノード装置Ｎ１が、ノード装置Ｎ７をＧＤとして指定するデータフレームを、ノード装置Ｎ２をＬＤとして指定して送信する。つまり、ステップＳ１０１でノード装置Ｎ１は、図３９〜図４０に示すフレーム送信処理を行う。
【０５８９】
すると、データフレームを受信したノード装置Ｎ２は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ２がＡＣＫフレームを送信することが、図４２ではステップＳ１０１ａとして表現されている。
【０５９０】
他方、ノード装置Ｎ１は、図４０のステップＳ１１２１でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ１は、ステップＳ１０１ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ１１２１の待機を終え、ステップＳ１１２２とＳ１１２３を実行し、図４０の処理を終える。
【０５９１】
また、ステップＳ１０１ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ２は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ３を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１０２に相当する。なお、図７には、ステップＳ１０２で送信されるデータフレーム３０３が例示されている。
【０５９２】
すると、データフレームを受信したノード装置Ｎ３は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図４２ではステップＳ１０２ａとして表現されている。なお、図７には、ステップＳ１０２ａで送信されるＡＣＫフレーム３２２が例示されている。
【０５９３】
他方、ノード装置Ｎ２は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ２は、ステップＳ１０２ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図３２の処理を終える。
【０５９４】
また、ステップＳ１０２ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ４を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１０３に相当する。なお、図７には、ステップＳ１０３で送信されるデータフレーム３０４が例示されている。
【０５９５】
すると、データフレームを受信したノード装置Ｎ４は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ４がＡＣＫフレームを送信することが、図４２ではステップＳ１０３ａとして表現されている。
【０５９６】
他方、ノード装置Ｎ３は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１０３ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図３２の処理を終える。
【０５９７】
また、ステップＳ１０３ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ４は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ７を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１０４に相当する。
【０５９８】
しかし、ステップＳ１２０８でノード装置Ｎ４とＮ７の間のリンクには障害が発生しており、データフレームはノード装置Ｎ７に到達しない。そのため、図４２ではステップＳ１０４の矢印は、途中から破線になっている。
【０５９９】
ノード装置Ｎ４は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。しかし、ノード装置Ｎ７からＡＣＫフレームが受信されないため、ノード装置Ｎ４は、定期的に実行している図３８の処理のステップＳ１００３において、ノード装置Ｎ７へのデータフレームの送信が失敗したと認識する。
【０６００】
その結果、ノード装置Ｎ４は、ステップＳ８２５の待機を終え、ステップＳ８２６、Ｓ８２８、Ｓ８２９、Ｓ８１８の処理を順に実行する。そして、ノード装置Ｎ４は、続くステップＳ８１９において、ＬＤとしてノード装置Ｎ５を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１０５に相当する。
【０６０１】
すると、データフレームを受信したノード装置Ｎ５は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ５がＡＣＫフレームを送信することが、図４２ではステップＳ１０５ａとして表現されている。
【０６０２】
他方、ノード装置Ｎ４は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ４は、ステップＳ１０５ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図３２の処理を終える。
【０６０３】
また、ステップＳ１０５ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ５は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ３を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１０６に相当する。
【０６０４】
すると、データフレームを受信したノード装置Ｎ３は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図４２ではステップＳ１０６ａとして表現されている。
【０６０５】
他方、ノード装置Ｎ５は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ５は、ステップＳ１０６ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図３２の処理を終える。
【０６０６】
また、ステップＳ１０６ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ５を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１０７に相当する。
【０６０７】
すると、データフレームを受信したノード装置Ｎ５は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ５がＡＣＫフレームを送信することが、図４２ではステップＳ１０７ａとして表現されている。
【０６０８】
他方、ノード装置Ｎ３は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１０７ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図３２の処理を終える。
【０６０９】
また、ステップＳ１０７ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ５は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図３２のステップＳ８１８から図３４のステップＳ８３０へと進み、ノード装置Ｎ５は、ＯＬＳであるノード装置Ｎ４をＬＤとして指定してデータフレームを送信する。このフレーム送信が、図４２のステップＳ１０８に相当する。このとき、ノード装置Ｎ４にデータフレームが保存されていると見込まれるときは、ノード装置Ｎ５は、通常のデータフレームの代わりに空データフレームを送信する。このように、ノード装置Ｎ５は、バックトラック動作により、ノード装置Ｎ４へ通常のデータフレームまたは空データフレームを送信する。
【０６１０】
すると、データフレームを受信したノード装置Ｎ４は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。このとき、ノード装置Ｎ４は、空データフレームを受信したときは、対応するデータフレームをバッファ部１０９から抽出する。図３０のステップＳ８０３でノード装置Ｎ４がＡＣＫフレームを送信することが、図４２ではステップＳ１０８ａとして表現されている。
【０６１１】
他方、ノード装置Ｎ５は、図３５のステップＳ８４２でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ５は、ステップＳ１０８ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８４２の待機を終え、ステップＳ８４４を実行し、図３４〜図３５の処理を終える。
【０６１２】
また、ステップＳ１０８ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ４は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図３２のステップＳ８１８から図３４のステップＳ８３０へと進み、ノード装置Ｎ４は、ＯＬＳであるノード装置Ｎ３をＬＤとして指定してデータフレームを送信する。このフレーム送信が、図４２のステップＳ１０９に相当する。このとき、ノード装置Ｎ３にデータフレームが保存されていると見込まれるときは、ノード装置Ｎ４は、通常のデータフレームの代わりに空データフレームを送信する。このように、ノード装置Ｎ４は、バックトラック動作により、ノード装置Ｎ３へ通常のデータフレームまたは空データフレームを送信する。
【０６１３】
すると、データフレームを受信したノード装置Ｎ３は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。このとき、ノード装置Ｎ３は、空データフレームを受信したときは、対応するデータフレームをバッファ部１０９から抽出する。図３０のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図４２ではステップＳ１０９ａとして表現されている。
【０６１４】
他方、ノード装置Ｎ４は、図３５のステップＳ８４２でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ４は、ステップＳ１０９ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８４２の待機を終え、ステップＳ８４４を実行し、図３４〜図３５の処理を終える。
【０６１５】
また、ステップＳ１０９ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図３２のステップＳ８１８から図３４のステップＳ８３０へと進み、ノード装置Ｎ３は、ＯＬＳであるノード装置Ｎ２をＬＤとして指定してデータフレームを送信する。このフレーム送信が、図４２のステップＳ１１０に相当する。このとき、ノード装置Ｎ２にデータフレームが保存されていると見込まれるときは、ノード装置Ｎ３は、通常のデータフレームの代わりに空データフレームを送信する。このように、ノード装置Ｎ３は、バックトラック動作により、ノード装置Ｎ２へ通常のデータフレームまたは空データフレームを送信する。
【０６１６】
すると、データフレームを受信したノード装置Ｎ２は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。このとき、ノード装置Ｎ２は、空データフレームを受信したときは、対応するデータフレームをバッファ部１０９から抽出する。図３０のステップＳ８０３でノード装置Ｎ２がＡＣＫフレームを送信することが、図４２ではステップＳ１１０ａとして表現されている。
【０６１７】
他方、ノード装置Ｎ３は、図３５のステップＳ８４２でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１１０ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８４２の待機を終え、ステップＳ８４４を実行し、図３４〜図３５の処理を終える。
【０６１８】
また、ステップＳ１１０ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ２は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ６を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１１１に相当する。
【０６１９】
すると、データフレームを受信したノード装置Ｎ６は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ６がＡＣＫフレームを送信することが、図４２ではステップＳ１１１ａとして表現されている。
【０６２０】
他方、ノード装置Ｎ２は、図３２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ２は、ステップＳ１１１ａで送信されるＡＣＫフレームを受信すると、図２４のステップＳ２０６から図３７の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図３２の処理を終える。
【０６２１】
また、ステップＳ１１１ａに示すように図３０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ６は、ステップＳ８０４以降の処理を続行し、図３２のステップＳ８１９で、ＬＤとしてノード装置Ｎ７を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４２のステップＳ１１２に相当する。
【０６２２】
すると、データフレームを受信したノード装置Ｎ７は、図２４のステップＳ２０５から図３０〜図３５の処理を呼び出して実行する。図３０のステップＳ８０３でノード装置Ｎ７がＡＣＫフレームを送信することが、図４２ではステップＳ１１２ａとして表現されている。
【０６２３】
以上説明した一連の処理により、ネットワーク１全体では、たとえステップＳ１２０８で障害が発生しようとも、ノード装置Ｎ１〜Ｎ７の自律分散協調の結果として、動的に経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉が選択され、学習される。すなわち、以上の一連の処理によりノード装置Ｎ１〜Ｎ６では重み付けテーブル１０４−Ｎ１〜１０４−Ｎ６が更新されている。
【０６２４】
したがって、ステップＳ１１２ａの後には、学習の結果として、ノード装置Ｎ７をＧＤとして指定するデータフレームは、図６のようにネットワーク１内で試行錯誤的にバックトラックしながら転送される代わりに、初めから効率よく転送される。
【０６２５】
続いて、第２実施形態について説明する。第２実施形態では、ノード装置間が有線接続されている。
第１実施形態では、図３の受信部１０１と送信部１０２が図４の無線モジュール２０６により実現され、ノード装置間は無線リンクにより接続される。すなわち、第１実施形態は、無線アドホックネットワークを想定している。これに対して、第２実施形態では、例えば図１または図２に示すネットワークのノード装置間が有線リンクで接続される。すなわち、第２実施形態は、有線アドホックネットワークを想定している。以下、第２実施形態の具体例について、図４３〜図４４を参照して説明する。
【０６２６】
図４３は、第２実施形態が適用される有線ネットワークの例を示す図である。図４３のネットワーク４は、複数のノード装置１００ａ〜１００ｉを含み、有線アドホックネットワークの一例である。まず、ノード装置１００ａの構成の概略を説明する。
【０６２７】
なお、ノード装置１００ａ〜１００ｉの構成は同様である。互いに同様のコンポーネントには、「２１１ａ−１」、「２１１ａ−２」、「２１１ｂ−１」などのように、添え字を除いて同じ参照符号を割り当て、詳しい説明を省略することがある。
【０６２８】
ノード装置１００ａ〜１００ｉは、無線モジュール２０６により実現される図３の受信部１０１および送信部１０２の代わりに、有線通信のための物理ポート（以下単に「ポート」という）とＰＨＹチップにより実現される不図示の受信部および送信部を有する。図４３の例では、ノード装置１００ａは、４つのポート２１１ａ−１〜２１１ａ−４を備えるが、ポートの数は実施形態に応じて任意である。
【０６２９】
なお、ポート２１１ａ−１〜２１１ａ−４は、第２実施形態によるフレームの通信を行うためのポートである。つまり、図７に示す第１実施形態と同様のデータフレームが、ポート２１１ａ−１〜２１１ａ−４を介して送受信される。換言すれば、ポート２１１ａ−１〜２１１ａ−４は、ノード装置１００ａが隣接ノード装置と有線接続するためのポートである。
【０６３０】
以下では説明の便宜上、１つのポートに対応して１つのＰＨＹチップがあるものと仮定するが、物理的には１つのＰＨＹチップが複数のポートの入出力処理を行うことも可能である。
【０６３１】
また、第２実施形態では、ＡＣＫフレームとハローフレームが使われない。よって、ノード装置１００ａは、図３のＡＣＫ処理部１０７とハローフレーム生成部１１２を含まない。また、第２実施形態では、フレーム分岐処理部１０６、リンク管理部１０８、データフレーム処理部１１０の動作の一部が、第１実施形態とは異なる。さらに、第２実施形態では、図９に示す第１実施形態の隣接ノード管理テーブル１０３の代わりに、図４４に示す隣接ノード管理テーブル１０３ａが使われる。第２実施形態では、隣接ノード管理テーブル１０３ａにより、隣接ノード装置との接続に使用されるポートを識別するポートＩＤも管理される。
【０６３２】
ところで、第１実施形態では、外部ネットワークとの接続のためにノード装置１００が図４のＰＨＹチップ２０２を備えている場合を例示した。第２実施形態のノード装置１００ａも同様に、外部ネットワークとの接続のため、汎用ＬＡＮポート２１２ａを備えている。
【０６３３】
汎用ＬＡＮポート２１２ａは、例えばイーサネット規格にのっとった有線接続用の物理ポートであり、不図示のＰＨＹチップと接続されている。図４３では、汎用ＬＡＮポート２１２ａ〜２１２ｉを斜線で示して、ポート２１１ａ−１〜２１１ｉ−４とは区別してある。なお、本実施形態における汎用ＬＡＮポート２１２ａ〜２１２ｉは有線ＬＡＮポートであるが、実施形態によっては無線ＬＡＮインタフェイスを代わりに用いることもできる。
【０６３４】
そして、上記のごとき構成を有する各ノード装置１００ａ〜１００ｉは、ネットワーク４において、ケーブル（例えば、銅ケーブルなどの金属線ケーブル、または光ファイバケーブル）により、物理的にはメッシュ状（換言すれば格子状）に接続されている。もちろん、ネットワークにおける物理的な接続トポロジは、実施形態に応じて任意であり、必ずしもメッシュ状でなくてもよい。
【０６３５】
図４３に示すメッシュ状の物理的なトポロジは、この実施例では、次の（Ｍ１）〜（Ｍ１２）のようなケーブル配線により実現されている。
（Ｍ１）ノード装置１００ａと１００ｄは、ポート２１１ａ−１と２１１ｄ−１の間のリンク５１５により接続されている。
【０６３６】
（Ｍ２）ノード装置１００ａと１００ｂは、ポート２１１ａ−４と２１１ｂ−１の間のリンク５１６により接続されている。
（Ｍ３）ノード装置１００ｂと１００ｅは、ポート２１１ｂ−２と２１１ｅ−２の間のリンク５１７により接続されている。
【０６３７】
（Ｍ４）ノード装置１００ｂと１００ｃは、ポート２１１ｂ−４と２１１ｃ−１の間のリンク５１８により接続されている。
（Ｍ５）ノード装置１００ｃと１００ｆは、ポート２１１ｃ−３と２１１ｆ−３の間のリンク５１９により接続されている。
【０６３８】
（Ｍ６）ノード装置１００ｄと１００ｇは、ポート２１１ｄ−２と２１１ｇ−２の間のリンク５２１により接続されている。
（Ｍ７）ノード装置１００ｄと１００ｅは、ポート２１１ｄ−４と２１１ｅ−１の間のリンク５２２により接続されている。
【０６３９】
（Ｍ８）ノード装置１００ｅと１００ｈは、ポート２１１ｅ−３と２１１ｈ−３の間のリンク５２３により接続されている。
（Ｍ９）ノード装置１００ｅと１００ｆは、ポート２１１ｅ−４と２１１ｆ−１の間のリンク５２４により接続されている。
【０６４０】
（Ｍ１０）ノード装置１００ｆと１００ｉは、ポート２１１ｆ−４と２１１ｉ−４の間のリンク５２５により接続されている。
（Ｍ１１）ノード装置１００ｇと１００ｈは、ポート２１１ｇ−４と２１１ｈ−１の間のリンク５２６により接続されている。
【０６４１】
（Ｍ１２）ノード装置１００ｈと１００ｉは、ポート２１１ｈ−４と２１１ｉ−１の間のリンク５２７により接続されている。
もちろん、実施形態に応じて、図４３に例示した以外の組み合せのポート間をケーブルで接続することで図４３と等価なメッシュトポロジを実現することも可能である。
【０６４２】
ところで、図４３の例では、ネットワーク４は孤立したネットワークではなく、ＬＡＮやＷＡＮ（Wide Area Network）などの外部ネットワークとも接続される。例えば、図４３の例では、ネットワーク４は、次のようにして外部ネットワークと接続される。すなわち、リンク５１１を介してＰＣ（Personal Computer）５０１と接続されたＬ２ＳＷ（Layer 2 Switch）５０２が、ノード装置１００ａと１００ｂそれぞれの汎用ＬＡＮポート２１２ａと２１２ｂに、それぞれリンク５１２と５１３を介して接続されている。また、ＰＣ５０３、５０５、５０６が、ノード装置１００ｃ、１００ｇ、１００ｈそれぞれの汎用ＬＡＮポート２１２ｃ、２１２ｇ、２１２ｈに、それぞれリンク５１４、５２８、５２９を介して接続されている。
【０６４３】
なお、Ｌ２ＳＷ５０２は、不図示のルータや、不図示の他のＰＣとさらに接続されていてもよい。また、ＰＣ５０３、５０５、および５０６も、不図示の他の外部ネットワークに接続されていてもよい。
【０６４４】
また、説明の便宜上、図４３には９個のノード装置１００ａ〜１００ｉを含むネットワーク４を例示したが、実施形態によっては、例えば数千個〜数十万個といった多数のノード装置を有線アドホックネットワークが含んでいてもよい。例えば、いたる所に配置された多数のセンサから様々な情報を収集するためのネットワークであるセンサネットワークに、本実施形態の有線アドホックネットワークが適用されてもよい。その場合、多数のセンサに対応して、有線アドホックネットワークは、数千個〜数十万個のオーダの、多数のノード装置を含んでもよい。センサネットワークでは、例えば、画像センサ、温度センサ、湿度センサ、圧力センサ、加速度センサなど、任意の種類のセンサが利用される。
【０６４５】
図４３も、本実施形態による有線アドホックネットワークの、センサネットワークへの適用例の１つを示している。すなわち、図４３においてノード装置１００ｅと１００ｉそれぞれの汎用ＬＡＮポート２１２ｅと２１２ｉには、ＬＡＮインタフェイスを備えたセンサ５０４と５０７が、それぞれリンク５２０と５３０を介して接続されている。センサ５０４と５０７は、感知した結果を示すデータを、ＬＡＮインタフェイスを介してイーサネットフレームとして出力する。これらのセンサ５０４と５０７の種類は任意である。
【０６４６】
このように、第２実施形態は、ノード装置間が有線リンクで接続されたネットワークを前提とする。このため、第２実施形態のノード装置の動作は、上述した第１実施形態とは異なるところもあるが、基本的には同じである。そして、第２実施形態においても、第１実施形態と同様に、バックトラック動作において空データフレームまたは集約空データフレームを使用することで、フレームの転送効率が向上する。さらに、特に図示しないが、無線リンクおよび有線リンクが混在するネットワークにおいても、第１または第２実施形態と同様に、フレームの転送効率が向上する。
【０６４７】
＜その他＞
実施形態のノード装置は、複数の隣接ノード装置のうち任意の１つからフレームを受信する受信手段として、例えば図３の受信部１０１、図４の無線モジュール２０６、図４３のポート２１１ａ−１〜２１１ａ−４とそこに接続されたＰＨＹチップなどを備える。
【０６４８】
また、図３のＦＩＤ管理テーブル１０５は、例えば、図４のＤＲＡＭ２０またはフラッシュメモリ２０５により実現され、図１２、図１３、図１６に示す情報を格納している。このＦＩＤ管理テーブル１０５は、以下の（Ｎ１）〜（Ｎ３）の各情報を対応付けて記憶する記憶手段の一例である。
【０６４９】
（Ｎ１）送信対象フレームを識別するフレーム識別情報
（Ｎ２）複数の隣接ノード装置のうちで、送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報
（Ｎ３）送信対象フレームを最初に送信してきた隣接ノード装置を識別する起源ノード識別情報
なお、上記（Ｎ１）の送信対象フレームは、例えば、図１７に示すデータフレーム、空データフレーム、集約空データフレームである。そして、フレーム識別情報の例は、ＧＳフィールドの値とＦＩＤフィールドの値の組み合わせである。
【０６５０】
また、上記（Ｎ２）の送信先隣接ノード識別情報の具体例は、ＦＩＤ管理テーブル１０５のＬＤフィールドに格納される、隣接ノード装置のノードＩＤである。
そして、上記（Ｎ３）の起源ノード識別情報の具体例は、ＦＩＤ管理テーブル１０５のＯＬＳフィールドに格納されるノードＩＤである。
【０６５１】
上記のとおり、ノード装置１００がデータフレームを中継する場合には、ノード装置１００が最初に当該データフレームを受信したときの当該データフレームのＬＳフィールドの値が、ＦＩＤ管理テーブル１０５のＯＬＳフィールドに格納される。つまり、送信対象フレームを最初に送信してきた隣接ノード装置のノードＩＤが、ＯＬＳフィールドに格納される。
【０６５２】
また、図３の重み付けテーブル１０４は、図４のＤＲＡＭ２０４やフラッシュメモリ２０５により実現され、図１０〜図１１に示す情報を格納している。この重み付けテーブル１０４は、データフレームの最終宛先であるＧＤに対応付けて、複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する記憶手段の一例である。
【０６５３】
なお、送信可能性情報は、上記実施形態では、具体的にはＬＤフィールドのノードＩＤと重みの値との組をそれぞれ含む、１つまたは複数のエントリで表されている。そして、送信可能性は、例えば「重みの値が１ならば送信不能であり、重みの値が１未満ならば送信可能である」というように表される。
【０６５４】
また、図３のデータフレーム処理部１１０は、例えば図４のＭＰＵ２０１とＤＲＡＭ２０４により実現され、送信可能性情報を更新する更新手段の一例である。受信部１０１などの受信手段が受信した受信フレームを識別する受信フレーム識別情報が、ＦＩＤ管理テーブル１０５などの記憶手段に（Ｎ１）のフレーム識別情報として記憶されている場合、更新手段としてのデータフレーム処理部１１０は、送信可能性情報を更新する。
【０６５５】
また、データフレーム処理部１１０および送信部１０２は、協働して、複数の隣接ノード装置の中から、フレームを送信可能な第２の隣接ノード装置を選択し、第２の隣接ノード装置へ受信フレームを送信する送信手段として機能する。送信手段の一部としてのデータフレーム処理部１１０は、受信フレーム宛先に対応付けられて重み付けテーブル１０４などの記憶手段に記憶されている送信可能性情報に基づいて、第２の隣接ノード装置を選択する。
【０６５６】
また、データフレーム処理部１１０および送信部１０２は、協働してバックトラック手段としても機能する。バックトラック手段としてのデータフレーム処理部１１０および送信部１０２は、重み付けテーブル１０４などの記憶手段の送信可能性情報において、複数の隣接ノード装置の中に送信可能なものがなく、かつ受信フレーム識別情報がＦＩＤ管理テーブル１０５などの記憶手段に（Ｎ１）のフレーム識別情報として記憶されている場合に、起源ノード識別情報により識別される第３の隣接ノード装置へ受信フレームの少なくとも一部を送信する。
【０６５７】
バックトラックを実行するノード装置は、受信フレームが第３の隣接ノード装置に保持されていると見込まれるときは、受信フレームの一部であるフレーム識別情報を第３の隣接ノードへ送信する。「受信フレームが第３の隣接ノード装置に保持されていると見込まれるとき」とは、例えば、「受信フレームを受信したときからの経過時間が、各ノード装置において処理フレームが保持される期間よりも短いとき」、或いは、「受信フレームを第２の隣接ノード装置へ送信したときからの経過時間が、各ノード装置において処理フレームが保持される期間よりも短いとき」に相当する。ここで、「受信フレームを受信したとき」または「受信フレームを第２の隣接ノード装置へ送信したとき」は、上述の実施例では、ＦＩＤ管理テーブル１０５に記録されるエントリ時刻に相当する。また、フレーム識別情報は、上述の実施例では、データヘッダに含まれるＦＩＤおよびＧＤに相当する。そして、フレーム識別情報は、上述の実施例では、空データフレームにより送信される。
【０６５８】
第３の隣接ノード装置へ送信するフレーム識別情報が複数あるときは、それら複数のフレーム識別情報は１つのフレームに格納して送信される。複数のフレーム識別情報を格納するフレームは、上述の実施例では、集約空データフレームに相当する。
【０６５９】
また、ノード装置は、フレーム保持手段として、第２の隣接ノード装置へ送信した受信フレームを保持する送信キューを備える。送信キューは、例えば、受信フレームを第２の隣接ノード装置へ送信したときから少なくとも予め決められた保持期間が経過するまで、その受信フレームを保持する。この保持時間は、上述の実施例では、例えば、ＦＩＤ管理テーブル１０５において各エントリを保持するエージング時間に相当する。
【０６６０】
さらに、ノード装置は、上述した第２の隣接ノード装置からフレーム識別情報が通知されると、その通知されたフレーム識別情報に対応するフレームをフレーム保持手段としての送信キューから抽出する。そして、ノード装置は、送信可能性情報基としての重み値に基づいて決まる隣接ノード装置へ抽出したフレームを送信する。
【図１】
0005477462.tif 000002
【図２】
0005477462.tif 000003
【図３】
0005477462.tif 000004
【図４】
0005477462.tif 000005
【図５】
0005477462.tif 000006
【図６】
0005477462.tif 000007
【図７】
0005477462.tif 000008
【図８】
0005477462.tif 000009
【図９】
0005477462.tif 000010
【図１０】
0005477462.tif 000011
【図１１】
0005477462.tif 000012
【図１２】
0005477462.tif 000013
【図１３】
0005477462.tif 000014
【図１４】
0005477462.tif 000015
【図１５】
0005477462.tif 000016
【図１６】
0005477462.tif 000017
【図１７】
0005477462.tif 000018
【図１８】
0005477462.tif 000019
【図１９】
0005477462.tif 000020
【図２０】
0005477462.tif 000021
【図２１】
0005477462.tif 000022
【図２２】
0005477462.tif 000023
【図２３】
0005477462.tif 000024
【図２４】
0005477462.tif 000025
【図２５】
0005477462.tif 000026
【図２６】
0005477462.tif 000027
【図２７】
0005477462.tif 000028
【図２８】
0005477462.tif 000029
【図２９】
0005477462.tif 000030
【図３０】
0005477462.tif 000031
【図３１】
0005477462.tif 000032
【図３２】
0005477462.tif 000033
【図３３】
0005477462.tif 000034
【図３４】
0005477462.tif 000035
【図３５】
0005477462.tif 000036
【図３６】
0005477462.tif 000037
【図３７】
0005477462.tif 000038
【図３８】
0005477462.tif 000039
【図３９】
0005477462.tif 000040
【図４０】
0005477462.tif 000041
【図４１】
0005477462.tif 000042
【図４２】
0005477462.tif 000043
【図４３】
0005477462.tif 000044
【図４４】
0005477462.tif 000045