(57)【特許請求の範囲】
【請求項１】
第１のノード装置が送信元として設定され、第２のノード装置が最終宛先として設定された、第１のデータを自装置に隣接する第１の隣接ノード装置から受信する受信手段と、
前記第１の隣接ノード装置以外の自装置に隣接する第２の隣接ノード装置に、前記第１のデータを送信し、前記第１のデータを識別する第１のデータ識別情報と前記第１の隣接ノード装置を識別するノード識別情報を対応付けて記憶部に記憶し、前記記憶部に前記第１のデータ識別情報に対応付けて記憶された前記ノード識別情報により識別される前記第１の隣接ノード装置に、前記受信手段により受信された、前記第１のデータ識別情報を含み、前記第２のノード装置が送信元として設定され、前記第１のノード装置が宛先として設定された第２のデータを転送する通信制御部と、
を備えるノード装置。
【請求項２】
前記通信制御部は、前記第２のデータに基づき、前記第１のデータが前記第２のノード装置により受信済みであることを示す情報を前記記憶部に記憶させ、前記記憶部に、前記受信手段により受信された前記第１のデータが前記第１のデータの最終宛先として設定された前記第２のノード装置で受信済みであることを示す情報が記憶されているときに、前記第１のデータを送信せずに廃棄し、前記第１のデータに含まれるデータ識別情報に対応付けて記憶された前記ノード識別情報により識別される第１の隣接ノード装置に、前記第２のデータを送信する、
ことを特徴とする請求項１に記載のノード装置。
【請求項３】
前記通信制御部は、前記第１の隣接ノード装置の他に前記第１のデータを送信可能な自装置に隣接する隣接ノード装置がないときには、前記第１のデータを前記第１の隣接ノード装置へ返送する、
ことを特徴とする請求項１または２に記載のノード装置。
【請求項４】
自ノード装置が最終宛先として設定された第３のデータを、自装置に隣接するいずれかの隣接ノード装置から前記受信手段が受信した場合、前記通信制御部は、前記第３のデータを識別するデータ識別情報を含み、前記第３のデータに送信元として設定されていたノード装置を宛先として設定した第４のデータを、前記いずれかの隣接ノード装置に送信する、
ことを特徴とする請求項１から３のいずれか１項に記載のノード装置。
【請求項５】
ノード装置が、
第１のノード装置が送信元として設定され、第２のノード装置が最終宛先として設定された、第１のデータを、自装置に隣接する第１の隣接ノード装置から受信し、
前記第１の隣接ノード装置以外の自装置に隣接する第２の隣接ノード装置に、前記第１のデータを送信し、
前記第１のデータを識別する第１のデータ識別情報と前記第１の隣接ノード装置を識別するノード識別情報を対応付けて記憶し、
前記第１のデータ識別情報を含み、前記第２のノード装置が送信元として設定され、前記第１のノード装置が宛先として設定された第２のデータを受信し、
前記第１のデータ識別情報に対応付けて記憶された前記ノード識別情報により識別される前記第１の隣接ノード装置に、前記第２のデータを転送する
ことを特徴とするデータ通信方法。
【請求項６】
前記第２のデータに基づき、前記第１のデータが前記第２のノード装置により受信済みであることを示す情報を記憶し、
前記第１のデータが前記第１のデータの最終宛先として設定された前記第２のノード装置で受信済みであることを示す情報が記憶されているときに、前記第１のデータを受信した場合、
受信した前記第１のデータを送信せずに廃棄し、
前記第１のデータに含まれるデータ識別情報に対応付けて記憶された前記ノード識別情報により識別される前記第１の隣接ノード装置に、前記第２のデータを送信する、
ことを特徴とする請求項５に記載のデータ通信方法。
【請求項７】
前記第１の隣接ノード装置の他に前記第１のデータを送信可能な自装置に隣接する隣接ノード装置がないときには、前記第１のデータを前記第１の隣接ノード装置へ返送する、
ことを特徴とする請求項５または６に記載のデータ通信方法。
【請求項８】
自ノード装置が最終宛先として設定された第３のデータを、自装置に隣接するいずれかの隣接ノード装置から受信した場合、前記第３のデータを識別するデータ識別情報を含み、前記第３のデータに送信元として設定されていたノード装置を宛先として設定した第４のデータを、前記いずれかの隣接ノード装置に送信する
ことを特徴とする請求項５から７のいずれか１項に記載のデータ通信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のデータ通信装置を含むネットワークにおける、経路選択が可能なデータ通信装置に関する。
【背景技術】
【０００２】
無線アドホックネットワークにおいて、複数のデータ通信を行なうデータ通信装置（以降、ノード装置、または単にノードということがある）によりデータ転送が実現されている。このデータ転送は，このアドホックネットワークにおいて最初の送信元となるデータ通信装置である送信元ノード（ＧＳ：Global Source）から送信されたデータを、複数のノードを経由しながら最終的な宛先であるデータ通信装置である最終宛先ノード（ＧＤ：Global Destination）までデータを転送する。【０００３】
従来技術では，ＧＳであるノードＸとＧＤであるノードＺ間でデータ転送が行われる場合、次のようなＡＣＫ（ACKnowledge）制御が実行されている。まず、ノードＸとその隣接ノードa間で行われるデータ送信１について、ノードaがＡＣＫをノードＸに返す。次に、ノードaとその隣接ノードb間でデータ送信２が実行され、データ送信２に対するＡＣＫをノードbがノードaに返す。同様の転送をノードＺまで行う。すなわち、従来のＡＣＫ制御では、隣接ノード間でのデータ送信とそれに対するローカルなＡＣＫ返送を行なうものがあった。【０００４】
また、アドホックネットワークのＡＣＫ技術として往路のブロードキャストと復路のユニキャストによりエンドノード間の経路を構築するものもあった。
さらに、サービス品質（ＱｏＳ）に基づいて再送を制御する従来技術（例えば特許文献１に記載の技術）や、障害の発生したノードを迂回する代替パスを確立することによる再送制御技術（例えば特許文献２に記載の技術）が知られている。さらに、送信側装置から再送されたデータパケットについて、受信確認パケット（ＡＣＫ）によって受信済みであることが判断されると、そのデータパケットを廃棄制御する再送制御技術が従来知られている（例えば特許文献３に記載の技術）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特表２００４−５３１９７１号公報
【特許文献２】特表２００４−５３７２０６号公報
【特許文献３】特開２００６−２８７３３１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
各ノードからデータを収集するだけでなく、各宛先ノードへ制御情報を送信する場合やファームウェアの更新を行なう場合、データが宛先ノードに正確に到達したかを確認する必要がある。また、無線アドホックネットワークでデータサイズの大きな動画などを転送する場合、フェージング等に起因してリトライが頻発することがある。【０００７】
上記の場合、従来のように隣接ノード間だけのＡＣＫの確認では不十分であった。
また、アドホックネットワークにおいて宛先ノードに到達したことを確認しようとするとネットワークに輻輳が発生するという問題があった。【０００８】
そこで本発明の課題は、無線アドホックネットワーク等の自律分散型ネットワークにおける送信元と宛先のノード装置間で、ネットワークの輻輳を回避しながらＧＳとＧＤ間での受信確認を正確に行なう通信装置を提供することである。
【課題を解決するための手段】
【０００９】
態様の一例では、受信手段と通信制御部を備えるノード装置が提供される。
前記受信手段は、第１のノード装置が送信元として設定され、第２のノード装置が最終宛先として設定された、第１のデータを自装置に隣接する第１の隣接ノードから受信する。【００１０】
前記通信制御部は、前記第１の隣接ノード装置以外の自装置に隣接する第２の隣接ノード装置に、前記第１のデータを送信する。また、前記通信制御部は、前記第１のデータを識別する第１のデータ識別情報と前記第１の隣接ノード装置を識別するノード識別情報を対応付けて記憶部に記憶する。また、前記通信制御部は、前記受信手段により受信された、前記第１のデータ識別情報を含み、前記第２のノード装置が送信元として設定され、前記第１のノード装置が宛先として設定された第２のデータに基づき、前記記憶部に、前記第１のデータが前記第２のノード装置により受信済みであることを示す情報を記憶する。また、前記通信制御部は、前記記憶部に前記第１のデータ識別情報に対応付けて記憶された前記ノード識別情報により識別される前記第１の隣接ノード装置に、前記第２のデータを転送する。
【発明の効果】
【００１１】
無線アドホックネットワーク等において、通信経路の輻輳を回避しながらＧＤからＧＳへ受信確認データによる到達通知を行うことが可能となる。
【図面の簡単な説明】
【００１２】
【図１Ａ】本実施形態による再送制御処理の例１を示す図である。
【図１Ｂ】図１Ａの各ノードが保有する到達保証転送記録テーブル１１５の例を示す図である。
【図２Ａ】本実施形態による再送制御処理の例２を示す図である。
【図２Ｂ】図２Ａの各ノードが保有する到達保証転送記録テーブル１１５の例を示す図である。
【図３Ａ】本実施形態による再送制御処理の例３を示す図である。
【図３Ｂ】図３Ａの各ノードが保有する到達保証転送記録テーブル１１５の例を示す図である。
【図４】ネットワーク構成の第１の例を示す図である。
【図５】ネットワーク構成の第２の例を示す図である。
【図６】本実施形態におけるノード装置の構成を示す機能ブロック図である。
【図７】本実施形態におけるノード装置のハードウェア構成を示す図である。
【図８】１つのノード装置に注目して重みの学習について説明する図である。
【図９】図４のネットワーク１において動的かつ自律分散的に経路が選択される様子を説明する図である。
【図１０】フレームの例を示す図である。
【図１１】図６のバッファ部１０９に格納されるデータの例を示す図である。
【図１２】図６の隣接ノード管理テーブル１０３の例を示す図である。
【図１３】図６の重み付けテーブル１０４の例を示す図である。
【図１４】図１３の重み付けテーブル１０４−１−Ｎ３の変化を説明する図である。
【図１５】図６のＦＩＤ管理テーブル１０５の例を示す図（その１）である。
【図１６】図６のＦＩＤ管理テーブル１０５の例を示す図（その２）である。
【図１７】図６の再送信バッファ１１７の例を示す図である。
【図１８】図６の組立バッファ１１６の例を示す図である。
【図１９】フレーム受信処理のフローチャートである。
【図２０】図１９のステップＳ２０３におけるハローフレーム受信処理のフローチャートである。
【図２１】ハローフレーム送信処理のフローチャートである。
【図２２】隣接ノード管理テーブル１０３のエージング処理のフローチャートである。
【図２３】重み付けテーブル１０４のエージング処理のフローチャートである。
【図２４】ＦＩＤ管理テーブル１０５のエージング処理のフローチャートである。
【図２５】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その１）である。
【図２６】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その２）である。
【図２７】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その３）である。
【図２８】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その４）である。
【図２９Ａ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その５）である。
【図２９Ｂ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その６）である。
【図２９Ｃ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その７）である。
【図２９Ｄ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その８）である。
【図２９Ｅ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その９）である。
【図２９Ｆ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その１０）である。
【図２９Ｇ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その１１）である。
【図２９Ｈ】図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その１２）である。
【図３０Ａ】到達保証転送記録テーブルへの記録処理の詳細を示すフローチャートである。
【図３０Ｂ】到達保証ＡＣＫ送信処理の詳細を示すフローチャートである。
【図３１】図２６のステップＳ８１２ａにおける重み付けテーブル調整処理のフローチャートである。
【図３２】図１９のステップＳ２０６におけるＡＣＫフレーム受信処理のフローチャートである。
【図３３】ＡＣＫフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。
【図３４Ａ】ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その１）である。
【図３４Ｂ】ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その２）である。
【図３５】ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その３）である。
【図３６】再送信バッファ１１７のエージング処理のフローチャートである。
【図３７】組立バッファ１１６のエージング処理のフローチャートである。
【図３８】ＧＳにもなりうるノード装置１００が、データフレーム受信処理の一部として図２８の処理の代わりに行う処理のフローチャートである。
【図３９】経路を探索するための探索空間を表す探索木の形式で、図９における経路選択を説明する図である。
【図４０】ハローフレームの送受信による隣接ノードの認識と図９の経路選択とを示すタイミングチャートである。
【図４１Ａ】本実施形態の効果の説明図（その１）である。
【図４１Ｂ】本実施形態の効果の説明図（その２）である。
【図４１Ｃ】本実施形態の効果の説明図（その３）である。
【図４１Ｄ】本実施形態の効果の説明図（その４）である。
【発明を実施するための形態】
【００１３】
以下、いくつかの実施形態について、図面を参照しながら詳細に説明する。具体的には、まず図１Ａから図３Ｂを参照してデータのＧＳからＧＤへの到達保証を要求することを含むデータがＧＤからＧＳへ転送され、このグローバル到達ＡＣＫがＧＤからＧＳに返送され、あるいは再送されたことを示す到達ＡＣＫの動作について説明する。次に図４と図５を参照してネットワーク構成の例を説明し、図６〜図４０を参照して本実施形態について説明する。最後に、図４１Ａ〜図４１Ｄを参照して本実施形態の効果について説明する。
【００１４】
無線アドホックネットワーク等においてＳ／Ｎが十分確保できない通信環境下でデータ送受信を正常に行うためには、隣接ノード間のローカルなＡＣＫとは別のＡＣＫ制御が必要となる。すなわち、ＧＤからＧＳへノードをまたいだグローバルなＡＣＫを通知し、そのグローバルＡＣＫが未到達の場合には、ＧＳによる再送処理が必須となる。以後、本実施形態では、このようなグローバルなＡＣＫを到達保証ＡＣＫと呼ぶことにする。
【００１５】
ここで，正常にデータ送受信が完了しても、フェージング等の影響で電波品質が悪い場合には、到達保証ＡＣＫの返信経路の途中で、到達保証ＡＣＫの送受信に失敗してしまう。その結果、ＧＳが到達保証ＡＣＫを受信できずに、該当するデータフレームを再送してしまう可能性が高くなる。特に、ＧＳからＧＤまで複数ノードを経由して到達保証ＡＣＫを通知する場合、到達保証ＡＣＫの送受信に失敗する可能性が増し、その結果、ＧＳからのデータフレームの再送が頻発してネットワークの負荷が増大する。
【００１６】
ＩＰ（Internet Protocol）をベースとするＴＣＰ（Transfer Control Protocol）技術で実現されるような再送制御技術を、無線アドホックネットワークにも適用することは想到できる。例えば、前述した従来技術の一つでは、次のような中継装置が実現されている。すなわち、中継装置において、送信側装置から再送されたデータパケットについて、宛先側からの受信確認パケット（ＡＣＫ）によって受信済みであることが判断されると、そのデータパケットが廃棄される。この結果、ＡＣＫが経路途中で消失してしまうことにより送信側装置が該当するＴＣＰ／ＩＰデータの再送を行っても、ＡＣＫが正常に受信できている中継装置より宛先側にはＴＣＰ／ＩＰデータが再送されないように制御することができる。
【００１７】
ここで、ＴＣＰによる再送制御は、送信元と宛先のノード装置間で、通信開始に先立ってセッションを確立することが前提である。
一方、無線アドホックネットワークは、ＧＳから送信されたデータを、複数のノードで無線品質に応じて動的に経路を選択しながら、ＧＤまでデータを転送できることが大きな特徴である。そして、アドホックネットワークを流れるデータフレームのペイロードには、様々なデータを格納して伝送することができる。例えば、アドホックデータフレームのペイロードには、イーサネットフレーム、ＩＰパケット、さらには上位レイヤのＰＤＵ（Protocol Data Unit）、あるいはアプリケーションが直接扱うデータ等を格納することができる。
【００１８】
しかし、このようなアドホックネットワークに、ＴＣＰ技術を応用した再送制御方式を実装しようとした場合、アドホックレイヤよりも上位のレイヤで制御されるセッションの確立を前提とする再送方式を実装する必要が生じる。前述したように、無線アドホックネットワーク上で大きなサイズのデータを伝送するためには、ＧＳとＧＤ間のグローバルな再送制御が必須と考えられる。しかし、ＴＣＰベースの再送制御方式を実装するためには、伝送されるデータを、セッションの確立を前提とする上位レイヤのＰＤＵに合わせて格納し伝送する必要が生じる。このため、無線アドホックネットワークのデータ伝送の自由度が損なわれてしまうという問題がある。
【００１９】
そこで、以下に説明する実施形態では、ＧＳとＧＤ間のグローバルな再送制御を、アドホックレイヤで実現する方式について説明する。
図１Ａは、本実施形態による再送制御処理の例１を示す図である。また、図１Ｂは、図１Ａの各ノードＡ，Ｂ，Ｃが保有する到達保証転送記録テーブル１１５Ａ，１１５Ｂ，１１５Ｃの例を示す図である。
【００２０】
図１Ａにおいて、３つのノードＡ，Ｂ，Ｃは、無線アドホックネットワークを構成する通信ノード装置（以下単に「ノード」と表記）である。そして、図１Ａの例１は、ＧＳであるノードＡから、中継ノードであるノードＢを経由して、ＧＤであるノードＣに、到達することが保証されるデータフレームを転送する例を示している。もちろん、無線アドホックネットワークを構成するノードは、Ａ，Ｂ，Ｃに限られるものではない。また、ＧＳ（ノードＡ）からＧＤ（ノードＣ）へのデータフレームの転送は、ノードＢのみを中継するものに限られるものではなく、より多くのノードを中継する場合にも、本実施形態を適用することができる。以下、到達することが保証されるデータフレームを、「到達保証データフレーム」と表記する。
【００２１】
図１Ａにおいて、時刻Ｔ１にノードＡから送信された到達保証データフレームＤ１０１（図中では「データＤ１０１」と表記）は、ノードＡが隣接ノード中から選択したノードＢに転送され、時刻Ｔ２にノードＢで受信される。この到達保証データフレームＤ１０１において、ＧＳとしてはノードＡが指定され、ＧＤとしてはノードＣが指定されている。時刻Ｔ２にノードＢで受信された到達保証データフレームＤ１０１は、ノードＢが隣接ノード中から選択したノードＣに転送され、時刻Ｔ３にノードＣで受信される。ここで、ある対象ノードの隣接ノードとは、その対象ノードからホップ数１以内の無線通信範囲に存在するノードをいう。
【００２２】
時刻Ｔ３に到達保証データフレームＤ１０１を受信したノードＣは、Ｄ１０１のＧＳとして指定されているノードＡをＧＤ、自分自身をＧＳと指定して、到達保証ＡＣＫフレームＧ１０１を送信する。この到達保証ＡＣＫフレームＧ１０１は、到達保証データフレームＤ１０１に対するＡＣＫ（肯定応答）である。なお、到達保証ＡＣＫフレームは、データフレームを受信した各ノードが送信元の隣接ノードに返すローカルなＡＣＫとは異なることに注意されたい。到達保証ＡＣＫフレームＧ１０１は、ノードＣがデータＤ１０１から抽出した隣接送信元ノードＢに転送され、時刻Ｔ４にノードＢで受信される。時刻Ｔ４にノードＢで受信された到達保証ＡＣＫフレームＧ１０１は、ノードＢが隣接ノード中から選択したノードＡに転送され、時刻Ｔ５にノードＡで受信される。これにより、ノードＡは、到達保証データフレームＤ１０１がノードＣに到達したことを認識できる。
【００２３】
さらに、時刻Ｔ６にノードＣをＧＤ、ノードＡをＧＳと指定して送信された到達保証データフレームＤ１０２は、時刻Ｔ７にノードＢで受信および転送され、時刻Ｔ８にノードＣで受信される。ノードＣは、到達保証データフレームＤ１０２に対するＡＣＫである到達保証ＡＣＫフレームＧ１０２を、データＤ１０２の送信元であるノードＡをＧＤ、自分自身をＧＳとして送信する。この到達保証ＡＣＫフレームＧ１０２は、時刻Ｔ９にノードＢで受信および転送され、時刻Ｔ１０にノードＡで受信される。これにより、ノードＡは、到達保証データフレームＤ１０２もノードＣに到達したことを認識できる。
【００２４】
本実施形態においては、ノードＡからノードＣに送信された到達保証データフレームＤ１０１やＤ１０２に対して、それらに対するＡＣＫである到達保証ＡＣＫフレームＧ１０１やＧ１０２が、ノードＡに返送されるように、以下のような制御が行われる。
【００２５】
送信元ノードであるＧＳは、到達保証データフレームに、到達保証ＩＤを指定して送信する。ＧＳは、到達保証ＡＣＫの値を一意である限り任意に指定できる。
各ノードＡ，Ｂ，Ｃは、到達保証転送記録テーブル１１５Ａ，１１５Ｂ，１１５Ｃをそれぞれ保持する。図１Ｂは、図１Ａの到達保証転送記録テーブル１１５Ａ，１１５Ｂ，１１５Ｃの例を示す図である。
【００２６】
ＧＳであるノードＡは、時刻Ｔ１およびＴ６に到達保証データフレームＤ１０１およびＤ１０２を送信すると、各到達保証データフレームに関する情報を到達保証転送記録テーブル１１５Ａに記録する。これらの情報の各エントリは、図１Ｂに示される到達保証転送記録テーブル１１５Ａ中のイベント時刻フィールドの値がＴ１およびＴ６の各行である。また、ノードＡは、時刻Ｔ５およびＴ１０にノードＢから到達保証ＡＣＫフレームＧ１０１およびＧ１０２を初めて受信すると、各到達保証ＡＣＫフレームに関する情報を到達保証転送記録テーブル１１５Ａに記録する。これらの情報の各エントリは、図１Ｂに示される到達保証転送記録テーブル１１５Ａ中のイベント時刻フィールドの値がＴ５およびＴ１０の各行である。
【００２７】
ノードＢは、時刻Ｔ２およびＴ７に到達保証データフレームＤ１０１およびＤ１０２を初めて受信すると、各到達保証データフレームに関する情報を到達保証転送記録テーブル１１５Ｂに記録する。これらの情報の各エントリは、図１Ｂに示される到達保証転送記録テーブル１１５Ｂ中のイベント時刻フィールドの値がＴ２およびＴ７の各行である。また、ノードＢは、時刻Ｔ４およびＴ９にノードＣから到達保証ＡＣＫフレームＧ１０１およびＧ１０２を初めて受信すると、各到達保証ＡＣＫフレームに関する情報を到達保証転送記録テーブル１１５Ｂに記録する。これらの情報の各エントリは、図１Ｂに示される到達保証転送記録テーブル１１５Ｂ中のイベント時刻フィールドの値がＴ４およびＴ９の各行である。
【００２８】
ＧＤであるノードＣは、時刻Ｔ３およびＴ８に到達保証データフレームＤ１０１およびＤ１０２を初めて受信すると、各到達保証データフレームに関する情報を到達保証転送記録テーブル１１５Ｃに記録する。これらの情報の各エントリは、図１Ｂに示される到達保証転送記録テーブル１１５Ｂ中のイベント時刻フィールドの値がＴ３およびＴ８の各行である。
【００２９】
到達保証転送記録テーブル１１５Ａ〜Ｃの情報において、イベント時刻フィールドには、到達保証データフレームまたは到達保証ＡＣＫフレームの処理契機に対応する時刻値が記録される。図１Ａの例では、各時刻値Ｔ１〜Ｔ１０が記録される。
【００３０】
到達保証ＩＤフィールドには、受信または送信された到達保証データフレームまたは到達保証ＡＣＫフレーム中の到達保証ヘッダに格納されている到達保証ＩＤが記録される。
送信元のＧＳは、各ノードが各到達保証データフレームをＧＳと到達保証ＩＤ（とポート番号）によって一意に識別できるように、自らが送信する到達保証データフレームに、到達保証ＩＤを任意に指定する。ただし、ＧＳは、一度送信されたフレームを再送するときには、同じ到達保証ＩＤを付与する。図１Ｂの例では、ノードＡは、イベント時刻＝Ｔ１，Ｔ２，Ｔ３で処理される到達保証データフレームＤ１０１には、到達保証ＩＤ＝１を付与する。また、ノードＡは、イベント時刻＝Ｔ６，Ｔ７，Ｔ８で処理される到達保証データフレームＤ１０２には、到達保証ＩＤ＝２を付与する。またＧＳが、例えば１つの大きなデータを複数の到達保証データフレームに分割して送信するときに、それらの一連のまとまりのフレーム群に対して、到達保証ＩＤとして、例えばシーケンシャルな番号を順次付与する。
【００３１】
一方、宛先のＧＤは、自らが送信する到達保証ＡＣＫフレームに、そのＡＣＫに対応する受信された到達保証データフレームに設定されている到達保証ＩＤを付与する。これも、各ノードが、各到達保証ＡＣＫフレームを、ＧＳと到達保証ＩＤ（とポート番号）によって一意に識別できるようにするためである。図１Ｂの例では、ノードＡは、イベント時刻＝Ｔ４，Ｔ５で処理される到達保証データフレームＤ１０１には、到達保証ＩＤ＝１を付与する。また、ノードＡは、イベント時刻＝Ｔ９，Ｔ１０で処理される到達保証データフレームＤ１０２には、到達保証ＩＤ＝２を付与する。
【００３２】
ポート番号フィールドには、受信または送信された到達保証データフレームまたは到達保証ＡＣＫフレーム中の到達保証ヘッダに格納されているポート番号が記録される。ポート番号は、送信元のＧＳが任意に指定する。ポート番号は、ＧＳが、アプリケーションの処理の種別を指定するために使用することができる。またＧＳが、例えば１つの大きなデータを複数の到達保証データフレームに分割して送信するときに、それらの一連のまとまりのフレーム群に対して、ポート番号として、同一の番号を付与する。図１Ｂの例では、全ての到達保証転送記録テーブル１１５Ａ〜Ｃの全てのエントリにおいて、ポート番号＝１が記録されている。すなわち、ここで転送されるデータフレームは全て、ＧＳであるノードＡで、同じデータから分割されたデータフレームであることを示している。
【００３３】
スタートフラグフィールドには、送信される到達保証データフレームが、上記一連のまとまりのフレーム群の先頭フレームであるときに、スタートフラグ＝１が記録される。このスタートフラグは、送信される到達保証データフレーム中の到達保証ヘッダに格納されて伝送される。終了フラグフィールドには、送信される到達保証データフレームが、上記一連のまとまりのフレーム群の末尾フレームであるときに、終了フラグ＝１が記録される。この終了フラグは、送信される到達保証データフレーム中の到達保証ヘッダに格納されて伝送される。送信される到達保証データフレームが、上記一連のまとまりのフレーム群の先頭でも末尾でもないフレームであるときには、スタートフラグフィールドにはスタートフラグ＝０が、終了フラグフィールドには終了フラグ＝０が記録される。なお、到達保証ＡＣＫフレームに対応する到達保証転送記録テーブル１１５のエントリでは、スタートフラグフィールドおよびエンドフラグフィールドの値は意味をなさない（図中「−」と表記）。スタートフラグおよびエンドフラグは、送信元のＧＳが、送信する各到達保証データフレームに付与する。図１Ｂの例では、ノードＡは、イベント時刻＝Ｔ１，Ｔ２で処理される到達保証データフレームＤ１０１には、スタートフラグ＝１（終了フラグ＝０）を付与する。また、ノードＡは、イベント時刻＝Ｔ６，Ｔ７で処理される到達保証データフレームＤ１０２には、終了フラグ＝１（スタートフラグ＝０）を付与する。
【００３４】
ＧＳフィールドには、送信される到達保証データフレームまたは到達保証ＡＣＫフレームのデータフレームヘッダに格納されている、そのフレームを最初に送信したノードのノードＩＤであるＧＳが格納される。図１Ｂの例では、全ての到達保証転送記録テーブル１１５Ａ〜Ｃの全てのエントリにおいて、ノードＡのノードＩＤ（図中では「ノードＡ」と表記）が記録されている。すなわち、到達保証転送記録テーブル１１５Ａ〜Ｃの全てのエントリに対応するフレームデータは、ノードＡから送信された到達保証データフレームに対応するものであることが示されている。
【００３５】
ＬＳ（Local Source）フィールドには、そのエントリを生成した到達保証データフレームまたは到達保証ＡＣＫフレームのアドホックヘッダに格納されている、そのフレームを送信した直前の隣接ノードのノードＩＤであるＬＳが格納される。図１Ｂの例では、ノードＢが保持する到達保証転送記録テーブル１１５Ｂにおいて、イベント時刻＝Ｔ２，Ｔ７の各エントリのＬＳフィールドには、ノードＡのノードＩＤ（図中では「ノードＡ」と表記）が記録されている。すなわち、イベント時刻＝Ｔ２，Ｔ７の各エントリに対応する到達保証データフレームＤ１０１およびＤ１０２は、ノードＡが送信したものであることが示されている。また、同じくノードＢが保持する到達保証転送記録テーブル１１５Ｂにおいて、イベント時刻＝Ｔ４，Ｔ９の各エントリのＬＳフィールドには、ノードＣのノードＩＤ（図中では「ノードＣ」と表記）が記録されている。すなわち、イベント時刻＝Ｔ４，Ｔ９の各エントリに対応する到達保証ＡＣＫフレームＧ１０１およびＧ１０２は、ノードＣが送信したものであることが示されている。さらに、ノードＡとＣが保持する到達保証転送記録テーブル１１５Ａと１１５Ｃにおいて、イベント時刻＝Ｔ５，Ｔ１０，Ｔ３，Ｔ８の各エントリのＬＳフィールドには、ノードＢのノードＩＤ（図中では「ノードＢ」と表記）が記録されている。すなわち、イベント時刻＝Ｔ５，Ｔ１０，Ｔ３，Ｔ８の各エントリに対応する到達保証ＡＣＫフレームＧ１０１およびＧ１０２と到達保証データフレームＤ１０１およびＤ１０２は、ノードＢが送信したものであることが示されている。
【００３６】
到達保証転送情報フィールドには、自ノードが到達保証データフレームを送信した場合またはそれに対応する到達保証ＡＣＫフレームを受信した場合には「送信元」（またはそれを示す値）が記録される。自ノードが到達保証データフレームを受信して他ノードへ転送した場合には「あり」（またはそれを示す値）が記録される。自ノードが到達保証ＡＣＫフレームを受信または送信した場合には「なし」（またはそれを示す値）が記録される。
【００３７】
到達保証ＡＣＫ受信情報フィールドには、自ノードが到達保証ＡＣＫフレームを送信した場合には「ＡＣＫ送信元」（またはそれを示す値）が記録される。自ノードが到達保証ＡＣＫフレームを受信して他ノードへ転送した場合には「あり」（またはそれを示す値）が記録される。自ノードが到達保証データフレームを受信または送信した場合には「なし」（またはそれを示す値）が記録される。
【００３８】
図１Ｂの例では、ＧＳであるノードＡが保持する到達保証転送記録テーブル１１５Ａの全てのエントリの到達保証転送情報フィールドには「送信元」が記録される。同じく到達保証転送記録テーブル１１５Ａのイベント時刻＝Ｔ１，Ｔ６に対応するエントリの到達保証ＡＣＫ受信情報フィールドには、「なし」が記録される。即ち、イベント時刻＝Ｔ１，Ｔ６において、ノードＡは、到達保証転送情報フィールドの「送信元」と到達保証ＡＣＫ受信情報フィールドの「なし」とによって、到達保証データフレームを送信したことが示されている。また、同じく到達保証転送記録テーブル１１５Ａのイベント時刻＝Ｔ５，Ｔ１０に対応するエントリの到達保証ＡＣＫ受信情報フィールドには、「あり」が記録される。即ち、イベント時刻＝Ｔ５，Ｔ１０において、ノードＡは、到達保証転送情報フィールドの「送信元」と到達保証ＡＣＫ受信情報フィールドの「あり」とによって、到達保証ＡＣＫフレームを受信したことが示されている。
【００３９】
また、ノードＢが保持する到達保証転送記録テーブル１１５Ｂにおいて、イベント時刻＝Ｔ２，Ｔ７に対応するエントリの、到達保証転送情報フィールドには「あり」が記録され、到達保証ＡＣＫ受信情報には「なし」が記録される。すなわち、イベント時刻＝Ｔ２，Ｔ７において、ノードＢは、到達保証データフレームを受信して他ノードに転送したことが示されている。また、ノードＢが保持する到達保証転送記録テーブル１１５Ｂにおいて、イベント時刻＝Ｔ４，Ｔ９に対応するエントリの、到達保証ＡＣＫ受信情報には「あり」が記録され、到達保証転送情報フィールドには「なし」が記録される。すなわち、イベント時刻＝Ｔ４，Ｔ９において、ノードＢは、到達保証ＡＣＫフレームを受信して他ノードに転送したことが示されている。
【００４０】
図１Ｂに示される到達保証転送記録テーブル１１５Ａ〜Ｃの例によって、図１Ａにおいて、下記のような制御が実現される。まず、時刻Ｔ１にノードＡから到達保証データフレームＤ１０１が送信されたときに、到達保証転送記録テーブル１１５Ａのイベント時刻＝Ｔ１を含むエントリが生成される。このフレームは、ノードＡが隣接ノード中から選択したノードＢに転送され、時刻Ｔ２にノードＢで受信される。この結果、到達保証転送記録テーブル１１５Ｂのイベント時刻＝Ｔ２を含むエントリが生成される。
【００４１】
時刻Ｔ２にノードＢで受信された到達保証データフレームＤ１０１は、ノードＢが隣接ノード中から選択したノードＣに転送され、時刻Ｔ３にノードＣで受信される。この結果、到達保証転送記録テーブル１１５Ｂのイベント時刻＝Ｔ２を含むエントリが生成される。到達保証転送記録テーブル１１５Ｃのイベント時刻＝Ｔ３を含むエントリが生成される。
【００４２】
時刻Ｔ３に到達保証データフレームＤ１０１を受信したノードＣは、Ｄ１０１のＧＳとして指定されているノードＡをＧＤ、自分自身をＧＳと指定して、到達保証ＡＣＫフレームＧ１０１を送信する。この到達保証ＡＣＫフレームＧ１０１は、ノードＣがデータＤ１０１から抽出した隣接送信元ノードＢに転送され、時刻Ｔ４にノードＢで受信される。この結果、到達保証転送記録テーブル１１５Ｂのイベント時刻＝Ｔ４を含むエントリが生成される。
【００４３】
時刻Ｔ４にノードＢで受信された到達保証ＡＣＫフレームＧ１０１は、ノードＢが隣接ノード中から選択したノードＡに転送され、時刻Ｔ５にノードＡで受信される。この結果、到達保証転送記録テーブル１１５Ａのイベント時刻＝Ｔ５を含むエントリが生成される。これにより、ノードＡは、到達保証データフレームＤ１０１がノードＣに到達したことを認識できる。
【００４４】
到達保証データフレームＤ１０１および到達保証ＡＣＫフレームＧ１０２に関する時刻Ｔ６〜Ｔ１０の処理についても、上記と同様であり、それぞれに対応するエントリが各到達保証転送記録テーブル１１５Ａ〜Ｃに生成される。
【００４５】
図２Ａは、本実施形態による再送制御処理の例２を示す図である。また、図２Ｂは、図２Ａの各ノードＡ，Ｂ，Ｃが保有する到達保証転送記録テーブル１１５Ａ，１１５Ｂ，１１５Ｃの例を示す図である。図２Ｂに示される各到達保証転送記録テーブル１１５Ａ〜Ｃの意味は、図１Ｂの場合と同じであるため、個々の値等の説明は省略する。
【００４６】
図２Ａでは、時刻Ｔ１１にノードＡから送信された到達保証データフレームＤ１１１が、時刻Ｔ１２にノードＢで受信・転送され、時刻Ｔ１３にノードＣで受信される場合が示されている。
【００４７】
ノードＣは、時刻Ｔ１３以後、到達保証データフレームＤ１１１に対応する到達保証ＡＣＫフレームＧ１１１を返送するが、フェージング等の影響によりノードＣからノードＢに向かう無線リンクの品質が悪化し、到達保証ＡＣＫフレームＧ１１１がノードＢに到達しなかったとする。この場合、ノードＢが到達保証ＡＣＫフレームＧ１１１を受信することができず、さらにノードＡも受信できない。この結果、ノードＡにおいて、時刻Ｔ１４で、再送のためのタイムアウトが発生し、ノードＡは、到達保証データフレームＤ１１１を再送する。この再送フレームは、時刻Ｔ１５にノードＢで受信される。
【００４８】
ノードＢは、受信された到達保証データフレームＤ１１１から、ＧＳとポート番号と到達保証ＩＤを抽出し、これらの値の組をキーとして図２Ｂの到達保証転送記録テーブル１１５Ｂを検索する。この結果、イベント時刻＝Ｔ１２のエントリ（時刻Ｔ１５のエントリはまだ生成されていない）が参照される。そして、このエントリから、到達保証転送情報＝「あり」で、かつ到達保証ＡＣＫ受信情報＝「なし」が検出される。これにより、すでに到達保証データフレームＤ１１１が転送されているが、それに対応する到達保証ＡＣＫフレームが未だ受信されていないことがわかる。これを受けてノードＢは、今回の時刻Ｔ１５に受信した到達保証データフレームＤ１１１の再送フレームを、再度次のノードＣに転送する。
【００４９】
この結果、到達保証データフレームの再送フレームがノードＢからノードＣに転送され、時刻Ｔ１６にノードＣで受信される。
ノードＣは、時刻Ｔ１６以後、再送フレームＤ１１１に対応する到達保証ＡＣＫフレームＧ１１１を再度返送するが、今度はノードＣからノードＢに向かう無線リンクの品質が回復し、到達保証ＡＣＫフレームＧ１１１がノードＢに到達したとする。
【００５０】
この結果、ノードＢは、到達保証転送記録テーブル１１５Ｂにおいて、イベント時刻＝Ｔ１７に対応するエントリを生成の後、その再送された到達保証ＡＣＫフレームをノードＡに転送する。この再送された到達保証ＡＣＫフレームは、時刻Ｔ１８にノードＡで受信される。
【００５１】
この結果、ノードＡは、到達保証転送記録テーブル１１５Ａにおいて、イベント時刻＝Ｔ１８に対応するエントリを生成し、再送した到達保証データフレームＤ１１１がＧＤであるノードＣに到達したことを認識できる。
【００５２】
図３Ａは、本実施形態による再送制御処理の例３を示す図である。また、図３Ｂは、図３Ａの各ノードＡ，Ｂ，Ｃが保有する到達保証転送記録テーブル１１５Ａ，１１５Ｂ，１１５Ｃの例を示す図である。図３Ｂに示される各到達保証転送記録テーブル１１５Ａ〜Ｃの意味は、図１Ｂの場合と同じであるため、個々の値等の説明は省略する。
【００５３】
図３Ａでは、時刻Ｔ２１にノードＡから送信された到達保証データフレームＤ１２１が、時刻Ｔ２２にノードＢで受信・転送され、時刻Ｔ２３にノードＣで受信される場合が示されている。
【００５４】
ノードＣは、時刻Ｔ２３以後、到達保証データフレームＤ１２１に対応する到達保証ＡＣＫフレームＧ１２１を返送し、そのフレームが時刻Ｔ２４にノードＢで受信される。
ノードＢは、到達保証転送記録テーブル１１５Ｂにおいて、イベント時刻＝Ｔ２４に対応するエントリを生成の後、その到達保証ＡＣＫフレームＧ１２１をノードＡに向けて転送する。ところが、フェージング等の影響によりノードＢからノードＡに向かう無線リンクの品質が悪化し、到達保証ＡＣＫフレームＧ１２１がノードＡに到達しなかったとする。
【００５５】
この場合、ノードＡが到達保証ＡＣＫフレームＧ１２１を受信することができない。この結果、ノードＡにおいて、時刻Ｔ２５で、再送のためのタイムアウトが発生し、ノードＡは、到達保証データフレームＤ１２１を再送する。ノードＡからノードＢに向かう無線リンクは悪化しておらず、上述の再送フレームは、時刻Ｔ２６にノードＢで受信されるとする。
【００５６】
ノードＢは、再送された到達保証データフレームＤ１２１から、ＧＳとポート番号と到達保証ＩＤを抽出し、これらの値の組をキーとして図３Ｂの到達保証転送記録テーブル１１５Ｂ上で最新のエントリを検索する。この結果、イベント時刻＝Ｔ２４のエントリ（時刻Ｔ２２はＴ２４より古く、時刻Ｔ２６のエントリはまだ生成されていない）が参照される。そして、このエントリから、到達保証転送情報＝「なし」で、かつ到達保証ＡＣＫ受信情報＝「あり」が検出される。これにより、到達保証データフレームＤ１２１がノードＣに転送されノードＣから到達保証ＡＣＫフレームＧ１２１も受信されて、自身も到達保証ＡＣＫフレームＧ１２１をノードＡに送信していることがわかる。すなわち、到達保証データフレームＤ１２１はノードＣで正常に受信されたが、それに対応する到達保証ＡＣＫフレームＧ１２１がノードＢからノードＡに届いていないということがわかる。
【００５７】
この場合には、ノードＢは、今回の時刻Ｔ２６に受信した到達保証データフレームＤ１２１の再送フレームは、ノードＣには転送せず、代わりに、到達保証ＡＣＫフレームＧ１２１を、ノードＡに再送する。
【００５８】
この場合、今度は（あるいは何回かのリトライの後）、ノードＢからノードＡに向かう無線リンクの品質が回復し、到達保証ＡＣＫフレームＧ１２１がノードＡに到達したとする。この結果、ノードＡは、到達保証転送記録テーブル１１５Ａにおいて、イベント時刻＝Ｔ２７に対応するエントリを生成し、到達保証データフレームＤ１２１がＧＤであるノードＣに到達したことを認識できる。
【００５９】
以上のようにして、本実施形態では、マルチホップを前提とした無線アドホックネットワークにおいて、ＧＤからＧＳへ到達保証ＡＣＫフレームによる到達通知を実現することが可能となる。各ノードからデータを収集するだけでなく、各宛先ノードへ制御情報を送信する場合やファームウェアの更新を行なう場合、データが宛先ノードに正確に到達したかを確認することができる。また、無線アドホックネットワークでデータサイズの大きな動画などを転送することもより容易となる。
【００６０】
また、アドホックネットワークにおいて宛先ノードに到達したことを確認しようとするときネットワークに輻輳が発生することを抑制できる。また、到達保証ＡＣＫフレーム自体の転送が途中で失敗した場合でも、再送によるトラフィック増加の影響を、到達保証ＡＣＫフレームの転送が失敗したノードまでに留めることが可能となる。これにより、ネットワークの輻輳をさらに抑制できる。このような実現により、例えばファームウェアデータの配信や各種制御情報の配信等において、信頼性の高いデータ伝送を実現することが可能となる。
【００６１】
図４は、本実施形態が適用されるネットワーク構成の第１の例を示す図である。図４のネットワーク１は、以下の本実施形態を適用することが可能な無線アドホックネットワークの一例であり、複数のノード装置を含む。なお、以下では、ネットワークトポロジの観点からの説明においては、「ノード装置」を単に「ノード」ということもある。
【００６２】
ネットワーク１内の各ノード装置には、ネットワーク１内で一意な識別情報（以下、「ノードＩＤ（identification）」という）が予め割り当てられている。以下では、参照符号「Ｎｉ」がノードＩＤを示すものとし、例えば、ノードＩＤとしてＮｉが割り当てられたノード装置を「ノード装置Ｎｉ」のように参照する。なお、以下では、ノード装置Ｎｉにとって自分自身に割り当てられたノードＩＤであるＮｉを、ノード装置Ｎｉの「自ノードＩＤ」ともいう（図４では１≦ｉ≦７）。
【００６３】
また、図４ではリンクを実線で表している。具体的には、ネットワーク１のトポロジは次のとおりである。すなわち、ノード装置Ｎ１とＮ２の間、ノード装置Ｎ２とＮ３の間、ノード装置Ｎ２とＮ６の間、ノード装置Ｎ３とＮ４の間、ノード装置Ｎ３とＮ５の間、ノード装置Ｎ４とＮ５の間、ノード装置Ｎ４とＮ７の間、およびノード装置Ｎ６とＮ７の間に、各々リンクが存在する。
【００６４】
なお、以下で「リンク」とは、無線リンクをいう。なお、有線リンクが混在してもよい。ノード装置ＮｉとＮｊが、他のノード装置Ｎｋによる中継を経ずに直接、無線により情報を通信しあうことができるとき、「ノード装置ＮｉとＮｊの間に無線リンクが存在する」という（図４では１≦ｉ，ｊ，ｋ≦７）。また、ノード装置ＮｉとＮｊの間が直接ケーブルで接続されており、ノード装置ＮｉとＮｊがケーブルを介して情報を通信しあうことができるとき、「ノード装置ＮｉとＮｊの間に有線リンクが存在する」という。
【００６５】
また、ノード装置ＮｉとＮｊの間に無線リンクが存在するとき、「ノード装置ＮｉとＮｊは互いに隣接している」という。換言すれば、ノード装置Ｎｉにとってノード装置Ｎｊは隣接ノード装置であり、ノード装置Ｎｊにとってノード装置Ｎｉは隣接ノード装置である。
【００６６】
なお、図４のネットワーク１には、新たなノード装置が追加されることもありうるし、ノード装置Ｎ１〜Ｎ７のいずれかが撤去されてネットワーク１からは消滅することもありうる。また、リンクは固定的ではなく、動的に変化しうる。
【００６７】
例えば、天候や遮蔽物などの影響で、ノード装置ＮｉとＮｊの間に無線リンクが新たに確立されたり、今まで確立されていた無線リンクが消滅したりすることがある。ノード装置が可動式であれば、ノード装置間の距離の変動によってリンクの有無が変化することもある。
【００６８】
以下に説明する本実施形態によれば、このようにノードやリンクが動的に変化する環境においても、データが送信される時点でのネットワーク１の状況に応じて、利用可能で適切な経路が動的に見出されて選択されながら、データの送信が行われる。しかも、動的に変化するネットワーク１全体のトポロジを各ノード装置Ｎ１〜Ｎ７が認識する必要なしに、動的なトポロジの変化に応じた経路選択が自律分散的に実現される。
【００６９】
ところで、詳しくは図１０とともに後述するが、以下ではノード装置間で送受信されるＰＤＵを「フレーム」と称する。ネットワーク１内でのデータの送受信はフレームを用いて行われるが、フレームの送信元のノード装置は前述したようにＧＳであり、フレームの宛先のノード装置は前述したようにＧＤである。
【００７０】
例えば、ノード装置Ｎ１がＧＳでノード装置Ｎ７がＧＤの場合、ネットワーク１においてノード装置Ｎ１とＮ７は隣接していないので、他のノード装置によってフレームが中継され、その結果として、フレームはノード装置Ｎ７に到達する。例えば、フレームは、ノード装置Ｎ１からノード装置Ｎ２へ送信され、ノード装置Ｎ２からノード装置Ｎ６へ送信され、ノード装置Ｎ６からノード装置Ｎ７へ送信されるかもしれない。以下では経路を、〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉のようなタプル（tuple）で表す。
【００７１】
経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉の例において、例えばノード装置Ｎ１からノード装置Ｎ２へフレームが送信されるとき、フレームの最終的な宛先は、ＧＤであるノード装置Ｎ７だが、フレームの直接的な宛先は、ノード装置Ｎ１に隣接するノード装置Ｎ２である。以下では、このように互いに隣接する２つのノード装置間でのフレームの送信において、フレームの送信元のノード装置を「ＬＳ（Local Source）」といい、フレームの宛先のノード装置を「ＬＤ（Local Destination）」という。例えば、上記のようにフレームがノード装置Ｎ１からノード装置Ｎ２とＮ６を経由してノード装置Ｎ７へと中継される場合のＬＳとＬＤは次のとおりである。
【００７２】
ＧＳでもあるノード装置Ｎ１から、ノード装置Ｎ１に隣接するノード装置Ｎ２へと、最初にフレームが送信されるとき、ＬＳはノード装置Ｎ１であり、ＬＤはノード装置Ｎ２である。続いて、ノード装置Ｎ２から、ノード装置Ｎ２に隣接するノード装置Ｎ６へと、フレームが送信されるとき、ＬＳはノード装置Ｎ２であり、ＬＤはノード装置Ｎ６である。そして、ノード装置Ｎ６から、ノード装置Ｎ６に隣接しておりＧＤでもあるノード装置Ｎ７へとフレームが送信されるとき、ＬＳはノード装置Ｎ６であり、ＬＤはノード装置Ｎ７である。
【００７３】
なお、ネットワーク１内の１つまたは複数のノード装置が、ネットワーク１とは別のネットワーク（以下「外部ネットワーク」という）に属する不図示のネットワーク機器と接続されていてもよい。
【００７４】
例えば、データ管理サーバを含む外部ネットワークのゲートウェイ装置に、有線リンクまたは無線リンクによってノード装置Ｎ７が接続されていてもよい。そして、ノード装置Ｎ７がＧＤとして指定されてネットワーク１内で送信されるデータは、ノード装置Ｎ７からゲートウェイ装置を介してデータ管理サーバに送信され、データ管理サーバで管理されてもよい。
【００７５】
続いて、図５を参照して他のネットワークの例について説明する。図５は、ネットワーク構成の第２の例を示す図である。図５のネットワーク２も、以下の本実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。また、図４のネットワーク１と同様に、ネットワーク２も、不図示の外部ネットワークと接続されていてもよい。
【００７６】
ネットワーク２はノード装置Ｎ１０１〜Ｎ１２０を含む。図５は、ノード装置Ｎ１０１〜Ｎ１２０のうち、１つのノード装置Ｎ１０５に注目して表現した図である。すなわち、太い実線の丸で示したノード装置Ｎ１０５は、直接通信することが可能な、隣接する３つのノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２の存在とノードＩＤさえ認識していればよく、ネットワーク２全体のトポロジを認識する必要はない。ノード装置Ｎ１０５は、ネットワーク２のトポロジどころか、ネットワーク２内に存在するノード装置の個数を認識する必要もないし、ノード装置Ｎ１０５に隣接していないノード装置のノードＩＤを予め知っている必要もない。
【００７７】
図５では、ノード装置Ｎ１０５が認識する部分を実線で表し、ノード装置Ｎ１０５が認識する必要のない部分を破線で表してある。すなわち、図５では、ノード装置Ｎ１０５から見てホップ数１以内の範囲に存在する以下のものだけが、実線で示してある。
・ノード装置Ｎ１０５自身
・ノード装置Ｎ１０５に隣接する３つのノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２
・ノード装置Ｎ１０５を３つの隣接ノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２にそれぞれ接続する３本のリンク
【００７８】
以下に説明する本実施形態によれば、ネットワーク内の各ノード装置は、上記のノード装置Ｎ１０５のように、隣接ノード装置さえ認識していればよい。したがって、ネットワークの規模が増大しても「各ノード装置がネットワークトポロジを認識するために制御情報の通信を行い、制御情報の通信のせいでネットワークの負荷が高まり、通信システム全体としての性能が悪化する」といった事態に陥ることはない。
【００７９】
以下では具体的に、図４のネットワーク１や図５のネットワーク２など任意のトポロジを有するネットワークに適用可能な実施形態について説明する。
本実施形態に関しては、まず、図６と図７を参照してノード装置の構成を説明し、図８を参照してノード装置の動作の概要を説明する。そして、「各ノード装置が自律分散的に図８のように振る舞うことで、図４のネットワーク１全体ではどのようにして動的な経路選択が実現されるのか」ということについて、図９を参照して概要を説明する。
【００８０】
その後、図１０を参照してフレームの例を説明し、図１１〜図１８を参照して各ノード装置が記憶する各種情報の例を説明し、図１９〜図３８を参照して各ノード装置が行う処理の詳細を説明する。そして、図１０〜図３８の詳細を踏まえて、再度、ネットワーク１全体としての振る舞いについて、図３９〜図４１Ｄを参照して説明する。
【００８１】
さて、図６は、本実施形態におけるノード装置の構成を示す機能ブロック図である。図１または図５の各ノード装置は、具体的には、例えば図６に示されるノード装置１００である。
【００８２】
ノード装置１００は、フレームを受信する受信部１０１と、フレームを送信する送信部１０２を備える。また、ノード装置１００は、フレームの送信のために用いる各種情報を格納するため、隣接ノード管理テーブル１０３、重み付けテーブル１０４、およびＦＩＤ（Frame IDentification）管理テーブル１０５を備える。
【００８３】
ノード装置１００はさらに、受信部１０１が受信したフレームの種類を判別するフレーム分岐処理部１０６を備える。詳しい形式は図１０とともに後述するが、本実施形態では、「データフレーム」、「ハローフレーム」、および「ＡＣＫ（ACKnowledgment）フレーム」という少なくとも３種類のフレームが使われる。
【００８４】
ノード装置１００は、ＡＣＫフレームに関する処理を行うＡＣＫ処理部１０７と、ハローフレームの受信に応じて処理を行うリンク管理部１０８を備える。また、ノード装置１００は、データフレームの受信に応じた処理を行うために、バッファ部１０９とデータフレーム処理部１１０を備えている。ノード装置１００はさらに、上位層処理部１１１、ハローフレーム生成部１１２、およびＦＩＤ生成部１１３も備えている。
【００８５】
加えて、ノード装置１００は、前述した到達保証データフレームと到達保証ＡＣＫフレームの送信および受信を処理する到達保証ＡＣＫ処理部１１４と、前述した到達保証転送記録テーブル１１５を備える。また、複数に分割された到達保証データフレームから元の送信データを組み立てるための組立バッファ１１６と、到達保証ＡＣＫ制御によって再送されるべき到達保証データフレームを一時保持する再送信バッファ１１７を備える。  ノード装置１００の各部は以下のように動作する。
【００８６】
受信部１０１がフレームを受信し、受信したフレームをフレーム分岐処理部１０６に出力する。すると、フレーム分岐処理部１０６がフレームの種別を判別する。
ハローフレームが受信された場合、フレーム分岐処理部１０６は、受信されたハローフレームをリンク管理部１０８に出力する。リンク管理部１０８は、隣接ノード管理テーブル１０３を管理しており、さらに、重み付けテーブル１０４の管理にも関与している。
【００８７】
ここで、ハローフレームは、制御情報を通信するための制御フレームの一種であり、具体的には、ノード装置１００が自分自身の存在を他のノード装置に通知するためのフレームである。よって、詳しくは図２０とともに後述するとおり、リンク管理部１０８は、ハローフレームの受信を契機として隣接ノード装置の存在を認識し、認識結果を隣接ノード管理テーブル１０３に反映させる。すなわち、隣接ノード管理テーブル１０３は、ノード装置１００に隣接する他のノード装置を、ノード装置１００が記憶しておくためのテーブルである。
【００８８】
なお、ネットワークの状況は動的に変化しうるので、場合によっては、今まで隣接ノード装置としてリンク管理部１０８に認識されていた他のノード装置が、隣接ノード装置として認識不能となるかもしれない。よって、詳しくは図２２とともに後述するとおり、リンク管理部１０８は、隣接ノード装置として認識不能となったノード装置に関するエントリを隣接ノード管理テーブル１０３から削除するためのエージング処理も行う。
【００８９】
また、本実施形態においてリンク管理部１０８は、隣接ノード装置の変化にともなって重み付けテーブル１０４の追加、削除、あるいは更新を行う。
ここで、重み付けテーブル１０４は、フレームをどの隣接ノード装置に送信するかを決定するための情報をＧＤごとに管理するためのテーブルである。図６にはＭ個のＧＤそれぞれに対応して設けられた重み付けテーブル１０４−１〜１０４−Ｍが示されている。本明細書において「重み付けテーブル１０４」とは、重み付けテーブル１０４−１〜１０４−Ｍの総称である。また、ノード装置１００の運用が開始される時点では、重み付けテーブル１０４は存在せず、Ｍ＝０である。
【００９０】
具体的には、重み付けテーブル１０４は、「最終的にフレームをＧＤに到達させるためには、ノード装置１００自身はどの隣接ノード装置をＬＤとして選択することができるか」ということをＧＤごとに管理している。換言すれば、重み付けテーブル１０４は、フレームのＧＤごとに、ノード装置１００に隣接する１つ以上のノード装置に関して、ＬＤとして選択する際の優先度を、重みとして表して保持している。
【００９１】
別の観点から言えば、ある隣接ノード装置が「ＬＤとして選択可能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信可能」であることを意味する。また、ある隣接ノード装置が「ＬＤとして選択不能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信不能」であることを意味し、当該隣接ノード装置の優先度が、「送信不能」に対応する所定の最低優先度であることを意味する。
【００９２】
したがって、ネットワークの状況の変化に応じてノード装置１００の隣接ノード装置が変化すると、リンク管理部１０８は、詳しくは図２０および図２２とともに後述するとおり、隣接ノード装置の変化に応じて重み付けテーブル１０４を追加、更新、または削除する。
【００９３】
また、ＡＣＫフレームが受信された場合、フレーム分岐処理部１０６は、受信されたＡＣＫフレームをＡＣＫ処理部１０７に出力する。ここで、ＡＣＫフレームは、制御フレームの一種であり、ノード装置１００が送信したデータフレームのＬＤであるノード装置から、ノード装置１００に、データフレームの受信を通知するためのフレームである。
【００９４】
したがって、ＡＣＫフレームの受信は、データフレームの送信が成功したことを意味し、所定の時間が経過してもＡＣＫフレームが受信されずにタイムアウトとなることは、データフレームの送信に失敗したことを意味する。ＡＣＫ処理部１０７は、後述の図３２に示すＡＣＫフレーム受信のタイムアウト監視を行う。
【００９５】
バッファ部１０９は、データフレームの送信失敗と再送に備えて、データフレームを格納している。よって、詳しくは図３２とともに後述するとおり、ＡＣＫ処理部１０７は、ＡＣＫフレームの受信を契機としてデータフレームの送信成功を認識すると、不要になったデータフレームをバッファ部１０９から削除する。また、ＡＣＫ処理部１０７はデータフレームの送信の成否をデータフレーム処理部１１０に通知する。
【００９６】
また、データフレームが受信された場合、フレーム分岐処理部１０６は、受信されたデータフレームをバッファ部１０９に格納するとともに、後述の図２５〜図２９Ｈの処理を行うようデータフレーム処理部１１０に依頼する。
【００９７】
ここで、データフレームは、ＧＳであるノード装置が、ＧＤであるノード装置に伝達しようとするデータを、ペイロードとして含むフレームである。換言すれば、本実施形態におけるフレームが定義される層よりも上位の層で定義されるプロトコルのＰＤＵが、ペイロードとしてデータフレームに含まれる。上位層処理部１１１は、ノード装置１００がＧＳまたはＧＤである場合に、データフレームにペイロードとして含まれる上位層のＰＤＵを処理する。
【００９８】
フレーム分岐処理部１０６からデータフレームの処理の依頼を受けたデータフレーム処理部１１０の動作の概要は、以下のとおりである。
データフレーム処理部１１０は、受信部１０１が受信したデータフレームに対するＡＣＫフレームの送信を送信部１０２に依頼する。また、データフレーム処理部１１０は、受信されたデータフレームのＧＤの値がノード装置１００の自ノードＩＤと等しいか否かを判断する。そして、受信されたデータフレームのＧＤの値がノード装置１００の自ノードＩＤと異なる場合、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５を参照することにより、今回の受信が下記（Ａ１）と（Ａ２）のどちらに該当するのかを判断する。
【００９９】
（Ａ１）過去にノード装置１００がＬＳとなって送信したデータフレームが、ネットワーク内を中継されているうちにノード装置１００に戻ってきて、受信部１０１で受信された。
【０１００】
（Ａ２）上記（Ａ１）以外の新たなデータフレームが受信部１０１で受信された。
データフレーム処理部１１０は、今回の受信が（Ａ２）に該当すると判断すると、重み付けテーブル１０４を参照して、受信したデータフレームを転送するためにＬＤとして指定する隣接ノード装置を選択し、データフレームの転送を送信部１０２に依頼する。
【０１０１】
他方、データフレーム処理部１１０は、今回の受信が（Ａ１）に該当すると判断すると、過去にＬＤとして選択した隣接ノード装置が、適切なＬＤではなかったと認識し、認識の結果を重み付けテーブル１０４に反映させる。そして、データフレーム処理部１１０は、重み付けテーブル１０４を参照して、ＬＤとして選択可能な隣接ノード装置が他にまだ残っているか否かを判断する。
【０１０２】
データフレーム処理部１１０は、また、ＡＣＫ処理部１０７からのデータフレーム送信成功あるいは送信失敗の通知を受け、該データフレームのＬＤとして選択した隣接ノード装置が適切か否かの認識をし、その認識結果を重み付けテーブル１０４に反映させる。
【０１０３】
なお、ノード装置１００に隣接する、あるノード装置Ｎｉが「ＬＤとして選択可能である」とは、直感的には「隣接ノード装置ＮｉをＬＤとして選択してみて、フレームが成功裡にＧＤまで到達するか否かを試してみる価値がある」という意味である。具体的には、ノード装置Ｎｉが「ＬＤとして選択可能である」とは、「下記（Ｂ１）でもなく下記（Ｂ２）でもない」という意味である。なお、「選択可能」という語の、より詳細な意味については、後述の図８に関する説明と、図２７に関する（Ｆ１）〜（Ｆ２）と（Ｇ１）〜（Ｇ４）の説明から明らかである。
【０１０４】
（Ｂ１）ノード装置１００が隣接ノード装置Ｎｉを過去にＬＤとして選択した結果、ループ等の何らかの失敗が発生したことがあり、「ノード装置ＮｉはＬＤとして不適切である」と既に判明している。
【０１０５】
（Ｂ２）今回受信部１０１が受信したデータフレームを、かつて受信部１０１が初めて受信したときのＬＳ（以下「Original Local Source」と称し、「ＯＬＳ」と略す）が、ノード装置Ｎｉであった。
【０１０６】
データフレーム処理部１１０は、もしＬＤとして選択可能な隣接ノード装置が他にまだ残っていれば、選択可能な隣接ノード装置を選んでＬＤとして指定し、データフレームの転送を送信部１０２に依頼する。逆に、ＬＤとして選択可能な隣接ノード装置がもう残っていなければ、データフレーム処理部１１０は、下記（Ｃ１）または（Ｃ２）のように動作する。
【０１０７】
（Ｃ１）今回受信したデータフレームのＧＳがノード装置１００以外である場合、データフレーム処理部１１０は、ＯＬＳへデータフレームを返送するため、ＯＬＳをＬＤとして選択し、データフレームの転送を送信部１０２に依頼する。この動作は、ＯＬＳである隣接ノード装置に「ノード装置１００をＬＤとして選択することは不適切である」と認識させるための動作であり、後述するとおり経路探索におけるバックトラックに相当する。
【０１０８】
（Ｃ２）今回受信したデータフレームのＧＳがノード装置１００自身である場合、このデータフレームを元々生成したのは上位層処理部１１１である。よって、データフレーム処理部１１０は、上位層処理部１１１に対してデータフレームの送信失敗を通知し、バッファ部１０９に格納されているデータフレームを破棄する。
【０１０９】
なお、以上のようなデータフレーム処理部１１０の動作を実現するためには、データフレーム処理部１１０は上記（Ａ１）と（Ａ２）の区別をすることが必要である。そのため本実施形態では、データフレームを一意に識別することのできるフレーム識別情報が各データフレームに含まれており、フレーム識別情報をＦＩＤ管理テーブル１０５が記憶している。
【０１１０】
本実施形態でのフレーム識別情報は、具体的には、データフレームのＧＳであるノード装置のノードＩＤと、ＦＩＤとの組み合わせである。ＦＩＤは、ある１つのノード装置がＧＳとなって送信する複数のフレームの各々を一意に識別する識別情報であり、例えば所定のビット数のシーケンス番号でもよいし、タイムスタンプでもよい。
【０１１１】
つまり、個々のノード装置は独立にＦＩＤを生成するため、異なる複数のノード装置が偶然同じＦＩＤを生成することもありうる。しかし、フレーム識別情報は、ＦＩＤ単独ではなく、データフレームのＧＳであるノード装置のノードＩＤと、ＦＩＤとの組み合わせである。そして、ノードＩＤは、上記のとおりネットワーク内でノード装置を一意に識別する情報である。したがって、たとえ異なる複数のノード装置が偶然同じＦＩＤを生成したとしても、異なるノード装置がそれぞれＧＳとなって送信したフレームは、異なるフレーム識別情報を有するので、区別可能である。
【０１１２】
なお、フレーム識別情報は、データフレームが１つ以上のノード装置を経由してネットワーク内を転送されても、データフレームを中継するノード装置によって書き換えられることはなく、したがって変化しない。データフレーム処理部１１０は、送信部１０２に送信を依頼したデータフレームのフレーム識別情報をＦＩＤ管理テーブル１０５に記録することにより、後にデータフレームがノード装置１００自身に戻ってきたとき、上記（Ａ１）に該当すると認識することができる。
【０１１３】
なお、ノード装置１００は、フレームの受信を契機としないその他の処理も行う。具体的には、ハローフレーム生成部１１２が、ＦＩＤ生成部１１３の生成するＦＩＤを利用して定期的にハローフレームを生成し、送信部１０２に出力する。すると送信部１０２がハローフレームを送信するので、ノード装置１００は、ノード装置１００自身の存在を定期的に周囲に通知することができる。
【０１１４】
また、上位層処理部１１１は任意のタイミングで、データフレームにペイロードとして含めて送信する対象のデータをデータフレーム処理部１１０に出力することができる。すると、データフレーム処理部１１０は、上位層処理部１１１の要求に応じてデータフレームを生成し、送信部１０２にデータフレームの送信を指示する。こうして、ノード装置１００は、自らＧＳとなることができる。
【０１１５】
到達保証ＡＣＫ処理部１１４は、データフレーム処理部１１０が処理する送受信データフレームのうち、到達保証データフレーム及びそれに関連する到達保証ＡＣＫフレームの処理が必要となったときに動作する。すなわち、到達保証ＡＣＫ処理部１１４は、データフレーム処理部１１０が送受信するデータフレームのうち、到達保証処理が必要なフレームデータを、データフレーム処理部１１０から引き渡される。到達保証ＡＣＫ処理部１１４は、図１Ａから図３Ｂでその概略を説明した到達保証ＡＣＫフレームによる再送制御処理を、到達保証転送記録テーブル１１５にアクセスしながら実行する。
【０１１６】
また、自ノードが到達保証データフレームのＧＤであった場合には、到達保証ＡＣＫ処理部１１４は、組立バッファ１１６を使いながら、複数に分割された到達保証データフレームから元の送信データを組み立てるための処理を実行する。
【０１１７】
また、自ノードが到達保証データフレームのＧＳであった場合には、到達保証ＡＣＫ処理部１１４は、送信した到達保証データフレームを再送信バッファ１１７に一時保持する。そして、到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの受信状況に応じて、到達保証データフレームを再送する処理を実行する。
【０１１８】
以上の到達保証ＡＣＫ処理部１１４、到達保証転送記録テーブル１１５、組立バッファ１１６、および再送信バッファ１１７からなる部分によって、ＧＳとＧＤの間のグローバルなＡＣＫである到達保証ＡＣＫによる再送制御が実現される。この再送制御処理は、ＴＣＰのようなセッションの確立を必要とする上位レイヤの処理によるものではない。
すなわち、到達保証データフレームのペイロードに格納して伝送されるデータがどのようなものであっても、無線品質が変化しやすい無線アドホックネットワークにおいて、ＧＳとＧＤの間の安定した再送制御を実現することが可能となる。さらに換言すれば、セッションの確立を必要としないようなデータであっても、従来困難であった再送制御が実現される。
【０１１９】
図７は、本実施形態におけるノード装置のハードウェア構成を示す図である。図６のノード装置１００は、例えば図７に示す各種ハードウェアにより実現されてもよい。
図７の例では、ノード装置１００は、ＭＰＵ（MicroProcessing Unit）２０１、およびタイマＩＣ（Integrated Circuit）２０３を備える。また、ノード装置１００は、ＤＲＡＭ（Dynamic Random access Memory）２０４、フラッシュメモリ２０５、および無線モジュール２０６を備える。
【０１２０】
ＭＰＵ２０１とタイマＩＣ２０３は、Ｉ２Ｃ／ＰＩＯ（Inter-Integrated Circuit or Parallel Input/Output）バス２０８を介して接続されている。そして、ＤＲＡＭ２０４とフラッシュメモリ２０５と無線モジュール２０６は、ＰＣＩ（Peripheral Component Interconnect）バス２０９を介してＭＰＵ２０１に接続されている。
【０１２１】
ＭＰＵ２０１は、不揮発性記憶装置の一種であるフラッシュメモリ２０５に格納されたファームウェアなどのプログラムをＤＲＡＭ２０４にロードし、ＤＲＡＭ２０４をワーキングメモリとして使いながら各種処理を実行する。ＭＰＵ２０１は、プログラムを実行することで、図６のフレーム分岐処理部１０６、ＡＣＫ処理部１０７、リンク管理部１０８、データフレーム処理部１１０、上位層処理部１１１、ハローフレーム生成部１１２、ＦＩＤ生成部１１３、および到達保証ＡＣＫ処理部１１４として動作することができる。
【０１２２】
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置１００にインストールされてもよい。または、プログラムは、ネットワークから無線モジュール２０６を介してダウンロードされ、ノード装置１００にインストールされてもよい。
【０１２３】
なお、実施形態に応じて、ＤＲＡＭ２０４やフラッシュメモリ２０５以外の他の種類の記憶装置が利用されてもよい。例えば、ノード装置１００は、ＣＡＭ（Content Addressable Memory）、ＳＲＡＭ（Static Random Access Memory）、ＳＤＲＡＭ（Synchronous Dynamic Random Access Memory）などの記憶装置を有してもよい。
【０１２４】
図６の隣接ノード管理テーブル１０３、重み付けテーブル１０４、ＦＩＤ管理テーブル１０５、バッファ部１０９、到達保証転送記録テーブル１１５、組立バッファ１１６、および再送信バッファ１１７は、ＤＲＡＭ２０４、フラッシュメモリ２０５、あるいは不図示のその他の記憶装置により実現される。また、フラッシュメモリ２０５は、プログラムだけでなく、ノード装置１００のノードＩＤなど、ノード装置１００に固有の情報も記憶している。
【０１２５】
ノード装置１００は、有線接続における物理層の処理を行う回路として、不図示のＰＨＹ（PHYsical layer）チップを備えてもよい。また、ノード装置１００と外部ネットワークとの接続のために、ノード装置１００はＰＨＹチップを備えていてもよい。
【０１２６】
例えば、ノード装置１００は、イーサネット（登録商標）規格にしたがった有線ＬＡＮポートを備え、有線ＬＡＮポートに接続されたケーブルを介して外部ネットワークのゲートウェイ装置などに接続されていてもよい。
【０１２７】
その場合、ＭＰＵ２０１は、イーサネットフレームを生成し、不図示のＭＩＩ／ＭＤＩＯ（Media Independent Interface or Management Data Input/Output）を介してＰＨＹチップに出力することができる。そして、ＰＨＹチップは、ＭＰＵ２０１からの出力（すなわちイーサネットフレームを表す論理信号）を、ケーブルの種類に応じた信号（つまり電気信号または光信号）に変換し、ケーブルに出力する。こうして、ノード装置１００はＰＨＹチップを用いて外部ネットワークにデータを送信することができる。
【０１２８】
また、ＰＨＹチップは、ケーブルと有線ＬＡＮポートを介して外部ネットワークから入力される電気信号または光信号を、論理信号に変換し、ＭＩＩ／ＭＤＩＯを介してＭＰＵ２０１に出力することもできる。こうして、ノード装置１００はＰＨＹチップを用いて外部ネットワークからデータを受信することができる。
【０１２９】
無線モジュール２０６は、無線接続における物理層の処理を行うハードウェアである。無線モジュール２０６は、例えば、アンテナ、ＡＤＣ（Analog-to-Digital Converter）、ＤＡＣ（Digital-to-Analog Converter）、変調器、復調器、符号化器、復号器などを含む。
【０１３０】
本実施形態では、図６の受信部１０１と送信部１０２は、図７の無線モジュール２０６により実現される。つまり、本実施形態では、ネットワーク内のリンクは無線リンクである。もちろん、有線リンクが混在する実施形態も可能である。
【０１３１】
タイマＩＣ２０３は、設定された時間が経過するまでカウントアップ動作を行い、設定された時間が経過すると割り込み信号を出力する。例えば、タイマＩＣ２０３は、隣接ノード管理テーブル１０３、重み付けテーブル１０４、ＦＩＤ管理テーブル１０５、組立バッファ１１６、再送信バッファ１１７のエージング処理をそれぞれ所定の間隔で実行するための割り込み信号を出力してもよい。
【０１３２】
なお、実施形態に応じて、ノード装置のハードウェア構成は図７とは異なっていてもよく、図７に例示した規格・種類以外のその他のハードウェアをノード装置に利用することもできる。
【０１３３】
例えば、図６のフレーム分岐処理部１０６、ＡＣＫ処理部１０７、リンク管理部１０８、データフレーム処理部１１０、上位層処理部１１１、ハローフレーム生成部１１２、またはＦＩＤ生成部１１３は、ハードウェア回路により実現されてもよい。具体的には、ＭＰＵ２０１の代わりに、ＦＰＧＡ（Field Programmable Gate Array）などのリコンフィギュラブル回路や、ＡＳＩＣ（Application Specific Integrated Circuit）などにより、これら図６の各部が実現されてもよい。もちろん、ＭＰＵ２０１とハードウェア回路の双方により、図６の各部が実現されてもよい。
【０１３４】
なお、以下の説明においては、説明の明確化のため、図６および図７の各部の参照符号の後にノードＩＤを付けた参照符号を用いることがある。例えば、ノード装置Ｎ１が有する図６の隣接ノード管理テーブル１０３を「１０３−Ｎ１」という参照符号で参照する場合がある。
【０１３５】
続いて、個々のノード装置の動作の概要について図８を参照して説明し、個々のノード装置の動作の結果としてネットワーク全体として実現される経路選択について図９を参照して説明する。
【０１３６】
図８は、１つのノード装置に注目して重みの学習について説明する図である。図８には、ネットワーク３内の６つのノード装置が「ノードα」〜「ノードζ」として抜粋されて示されている。図８に示すように、ノードβにはノードα、γ、δ、ε、およびζが隣接しており、図８では下記５本のリンクが実線で示されている。
・ノードβとαの間のリンクＬβ，α
・ノードβとγの間のリンクＬβ，γ
・ノードβとδの間のリンクＬβ，δ
・ノードβとεの間のリンクＬβ，ε
・ノードβとζの間のリンクＬβ，ζ
【０１３７】
また、図８において雲の形で模式的に表現されたネットワーク３ａは、ネットワーク３のうちの一部分である。ネットワーク３ａは、具体的には、ノードδとζの間を直接的に接続するリンク、または、１つ以上の不図示のノードと２本以上の不図示のリンクを介してノードδとζの間を間接的に接続する経路を含む。
【０１３８】
以下では、図８においてノードβに注目し、ノードβにおける重みの学習について説明する。
あるとき、ノードβが、ネットワーク３内の不図示のあるノード（以下、便宜的に「ノードη」という）をＧＤとするデータフレーム３０１を、リンクＬβ，αを介してノードαから受信する。ノードβは図６の重み付けテーブル１０４を有しており、このうちノードηに対応する重み付けテーブルを、図８の説明では便宜的に「１０４−ｈ」という参照符号で参照する。
【０１３９】
詳しくは図１３および図１４とともに後述するが、ＧＤごとに管理される重み付けテーブル１０４のそれぞれは、隣接ノードと重みの対応付けを記憶している。ノードβにはノードα、γ、δ、ε、およびζが隣接しているので、重み付けテーブル１０４−ｈでは、ノードαと重みＷα、ノードγと重みＷγ、ノードδと重みＷδ、ノードεと重みＷε、およびノードζと重みＷζが、それぞれ対応付けられている。
【０１４０】
説明の便宜上、ノードβがノードαからデータフレーム３０１を受信した時点での重み付けの関係が、式（１）のとおりであったとする。
Ｗγ＜Ｗδ＜Ｗε＜Ｗζ                    （１）
以下、本実施形態においては説明の便宜上、重みが０以上１以下の値をとり、重みの値が小さいほど当該重みに対応するノードの優先度が高いことを示すものとする。
【０１４１】
したがって、式（１）に基づいてノードβは、最も軽い重みＷγと対応付けられたノードγの優先度が、隣接ノードγ、δ、ε、およびζの中で最も高いことを認識する。よって、ノードβは、データフレーム３０１を転送するためのＬＤとして、隣接ノードγ、δ、ε、およびζの中から、まずノードγを選択し、ノードγにデータフレーム３０１を送信する。
【０１４２】
ここで、ノードβからノードγへの送信が失敗すると、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習する。そして、学習の結果として、ノードβは、ノードγの優先度を下げる。すなわち、ノードβは、重みＷγの値を大きくする。
【０１４３】
送信失敗には何種類かあり、具体的には、ノードβは下記（Ｄ１）または（Ｄ２）のようにして、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習する。
【０１４４】
（Ｄ１）リンク障害の場合
ノードβがデータフレーム３０１をノードγに転送した時点で、偶然リンクＬβ，γ、あるいは、ノードγに障害が発生していると、ノードβはノードγへの送信が失敗したと認識する。
【０１４５】
例えばリンクＬβ，γが無線リンクである場合、ノードγからデータフレーム３０１に対するＡＣＫフレームが所定時間内に返信されてこなければ、ノードβはタイムアウトして、「ノードγへのデータフレーム３０１の送信に失敗した」と判断する。そして、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードγに対応付けられた重みＷγの値を大きくする。
【０１４６】
なお、無線リンクはその品質環境が変化しやすいため、リンク障害が再び解消されている可能性がある。そのため、本実施形態においては、リンク障害時に一挙に重みＷγを最大値にするのではなく、所定の値だけ大きくすることにしている。このようにすれば、１回のリンク障害発生だけでそのＬＤが不適切となることを防ぐことができる。
【０１４７】
（Ｄ２）ノードγからノードβにデータフレーム３０１が戻ってくる場合
ノードβは、一旦、ノードγへのデータフレーム３０１の送信に成功する。例えば、ノードβは、データフレーム３０１に対するＡＣＫフレームをノードγから受け取ることで、ノードγへのデータフレーム３０１の送信が成功したことを認識する。よって、一旦ノードβは、ＬＤとして選択したノードγに対応付けられた重みＷγの値を小さくする。
【０１４８】
しかしながら、その後、ノードγからノードηまでデータフレーム３０１を転送することのできる経路がネットワーク３内で見つからなければ、後述するバックトラック動作により、ノードγはノードβにデータフレーム３０１を送り返す。例えば、ノードγがノードβにのみ隣接している場合、ノードγはノードηまでデータフレーム３０１を転送することのできる経路を見つけることができない。また、ノードγがノードβ以外にいくつかのノードに隣接している場合でも、ネットワーク３のトポロジによっては、ノードγからノードηまで到達不能なこともある。
【０１４９】
ノードγがバックトラック動作を行うと、ノードβは、ノードβ自身が過去にノードγに送信したデータフレーム３０１をノードγから受信するので、「ノードγへの送信が失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードγに対応付けられた重みＷγの値を大きくする。
【０１５０】
本実施形態では、（Ｄ２）のように、ノードβ自身が過去に送信したデータフレーム３０１を受信することでノードβが送信失敗を認識する場合、ノードβは具体的には重みＷγの値を最大値に設定する。
【０１５１】
以下では説明の便宜上、図８の例において（Ｄ２）のようにしてノードβが送信失敗を認識し、重みＷγの値を最大値に設定したとする。その結果、式（２）が成立する。
Ｗδ＜Ｗε＜Ｗζ＜Ｗγ                    （２）
続いてノードβは、ＧＤである不図示のノードηへデータフレーム３０１を到達させるため、不適切と判明したノードγ以外の隣接ノードをＬＤとして選択し、データフレーム３０１の再送信を試みる。具体的には式（２）に基づいて、ノードβは、現時点で最も軽い重みＷδと対応付けられたノードδをＬＤとして選択し、ノードδにデータフレーム３０１を送信する。
【０１５２】
図８の例では、データフレーム３０１に対するＡＣＫフレームをノードβがノードδから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、ＬＤとして選択したノードδに対応付けられた重みＷδの値を小さくする。その結果、やはり式（２）が成立する。
【０１５３】
続いて、データフレーム３０１はネットワーク３ａを介してノードδからノードζに到達したとする。そして、ノードζがＬＤとしてノードβを選択したとする。
すると、ノードβは、ノードβ自身が過去にノードδに送信したデータフレーム３０１をノードζから受信するので、「ノードδへの送信は、ループの存在により失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードδをＬＤとして選択することは不適切である」と学習し、重みＷδの値を大きくする。
【０１５４】
ここで、ループして戻ってきたデータフレーム３０１をノードβがノードζから受信する場合も、「ノードβ自身が過去に送信したデータフレーム３０１を受信することでノードβが送信失敗を認識する」という点では上記（Ｄ２）の場合と同様である。したがって、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードδをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードδに対応付けられた重みＷδの値を最大値に設定する。その結果、式（３）が成立する。
Ｗε＜Ｗζ＜Ｗγ＝Ｗδ                    （３）
【０１５５】
図８には、ノードζから同一データフレーム３０１を受信して重み付けを更新した結果の新しい重み付けの関係として、式（３）を示してある。
【０１５６】
続いてノードβは、ＧＤである不図示のノードηへデータフレーム３０１を到達させるため、不適切と判明したノードγおよびδ以外の隣接ノードをＬＤとして選択し、データフレーム３０１の再送信を試みる。具体的には式（３）に基づいて、ノードβは、現時点で最も軽い重みＷεと対応付けられたノードεをＬＤとして選択し、ノードεにデータフレーム３０１を送信する。
【０１５７】
図８の例では、データフレーム３０１に対するＡＣＫフレームをノードβがノードεから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、ＬＤとして選択したノードεに対応付けられた重みＷεの値を小さくする。その結果、やはり式（３）が成立する。
【０１５８】
ここで仮に、ノードεからバックトラックによってデータフレーム３０１がノードβへと返信されることがないとする。また、データフレーム３０１がネットワーク３内をループして、ノードβのいずれかの隣接ノードからノードβに送信され、ノードβで受信されることもないとする。
【０１５９】
すると、式（３）から、ノードβは、データフレーム３０１と同じくノードηをＧＤとする別のデータフレームを隣接ノードα、γ、δ、ζのいずれかから受け取った場合に、最も軽い重みＷεと対応付けられたノードεをＬＤとして優先して選択するようになる。
【０１６０】
図９は、図４のネットワーク１において動的かつ自律分散的に経路が選択される様子を説明する図である。具体的には、図９は、ノード装置Ｎ１がＧＳとなって、ノード装置Ｎ７をＧＤとして指定したデータフレームを送信する場合の、ネットワーク１内での経路選択の様子を示す。
【０１６１】
図９には図４のネットワーク１と、ノード装置Ｎ４とＮ７の間で発生した障害が示されている。また、図９の１２本の太い矢印は、ネットワーク１内で経路が動的に選択されながらデータフレームがＧＳ（すなわちノード装置Ｎ１）からＧＤ（すなわちノード装置Ｎ７）まで転送される様子を表す。
【０１６２】
なお、以下では、ノード装置Ｎｉの重み付けテーブル１０４−Ｎｉのうち、ノード装置Ｎ７に対応するものを便宜的に「１０４−ｈｉ−Ｎｉ」という参照符号で参照することにする（１≦ｉ≦６）。
【０１６３】
また、図９の説明においては、特に断らない限りデータフレームの送信が成功してＡＣＫフレームが返信されるものとし、ＡＣＫフレームの返信については省略して説明を簡略化する。ＡＣＫフレームの返信も含めた一連の処理の流れは、図３１とともに後述する。
【０１６４】
ステップＳ１０１で、ＧＳであるノード装置Ｎ１は、唯一ノード装置Ｎ１に隣接するノード装置Ｎ２をＬＤとして選択し、データフレームをノード装置Ｎ２に送信する。
ノード装置Ｎ２には、ステップＳ１０１で送信されたデータフレームのＬＳであるノード装置Ｎ１のほかに、ノード装置Ｎ３とＮ６が隣接している。そして、この２つの隣接ノード装置Ｎ３とＮ６のうちでノード装置Ｎ３の方が、重み付けテーブル１０４−ｈ２−Ｎ２において、より軽い重みと対応付けられているとする。
【０１６５】
すると、ステップＳ１０２でノード装置Ｎ２は、ステップＳ１０１で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３にデータフレームを送信する。
【０１６６】
ノード装置Ｎ３には、ステップＳ１０２で送信されたデータフレームのＬＳであるノード装置Ｎ２のほかに、ノード装置Ｎ４とＮ５が隣接している。そして、この２つの隣接ノード装置Ｎ４とＮ５のうちでノード装置Ｎ４の方が、重み付けテーブル１０４−ｈ３−Ｎ３において、より軽い重みと対応付けられているとする。
【０１６７】
すると、ステップＳ１０３でノード装置Ｎ３は、ステップＳ１０２で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ４を選択し、ノード装置Ｎ４にデータフレームを送信する。
【０１６８】
ノード装置Ｎ４には、ステップＳ１０３で送信されたデータフレームのＬＳであるノード装置Ｎ３のほかに、ノード装置Ｎ５とＮ７が隣接している。そして、この２つの隣接ノード装置Ｎ５とＮ７のうちでノード装置Ｎ７の方が、重み付けテーブル１０４−ｈ４−Ｎ４において、より軽い重みと対応付けられているとする。
【０１６９】
すると、ステップＳ１０４でノード装置Ｎ４は、ステップＳ１０３で受信したデータフレームを転送するためのＬＤとして、ＧＤでもあるノード装置Ｎ７を選択し、ノード装置Ｎ７にデータフレームを送信する。
【０１７０】
しかし、図９に示すように、ノード装置Ｎ４がノード装置Ｎ７にデータフレームを送信した時点で、ノード装置Ｎ４とＮ７の間のリンクには障害が発生しており、したがって送信は失敗する。すなわち、ノード装置Ｎ４は、所定時間待機してもノード装置Ｎ７からＡＣＫフレームが返信されてこないため、タイムアウトし、送信失敗を認識する。
【０１７１】
なお、ステップＳ１０４におけるノード装置Ｎ４は、図８でノードγへのデータフレームの送信に上記（Ｄ１）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ４は、送信失敗に応じて重み付けテーブル１０４−ｈ４−Ｎ４を更新する（具体的には、ステップＳ１０４の送信でのＬＤであるノード装置Ｎ７に対応付けられた重みの値を大きくする）。
【０１７２】
そして、ステップＳ１０５でノード装置Ｎ４は、ステップＳ１０３で受信したデータフレームを転送するためのＬＤとして、まだ試していない他の隣接ノード装置Ｎ５を選択し、ノード装置Ｎ５にデータフレームを送信する。
【０１７３】
ノード装置Ｎ５には、ステップＳ１０５で送信されたデータフレームのＬＳであるノード装置Ｎ４のほかには、ノード装置Ｎ３のみが隣接している。
そこで、ステップＳ１０６でノード装置Ｎ５は、ステップＳ１０５で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３にデータフレームを送信する。
【０１７４】
すると、ステップＳ１０６でノード装置Ｎ３は、「ノード装置Ｎ３自身がステップＳ１０３で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０６におけるノード装置Ｎ３は、図８においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置Ｎ３は、図８と同様にして重み付けテーブル１０４−ｈ３−Ｎ３を更新する（具体的には、ステップＳ１０３の送信のＬＤであるノード装置Ｎ４に対応付けられた重みの値を最大値に設定する）。
【０１７５】
そして、ステップＳ１０７でノード装置Ｎ３は、ＯＬＳ（すなわち、ステップＳ１０２で最初に当該データフレームをノード装置Ｎ３が受信したときのＬＳであるノード装置Ｎ２）以外の隣接ノード装置の中から、まだＬＤとして試していないものを探す。ここで、ＯＬＳ以外の隣接ノード装置はノード装置Ｎ４とＮ５であり、ノード装置Ｎ４はステップＳ１０３で選択済みである。
【０１７６】
よって、ステップＳ１０７でノード装置Ｎ３は、未選択のノード装置Ｎ５をＬＤとして選択し、ノード装置Ｎ５にデータフレームを送信する。つまり、ステップＳ１０７におけるノード装置Ｎ３は、図８においてノードεをＬＤとして選択しなおしてノードεにデータフレームを送信するノードβに相当する。
【０１７７】
すると、ステップＳ１０７でノード装置Ｎ５は、「ノード装置Ｎ５自身がステップＳ１０６で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０７におけるノード装置Ｎ５は、図８においてノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ５は、図８と同様にして重み付けテーブル１０４−ｈ５−Ｎ５を更新する（具体的には、ステップＳ１０６の送信のＬＤであるノード装置Ｎ３に対応付けられた重みの値を最大値に設定する）。
【０１７８】
そして、ノード装置Ｎ５にとって、ＯＬＳ（すなわちステップＳ１０５で最初に当該データフレームをノード装置Ｎ５が受信したときのＬＳであるノード装置Ｎ４）以外で隣接しているノード装置は、既に送信失敗と判明したノード装置Ｎ３のみである。したがって、もはやＬＤとして選択可能な隣接ノード装置がない。
【０１７９】
よってステップＳ１０８でノード装置Ｎ５は、ＯＬＳであるノード装置Ｎ４にデータフレームを送り返す。ステップＳ１０８はバックトラック動作であり、バックトラック動作によってノード装置Ｎ５は、「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ５自身から先の経路は袋小路（dead end）になっている」ということをノード装置Ｎ４に知らせることができる。
【０１８０】
すると、ステップＳ１０８でノード装置Ｎ４は、「ノード装置Ｎ４自身がステップＳ１０５で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０８におけるノード装置Ｎ４は、図８においてノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ４は、図８と同様にして重み付けテーブル１０４−ｈ４−Ｎ４を更新する（具体的には、ステップＳ１０５の送信のＬＤであるノード装置Ｎ５に対応付けられた重みの値を最大値に設定する）。
【０１８１】
しかし、図８のノードβには、ノードγへのデータフレームの送信に失敗しても、まだＬＤとして選択可能なノードδ等が残っていたが、図９のステップＳ１０８のノード装置Ｎ４にとっては、ＬＤとして選択可能な隣接ノード装置が残っていない。すなわち、ＯＬＳ以外の２つの隣接ノード装置Ｎ７とＮ５は、ステップＳ１０４とＳ１０５でそれぞれＬＤとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
【０１８２】
したがって、ステップＳ１０９でノード装置Ｎ４は、ＯＬＳであるノード装置Ｎ３にデータフレームを送り返す。ステップＳ１０９もバックトラック動作であり、ノード装置Ｎ４はノード装置Ｎ３に「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ４自身から先の経路は袋小路になっている」ということを知らせることができる。
【０１８３】
すると、ステップＳ１０９でノード装置Ｎ３は、「ノード装置Ｎ３自身がステップＳ１０７で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０９におけるノード装置Ｎ４は、図８においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置Ｎ３は、図８と同様にして重み付けテーブル１０４−ｈ３−Ｎ３を更新する（具体的には、ステップＳ１０７の送信のＬＤであるノード装置Ｎ５に対応付けられた重みの値を最大値に設定する）。
【０１８４】
しかし、図８のノードβには、ノードδへのデータフレームの送信が失敗すると判明しても、まだＬＤとして選択可能なノードεが残っていたが、図９のステップＳ１０９のノード装置Ｎ３にとっては、ＬＤとして選択可能な隣接ノード装置が残っていない。すなわち、ＯＬＳ以外の２つの隣接ノード装置Ｎ４とＮ５は、ステップＳ１０３とＳ１０７でそれぞれＬＤとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
【０１８５】
したがって、ステップＳ１１０でノード装置Ｎ３は、ＯＬＳであるノード装置Ｎ２にデータフレームを送り返す。ステップＳ１１０もバックトラック動作であり、ノード装置Ｎ３はノード装置Ｎ２に「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ３自身から先の経路は袋小路になっている」ということを知らせることができる。
【０１８６】
すると、ステップＳ１１０でノード装置Ｎ２は、「ノード装置Ｎ２自身がステップＳ１０２で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１１０におけるノード装置Ｎ２は、図８でノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ２は、図８と同様にして重み付けテーブル１０４−ｈ２−Ｎ２を更新する（具体的には、ステップＳ１０２の送信のＬＤであるノード装置Ｎ３に対応付けられた重みの値を最大値に設定する）。
【０１８７】
そして、ステップＳ１１１でノード装置Ｎ２は、データフレームを転送するためのＬＤとして、まだ試していない他の隣接ノード装置Ｎ６を選択し、ノード装置Ｎ６にデータフレームを送信する。
【０１８８】
ノード装置Ｎ６には、ステップＳ１１１で送信されたデータフレームのＬＳであるノード装置Ｎ２のほかには、ＧＤでもあるノード装置Ｎ７のみが隣接している。
そこで、ステップＳ１１２でノード装置Ｎ６は、ステップＳ１１１で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ７を選択し、ノード装置Ｎ７にデータフレームを送信する。
【０１８９】
以上のようにして、ネットワーク１内に障害が発生しても、各ノード装置が自律分散的に振る舞うことで、データフレームは成功裡にＧＤまで到達する。
また、データフレームの転送において、局所的に不適切なノード装置がＬＤとして選択されても、最終的にはネットワーク全体としては、ＧＳからＧＤに至る経路が選択される。なぜなら、各ノード装置がＬＤとして選択可能なノード装置を次々と選択し、選択可能なノード装置がなくなればバックトラック動作をするからである。
【０１９０】
具体的には、図９の例では、ステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３をＬＤとして選択したことは、結果的には不適切であるとステップＳ１１０で判明する。しかし、ステップＳ１０３〜Ｓ１１０の動作により、ネットワーク１全体としては、最終的にはＧＳからＧＤに至る経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉の選択に成功する。
【０１９１】
こうして選択された経路は学習され、次回以降のデータフレームの転送の効率化に寄与する。学習による効率化について具体的に説明すれば次のとおりである。
ステップＳ１１０でのデータフレームの受信の結果、ノード装置Ｎ２は重み付けテーブル１０４−ｈ２−Ｎ２の学習を行い、ノード装置Ｎ３に対応付けられた重みを最大値に設定している。したがって、ノード装置Ｎ２は、ノード装置Ｎ７をＧＤとする新たなデータフレームを隣接ノード装置Ｎ１から受信すると、最初からノード装置Ｎ６をＬＤとして選択する。つまり、ネットワーク１全体としては、自律分散的な学習の結果、バックトラックを含む試行錯誤なしに、データフレームを効率的に経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉によりＧＤまで送信することが可能となる。
【０１９２】
さらに、本実施形態によれば、不適切なＬＤの選択の影響または局所的な障害の影響は、ネットワーク１全体には及ばず、局所的に限定される。すなわち、本実施形態によれば、例えばノード装置Ｎ４とＮ７の間のリンクに障害が発生しても、代替経路を問い合わせるための制御フレームがネットワーク１全体の全ノード装置へとフラッディングされたりはしない。よって、本実施形態によれば、障害やループが局所的に発生しても、ネットワーク１全体にブロードキャストストームを引き起こすといった事態には陥らない。
【０１９３】
また、図９の例においてノード装置Ｎ１は、ノード装置Ｎ４とＮ７の間のリンクの障害や、ループ〈Ｎ３，Ｎ４，Ｎ５，Ｎ３〉については全く認識することがないのは明らかである。このことは、不適切なＬＤの選択や局所的な障害の影響が、局所的に限定され、ネットワーク１全体には及ばないということを意味している。
【０１９４】
問題の影響が局所的に限定されるということは、局所的な問題がネットワーク１全体にポジティブにフィードバックされて発散することがないということであり、ネットワーク１が系として安定しているということである。問題が局所的に限定されることの別の例を挙げれば、例えば以下のとおりである。
【０１９５】
例えば、仮にネットワーク１においてノード装置Ｎ５とＮ７の間にもリンクが存在し、重み付けテーブル１０４−ｈ５−Ｎ５においてノード装置Ｎ３よりもノード装置Ｎ７の方が軽い重みに対応づけられているとする。すると、ステップＳ１０５の直後にノード装置Ｎ５がノード装置Ｎ７をＬＤとして選択してデータフレームをノード装置Ｎ７に送信する。その結果、ステップＳ１０８〜Ｓ１１２の送信は行われず、ノード装置Ｎ１だけでなくノード装置Ｎ２とＮ３も、障害の発生を全く認識しない。このように、リンクの障害やループの発生などの問題は、問題が生じた場所に応じて最小限の局所的な範囲にしか影響を及ぼさない。
【０１９６】
続いて、以上説明したノード装置１００の構成および動作、ならびにネットワーク１全体で実現される自律分散協調動作について、更に詳細に説明してゆく。
図１０は、フレームの例を示す図である。
【０１９７】
本実施形態におけるデータフレームは、図１０のデータフレーム３０２のように、ＬＤ、ＬＳの各フィールドを含むアドホックヘッダ３３１と、ＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドを含むデータヘッダ３３２と、到達保証フラグ、到達保証ＡＣＫフラグ、ポート番号、到達保証ＩＤ、スタートフラグ、および終了フラグの各フィールドを含む到達保証ヘッダ３３３と、上位層ＰＤＵが格納されるペイロードとを含む。例えば図８のデータフレーム３０１も、データフレーム３０２と同様の形式である。
【０１９８】
データフレーム３０２のＬＤフィールド、ＬＳフィールド、ＧＤフィールド、およびＧＳフィールドには、データフレーム３０２のＬＤ、ＬＳ、ＧＤ、およびＧＳである各ノード装置のノードＩＤがそれぞれ指定される。また、データフレーム３０２のＦＩＤフィールドには、データフレーム３０２のＧＳであるノード装置が生成してデータフレーム３０２に割り当てたＦＩＤが指定される。
【０１９９】
データフレーム３０２のタイプフィールドには、「データフレーム」というタイプを示す所定の定数が指定される。また、データフレーム３０２の長さフィールドには、ペイロードの長さが指定される。
【０２００】
到達保証ヘッダ３３３の各フィールドは、本実施形態における到達保証ＡＣＫフレームを用いたＧＳとＧＤ間の再送制御処理に用いられる。
到達保証フラグと到達保証ＡＣＫフラグは、到達保証を行うフレームを含むデータフレームを識別するためのフラグであり、２つのフラグ値の組合せにより、下記の意味を有する。
到達保証フラグ値  到達保証ＡＣＫフラグ値  フレーム種別
１                  ０            到達保証データフレーム
０                  １            到達保証ＡＣＫフレーム
１                  １            通常のデータフレーム
０                  ０            通常のデータフレーム
【０２０１】
図１０の到達保証ヘッダ３３３において、ポート番号は、図１Ｂの説明において前述したとおりである。すなわち、送信元のＧＳが任意に指定する。ポート番号は、ＧＳが、アプリケーションの処理の種別を指定するために使用することができる。またＧＳが、例えば１つの大きなデータを複数の到達保証データフレームに分割して送信するときに、それらの一連のまとまりのフレーム群に対して、ポート番号として、同一の番号を付与する。
【０２０２】
到達保証ＩＤは、やはり図１Ｂの説明において前述したとおりである。すなわち、送信元のＧＳは、各ノードが各到達保証データフレームをＧＳと到達保証ＩＤ、ならびにポート番号によって一意に識別できるように、自らが送信する到達保証データフレームに、到達保証ＩＤを任意に指定する。ただし、ＧＳは、一度送信されたフレームを再送するときには、同じ到達保証ＩＤを付与する。一方、前述したように、宛先のＧＤは、自らが送信する到達保証ＡＣＫフレームに、そのＡＣＫに対応する受信された到達保証データフレームに設定されている到達保証ＩＤを付与する。これも、各ノードが、各到達保証ＡＣＫフレームを、ＧＳと到達保証ＩＤ、ならびにポート番号によって一意に識別できるようにするためである。
【０２０３】
図１０の到達保証ヘッダ３３３において、スタートフラグと終了フラグも、図１Ｂの説明において前述したとおりである。すなわち、送信される到達保証データフレームが、一連のまとまりのフレーム群の先頭フレームであるときに、スタートフラグ＝１が設定される。一方、送信される到達保証データフレームが、上記一連のまとまりのフレーム群の末尾フレームであるときに、終了フラグ＝１が設定される。送信される到達保証データフレームが、上記一連のまとまりのフレーム群の先頭でも末尾でもないフレームであるときには、スタートフラグフィールドにはスタートフラグ＝０が、終了フラグフィールドには終了フラグ＝０が記録される。送信される到達保証データフレームの１フレームのみで送信データが伝送される場合には、スタートフラグ＝１かつ終了フラグ＝１が設定される。スタートフラグおよびエンドフラグは、送信元のＧＳが、送信する各到達保証データフレームに付与する。
【０２０４】
データフレーム３０２のペイロードは、データフレーム３０２が定義されるプロトコルよりも上位の層のプロトコルのＰＤＵである。
例えば、ＭＡＣ副層を仮想的にさらに２つの副層に分割することを想定する。本実施形態のフレームは、この仮想的な２つの副層のうちの下の方の副層で定義されてもよく、すなわち、ＭＡＣ副層で定義される他のプロトコル（例えばイーサネットなど）のＰＤＵをペイロードに含んでもよい。換言すれば、本実施形態のフレームは、第２層で定義されるイーサネットフレームをカプセル化するフレームであってもよい。この場合、上位層処理部１１１はイーサネットフレームを処理する処理部であるから、公知のＭＡＣチップを用いて実現することもできる。
【０２０５】
以下では説明の便宜上、データフレーム３０２のペイロードは、ＭＡＣ層プロトコルのフレーム（具体的には例えばイーサネットフレーム）であるものとする。
しかし、もちろん実施形態によっては、データフレーム３０２のペイロードは、ネットワーク層（第３層）以上で定義されるプロトコルのＰＤＵであってもよいし、特定の通信プロトコルとは無関係な生のデータであってもよい。例えば、データフレーム３０２のペイロードがＩＰ（Internet Protocol）データグラムであってもよい。この場合、上位層処理部１１１はＩＰデータグラムを処理する処理部である。
【０２０６】
データフレーム３０２の形式は以上説明したとおりであるが、具体的な値を使ってより詳しく例示すれば、データフレーム３０３および３０４のごとくである。
データフレーム３０３は、図９のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３に送信するデータフレームである。データフレーム３０３の具体的な内容は以下のとおりである。
【０２０７】
・ＬＤフィールドには、ステップＳ１０２の送信においてＬＤとして選択されたノード装置Ｎ３のノードＩＤ（すなわちＮ３）が指定されている。
・ＬＳフィールドには、ステップＳ１０２の送信におけるＬＳであるノード装置Ｎ２のノードＩＤ（すなわちＮ２）が指定されている。
【０２０８】
・ＧＤフィールドには、ＧＳであるノード装置Ｎ１がステップＳ１０１の送信のときに指定したノード装置Ｎ７のノードＩＤ（すなわちＮ７）が指定されている。
・ＧＳフィールドには、ＧＳであるノード装置Ｎ１のノードＩＤ（すなわちＮ１）が指定されている。
【０２０９】
・ＦＩＤフィールドには、ＧＳであるノード装置Ｎ１が生成したＦＩＤ（以下Ｆａとする）が指定されている。
・タイプフィールドには、「データフレーム」というタイプを示す所定の定数Ｄが指定されている。例えば、タイプは２ビットによって表すこともでき、Ｄ＝（００）２でもよい。
【０２１０】
・長さフィールドには、データフレーム３０２のペイロードの長さＰａが指定される。なお、長さは例えばバイト単位で表されてもよいし、その他の単位で表されてもよい。
・ペイロードとして、ＭＡＣ層プロトコルのフレーム（例えばイーサネットフレーム）が含まれる。
【０２１１】
また、データフレーム３０３を受信したノード装置Ｎ３が図９のステップＳ１０３でノード装置Ｎ４に送信するのが、図１０のデータフレーム３０４である。データフレーム３０４の具体的な内容は以下のとおりである。
【０２１２】
・ＬＤフィールドには、ステップＳ１０３の送信においてＬＤとして選択されたノード装置Ｎ４のノードＩＤ（すなわちＮ４）が指定されている。つまり、転送にあたって、ノード装置Ｎ３はＬＤフィールドを書き換える。
【０２１３】
・ＬＳフィールドには、ステップＳ１０３の送信におけるＬＳであるノード装置Ｎ３のノードＩＤ（すなわちＮ３）が指定されている。つまり、転送にあたって、ノード装置Ｎ３はＬＳフィールドを書き換え、自ノードＩＤを設定する。
【０２１４】
・ＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドと、ペイロードの内容は、ノード装置Ｎ３が受信したデータフレーム３０３と同じである。
なお、データフレーム３０３と３０４で、到達保証ヘッダ３３３の内容は、スタートフラグと終了フラグの値が共に１であり、その他の値はオール０である。前述したように、到達保証フラグと到達保証ＡＣＫフレームの値が共に１である場合には、データフレームは通常のデータフレームを意味する。
【０２１５】
データフレーム３０５〜３０８は、図１Ａ，図２Ａ，図３Ａなどで、ノードＡがノードＢに送信する到達保証データフレームである。このデータフレームの具体的な内容は、以下のとおりである。
【０２１６】
・ＬＤフィールドには、ノードＢのノードＩＤが指定されている。
・ＬＳフィールドには、ＧＳでもあるノードＡのノードＩＤが指定されている。
・ＧＤフィールドには、ノードＣのノードＩＤが指定されている。
【０２１７】
・ＧＳフィールドには、ＧＳであるノードＡのノードＩＤが指定されている。
・ＦＩＤフィールドには、ＧＳであるノードＡが生成したＦＩＤが指定されている。
・タイプフィールドには、「データフレーム」というタイプを示す所定の定数Ｄが指定されている。
【０２１８】
・長さフィールドには、データフレーム３０５〜３０８のペイロードの長さが指定される。なお、長さは例えばバイト単位で表されてもよいし、その他の単位で表されてもよい。
・到達保証フラグフィールドには値１が指定され、到達保証ＡＣＫフラグフィールドには値０が指定されることにより、到達保証データフレームが指定される。
・ポート番号フィールドには、ＧＳが決定する番号が指定される。
【０２１９】
・到達保証ＩＤフィールドには、ＧＳが生成する到達保証ＩＤの値が指定される。
・スタートフラグフィールドと終了フラグフィールドには、データフレームに格納される送信データの分割位置（先頭、末端、その他）に応じた値が指定される。
・ペイロードとして、ＭＡＣ層プロトコルのフレーム（例えばイーサネットフレーム）が含まれる。
【０２２０】
データフレーム３０９は、図１Ａ，図２Ａ，図３Ａなどで、ノードＣがノードＢに送信する到達保証ＡＣＫフレームである。このデータフレームの具体的な内容は、以下のとおりである。
【０２２１】
・ＬＤフィールドには、ノードＢのノードＩＤが指定されている。
・ＬＳフィールドには、ＧＳでもあるノードＣのノードＩＤが指定されている。
・ＧＤフィールドには、ノードＡのノードＩＤが指定されている。
【０２２２】
・ＧＳフィールドには、ＧＳであるノードＣのノードＩＤが指定されている。
・ＦＩＤフィールドには、ＧＳであるノードＣが生成したＦＩＤが指定されている。
・タイプフィールドには、「データフレーム」というタイプを示す所定の定数Ｄが指定されている。
【０２２３】
・長さフィールドには、データフレーム３０９のペイロードの長さが指定されるが、到達保証ＡＣＫフレームはペイロードを持たないため、長さは０である。
・到達保証フラグフィールドには値０が指定され、到達保証ＡＣＫフラグフィールドには値１が指定されることにより、到達保証ＡＣＫフレームが指定される。
【０２２４】
・ポート番号フィールドには、ＧＳが決定する番号が指定される。
・到達保証ＩＤフィールドには、ＧＳが生成する到達保証ＩＤの値が指定される。
・スタートフラグフィールドと終了フラグフィールドには、データフレームに格納される送信データの分割位置（先頭、末端、その他）に応じた値が指定される。
【０２２５】
また、本実施形態におけるハローフレームは、図１０のハローフレーム３１１のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ハローフレーム３１１の具体例はハローフレーム３１２であり、ハローフレーム３１２は後述の図３１のステップＳ１２０３でノード装置Ｎ３により送信されるものである。
【０２２６】
ハローフレーム３１１のＬＤフィールドには、ハローフレーム３１１を送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値が指定される。なおここでの「ブロードキャスト」は「隣接するすべてのノード装置へのブロードキャスト」であり、「ネットワーク１全体へのフラッディング」ではないので注意されたい。
【０２２７】
以下、説明の便宜上、本実施形態においてはノードＩＤが３バイトで表されるものとし、「０ｘ」は１６進数を表すものとする。また、０ｘ００００００と０ｘＦＦＦＦＦＦは予約されており、通常のノードＩＤとしては使われないものとする。
【０２２８】
本実施形態におけるすべてのハローフレームでは、ハローフレーム３１２と同様、ＬＤフィールドに、当該ハローフレームを送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値として、０ｘＦＦＦＦＦＦが指定されている。
【０２２９】
ハローフレーム３１１のＬＳフィールドには、ハローフレーム３１１を送信するノード装置自身のノードＩＤが指定される。よって、ノード装置Ｎ３が送信するハローフレーム３１２のＬＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０２３０】
また、本実施形態におけるすべてのハローフレームでは、ＧＤフィールドに、ヌル（null）を表す特殊な値０ｘ００００００が指定される。なぜなら、ハローフレームは隣接ノード装置が利用するだけであり、転送されないからである。
【０２３１】
ハローフレーム３１１のＧＳフィールドには、ＬＳフィールドと同じく、ハローフレーム３１１を送信するノード装置自身のノードＩＤが指定される。よって、ハローフレーム３１２のＧＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０２３２】
ハローフレーム３１１のＦＩＤフィールドには、ハローフレーム３１１を送信するノード装置が生成してハローフレーム３１１に割り当てたＦＩＤが指定される。同様に、ハローフレーム３１２のＦＩＤフィールドには、ハローフレーム３１２を送信するノード装置Ｎ３が生成してハローフレーム３１２に割り当てたＦＩＤ（以下Ｆｂとする）が指定される。
【０２３３】
ハローフレーム３１１のタイプフィールドには、「ハローフレーム」というタイプを示す所定の定数が指定される。具体的には、「ハローフレーム」というタイプは、ハローフレーム３１２に例示するように所定の定数Ｈにより表され、例えばＨ＝（１０）２でもよい。
【０２３４】
また、本実施形態におけるＡＣＫフレームは、図１０のＡＣＫフレーム３２１のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ＡＣＫフレーム３２１の具体例はＡＣＫフレーム３２２である。また、ＡＣＫフレーム３２２は、図９のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３にデータフレーム３０３を送信したとき、ノード装置Ｎ３がノード装置Ｎ２に返信するＡＣＫフレームである。後述の図３１では、このノード装置Ｎ３からノード装置Ｎ２へのＡＣＫフレーム３２２の返信をステップＳ１０２ａとして表している。
【０２３５】
ＡＣＫフレーム３２１のＬＤフィールドには、ＡＣＫフレーム３２１の送信の契機となったデータフレームを送信した隣接ノード装置のノードＩＤが指定される。よって、例えばＡＣＫフレーム３２２のＬＤフィールドには、ＡＣＫフレーム３２２をノード装置Ｎ３が送信する契機となったデータフレーム３０３を送信した、ノード装置Ｎ３の隣接ノード装置Ｎ２のノードＩＤであるＮ２が指定される。
【０２３６】
ＡＣＫフレーム３２１のＬＳフィールドには、ＡＣＫフレーム３２１を送信するノード装置自身のノードＩＤが指定される。よって、ノード装置Ｎ３が送信するＡＣＫフレーム３２２のＬＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０２３７】
また、ハローフレームと同様にＡＣＫフレームも転送されないので、本実施形態におけるすべてのＡＣＫフレームでは、ＧＤフィールドに、ヌルを表す特殊な値０ｘ００００００が指定される。
【０２３８】
ＡＣＫフレーム３２１のＧＳフィールドとＦＩＤフィールドには、ＡＣＫフレーム３２１の送信の契機となったデータフレームのＧＳフィールドとＦＩＤフィールドの値がコピーされる。上記のように、ＧＳフィールドとＦＩＤフィールドの値の組み合わせにより、データフレームがネットワーク内で一意に識別される。よって、ＡＣＫフレーム３２１を送信するノード装置が、受信したデータフレームから値をコピーすることで、ＡＣＫフレーム３２１がどのデータフレームに対するものなのかを、ＡＣＫフレーム３２１を受信したノード装置において識別することが可能となる。
【０２３９】
よって、例えばデータフレーム３０３の受信を契機として送信されるＡＣＫフレーム３２２では、ＧＳフィールドとＦＩＤフィールドの値は、データフレーム３０３と同じく、それぞれＮ１とＦａである。
【０２４０】
ＡＣＫフレーム３２１のタイプフィールドには、「ＡＣＫフレーム」というタイプを示す所定の定数が指定される。具体的には、「ＡＣＫフレーム」というタイプは、ＡＣＫフレーム３２２に例示するように所定の定数Ａにより表され、例えばＡ＝（１１）２でもよい。
【０２４１】
なお、図１０に示したフレームの形式は一例にすぎず、実施形態に応じて、フレームに含まれるフィールドの並び順は適宜決めることができ、また、不図示の他のフィールドをフレームが含んでいてもよい。また、フレームがＦＣＳ（Frame Check Sequence）などのトレイラをさらに含んでいてもよい。
【０２４２】
また、以下では記載の簡単化のため、混乱のおそれがない場合は、例えば「ＬＤフィールド」を単に「ＬＤ」と称することもある。他のフィールドについても同様である。
図１１は、図６のバッファ部１０９に格納されるデータの例を示す図である。
【０２４３】
バッファ部１０９は、受信部１０１が受信した個々のデータフレームにそれぞれ対応する複数のエントリを含む。そして、各エントリは、タイムアウト時刻と受信したデータフレームを含む。
【０２４４】
図１１は、ノード装置Ｎ３のバッファ部１０９−Ｎ３内のあるエントリを例示している。具体的には、図９のステップＳ１０２において、ノード装置Ｎ２からノード装置Ｎ３が図１０のデータフレーム３０３を受信すると、バッファ部１０９−Ｎ３には、タイムアウト時刻ＴＩ３，ｊとデータフレーム３０３とを含むエントリが作成される。バッファ部１０９におけるエントリの作成の詳細は、図１９とともに後述する。また、タイムアウト時刻ＴＩ３，ｊの意味は次のとおりである。
【０２４５】
ノード装置Ｎ３は、ステップＳ１０２で受信したデータフレーム３０３のヘッダを、ステップＳ１０３で図１０のデータフレーム３０４のように書き換える。そしてノード装置Ｎ３は、ステップＳ１０３でデータフレーム３０４を送信する。
【０２４６】
なお、データフレームは、図１０の到達保証ヘッダ３３３も含む。  図１１のタイムアウト時刻ＴＩ３，ｊは、ノード装置Ｎ３が、データフレーム３０４を送信した後、データフレーム３０４に対するＡＣＫフレームの受信をいつまで待つのかを示す。つまり、ノード装置Ｎ３は、タイムアウト時刻ＴＩ３，ｊまでにデータフレーム３０４に対するＡＣＫフレームをノード装置Ｎ４から受信することができなければ、タイムアウトして、ノード装置Ｎ４へのデータフレーム３０４の送信に失敗したと判断する。
【０２４７】
なお、詳しくは図２７、図３３、および図３５に示すように、バッファ部１０９に設定されるタイムアウト時刻は、上書きされることもある。
例えば、図９のステップＳ１０４でノード装置Ｎ７へのデータフレームの送信に失敗したノード装置Ｎ４は、ステップＳ１０５において、ノード装置Ｎ３から受信したデータフレームに対応するバッファ部１０９−Ｎ４内のタイムアウト時刻を更新する。更新後のタイムアウト時刻は、具体的には、ステップＳ１０５でノード装置Ｎ５に送信したデータフレームへのＡＣＫフレームの受信をいつまでノード装置Ｎ４が待つかを表す。
【０２４８】
図１２は、図６の隣接ノード管理テーブル１０３の例を示す図である。隣接ノード管理テーブル１０３には、ノードＩＤフィールドと最終更新時刻フィールドがある。
例えば、図４のネットワーク１では、ノード装置Ｎ２にはノード装置Ｎ１、Ｎ３、およびＮ６が隣接している。したがって、ノード装置Ｎ２の隣接ノード管理テーブル１０３−Ｎ２は、これら３つの隣接ノード装置Ｎ１、Ｎ３、およびＮ６にそれぞれ対応する３つのエントリがある。そして、隣接ノード装置Ｎｉ（ｉ＝１，３，６）に対応する各エントリにおいて、ノードＩＤフィールドには隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻ＴＡ２，ｉが格納されている。
【０２４９】
また、図４のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接している。したがって、ノード装置Ｎ３の隣接ノード管理テーブル１０３−Ｎ３は、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリがある。そして、隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリにおいて、ノードＩＤフィールドには隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻ＴＡ３，ｉが格納されている。
【０２５０】
図１３は、図６の重み付けテーブル１０４の例を示す図である。図１３は、具体例として、図４のノード装置Ｎ３の重み付けテーブル１０４−Ｎ３を示している。
図６に示すとおり、「重み付けテーブル１０４」とは、ＧＤごとに管理される複数の重み付けテーブル１０４−１〜１０４−Ｍの総称である。各重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）は、対応するＧＤを記憶している。
【０２５１】
そして、各重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）は１つ以上のエントリを有し、各エントリは、最終更新時刻フィールドとＬＤフィールドと重みフィールドを有する。最終更新時刻フィールドには重みの学習のためにエントリが最後に更新された時刻が格納され、ＬＤフィールドには隣接ノード装置のノードＩＤが格納され、重みフィールドには当該隣接ノード装置に対応付けられた重みの値が格納される。
【０２５２】
図１３の例では、１枚目の重み付けテーブル１０４−１−Ｎ３は、ノード装置Ｎ７がＧＤとして指定されているデータフレームの送信用のテーブルなので、ＧＤとしてノード装置Ｎ７のノードＩＤであるＮ７を記憶している。
【０２５３】
また、図４のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接している。したがって、重み付けテーブル１０４−１−Ｎ３は、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリを有する。重み付けテーブル１０４−１−Ｎ３において隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリの内容は、次のとおりである。
【０２５４】
・最終更新時刻フィールドには、エントリの最終更新時刻ＴＷ３，７，ｉが格納されている。
・ＬＤフィールドには、隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されている。
【０２５５】
・重みフィールドには、隣接ノード装置Ｎｉに対応付けられる重みＷ３，７，ｉが格納されている。
すなわち、重みＷ３，７，ｉは、ノード装置Ｎ７（つまり重み付けテーブル１０４−１−Ｎ３に対応するＧＤ）をＧＤとして指定するデータフレームをノード装置Ｎ３が送信する場合に参照される、隣接ノード装置Ｎｉに対応する重みである。
【０２５６】
同様に、図１３の例では、２枚目の重み付けテーブル１０４−２−Ｎ３は、ノード装置Ｎ４がＧＤとして指定されているデータフレームの送信用のテーブルなので、ＧＤとしてノード装置Ｎ４のノードＩＤであるＮ４を記憶している。
【０２５７】
そして、図４のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接しているので、重み付けテーブル１０４−２−Ｎ３も、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリを有する。重み付けテーブル１０４−１−Ｎ３において隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリの内容は、次のとおりである。
【０２５８】
・最終更新時刻フィールドには、エントリの最終更新時刻ＴＷ３，４，ｉが格納されている。
・ＬＤフィールドには、隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されている。
【０２５９】
・重みフィールドには、隣接ノード装置Ｎｉに対応付けられる重みＷ３，４，ｉが格納されている。
もちろん、重み付けテーブル１０４−Ｎ３には、さらに別のＧＤと対応づけられた重み付けテーブル１０４−ｊ−Ｎ３（ｊ＞２）が含まれていてもよい。
【０２６０】
なお、次の点は注意すべきである。すなわち、重み付けテーブル１０４は、同一のＧＤであれば、たとえＦＩＤとＧＳの組み合わせが異なるデータフレームを送信したとしても、送信の度に、送信先となったＬＤの重みが更新される。例えば、あるデータフレームの送信時に、リンク障害のため特定のＬＤの重みが大きくなっても（優先度が低くなっても）、すぐに別データフレーム（ＧＤとＬＤは同一）の送信で、リンク障害が解消されていて送信成功となれば、該ＬＤの重みは小さくなる（優先度は高くなる）。逆に、複数の異なるデータフレーム（ＧＤとＬＤは同一）が立て続けに、リンク障害のため送信失敗となれば、たとえ同一のＦＩＤとＧＳの組み合わせのデータフレームは１度しか送信を試していなくても、該当のＬＤの重みが最大値になってしまうこともありうる。
【０２６１】
図１４は、図１３の重み付けテーブル１０４−１−Ｎ３の変化を説明する図である。図１４の例では、Ｔａ＜Ｔｂ＜Ｔｃ＜Ｔｄ＜Ｔｅである。
例えば、図９のステップＳ１０２でノード装置Ｎ２からデータフレームを受信した時点では、ノード装置Ｎ３の重み付けテーブル１０４−Ｎ３には、ノード装置Ｎ７に対応する重み付けテーブル１０４−１−Ｎ３が存在しなかったとする。そして、ステップＳ１０２の受信を契機として、以下のような内容の新たな重み付けテーブル１０４−１−Ｎ３が重み付けテーブル１０４−Ｎ３に作成されたとする。
【０２６２】
・３つのエントリの最終更新時刻はいずれも時刻Ｔａである。
・３つのエントリにおいて、隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応付けられる重みＷ３，７，ｉは、いずれも０．５である。
【０２６３】
なお、図９に関しては説明の簡単化のため、「２つの隣接ノード装置Ｎ４とＮ５のうちでノード装置Ｎ４の方が、重み付けテーブル１０４−ｈ３−Ｎ３において、より軽い重みと対応付けられているとする」と説明した。つまり、図１３と図１４はｈ３＝１の例であり、図９の説明ではＷ３，７，４＜Ｗ３，７，５と仮定している。
【０２６４】
しかし、例えば図１４に示すように、Ｗ３，７，２＝Ｗ３，７，４＝Ｗ３，７，５＝０．５という場合もありうる。図１４の例では、ノード装置Ｎ４とＮ５が同じ重み０．５に対応付けられているので、ノード装置Ｎ３はステップＳ１０３での送信のＬＤとしてノード装置Ｎ４とＮ５のいずれを選ぶこともできるが、仮に、図９の例と同様に、ノード装置Ｎ４をＬＤとして選んだとする。
【０２６５】
すると、ステップＳ１０３でノード装置Ｎ３がノード装置Ｎ４にデータフレームを送信する。その後、図３１においてステップＳ１０３ａとして示すようにノード装置Ｎ４がノード装置Ｎ３にＡＣＫフレームを送信すると、ノード装置Ｎ３は、ノード装置Ｎ４へのデータフレームの送信が成功したと認識する。
【０２６６】
そして、図８の例と同様にして、ノード装置Ｎ３は、ノード装置Ｎ４に対応付けられた重みＷ３，７，４の値を小さくする。図１４の例では、具体的には、ノード装置Ｎ３はＷ３，７，４の値を０．５から０．４に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ４に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｂを設定する。
【０２６７】
その後、図９に示すように、ノード装置Ｎ３はステップＳ１０６で再び同一のデータフレームを受信する。その結果、ノード装置Ｎ３は、図９に関して説明したように、重み付けテーブル１０４−１−Ｎ３においてノード装置Ｎ４と対応付けられている重みＷ３，７，４の値を、０．４から最大値である１．０に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ４に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｃを設定する。
【０２６８】
続いて、図９のステップＳ１０７に示すように、ノード装置Ｎ３はノード装置Ｎ５をＬＤとして選択してデータフレームを送信する。その後、図３１においてステップＳ１０７ａとして示すようにノード装置Ｎ５がノード装置Ｎ３にＡＣＫフレームを送信すると、ノード装置Ｎ３は、ノード装置Ｎ５へのデータフレームの送信が成功したと認識する。
【０２６９】
そして、図８の例と同様にして、ノード装置Ｎ３は、ノード装置Ｎ５に対応付けられた重みＷ３，７，５の値を小さくする。図１４の例では、具体的には、ノード装置Ｎ３はＷ３，７，５の値を０．５から０．４に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ５に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｄを設定する。
【０２７０】
その後、図９に示すように、ノード装置Ｎ３はステップＳ１０９で再び同一のデータフレームを受信する。その結果、図９に関して説明したように、重み付けテーブル１０４−１−Ｎ３においてノード装置Ｎ５と対応付けられている重みＷ３，７，５の値を、０．４から最大値である１．０に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ５に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｅを設定する。
【０２７１】
以上のように、重み付けテーブル１０４−１−Ｎ３は、ＡＣＫフレームの受信を契機として、あるいは、送信済みのデータフレームと同一のデータフレームの受信を契機として、更新される。
【０２７２】
図１５と図１６は、図６のＦＩＤ管理テーブル１０５の例を示す図である。図１５と図１６に示すように、ＦＩＤ管理テーブル１０５には、ＦＩＤ、ＧＳ、ＬＤ、ＯＬＳ、最終更新時刻の各フィールドがある。
【０２７３】
ＦＩＤ管理テーブル１０５におけるＦＩＤフィールドとＧＳフィールドは、データフレームを一意に識別するためのフィールドであり、受信したデータフレームのＦＩＤフィールドとＧＳフィールドから値がそれぞれコピーされる。
【０２７４】
ＦＩＤ管理テーブル１０５のＬＤフィールドには、ＦＩＤフィールドとＧＳフィールドの値により識別されるデータフレームを送信するために、最後にＬＤとして選択した隣接ノード装置のノードＩＤが格納される。
【０２７５】
また、ＦＩＤ管理テーブル１０５のＯＬＳフィールドには、ＦＩＤフィールドとＧＳフィールドの値により識別されるデータフレームを最初に受信したときに当該データフレームのＬＳフィールドに指定されていた隣接ノード装置のノードＩＤが格納される。ＯＬＳフィールドは、データフレームの転送のためにＬＤを選択するにあたって、ＬＤの候補の中からＯＬＳを除くためにも利用され、バックトラック動作のときのＬＤを決定するためにも利用される。
【０２７６】
そして、ＦＩＤ管理テーブル１０５の最終更新時刻フィールドには、エントリが最後に更新された時刻が格納される。
さて、図１５と図１６は、図９のステップＳ１０１〜Ｓ１１２での各ノード装置のＦＩＤ管理テーブル１０５を具体例として示している。以下、ステップＳ１０１〜Ｓ１１２がそれぞれ実行される時刻をＴＦ１０１〜ＴＦ１１２と表す。
【０２７７】
ステップＳ１０１でノード装置Ｎ１がノード装置Ｎ２にデータフレームを送信するとき、ノード装置Ｎ１はＦＩＤ管理テーブル１０５−Ｎ１に新たなエントリＥ１を作成する。
そして、ノード装置Ｎ１は、エントリＥ１のＦＩＤフィールドとＧＳフィールドに、送信したデータフレームのＦＩＤとＧＳの値を設定する。
【０２７８】
ここで、データフレームのＧＳとＦＩＤの値は、前述のとおり、データフレームがネットワーク１内を転送されても書き換えられない。したがって、図９でネットワーク１内をステップＳ１０１〜Ｓ１１２で送信されるデータフレームのＦＩＤとＧＳの値は、図１０のデータフレーム３０３および３０４と同じく、それぞれＦａとＮ１である。よって、ステップＳ１０１でノード装置Ｎ１は、エントリＥ１のＦＩＤフィールドとＧＳフィールドに、それぞれＦａとＮ１という値を設定する。
【０２７９】
なお、以下の各ステップＳ１０２〜Ｓ１１２で他のノード装置がそれぞれのＦＩＤ管理テーブル１０５のエントリのＦＩＤフィールドとＧＳフィールドに設定する値も、同じくＦａとＮ１である。よって、以下ではＦＩＤフィールドとＧＳフィールドに関する説明を省略する。
【０２８０】
また、ステップＳ１０１でノード装置Ｎ１は、ＬＤとして選択したノード装置Ｎ２のノードＩＤであるＮ２を、エントリＥ１のＬＤフィールドに設定する。
ところで、ＧＳとＦＩＤの値の組により一意に識別される、ある特定のデータフレームに関して、ＯＬＳとは、当該特定のデータフレームを最初に受信したときの当該特定のデータフレームのＬＳに指定されたノードＩＤで識別される隣接ノード装置のことである。
【０２８１】
しかしこのようにＯＬＳを定義すると、例えばノード装置Ｎ１がＧＳとなってデータフレームを送信する場合に、ノード装置Ｎ１自身にとっては、送信したデータフレームに関してＯＬＳが未定義となってしまう。そこで、以下ではＯＬＳの定義を拡張する。具体的には、「ノード装置Ｎｉ自身がＧＳとなってデータフレームを送信する場合には、当該データフレームに関するノード装置Ｎｉ自身にとってのＯＬＳとは、ノード装置Ｎｉ自身である」と定義する。
【０２８２】
換言すれば、ＯＬＳとは、ノード装置Ｎｉ自身が直接認識しているネットワークの範囲内において、ノード装置Ｎｉにとってデータフレームの起源として認識されるノード装置である。なおここで、「ノード装置Ｎｉ自身が直接認識しているネットワークの範囲」とは、ノード装置Ｎｉから見てホップ数１以下の範囲であり、具体的にはノード装置Ｎｉ自身と、ノード装置Ｎｉの隣接ノード装置のみが含まれる。例えば、図５の例では、ノード装置Ｎ１０５自身が直接認識しているネットワークの範囲のみが実線で示されている。
【０２８３】
以上の拡張されたＯＬＳの定義より、ステップＳ１０１でノード装置Ｎ１がエントリＥ１のＯＬＳフィールドに設定する値は、ノード装置Ｎ１自身のノードＩＤ（すなわちＮ１）である。ノード装置Ｎ１は、もし今後ＧＳの値がＮ１でＦＩＤの値がＦａのデータフレームを受信することがあれば、以上のようにして作成したエントリＥ１に基づいて、「かつてノード装置Ｎ１自身が送信したデータフレームを受信した」と認識することができる。
【０２８４】
また、ステップＳ１０１でノード装置Ｎ１は、現在時刻ＴＦ１０１をエントリＥ１の最終更新時刻フィールドに設定する。なお、以下の各ステップＳ１０２〜Ｓ１１２で他のノード装置がそれぞれのＦＩＤ管理テーブル１０５のエントリの最終更新時刻フィールドに設定する値は、同様に、各ステップＳ１０２〜Ｓ１１２が実行される時刻ＴＦ１０２〜ＴＦ１１２である。よって、以下では最終更新時刻フィールドに関する説明も省略する。
【０２８５】
そして、ステップＳ１０１でノード装置Ｎ１からデータフレームを受信したノード装置Ｎ２は、ステップＳ１０２でノード装置Ｎ３にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ２に新たなエントリＥ２を作成する。そして、ノード装置Ｎ２はエントリＥ２において、ＯＬＳフィールドにはＮ１と設定し、ＬＤフィールドにはＮ３と設定する。
【０２８６】
続いて、ステップＳ１０２でノード装置Ｎ２からデータフレームを受信したノード装置Ｎ３は、ステップＳ１０３でノード装置Ｎ４にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリＥ３を作成する。そして、ノード装置Ｎ３はエントリＥ３において、ＯＬＳフィールドにはＮ２と設定し、ＬＤフィールドにはＮ４と設定する。
【０２８７】
続いて、ステップＳ１０３でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ４は、ステップＳ１０４でノード装置Ｎ７にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ４に新たなエントリＥ４を作成する。そして、ノード装置Ｎ４はエントリＥ４において、ＯＬＳフィールドにはＮ３と設定し、ＬＤフィールドにはＮ７と設定する。
【０２８８】
ところが、ステップＳ１０４での送信は、ノード装置Ｎ４とＮ７の間のリンクの障害のために失敗する。すなわち、ノード装置Ｎ４は、ノード装置Ｎ７からＡＣＫフレームを受信することができないため、タイムアウトする。その結果、ノード装置Ｎ４は、ステップＳ１０５のように、他の隣接ノード装置Ｎ５を次のＬＤとして再選択し、ノード装置Ｎ５にデータフレームを送信する。
【０２８９】
ここで、ステップＳ１０４とＳ１０５でそれぞれ送信されるデータフレームは、ＦＩＤの値がＦａでありＧＳの値がＮ１であるから、同一のデータフレームである。したがって、ステップＳ１０５でノード装置Ｎ４は、新たなエントリを作成するのではなく、既存のエントリＥ４を更新する。
【０２９０】
具体的には、ステップＳ１０５でノード装置Ｎ４は、エントリＥ４において、ＬＤフィールドの値をＮ５に上書きする。なお、ＧＳの値がＮ１でＦＩＤの値がＦａである同じデータフレームをノード装置Ｎ４が何度送信しようとも、「ノード装置Ｎ４が当該データフレームを最初に受信したのはノード装置Ｎ３からである」という事実は変わらない。よって、エントリＥ４のＯＬＳフィールドの値は、書き換えられることはなく、Ｎ３のままである。
【０２９１】
続いて、ステップＳ１０５でノード装置Ｎ４からデータフレームを受信したノード装置Ｎ５は、ステップＳ１０６でノード装置Ｎ３にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ５に新たなエントリＥ５を作成する。そして、ノード装置Ｎ５はエントリＥ５において、ＯＬＳフィールドにはＮ４と設定し、ＬＤフィールドにはＮ３と設定する。
【０２９２】
そして、ステップＳ１０６でノード装置Ｎ５からデータフレームを受信したノード装置Ｎ３は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ３を検索し、エントリＥ３を見つける。エントリＥ３が見つかったことから、ノード装置Ｎ３は、「ノード装置Ｎ３自身がかつてステップＳ１０３で送信したのと同一のデータフレームをステップＳ１０６で受信した」と認識することができる。
【０２９３】
したがって、ノード装置Ｎ３は、次のステップＳ１０７でデータフレームをノード装置Ｎ５に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリを作成するのではなく、既存のエントリＥ３を更新する。具体的には、ステップＳ１０７でノード装置Ｎ３は、エントリＥ３において、ＬＤフィールドの値をＮ５に上書きする。なお、エントリＥ３のＯＬＳフィールドの値は書き換えられることはなく、Ｎ２のままである。
【０２９４】
すると、ステップＳ１０７でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ５は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ５を検索し、エントリＥ５を見つける。エントリＥ５が見つかったことから、ノード装置Ｎ５は、「ノード装置Ｎ５自身がかつてステップＳ１０６で送信したのと同一のデータフレームをステップＳ１０７で受信した」と認識することができる。
【０２９５】
したがって、ノード装置Ｎ５は、次のステップＳ１０８でデータフレームをノード装置Ｎ４に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ５に新たなエントリを作成するのではなく、既存のエントリＥ５を更新する。具体的には、ステップＳ１０８でノード装置Ｎ５は、エントリＥ５において、ＬＤフィールドの値をＮ４に上書きする。なお、エントリＥ５のＯＬＳフィールドの値は書き換えられることはなく、Ｎ４のままである。
【０２９６】
すると、ステップＳ１０８でノード装置Ｎ５からデータフレームを受信したノード装置Ｎ４は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ４を検索し、エントリＥ４を見つける。エントリＥ４が見つかったことから、ノード装置Ｎ４は、「ノード装置Ｎ４自身がかつてステップＳ１０５で送信したのと同一のデータフレームをステップＳ１０８で受信した」と認識することができる。
【０２９７】
したがって、ノード装置Ｎ４は、次のステップＳ１０９でデータフレームをノード装置Ｎ３に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ４に新たなエントリを作成するのではなく、既存のエントリＥ４を更新する。具体的には、ステップＳ１０９でノード装置Ｎ４は、エントリＥ４において、ＬＤフィールドの値をＮ３に上書きする。なお、エントリＥ４のＯＬＳフィールドの値は書き換えられることはなく、Ｎ３のままである。
【０２９８】
すると、ステップＳ１０９でノード装置Ｎ４からデータフレームを受信したノード装置Ｎ３は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ３を検索し、エントリＥ３を見つける。エントリＥ３が見つかったことから、ノード装置Ｎ３は、「ノード装置Ｎ３自身がかつてステップＳ１０３で送信したのと同一のデータフレームをステップＳ１０９で受信した」と認識することができる。
【０２９９】
したがって、ノード装置Ｎ３は、次のステップＳ１１０でデータフレームをノード装置Ｎ２に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリを作成するのではなく、既存のエントリＥ３を更新する。具体的には、ステップＳ１１０でノード装置Ｎ３は、エントリＥ３において、ＬＤフィールドの値をＮ２に上書きする。なお、エントリＥ３のＯＬＳフィールドの値は書き換えられることはなく、Ｎ２のままである。
【０３００】
すると、ステップＳ１１０でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ２は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ２を検索し、エントリＥ２を見つける。エントリＥ２が見つかったことから、ノード装置Ｎ２は、「ノード装置Ｎ２自身がかつてステップＳ１０２で送信したのと同一のデータフレームをステップＳ１１０で受信した」と認識することができる。
【０３０１】
したがって、ノード装置Ｎ２は、次のステップＳ１１１でデータフレームをノード装置Ｎ６に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ２に新たなエントリを作成するのではなく、既存のエントリＥ２を更新する。具体的には、ステップＳ１１１でノード装置Ｎ２は、エントリＥ２において、ＬＤフィールドの値をＮ６に上書きする。なお、エントリＥ２のＯＬＳフィールドの値は書き換えられることはなく、Ｎ１のままである。
【０３０２】
そして、ステップＳ１１１でノード装置Ｎ２からデータフレームを受信したノード装置Ｎ６は、ステップＳ１１２でノード装置Ｎ７にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ６に新たなエントリＥ６を作成する。そして、ノード装置Ｎ６はエントリＥ６において、ＯＬＳフィールドにはＮ２と設定し、ＬＤフィールドにはＮ７と設定する。
【０３０３】
図１７は、図６の再送信バッファ１１７の例を示す図である。再送信バッファ１１７には、ＧＤフィールド、ポート番号フィールド、到達保証ＩＤフィールド、到達保証ＡＣＫ待ち時間フィールド、再送回数フィールド、及びデータフレームフィールドがある。
【０３０４】
前述したように、自ノードが到達保証データフレームのＧＳであった場合には、図６の到達保証ＡＣＫ処理部１１４は、送信した到達保証データフレームを再送信バッファ１１７に一時保持する。そして、到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの受信状況に応じて、到達保証データフレームを再送する処理を実行する。
【０３０５】
データフレームフィールドには、再送される可能性のある到達保証データフレームが格納される。
ＧＤフィールド、ポート番号フィールド、到達保証ＩＤフィールドには、データフレームフィールドに格納された到達保証データフレーム内の各値がコピーされる。この値組は、到達保証データフレームを一意に特定することができるものである。ＧＤから到達保証ＡＣＫフレームが受信されたときに、そのフレームから抽出されるＧＤ、ポート番号、および到達保証ＩＤの組をキーとして再送信バッファ１１７が検索され、送信に成功したバッファエントリが削除される。
【０３０６】
到達保証ＡＣＫ待ち時間フィールドには、再送を含む送信毎に、所定の待ち時間ＴＲ1 、ＴＲ2 、ＴＲ3 、・・・が設定され、一定時間毎にデクリメントされてゆく。そして、この待ち時間が０になったエントリについて、再送処理が実行される。
【０３０７】
また、再送回数フィールドの値は、再送毎に＋１ずつインクリメントされてゆき、再送回数が所定値を超えたエントリは、再送があきらめられた再送信バッファ１１７から削除される。
【０３０８】
図１８は、図６の組立バッファ１１６の例を示す図である。組立バッファ１１６には、ＧＳフィールド、ポート番号フィールド、タイマ値、到達保証ＩＤフィールド、内容フィールド、スタートフラグフィールド、および終了フラグフィールドがある。
【０３０９】
前述したように、自ノードが到達保証データフレームのＧＤであった場合には、図６の到達保証ＡＣＫ処理部１１４は、組立バッファ１１６を使いながら、複数に分割された到達保証データフレームから元の送信データを組み立てるための処理を実行する。
【０３１０】
到達保証ＡＣＫ処理部１１４は、自ノード宛ての到達保証データフレームを受信する毎に、受信フレームからＧＳ、ポート番号、到達保証ＩＤ、ペイロード、スタートフラグ、および終了フラグの各値を抽出する。そして、組立バッファ１１６上で、ＧＳおよびポート番号ごとにまとめながら、スタートフラグが１であるものから到達保証ＩＤ順に終了フラグが１であるものまで、ペイロードを含むデータ組を並び替えて格納する。このとき、ＧＳおよびポート番号ごとに、タイマ値ＴＢ1 、ＴＢ2 、・・・、ＴＢ3 、・・・が設定され、一定時間毎にデクリメントされてゆく。そして、このタイマ値が０になるまでの間に、スタートフラグが１のデータから終了フラグが１のデータまでが揃うと、送信されたデータが復元できることになる。復元されたデータは、例えば図６の上位層処理部１１１で実行されるアプリケーション等によって組立バッファ１１６から読み出される。上記タイマ値が０になったグループについては、組立バッファ１１６から削除される。
【０３１１】
続いて、図１９〜図３８のフローチャートを参照して、ノード装置１００の動作の詳細を説明する。
図１９は、フレーム受信処理のフローチャートである。フレーム受信処理は、ノード装置１００に電源が入れられると開始される。
【０３１２】
ステップＳ２０１で受信部１０１は、フレームを受信するまで待機する。つまり、受信部１０１は、フレームを受信していなければステップＳ２０１を繰り返す。フレームを受信すると、受信部１０１は受信したフレームをフレーム分岐処理部１０６に出力し、処理はステップＳ２０２に移行する。
【０３１３】
ステップＳ２０２では、フレーム分岐処理部１０６が、ステップＳ２０１で受信部１０１が受信したフレームのタイプフィールドの値を参照し、フレームのタイプを判定する。受信したフレームのタイプがハローフレームの場合、処理はステップＳ２０３に移行し、データフレームの場合、処理はステップＳ２０４に移行し、ＡＣＫフレームの場合、処理はステップＳ２０６に移行する。
【０３１４】
ステップＳ２０３では、受信されたハローフレームをフレーム分岐処理部１０６がリンク管理部１０８へ出力し、リンク管理部１０８が図２０のハローフレーム受信処理を行う。そして処理はステップＳ２０１に戻る。もちろん、図７のＭＰＵ２０１が図６の各部に対応する複数のタスクを並行して実行するマルチタスク環境では、フレーム分岐処理部１０６がハローフレームを出力したら、ハローフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０３１５】
また、ステップＳ２０４では、フレーム分岐処理部１０６が、ステップＳ２０１で受信されたデータフレームをバッファ部１０９に格納する。つまり、フレーム分岐処理部１０６は、バッファ部１０９内に新たなエントリの領域を確保し、確保した領域にステップＳ２０１で受信されたデータフレームを格納する。また、フレーム分岐処理部１０６は、次のステップＳ２０５のためにデータフレームからＧＳとＦＩＤの値を取り出して記憶しておく。
【０３１６】
なお、図１１のとおりバッファ部１０９はタイムアウト時刻フィールドを有するが、ステップＳ２０４の時点では、タイムアウト時刻はまだ設定されない。
そして、ステップＳ２０５でフレーム分岐処理部１０６は、データフレーム処理部１１０にデータフレーム受信処理を行うよう指示する。指示に際してフレーム分岐処理部１０６は、ステップＳ２０４で記憶しておいたデータフレームのＧＳとＦＩＤの値をデータフレーム処理部１１０に通知する。
【０３１７】
なお、ノード装置１００がＧＳとならないタイプの装置である場合（すなわち、ノード装置１００が中継専門の装置である場合）、データフレーム受信処理は図２５〜図２９Ａ〜Ｈのとおりである。他方、ノード装置１００がＧＳにもなりうるタイプの装置である場合、データフレーム受信処理は、図２５〜図２７、図３８のとおりである。
【０３１８】
データフレーム処理部１１０が指示にしたがってデータフレーム受信処理を行うと、処理はステップＳ２０１に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部１０６がデータフレーム処理部１１０にデータフレーム受信処理を行うよう指示したら、データフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０３１９】
また、ステップＳ２０６では、受信されたＡＣＫフレームをフレーム分岐処理部１０６がＡＣＫ処理部１０７へ出力し、ＡＣＫ処理部１０７が図３２のＡＣＫフレーム受信処理を行う。そして処理はステップＳ２０１に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部１０６がＡＣＫフレームを出力したら、ＡＣＫフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０３２０】
図２０は、図１９のステップＳ２０３におけるハローフレーム受信処理のフローチャートである。図２０の処理は、フレーム分岐処理部１０６からハローフレームがリンク管理部１０８に出力されると開始される。
【０３２１】
ステップＳ３０１でリンク管理部１０８は、受信したハローフレームのＬＳと同じ値をノードＩＤとして持つエントリが、隣接ノード管理テーブル１０３（図１２参照）に存在するか否かを判断する。エントリが見つかれば処理はステップＳ３０２に移行し、エントリが見つからなければ処理はステップＳ３０３に移行する。
【０３２２】
なお、図２０の説明における「受信したハローフレーム」とは、図１９のステップＳ２０１で受信部１０１が受信したハローフレームである。つまり、図２０の説明における「受信したハローフレーム」とは、ステップＳ２０２でフレーム分岐処理部１０６がリンク管理部１０８に出力して図２０の処理の開始の契機となったハローフレームである。
【０３２３】
ステップＳ３０２でリンク管理部１０８は、ステップＳ３０１で見つかったエントリの最終更新時刻として、現在時刻を設定する。そして、図２０の処理は終了する。
例えば、ノード装置Ｎ２においてステップＳ３０２が実行された結果として、図１２のように隣接ノード管理テーブル１０３−Ｎ２において、Ｎ１というノードＩＤに対応する最終更新時刻フィールドの値がＴＡ２，１と更新される。その結果、ノード装置Ｎ２は「時刻ＴＡ２，１にはノード装置Ｎ２がノード装置Ｎ１を隣接ノード装置として認識可能な状況であった」と記憶しておくことができる。
【０３２４】
他方、ステップＳ３０１でエントリが見つからない場合は、今まで隣接ノード装置として認識していなかった新たなノード装置からハローフレームが受信されたということである。よって、続くステップＳ３０３〜Ｓ３０８において、当該新たなノード装置を隣接ノード装置として登録するための処理が行われる。
【０３２５】
ステップＳ３０３でリンク管理部１０８は、隣接ノード管理テーブル１０３に新規エントリを追加する。
そして、ステップＳ３０４でリンク管理部１０８は、ステップＳ３０３で追加した新規エントリに、受信したハローフレームのＬＳの値と現在時刻を設定する。例えば、図１０のハローフレーム３１２を初めて受信したとき、ノード装置Ｎ２は、新規エントリのノードＩＤフィールドに、ハローフレーム３１２のＬＳの値であるＮ３を設定し、新規エントリの最終更新時刻フィールドに現在時刻を設定する。
【０３２６】
続いて、ステップＳ３０５でリンク管理部１０８は、重み付けテーブル１０４−１〜１０４−Ｍ（図１３と図１４を参照）の中に、まだ注目していない重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）があるか否かを判断する。既にすべての重み付けテーブル１０４−１〜１０４−Ｍに注目し終わっていれば、図２０の処理は終了し、まだ注目していない重み付けテーブル１０４−ｉがあれば、処理はステップＳ３０６に移行する。
【０３２７】
ステップＳ３０６でリンク管理部１０８は、重み付けテーブル１０４−１〜１０４−Ｍのうちでまだ注目していないものの中から、次の重み付けテーブルに注目する。以下では説明の便宜上、ステップＳ３０６では重み付けテーブル１０４−ｉが注目されたとする。
【０３２８】
そして、ステップＳ３０７でリンク管理部１０８は、注目している重み付けテーブル１０４−ｉに新規エントリを追加する。
さらに、ステップＳ３０８でリンク管理部１０８は、ステップＳ３０７で追加した新規エントリのＬＤ、重み、最終更新時刻の各フィールドに、受信したハローフレームのＬＳの値と、初期重み付け値と、現在時刻を、それぞれ設定する。初期重み付け値は、実施形態に応じて任意に決められる定数である。
【０３２９】
本実施形態では、上記のとおり重みの値は０以上１以下であり、１はＬＤとして選択不能なことを示す特別な値であるから、初期重み付け値は、０以上１未満の任意の値でよい。より具体的には、初期重み付け値は、例えば０．５でもよい。例えば、図１４の１番上に示した重み付けテーブル１０４−１−Ｎ３の最初のエントリは、次のようにして作成されたものであってもよい（ただし、正確にはその場合、最初のエントリの最終更新時刻には、他の２つのエントリの最終更新時刻Ｔａとは異なる値が設定され、図１４とまったく同じとはならない）。
【０３３０】
・ＧＤとしてノード装置Ｎ７に対応付けられた重み付けテーブル１０４−１−Ｎ３が既に存在している。
・しかし、ノード装置Ｎ３は、ノード装置Ｎ２を隣接ノード装置として今まで認識していなかった。
【０３３１】
・ノード装置Ｎ３は、ノード装置Ｎ２から初めてハローフレームを受信した。
・以上の状況において、ステップＳ３０６では重み付けテーブル１０４−１−Ｎ３が注目された。
【０３３２】
・よって、ステップＳ３０８では、新規エントリのＬＤフィールドに、受信したハローフレームのＬＳの値であるＮ２が設定され、新規エントリの重みフィールドに、初期重み付け値である０．５が設定された。
ステップＳ３０８の実行後、処理はステップＳ３０５に戻る。
【０３３３】
図２１は、ハローフレーム送信処理のフローチャートである。図２１の処理は、図１９の処理とは独立して並行に、ハローフレーム生成部１１２により実行される。具体的には、ノード装置１００に電源が入れられると、ハローフレーム生成部１１２が図２１の処理を開始する。
【０３３４】
ステップＳ４０１でハローフレーム生成部１１２は、現在時刻が送信予定時刻であるか否かを判断する。現在時刻が送信予定時刻であれば処理はステップＳ４０２に移行し、現在時刻が送信予定時刻でなければ処理はステップＳ４０１に戻る。つまり、ハローフレーム生成部１１２は送信予定時刻まで待機する。
【０３３５】
例えば、基準時刻Ｔｒｅｆとハローフレームの送信間隔ΔＴｈｅｌｌｏが予め決められていてもよい。また、ハローフレーム生成部１１２は、例えば図７のＭＰＵ２０１のクロックに基づいて現在時刻Ｔｎｏｗを参照することができる。ハローフレーム生成部１１２は、式（４）のＺが整数のときのみ、「現在時刻は送信予定時刻である」と判断してもよい。
Ｚ＝（Ｔｒｅｆ−Ｔｎｏｗ）／ΔＴｈｅｌｌｏ        （４）
【０３３６】
例えば、基準時刻Ｔｒｅｆは予め決められた定数でもよいし、ノード装置１００に電源が入れられた時刻でもよい。また、送信間隔ΔＴｈｅｌｌｏは実施形態に応じて適宜決めることができ、例えば１０秒などの比較的長い時間でもよい。
【０３３７】
ステップＳ４０２では、ハローフレーム生成部１１２がＦＩＤ生成部１１３に新たなＦＩＤの生成を要求し、ＦＩＤ生成部１１３が新たなＦＩＤを生成する。例えば、ＦＩＤはシーケンス番号でもよく、ＦＩＤ生成部１１３はカウンタ回路を使って実現されてもよい。もちろん、ＦＩＤ生成部１１３はＭＰＵ２０１がプログラムを実行することで実現されてもよい。
【０３３８】
ステップＳ４０２ではさらに、ＦＩＤ生成部１１３が生成したＦＩＤを用いてハローフレーム生成部１１２がハローフレームを生成する。
例えば、図１０のハローフレーム３１２は、次のようにして生成される。すなわち、ノード装置Ｎ３のＦＩＤ生成部１１３−Ｎ３が、新たなＦＩＤとしてＦｂという値を生成する。すると、ノード装置Ｎ３のハローフレーム生成部１１２−Ｎ３は、新たなハローフレーム３１２を生成する。
【０３３９】
その際、ハローフレーム生成部１１２−Ｎ３は、ハローフレーム３１２において、ＬＤに０ｘＦＦＦＦＦＦという所定の値を設定し、ＬＳとＧＳに自ノードＩＤであるＮ３を設定し、ＧＤに０ｘ００００００という所定の値を設定する。また、ハローフレーム生成部１１２−Ｎ３は、ハローフレーム３１２において、ＦＩＤにはＦＩＤ生成部１１３−Ｎ３により生成された値Ｆｂを設定し、タイプには所定の値Ｈを設定する。
【０３４０】
以上のようにしてステップＳ４０２でハローフレームが生成されると、続いて、ステップＳ４０３においてハローフレーム生成部１１２は、生成したハローフレームの送信を送信部１０２に依頼し、送信部１０２がハローフレームを送信する。そして、処理はステップＳ４０１に戻る。
【０３４１】
続いて、各種テーブルのエージング処理について図２２〜図２４を参照して説明する。各エージング処理は、例えば、図７のタイマＩＣ２０３からの割り込み信号を契機として開始されてもよい。
【０３４２】
図２２は、隣接ノード管理テーブル１０３のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉａで割り込み信号をリンク管理部１０８に出力し、割り込み信号を契機としてリンク管理部１０８が所定の間隔Ｉａで図２２の処理を行ってもよい。
【０３４３】
ステップＳ５０１でリンク管理部１０８は、隣接ノード管理テーブル１０３（図１２を参照）の１つ目のエントリに注目する。以下、図２２に関する説明においては、リンク管理部１０８が注目している隣接ノード管理テーブル１０３のエントリを「注目エントリ」という。
【０３４４】
続いてステップＳ５０２でリンク管理部１０８は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ以上か否かを判断する。なお、実施形態によって、Ｇａ＝Ｉａでもよいし、Ｇａ＜Ｉａでもよいし、Ｇａ＞Ｉａでもよい。
【０３４５】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ以上であれば、処理はステップＳ５０３に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ未満であれば、処理はステップＳ５０５に移行する。
【０３４６】
ステップＳ５０３でリンク管理部１０８は、注目エントリのノードＩＤと同じ値をＬＤとして有するエントリを、重み付けテーブル１０４から削除する。
例えば、注目エントリが、図１２の隣接ノード管理テーブル１０３−Ｎ３の３番目のエントリである場合、注目エントリのノードＩＤの値はＮ５である。したがって、ステップＳ５０３でリンク管理部１０８は、重み付けテーブル１０４−１−Ｎ３〜１０４−Ｍ−Ｎ３のそれぞれから、ＬＤの値がＮ５であるエントリを削除する。例えば、ステップＳ５０３では、図１３の重み付けテーブル１０４−１−Ｎ３の３つ目のエントリと、重み付けテーブル１０４−２−Ｎ３の３つ目のエントリが削除される。
【０３４７】
そして、ステップＳ５０４でリンク管理部１０８は。注目エントリを隣接ノード管理テーブル１０３から削除する。そして処理はステップＳ５０５に移行する。
ステップＳ５０５でリンク管理部１０８は、まだ注目していないエントリが隣接ノード管理テーブル１０３に残っているか否かを判断する。リンク管理部１０８が、隣接ノード管理テーブル１０３のすべてのエントリに注目し終わっていれば、図２２の処理は終了する。他方、まだリンク管理部１０８が注目していないエントリが隣接ノード管理テーブル１０３に残っていれば、処理はステップＳ５０６に移行する。
【０３４８】
ステップＳ５０６でリンク管理部１０８は、隣接ノード管理テーブル１０３のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ５０２に戻る。
【０３４９】
以上の図２２のエージング処理により、ノード装置１００は、今まで隣接ノード装置として認識していたノード装置からのハローフレームの受信が途絶えると、「当該ノード装置は、もはやノード装置１００に隣接していない」と認識することができるようになる。つまり、図２２の処理により、ノード装置１００は、潜在的なＬＤの候補としての隣接ノード装置を、環境の変化に追従して適切に管理することができるようになる。
【０３５０】
なお、上記の所定の間隔Ｉａおよび所定の値Ｇａは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。なお、本実施形態では、ネットワーク内のすべてのノード装置に同じハローフレームの送信間隔ΔＴｈｅｌｌｏが設定されており、隣接ノード管理テーブル１０３のエージング時間である上記の所定の値Ｇａは、Ｇａ＞ΔＴｈｅｌｌｏを満たす。
【０３５１】
図２３は、重み付けテーブル１０４のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉｗで割り込み信号をデータフレーム処理部１１０に出力し、割り込み信号を契機としてデータフレーム処理部１１０が所定の間隔Ｉｗで図２３の処理を行ってもよい。
【０３５２】
ステップＳ６０１でデータフレーム処理部１１０は、重み付けテーブル１０４（図１３と図１４を参照）のうち１枚目の重み付けテーブル１０４−１に注目する。以下、図２３に関する説明においては、データフレーム処理部１１０が注目している重み付けテーブルを、「１０４−ｉ」という参照符号で表し（１≦ｉ≦Ｍ）、「注目テーブル」という。ステップＳ６０１の実行直後はｉ＝１である。
【０３５３】
続いてステップＳ６０２でデータフレーム処理部１１０は、注目テーブル１０４−ｉの１つ目のエントリに注目する。以下、注目テーブルのうちでデータフレーム処理部１１０が注目しているエントリを「注目エントリ」という。
【０３５４】
続いてステップＳ６０３でデータフレーム処理部１１０は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ以上か否かを判断する。なお、実施形態によって、Ｇｗ＝Ｉｗでもよいし、Ｇｗ＜Ｉｗでもよいし、Ｇｗ＞Ｉｗでもよい。
【０３５５】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ以上であれば、処理はステップＳ６０４に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ未満であれば、処理はステップＳ６０５に移行する。
【０３５６】
ステップＳ６０４でデータフレーム処理部１１０は、注目テーブル１０４−ｉから注目エントリを削除する。そして処理はステップＳ６０５に移行する。
ステップＳ６０５でデータフレーム処理部１１０は、注目テーブル１０４−ｉにまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部１１０が注目テーブル１０４−ｉのすべてのエントリに注目し終わっていれば、処理はステップＳ６０７に移行する。他方、まだデータフレーム処理部１１０が注目していないエントリが注目テーブル１０４−ｉに残っていれば、処理はステップＳ６０６に移行する。
【０３５７】
ステップＳ６０６でデータフレーム処理部１１０は、注目テーブル１０４−ｉ内のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ６０３に戻る。
【０３５８】
ステップＳ６０７でデータフレーム処理部１１０は、注目テーブル１０４−ｉにエントリが存在するか否かを判断する。ステップＳ６０３〜Ｓ６０６の繰り返しの結果、注目テーブル１０４−ｉにエントリがなくなった場合は、処理はステップＳ６０８に移行する。他方、注目テーブル１０４−ｉに１つ以上エントリが存在すれば、処理はステップＳ６０９に移行する。
【０３５９】
ステップＳ６０８でデータフレーム処理部１１０は、エントリの存在しない注目テーブル１０４−ｉを削除する。そして、処理はステップＳ６０９に移行する。
ステップＳ６０９でデータフレーム処理部１１０は、まだ注目していない重み付けテーブルが重み付けテーブル１０４の中に残っているか否かを判断する。データフレーム処理部１１０が、すべての重み付けテーブル１０４−１〜１０４−Ｍに注目し終わっていれば、図２３の処理は終了する。他方、まだデータフレーム処理部１１０が注目していない重み付けテーブル１０４−ｊ（１≦ｊ≦Ｍ）が重み付けテーブル１０４の中に残っていれば、処理はステップＳ６１０に移行する。
【０３６０】
ステップＳ６１０でデータフレーム処理部１１０は、重み付けテーブル１０４の中でまだ注目していない次の重み付けテーブル１０４−ｊに注目する（すなわち、重み付けテーブル１０４−ｊを注目テーブル１０４−ｉとして選ぶ）。そして処理はステップＳ６０２に戻る。
【０３６１】
以上の図２３のエージング処理により、ノード装置１００は、「過去の障害の影響が累積されて、どの隣接ノード装置もＬＤとして選択することが不能となる」といった事態に陥らずに済む。
【０３６２】
例えば、図９の例において、ステップＳ１１２の後、ノード装置Ｎ６とＮ７の間のリンクに障害が発生し、ノード装置Ｎ４とＮ７の間のリンクが障害から復旧したという状況を想定する。もし図２３のエージング処理が行われないと、実際には障害からの復旧により、例えば経路〈Ｎ１，Ｎ２，Ｎ３，Ｎ４，Ｎ７〉でのデータフレームの送信が可能になっていても、自律分散協調の結果としてこの経路が選択されることがなくなってしまう。しかし、図２３のエージング処理が行われれば、上記で想定した状況において、経路〈Ｎ１，Ｎ２，Ｎ３，Ｎ４，Ｎ７〉が選択されうるようになる。
【０３６３】
なお、上記の所定の間隔Ｉｗおよび所定の値Ｇｗは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。
図２４は、ＦＩＤ管理テーブル１０５のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉｆで割り込み信号をデータフレーム処理部１１０に出力し、割り込み信号を契機としてデータフレーム処理部１１０が所定の間隔Ｉｆで図２４の処理を行ってもよい。
【０３６４】
ステップＳ７０１でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５（図１５と図１６を参照）のうち１つ目のエントリに注目する。以下、図２４に関する説明においては、データフレーム処理部１１０が注目しているエントリを「注目エントリ」という。
【０３６５】
続いてステップＳ７０２でデータフレーム処理部１１０は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ以上か否かを判断する。なお、実施形態によって、Ｇｆ＝Ｉｆでもよいし、Ｇｆ＜Ｉｆでもよいし、Ｇｆ＞Ｉｆでもよい。
【０３６６】
また、図２６のステップＳ８０７に関して後述する理由から、本実施形態では、重み付けテーブル１０４のエージング時間である所定の値Ｇｗと、ＦＩＤ管理テーブル１０５のエージング時間である所定の値Ｇｆは、Ｇｆ＜Ｇｗを満たす。
【０３６７】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ以上であれば、処理はステップＳ７０３に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ未満であれば、処理はステップＳ７０４に移行する。
【０３６８】
ステップＳ７０３でデータフレーム処理部１１０は、注目エントリをＦＩＤ管理テーブル１０５から削除する。そして処理はステップＳ７０４に移行する。
そして、ステップＳ７０４でデータフレーム処理部１１０は、まだ注目していないエントリがＦＩＤ管理テーブル１０５に残っているか否かを判断する。データフレーム処理部１１０がＦＩＤ管理テーブル１０５のすべてのエントリに注目し終わっていれば、図２４の処理は終了する。他方、まだデータフレーム処理部１１０が注目していないエントリがＦＩＤ管理テーブル１０５に残っていれば、処理はステップＳ７０５に移行する。
【０３６９】
ステップＳ７０５でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ７０２に戻る。
【０３７０】
以上の図２４のエージング処理により、「ＦＩＤ管理テーブル１０５のエントリが増え続けて記憶領域を使い尽くしてしまう」といった事態を防ぐことができる。
なお、上記の所定の値Ｇｆは、例えば、何度もバックトラックが生じる最悪ケースにおいてデータフレームがＧＳからＧＤに到達するのにかかると予測される時間の長さ以上になるよう、決められていてもよい。なお、「最悪ケース」とは、詳しくは図３９とともに後述するが、探索空間において、刈り込まれていない全探索ノードをバックトラックしながら深さ優先探索順にたどる場合を意味する。一般には、ネットワークの規模が大きいほど、所定の値Ｇｆも大きく設定しておくことが望ましい。
【０３７１】
図２５〜図２９Ａ〜Ｈは、図１９のステップＳ２０５におけるデータフレーム受信処理のフローチャートである。なお、説明の便宜上、まず、ノード装置１００がＧＳとはならず中継専門のタイプである場合のデータフレーム受信処理について、図２５〜図２９Ａ〜Ｈを参照して説明する。ノード装置１００がＧＳにもなりうるタイプの場合については、図２８の部分が後述の図３８の処理に置き換わる。
【０３７２】
図１９のステップＳ２０５でフレーム分岐処理部１０６からデータフレーム受信処理を行うよう指示されると、データフレーム処理部１１０は図２５の処理を開始する。なお、前述のとおり、フレーム分岐処理部１０６からの指示は、受信したデータフレームのＧＳとＦＩＤの値の通知をともなっている。
【０３７３】
ステップＳ８０１でデータフレーム処理部１１０は、受信したデータフレームのＬＤの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＬＤの値が自ノードＩＤでなければ、処理はステップＳ８０２に移行し、受信したデータフレームのＬＤの値が自ノードＩＤであれば、処理はステップＳ８０３に移行する。
【０３７４】
なお、データフレーム受信処理の説明において、「受信したデータフレーム」とは、図１９のステップＳ２０１で受信部１０１が受信し、ステップＳ２０４でバッファ部１０９に格納され、図２５の処理の開始の契機となったデータフレームのことである。
【０３７５】
また、フレーム分岐処理部１０６は、データフレーム受信処理の開始をデータフレーム処理部１１０に指示するとき、受信したデータフレームのＧＳとＦＩＤの値をデータフレーム処理部１１０に通知している。よって、データフレーム処理部１１０は、通知されたＧＳとＦＩＤの値をキーにしてバッファ部１０９を検索することで、受信したデータフレームを含むエントリを見つけることができる。したがって、データフレーム処理部１１０は、見つけたエントリから、受信したデータフレームのヘッダに含まれる各フィールドの値を読み出すことができる。
【０３７６】
正確には、ステップＳ８０１では、データフレーム処理部１１０はまず、以上のようにして、受信したデータフレームのヘッダに含まれる各フィールドの値をバッファ部１０９から読み出して記憶する。そして、記憶したＬＤの値（すなわち受信したデータフレームのＬＤの値）を自ノードＩＤと比較する。なお、ノード装置１００自身のノードＩＤである自ノードＩＤは、例えば、図７のフラッシュメモリ２０５に予め記録されているので、データフレーム処理部１１０は自ノードＩＤを参照することができる。
【０３７７】
受信したデータフレームのＬＤの値が自ノードＩＤと異なるとき、ノード装置１００はノード装置１００自身には無関係なデータフレームを偶然受信したということである。よって、ステップＳ８０２でデータフレーム処理部１１０は、受信したデータフレームを破棄する。つまり、データフレーム処理部１１０は、ステップＳ８０１で見つけたバッファ部１０９のエントリを削除する。そして、データフレーム受信処理は終了する。
【０３７８】
他方、受信したデータフレームのＬＤの値が自ノードＩＤと等しい場合は、ステップＳ８０３でデータフレーム処理部１１０は、ＡＣＫフレームを生成し、ＡＣＫフレームの送信を送信部１０２に依頼する。そして、送信部１０２がＡＣＫフレームを送信する。なお、このＡＣＫフレームは、到達保証ＡＣＫフレームとは異なり、隣接ノード間でのみローカルに送受信されるものである。
【０３７９】
例えば、図１０のデータフレーム３０３をノード装置Ｎ３が受信すると、ノード装置Ｎ３のデータフレーム処理部１１０−Ｎ３は、ステップＳ８０３において図１０のＡＣＫフレーム３２２を生成する。そして、送信部１０２−Ｎ３がＡＣＫフレーム３２２を送信する。
【０３８０】
具体的には、データフレーム処理部１１０−Ｎ３は、受信したデータフレーム３０３のＬＳの値であるＮ２をＡＣＫフレーム３２２のＬＤに設定し、自ノードＩＤ（すなわちノード装置Ｎ３自身のノードＩＤであるＮ３）をＡＣＫフレーム３２２のＬＳに設定する。また、ＡＣＫフレーム３２２は、対応するデータフレーム３０３のＬＳであるノード装置Ｎ２以外には無関係なので、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のＧＤには、ヌルを表す特殊な値０ｘ００００００を設定する。
【０３８１】
また、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２を受信したノード装置Ｎ２が「ＡＣＫフレーム３２２はデータフレーム３０３に対するＡＣＫフレームである」と認識することができるように、ＡＣＫフレーム３２２のＧＳとＦＩＤを設定する。すなわち、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のＧＳとＦＩＤに、それぞれ、受信したデータフレーム３０３のＧＳとＦＩＤの値Ｎ１とＦａを設定する。
【０３８２】
そして、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のタイプとして、「ＡＣＫフレーム」を示す所定の値Ａを設定する。ステップＳ８０３では、以上のようにしてデータフレーム処理部１１０−Ｎ３がＡＣＫフレーム３２２を生成し、送信部１０２−Ｎ３がＡＣＫフレーム３２２を送信する。
【０３８３】
次に、ステップＳ８０３ａでデータフレーム処理部１１０は、受信したデータフレームの到達保証ヘッダ３３３（図１０参照）を抽出する。
次に、ステップＳ８０３ｂでデータフレーム処理部１１０は、到達保証ヘッダ３３３から到達保証フラグと到達保証ＡＣＫフラグを読み取る。
【０３８４】
続いて、ステップＳ８０３ｃで、データフレーム処理部１１０は、（到達保証フラグ，到達保証ＡＣＫフラグ）の組の値が（１，０）または（０，１）であるか否かを判定する。図１０の説明において前述したように、受信されたデータフレームは、上記値組が（１，０）のときには到達保証データフレームであり、（０，１）のときには到達保証ＡＣＫフレームであり、それ以外の値組のときには通常のデータフレームである。従って、受信されたデータフレームが通常の場合には、ステップＳ８０３ｃの判定がＮｏとなって、ステップＳ８０４に移行する。一方、受信されたデータフレームが到達保証フラグまたは到達保証ＡＣＫフレームの場合には、ステップＳ８０３ｃの判定がＹｅｓとなって、図２９ＡのステップＳ１３０１に移行する。
【０３８５】
まず、受信されたデータフレームが通常の場合の処理について、以下に説明する。
始めに、ステップＳ８０４でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＧＤの値が自ノードＩＤであれば、処理はステップＳ８０５に移行する。他方、受信したデータフレームのＧＤの値が自ノードＩＤと異なれば、処理は図２６のステップＳ８０６に移行する。
【０３８６】
ステップＳ８０５でデータフレーム処理部１１０は、上位層処理部１１１に、受信したデータフレームのペイロードを渡し、データフレーム受信処理を終了する。具体的には、データフレーム処理部１１０は、ステップＳ８０１で見つけたバッファ部１０９のエントリからペイロードを取り出して上位層処理部１１１に出力し、当該エントリをバッファ部１０９から削除する。そしてデータフレーム受信処理は終了する。
【０３８７】
例えば、図９のステップＳ１１２でデータフレームをノード装置Ｎ６から受信したノード装置Ｎ７では、受信したデータフレームのペイロードは上位層処理部１１１−Ｎ７に出力され、上位層処理部１１１−Ｎ７において処理される。
【０３８８】
図２６のステップＳ８０６以降の処理は、受信したデータフレームのＬＤの値が自ノードＩＤと等しく、かつ受信したデータフレームのＧＤの値が自ノードＩＤと異なる場合に実行される。
【０３８９】
ステップＳ８０６でデータフレーム処理部１１０は、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いて、ＦＩＤ管理テーブル１０５を検索する。なお、上記のように、受信したデータフレームのＦＩＤとＧＳの値は、図２５の処理の開始時にフレーム分岐処理部１０６から通知されている。
【０３９０】
続いて、ステップＳ８０７でデータフレーム処理部１１０は、ステップＳ８０６の検索の結果エントリがヒットしたか否かを判断する。エントリがヒットした場合、ノード装置１００が以前送信したことのあるデータフレームと同じデータフレームが受信されたということなので、処理はステップＳ８０８に移行する。他方、エントリがヒットしなかった場合、ノード装置１００が送信したことのないデータフレームが受信されたということなので、処理はステップＳ８１０に移行する。
【０３９１】
なお、正確には、「ノード装置１００が以前送信したことのあるデータフレームと同じデータフレームが受信されたが、検索対象のエントリは既にエージングにより消滅してしまった」という場合も、エントリはヒットしない。このような場合が生じないように、ネットワーク内でバックトラックが繰り返される最悪の時間の見積もりなどに基づいて、適切にＦＩＤ管理テーブル１０５のエージング時間Ｇｆが定められることが望ましい。
【０３９２】
ステップＳ８０８でデータフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたＦＩＤ管理テーブル１０５のエントリのＬＤとＯＬＳの値を取り出し、例えば図７のＤＲＡＭ２０４などの記憶領域に記憶する。
【０３９３】
続いてステップＳ８０９でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル（以下、図２６〜図２８の説明においては「１０４−ｉ」という参照符号で参照する）を次のように更新する。すなわち、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、ステップＳ８０８で取り出したＬＤに対応する重みを、最大値に変更する。なお、本実施形態では重みの最大値は１である。重みの変更後、処理はステップＳ８１７に移行する。
【０３９４】
なお、ステップＳ８０７、Ｓ８０８、Ｓ８０９と処理が進む場合、ステップＳ８０８で取り出したＬＤに対応するエントリが、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉに存在することが、ステップＳ８０９では保証されている。その理由は以下のとおりである。
【０３９５】
図１５と図１６に関して説明したように、ＦＩＤ管理テーブル１０５のエントリにおいて最終更新時刻は、データフレームの送信時に設定される。また、図２４に関して説明したように、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆは、例えば、最悪ケースで予測される時間以上に設定される。よって、ノード装置１００が過去に送信したデータフレームがネットワーク内を巡ってノード装置１００で受信されるとき、当該データフレームに対応するエントリは、まだＦＩＤ管理テーブル１０５に残っていることが保証される。
【０３９６】
そして、図１４に関して説明したように、データフレームが送信されてＡＣＫフレームが返信されると、重みが更新され、重み付けテーブル１０４−１〜１０１−Ｍ内の各エントリにおいては、重みが更新されるときに最終更新時刻も設定される。
【０３９７】
したがって、時系列を追うと下記（Ｅ１）〜（Ｅ５）の順となる。
（Ｅ１）ＧＤの値がＮＧＤで、ＧＳの値がＮＧＳで、ＬＤの値がＮＬＤで、ＦＩＤの値がＦｃのデータフレームがノード装置１００から送信される。このとき、ＦＩＤ管理テーブル１０５において最終更新時刻が設定される。例えば、図９のノード装置Ｎ３において、ステップＳ１０３で図１５のエントリＥ３に最終更新時刻Ｔ１０３が設定される。
【０３９８】
（Ｅ２）上記データフレームに対するＡＣＫフレームが受信されると、ノード装置ＮＧＤに対応する重み付けテーブル１０４−ｉにおいて、ＬＤフィールドの値がＮＬＤであるエントリの重みが更新される。このとき、当該エントリの最終更新時刻が設定される。例えば、ノード装置Ｎ３において、図１４に示すようにステップＳ１０３ａで重み付けテーブル１０４−１−Ｎ３の、ＬＤフィールドの値がＮ４であるエントリの最終更新時刻がＴｂに設定される。
【０３９９】
（Ｅ３）ＧＳの値がＮＧＳで、ＦＩＤの値がＦｃの同じデータフレームが、ノード装置１００で受信される。例えば、図９のステップＳ１０６でノード装置Ｎ３がデータフレームを受信する。なお、データフレームのＧＤの値は中継に際して書きかえられることはないので、（Ｅ３）で受信されるデータフレームのＧＤの値は、上記（Ｅ１）より当然、ＮＧＤである。
【０４００】
（Ｅ４）上記（Ｅ１）の時点から、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆが経過する。
（Ｅ５）上記（Ｅ２）の時点から、重み付けテーブル１０４のエージング時間Ｇｗが経過する。
【０４０１】
以上のとおり、（Ｅ３）の時点は（Ｅ５）の時点より前である。よって、（Ｅ３）の時点では、ノード装置ＮＧＤに対応する重み付けテーブル１０４−ｉにおいて、ＬＤフィールドの値がＮＬＤであるエントリの存在が保証される。
【０４０２】
例えば、上記の例では、重み付けテーブル１０４−１−Ｎ３の、ＬＤフィールドの値がＮ４であるエントリの存在が、図９のステップＳ１０６の時点保証されている。なお、ここでの「ステップＳ１０６の時点」とは、より詳しくは、ステップＳ１０６での受信を契機とするデータフレーム受信処理に含まれるステップＳ８０９の処理を、ノード装置Ｎ３が実行する時点のことである。
【０４０３】
したがって、図２６のステップＳ８０６の検索でＦＩＤ管理テーブル１０５にエントリが見つかった場合、ステップＳ８０９では必ず、ステップＳ８０８で取り出したＬＤに対応するエントリが、重み付けテーブル１０４−ｉに存在する。よって、ステップＳ８０９でデータフレーム処理部１１０は、存在が保証されているエントリにおいて、重みの値を最大値に設定している。
【０４０４】
逆に、ステップＳ８０６の検索でエントリが見つからなかった場合、ステップＳ８１０でデータフレーム処理部１１０は、受信したデータフレームのＬＳの値を、例えば図７のＤＲＡＭ２０４などの記憶領域に、ＯＬＳとして記憶する。
【０４０５】
そして、ステップＳ８１１でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値を検索キーとして用いて、重み付けテーブル１０４を検索する。
続いて、ステップＳ８１２でデータフレーム処理部１１０は、ステップＳ８１１の検索の結果、テーブルがヒットしたか否かを判断する。
【０４０６】
受信したデータフレームのＧＤの値に対応する重み付けテーブルが重み付けテーブル１０４の中に存在すれば、処理はステップＳ８１２ａに移行する。なお、ステップＳ８０９で導入した「１０４−ｉ」という参照符号は、受信したデータフレームのＧＤの値に対応する重み付けテーブルを指すので、ステップＳ８１１の検索の結果ヒットしたテーブルも、「重み付けテーブル１０４−ｉ」である。
【０４０７】
他方、受信したデータフレームのＧＤの値に対応する重み付けテーブルが重み付けテーブル１０４の中に存在しなければ、処理はステップＳ８１３に移行する。
ステップＳ８１２ａでデータフレーム処理部１１０は、ステップＳ８１１の検索でヒットした重み付けテーブル１０４−ｉを調整する。ステップＳ８１２ａの重み付けテーブル調整処理は、詳しくは図３１とともに後述するが、エージング処理の副作用を中和する処理である。
【０４０８】
ステップＳ８１２ａの結果、隣接ノード管理テーブル１０３で管理されているすべての隣接ノード装置に対応するエントリが重み付けテーブル１０４−ｉに存在することが保証される。そして、処理はステップＳ８１７に移行する。
【０４０９】
ステップＳ８１３でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する新規重み付けテーブルを追加する。なお、ステップＳ８１３で追加されるテーブルも、「重み付けテーブル１０４−ｉ」である。
【０４１０】
そして、ステップＳ８１４でデータフレーム処理部１１０は、新規重み付けテーブル１０４−ｉにおいて、受信したデータフレームのＧＤの値を、重み付けテーブル１０４−ｉのＧＤとして設定する。
【０４１１】
さらに、ステップＳ８１５でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３のエントリ数と同数の新規エントリを、新規重み付けテーブル１０４−ｉに作成する。
【０４１２】
そして、ステップＳ８１６でデータフレーム処理部１１０は、ステップＳ８１５で作成した各エントリに、それぞれ、隣接ノード管理テーブル１０３の各エントリのノードＩＤと、初期重み付け値と、現在時刻を設定する。
【０４１３】
なお、以上のステップＳ８１１〜Ｓ８１６の具体例を挙げれば、以下のとおりである。
例えば、図９のステップＳ１０２でノード装置Ｎ２から図１０のデータフレーム３０３を受信したとき、ノード装置Ｎ３の重み付けテーブル１０４−Ｎ３には、図１４の重み付けテーブル１０４−１−Ｎ３が存在しなかったとする。すると、ノード装置Ｎ３が受信したデータフレーム３０３のＧＤの値であるＮ７を検索キーにしてノード装置Ｎ３のデータフレーム処理部１１０−Ｎ３がステップＳ８１１で重み付けテーブル１０４−Ｎ３を検索しても、テーブルはヒットしない。
【０４１４】
そこで、データフレーム処理部１１０−Ｎ３は、ステップＳ８１３で新たに重み付けテーブル１０４−１−Ｎ３を作成し、ステップＳ８１４で重み付けテーブル１０４−１−Ｎ３のＧＤにＮ７を設定する。そして、データフレーム処理部１１０−Ｎ３は、ステップＳ８１５で、図１２の隣接ノード管理テーブル１０３−Ｎ３と同数の（すなわち３つの）新規エントリを重み付けテーブル１０４−１−Ｎ３に作成する。
【０４１５】
ここで、隣接ノード管理テーブル１０３−Ｎ３の各エントリのノードＩＤは、図１３のとおり、Ｎ２とＮ４とＮ５である。よって、ステップＳ８１６でデータフレーム処理部１１０−Ｎ３は、ステップＳ８１５で作成した３つのエントリそれぞれに、ＬＤとしてＮ２とＮ４とＮ５を設定する。また、データフレーム処理部１１０−Ｎ３は、これら３つのエントリの重みフィールドに、いずれも０．５という初期重み付け値を設定し、これら３つのエントリの最終更新時刻フィールドに、いずれも現在時刻を設定する。
【０４１６】
以上のステップＳ８１３〜Ｓ８１６の結果として、図１４の１段目のような重み付けテーブル１０４−１−Ｎ３が重み付けテーブル１０４−Ｎ３の中に追加される。
ここで、具体例の説明から図２６の処理一般の説明に戻る。ステップＳ８１７が実行されるのは、ステップＳ８０９の実行後、ステップＳ８１６の実行後、またはステップＳ８１１の検索においてテーブルがヒットしたとステップＳ８１２で判断された後である。よって、ステップＳ８１７の実行時には、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉの存在が保証されている。
【０４１７】
そこで、ステップＳ８１７においてデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、ＯＬＳとは異なるＬＤのうちで最小の重みと対応付けられているＬＤの値を取得する。
【０４１８】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なる値をＬＤとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部１１０は、選択したエントリのＬＤと重みの値を、例えば図７のＤＲＡＭ２０４などの記憶領域に記憶する。
【０４１９】
続いて、図２７のステップＳ８１８でデータフレーム処理部１１０は、下記の２つの条件（Ｆ１）と（Ｆ２）のいずれかが成立するか否かを判断する。
（Ｆ１）ステップＳ８１７（または後述のＳ８２９）で取得したＬＤの値に対応する重みが、重みの最大値（本実施形態では１．０）である。
【０４２０】
（Ｆ２）ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なるＬＤへのデータフレームの転送がすべて失敗した（ただし、重み付けテーブル１０４−ｉにおけるＬＤが、もともとＯＬＳしか存在しなかった場合も含む）。
【０４２１】
条件（Ｆ１）または（Ｆ２）が成立する場合、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理は図２８のステップＳ８３０に移行する。
他方、条件（Ｆ１）と（Ｆ２）のいずれも成立しない場合、まだＬＤとして選択可能な隣接ノード装置が残っている。換言すれば、（Ｇ１）〜（Ｇ４）のいずれにも該当しない隣接ノード装置が、少なくとも１つは存在する。そして、ＬＤとして選択可能な隣接ノード装置のノードＩＤが、ステップＳ８１７（または後述のＳ８２９）で取得されている。
【０４２２】
（Ｇ１）当該隣接ノード装置から先の経路が袋小路またはループになっている、と判断されたため、当該隣接ノード装置は最大値の重みと対応付けられている。
（Ｇ２）過去に当該隣接ノード装置への同一ＧＤ宛てのデータフレームの送信に失敗した結果が累積したため、当該隣接ノード装置は最大値の重みと対応付けられている。
【０４２３】
（Ｇ３）今回のデータフレーム受信処理において当該隣接ノード装置へのデータフレームの送信を試した結果として、「送信失敗」と判明した。すなわち、データフレームを送信した隣接ノード装置から、所定時間が経っても、ＡＣＫフレームを受信することができなかった。
【０４２４】
（Ｇ４）当該隣接ノード装置はＯＬＳである。
そこで、ステップＳ８１８で条件（Ｆ１）と（Ｆ２）のいずれも成立しないと判断されると、処理はステップＳ８１９に移行する。ステップＳ８１９以降の処理は、取得済みのＬＤの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理である。
【０４２５】
ステップＳ８１９でデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０４２６】
具体的には、データフレーム処理部１１０は、ステップＳ８１７（または後述のＳ８２９）で取得したＬＤの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップＳ８０１で見つかったバッファ部１０９内のエントリに格納されているデータフレームである。
【０４２７】
ステップＳ８１９での送信後、処理はステップＳ８２０に移行し、データフレーム処理部１１０がバッファ部１０９のタイムアウト時刻を更新する。すなわち、データフレーム処理部１１０は、バッファ部１０９において、受信したデータフレームを格納しているエントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。
Ｔｔｉｍｅｏｕｔ＝Ｔｎｏｗ＋Ｔｗａｉｔ          （５）
なお、式（５）において時刻Ｔｎｏｗは現在時刻であり、時間ＴｗａｉｔはＡＣＫフレーム待ち時間である。
【０４２８】
そして、ステップＳ８２１でデータフレーム処理部１１０は、ステップＳ８０６のＦＩＤ管理テーブル１０５の検索においてエントリがヒットしているか、または、後述するステップＳ８２３、および、ステップＳ８２４で、ＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定しているか否かを確認する。つまり、受信したデータフレームのＧＳとＦＩＤの値に等しい値を、ＧＳおよびＦＩＤとして有するエントリが、ＦＩＤ管理テーブル１０５に存在するか否かを、データフレーム処理部１１０は確認する。
【０４２９】
ステップＳ８０６の検索でエントリがヒットしているか、ステップＳ８２３およびステップＳ８２４でＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定していれば、今回のデータフレーム受信処理は、過去にノード装置１００自身が送信したのと同じデータフレームの受信を契機とする処理である。よって、データフレーム処理部１１０は続いてステップＳ８２２を実行する。他方、ステップＳ８０６の検索でエントリがヒットしておらず、かつ、ステップＳ８２３およびステップＳ８２４でＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定していなければ、ノード装置１００は、初めて受信するデータフレームの初めての転送を試みているところである。よって、処理はステップＳ８２３に移行する。
【０４３０】
ステップＳ８２２でデータフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたエントリにおいて、ＬＤフィールドには、ステップＳ８１９で送信したデータフレームのＬＤの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップＳ８２５に移行する。
【０４３１】
また、ステップＳ８２３でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ８２４でデータフレーム処理部１１０は、新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳとＬＤの各フィールドには、それぞれステップＳ８１９で送信したデータフレームの値をコピーする。また、データフレーム処理部１１０は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、ＯＬＳフィールドには、ステップＳ８１０で記憶したＯＬＳの値をコピーする。そして、処理はステップＳ８２５に移行する。
【０４３２】
ステップＳ８２５でデータフレーム処理部１１０は、ステップＳ８１９における送信の成否の通知を待つ。
例えば、データフレーム処理部１１０が、所定のプログラムのスレッドを実行する図７のＭＰＵ２０１により実現される場合、ステップＳ８２５ではスレッドがスリープしてもよい。その場合、「送信成功」または「送信失敗」の通知は、スレッドを起こす処理である。
【０４３３】
ステップＳ８１９における送信が成功した場合は、ステップＳ８１９で送信したデータフレームにおいてＬＤとして指定されている隣接ノード装置からＡＣＫフレームが返信される。そして、ＡＣＫ処理部１０７が後述の図３２の処理を行い、データフレーム処理部１１０に「送信成功」を通知する。
【０４３４】
また、ステップＳ８１９における送信の失敗とは、ステップＳ８１９で送信したデータフレームにおいてＬＤとして指定されている隣接ノード装置からのＡＣＫフレームが、式（５）の時刻Ｔｔｉｍｅｏｕｔになってもノード装置１００で受信されないことである。ＡＣＫフレームの受信は、ＡＣＫ処理部１０７による後述の図３３の処理により監視されており、ＡＣＫフレームがタイムアウト時刻Ｔｔｉｍｅｏｕｔになっても受信されないと、ＡＣＫ処理部１０７がデータフレーム処理部１１０に「送信失敗」を通知する。
【０４３５】
データフレーム処理部１１０が、ステップＳ８２５での待機の後、ＡＣＫ処理部１０７から「送信成功」または「送信失敗」の通知を受けると、処理はステップＳ８２６に移行する。
【０４３６】
ステップＳ８２６でデータフレーム処理部１１０は、ＡＣＫ処理部１０７から受けた通知に基づいて、ステップＳ８１９の送信が成功したか否かを判断する。送信が成功した場合、処理はステップＳ８２７に移行し、送信が失敗した場合、処理はステップＳ８２８に移行する。
【０４３７】
送信が成功した場合、ステップＳ８２７でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８１９で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。ここで、データフレームのＧＤは転送によって書き換えられないことに注意して換言すれば、ステップＳ８２７でデータフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、重みの更新を行う。
【０４３８】
つまり、データフレーム処理部１１０は、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有するエントリを重み付けテーブル１０４−ｉで探し、見つかったエントリの重みの値を小さくする。重みの値を小さくすることは、対応するＬＤの優先度を上げることである。
【０４３９】
ここで、見つかったエントリの現在の重みの値をＷｃｕｒｒｅｎｔとすると、ステップＳ８２７でデータフレーム処理部１１０は、見つかったエントリの重みの値を例えば式（６）のＷｒｅｖｉｓｅｄに更新してもよい。
Ｗｒｅｖｉｓｅｄ＝ｍａｘ（Ｗｍｉｎ，Ｗｃｕｒｒｅｎｔ−ΔＷｓｕｃｃｅｓｓ）
（６）
なお、式（６）において、Ｗｍｉｎは重みの最小値であり、本実施形態ではＷｍｉｎ＝０である。また、ΔＷｓｕｃｃｅｓｓは、送信が成功したときに重みを減らす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔＷｓｕｃｃｅｓｓ＝０．１でもよい。
【０４４０】
さらに、データフレーム処理部１１０はステップＳ８２７で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有する重み付けテーブル１０４−ｉのエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０４４１】
他方、送信が失敗した場合、ステップＳ８２８でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８１９で送信したデータフレームのＧＤとＬＤの組に対応する重みを大きくする。つまり、ステップＳ８２８でデータフレーム処理部１１０は、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有するエントリを重み付けテーブル１０４−ｉで探し、見つかったエントリの重みの値を大きくする。重みの値を大きくすることは、対応するＬＤの優先度を下げることである。
【０４４２】
例えば、ステップＳ８２８でデータフレーム処理部１１０は、見つかったエントリの重みの値を式（７）のＷｒｅｖｉｓｅｄに更新してもよい。
Ｗｒｅｖｉｓｅｄ＝ｍｉｎ（Ｗｍａｘ，Ｗｃｕｒｒｅｎｔ＋ΔＷｆａｉｌｕｒｅ）
（７）
なお、式（７）において、Ｗｍａｘは重みの最大値であり、本実施形態ではＷｍａｘ＝１である。また、ΔＷｆａｉｌｕｒｅは、送信が失敗したときに重みを増やす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔＷｆａｉｌｕｒｅ＝０．１でもよい。もちろん、ΔＷｆａｉｌｕｒｅ≠ΔＷｓｕｃｃｅｓｓでもよい。
【０４４３】
なお、データフレーム処理部１１０はステップＳ８２８で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値を、例えば図７のＤＲＡＭ２０４などのワークエリアに「転送に失敗したＬＤ」として記憶する。例えば、データフレーム処理部１１０は、ＤＲＡＭ２０４上の線形リストをステップＳ８１７で空に初期化し、ステップＳ８２８の実行のたびに、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値を保持する要素を線形リストに追加してもよい。もちろん、「転送に失敗したＬＤ」の記憶のために配列など他のデータ構造が使われてもよい。
【０４４４】
さらに、データフレーム処理部１１０はステップＳ８２８で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有する重み付けテーブル１０４−ｉのエントリにおいて、最終更新時刻に現在時刻を設定する。そして処理はステップＳ８２９に移行する。
【０４４５】
ステップＳ８２９でデータフレーム処理部１１０は、今までにＬＤとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、転送に失敗したＬＤ以外で、かつＯＬＳとは異なるＬＤのうちで、最小の重みと対応付けられているＬＤの値を取得する。なお、転送に失敗したＬＤは、ステップＳ８２８において例えば図７のＤＲＡＭ２０４などのワークエリアに、例えば線形リストなどの形で、記憶されている。
【０４４６】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、（Ｈ１）かつ（Ｈ２）である値をＬＤとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部１１０は、選択したエントリのＬＤと重みの値を、例えば図７のＤＲＡＭ２０４などの記憶領域に記憶する。
（Ｈ１）過去にステップＳ８１７またはＳ８２９で取得したＬＤの値とは異なる値
（Ｈ２）ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なる値
【０４４７】
したがって、例えば、ステップＳ８２８で０．２に更新された重みと対応付けられた隣接ノード装置は、ステップＳ８２９でＬＤとして選択されず、ステップＳ８２９では０．２より大きな、０．８などの重みの隣接ノード装置が選択されることもありうる。
【０４４８】
以上のステップＳ８１７〜Ｓ８２９の具体例を挙げれば、以下のとおりである。例えば、図９のノード装置Ｎ４には、ノード装置Ｎ３、Ｎ５、およびＮ７が隣接している。そして、図１５のとおり、ノード装置Ｎ４のＦＩＤ管理テーブル１０５−Ｎ４のエントリＥ４のＯＬＳの値は、Ｎ３である。
【０４４９】
図９の例では、ノード装置Ｎ４のデータフレーム処理部１１０−Ｎ４が、最初にステップＳ８１７でＬＤの値Ｎ７を取得するので、ステップＳ１０４のようにノード装置Ｎ７へのデータフレームの送信が行われる。しかし、図９に示すとおりステップＳ１０４の送信は失敗するので、データフレーム処理部１１０−Ｎ４はステップＳ８２６で「送信失敗」と判断する。
【０４５０】
すると、データフレーム処理部１１０−Ｎ４がステップＳ８２９を実行する時点で、転送に失敗したＬＤ（すなわちＮ７）以外で、かつＯＬＳ（すなわちＮ３）とは異なるＬＤの値は、Ｎ５のみである。よって、ステップＳ８２９ではＬＤの値Ｎ５が取得される。
【０４５１】
こうしてステップＳ８２９でＬＤの値が取得されると、処理はステップＳ８２９からステップＳ８１８へ戻る。
よって、上記のノード装置Ｎ４の例では、ステップＳ８２９の後、再度ステップＳ８１８〜Ｓ８２６が実行される。そして、図９にステップＳ１０５として示すように、今度はステップＳ８２６で「送信成功」と判断され、ステップＳ８２７が実行されて、データフレーム受信処理が終了する。
【０４５２】
なお、ステップＳ８２８で、例えば式（７）のように重みを更新することの影響について具体例を挙げて説明すれば、以下のとおりである。
例えば、図５のネットワーク２において、ノード装置Ｎ１０６が隣接ノード装置Ｎ１０８から、ノード装置Ｎ１１８をＧＤとして指定する第１のデータフレームを時刻Ｔｒｃｖ１に受信したとする。そして、時刻Ｔｒｃｖ１にノード装置Ｎ１０６には、ノード装置Ｎ１１８に対応する重み付けテーブル１０４−ｇ１０６−Ｎ１０６が存在したとする。また、時刻Ｔｒｃｖ１の重み付けテーブル１０４−ｇ１０６−Ｎ１０６においては、ノード装置Ｎ１０２には重み０．４が、ノード装置Ｎ１０３には重み０．７が、ノード装置Ｎ１０７には重み０．１が、ノード装置Ｎ１０８には重み０．５が、それぞれ対応付けられていたとする。
【０４５３】
すると、ステップＳ８１７では、最小の重み０．１と対応付けられているノード装置Ｎ１０７がＬＤとして選択される。ところが、ステップＳ８１９でデータフレームが送信されるとき、偶然、ノード装置Ｎ１０６とＮ１０７の間に遮蔽物が置かれるなどの理由で、一時的に、ノード装置Ｎ１０６とＮ１０７の無線リンクが通信不能になったとする。
【０４５４】
すると、ＡＣＫフレームが返信されないので、ステップＳ８２８では、ノード装置Ｎ１０７の重みが０．１から０．２に更新される。そして、ステップＳ８２９では、重み０．４と対応付けられているノード装置Ｎ１０２がＬＤとして選択される。ここで、ステップＳ８１９におけるデータフレームの送信が成功し、ノード装置Ｎ１０２からＡＣＫフレームが返信されたとする。すると、ステップＳ８２７でノード装置Ｎ１０２の重みが０．４から０．３に更新され、データフレーム受信処理が終了する。
【０４５５】
ここで、ノード装置Ｎ１０６からノード装置Ｎ１０２へ送信された第１のデータフレームは、ノード装置Ｎ１０６にバックトラックすることなく、ノード装置Ｎ１１８に到達したとする。つまり、重み付けテーブル１０４−ｇ１０６−Ｎ１０６においては、第１のデータフレームの転送にともなって重みが１に更新されるエントリはなかったとする。
【０４５６】
すると、ノード装置Ｎ１０６が、その後の時刻Ｔｒｃｖ２に、同じくノード装置Ｎ１１８をＧＤとして指定する第２のデータフレームを今度はノード装置Ｎ１０３から受信したとき、重み付けテーブル１０４−ｇ１０６−Ｎ１０６の内容は次のとおりである。すなわち、ノード装置Ｎ１０２には重み０．３が、ノード装置Ｎ１０３には重み０．７が、ノード装置Ｎ１０７には重み０．２が、ノード装置Ｎ１０８には重み０．５が、それぞれ対応付けられている。
【０４５７】
よって、ステップＳ８１７では、第１のデータフレームの転送に失敗したとはいえ、なお最小の重みと対応付けられているノード装置Ｎ１０７が、ＬＤとして選択される。そして、もし時刻Ｔｒｃｖ２にノード装置Ｎ１０６とＮ１０７の間の無線リンクの通信品質が好転しており、ステップＳ８１９での第２のデータフレームの送信が成功すれば、ステップＳ８２７でノード装置Ｎ１０７の重みは再度０．１に戻る。
【０４５８】
ここで、第２のデータフレームのノード装置Ｎ１０７への転送の結果、バックトラックが生じないものとすると、ノード装置Ｎ１０７の重みは０．１のままである。よって、さらにその後の時刻Ｔｒｃｖ３に、同じくノード装置Ｎ１１８をＧＤとして指定する第３のデータフレームを、ノード装置Ｎ１０７以外の隣接ノード装置からノード装置Ｎ１０６が受信すれば、ＬＤとして最も優先的に選択されるのは、やはりノード装置Ｎ１０７である。
【０４５９】
このように、ステップＳ８２９で重みを急激に最大値に設定するのではなく少しだけ大きくすると、重み付けテーブル１０４が通信環境の変化に過剰に反応することはない。よって、同じノード装置をＧＤとして指定する複数のデータフレームを次々とノード装置Ｎ１０６が受信しているうちに、一時的に障害の生じていたリンクが障害から回復すれば、環境の好転に追従して、過去の学習結果が再びＬＤの選択に活かされるようになる。つまり、上記の例では、ＬＤとして適切だと過去に学習済みのノード装置Ｎ１０７が、再びＬＤとして優先的に選択されるようになる。
【０４６０】
あるいは、時刻Ｔｒｃｖ２においてノード装置Ｎ１０６とＮ１０７の間の無線リンクが障害から復旧していない場合もありうる。その場合、第２のデータフレームの送信時のＬＤとして、一旦は重み０．２のノード装置Ｎ１０７が選択されるが、ＡＣＫフレームが受信されないために、ノード装置Ｎ１０７の重みは０．３に更新される。そして、最終的には重み０．３と対応付けられたノード装置Ｎ１０２がＬＤとして選択され、送信が成功して重みが０，２に更新されることもありうる。
【０４６１】
すると、時刻Ｔｒｃｖ３に、例えばノード装置Ｎ１０３から、ノード装置Ｎ１０６が第３のデータフレームを受信すると、重み０．２に対応付けられたノード装置Ｎ１０２がＬＤとして選択され、また送信が成功し、ノード装置Ｎ１０２の重みが０．１になるかもしれない。そして、その後しばらくは、ノード装置Ｎ１１８をＧＤとして指定するデータフレームのＬＤとして、ノード装置Ｎ１０６はノード装置Ｎ１０２を選択し続けるかもしれない。
【０４６２】
しかし、さらにその後、ノード装置Ｎ１０６とＮ１０２の間の無線リンクに障害が生じたとすると、ノード装置Ｎ１０２からはＡＣＫフレームが返信されてこない。するとステップＳ８２９でＬＤの再選択が行われる。
【０４６３】
その場合、時刻Ｔｒｃｖ１以前にＬＤとして好適であると学習されていたノード装置Ｎ１０７が、重み０．５や０．７と対応付けられており相対的にＬＤとしてあまり適切ではないノード装置Ｎ１０８やＮ１０３よりも、優先的にＬＤとして選ばれる。その理由は、第１と第２のデータフレームの送信時の重みの学習は、ステップＳ８２８に示すように重みをなだらかに変化させるものであり、ノード装置Ｎ１０７の重みは、なおノード装置Ｎ１０８やＮ１０３の重みよりも小さいからである。
【０４６４】
そして、この時点でノード装置Ｎ１０６とＮ１０７の間の無線リンクが障害から復旧していれば、再度、ノード装置Ｎ１０７の重み０．２に減らされる。このように、多少復旧に時間がかかっても、一時的な環境の変化が過剰に重み付けテーブル１０４に反映されないため、過去の学習の成果が緩やかに反映される。したがって、適切なＬＤが選択される蓋然性も高まる。
【０４６５】
以上のとおり、一時的な障害の影響を過剰に受けないようにするため、ステップＳ８２８では、少しだけ重みが調整されるのである。
さてここで、ステップＳ８１８の分岐の説明に戻る。ステップＳ８１８で２つの条件（Ｆ１）と（Ｆ２）のいずれかが成立すると判断されると、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理は図２８のステップＳ８３０に移行する。
【０４６６】
ステップＳ８３０でデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０４６７】
具体的には、データフレーム処理部１１０は、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップＳ８０１で見つかったバッファ部１０９内のエントリに格納されているデータフレームである。ステップＳ８３０で行われる送信処理が、すなわち、バックトラック動作である。
【０４６８】
なお、ステップＳ８３０の送信の具体例は、図９のステップＳ１１０である。
ステップＳ８３０での送信後、処理はステップＳ８３１に移行する。ステップＳ８３１でデータフレーム処理部１１０は、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いてＦＩＤ管理テーブル１０５を検索する。
【０４６９】
そして、ステップＳ８３２でデータフレーム処理部１１０は、ステップＳ８３１の検索の結果、エントリがヒットしたか否かを判断する。エントリがヒットしていれば処理はステップＳ８３３に移行し、エントリがヒットしていなければ処理はステップＳ８３４に移行する。
【０４７０】
なお、ステップＳ８０７で「エントリがヒットした」と判断されている場合に、ステップＳ８３１の検索の結果見つかるエントリは、ステップＳ８０６の検索の結果見つかったエントリである。また、ステップＳ８０７で「エントリがヒットしなかった」と判定され、かつステップＳ８２３において新規エントリが作成された場合は、ステップＳ８３１の検索の結果、ステップＳ８２３で作成された新規エントリが見つかる。
【０４７１】
ステップＳ８３２で「エントリがヒットしなかった」と判断されるのは、（Ｉ１）かつ（Ｉ２）の場合であり、換言すれば、（Ｊ１）かつ（Ｊ２）の場合である。
（Ｉ１）ステップＳ８０７で「エントリがヒットしなかった」と判断された。
（Ｉ２）１回目にステップＳ８１８が実行された直後に、ステップＳ８３０に処理が移行した。
（Ｊ１）ノード装置１００が今までに受信したことのないデータフレームが受信された。
（Ｊ２）受信したデータフレームのＧＳの値に対応する重み付けテーブル１０４−ｉでは、すべてのＬＤに最大値の重みが対応付けられている。
【０４７２】
ステップＳ８３３でデータフレーム処理部１１０は、ステップＳ８３１の検索の結果ヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ヒットしたエントリにおいて、ＬＤには、ヒットしたエントリ自身のＯＬＳの値をコピーし、最終更新時刻には、現在時刻を設定する。そして処理はステップＳ８３６に移行する。
【０４７３】
他方、ステップＳ８３４では、データフレーム処理部１１０はＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ８３５でデータフレーム処理部１１０は、ステップＳ８３４で追加した新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳには、受信したデータフレームの値をそれぞれコピーし、最終更新時刻には、現在時刻を設定し、ＯＬＳとＬＤには、受信したデータフレームのＬＳの値をコピーする。そして処理はステップＳ８３６に移行する。
【０４７４】
ステップＳ８３６でデータフレーム処理部１１０は、ステップＳ８３０で送信したデータフレームに関する送信成否の通知を待つ。そして、「送信成功」または「送信失敗」の通知をデータフレーム処理部１１０がＡＣＫ処理部１０７から受けると、処理はステップＳ８３７に移行する。ステップＳ８３６はステップＳ８２５と類似しているので、詳しい説明は省略する。
【０４７５】
そして、ステップＳ８３７でデータフレーム処理部１１０は、ステップＳ８３０におけるデータフレームの送信が成功したか否かを判断する。送信が失敗した場合、処理はステップＳ８３８に移行し、送信が成功した場合、処理はステップＳ８３９に移行する。
【０４７６】
ステップＳ８３８が実行されるのは、（Ｋ１）かつ（Ｋ２）という、例外的な場合である。
（Ｋ１）ＯＬＳ以外のすべての隣接ノード装置が、（Ｋ１−１）または（Ｋ１−２）である。
（Ｋ１−１）最大値の重みと対応付けられている。
（Ｋ１−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
（Ｋ２）ＯＬＳへのデータフレームの送信（つまりバックトラック動作）は失敗した。
【０４７７】
この場合、データフレーム処理部１１０はステップＳ８３８で、受信したデータフレームを破棄する。すなわち、データフレーム処理部１１０は、ステップＳ８０１で見つけたエントリをバッファ部１０９から削除する。そして、データフレーム受信処理は終了する。
【０４７８】
なお、ステップＳ８３８の影響について、具体例とともに説明すれば以下のとおりである。
例えば、図９のステップＳ１１０は、ノード装置Ｎ３がステップＳ８３０で行う送信である。図９の例では、ステップＳ１１０でのノード装置Ｎ３からノード装置Ｎ２へのデータフレームの送信に対して、ノード装置Ｎ２がＡＣＫフレームをノード装置Ｎ３に返信する。
【０４７９】
ここで、逆に、ステップＳ１１０の時点でノード装置Ｎ２とＮ３の間のリンクに障害が発生し、ステップＳ１１０（すなわちステップＳ８３０）でノード装置Ｎ３が送信したデータフレームが、ノード装置Ｎ２には届かなかったと仮定する。すると、当然ノード装置Ｎ３がノード装置Ｎ２からＡＣＫフレームを受信することもないので、ノード装置Ｎ３は、ステップＳ８３７で「送信失敗」と判断し、ステップＳ８３８を実行する。つまり、ステップＳ１０１でノード装置Ｎ１が送信したデータフレームは、ＧＤであるノード装置Ｎ７に到達する前に、ネットワーク１内で消滅してしまう。
【０４８０】
しかも、ノード装置Ｎ２にとっては、「ステップＳ１０２で送信が成功した後、どの隣接ノード装置からも同じデータフレームは受信されていない」という状態である。したがって、ノード装置Ｎ２には、「ＧＤとしてノード装置Ｎ７が指定されているとき、ノード装置Ｎ２がＬＤとしてノード装置Ｎ３を選択することは不適切である」とは認識されない。つまり、図９の例のように、ノード装置Ｎ２が「ＧＤとしてノード装置Ｎ７が指定されているとき、ノード装置Ｎ２はＬＤとしてノード装置Ｎ６を選択するのが適切である」と学習することはできない。
【０４８１】
その結果、ＧＤとしてノード装置Ｎ７が指定されている新たな別のデータフレームをノード装置Ｎ２が受信した場合（またはそのようなデータフレームをノード装置Ｎ２がＧＳとなって送信する場合）、ノード装置Ｎ２は、ＬＤとしてノード装置Ｎ３を選択する。
【０４８２】
仮に、その時点でもまだノード装置Ｎ２とＮ３の間のリンクが障害から復旧していなければ（例えば、悪い電波状況が続いていれば）、ノード装置Ｎ２から送信されたデータフレームがノード装置Ｎ３には届かない。したがって、ノード装置Ｎ２はＡＣＫフレームを受信することができず、図２７のステップＳ８２６で「送信失敗」と判断する。
【０４８３】
その結果、ノード装置Ｎ２はステップＳ８２８で、ＧＤであるノード装置Ｎ７に対応する重み付けテーブル１０４−ｈ２−Ｎ２（この参照符号は図９の説明と同様）においてノード装置Ｎ２に対応する重みを大きくする。そして、ノード装置Ｎ２は、続くステップＳ８２９で、ＬＤとしてノード装置Ｎ６を再選択する。
【０４８４】
このように、データフレームがネットワーク１内のノード装置Ｎ３においてステップＳ８３８で破棄されると、破棄されたデータフレームに関するＯＬＳである他のノード装置Ｎ２における重み付けテーブル１０４−ｈ２−Ｎ２の学習が、遅れることがある。
【０４８５】
しかしながら、上記の例示から明らかなとおり、ノード装置Ｎ２における学習は単に少し遅れるだけである。ノード装置Ｎ２は、先のデータフレームと同じくノード装置Ｎ７をＧＤとする次のデータフレームを受信した後、その受信を契機とする一連の処理により、適切な重みを学習することができる。つまり、複数のデータフレームが次々に流通するネットワーク１全体の動作として見れば、ＯＬＳへのバックトラックのためのデータフレームの送信失敗により局所的に重みの学習が遅れるノード装置があっても、学習の遅れはすぐに挽回することができる。
【０４８６】
ここで、図２８のフローチャートの説明に戻る。ステップＳ８３９は、ＯＬＳへのデータフレームの送信に成功した場合に実行される。
ステップＳ８３９でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８３０で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。換言すれば、データフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤ（つまりステップＳ８０８またはＳ８１０で記憶したＯＬＳ）に対応する重みを更新する。
【０４８７】
ステップＳ８３９の詳細はステップＳ８２７と同様なので詳しい説明は省略するが、データフレーム処理部１１０は、例えば式（６）を使って重みを更新してもよい。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０４８８】
次に、受信されたデータフレームが到達保証データフレームまたは到達保証ＡＣＫフレームである場合の処理について、以下に説明する。この場合には、図２５のステップＳ８０３ｃの判定がＹｅｓとなって図２９ＡのステップＳ１３０１が実行される。これ以降の到達保証関連の処理は、図６の到達保証ＡＣＫ処理部１１４によって実行される。
【０４８９】
まず、到達保証ＡＣＫ処理部１１４は、受信されているデータフレームのデータヘッダ３３２および到達保証ヘッダ３３３（図１０参照）から、ＧＳ、到達保証ＩＤ、およびポート番号を抽出する。到達保証ＡＣＫ処理部１１４は、ＧＳ、到達保証ＩＤ、およびポート番号の組をキーとして、到達保証転送記録テーブル１１５を検索する。
【０４９０】
ステップＳ１３０２で到達保証ＡＣＫ処理部１１４は、この検索でいずれかのエントリがヒットしたか否かを判定する。
エントリがヒットすると、到達保証ＡＣＫ処理部１１４は、ステップＳ１３０３に移行する。ステップＳ１３０３で到達保証ＡＣＫ処理部１１４は、ヒットしたエントリの中でイベント時刻が最新のエントリに注目する。例えば、図２Ｂの例において、到達保証ＡＣＫ処理部１１４がノードＢにあるとすれば、イベント時刻Ｔ１５にＧＳ＝ノードＡ、到達保証ＩＤ＝１、ポート番号＝１５で到達保証転送記録テーブル１１５Ｂを検索した場合、最新のイベント時刻＝Ｔ１２のエントリが注目される。なお、時刻Ｔ１５のエントリはまだ存在しない。
【０４９１】
次に、ステップＳ１３０４で到達保証ＡＣＫ処理部１１４は、注目したエントリの到達保証転送情報の内容を判定する。例えば、図２Ｂの例において、到達保証転送記録テーブル１１５Ｂの最新のイベント時刻＝Ｔ１２のエントリの到達保証転送情報の内容は、「あり」である。このように、到達保証転送情報の内容が「あり」または「送信元」である場合、言い換えれば、そのノードで既に到達保証データフレームが受信されている状態で、新たな到達保証フレームが受信された場合には、ステップＳ１３０５に移行する。
【０４９２】
一方、到達保証転送情報の内容が「なし」である場合、言い換えれば、そのノードで既に到達保証ＡＣＫフレームが受信されている状態で、新たな到達保証フレームが受信された場合には、図２９ＣのステップＳ１３１６に移行する。
【０４９３】
ステップＳ１３０５で到達保証ＡＣＫ処理部１１４は、受信したデータフレームの到達保証フラグと到達保証ＡＣＫフレームを読み取る。
続くステップＳ１３０６で到達保証ＡＣＫ処理部１１４は、到達保証フラグの値が１であるか０であるか、すなわち受信フレームが到達保証データフレームであるか到達保証ＡＣＫフレームであるかを判定する。
【０４９４】
到達保証フラグの値が１、すなわち受信フレームが到達保証データフレームである場合には、ステップＳ１３０７で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームのＧＤの値が自ノードＩＤであるか否かを判定する。
【０４９５】
ステップＳ１３０７の判定がＹｅｓの場合には、ステップＳ１３０９に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０４９６】
＜状態１＞
・ＧＤとして到達保証データフレームを既に受信している。
・自ノード宛ての同じ到達保証データフレームが新たに受信された。
【０４９７】
この状態１において、まずステップＳ１３０９で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝ＡＣＫ送信元
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０４９８】
次に状態１において、ステップＳ１３１０で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの送信処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＤ：受信した到達保証データフレームのＧＳ
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
を設定する。なお、状態１は、自ノードＩＤがＧＳとして指定された到達保証ＡＣＫフレームが送信済みであることを含意するので、ステップＳ１３１０の処理は、何らかの不測のエラーが生じた場合の例外処理である。
【０４９９】
また、例外処理としてのステップＳ１３１０において到達保証ＡＣＫ処理部１１４が上記のように到達保証ＡＣＫフレームのＬＤフィールドを設定する理由は、一時的な経路の揺らぎの影響を受けないようにするためである。すなわち、到達保証ＡＣＫ処理部１１４は、正常な処理が行われたときの経路への到達保証ＡＣＫフレームの送信を企図して、今回の例外処理の契機となった受信におけるＬＳのノードではなく、以前行われた処理で作成されたエントリ（ステップＳ１３０３で注目したエントリ）のＬＳのノードを、到達保証ＡＣＫフレームのＬＤフィールドに指定する。
【０５００】
なお、後述のＳ１３３６、Ｓ１３５１、Ｓ１３５５の処理は、このステップＳ１３１０のような例外処理ではなく、自ノードＩＤがＧＤとして指定された到達保証データフレームを初めて受信したときの正常な処理である。そのため、後述のＳ１３３６、Ｓ１３５１、Ｓ１３５５では、送信される到達保証ＡＣＫフレームのＬＤフィールドには、到達保証転送記録テーブル１１５の既存のエントリのＬＳフィールドの値ではなく、受信した到達保証データフレームのＬＳフィールドの値が設定される。
【０５０１】
また、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＳ：受信した到達保証データフレームのＧＤ
・ＬＳ：自ノードＩＤ
を設定する。更に、送信される到達保証ＡＣＫフレームに、到達保証ＩＤとポート番号、スタートフラグと終了フラグを付加し、その到達保証ＡＣＫフレームを送信する。
【０５０２】
最後に状態１において、ステップＳ１３１１で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームを廃棄して、データフレームの受信処理を終了する。
以上の状態１は、既にＧＤである自ノードにおいて到達保証データフレームが受信されている状態において、自ノード宛ての同じ到達保証データフレームが新たに受信された状態である。本来は、既にＧＤである自ノードにおいて到達保証データフレームが受信された段階で到達保証ＡＣＫフレームが送信済みであってステップＳ１３０４の判定がＹｅｓとならないはずである。しかし、タイミングの問題でこの状態１が発生する可能性があるため、その場合には、到達保証ＡＣＫフレームの返信処理のみが行われる。
【０５０３】
ステップＳ１３０７の判定がＮｏの場合には、ステップＳ１３０８に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５０４】
＜状態２＞
・中継ノードとして到達保証データフレームを既に受信し転送している。
・同じ到達保証データフレームが新たに受信された。
【０５０５】
この状態２において、まずステップＳ１３０８で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝あり
・到達保証ＡＣＫ受信情報＝なし
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５０６】
その後、図６において、到達保証ＡＣＫ処理部１１４は、受信したフレームの処理をデータフレーム処理部１１０に戻し、前述の図２６のステップＳ８０６以降のデータフレームの転送処理を実行させる。
【０５０７】
このようにして、受信したデータフレームについて、既に転送された記録があり、かつ到達保証ＡＣＫフレームがまだ受信されていなければ、そのデータフレームはＧＤに向けてさらに転送されることになる。
【０５０８】
具体的には、状態２は例えば、図２Ａ又は図２Ｂの時刻Ｔ１５でのノードＢの処理が該当する。すなわち、ノードＢは、受信された到達保証データフレームＤ１１１から、ＧＳとポート番号と到達保証ＩＤを抽出し、これらの値の組をキーとして図２Ｂの到達保証転送記録テーブル１１５Ｂを検索する。この結果、イベント時刻＝Ｔ１２のエントリ（時刻Ｔ１５のエントリはまだ生成されていない）が参照される。そして、このエントリから、到達保証転送情報＝「あり」で、かつ到達保証ＡＣＫ受信情報＝「なし」が検出される。これにより、すでに到達保証データフレームＤ１１１が転送されているが、それに対応する到達保証ＡＣＫフレームが未だ受信されていないことがわかる。これを受けてノードＢは、今回の時刻Ｔ１５に受信した到達保証データフレームＤ１１１の再送フレームを、再度次のノードＣに転送する。この結果、到達保証データフレームの再送フレームがノードＢからノードＣに転送され、時刻Ｔ１６にノードＣで受信される。
【０５０９】
ステップＳ１３０６の判定で、到達保証フラグの値が０、すなわち受信フレームが到達保証ＡＣＫフレームであると判定された場合には、図２９ＢのステップＳ１３１２に移行する。
【０５１０】
ステップＳ１３１２で到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームのＧＤの値が自ノードＩＤであるか否かを判定する。
ステップＳ１３１２の判定がＹｅｓの場合には、ステップＳ１３１３ａに移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５１１】
＜状態３＞
・自ノードがＧＳとして到達保証データフレームを既に送信している。
・そのフレームに対する自ノード宛ての到達保証ＡＣＫフレームが受信された。
【０５１２】
この状態３において、まずステップＳ１３１３ａで到達保証ＡＣＫ処理部１１４は、図６の再送信バッファ１１７から、受信した到達保証ＡＣＫフレームに該当するエントリを削除する。より具体的には、到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームから、ＧＤ（自ノード）、ポート番号、および到達保証ＩＤを抽出し、それらの値組をキーとして例えば図１７の例の再送信バッファ１１７のエントリ（到達保証データフレーム）を検索し削除する。
【０５１３】
その後、ステップＳ１３１３ｂで到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームを削除する。特には図示しないが、到達保証ＡＣＫ処理部１１４は、図６の上位層処理部１１１に対して、該当する到達保証データフレームの送信が成功したことを通知して、データフレームの受信処理を終了する。
【０５１４】
具体的には、状態３は例えば、図１Ａ又は図１Ｂの時刻Ｔ５でのノードＡの処理が該当する。すなわち、ノードＡは、時刻Ｔ５でノードＢから到達保証ＡＣＫフレームＧ１０１を受信する。このとき、到達保証転送記録テーブル１１５Ａ上でのイベント時刻＝Ｔ１のエントリの存在により、状態３の条件が成立する。この結果、図６の再送信バッファ１１７から、ＧＤ＝ノードＡ、ポート番号＝１、到達保証ＩＤ＝１のエントリ（到達保証データフレーム）が削除される。受信された到達保証ＡＣＫフレームＧ１０１も、不要なので削除される。
【０５１５】
ステップＳ１３１２の判定がＮｏの場合には、ステップＳ１３１４に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５１６】
＜状態４＞
・自ノードが中継ノードとして到達保証データフレームを既に受信・転送している。
・そのフレームに対する他ノード宛ての到達保証ＡＣＫフレームが受信された。
【０５１７】
この状態４において、まずステップＳ１３１４で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝あり
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５１８】
次に状態４において、ステップＳ１３１５で到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームの転送（送信）処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、転送される到達保証ＡＣＫフレームにおいて、
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
・ＬＳ：自ノードＩＤ
の変更を実施した上で、次のノードに転送し、データフレームの受信処理を終了する。
【０５１９】
なお、このステップＳ１３１５において到達保証ＡＣＫ処理部１１４が上記のように到達保証ＡＣＫフレームのＬＤフィールドを設定する理由は、次のとおりである。すなわち、ステップＳ１３０３で注目したエントリは、到達保証データフレームの正常な転送時に作成されたと推定される。よって、当該エントリのＬＳフィールドの値は、到達保証データフレームの送信経路を遡るようにして到達保証ＡＣＫフレームを送信するという目的のためにＬＤとして選択すべきノードのノードＩＤそのものである。そのため、ステップＳ１３１５では、到達保証ＡＣＫ処理部１１４は、上記のように到達保証ＡＣＫフレームのＬＤフィールドを設定する。
【０５２０】
図２９Ａに戻り、ステップＳ１３０４で、到達保証転送記録テーブル１１５で注目したエントリの到達保証転送情報の内容が「なし」である場合、図２９ＣのステップＳ１３１６に移行する。この場合は言い換えれば、そのノードで既に到達保証ＡＣＫフレームが受信または送信されている状態で、新たな到達保証フレームが受信された場合である。
【０５２１】
ステップＳ１３１６で到達保証ＡＣＫ処理部１１４は、受信したデータフレームの到達保証フラグと到達保証ＡＣＫフレームを読み取る。
続くステップＳ１３１７で到達保証ＡＣＫ処理部１１４は、到達保証フラグの値が１であるか０であるか、すなわち受信フレームが到達保証データフレームであるか到達保証ＡＣＫフレームであるかを判定する。
【０５２２】
到達保証フラグの値が１、すなわち受信フレームが到達保証データフレームである場合には、ステップＳ１３１８で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームのＧＤの値が自ノードＩＤであるか否かを判定する。
【０５２３】
ステップＳ１３１８の判定がＹｅｓの場合には、ステップＳ１３２１に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５２４】
＜状態５＞
・ＧＤとして到達保証ＡＣＫフレームを既に送信している。
・自ノード宛ての同じ到達保証データフレームが新たに受信された。
【０５２５】
この状態５において、まずステップＳ１３２１で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝ＡＣＫ送信元
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５２６】
次に状態５において、ステップＳ１３２２で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの送信処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＤ：受信した到達保証データフレームのＧＳ
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
を設定する。なお、本実施形態の到達保証ＡＣＫ処理部１１４が上記のように到達保証ＡＣＫフレームのＬＤフィールドを設定する理由は、一時的な経路の揺らぎの影響を受けないようにするためである。詳しく理由を説明すると、次のとおりである。
【０５２７】
ステップＳ１３２２の処理が行われるのは、例えば、以下のような状況下においてである。
・今回受信したのと同じ到達保証データフレームを以前に受信したときに、既に到達保証ＡＣＫフレームを送信した。
・しかし、到達保証ＡＣＫフレームは、フェージングによる無線リンクの品質悪化などの何らかの理由で、到達保証データフレームのＧＳであるノードには届かなかった。
・そのせいで、到達保証データフレームが再送され、今回、以前受信したのと同じ到達保証データフレームが受信された。
【０５２８】
よって、本実施形態の到達保証ＡＣＫ処理部１１４は、一時的な経路の揺らぎの影響を避けるために、ステップＳ１３２２では、上記のとおり、以前行われた処理で作成されたエントリ（ステップＳ１３０３で注目したエントリ）のＬＳの値を、到達保証ＡＣＫフレームのＬＤフィールドに指定する。
【０５２９】
また、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＳ：受信した到達保証データフレームのＧＤ
・ＬＳ：自ノードＩＤ
を設定する。更に、送信される到達保証ＡＣＫフレームに、到達保証ＩＤとポート番号、スタートフラグと終了フラグを付加し、その到達保証ＡＣＫフレームを送信する。
【０５３０】
最後に状態５において、ステップＳ１３２３で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームを廃棄して、データフレームの受信処理を終了する。
以上の状態５は、既にＧＤである自ノードにおいて到達保証データフレームが受信されてそれに対応する到達保証ＡＣＫフレームが送信されたにもかかわらず、自ノード宛ての同じ到達保証データフレームが新たに受信された状態である。可能性としては、自ノードが送信した到達保証ＡＣＫフレームが、何らかのネットワーク障害によりＧＳまで到達せず、再送タイムアウトによりＧＳが到達保証ＡＣＫフレームを再送した場合が考えられる。
【０５３１】
具体的には、状態５は例えば、図２Ａ又は図２Ｂの時刻Ｔ１６でのノードＣの処理が該当する。すなわち、ノードＣは、時刻Ｔ１３以後、到達保証データフレームＤ１１１に対応する到達保証ＡＣＫフレームＧ１１１を返送するが、フェージング等の影響によりノードＣからノードＢに向かう無線リンクの品質が悪化し、到達保証ＡＣＫフレームＧ１１１がノードＢに到達しなかったとする。これにより、ノードＡは、到達保証データフレームＤ１１１を再送する。この到達保証データフレームの再送フレームは、ノードＢからノードＣに転送され、時刻Ｔ１６にノードＣで受信される。この時点で、状態５の条件が成立する。ノードＣは、時刻Ｔ１６以後、再送フレームＤ１１１に対応する到達保証ＡＣＫフレームＧ１１１を再度返送するが、今度はノードＣからノードＢに向かう無線リンクの品質が回復し、到達保証ＡＣＫフレームＧ１１１がノードＢを介してノードＡまで到達する。
【０５３２】
ステップＳ１３１８の判定がＮｏの場合には、ステップＳ１３１９に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５３３】
＜状態６＞
・中継ノードとして到達保証ＡＣＫフレームを既に受信し転送している。
・同じ到達保証データフレームが新たに受信された。
【０５３４】
この状態６において、まずステップＳ１３１９で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝ＡＣＫ切替応答
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５３５】
次に状態６において、ステップＳ１３２０で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの送信処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＤ：受信した到達保証データフレームのＧＳ
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
を設定する。このステップＳ１３２０でも、到達保証ＡＣＫ処理部１１４は、一時的な経路の揺らぎの影響を受けないようにするために、上記のとおり、以前行われた処理で作成されたエントリ（ステップＳ１３０３で注目したエントリ）のＬＳの値を、到達保証ＡＣＫフレームのＬＤフィールドに指定する。
【０５３６】
また、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＳ：受信した到達保証データフレームのＧＤ
・ＬＳ：自ノードＩＤ
を設定する。更に、送信される到達保証ＡＣＫフレームに、到達保証ＩＤとポート番号、スタートフラグと終了フラグを付加し、その到達保証ＡＣＫフレームを送信する。
【０５３７】
最後に状態６において、ステップＳ１３２３で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームを廃棄して、データフレームの受信処理を終了する。
以上の状態６は、既に中継ノードである自ノードにおいて、到達保証データフレームが受信されて転送され、それに対応する到達保証ＡＣＫフレームが受信されて転送されているにもかかわらず、同じ到達保証データフレームが新たに受信された状態である。可能性としては、自ノードが送信した到達保証ＡＣＫフレームが、何らかのネットワーク障害によりＧＳまで到達せず、再送タイムアウトによりＧＳが到達保証ＡＣＫフレームを再送した場合が考えられる。
【０５３８】
具体的には、状態６は例えば、図３Ａ又は図３Ｂの時刻Ｔ１６でのノードＣの処理が該当する。すなわち、時刻Ｔ２４において、フェージング等の影響によりノードＢからノードＡに向かう無線リンクの品質が悪化し、到達保証ＡＣＫフレームＧ１２１がノードＡに到達しなかったとする。これにより、ノードＡにおいて、時刻Ｔ２５で、再送のためのタイムアウトが発生し、ノードＡは、到達保証データフレームＤ１２１を再送する。ノードＢは、再送された到達保証データフレームＤ１２１から、ＧＳとポート番号と到達保証ＩＤを抽出し、これらの値の組をキーとして図３Ｂの到達保証転送記録テーブル１１５Ｂ上で最新のエントリを検索する。この結果、イベント時刻＝Ｔ２４のエントリ（時刻Ｔ２２はＴ２４より古く、時刻Ｔ２６のエントリはまだ生成されていない）が参照される。そして、このエントリから、到達保証転送情報＝「なし」で、かつ到達保証ＡＣＫ受信情報＝「あり」が検出される。これにより、状態６の条件が成立する。その結果、ノードＢは、今回の時刻Ｔ２６に受信した到達保証データフレームＤ１２１の再送フレームは、ノードＣには転送せず、代わりに、到達保証ＡＣＫフレームＧ１２１を、ノードＡに再送する。
【０５３９】
このようにして、到達保証ＡＣＫフレーム自体の転送が途中で失敗した場合でも、再送によるトラフィック増加の影響を、到達保証ＡＣＫフレームの転送が失敗したノードまでに留めることが可能となる。
【０５４０】
ステップＳ１３１７の判定で、到達保証フラグの値が０、すなわち受信フレームが到達保証ＡＣＫフレームであると判定された場合には、図２９ＤのステップＳ１３２４に移行する。
【０５４１】
ステップＳ１３２４で到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームのＧＤの値が自ノードＩＤであるか否かを判定する。
ステップＳ１３２４の判定がＹｅｓの場合には、ステップＳ１３２５に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５４２】
＜状態７＞
・自ノードがＧＳとして到達保証ＡＣＫフレームを既に送信している。
・そのフレームに対する自ノード宛ての到達保証ＡＣＫフレームが再度受信された。
【０５４３】
この状態７において、ステップＳ１３２５で到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームを廃棄し、データフレームの受信処理を終了する。
ステップＳ１３２４の判定がＮｏの場合には、ステップＳ１３２６に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５４４】
＜状態８＞
・自ノードが中継ノードとして到達保証ＡＣＫフレームを既に受信・転送している。
・そのフレームに対する他ノード宛ての到達保証ＡＣＫフレームが再度受信された。
【０５４５】
この状態８において、まずステップＳ１３２６で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝あり
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５４６】
次に状態８において、ステップＳ１３２７で到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームの転送（送信）処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、転送される到達保証ＡＣＫフレームにおいて、
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
・ＬＳ：自ノードＩＤ
の変更を実施した上で、次のノードに転送し、データフレームの受信処理を終了する。
【０５４７】
図２９Ａに戻り、ステップＳ１３０２でエントリがヒットしないと判定されると、図２９ＥのステップＳ１３２８に移行する。
ステップＳ１３２８で到達保証ＡＣＫ処理部１１４は、受信したデータフレームの到達保証フラグと到達保証ＡＣＫフレームを読み取る。
【０５４８】
続くステップＳ１３２９で到達保証ＡＣＫ処理部１１４は、到達保証フラグの値が１であるか０であるか、すなわち受信フレームが到達保証データフレームであるか到達保証ＡＣＫフレームであるかを判定する。
【０５４９】
到達保証フラグの値が１、すなわち受信フレームが到達保証データフレームである場合には、ステップＳ１３３１で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームのＧＤの値が自ノードＩＤであるか否かを判定する。
【０５５０】
ステップＳ１３３１の判定がＹｅｓの場合には、図２９ＦのステップＳ１３３３に移行する。この処理については後述する。
ステップＳ１３３１の判定がＮｏの場合には、ステップＳ１３３２に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５５１】
＜状態９＞
・中継ノードとして到達保証データフレームをまだ受信していない。
・到達保証データフレームが初めて受信された。
【０５５２】
この状態９において、まずステップＳ１３３２で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝あり
・到達保証ＡＣＫ受信情報＝なし
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５５３】
その後、図６において、到達保証ＡＣＫ処理部１１４は、受信したフレームの処理をデータフレーム処理部１１０に戻し、前述の図２６のステップＳ８０６以降のデータフレームの転送処理を実行させる。
【０５５４】
具体的には、状態９は例えば、図１Ａ又は図１Ｂの時刻Ｔ２でのノードＢの処理に該当する。
ステップＳ１３２９で到達保証ＡＣＫ処理部１１４は、到達保証フラグの値が０、すなわち受信フレームが到達保証ＡＣＫフレームである場合には、ステップＳ１３３０に移行する。この場合、到達保証転送記録テーブル１１５にエントリの無い（他の経路の）到達保証ＩＤを持つ到達保証データフレームに対応する到達保証ＡＣＫフレームを受け取ったことになる。この場合には、ステップＳ１３３０で到達保証ＡＣＫ処理部１１４は、受信した到達保証ＡＣＫフレームを廃棄して、データフレームの受信処理を終了する。
【０５５５】
ステップＳ１３３１の判定がＹｅｓの場合には、図２９ＦのステップＳ１３３３に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５５６】
＜状態１０＞
・ＧＤとして到達保証データフレームをまだ受信していない。
・自ノード宛ての到達保証データフレームが初めて受信された。
【０５５７】
この状態１０においては、受信された到達保証データフレームを順次図６の組立バッファ１１６に展開して送信されたデータを組み立ててゆく処理が実行される。
まず、ステップＳ１３３３で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームに格納されている到達保証ヘッダ３３３中のスタートフラグと終了フラグを読み取る。
【０５５８】
次に、ステップＳ１３３４で到達保証ＡＣＫ処理部１１４は、スタートフラグが１であるか０であるかを判定する。
スタートフラグが１である場合、すなわち受信した到達保証データフレームが複数に分割されたデータフレーム群の先頭フレームであった場合には、ステップＳ１３３５に移行する。この移行状態は、受信フレームに関連するＧＳ、到達保証ＩＤ、およびポート番号の組合せについて、下記の条件が成立している状態である。
【０５５９】
＜状態１１＞
・ＧＤとして到達保証データフレームは今まで受信していない。
・自ノード宛ての到達保証データフレームが初めて受信された。
【０５６０】
この状態１１において、まずステップＳ１３３５で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝ＡＣＫ送信元
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５６１】
次に状態１１において、ステップＳ１３３６で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの送信処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＤ：受信した到達保証データフレームのＧＳ
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
を設定する。また、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＳ：受信した到達保証データフレームのＧＤ
・ＬＳ：自ノードＩＤ
を設定する。更に、送信される到達保証ＡＣＫフレームに、到達保証ＩＤとポート番号、スタートフラグと終了フラグを付加し、その到達保証ＡＣＫフレームを送信する。
【０５６２】
次に、ステップＳ１３３７で到達保証ＡＣＫ処理部１１４は、終了フラグが１であるか０であるかを判定する。
終了フラグが１である場合、すなわち受信した到達保証データフレームが先頭フレームであると同時に末尾フレームである、つまり分割数が１の単一フレームであった場合には、図２５のステップＳ８０５に移行する。ここでは、受信された単一フレームのペイロードの内容が取り出され、図６の上位層処理部１１１に引き渡されて、データフレームの受信処理を終了する。
【０５６３】
一方、終了フラグが０である場合、すなわち受信した到達保証データフレームが先頭フレームである場合には、ステップＳ１３３８に移行する。
ステップＳ１３３８で到達保証ＡＣＫ処理部１１４は、到達保証データフレームにおける到達保証ヘッダ３３３からポート番号を読み取る。
【０５６４】
次に、ステップＳ１３３９で到達保証ＡＣＫ処理部１１４は、到達保証データフレームにおける到達保証ヘッダ３３３に格納されているＧＳと上述のポート番号とで識別可能な組立バッファ１１６のエントリを作成する。すなわち、例えば図１８に示される組立バッファ１１６において、ＧＳとポート番号とで決まる、複数のペイロードを格納可能なエントリが作成される。
【０５６５】
最後に、ステップＳ１３４０で到達保証ＡＣＫ処理部１１４は、組立バッファ１１６に作成したエントリに、受信した到達保証データフレームのペイロードを保存し、タイムアウト時刻に対応するタイマ値を設定し、データフレームの受信処理を終了する。
【０５６６】
ステップＳ１３３４の判定がＮｏ、すなわち受信された到達保証データフレームが複数に分割されたデータフレーム群の先頭フレームではない場合には、図２９ＧのステップＳ１３４１に移行する。
【０５６７】
ステップＳ１３４１で到達保証ＡＣＫ処理部１１４は、まず到達保証データフレームにおける到達保証ヘッダ３３３からポート番号を読み取る。
次に、ステップＳ１３４２で到達保証ＡＣＫ処理部１１４は、受信された到達保証データフレームのデータヘッダ３３２（図１０）から取り出されるＧＳと、ステップＳ１３４１で得られたポート番号を用いて、組立バッファ１１６を検索する。組立バッファ１１６は、例えば前述したように、図１８に示されるような構成例を有する。
【０５６８】
ステップＳ１３４３で到達保証ＡＣＫ処理部１１４は、ステップＳ１３４２での検索の結果、組立バッファ１１６に該当するエントリが存在するか否かを判定する。
組立バッファ１１６に該当するエントリが存在しなければステップＳ１３４４に移行して、到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームを破棄し、データフレームの受信処理を終了する。
【０５６９】
この状態は、先頭でも末尾でもない分割フレームを受信したが、追加すべき組立バッファ１１６のエントリが見つからないエラー状態である。
組立バッファ１１６に該当するエントリが存在しステップＳ１３４３の判定がＹＥＳならば、ステップＳ１３４５で到達保証ＡＣＫ処理部１１４は、図２９ＦのステップＳ１３３３で取得した終了フラグが１であるか０であるかを判定する。
【０５７０】
終了フラグが１である、すなわち受信された到達保証データフレームが分割されたデータフレーム群の末尾のフレームであった場合には、ステップＳ１３４６に移行する。ステップＳ１３４６で到達保証ＡＣＫ処理部１１４は、組立バッファ１１６に保存されているフレームを、図１８の例として示される、スタートフラグが１のフレームから、終了フラグが１のフレームまで、到達保証ＩＤ順に連番で組み立てることを試みる。
【０５７１】
ステップＳ１３４７で到達保証ＡＣＫ処理部１１４は、連番での組立に成功したか否かを判定する。
連番での組立に成功した場合、ステップＳ１３５０に移行する。まずステップＳ１３５０で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝ＡＣＫ送信元
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５７２】
次に、ステップＳ１３５１で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの送信処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＤ：受信した到達保証データフレームのＧＳ
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
を設定する。また、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＳ：受信した到達保証データフレームのＧＤ
・ＬＳ：自ノードＩＤ
を設定する。更に、送信される到達保証ＡＣＫフレームに、到達保証ＩＤとポート番号、スタートフラグと終了フラグを付加し、その到達保証ＡＣＫフレームを送信する。
【０５７３】
続いて、ステップＳ１３５２で到達保証ＡＣＫ処理部１１４は、組立バッファ１１６において、ステップＳ１３４２で見つかったエントリを削除する。
その後、図２５のステップＳ８０５に移行する。ここでは、ステップＳ１３４６で組み立てられたデータが、図６の上位層処理部１１１に引き渡されて、データフレームの受信処理を終了する。
【０５７４】
ステップＳ１３４７での連番での組立に成功した場合、ステップＳ１３４８に移行する。まずステップＳ１３４８で到達保証ＡＣＫ処理部１１４は、受信した到達保証データフレームを破棄する。
【０５７５】
そして、ステップＳ１３４９で到達保証ＡＣＫ処理部１１４は、組立バッファ１１６において、ステップＳ１３４２で見つかったエントリを削除して、データフレームの受信処理を終了する。
【０５７６】
この場合、分割フレームの組立に失敗したことになるが、送信元の再送回数以内であれば最初から各到達保証データフレームが再送し直されてやり直されることになる。
ステップＳ１３４５の判定で終了フラグが０である、すなわち受信された到達保証データフレームが分割されたデータフレーム群の途中のフレームであった場合には、図２９ＨのステップＳ１３５３に移行する。
【０５７７】
ステップＳ１３５３で到達保証ＡＣＫ処理部１１４は、図１０の例の組立バッファ１１６に、受信した到達保証データフレームのペイロードを含むエントリを追加し、タイマ値を初期値に戻す。
【０５７８】
次にステップＳ１３５４で到達保証ＡＣＫ処理部１１４は、到達保証転送記録テーブル１１５への登録を、次のようにして実行する。すなわち、到達保証ＡＣＫ処理部１１４は、
・到達保証転送記録情報＝なし
・到達保証ＡＣＫ受信情報＝ＡＣＫ送信元
とした上で、受信したデータフレームのＧＳ、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＬＳ、イベント時刻＝現在時刻を、到達保証転送記録テーブル１１５上に追加したエントリに登録する。
【０５７９】
次に、ステップＳ１３５５で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの送信処理を実行する。この場合、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＤ：受信した到達保証データフレームのＧＳ
・ＬＤ：ステップＳ１３０３で注目したエントリのＬＳ
を設定する。また、到達保証ＡＣＫ処理部１１４は、送信される到達保証ＡＣＫフレームにおいて、
・ＧＳ：受信した到達保証データフレームのＧＤ
・ＬＳ：自ノードＩＤ
を設定する。更に、送信される到達保証ＡＣＫフレームに、到達保証ＩＤとポート番号、スタートフラグと終了フラグを付加し、その到達保証ＡＣＫフレームを送信してデータフレームの受信処理を終了する。
【０５８０】
図３０Ａは、図２９Ａ〜Ｈのフローチャートにおける下記の各ステップで実行される到達保証転送記録テーブルへの記録処理の詳細を示すフローチャートである。
図２９Ａ  Ｓ１３０８、Ｓ１３０９
図２９Ｂ  Ｓ１３１４
図２９Ｃ  Ｓ１３１９、Ｓ１３２１
図２９Ｄ  Ｓ１３２６
図２９Ｅ  Ｓ１３３２
図２９Ｆ  Ｓ１３３５
図２９Ｇ  Ｓ１３５０
図２９Ｈ  Ｓ１３５４
【０５８１】
この処理が到達保証ＡＣＫ処理部１１４によって実行されるときには、到達保証転送記録情報の値と、到達保証ＡＣＫ受信情報の値が上記各ステップの処理において指定されている。
【０５８２】
まず、ステップＳ１４０１で到達保証ＡＣＫ処理部１１４は、新規エントリを、到達保証転送記録テーブル１１５に追加する。
次に、ステップＳ１４０２で到達保証ＡＣＫ処理部１１４は、追加したエントリにおいて、到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグ、ＧＳ、ＬＳの各フィールドに、受信した到達保証データフレームにおけるそれぞれの値を設定する。
【０５８３】
続いて、ステップＳ１４０３で到達保証ＡＣＫ処理部１１４は、追加したエントリの到達保証転送記録情報に、指定された値を設定する。
また、ステップＳ１４０４で到達保証ＡＣＫ処理部１１４は、追加したエントリの到達保証ＡＣＫ受信情報に、指定された値を設定する。
さらに、ステップＳ１４０５で到達保証ＡＣＫ処理部１１４は、追加したエントリのイベント時刻に、現在時刻を設定する。
なお、到達保証転送記録テーブル１１５の例は、図１Ｂ、図２Ｂ、図３Ｂ等で示した。
【０５８４】
図３０Ｂは、図２９Ａ〜Ｈのフローチャートにおける下記の各ステップで実行される到達保証ＡＣＫ送信処理の詳細を示すフローチャートである。
図２９Ａ  Ｓ１３１０
図２９Ｃ  Ｓ１３２０、Ｓ１３２２
図２９Ｆ  Ｓ１３３６
図２９Ｇ  Ｓ１３５１
図２９Ｈ  Ｓ１３５５
【０５８５】
まず、ステップＳ１５０１で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレーム用にメモリ領域を確保する。
次に、ステップＳ１５０２で到達保証ＡＣＫ処理部１１４は、指定されたＧＤ設定値を、到達保証ＡＣＫフレームのＧＤに設定する。
次に、ステップＳ１５０３で到達保証ＡＣＫ処理部１１４は、自ノードＩＤを、到達保証ＡＣＫフレームのＧＳとＬＳに設定する。
【０５８６】
また、ステップＳ１５０４で到達保証ＡＣＫ処理部１１４は、指定されたＬＤ設定値を、到達保証ＡＣＫフレームのＬＤに設定する。
次に、ステップＳ１５０５で到達保証ＡＣＫ処理部１１４は、新たなＦＩＤを生成し、到達保証ＡＣＫフレームに設定する。
【０５８７】
次に、ステップＳ１５０６で到達保証ＡＣＫ処理部１１４は、「データフレーム」を示す値を、到達保証ＡＣＫフレームのタイプとして設定する。
また、ステップＳ１５０７で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫフレームの長さ、到達保証フラグ、到達保証ＡＣＫフラグに、それぞれ０、０、１を設定する。
【０５８８】
さらに、ステップＳ１５０８で到達保証ＡＣＫ処理部１１４は、受信したデータフレームの到達保証ＩＤ、ポート番号、スタートフラグ、終了フラグを、到達保証ＡＣＫフレームにそれぞれコピーする。
そして、ステップＳ１５０９で到達保証ＡＣＫ処理部１１４は、生成した到達保証ＡＣＫフレームを送信する。
【０５８９】
続いて、図３１を参照して、図２６のステップＳ８１２ａの重み付けテーブル調整処理の詳細を説明する。なお、図３１の重み付けテーブル調整処理は、後述の図３４ＢのステップＳ１１０８ａでも呼び出される。図３１の説明において「ヒットした重み付けテーブル１０４−ｉ」とは、図２６のステップＳ８１１の検索または図３４ＢのステップＳ１１０７の検索でヒットしたテーブルを意味する。
【０５９０】
ステップＳ８５１でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３（図１２参照）の１つ目のエントリに注目する。なお、以下の図３１の説明において、データフレーム処理部１１０が注目している隣接ノード管理テーブル１０３のエントリを「注目エントリ」という。
【０５９１】
次に、ステップＳ８５２では、ヒットした重み付けテーブル１０４−ｉに注目エントリのノードＩＤの値をＬＤとして含むエントリがあるか否かを、データフレーム処理部１１０が判断する。ヒットした重み付けテーブル１０４−ｉに、注目エントリのノードＩＤの値をＬＤとして含むエントリがあれば、処理はステップＳ８５５に移行する。逆に、ヒットした重み付けテーブル１０４−ｉに、注目エントリのノードＩＤの値をＬＤとして含むエントリがなければ、処理はステップＳ８５３に移行する。
【０５９２】
ステップＳ８５３でデータフレーム処理部１１０は、ヒットした重み付けテーブル１０４−ｉに新規エントリを追加する。
続いてステップＳ８５４でデータフレーム処理部１１０は、ステップＳ８５３で重み付けテーブル１０４−ｉに追加した新規エントリに値を設定する。つまり、データフレーム処理部１１０は、新規エントリにおいて、隣接ノード管理テーブル１０３の注目エントリのノードＩＤの値をＬＤフィールドに、初期重み付け値を重みフィールドに、現在時刻を最終更新時刻フィールドに、それぞれ設定する。
【０５９３】
なお、ステップＳ８５４における初期重み付け値は、図２０のステップＳ３０８における初期重み付け値とは異なる。具体的には、ステップＳ８５４での初期重み付け値は、ヒットした重み付けテーブル１０４−ｉの重みフィールドにおいて、１未満の重みのうちの最大値である。
【０５９４】
例えば、ヒットした重み付けテーブル１０４−ｉの重みフィールドに４つのエントリが存在し、それぞれの重みフィールドの値が０．４、０．７、１、および０．５であれば、ステップＳ８５４での初期重み付け値は、０．７である。なお、ヒットした重み付けテーブル１０４−ｉの重みフィールドの値が、全エントリで１の場合は、ステップＳ８５４での初期重み付け値は、１未満の任意の値であり、例えば図２０のステップＳ３０８での初期重み付け値と同様に０．５でもよい。
【０５９５】
以上のような初期重み付け値をステップＳ８５４で用いることにより、重み付けテーブル１０４−ｉの既存のエントリに反映されている学習結果が優先的に考慮される。その結果、経路が必要以上に変動することがなくなり、換言すれば、経路が安定する。
【０５９６】
例えば、４つのエントリの重みフィールドの値がそれぞれ０．４、０．７、１、および０．５である上記の例において、ステップＳ８５４で初期重み付け値として図２０のステップＳ３０８と同様に０．５が使われるとする。すると、重みが何も学習されていない隣接ノード装置（すなわちステップＳ８５３で追加された新規エントリにＬＤとしてノードＩＤが記録されている隣接ノード装置）が、重みが０．７の隣接ノード装置よりも優先的にＬＤとして選択されてしまう。つまり、今までの学習の蓄積としての重み０．７が無視されてしまう。
【０５９７】
そこで、本実施形態では、重みが何も学習されていない隣接ノード装置が、重みが学習済みの隣接ノード装置よりも優先的にＬＤとして選択されることを防ぎ、今までの学習結果を優先的に考慮するために、上記のように定義される初期重み付け値が利用される。
【０５９８】
ステップＳ８５５でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３にまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部１１０が隣接ノード管理テーブル１０３のすべてのエントリに注目し終えていれば、図３１の処理は終了する。他方、まだデータフレーム処理部１１０が注目していないエントリが隣接ノード管理テーブル１０３に残っていれば、処理はステップＳ８５６に移行する。
【０５９９】
そして、ステップＳ８５６でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３のまだ注目していないエントリのうち、次のエントリに注目する。そして処理はステップＳ８５２に戻る。
【０６００】
なお、図３１の処理の意義は以下のとおりである。
重み付けテーブル１０４−ｉにおけるエントリごとのエージング処理の副作用として、図３１の処理の直前には、次のような状況の可能性もある。すなわち、隣接ノード管理テーブル１０３に登録されているある隣接ノード装置のノードＩＤを、ＬＤとして有するエントリが、重み付けテーブル１０４−ｉに存在しない可能性がある。
【０６０１】
ここで、ノード装置１００の隣接ノード装置は、データフレームを送信する際にデータフレーム処理部１１０が選択するＬＤの潜在的な候補である。よって、ヒットした重み付けテーブル１０４−ｉのＬＤフィールドにおいて全隣接ノード装置が網羅されるようにすることが、ノード装置１００の適切な動作のためには望ましい。
【０６０２】
以上の図３１の重み付けテーブル調整処理によれば、エージング処理の副作用として生じる可能性のある上記のような状況が解消される。つまり、隣接ノード管理テーブル１０３に登録されているすべてのノードＩＤが、ヒットした重み付けテーブル１０４−ｉにＬＤとして登録されていることが、保証される。
【０６０３】
以上、図２５〜図３１を参照して、図１９のステップＳ２０５におけるデータフレーム受信処理について詳しく説明した。続いて、データフレーム受信処理のステップＳ８２６およびＳ８３７における送信成否の通知に関連する処理について、図３２と図３３を参照して説明する。
【０６０４】
図３２は、図１９のステップＳ２０６におけるＡＣＫフレーム受信処理のフローチャートである。図３２の処理は、フレーム分岐処理部１０６からＡＣＫフレームがＡＣＫ処理部１０７に出力されると開始される。
【０６０５】
ステップＳ９０１でＡＣＫ処理部１０７は、フレーム分岐処理部１０６から受け取ったＡＣＫフレームのＬＤの値が自ノードＩＤと等しいか否かを判断する。ＡＣＫフレームのＬＤの値が自ノードＩＤと等しければ、処理はステップＳ９０２に移行し、ＡＣＫフレームのＬＤの値が自ノードＩＤと異なれば、図３２の処理は終了する。ＡＣＫ処理部１０７も、例えばフラッシュメモリ２０５などに予め格納された自ノードＩＤを参照することができる。
【０６０６】
例えば、図９のステップＳ１０５でノード装置Ｎ４が送信したデータフレームに対するＡＣＫフレームを、図４０にステップＳ１０５ａとして示すようにノード装置Ｎ５が送信すると、無関係なノード装置Ｎ３もＡＣＫフレームを受信する。なぜなら、ノード装置Ｎ３はノード装置Ｎ５に隣接しているからである。
【０６０７】
しかし、ノード装置Ｎ３のＡＣＫ処理部１０７−Ｎ３は、ステップＳ９０１の判断の結果、直ちに図３２の処理を終了するので、ノード装置Ｎ３は、ノード装置Ｎ３と無関係なＡＣＫフレームによる副作用を受けることはない。
【０６０８】
ステップＳ９０２でＡＣＫ処理部１０７は、ＡＣＫフレームのＧＳとＦＩＤの値から、ＡＣＫフレームに対応する送信済みのデータフレームを特定する。
例えば、図９のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３へ送信する図１０のデータフレーム３０３に対して、ノード装置Ｎ３は図１０のＡＣＫフレーム３２２をノード装置Ｎ２に返信する。ここで、ＡＣＫフレーム３２２の受信を契機にノード装置Ｎ２のＡＣＫ処理部１０７−Ｎ２が図３２の処理を行う場合について詳しく説明すると、以下のとおりである。
【０６０９】
ＡＣＫ処理部１０７−Ｎ２は、ステップＳ９０２において、ＡＣＫフレーム３２２のＧＳとＦＩＤの値（すなわちＮ１とＦａ）を取り出す。また、バッファ部１０９−Ｎ２は、図１１と同様の形式であるから、バッファ部１０９−Ｎ２には、ノード装置Ｎ２から送信済みのデータフレーム３０３が格納されている。よって、ＡＣＫ処理部１０７−Ｎ２は、取り出したＧＳとＦＩＤの値（すなわちＮ１とＦａ）をキーにしてバッファ部１０９−Ｎ２のエントリを検索し、データフレーム３０３を含むエントリを特定する。
【０６１０】
続いて、ステップＳ９０３でＡＣＫ処理部１０７は、ステップＳ９０２で特定した送信済みのデータフレームをバッファ部１０９から削除する。つまり、ステップＳ９０２の検索で見つかったエントリを、ＡＣＫ処理部１０７はバッファ部１０９から削除する。
【０６１１】
また、ステップＳ９０４でＡＣＫ処理部１０７は、ステップＳ９０２で特定した送信済みのデータフレームに関して、データフレーム処理部１１０に「送信成功」を通知する。そして、図３２の処理は終了する。
【０６１２】
例えば、データフレーム処理部１１０は、図７のＭＰＵ２０１がプログラムを実行することにより実現されていてもよい。その場合、ＭＰＵ２０１をデータフレーム処理部１１０として機能させるスレッドは、データフレームの送信後、ＡＣＫフレームを受信するまでスリープしていてもよい。ステップＳ９０４における「送信成功」の通知は、スリープしているスレッドを起こす処理である。
【０６１３】
なお、ステップＳ９０４の通知は、ステップＳ９０２で特定したデータフレームのＧＳとＦＩＤの値の通知をともなう。例えば上記の例においては、ＡＣＫ処理部１０７−Ｎ２は、データフレーム３０３を識別するためのＧＳとＦＩＤの値（すなわちＮ１とＦａ）も、データフレーム処理部１１０に通知する。
【０６１４】
図３３は、ＡＣＫフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。図３３の処理は、例えば、図７のタイマＩＣ２０３が所定の間隔で発生させる割り込み信号を契機として、定期的に行われる。
【０６１５】
ステップＳ１００１でＡＣＫ処理部１０７は、バッファ部１０９（図１１を参照）の１つ目のエントリに注目する。以下、図３３に関する説明においては、ＡＣＫ処理部１０７が注目しているバッファ部１０９のエントリを「注目エントリ」という。
【０６１６】
続いてステップＳ１００２でＡＣＫ処理部１０７は、現在時刻と注目エントリのタイムアウト時刻フィールドの値を比較する。そして、現在時刻がタイムアウト時刻以降であれば、処理はステップＳ１００３に移行する。他方、現在時刻がまだタイムアウト時刻に達していなければ、処理はステップＳ１００５に移行する。
【０６１７】
ステップＳ１００３でＡＣＫ処理部１０７は、バッファ部１０９の注目エントリに格納されているデータフレームに関して、「送信失敗」をデータフレーム処理部１１０に通知する。ステップＳ１００３の通知は、図３２のステップＳ９０４の通知と同様に、具体的には、例えばスリープしているスレッドを起こす処理であってもよい。
【０６１８】
また、ステップＳ９０４の通知と同様に、ステップＳ１００３の通知も、データフレームのＧＳとＦＩＤの値の通知をともなう。具体的には、ＡＣＫ処理部１０７は、注目エントリに格納されているデータフレームのＧＳとＦＩＤの値を読み取り、読み取ったＧＳとＦＩＤの値によりデータフレームを特定して、特定したデータフレームの「送信失敗」をデータフレーム処理部１１０に通知する。
【０６１９】
なお、送信失敗の場合、データフレーム処理部１１０が今までＬＤとして試していない隣接ノード装置を新たなＬＤとして選択してデータフレームの再送を試みることがある。よって、ステップＳ１００３の時点では、注目エントリはバッファ部１０９から削除されない。
【０６２０】
続いてステップＳ１００４でＡＣＫ処理部１０７は、注目エントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。そして、処理はステップＳ１００５に移行する。
【０６２１】
ステップＳ１００５では、まだ注目していないエントリがバッファ部１０９に残っているか否かをＡＣＫ処理部１０７が判断する。ＡＣＫ処理部１０７が、バッファ部１０９のすべてのエントリに注目し終わっていれば、図３３の処理は終了する。他方、まだＡＣＫ処理部１０７が注目していないエントリがバッファ部１０９に残っていれば、処理はステップＳ１００６に移行する。
【０６２２】
ステップＳ１００６でＡＣＫ処理部１０７は、バッファ部１０９の中でまだ注目していない次のエントリに注目する。そして処理はステップＳ１００２に戻る。
ところで、図２５〜図２８を参照して説明したデータフレーム受信処理は、上記のとおり、ノード装置１００がＧＳとならないタイプのノード装置である場合の例である。以下では、図３４Ａ〜図３８を参照して、ＧＳとなりうるタイプのノード装置に特有の処理について説明する。
【０６２３】
図３４Ａ，３４Ｂと図３５は、ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャートである。図３４Ａの処理は、上位層処理部１１１からデータフレーム処理部１１０への要求を契機として開始される。
【０６２４】
ステップＳ１１０１でデータフレーム処理部１１０は、上位層処理部１１１から、上位層処理部１１１における上位層のプロトコルの処理の結果として、データフレームのＧＤの値、ペイロードと、到達保証の有無を示す情報を取得する。
【０６２５】
例えば、「上位層のプロトコル」がイーサネットプロトコルであってもよい。その場合、上位層処理部１１１は、本実施形態で定義されるデータフレームのペイロードとして、イーサネットフレームをデータフレーム処理部１１０に出力する。また、上位層処理部１１１は、本実施形態におけるデータフレームのＧＤに設定する値を、データフレーム処理部１１０に通知する。
【０６２６】
そして、データフレーム処理部１１０は、上位層処理部１１１から取得したペイロードを含む新たなデータフレームを作成し、作成したデータフレームのＧＤに、上位層処理部１１１から取得した値を設定する。例えば、図９の例では、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、上位層処理部１１１−Ｎ１からＧＤの値としてＮ７を取得し、データフレームのＧＤにＮ７と設定する。
【０６２７】
まず、ステップＳ１１０１ａでデータフレーム処理部１１０は、到達保証が指定されているか否かを判定する。
到達保証が指定されていなければ、ステップＳ１１０１ｆで、ブランクまたは無効データを含む到達保証ヘッダ３３３を生成する。その後、図３４ＢのステップＳ１１０２に移行する。
到達保証が指定されていれば、まず、ステップＳ１１０１ｂでデータフレーム処理部１１０は、到達保証ＩＤを作成する。
【０６２８】
次に、ステップＳ１１０１ｃでデータフレーム処理部１１０は、到達保証ヘッダを生成する。具体的には、図１０の到達保証ヘッダ３３３の各値が設定される。
続いて、ステップＳ１１０１ｄでデータフレーム処理部１１０は、到達保証ＩＤ、ＧＳ、ＬＳ、到達保証転送情報、到達保証ＡＣＫ情報、イベント時刻を、到達保証転送記録テーブル１１５に設定する。
【０６２９】
そして、ステップＳ１１０１ｅでデータフレーム処理部１１０は、図１７に示されるように、データフレーム（ペイロード）、ＧＤ、ポート番号、到達保証ＩＤ、到達保証ＡＣＫ待ち時間、再送回数を、再送信バッファ１１７に設定する。その後、図３４ＢのステップＳ１１０２に移行する。
【０６３０】
続いて、図３４ＢのステップＳ１１０２でデータフレーム処理部１１０は、ステップＳ１１０１で取得したペイロードの長さを求め、作成したデータフレームの長さフィールドに設定する。例えば、図９の例では、図１０のデータフレーム３０２と３０３に例示するように、ペイロードの長さはＰａであるから、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、作成したデータフレームの長さフィールドにＰａと設定する。
【０６３１】
そして、ステップＳ１１０３でデータフレーム処理部１１０は、作成したデータフレームのＧＳとＬＳに自ノードＩＤを設定する。例えば、図９の例では、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、作成したデータフレームのＧＳとＬＳにそれぞれＮ１と設定する。
【０６３２】
そして、ステップＳ１１０４でデータフレーム処理部１１０は、ＦＩＤ生成部１１３に新たなＦＩＤの生成を要求する。するとＦＩＤ生成部１１３が新たなＦＩＤを生成してデータフレーム処理部１１０に出力するので、データフレーム処理部１１０は、生成されたＦＩＤを作成したデータフレームのＦＩＤフィールドに設定する。
【０６３３】
さらに、ステップＳ１１０５でデータフレーム処理部１１０は、「データフレーム」を示す所定の値Ｄ（図１０を参照）を、作成したデータフレームのタイプフィールドに設定する。なお、以上のステップＳ１１０２〜Ｓ１１０５の実行順序は順不同である。
【０６３４】
以上のようにして、送信するデータフレームを作成し終わると、ステップＳ１１０６でデータフレーム処理部１１０は、作成したデータフレームをバッファ部１０９に格納する。すなわち、データフレーム処理部１１０は、バッファ部１０９内に新たなエントリの領域を確保し、確保した領域に、作成したデータフレームを格納する。なお、図１１に示すようにバッファ部１０９にはタイムアウト時刻フィールドがあるが、この時点ではタイムアウト時刻は設定されない。
【０６３５】
続いてステップＳ１１０７でデータフレーム処理部１１０は、ステップＳ１１０１で上位層処理部１１１から指定されたＧＤの値を用いて重み付けテーブル１０４を検索する。
そしてステップＳ１１０８でデータフレーム処理部１１０は、指定されたＧＤの値に対応する重み付けテーブルが、ステップＳ１１０７の検索の結果としてヒットしたか否かを判断する。指定されたＧＤの値に対応する重み付けテーブルがヒットした場合、処理はステップＳ１１０８ａに移行し、指定されたＧＤの値に対応する重み付けテーブルが存在しない場合、処理はステップＳ１００９に移行する。
【０６３６】
ステップＳ１１０８ａでデータフレーム処理部１１０は、図３１の重み付けテーブル調整処理を行い、エージング処理の副作用を中和する。そして、処理はステップＳ１１１０に移行する。
【０６３７】
ステップＳ１１０９でデータフレーム処理部１１０は、ステップＳ１１０１で指定されたＧＤの値に対応する新規重み付けテーブルを重み付けテーブル１０４の中に追加する。具体的には、図２６のステップＳ８１３〜Ｓ８１６と類似の処理をデータフレーム処理部１１０はステップＳ１１０９で行う。
【０６３８】
すなわち、データフレーム処理部１１０はステップＳ１１０９で、上位層処理部１１１から指定されたＧＤの値に対応する新規重み付けテーブルを追加し、新規重み付けテーブルにおいて、上位層処理部１１１から指定されたＧＤの値をＧＤとして設定する。さらに、データフレーム処理部１１０は、隣接ノード管理テーブル１０３と同数の新規エントリを新規重み付けテーブル内に作成する。そして、データフレーム処理部１１０は、作成した各エントリに、それぞれ、隣接ノード管理テーブル１０３の各エントリのノードＩＤと初期重み付け値と現在時刻を設定する。
【０６３９】
なお、以下では説明の便宜上、ステップＳ１１０１で指定されたＧＤの値に対応する重み付けテーブルを、「１０４−ｉ」という参照符号で参照する。すなわち、重み付けテーブル１０４−ｉは、ステップＳ１１０７の検索でヒットしたテーブルまたはステップＳ１１０９で追加されたテーブルである。
【０６４０】
以上のようにして、重み付けテーブル１０４−ｉがヒットしたとステップＳ１１０８で判断された後、またはステップＳ１１０９で重み付けテーブル１０４−ｉが作成された後、処理はステップＳ１１１０に移行する。
【０６４１】
そして、ステップＳ１１１０でデータフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、最小の重みと対応付けられているＬＤの値を取得する。なお、図１４に例示するように、重み付けテーブル１０４−ｉにおいて複数のエントリが同じ最小の重みを有する場合もありうる。その場合、データフレーム処理部１１０は、最小の重みと対応付けられている複数のＬＤの値のうち任意の１つをステップＳ１１１０で選択して取得する。データフレーム処理部１１０は、取得したＬＤの値および対応する重みの値を、例えば図７のＤＲＡＭ２０４などの記憶領域に記憶する。
【０６４２】
続いて、処理は図３５のステップＳ１１１１に移行し、ステップＳ１１１１でデータフレーム処理部１１０は、下記の２つの条件（Ｌ１）と（Ｌ２）のいずれかが成立するか否かを判断する。
（Ｌ１）ステップＳ１１１０で取得したＬＤの値に対応する重みが、重みの最大値（本実施形態では、具体的には１．０）である。
（Ｌ２）重み付けテーブル１０４−ｉに登録されているすべてのＬＤへの送信が、いずれも失敗した。
【０６４３】
条件（Ｌ１）または（Ｌ２）が成立する場合、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理はステップＳ１１１２に移行する。
他方、条件（Ｌ１）と（Ｌ２）のいずれも成立しない場合、まだＬＤとして選択可能な隣接ノード装置が残っている。換言すれば、データフレーム受信処理のステップＳ８１８に関して説明した（Ｇ１）〜（Ｇ３）のいずれにも該当しない隣接ノード装置が、少なくとも１つは存在する。そして、ＬＤとして選択可能な隣接ノード装置のノードＩＤが、ステップＳ１１１０（または後述のステップＳ１１２５）で取得されている。そこで、ステップＳ１１１１で条件（Ｌ１）と（Ｌ２）のいずれも成立しないと判断されると、処理はステップＳ１１１４に移行する。
【０６４４】
条件（Ｌ１）または（Ｌ２）が成立する場合、ステップＳ１１１２でデータフレーム処理部１１０は、データフレームを破棄する。つまり、データフレーム処理部１１０は、ステップＳ１１０６で新たに作成してデータフレームを格納したエントリを、バッファ部１０９から削除する。
【０６４５】
そして、続くステップＳ１１１３でデータフレーム処理部１１０は、上位層処理部１１１に「送信失敗」を通知する。つまり、データフレーム処理部１１０は、どの隣接ノード装置にもデータフレームを成功裡に送信することはできなかったことを、上位層処理部１１１に通知する。そして図３４Ａ，３４Ｂ〜図３５の処理が終了する。
【０６４６】
他方、ステップＳ１１１１において、条件（Ｌ１）と（Ｌ２）のいずれも成立しないと判断されると、取得済みのＬＤの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理が、ステップＳ１１１４〜Ｓ１１２５で行われる。
【０６４７】
ステップＳ１１１４では、データフレーム処理部１１０が、ステップＳ１１０６でバッファ部１０９に格納したデータフレームのＬＤに、ステップＳ１１１０または後述のステップＳ１１２５で取得したＬＤの値を設定する。そして、データフレーム処理部１１０は、ＬＤの値を設定したデータフレームの送信を、送信部１０２に依頼する。すると、送信部１０２がデータフレームを送信する。
【０６４８】
続いてステップＳ１１１５でデータフレーム処理部１１０は、ステップＳ１１０６でデータフレームを格納したバッファ部１０９内のエントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。
【０６４９】
そして、ステップＳ１１１６でデータフレーム処理部１１０は、自ノードＩＤと、ステップＳ１１０４でＦＩＤ生成部１１３が生成したＦＩＤを使ってＦＩＤ管理テーブル１０５を検索する。
【０６５０】
次にステップＳ１１１７でデータフレーム処理部１１０は、ステップＳ１１１６のＦＩＤ管理テーブル１０５の検索においてエントリがヒットしたか否かを判断する。なお、ステップＳ１１１７が１回目に実行される場合には「エントリがヒットしなかった」と判断され、ステップＳ１１１７が２回目以降に実行されるときは「エントリがヒットした」と判断される。
【０６５１】
ステップＳ１１１６の検索でエントリがヒットしていれば、処理はステップＳ１１１８に移行する。他方、ステップＳ１１１６の検索でエントリがヒットしていなければ、処理はステップＳ１１１９に移行する。
【０６５２】
ステップＳ１１１８でデータフレーム処理部１１０は、ステップＳ１１１６の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ステップＳ１１１６の検索でヒットしたエントリにおいて、ＬＤフィールドには、ステップＳ１１１４で送信したデータフレームのＬＤの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップＳ１１２１に移行する。
【０６５３】
また、ステップＳ１１１９でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ１１２０でデータフレーム処理部１１０は、新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳとＬＤの各フィールドには、それぞれステップＳ１１１４で送信したデータフレームの値をコピーする。また、データフレーム処理部１１０は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、ＯＬＳフィールドには、自ノードＩＤをコピーする。
【０６５４】
例えば、図１５に示した、ノード装置Ｎ１のＦＩＤ管理テーブル１０５−Ｎ１のエントリＥ１は、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１が以上の処理により作成したものである。
【０６５５】
ステップＳ１１２１でデータフレーム処理部１１０は、ステップＳ１１１４における送信の成否の通知を待つ。ステップＳ１１２１の詳細は、図２７のステップＳ８２５と同様である。データフレーム処理部１１０が、ステップＳ１１２１での待機の後、ＡＣＫ処理部１０７から「送信成功」または「送信失敗」の通知を受けると、処理はステップＳ１１２２に移行する。
【０６５６】
ステップＳ１１２２でデータフレーム処理部１１０は、ＡＣＫ処理部１０７から受けた通知に基づいて、ステップＳ１１１４の送信が成功したか否かを判断する。送信が成功した場合、処理はステップＳ１１２３に移行し、送信が失敗した場合、処理はステップＳ１１２４に移行する。
【０６５７】
送信が成功した場合、ステップＳ１１２３でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ１１１４で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。
【０６５８】
つまり、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤに対応する重みを、例えば式（６）を使って更新する。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、図３４Ａ，３４Ｂ〜図３５の処理は終了する。
【０６５９】
逆に、送信が失敗した場合、ステップＳ１１２４でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ１１１４で送信したデータフレームのＧＤとＬＤの組に対応する重みを大きくする。
【０６６０】
つまり、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤに対応する重みを、例えば式（７）を使って更新する。
【０６６１】
なお、データフレーム処理部１１０はステップＳ１１２４でさらに、送信したデータフレームのＬＤの値を、例えば図７のＤＲＡＭ２０４などのワークエリアに「送信に失敗したＬＤ」として記憶する。図２７のステップＳ８２８と同様に、「送信に失敗したＬＤ」の記憶のためには、線形リストや配列などのデータ構造が利用されてもよい。
【０６６２】
また、データフレーム処理部１１０はステップＳ１１２４でさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、処理はステップＳ１１２５に移行する。
【０６６３】
ステップＳ１１２５でデータフレーム処理部１１０は、今までにＬＤとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信に失敗したＬＤ以外のＬＤのうちで、最小の重みと対応付けられているＬＤの値を取得する。ここで、送信に失敗したＬＤは、ステップＳ１１２４において例えば図７のＤＲＡＭ２０４などのワークエリアに、例えば線形リストや配列の形で記憶されている。
【０６６４】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、過去にステップＳ１１１０またはＳ１１２５で取得されていないＬＤの値のうちで、最小の重みと対応付けられているものを取得する。データフレーム処理部１１０は、取得したＬＤの値および対応する重みの値を、例えば図７のＤＲＡＭ２０４などの記憶領域に記憶する。そして、処理はステップＳ１１１１に戻る。
【０６６５】
図３６は、再送信バッファ１１７のエージング処理のフローチャートである。例えば、図７のタイマＩＣ２０３が所定の間隔Ｉａで割り込み信号を到達保証ＡＣＫ処理部１１４に出力し、割り込み信号を契機として到達保証ＡＣＫ処理部１１４が所定の間隔Ｉａで図３６の処理を行ってもよい。
【０６６６】
ステップＳ１６０１で到達保証ＡＣＫ処理部１１４は、再送信バッファ１１７の未注目のエントリがあるかないか判定する。
未注目のエントリがなくなれば処理を終了する。
【０６６７】
未注目のエントリがあれば、ステップＳ１６０２で到達保証ＡＣＫ処理部１１４は、再送信バッファ１１７の未注目のエントリの１つに注目する。例えば、図１７の例の横１行である。
【０６６８】
ステップＳ１６０３で到達保証ＡＣＫ処理部１１４は、注目エントリの到達保証ＡＣＫ待ち時間（図１７参照）をデクリメントする。
ステップＳ１６０４で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫ待ち時間＝０となったか否かを判定する。
【０６６９】
到達保証ＡＣＫ待ち時間＝０となっていなければ、到達保証ＡＣＫ処理部１１４は、ステップＳ１６０１に移行して、次のエントリの処理を実行する。
到達保証ＡＣＫ待ち時間＝０となれば、ステップＳ１６０５で到達保証ＡＣＫ処理部１１４は、再送回数（図１７）が満了したか否か、すなわち所定値に達したか否かを判定する。
【０６７０】
再送回数が満了していなければ、ステップＳ１６０８で到達保証ＡＣＫ処理部１１４は、到達保証ＡＣＫ待ち時間（図１７）を初期値に再設定する。
ステップＳ１６０９で到達保証ＡＣＫ処理部１１４は、再送回数（図１７）をインクリメントする。
【０６７１】
ステップＳ１６１０で到達保証ＡＣＫ処理部１１４は、注目エントリから、データフレームのペイロードと到達保証ヘッダを取り出す。
そして、ステップＳ１６１１で到達保証ＡＣＫ処理部１１４は、図３４ＢのステップＳ１１０２以降の処理を呼び出して、再送信処理を実行させる。
【０６７２】
その後、到達保証ＡＣＫ処理部１１４は、ステップＳ１６０１に移行して、次のエントリの処理を実行する。
一方、ステップＳ１６０５で再送回数が満了したと判定されれば、ステップＳ１６０６で到達保証ＡＣＫ処理部１１４は、もはや再送信は行わないとして、再送信バッファから注目エントリを削除する。
【０６７３】
そして、ステップＳ１６０７で到達保証ＡＣＫ処理部１１４は、図６の上位層処理部１１１へ、結果（到達保証送信回数満了）を通知する。
その後、到達保証ＡＣＫ処理部１１４は、ステップＳ１６０１に移行して、次のエントリの処理を実行する。
【０６７４】
図３７は、組立バッファ１１６のエージング処理のフローチャートである。例えば、図７のタイマＩＣ２０３が所定の間隔Ｉａで割り込み信号を到達保証ＡＣＫ処理部１１４に出力し、割り込み信号を契機として到達保証ＡＣＫ処理部１１４が所定の間隔Ｉａで図３７の処理を行ってもよい。
【０６７５】
ステップＳ１７０１で到達保証ＡＣＫ処理部１１４は、例えば図１７に示される組立バッファ１１６において、ＧＳとポート番号の組で未注目のものがあるか否かを判定する。
未注目のものがなくなれば処理を終了する。
【０６７６】
未注目のものがあれば、ステップＳ１７０２で到達保証ＡＣＫ処理部１１４は、未注目の、ＧＳとポート番号の組のうちの１つに注目する。
ステップＳ１７０３で到達保証ＡＣＫ処理部１１４は、注目している組に対応するタイマ値（図１７参照）をデクリメントする。
【０６７７】
ステップＳ１７０４で到達保証ＡＣＫ処理部１１４は、注目している組に対応するタイマ値が０になったか否かを判定する。
タイマ値が０になっていなければ、到達保証ＡＣＫ処理部１１４は、ステップＳ１７０１に移行して、次の組の処理を実行する。
【０６７８】
タイマ値が０になると、ステップＳ１７０５で到達保証ＡＣＫ処理部１１４は、注目している組に対応するすべてのエントリを削除する。
その後、到達保証ＡＣＫ処理部１１４は、ステップＳ１７０１に移行して、次の組の処理を実行する。
【０６７９】
さて、図３８は、ＧＳにもなりうるノード装置１００が、データフレーム受信処理の一部として図２８の処理の代わりに行う処理のフローチャートである。
ノード装置１００がＧＳにもなりうるタイプの装置である場合、データフレーム受信処理におけるステップＳ８０１〜Ｓ８２９は、ノード装置１００が中継専用の場合と同様であり、図２５〜図２７に示したとおりである。しかし、ノード装置１００がＧＳにもなりうるタイプの装置の場合は、図２７のステップＳ８１８においてデータフレーム処理部１１０が「条件（Ｆ１）と（Ｆ２）のいずれかが成立する」と判断すると、処理は図３８のステップＳ８３０ａに移行する。
【０６８０】
ステップＳ８３０ａでデータフレーム処理部１１０は、受信したデータフレームのＧＳの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＧＳの値が自ノードＩＤと異なれば、処理はステップＳ８３０ｂに移行し、受信したデータフレームのＧＳの値が自ノードＩＤであれば、処理はステップＳ８３０ｃに移行する。
【０６８１】
ステップＳ８３０ｂでデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０６８２】
具体的には、データフレーム処理部１１０は、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。データフレームの送信後、処理はステップＳ８３１ａに移行する。
【０６８３】
また、ステップＳ８３０ｃでは、データフレーム処理部１１０は、上位層処理部１１１に「送信失敗」を通知する。通知にあたって、データフレーム処理部１１０は、例えば受信したデータフレームからペイロードを取り出し、ペイロードまたはペイロードの一部を上位層処理部１１１に出力してもよい。すると、上位層処理部１１１はどのデータの送信に失敗したのかを、データフレーム処理部１１０から受け取ったペイロードの内容に基づいて認識することができる。送信失敗の通知の後、処理はステップＳ８３８ａに移行する。
【０６８４】
さて、ステップＳ８３１ａでは、データフレーム処理部１１０が、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いてＦＩＤ管理テーブル１０５を検索する。なお、以下のステップＳ８３１ａ〜Ｓ８３９ａは、それぞれ図２８のステップＳ８３１〜Ｓ８３９と類似のステップである。
【０６８５】
次のステップＳ８３２ａでデータフレーム処理部１１０は、ステップＳ８３１ａの検索の結果、エントリがヒットしたか否かを判断する。エントリがヒットしていれば処理はステップＳ８３３ａに移行し、エントリがヒットしていなければ処理はステップＳ８３４ａに移行する。
【０６８６】
なお、ステップＳ８０７で「エントリがヒットした」と判断されている場合に、ステップＳ８３１ａの検索の結果見つかるエントリは、ステップＳ８０６の検索の結果見つかったエントリである。また、ステップＳ８０７で「エントリがヒットしなかった」と判定され、かつステップＳ８２３において新規エントリが作成された場合は、ステップＳ８３１ａの検索の結果、ステップＳ８２３で作成された新規エントリが見つかる。
【０６８７】
ステップＳ８３２ａで「エントリがヒットしなかった」と判断されるのは、（Ｍ１）かつ（Ｍ２）の場合である。
（Ｍ１）ステップＳ８０７で「エントリがヒットしなかった」と判断された。
（Ｍ２）１回目にステップＳ８１８が実行された直後に、ステップＳ８３０ａに処理が移行した。
【０６８８】
ステップＳ８３３ａでデータフレーム処理部１１０は、ステップＳ８３１ａの検索の結果ヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ヒットしたエントリにおいて、ＬＤには、ヒットしたエントリ自身のＯＬＳの値をコピーし、最終更新時刻には、現在時刻を設定する。そして処理はステップＳ８３６ａに移行する。
【０６８９】
他方、ステップＳ８３４ａでは、データフレーム処理部１１０はＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ８３５ａでデータフレーム処理部１１０は、ステップＳ８３４ａで追加した新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳには、受信したデータフレームの値をそれぞれコピーし、最終更新時刻には、現在時刻を設定し、ＯＬＳとＬＤには、受信したデータフレームのＬＳの値をコピーする。そして処理はステップＳ８３６ａに移行する。
【０６９０】
ステップＳ８３６ａでデータフレーム処理部１１０は、ステップＳ８３０ｂで送信したデータフレームに関する送信成否の通知を待つ。そして、「送信成功」または「送信失敗」の通知をデータフレーム処理部１１０がＡＣＫ処理部１０７から受けると、処理はステップＳ８３７ａに移行する。
【０６９１】
ステップＳ８３７ａでデータフレーム処理部１１０は、ステップＳ８３０ｂにおけるデータフレームの送信が成功したか否かを判断する。送信が失敗した場合、処理はステップＳ８３８ａに移行し、送信が成功した場合、処理はステップＳ８３９ａに移行する。
【０６９２】
ステップＳ８３８ａが実行されるのは、（Ｎ１）または（Ｎ２）の場合である。
（Ｎ１）ノード装置１００自身がＧＳとなって送信したデータフレームがバックトラックによりノード装置１００に戻ってきて受信されたのであり、かつ、ノード装置１００の隣接ノード装置はすべて（Ｎ１−１）または（Ｎ１−２）である。
（Ｎ１−１）最大値の重みと対応付けられている。
（Ｎ１−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
【０６９３】
（Ｎ２）受信したデータフレームのＧＳは、ノード装置１００以外の他のノード装置であり、かつ、ＯＬＳ以外のすべての隣接ノード装置が（Ｎ２−１）または（Ｎ２−２）であり、かつ、ＯＬＳへのデータフレームの送信は失敗した。
（Ｎ２−１）最大値の重みと対応付けられている。
（Ｎ２−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
【０６９４】
この場合、データフレーム処理部１１０はステップＳ８３８ａで、受信したデータフレームを破棄する。すなわち、データフレーム処理部１１０は、ステップＳ８０１で見つけたエントリをバッファ部１０９から削除する。そして、データフレーム受信処理は終了する。
【０６９５】
他方、ステップＳ８３９ａは、ノード装置１００ではない別のノード装置がＧＳであるデータフレームに関して、ノード装置１００からノード装置１００のＯＬＳへの送信が成功した場合に実行される。ステップＳ８３９ａでデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８３０ｂで送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。換言すれば、データフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤ（つまりステップＳ８０８またはＳ８１０で記憶したＯＬＳ）に対応する重みを更新する。
【０６９６】
例えば、ステップＳ８２９やＳ８３９と同様に、データフレーム処理部１１０は、式（６）を使って重みを更新してもよい。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０６９７】
続いて、以上の詳細な説明を踏まえて、再度、図９の例について説明する。
図３９は、経路を探索するための探索空間を表す探索木の形式で、図９における経路選択を説明する図である。人工知能の分野では、探索空間はしばしば探索木の形式で表現される。図３９は、本実施形態におけるデータフレームの転送を、ネットワーク内で動的に行われる経路探索という観点から見て、探索空間を探索木４００として表現した図である。なお、探索木４００は、ノード装置内に作成されるデータ構造ではなく、ネットワークトポロジそのものでもない。
【０６９８】
探索木４００に含まれる各探索ノードには、ネットワーク１内のノード装置のノードＩＤのラベルが付けられる。なお、図３９では、各探索ノードを、円、正方形、六画形の３種類の図形で表しているが、円、正方形、六画形の意味の違いについては後述する。
【０６９９】
また、図９の例では、データフレームのＧＳとＧＤは、それぞれノード装置Ｎ１とＮ７なので、探索木４００のルートノードは、Ｎ１というラベルが付けられた探索ノード４０１である。そして、経路探索のゴールは、探索木４００においてＮ７というラベルが付けられた探索ノード４０９を発見することである。
【０７００】
ここで、図９のネットワーク１においてノード装置ＮｉとＮｊが隣接していれば、（１≦ｉ，ｊ≦７）、ノード装置Ｎｉにとって隣接ノード装置Ｎｊは潜在的なＬＤの候補であり、ノード装置Ｎｊにとっても隣接ノード装置Ｎｉは潜在的なＬＤの候補である。よって、探索木４００内において、Ｎｉというラベルが付けられた探索ノードは、Ｎｊというラベルが付けられた探索ノードを子ノードとして有する。
【０７０１】
したがって、探索木４００では、Ｎｉというラベルが付けられた第１の探索ノードが、Ｎｊというラベルが付けられた第２の探索ノードを子ノードとして有し、第２の探索ノードが、Ｎｉというラベルが付けられた第３の探索ノードを子ノードとして有する。以下同様であるから、探索木４００は、潜在的には無限の探索ノードを有する。
【０７０２】
潜在的には無限に大きい探索木４００の探索においては、探索空間の刈り込み（pruning）が行われつつ、深さ優先探索が行われる。「探索空間の刈り込み」とは、探索効率を上げるために探索木の１つ以上の枝を無視するという技法であり、探索アルゴリズムの研究分野においては、応用分野に応じて種々の刈り込み手法が提案されている。
【０７０３】
本実施形態のノード装置１００の自律分散協調の結果としての刈り込みには２種類ある。以下、便宜的に「第１種の刈り込み」と「第２種の刈り込み」と称する。
第１種の刈り込みは、親ノードと同じラベルを有する子ノードの刈り込みである。例えば、上記の第１〜第３の探索ノードの例では、第２の探索ノードの子ノードである第３の探索ノードのラベルは、第２の探索ノードの親ノードである第１の探索ノードのラベルと等しい。そこで、第２の探索ノードから先の探索においては、第３の探索ノードが刈り込まれる。第１種の刈り込みによって刈り込まれる探索ノードは、図３９において正方形で表されている。
【０７０４】
第２種の刈り込みは、祖先ノードと同じラベルを有する子ノードの刈り込みである。第２種の刈り込みは、本実施形態のＦＩＤ管理テーブル１０５によって可能となっている。第２種の刈り込みによって刈り込まれる探索ノードは、図３９において六画形で表されている。
なお、図３９において円は、刈り込まれずに探索された探索ノードを表す。
【０７０５】
以下、具体的に図９の例と探索木４００との関係について説明する。
上記のように、探索木４００のルートノードである探索ノード４０１のラベルは、データフレームのＧＳであるノード装置Ｎ１のノードＩＤ・Ｎ１である。そして、ネットワーク１においてノード装置Ｎ１にはノード装置Ｎ２のみが隣接するので、探索ノード４０１は１つの探索ノード４０２のみを子ノードとして有し、探索ノード４０２のラベルはＮ２である。
【０７０６】
また、ノード装置Ｎ１にはノード装置Ｎ２のみが隣接するので、図９のステップＳ１０１のように、データフレームがノード装置Ｎ１からノード装置Ｎ２へと送信される。ステップＳ１０１の送信は、図３９では、探索ノード４０１から探索ノード４０２へと探索が進むことに対応する。
【０７０７】
そして、ネットワーク１においてノード装置Ｎ２には、ノード装置Ｎ１とＮ３とＮ６が隣接している。よって、探索ノード４０２は、３つの探索ノード４０３と４０４と４０５を子ノードとして有し、探索ノード４０３と４０４と４０５それぞれのラベルはＮ３とＮ６とＮ１である。
【０７０８】
図９においてノード装置Ｎ２が、最初にノード装置Ｎ３をＬＤとして選択して、ステップＳ１０２でノード装置Ｎ３へデータフレームを送信することは、図３９では、探索ノード４０２から探索ノード４０３へ探索が進むことに対応する。
【０７０９】
そして、ネットワーク１においてノード装置Ｎ３には、ノード装置Ｎ２とＮ４とＮ５が隣接している。よって、探索ノード４０３は、３つの探索ノード４０６、４０７および４０８を子ノードとして有し、探索ノード４０６、４０７、および４０８それぞれのラベルは、Ｎ４とＮ２とＮ５である。
【０７１０】
図９においてノード装置Ｎ３が、最初にノード装置Ｎ４をＬＤとして選択して、ステップＳ１０３でノード装置Ｎ４へデータフレームを送信することは、図３９では、探索ノード４０３から探索ノード４０６へ探索が進むことに対応する。
【０７１１】
そして、ネットワーク１においてノード装置Ｎ４には、ノード装置Ｎ７とＮ５とＮ３が隣接する。よって、探索ノード４０６は、３つの探索ノード４１１、４１２、および４１３を子ノードとして有し、探索ノード４１１、４１２、および４１３それぞれのラベルは、Ｎ７とＮ５とＮ３である。
【０７１２】
図９においてノード装置Ｎ４が、最初にノード装置Ｎ７をＬＤとして選択して、ステップＳ１０４でノード装置Ｎ７へデータフレームを送信することは、図３９では、探索ノード４０６から探索ノード４１１へ探索が進むことに対応する。
【０７１３】
ところが、図９に示すように、ステップＳ１０４ではノード装置Ｎ４とＮ７の間のリンクの障害により、送信が失敗する。つまり、探索木４００においては、探索ノード４１１で探索が失敗してバックトラックが生じる。なお、探索ノード４１１から探索ノード４０６への、探索木４００上でのバックトラックは、実際のネットワーク１上では、ＡＣＫフレームが受信されずにノード装置Ｎ４がタイムアウトするという現象である。
【０７１４】
図９においては、ステップＳ１０４の送信失敗の後、ノード装置Ｎ４は、次にノード装置Ｎ５をＬＤとして選択してステップＳ１０５でノード装置Ｎ５へデータフレームを送信する。このステップＳ１０５での送信は、図３９では、探索ノード４０６から探索ノード４１２へ探索が進むことに対応する。
【０７１５】
そして、ネットワーク１においてノード装置Ｎ５にはノード装置Ｎ３とＮ４が隣接するので、探索ノード４１２は、２つの探索ノード４１４と４１５を子ノードとして有し、探索ノード４１４と４１５それぞれのラベルは、Ｎ３とＮ４である。
【０７１６】
図９においてノード装置Ｎ５が最初にノード装置Ｎ３をＬＤとして選択してステップＳ１０６でノード装置Ｎ３へデータフレームを送信することは、図３９では、探索ノード４１２から探索ノード４１４へと探索が進むことに対応する。
【０７１７】
なお、探索木４００において、探索ノード４１４は、祖先ノードである探索ノード４０３と同じラベルを持つ。しかし、探索ノード４０３と４１４の間には、２つの探索ノード４０６と４１２がはさまっているため、この時点では探索ノード４１４は刈り込まれない。
【０７１８】
そして、ネットワーク１においてノード装置Ｎ３にはノード装置Ｎ２とＮ４とＮ５が隣接するので、探索ノード４１４は、３つの探索ノード４１６、４１７、および４１８を子ノードとして有し、探索ノード４１６、４１７、および４１８それぞれのラベルは、Ｎ２とＮ４とＮ５である。
【０７１９】
ところで、ステップＳ１０６でデータフレームを受信した時点で、ノード装置Ｎ３のＦＩＤ管理テーブル１０５−Ｎ３には、図１５のとおりエントリＥ３が既に存在している。このことは、次の（Ｏ１）と（Ｏ２）を意味する。
【０７２０】
（Ｏ１）探索木４００において、探索ノード４１４から見た祖先ノードとして、探索ノード４１４自身と同じラベルＮ３を有する探索ノード４０３が存在している。
（Ｏ２）したがって、探索ノード４１４の子ノードである探索ノード４１６、４１７、および４１８は、刈り込み対象である。
【０７２１】
そして、刈り込みは次のようにして実現される。
ラベルＮ３を有する探索ノード４１４の祖先ノードにラベルＮ４を有する探索ノード４０６があることは、ノード装置Ｎ３のＦＩＤ管理テーブル１０５−Ｎ３のエントリＥ３において、ステップＳ１０６の時点でＬＤの値がＮ４であることに対応する（図１５参照）。そして、ステップＳ１０６でデータフレームを受信すると、ノード装置Ｎ３は、ステップＳ１０３でＬＤとして選択したノード装置Ｎ４に対応する重みを、図１４に示すように最大値に設定している。
【０７２２】
換言すれば、ステップＳ１０６でのデータフレームの受信を契機として、ノード装置Ｎ３は、ノード装置Ｎ４を潜在的なＬＤの候補から除外している。そして、潜在的なＬＤの候補からの除外とは、探索木４００における刈り込みであるから、ラベルＮ４を持つ探索ノード４１７は刈り込まれる。
【０７２３】
また、探索ノード４１４の祖先ノードにラベルＮ２を有する探索ノード４０２があることは、ノード装置Ｎ３のＦＩＤ管理テーブル１０５−Ｎ３のエントリＥ３において、ＯＬＳの値がＮ２であることに対応する（図１５参照）。
【０７２４】
そして、ステップＳ１０６でデータフレームを受信した時点では、ＯＬＳ以外で潜在的にＬＤとして選択可能なノード装置Ｎ５が存在しているので、ノード装置Ｎ３は、ＯＬＳであるノード装置Ｎ２をＬＤとして選択しない。つまり、ラベルＮ２を持つ探索ノード４１６は刈り込まれる。
【０７２５】
また、ステップＳ１０６の受信を契機に、ノード装置Ｎ３はＬＤとしてノード装置Ｎ５を選択する。ここで、探索木４００において探索ノード４１４の子ノードである探索ノード４１８は、探索ノード４１４の親ノードである探索ノード４１２と同じラベルＮ５を有することに注目すると、探索ノード４１８は第１種の刈り込みの対象である。
【０７２６】
実際、ステップＳ１０７でのノード装置Ｎ３からノード装置Ｎ５へのデータフレームの送信は、図３９に示すように、探索木４００上での探索ノード４１４から親ノードである探索ノード４１２へのバックトラックとして表すことができる。換言すれば、探索ノード４１４の子ノードであり、親ノードの探索ノード４１２と同じラベルＮ５を有する探索ノード４１８は、刈り込まれる。
【０７２７】
次のステップＳ１０８では、図９に示すように、ノード装置Ｎ５はＯＬＳであるノード装置Ｎ４へとデータフレームをバックトラックさせている。このステップＳ１０８の動作は、図３９では、探索木４００においてラベルＮ５を有する探索ノード４１２からラベルＮ４を有する探索ノード４０６へのバックトラックとして表現される。換言すれば、探索ノード４１２の子ノードであり、探索ノード４１２の親ノードの探索ノード４０６と同じラベルＮ４を有する探索ノード４１５は、刈り込まれる。
【０７２８】
そして、次のステップＳ１０９でも、図９に示すように、ノード装置Ｎ４がＯＬＳであるノード装置Ｎ３へとデータフレームをバックトラックさせている。このステップＳ１０９の動作も、図３９では、探索木４００においてラベルＮ４を有する探索ノード４０６からラベルＮ３を有する探索ノード４０３へのバックトラックとして表現される。換言すれば、探索ノード４０６の子ノードであり、探索ノード４０６の親ノードの探索ノード４０３と同じラベルＮ３を有する探索ノード４１３は、刈り込まれる。
【０７２９】
この段階で、ラベルＮ３を有する探索ノード４０３の子ノードのうち未探索なのは、ラベルＮ２を有する探索ノード４０７と、ラベルＮ５を有する探索ノード４０８である。
しかし、ノード装置Ｎ３はステップＳ１０７でノード装置Ｎ５にデータフレームを送信済みであり、ステップＳ１０９でのデータフレームの受信を契機として、図１４に示すように、ノード装置Ｎ５に対応する重みは最大値に設定されている。よって、ノード装置Ｎ５はＬＤの候補から除外され、ラベルＮ５を有する探索ノード４０８は刈り込まれる。
【０７３０】
結局、ステップＳ１１０では、図９に示すように、ノード装置Ｎ３はＯＬＳであるノード装置Ｎ２へとデータフレームをバックトラックさせている。このステップＳ１１０の動作は、図３９では、探索木４００においてラベルＮ３を有する探索ノード４０３からラベルＮ２を有する探索ノード４０２へのバックトラックとして表現される。換言すれば、探索ノード４０３の子ノードであり、探索ノード４０３の親ノードの探索ノード４０２と同じラベルＮ２を有する探索ノード４０７は、刈り込まれる。
【０７３１】
続いて、ステップＳ１１１で、ノード装置Ｎ２はＬＤとして新たにノード装置Ｎ６を選択し、ノード装置Ｎ６にデータフレームを送信する。ステップＳ１１１の送信は、図３９では、ラベルＮ２を有する探索ノード４０２からラベルＮ６を有する探索ノード４０４へ探索が進むことに対応する。
【０７３２】
そして、ネットワーク１においてノード装置Ｎ６にはノード装置Ｎ７とＮ２が隣接するので、探索ノード４０４は、２つの探索ノード４０９と４１０を子ノードとして有し、探索ノード４０９と４１０それぞれのラベルは、Ｎ７とＮ２である。
【０７３３】
図９においてノード装置Ｎ６は、ＯＬＳであるノード装置Ｎ２ではなく、まずノード装置Ｎ７をＬＤとして選択してデータフレームをステップＳ１１２で送信する。つまり、ラベルＮ２を有する探索ノード４１０は刈り込まれる。そして、ステップＳ１１２の送信により、ＧＤであるノード装置Ｎ７のノードＩＤ・Ｎ７をラベルとして有する探索ノード４０９へと探索が進み、探索が終了する。なお、ステップＳ１１２で探索が終了するので、探索ノード４０２の子ノードである探索ノード４０５は探索されないが、探索ノード４０５は、第１種の刈り込みの対象でもあるから、図３９では便宜的に正方形で表現してある。
【０７３４】
なお、探索木４００において、ルートノードである探索ノード４０１から、以上のようにして探索により見つかったリーフノードである探索ノード４０９に至る、経路上の各探索ノードのラベルを順に並べてタプルで表すと、〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉となる。そして、このタプルは、図９のネットワーク１において学習された経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉である。
【０７３５】
本実施形態によれば、データフレームが転送されながら動的に経路が探索されるが、その探索順を探索木４００で表すと、図３９のとおり深さ優先探索順である。幅優先探索ではなく深さ優先探索が行われることは、データフレームがマルチキャストされず常にユニキャストされることからも理解される。
【０７３６】
そして、以上の説明から明らかなとおり、ＦＩＤ管理テーブル１０５のエントリのエージング時間Ｇｆが適切に設定されていれば、ネットワーク１内でＧＳからＧＤに至る経路が見つかるまで、潜在的に可能な経路が深さ優先探索により調べつくされる。すなわち、エージング時間Ｇｆが短すぎなければ、ＧＳからＧＤに至る経路が存在さえすれば、経路は必ず見つかる。なお、図２４に関して述べた「最悪ケース」とは、探索木４００の深さ優先探索順でのトラバース（traverse）において、ＧＤのノード装置のノードＩＤをラベルとして有する探索ノードが、最後に見つかる場合のことである。
【０７３７】
続いて、さらに別の観点から本実施形態について説明する。
図４０は、ハローフレームの送受信による隣接ノードの認識と図９の経路選択とを示すタイミングチャートである。
【０７３８】
図４のネットワーク１において、各ノード装置Ｎ１〜Ｎ７は、独立してそれぞれ図２１のハローフレーム送信処理を行う。どのノード装置が先にハローフレームを送信するかは任意であるが、図４０の例では、まずステップＳ１２０１でノード装置Ｎ２が図２１のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ２に隣接するノード装置Ｎ１、Ｎ３、およびＮ６でそれぞれ受信される。そして、ノード装置Ｎ１、Ｎ３、およびＮ６は、それぞれ図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ２を隣接ノード装置として認識する。
【０７３９】
また、図４０の例では、続いてステップＳ１２０２で、ノード装置Ｎ４が図２１のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ４に隣接するノード装置Ｎ３、Ｎ５、およびＮ７でそれぞれ受信される。そして、ノード装置Ｎ３、Ｎ５、およびＮ７は、それぞれ図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ４を隣接ノード装置として認識する。
【０７４０】
さらに、ステップＳ１２０３では、ノード装置Ｎ３が図２１のステップＳ４０３を実行し、図１０のハローフレーム３１２を送信する。すると、ハローフレーム３１２はノード装置Ｎ３に隣接するノード装置Ｎ２、Ｎ４、およびＮ５でそれぞれ受信される。そして、ノード装置Ｎ２、Ｎ４、およびＮ５は、それぞれ図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ３を隣接ノード装置として認識する。
【０７４１】
また、ステップＳ１２０４では、ノード装置Ｎ７が図２１のステップＳ４０３を実行し、ハローフレームを送信する。なお、ステップＳ１２０４の時点では、ノード装置Ｎ４とＮ７の間のリンクには障害がまだ生じていないものとする。よって、ハローフレームはノード装置Ｎ７に隣接するノード装置Ｎ４とＮ６でそれぞれ受信される。そして、ノード装置Ｎ４とＮ６は、それぞれ図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ７を隣接ノード装置として認識する。
【０７４２】
また、ステップＳ１２０５では、ノード装置Ｎ１が図２１のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ１に隣接するノード装置Ｎ２で受信される。そして、ノード装置Ｎ２は、図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ１を隣接ノード装置として認識する。
【０７４３】
さらに、ステップＳ１２０６では、ノード装置Ｎ６が図２１のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ６に隣接するノード装置Ｎ２とＮ７でそれぞれ受信される。そして、ノード装置Ｎ２とＮ７は、それぞれ図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ６を隣接ノード装置として認識する。
【０７４４】
そして、ステップＳ１２０７では、ノード装置Ｎ５が図２１のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ５に隣接するノード装置Ｎ３とＮ４でそれぞれ受信される。そして、ノード装置Ｎ３とＮ４は、それぞれ図１９のステップＳ２０３で図２０のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ５を隣接ノード装置として認識する。
【０７４５】
以上のステップＳ１２０１〜Ｓ１２０７により、図１および図９に示すネットワーク１内のノード装置Ｎ１〜Ｎ７は、それぞれ隣接ノード装置を認識し、隣接ノード管理テーブル１０３−Ｎ１〜１０３−Ｎ７を更新する。また、図２０に示すように、ノード装置Ｎ１〜Ｎ７は、ハローフレームの受信を契機として、場合によっては重み付けテーブル１０４−Ｎ１〜１０４−Ｎ７）を更新することもある。
【０７４６】
その後、ステップＳ１２０８でノード装置Ｎ４とＮ７の間のリンクに障害が発生する。
また、障害の発生とは関係なく、ステップＳ１０１でノード装置Ｎ１が、ノード装置Ｎ７をＧＤとして指定するデータフレームを、ノード装置Ｎ２をＬＤとして指定して送信する。つまり、ステップＳ１０１でノード装置Ｎ１は、図３４Ａ，３４Ｂ〜３５の処理を行う。
【０７４７】
すると、データフレームを受信したノード装置Ｎ２は、図１９のステップＳ２０５から図２５〜２９Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ２がＡＣＫフレームを送信することが、図４０ではステップＳ１０１ａとして表現されている。
【０７４８】
他方、ノード装置Ｎ１は、図３５のステップＳ１１２１でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ１は、ステップＳ１０１ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ１１２１の待機を終え、ステップＳ１１２２とＳ１１２３を実行し、図３５の処理を終える。
【０７４９】
また、ステップＳ１０１ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ２は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ３を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１０２に相当する。なお、図１０には、ステップＳ１０２で送信されるデータフレーム３０３が例示されている。
【０７５０】
すると、データフレームを受信したノード装置Ｎ３は、図１９のステップＳ２０５から図２５〜２９Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図４０ではステップＳ１０２ａとして表現されている。なお、図１０には、ステップＳ１０２ａで送信されるＡＣＫフレーム３２２が例示されている。
【０７５１】
他方、ノード装置Ｎ２は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ２は、ステップＳ１０２ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２７の処理を終える。
【０７５２】
また、ステップＳ１０２ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ４を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１０３に相当する。なお、図１０には、ステップＳ１０３で送信されるデータフレーム３０４が例示されている。
【０７５３】
すると、データフレームを受信したノード装置Ｎ４は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ４がＡＣＫフレームを送信することが、図４０ではステップＳ１０３ａとして表現されている。
【０７５４】
他方、ノード装置Ｎ３は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１０３ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２７の処理を終える。
【０７５５】
また、ステップＳ１０３ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ４は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ７を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１０４に相当する。
【０７５６】
しかし、ステップＳ１２０８でノード装置Ｎ４とＮ７の間のリンクには障害が発生しており、データフレームはノード装置Ｎ７に到達しない。そのため、図４０ではステップＳ１０４の矢印は、途中から破線になっている。
【０７５７】
ノード装置Ｎ４は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。しかし、ノード装置Ｎ７からＡＣＫフレームが受信されないため、ノード装置Ｎ４は、定期的に実行している図３３の処理のステップＳ１００３において、ノード装置Ｎ７へのデータフレームの送信が失敗したと認識する。
【０７５８】
その結果、ノード装置Ｎ４は、ステップＳ８２５の待機を終え、ステップＳ８２６、Ｓ８２８、Ｓ８２９、Ｓ８１８の処理を順に実行する。そして、ノード装置Ｎ４は、続くステップＳ８１９において、ＬＤとしてノード装置Ｎ５を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０５に相当する。
【０７５９】
すると、データフレームを受信したノード装置Ｎ５は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ５がＡＣＫフレームを送信することが、図４０ではステップＳ１０５ａとして表現されている。
【０７６０】
他方、ノード装置Ｎ４は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ４は、ステップＳ１０５ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２７の処理を終える。
【０７６１】
また、ステップＳ１０５ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ５は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ３を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１０６に相当する。
【０７６２】
すると、データフレームを受信したノード装置Ｎ３は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図４０ではステップＳ１０６ａとして表現されている。
【０７６３】
他方、ノード装置Ｎ５は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ５は、ステップＳ１０６ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２７の処理を終える。
【０７６４】
また、ステップＳ１０６ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ５を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１０７に相当する。
【０７６５】
すると、データフレームを受信したノード装置Ｎ５は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ５がＡＣＫフレームを送信することが、図４０ではステップＳ１０７ａとして表現されている。
【０７６６】
他方、ノード装置Ｎ３は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１０７ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２７の処理を終える。
【０７６７】
また、ステップＳ１０７ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ５は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図２７のステップＳ８１８から図２８のステップＳ８３０へと進み、ノード装置Ｎ５はステップＳ８３０で、ＯＬＳであるノード装置Ｎ４をＬＤとして指定してデータフレームを送信する。ステップＳ８３０での送信が、図４０のステップＳ１０８に相当する。
【０７６８】
すると、データフレームを受信したノード装置Ｎ４は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ４がＡＣＫフレームを送信することが、図４０ではステップＳ１０８ａとして表現されている。
【０７６９】
他方、ノード装置Ｎ５は、図２８のステップＳ８３６でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ５は、ステップＳ１０８ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８３６の待機を終え、ステップＳ８３７とＳ８３９を実行し、図２８の処理を終える。
【０７７０】
また、ステップＳ１０８ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ４は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図２７のステップＳ８１８から図２８のステップＳ８３０へと進み、ノード装置Ｎ４はステップＳ８３０で、ＯＬＳであるノード装置Ｎ３をＬＤとして指定してデータフレームを送信する。ステップＳ８３０での送信が、図４０のステップＳ１０９に相当する。
【０７７１】
すると、データフレームを受信したノード装置Ｎ３は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図４０ではステップＳ１０９ａとして表現されている。
【０７７２】
他方、ノード装置Ｎ４は、図２８のステップＳ８３６でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ４は、ステップＳ１０９ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８３６の待機を終え、ステップＳ８３７とＳ８３９を実行し、図２８の処理を終える。
【０７７３】
また、ステップＳ１０９ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図２７のステップＳ８１８から図２８のステップＳ８３０へと進み、ノード装置Ｎ３はステップＳ８３０で、ＯＬＳであるノード装置Ｎ２をＬＤとして指定してデータフレームを送信する。ステップＳ８３０での送信が、図４０のステップＳ１１０に相当する。
【０７７４】
すると、データフレームを受信したノード装置Ｎ２は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ２がＡＣＫフレームを送信することが、図４０ではステップＳ１１０ａとして表現されている。
【０７７５】
他方、ノード装置Ｎ３は、図２８のステップＳ８３６でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１１０ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８３６の待機を終え、ステップＳ８３７とＳ８３９を実行し、図２８の処理を終える。
【０７７６】
また、ステップＳ１１０ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ２は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ６を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１１１に相当する。
【０７７７】
すると、データフレームを受信したノード装置Ｎ６は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ６がＡＣＫフレームを送信することが、図４０ではステップＳ１１１ａとして表現されている。
【０７７８】
他方、ノード装置Ｎ２は、図２７のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ２は、ステップＳ１１１ａで送信されるＡＣＫフレームを受信すると、図１９のステップＳ２０６から図３２の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２７の処理を終える。
【０７７９】
また、ステップＳ１１１ａに示すように図２５のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ６は、ステップＳ８０４以降の処理を続行し、図２７のステップＳ８１９で、ＬＤとしてノード装置Ｎ７を指定してデータフレームを送信する。ステップＳ８１９での送信が、図４０のステップＳ１１２に相当する。
【０７８０】
すると、データフレームを受信したノード装置Ｎ７は、図１９のステップＳ２０５から図２５〜図２９Ａ〜Ｈの処理を呼び出して実行する。図２５のステップＳ８０３でノード装置Ｎ７がＡＣＫフレームを送信することが、図４０ではステップＳ１１２ａとして表現されている。
【０７８１】
以上説明した一連の処理により、ネットワーク１全体では、たとえステップＳ１２０８で障害が発生しようとも、ノード装置Ｎ１〜Ｎ７の自律分散協調の結果として、動的に経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉が選択され、学習される。すなわち、以上の一連の処理によりノード装置Ｎ１〜Ｎ６では重み付けテーブル１０４−Ｎ１〜１０４−Ｎ６が更新されている。
【０７８２】
したがって、ステップＳ１１２ａの後には、学習の結果として、ノード装置Ｎ７をＧＤとして指定するデータフレームは、図９のようにネットワーク１内で試行錯誤的にバックトラックしながら転送される代わりに、初めから効率よく転送される。具体例をいくつか挙げれば、下記のとおりである。
【０７８３】
（Ｐ１）ノード装置Ｎ１がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを隣接するノード装置Ｎ２に送信すると、ノード装置Ｎ２は、学習された重み付けテーブル１０４−Ｎ２に基づき、最初からＬＤとしてノード装置Ｎ６を選択する。そして、データフレームはノード装置Ｎ６からＧＤであるノード装置Ｎ７へと送信される。
【０７８４】
（Ｐ２）同様に、ノード装置Ｎ２がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを送信するときも、ノード装置Ｎ２は、学習された重み付けテーブル１０４−Ｎ２に基づき、最初からＬＤとしてノード装置Ｎ６を選択する。そして、データフレームはノード装置Ｎ６からＧＤであるノード装置Ｎ７へと送信される。
【０７８５】
（Ｐ３）ノード装置Ｎ５がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを送信するとき、ノード装置Ｎ５は、学習された重み付けテーブル１０４−Ｎ５に基づき、バックトラックの生じたノード装置Ｎ３ではなく、ノード装置Ｎ４を最初にＬＤとして選択する。以下同様にして、ノード装置Ｎ４はＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３はＬＤとしてノード装置Ｎ２を選択し、ノード装置Ｎ２はＬＤとしてノード装置Ｎ６を選択し、ノード装置Ｎ６はＬＤとしてノード装置Ｎ７を選択する。
【０７８６】
（Ｐ４）ノード装置Ｎ３がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを送信するとき、ノード装置Ｎ３は、学習された重み付けテーブル１０４−Ｎ３に基づき、ノード装置Ｎ２をＬＤとして選択する。したがって、データフレームは、最初から効率よく経路〈Ｎ３，Ｎ２，Ｎ６，Ｎ７〉に沿って転送される。
【０７８７】
以上のように本実施形態によれば、図９のようにバックトラックによってネットワーク１内で試行錯誤的かつ動的に経路が選択されると、バックトラックの過程で経由した各ノード装置において、重み付けテーブル１０４の重みという形で、適切な経路が学習される。よって、ＧＤとして同じくノード装置Ｎ７が指定されたデータフレームが今後送信される場合には、上記（Ｐ１）〜（Ｐ４）の例のように、学習の結果にしたがって、経路選択が効率化される。
【０７８８】
図４１Ａは、本実施形態の効果の説明図（その１）である。
図４１Ａは、図９の場合と同様にして、図４のネットワーク１において動的かつ自律分散的に経路が選択される様子を説明する図である。具体的には、図４１Ａは、ノード装置Ｎ１がＧＳとなって、ノード装置Ｎ７をＧＤとして指定したデータフレームを送信する場合の、ネットワーク１内での経路選択の様子を示す。
【０７８９】
いま、ノード装置Ｎ１から送信された到達保証データフレームが、図４１ＡのＳ１８０１、Ｓ１８０２、Ｓ１８０３、Ｓ１８０４の順で、各ノード装置間を転送され、最終的にノード装置Ｎ７に到達する。この結果今度は、ノード装置Ｎ７をＧＳとして、図４１ＡのＳ１８１１、Ｓ１８１２、Ｓ１８１３、Ｓ１８１４の順で、到達保証データフレームに対する到達保証ＡＣＫフレームが返送され、最終的に到達保証データフレームのＧＳであったノード装置Ｎ１に戻る。この場合、到達保証データフレームがＳ１８０１、Ｓ１８０２、Ｓ１８０３、Ｓ１８０４の順で転送されるに従って、各ノード装置に到達保証転送記録テーブル１１５が作成される。そして、到達保証ＡＣＫフレームが返送される復路の経路Ｓ１８１１、Ｓ１８１２、Ｓ１８１３、Ｓ１８１４は、往路の経路Ｓ１８０１、Ｓ１８０２、Ｓ１８０３、Ｓ１８０４を逆にたどるようにリレーされる。この結果、到達保証データフレームに対するグローバルなＡＣＫである到達保証ＡＣＫフレームを、確実にＧＤからＧＳに返すことが可能となる。ひいては、ＧＳとＧＤ間で、無線アドホックネットワークを前提としつつ、非常に安定性の高い通信を実現することができる。
【０７９０】
図４１Ｂは、本実施形態の効果の説明図（その２）である。
この図では、到達保証データフレームの転送経路はＳ１９０１、Ｓ１９０２、Ｓ１９０３、Ｓ１９０４である。また、その到達保証データフレームに対応する到達保証ＡＣＫフレームの転送経路はＳ１９１１、Ｓ１９１２、Ｓ１９１３、となる。ところが、Ｓ１９１３の経路において、ノード装置Ｎ3をＮ2の間で通信障害が発生し、その部分で到達保証ＡＣＫフレームが消失してしまった。この結果、ノード装置Ｎ1は到達保証ＡＣＫフレームを受信することができず、再送タイムアウトにより、到達保証データフレームの再送が発生する。再送フレームの経路は、Ｓ１９２１Ｓ１９２２となる。ここで、再送された到達保証データフレームを受信したノード装置Ｎ3は、それより前にその到達保証データに対応する到達保証ＡＣＫフレームを受信したことを、到達保証転送記録テーブル１１５によって知っている。このような場合には、再送された到達保証データフレームをそれ以上転送させることをストップさせる。その代わりに、到達保証データフレームがＧＤのノード装置Ｎ７で正常に受信されたことを示す到達保証ＡＣＫフレームを、Ｓ１９３１、Ｓ１９３２という経路でノード装置Ｎ1に返す。これにより、無駄なトラフィックが抑制される。
【０７９１】
図４１Ｃは、本実施形態の効果の説明図（その３）である。
この図では、ノード装置Ｎ1からノード装置Ｎ7に到達保証データフレームが転送されるときに、かなり経路を迷いながら到達している様子が示されている。すなわち、Ｓ１０１、Ｓ１０２、Ｓ１０３と経路がたどられたあと、Ｓ１０４においてバックトラックが発生している。その後、Ｓ１０５、Ｓ１０６、Ｓ１０７でノード装置Ｎ3に戻ってしまい、その後、Ｓ１０７、Ｓ１０８、Ｓ１０９、Ｓ１１０、Ｓ１１１、Ｓ１１２とたどって、到達保証データフレームがノード装置Ｎ7にたどりついている。本実施例では、何回かの試行錯誤により、無線アドホックネットワークが自律的に適切な経路を選ぶように動作し、最終的に、ノード装置Ｎ1から、Ｎ２、Ｎ6を通ってノード装置Ｎ７に至る経路が選択されるようになる。ここで、本実施形態において図１Ｂ、図２Ｂ、図３Ｂ等の到達保証転送記録テーブル１１５に記憶されるＬＳは、最初は効率の悪い場所のノードＩＤが選択されたり、また、バックトラックが発生しているノード装置Ｎ4のノードＩＤが選択されたりしている。しかし、最終的には、ノード装置Ｎ1から、Ｎ２、Ｎ6を通ってノード装置Ｎ７に至る最新のＬＳが、到達保証転送記録テーブル１１５に記憶されるようになる。なお、効率の悪い経路のエントリは、到達保証転送記録テーブル１１５上ではエージング処理によって自然に淘汰されてゆく。この結果、ノード装置Ｎ７からノード装置Ｎ1に返送される到達保証ＡＣＫフレームの経路は、Ｓ２００１、Ｓ２００２，Ｓ２００３という適切な経路が選ばれるようになる。このようにして、本実施形態による動的経路選択アルゴリズムに同期するようにして、到達保証ＡＣＫフレームの転送経路が決定されてゆく。この場合、到達保証ＡＣＫフレームは、経路上の各ノード装置が保持する到達保証転送記録テーブル１１５によって管理される。このため、無線品質の低下などによる経路上での到達保証ＡＣＫフレームの消失などに対して、各ノードが自律的に判断することによって、適切な再送制御を実施することが可能となる。
【０７９２】
図４１Ｄは、本実施形態の効果の説明図（その４）である。
この図も図４１Ｃと同様である。トラックバックこそないが、最初は、到達保証データフレームは、Ｓ２１０１、Ｓ２１０２、Ｓ２１０３、Ｓ２１０４、Ｓ２１０５、Ｓ２１０６、Ｓ２１０７という非効率な経路をたどっていた。しかし、そのうちに適切な経路が選択されるようになり、到達保証ＡＣＫフレームの経路も、Ｓ２１１１、Ｓ２１１２、Ｓ２１１３、Ｓ２１１４というように効率的な経路が選択されるようになる。この場合も、到達保証転送記録テーブル１１５に常に最新のＬＳが記憶されるように制御される結果、無線品質の変動を吸収しながら、効率のよい再送制御を実現することが可能となる。
【０７９３】
なお、本実施形態の変形として、ローカルなＡＣＫと到達保証ＡＣＫとが組み合わせられて運用されてもよい。
【図１Ａ】
0005500246.tif 000002
【図１Ｂ】
0005500246.tif 000003
【図２Ａ】
0005500246.tif 000004
【図２Ｂ】
0005500246.tif 000005
【図３Ａ】
0005500246.tif 000006
【図３Ｂ】
0005500246.tif 000007
【図４】
0005500246.tif 000008
【図５】
0005500246.tif 000009
【図６】
0005500246.tif 000010
【図７】
0005500246.tif 000011
【図８】
0005500246.tif 000012
【図９】
0005500246.tif 000013
【図１０】
0005500246.tif 000014
【図１１】
0005500246.tif 000015
【図１２】
0005500246.tif 000016
【図１３】
0005500246.tif 000017
【図１４】
0005500246.tif 000018
【図１５】
0005500246.tif 000019
【図１６】
0005500246.tif 000020
【図１７】
0005500246.tif 000021
【図１８】
0005500246.tif 000022
【図１９】
0005500246.tif 000023
【図２０】
0005500246.tif 000024
【図２１】
0005500246.tif 000025
【図２２】
0005500246.tif 000026
【図２３】
0005500246.tif 000027
【図２４】
0005500246.tif 000028
【図２５】
0005500246.tif 000029
【図２６】
0005500246.tif 000030
【図２７】
0005500246.tif 000031
【図２８】
0005500246.tif 000032
【図２９Ａ】
0005500246.tif 000033
【図２９Ｂ】
0005500246.tif 000034
【図２９Ｃ】
0005500246.tif 000035
【図２９Ｄ】
0005500246.tif 000036
【図２９Ｅ】
0005500246.tif 000037
【図２９Ｆ】
0005500246.tif 000038
【図２９Ｇ】
0005500246.tif 000039
【図２９Ｈ】
0005500246.tif 000040
【図３０Ａ】
0005500246.tif 000041
【図３０Ｂ】
0005500246.tif 000042
【図３１】
0005500246.tif 000043
【図３２】
0005500246.tif 000044
【図３３】
0005500246.tif 000045
【図３４Ａ】
0005500246.tif 000046
【図３４Ｂ】
0005500246.tif 000047
【図３５】
0005500246.tif 000048
【図３６】
0005500246.tif 000049
【図３７】
0005500246.tif 000050
【図３８】
0005500246.tif 000051
【図３９】
0005500246.tif 000052
【図４０】
0005500246.tif 000053
【図４１Ａ】
0005500246.tif 000054
【図４１Ｂ】
0005500246.tif 000055
【図４１Ｃ】
0005500246.tif 000056
【図４１Ｄ】
0005500246.tif 000057