(57)【要約】ノード装置は、送信対象フレームと、送信先の隣接ノード装置と、ホップ数１以下の範囲で送信対象フレームの起源として認識されるノード装置それぞれの識別情報を対応付けて記憶する。ノード装置は、フレームを受信し、記憶している送信対象フレームの識別情報と受信フレームの識別情報が等しい場合、受信フレームの最終宛先に対応付けて記憶している送信可能性情報を更新する。送信可能性情報は、複数の隣接ノード装置それぞれへの送信可能性を示し、受信フレームの識別情報と対応付けられている送信先への送信可能性が「送信不能」を示すように、更新される。ノード装置は、送信可能な隣接ノード装置がなく、かつ記憶している送信対象フレームの識別情報が受信フレームの識別情報と等しい場合、受信フレームの識別情報に対応付けて起源として認識している隣接ノード装置へ、受信フレームを送信する。
2011013165.tif 000002
【特許請求の範囲】
【請求項１】
複数の隣接ノード装置のうち任意の１つからフレームを受信する受信手段と、
送信対象フレームを識別するフレーム識別情報と、前記複数の隣接ノード装置のうちで前記送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、該送信対象フレームを最初に送信してきた隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段と、
フレームの最終宛先に対応付けて、前記複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する第２の記憶手段と、
前記受信手段が受信した受信フレームを識別する受信フレーム識別情報が、前記第１の記憶手段に前記フレーム識別情報として記憶されている場合に、前記受信フレームに指定された最終宛先である受信フレーム宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報を、前記第１の記憶手段に前記受信フレーム識別情報と対応付けられて記憶されている前記送信先隣接ノード識別情報により識別される第１の隣接ノード装置への前記送信可能性が送信不能を示すように、更新する更新手段と、
前記受信フレーム宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報に基づいて、前記複数の隣接ノード装置の中から、送信可能な第２の隣接ノード装置を選択し、前記第２の隣接ノード装置へ前記受信フレームを送信する送信手段と、
前記第２の記憶手段の送信可能性情報において、前記複数の隣接ノード装置の中に送信可能なものがなく、かつ前記受信フレーム識別情報が前記第１の記憶手段に前記フレーム識別情報として記憶されている場合に、前記第１の記憶手段において前記受信フレーム識別情報に対応付けられた前記起源ノード識別情報として記憶される第３の隣接ノード装置へ前記受信フレームを送信するバックトラック手段と、
を備えることを特徴とするノード装置。
【請求項２】
前記受信手段が前記受信フレームを受信したとき、前記受信フレームを記憶するバッファ手段をさらに備え、
前記送信手段と前記バックトラック手段は、前記受信フレームの送信に成功したと認識すると、前記バッファ手段から前記受信フレームを削除する、
ことを特徴とする請求項１に記載のノード装置。
【請求項３】
前記受信フレーム識別情報が前記第１の記憶手段に前記フレーム識別情報として記憶されている場合、前記送信手段は、前記第３の隣接ノード装置を前記送信可能性情報によらず送信不能と見なして、前記第３の隣接ノード装置とは異なる、送信可能な前記第２の隣接ノード装置を選択し、前記バックトラック手段は、前記第３の隣接ノード装置を除いた前記複数の隣接ノード装置の中に送信可能なものがない場合に、前記第３の隣接ノード装置へ前記受信フレームを送信する
ことを特徴とする請求項１に記載のノード装置。
【請求項４】
前記受信フレーム識別情報が既に前記第１の記憶手段において前記フレーム識別情報として記憶されている場合、前記送信手段は、フレーム識別情報として前記受信フレーム識別情報を、送信先隣接ノード識別情報として該送信手段が該受信フレームを送信した送信先である隣接ノード装置の識別情報を、そして、起源ノード識別情報として既に前記第１の記憶手段に記憶されている前記フレーム識別情報に対応する前記起源ノード識別情報を、前記第１の記憶手段に互いに対応付けて記憶させ、
前記受信フレーム識別情報が前記第１の記憶手段に記憶されていない場合、前記送信手段は、フレーム識別情報として前記受信フレーム識別情報を、送信先隣接ノード識別情報として該送信手段が該受信フレームを送信した送信先である隣接ノード装置の識別情報を、そして、起源ノード識別情報として該受信フレームの送信元である隣接ノード装置の識別情報を、前記第１の記憶手段に互いに対応付けて記憶させる、
ことを特徴とする請求項１に記載のノード装置。
【請求項５】
新規フレームを生成する生成手段をさらに備え、
前記送信手段はさらに、
前記新規フレームの最終宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報に基づいて、前記複数の隣接ノード装置の中から、送信可能な隣接ノード装置を選択し、該選択した隣接ノード装置へ前記新規フレームを送信し、
フレーム識別情報として前記新規フレームを識別する新規フレーム識別情報を、送信先隣接ノード識別情報として前記選択した隣接ノード装置の識別情報を、そして、起源ノード識別情報として前記新規フレームを生成した前記ノード装置自身を識別する自ノード識別情報を、前記第１の記憶手段に互いに対応付けて記憶させる、
ことを特徴とする請求項１に記載のノード装置。
【請求項６】
前記バックトラック手段は、前記複数の隣接ノード装置の中に送信可能なものがなく、かつ前記第１の記憶手段に記憶されている前記フレーム識別情報が前記受信フレーム識別情報と等しく、かつ、前記起源ノード識別情報が自ノード識別情報である場合に、前記受信フレームを破棄する、
ことを特徴とする請求項５に記載のノード装置。
【請求項７】
ノード装置が備えるコンピュータに複数の隣接ノード装置のうち任意の１つへフレームを送信させる送信プログラムを記憶した記憶媒体であって、
前記送信プログラムが前記コンピュータに
複数の隣接ノード装置のうち任意の１つから前記ノード装置が受信した受信フレームから、前記受信フレームを識別する受信フレーム識別情報を抽出する抽出ステップと、
送信対象フレームを識別するフレーム識別情報と、前記複数の隣接ノード装置のうちで前記送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、該送信対象フレームを最初に送信してきた前記隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段に、抽出した前記受信フレーム識別情報が前記フレーム識別情報として記憶されているか否か判断する判断ステップと、
前記受信フレーム識別情報が前記フレーム識別情報として記憶されていると判断した場合に、フレームの最終宛先に対応付けて前記複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する第２の記憶手段において、前記受信フレームに指定された最終宛先である受信フレーム宛先に対応付けられて記憶されている前記送信可能性情報を、前記第１の記憶手段に前記受信フレーム識別情報と対応付けられて記憶されている前記送信先隣接ノード識別情報により識別される第１の隣接ノード装置への前記送信可能性が送信不能を示すように、更新する更新ステップと、
前記受信フレーム宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報に基づいて、前記複数の隣接ノード装置の中から、送信可能な第２の隣接ノード装置を選択し、前記第２の隣接ノード装置へ前記受信フレームを送信する送信ステップと、
前記第２の記憶手段の送信可能性情報において、前記複数の隣接ノード装置の中に送信可能なものがなく、かつ前記受信フレーム識別情報が前記第１の記憶手段に前記フレーム識別情報として記憶されている場合に、前記第１の記憶手段において前記受信フレーム識別情報に対応付けられた前記起源ノード識別情報として記憶される第３の隣接ノード装置へ前記受信フレームを送信するバックトラックステップと、
を実行させることを特徴とする記憶媒体。
【請求項８】
ノード装置が、複数の隣接ノード装置のうち任意の１つへフレームを送信するフレーム送信方法であって、
前記ノード装置が、
前記複数の隣接ノード装置のうち任意の１つから前記ノード装置が受信した受信フレームから、前記受信フレームを識別する受信フレーム識別情報を抽出する抽出ステップと、
送信対象フレームを識別するフレーム識別情報と、前記複数の隣接ノード装置のうちで前記送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、該送信対象フレームを最初に送信してきた前記隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する第１の記憶手段に、抽出した前記受信フレーム識別情報が前記フレーム識別情報として記憶されているか否か判断する判断ステップと、
前記受信フレーム識別情報が前記フレーム識別情報として記憶されていると判断した場合に、フレームの最終宛先に対応付けて前記複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する第２の記憶手段において、前記受信フレームに指定された最終宛先である受信フレーム宛先に対応付けられて記憶されている前記送信可能性情報を、前記第１の記憶手段に前記受信フレーム識別情報と対応付けられて記憶されている前記送信先隣接ノード識別情報により識別される第１の隣接ノード装置への前記送信可能性が送信不能を示すように、更新する更新ステップと、
前記受信フレーム宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報に基づいて、前記複数の隣接ノード装置の中から、送信可能な第２の隣接ノード装置を選択し、前記第２の隣接ノード装置へ前記受信フレームを送信する送信ステップと、
前記第２の記憶手段の送信可能性情報において、前記複数の隣接ノード装置の中に送信可能なものがなく、かつ前記受信フレーム識別情報が前記第１の記憶手段に前記フレーム識別情報として記憶されている場合に、前記第１の記憶手段において前記受信フレーム識別情報に対応付けられた前記起源ノード識別情報として記憶される第３の隣接ノード装置へ前記受信フレームを送信するバックトラックステップと、
を備えることを特徴とするフレーム送信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のノードを含むネットワークにおける、経路選択が可能なノード装置に関する。
【背景技術】
【０００２】
ネットワーク装置に関しては、これまで非常に多くの研究がなされている。最も普及しているのは、ＩＰ（Internet
Protocol）ネットワークを利用したネットワーク装置である。また、複数のプロトコルやネットワークを収容することを目的としたＭＰＬＳ（Multi Protocol Labeled Switching）は、自動的に経路を作成する機構を持つネットワーク装置に関する技術である。また、アドホックアルゴリズムの代表例としてＡＯＤＶ（Ad-hoc On-Demand Vector）やＯＬＳＲ（Optimized Link
State Routing）がある。【０００３】
ＩＰネットワーク装置では、ＩＰアドレスにしたがいパケットをルーティングする。ＩＰアドレスは木構造を持つ。よって、次のような手順により、最終的に目標とする端末へパケットを伝送することができる。すなわち、パケットの宛先ＩＰアドレスの上位オクテットから順に、宛先ＩＰアドレスと前方一致するＩＰアドレスに対応するＩＰネットワークを管理するネットワーク装置が検索され、見つかったネットワーク装置へのパケットの伝送するが繰り返される。【０００４】
ルーティングはＩＰアドレス体系により決定されている。どのネットワーク装置かどのＩＰネットワークを管理しているかは、ルーティングテーブルによって規定される。ルーティングテーブルは手動で設定されることも多いが、ＲＩＰ（Routing Information Protocol）により自動的に更新されることもある。ＲＩＰとは、ネットワーク装置が管理するＩＰネットワークを周囲にブロードキャストし、ネットワーク装置が互いの管理するＩＰネットワークを確認する方式である。【０００５】
ＭＰＬＳでは、ネットワークが、ＬＳＲ（Label Switch Router）と呼ばれるネットワーク装置間のネットワークである内部ネットワークと、外部ネットワークとに分離される。外部ネットワークからのフレームは、エッジノードと呼ばれる装置（すなわち外部ネットワークと内部ネットワークの両方にまたがるネットワーク装置）によって、内部ネットワークに取り込まれる。【０００６】
このとき、外部フレームの先頭にはラベルが挿入される。各ＬＳＲは、それぞれがラベル転送テーブルを持つ。ラベル転送テーブルは、入力フレームのラベルと出力フレームのラベルおよび宛先を保持する。ＬＳＲは、入力されるフレームのラベルを取り出し、該当するラベルをラベル転送テーブルから発見し、出力フレームのラベルに書き換え、該当する宛先に送出する。【０００７】
以上の処理は、ラベル転送テーブルのＬＤＰ（Label Distribution Protocol）によって行われる。ＬＤＰは、まずＲＩＰなどによりルーティングテーブルの作成を行い、これにラベルを付加し、隣接ノード間で通知しあうプロトコルである。【０００８】
ＡＯＤＶは、経路検索にブロードキャストを用いて、他の通信ノード装置がブロードキャストを繰り返し、目的のノード装置への経路を発見する手法である。通信ノード装置は、目標とする経路を発見するために周囲に「Route Request（ＲＲＥＱ）」というフレームを送出する。このフレームには、検索目標の通信ノードＩＤが明記されている。【０００９】
周囲の通信ノード装置は、自身を検索していない場合は、新たにＲＲＥＱフレームを作成して、周囲へのブロードキャストを繰り返し行う。このとき各通信ノード装置は、送り元のメッセージが、隣接するどの通信ノード装置から受信されたものなのかを記録する。ＲＲＥＱメッセージが目的の通信ノード装置に達したとき、その目的の通信ノード装置は、「Route Reply（ＲＲＥＰ）」フレームを作成し、送り元のノードに対して、ＲＲＥＱフレームが送られてきた経路をたどるようにしてＲＲＥＰフレームを送信する。このようにして、双方向の通信経路が作成されている。【００１０】
ＯＬＳＲ（Optimized Link State Routing）では、通信ノード装置同士が定期的にフレームを交換しあうことで、ネットワーク全体を把握し、目的の通信ノードまでの経路を検出するという方式を採用している。通信ノード装置は、周期的にＨＥＬＬＯ（ハロー）フレームを送出し、互いに存在を通知しあう。通信相手となる通信ノード装置の存在が判明したところで、次に効率的にネットワーク全体にフレームを配信するためのフラッディング用のパスが生成される。これをＭＰＲ（Multi Point Relay）と呼ぶ。【００１１】
ＭＰＲにより、各通信ノード装置から効率よくフレームをネットワーク全体へブロードキャストすることができる。次にこのＭＰＲを用いて、経路作成メッセージであるＴＣ（Topology Control）フレームをノード装置同士が互いに配信することで、全ノード装置がネットワークトポロジーを知ることができる。【００１２】
フレームを、目標とする通信ノード装置に送るには、送出元となる通信ノード装置自身が知っているネットワークトポロジーを参照し、送るべき隣接通信ノード装置にフレームを託す。隣接ノード装置も同様に処理を行い、最終的に目標ノード装置にフレームが届けられる。【００１３】
アドホック無線通信ネットワークに関しては、例えば、次のような技術も開示されている。すなわち、各ノードがハローメッセージとして自ノードの存在を通知する情報と、自ノードまでのルートメトリックとを含んだ情報を放送する。そして、ハローメッセージを受信した他ノードは、受信したルートメトリックにハローメッセージを放送してきたノードと自ノードとの間のルートのためのルートメトリックを追加し、追加後のルートメトリックを使用する。ここでのルートメトリックは、ホップ数、リンク品質等の因子により算出される、送信元と宛先とのコストを表す値である。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特表２００６−５２６９３７号公報
【特許文献２】特開２００３−２７３９６４号公報
【特許文献３】特開２００２−２７１３９９号公報
【特許文献４】特開２００６−３４０１６５号公報
【特許文献５】特開２００１−２９８４８８号公報
【特許文献６】特開２００６−３３２７５号公報
【特許文献７】特許４１７３８４２号公報
【非特許文献】
【００１５】
【非特許文献１】岩尾忠重、山田健二、野村浩司、細川武司著「多用途向け有線センサネットワーク：Ｓ−ｗｉｒｅ」雑誌ＦＵＪＩＴＳＵ、２００６年５月号（ＶＯＬ．５７、ＮＯ．３）、２８５〜２９０ページ
【発明の概要】
【発明が解決しようとする課題】
【００１６】
上記のように、ネットワーク技術に関しては多くの研究がなされているが、ネットワーク内の各ノード装置がネットワークトポロジを認識することを前提とした各種ネットワークシステムには、次のような問題がある。すなわち、ネットワーク環境は動的に変わりうるため、ノード装置が、事前に経路生成フェーズで認識したネットワークトポロジに基づいて、データ送信フェーズでデータを送信しようとしても、必ずしも送信に成功するとは限らない。【００１７】
そこで本発明は、データが送信される時点でのネットワークトポロジを各ノード装置が認識していなくても、ネットワーク全体としては、各ノード装置による自律分散処理の結果として、適切な経路が選択されてデータが送信される技術を提供することを目的とする。
【課題を解決するための手段】
【００１８】
一態様においてはノード装置が提供される。前記ノード装置は、受信手段と、第１の記憶手段と、第２の記憶手段と、更新手段と、送信手段と、バックトラック手段とを備える。【００１９】
前記受信手段は、複数の隣接ノード装置のうち任意の１つからフレームを受信する。
前記第１の記憶手段は、送信対象フレームを識別するフレーム識別情報と、前記複数の隣接ノード装置のうちで前記送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報と、該送信対象フレームを最初に送信してきた隣接ノード装置を識別する起源ノード識別情報とを対応付けて記憶する。【００２０】
前記第２の記憶手段は、フレームの最終宛先に対応付けて、前記複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する。
前記更新手段は、前記受信手段が受信した受信フレームを識別する受信フレーム識別情報が、前記第１の記憶手段に前記フレーム識別情報として記憶されている場合に、次のように動作する。すなわち、前記更新手段は、前記受信フレームに指定された最終宛先である受信フレーム宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報を、前記第１の記憶手段に前記受信フレーム識別情報と対応付けられて記憶されている前記送信先隣接ノード識別情報により識別される第１の隣接ノード装置への前記送信可能性が送信不能を示すように、更新する。【００２１】
前記送信手段は、前記受信フレーム宛先に対応付けられて前記第２の記憶手段に記憶されている前記送信可能性情報に基づいて、前記複数の隣接ノード装置の中から、送信可能な第２の隣接ノード装置を選択し、前記第２の隣接ノード装置へ前記受信フレームを送信する。【００２２】
前記バックトラック手段は、前記第２の記憶手段の送信可能性情報において、前記複数の隣接ノード装置の中に送信可能なものがなく、かつ前記受信フレーム識別情報が前記第１の記憶手段に前記フレーム識別情報として記憶されている場合に、次のように動作する。すなわち、前記バックトラック手段は、前記第１の記憶手段において前記受信フレーム識別情報に対応付けられた前記起源ノード識別情報として記憶される第３の隣接ノード装置へ前記受信フレームを送信する。
【発明の効果】
【００２３】
上記ノード装置によれば、上記ノード装置が送信したことのあるフレームがネットワークを経由して上記ノード装置自身に受信されると、前回選択した隣接ノード装置とは別の隣接ノード装置が送信先として試される。そして、送信可能な隣接ノード装置がないと、バックトラック手段によって上記第３の隣接ノード装置へと受信フレームが送信されるので、第３の隣接ノード装置に別の新たな経路を試させることができる。【００２４】
よって、上記ノード装置と同様の複数のノード装置を含むネットワークにおいては、ネットワークトポロジを各ノード装置が認識していなくても、次のような効果が得られる。すなわち、ネットワーク全体としては、各ノード装置による自律分散処理の結果として、適切な経路が選択されてデータが送信される
【図面の簡単な説明】
【００２５】
【図１】ネットワーク構成の第１の例を示す図である。
【図２】ネットワーク構成の第２の例を示す図である。
【図３】第１実施形態におけるノード装置の構成を示す機能ブロック図である。
【図４】第１実施形態におけるノード装置のハードウェア構成を示す図である。
【図５】１つのノード装置に注目して重みの学習について説明する図である。
【図６】図１のネットワーク１において動的かつ自律分散的に経路が選択される様子を説明する図である。
【図７】フレームの例を示す図である。
【図８】図３のバッファ部１０９に格納されるデータの例を示す図である。
【図９】図３の隣接ノード管理テーブル１０３の例を示す図である。
【図１０】図３の重み付けテーブル１０４の例を示す図である。
【図１１】図１０の重み付けテーブル１０４−１−Ｎ３の変化を説明する図である。
【図１２】図３のＦＩＤ管理テーブル１０５の例を示す図（その１）である。
【図１３】図３のＦＩＤ管理テーブル１０５の例を示す図（その２）である。
【図１４】フレーム受信処理のフローチャートである。
【図１５】図１４のステップＳ２０３におけるハローフレーム受信処理のフローチャートである。
【図１６】ハローフレーム送信処理のフローチャートである。
【図１７】隣接ノード管理テーブル１０３のエージング処理のフローチャートである。
【図１８】重み付けテーブル１０４のエージング処理のフローチャートである。
【図１９】ＦＩＤ管理テーブル１０５のエージング処理のフローチャートである。
【図２０】図１４のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その１）である。
【図２１】図１４のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その２）である。
【図２２】図１４のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その３）である。
【図２３】図１４のステップＳ２０５におけるデータフレーム受信処理のフローチャート（その４）である。
【図２４】図２１のステップＳ８１２ａにおける重み付けテーブル調整処理のフローチャートである。
【図２５】図１４のステップＳ２０６におけるＡＣＫフレーム受信処理のフローチャートである。
【図２６】ＡＣＫフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。
【図２７】ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その１）である。
【図２８】ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャート（その２）である。
【図２９】ＧＳにもなりうるノード装置１００が、データフレーム受信処理の一部として図２３の処理の代わりに行う処理のフローチャートである。
【図３０】経路を探索するための探索空間を表す探索木の形式で、図６における経路選択を説明する図である。
【図３１】ハローフレームの送受信による隣接ノードの認識と図６の経路選択とを示すタイミングチャートである。
【図３２】第２実施形態が適用される有線ネットワークの例を示す図である。
【図３３】第２実施形態における隣接ノード管理テーブル１０３ａの例を示す図である。
【図３４】ループ判定があるがバックトラック動作のない第１比較例について説明する図（その１）である。
【図３５】ループ判定があるがバックトラック動作のない第１比較例について説明する図（その２）である。
【図３６】擬似的なバックトラック動作は行うがループ判定を行わない第２比較例について説明する図である。
【発明を実施するための形態】
【００２６】
以下、いくつかの実施形態について、図面を参照しながら詳細に説明する。具体的には、まず図１と図２を参照してネットワーク構成の例を説明し、図３〜３１を参照して第１実施形態について説明する。その後、図３２〜３３を参照して第２実施形態について説明し、その他の実施形態についても説明する。最後に、図３４〜３６に示す２つの比較例と比べながら、各実施形態に共通の利点について説明する。
【００２７】
図１はネットワーク構成の第１の例を示す図である。図１のネットワーク１は、以下の各実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。なお、以下では、ネットワークトポロジの観点からの説明においては、「ノード装置」を単に「ノード」ということもある。
【００２８】
ネットワーク１内の各ノード装置には、ネットワーク１内で一意な識別情報（以下、「ノードＩＤ（identification）」という）が予め割り当てられている。以下では、参照符号「Ｎｉ」がノードＩＤを示すものとし、例えば、ノードＩＤとしてＮｉが割り当てられたノード装置を「ノード装置Ｎｉ」のように参照する。なお、以下では、ノード装置Ｎｉにとって自分自身に割り当てられたノードＩＤであるＮｉを、ノード装置Ｎｉの「自ノードＩＤ」ともいう（図１では１≦ｉ≦７）。
【００２９】
また、図１ではリンクを実線で表している。具体的には、ネットワーク１のトポロジは次のとおりである。すなわち、ノード装置Ｎ１とＮ２の間、ノード装置Ｎ２とＮ３の間、ノード装置Ｎ２とＮ６の間、ノード装置Ｎ３とＮ４の間、ノード装置Ｎ３とＮ５の間、ノード装置Ｎ４とＮ５の間、ノード装置Ｎ４とＮ７の間、およびノード装置Ｎ６とＮ７の間に、各々リンクが存在する。
【００３０】
なお、以下で「リンク」とは、無線リンクでもよく、有線リンクでもよい。ノード装置ＮｉとＮｊが、他のノード装置Ｎｋによる中継を経ずに直接、無線により情報を通信しあうことができるとき、「ノード装置ＮｉとＮｊの間に無線リンクが存在する」という（図１では１≦ｉ，ｊ，ｋ≦７）。また、ノード装置ＮｉとＮｊの間が直接ケーブルで接続されており、ノード装置ＮｉとＮｊがケーブルを介して情報を通信しあうことができるとき、「ノード装置ＮｉとＮｊの間に有線リンクが存在する」という。
【００３１】
また、ノード装置ＮｉとＮｊの間に無線または有線のリンクが存在するとき、「ノード装置ＮｉとＮｊは互いに隣接している」という。換言すれば、ノード装置Ｎｉにとってノード装置Ｎｊは隣接ノード装置であり、ノード装置Ｎｊにとってノード装置Ｎｉは隣接ノード装置である。
【００３２】
なお、図１のネットワーク１には、新たなノード装置が追加されることもありうるし、ノード装置Ｎ１〜Ｎ７のいずれかが撤去されてネットワーク１からは消滅することもありうる。また、リンクは固定的ではなく、動的に変化しうる。
【００３３】
例えば、天候や遮蔽物などの影響で、ノード装置ＮｉとＮｊの間に無線リンクが新たに確立されたり、今まで確立されていた無線リンクが消滅したりすることがある。ノード装置が可動式であれば、ノード装置間の距離の変動によってリンクの有無が変化することもある。また、ケーブルの接続替えにより、新たな有線リンクが確立されたり、今まで存在していた有線リンクが消滅したりすることがあり、ケーブルの切断等の障害によって有線リンクが消滅することもある。
【００３４】
以下に説明する各実施形態によれば、このようにノードやリンクが動的に変化する環境においても、データが送信される時点でのネットワーク１の状況に応じて、利用可能で適切な経路が動的に見出されて選択されながら、データの送信が行われる。しかも、動的に変化するネットワーク１全体のトポロジを各ノード装置Ｎ１〜Ｎ７が認識する必要なしに、動的なトポロジの変化に応じた経路選択が自律分散的に実現される。
【００３５】
ところで、詳しくは図７とともに後述するが、以下ではノード装置間で送受信されるＰＤＵ（Protocol
Data Unit）を「フレーム」と称する。ネットワーク１内でのデータの送受信はフレームを用いて行われるが、フレームの送信元のノード装置を以下では「ＧＳ（Global Source）」といい、フレームの宛先のノード装置を以下では「ＧＤ（Global
Destination）」という。
【００３６】
例えば、ノード装置Ｎ１がＧＳでノード装置Ｎ７がＧＤの場合、ネットワーク１においてノード装置Ｎ１とＮ７は隣接していないので、他のノード装置によってフレームが中継され、その結果として、フレームはノード装置Ｎ７に到達する。例えば、フレームは、ノード装置Ｎ１からノード装置Ｎ２へ送信され、ノード装置Ｎ２からノード装置Ｎ６へ送信され、ノード装置Ｎ６からノード装置Ｎ７へ送信されるかもしれない。以下では経路を、〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉のようなタプル（tuple）で表す。
【００３７】
経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉の例において、例えばノード装置Ｎ１からノード装置Ｎ２へフレームが送信されるとき、フレームの最終的な宛先は、ＧＤであるノード装置Ｎ７だが、フレームの直接的な宛先は、ノード装置Ｎ１に隣接するノード装置Ｎ２である。以下では、このように互いに隣接する２つのノード装置間でのフレームの送信において、フレームの送信元のノード装置を「ＬＳ（Local Source）」といい、フレームの宛先のノード装置を「ＬＤ（Local
Destination）」という。例えば、上記のようにフレームがノード装置Ｎ１からノード装置Ｎ２とＮ６を経由してノード装置Ｎ７へと中継される場合のＬＳとＬＤは次のとおりである。
【００３８】
ＧＳでもあるノード装置Ｎ１から、ノード装置Ｎ１に隣接するノード装置Ｎ２へと、最初にフレームが送信されるとき、ＬＳはノード装置Ｎ１であり、ＬＤはノード装置Ｎ２である。続いて、ノード装置Ｎ２から、ノード装置Ｎ２に隣接するノード装置Ｎ６へと、フレームが送信されるとき、ＬＳはノード装置Ｎ２であり、ＬＤはノード装置Ｎ６である。そして、ノード装置Ｎ６から、ノード装置Ｎ６に隣接しておりＧＤでもあるノード装置Ｎ７へとフレームが送信されるとき、ＬＳはノード装置Ｎ６であり、ＬＤはノード装置Ｎ７である。
【００３９】
なお、ネットワーク１内の１つまたは複数のノード装置が、ネットワーク１とは別のネットワーク（以下「外部ネットワーク」という）に属する不図示のネットワーク機器と接続されていてもよい。
【００４０】
例えば、データ管理サーバを含む外部ネットワークのゲートウェイ装置に、有線リンクまたは無線リンクによってノード装置Ｎ７が接続されていてもよい。そして、ノード装置Ｎ７がＧＤとして指定されてネットワーク１内で送信されるデータは、ノード装置Ｎ７からゲートウェイ装置を介してデータ管理サーバに送信され、データ管理サーバで管理されてもよい。
【００４１】
続いて、図２を参照して他のネットワークの例について説明する。図２は、ネットワーク構成の第２の例を示す図である。図２のネットワーク２も、以下の各実施形態を適用することが可能なアドホックネットワークの一例であり、複数のノード装置を含む。また、図１のネットワーク１と同様に、ネットワーク２も、不図示の外部ネットワークと接続されていてもよい。
【００４２】
ネットワーク２はノード装置Ｎ１０１〜Ｎ１２０を含む。図２は、ノード装置Ｎ１０１〜Ｎ１２０のうち、１つのノード装置Ｎ１０５に注目して表現した図である。すなわち、太い実線の丸で示したノード装置Ｎ１０５は、直接通信することが可能な、隣接する３つのノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２の存在とノードＩＤさえ認識していればよく、ネットワーク２全体のトポロジを認識する必要はない。ノード装置Ｎ１０５は、ネットワーク２のトポロジどころか、ネットワーク２内に存在するノード装置の個数を認識する必要もないし、ノード装置Ｎ１０５に隣接していないノード装置のノードＩＤを予め知っている必要もない。
【００４３】
図２では、ノード装置Ｎ１０５が認識する部分を実線で表し、ノード装置Ｎ１０５が認識する必要のない部分を破線で表してある。すなわち、図２では、ノード装置Ｎ１０５から見てホップ数１以内の範囲に存在する以下のものだけが、実線で示してある。
【００４４】
・ノード装置Ｎ１０５自身
・ノード装置Ｎ１０５に隣接する３つのノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２
・ノード装置Ｎ１０５を３つの隣接ノード装置Ｎ１０７、Ｎ１１１、およびＮ１１２にそれぞれ接続する３本のリンク
【００４５】
以下に説明する各実施形態によれば、ネットワーク内の各ノード装置は、上記のノード装置Ｎ１０５のように、隣接ノード装置さえ認識していればよい。したがって、ネットワークの規模が増大しても「各ノード装置がネットワークトポロジを認識するために制御情報の通信を行い、制御情報の通信のせいでネットワークの負荷が高まり、通信システム全体としての性能が悪化する」といった事態に陥ることはない。
【００４６】
以下では具体的に、図１のネットワーク１や図２のネットワーク２など任意のトポロジを有するネットワークに適用可能な実施形態について説明する。まず、図３〜図３１を参照して第１実施形態について説明し、他の実施形態については、第１実施形態との違いを中心に説明する。
【００４７】
第１実施形態に関しては、まず、図３と図４を参照してノード装置の構成を説明し、図５を参照してノード装置の動作の概要を説明する。そして、「各ノード装置が自律分散的に図５のように振る舞うことで、図１のネットワーク１全体ではどのようにして動的な経路選択が実現されるのか」ということについて、図６を参照して概要を説明する。
【００４８】
その後、図７を参照してフレームの例を説明し、図８〜図１３を参照して各ノード装置が記憶する各種情報の例を説明し、図１４〜図２９を参照して各ノード装置が行う処理の
詳細を説明する。そして、図７〜図２９の詳細を踏まえて、再度、ネットワーク１全体としての振る舞いについて、図３０と図３１を参照して説明する。
【００４９】
さて、図３は、第１実施形態におけるノード装置の構成を示す機能ブロック図である。図１または図２の各ノード装置は、具体的には、例えば図３に示されるノード装置１００である。
【００５０】
ノード装置１００は、フレームを受信する受信部１０１と、フレームを送信する送信部１０２を備える。また、ノード装置１００は、フレームの送信のために用いる各種情報を格納するため、隣接ノード管理テーブル１０３、重み付けテーブル１０４、およびＦＩＤ（Frame IDentification）管理テーブル１０５を備える。
【００５１】
ノード装置１００はさらに、受信部１０１が受信したフレームの種類を判別するフレーム分岐処理部１０６を備える。詳しい形式は図７とともに後述するが、第１実施形態では、「データフレーム」、「ハローフレーム」、および「ＡＣＫ（ACKnowledgment）フレーム」という少なくとも３種類のフレームが使われる。
【００５２】
ノード装置１００は、ＡＣＫフレームに関する処理を行うＡＣＫ処理部１０７と、ハローフレームの受信に応じて処理を行うリンク管理部１０８を備える。また、ノード装置１００は、データフレームの受信に応じた処理を行うために、バッファ部１０９とデータフレーム処理部１１０を備えている。ノード装置１００はさらに、上位層処理部１１１、ハローフレーム生成部１１２、およびＦＩＤ生成部１１３も備えている。
【００５３】
ノード装置１００の各部は以下のように動作する。
受信部１０１がフレームを受信し、受信したフレームをフレーム分岐処理部１０６に出力する。すると、フレーム分岐処理部１０６がフレームの種別を判別する。
【００５４】
ハローフレームが受信された場合、フレーム分岐処理部１０６は、受信されたハローフレームをリンク管理部１０８に出力する。リンク管理部１０８は、隣接ノード管理テーブル１０３を管理しており、さらに、重み付けテーブル１０４の管理にも関与している。
【００５５】
ここで、ハローフレームは、制御情報を通信するための制御フレームの一種であり、具体的には、ノード装置１００が自分自身の存在を他のノード装置に通知するためのフレームである。よって、詳しくは図１５とともに後述するとおり、リンク管理部１０８は、ハローフレームの受信を契機として隣接ノード装置の存在を認識し、認識結果を隣接ノード管理テーブル１０３に反映させる。すなわち、隣接ノード管理テーブル１０３は、ノード装置１００に隣接する他のノード装置を、ノード装置１００が記憶しておくためのテーブルである。
【００５６】
なお、ネットワークの状況は動的に変化しうるので、場合によっては、今まで隣接ノード装置としてリンク管理部１０８に認識されていた他のノード装置が、隣接ノード装置として認識不能となるかもしれない。よって、詳しくは図１７とともに後述するとおり、リンク管理部１０８は、隣接ノード装置として認識不能となったノード装置に関するエントリを隣接ノード管理テーブル１０３から削除するためのエージング処理も行う。
【００５７】
また、第１実施形態においてリンク管理部１０８は、隣接ノード装置の変化にともなって重み付けテーブル１０４の追加、削除、あるいは更新を行う。
ここで、重み付けテーブル１０４は、フレームをどの隣接ノード装置に送信するかを決定するための情報をＧＤごとに管理するためのテーブルである。図３にはＭ個のＧＤそれぞれに対応して設けられた重み付けテーブル１０４−１〜１０４−Ｍが示されている。本明細書において「重み付けテーブル１０４」とは、重み付けテーブル１０４−１〜１０４−Ｍの総称である。また、ノード装置１００の運用が開始される時点では、重み付けテーブル１０４は存在せず、Ｍ＝０である。
【００５８】
具体的には、重み付けテーブル１０４は、「最終的にフレームをＧＤに到達させるためには、ノード装置１００自身はどの隣接ノード装置をＬＤとして選択することができるか」ということをＧＤごとに管理している。換言すれば、重み付けテーブル１０４は、フレームのＧＤごとに、ノード装置１００に隣接する１つ以上のノード装置に関して、ＬＤとして選択する際の優先度を、重みとして表して保持している。
【００５９】
別の観点から言えば、ある隣接ノード装置が「ＬＤとして選択可能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信可能」であることを意味する。また、ある隣接ノード装置が「ＬＤとして選択不能である」とは、当該隣接ノード装置へのフレームの送信可能性が「送信不能」であることを意味し、当該隣接ノード装置の優先度が、「送信不能」に対応する所定の最低優先度であることを意味する。
【００６０】
したがって、ネットワークの状況の変化に応じてノード装置１００の隣接ノード装置が変化すると、リンク管理部１０８は、詳しくは図１５および図１７とともに後述するとおり、隣接ノード装置の変化に応じて重み付けテーブル１０４を追加、更新、または削除する。
【００６１】
また、ＡＣＫフレームが受信された場合、フレーム分岐処理部１０６は、受信されたＡＣＫフレームをＡＣＫ処理部１０７に出力する。ここで、ＡＣＫフレームは、制御フレームの一種であり、ノード装置１００が送信したデータフレームのＬＤであるノード装置から、ノード装置１００に、データフレームの受信を通知するためのフレームである。
【００６２】
したがって、ＡＣＫフレームの受信は、データフレームの送信が成功したことを意味し、所定の時間が経過してもＡＣＫフレームが受信されずにタイムアウトとなることは、データフレームの送信に失敗したことを意味する。ＡＣＫ処理部１０７は、後述の図２５に示すＡＣＫフレーム受信のタイムアウト監視を行う。
【００６３】
バッファ部１０９は、データフレームの送信失敗と再送に備えて、データフレームを格納している。よって、詳しくは図２５とともに後述するとおり、ＡＣＫ処理部１０７は、ＡＣＫフレームの受信を契機としてデータフレームの送信成功を認識すると、不要になったデータフレームをバッファ部１０９から削除する。また、ＡＣＫ処理部１０７はデータフレームの送信の成否をデータフレーム処理部１１０に通知する。
【００６４】
また、データフレームが受信された場合、フレーム分岐処理部１０６は、受信されたデータフレームをバッファ部１０９に格納するとともに、後述の図２０〜図２３の処理を行うようデータフレーム処理部１１０に依頼する。
【００６５】
ここで、データフレームは、ＧＳであるノード装置が、ＧＤであるノード装置に伝達しようとするデータを、ペイロードとして含むフレームである。換言すれば、第１実施形態におけるフレームが定義される層よりも上位の層で定義されるプロトコルのＰＤＵが、ペイロードとしてデータフレームに含まれる。上位層処理部１１１は、ノード装置１００がＧＳまたはＧＤである場合に、データフレームにペイロードとして含まれる上位層のＰＤＵを処理する。
【００６６】
フレーム分岐処理部１０６からデータフレームの処理の依頼を受けたデータフレーム処理部１１０の動作の概要は、以下のとおりである。
データフレーム処理部１１０は、受信部１０１が受信したデータフレームに対するＡＣＫフレームの送信を送信部１０２に依頼する。また、データフレーム処理部１１０は、受信されたデータフレームのＧＤの値がノード装置１００の自ノードＩＤと等しいか否かを判断する。そして、受信されたデータフレームのＧＤの値がノード装置１００の自ノードＩＤと異なる場合、データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５を参照することにより、今回の受信が下記（Ａ１）と（Ａ２）のどちらに該当するのかを判断する。
【００６７】
（Ａ１）過去にノード装置１００がＬＳとなって送信したデータフレームが、ネットワーク内を中継されているうちにノード装置１００に戻ってきて、受信部１０１で受信された。
【００６８】
（Ａ２）上記（Ａ１）以外の新たなデータフレームが受信部１０１で受信された。
データフレーム処理部１１０は、今回の受信が（Ａ２）に該当すると判断すると、重み付けテーブル１０４を参照して、受信したデータフレームを転送するためにＬＤとして指定する隣接ノード装置を選択し、データフレームの転送を送信部１０２に依頼する。
【００６９】
他方、データフレーム処理部１１０は、今回の受信が（Ａ１）に該当すると判断すると、過去にＬＤとして選択した隣接ノード装置が、適切なＬＤではなかったと認識し、認識の結果を重み付けテーブル１０４に反映させる。そして、データフレーム処理部１１０は、重み付けテーブル１０４を参照して、ＬＤとして選択可能な隣接ノード装置が他にまだ残っているか否かを判断する。
【００７０】
データフレーム処理部１１０は、また、ＡＣＫ処理部１０７からのデータフレーム送信成功あるいは送信失敗の通知を受け、該データフレームのＬＤとして選択した隣接ノード装置が適切か否かの認識をし、その認識結果を重み付けテーブル１０４に反映させる。
【００７１】
なお、ノード装置１００に隣接する、あるノード装置Ｎｉが「ＬＤとして選択可能である」とは、直感的には「隣接ノード装置ＮｉをＬＤとして選択してみて、フレームが成功裡にＧＤまで到達するか否かを試してみる価値がある」という意味である。具体的には、ノード装置Ｎｉが「ＬＤとして選択可能である」とは、「下記（Ｂ１）でもなく下記（Ｂ２）でもない」という意味である。なお、「選択可能」という語の、より詳細な意味については、後述の図５に関する説明と、図２２に関する（Ｆ１）〜（Ｆ２）と（Ｇ１）〜（Ｇ４）の説明から明らかである。
【００７２】
（Ｂ１）ノード装置１００が隣接ノード装置Ｎｉを過去にＬＤとして選択した結果、ループ等の何らかの失敗が発生したことがあり、「ノード装置ＮｉはＬＤとして不適切である」と既に判明している。
【００７３】
（Ｂ２）今回受信部１０１が受信したデータフレームを、かつて受信部１０１が初めて受信したときのＬＳ（以下「Original
Local Source」と称し、「ＯＬＳ」と略す）が、ノード装置Ｎｉであった。
【００７４】
データフレーム処理部１１０は、もしＬＤとして選択可能な隣接ノード装置が他にまだ残っていれば、選択可能な隣接ノード装置を選んでＬＤとして指定し、データフレームの転送を送信部１０２に依頼する。逆に、ＬＤとして選択可能な隣接ノード装置がもう残っていなければ、データフレーム処理部１１０は、下記（Ｃ１）または（Ｃ２）のように動作する。
【００７５】
（Ｃ１）今回受信したデータフレームのＧＳがノード装置１００以外である場合、データフレーム処理部１１０は、ＯＬＳへデータフレームを返送するため、ＯＬＳをＬＤとして選択し、データフレームの転送を送信部１０２に依頼する。この動作は、ＯＬＳである隣接ノード装置に「ノード装置１００をＬＤとして選択することは不適切である」と認識させるための動作であり、後述するとおり経路探索におけるバックトラックに相当する。
【００７６】
（Ｃ２）今回受信したデータフレームのＧＳがノード装置１００自身である場合、このデータフレームを元々生成したのは上位層処理部１１１である。よって、データフレーム処理部１１０は、上位層処理部１１１に対してデータフレームの送信失敗を通知し、バッファ部１０９に格納されているデータフレームを破棄する。
【００７７】
なお、以上のようなデータフレーム処理部１１０の動作を実現するためには、データフレーム処理部１１０は上記（Ａ１）と（Ａ２）の区別をすることが必要である。そのため第１実施形態では、データフレームを一意に識別することのできるフレーム識別情報が各データフレームに含まれており、フレーム識別情報をＦＩＤ管理テーブル１０５が記憶している。
【００７８】
第１実施形態でのフレーム識別情報は、具体的には、データフレームのＧＳであるノード装置のノードＩＤと、ＦＩＤとの組み合わせである。ＦＩＤは、ある１つのノード装置がＧＳとなって送信する複数のフレームの各々を一意に識別する識別情報であり、例えば所定のビット数のシーケンス番号でもよいし、タイムスタンプでもよい。
【００７９】
つまり、個々のノード装置は独立にＦＩＤを生成するため、異なる複数のノード装置が偶然同じＦＩＤを生成することもありうる。しかし、フレーム識別情報は、ＦＩＤ単独ではなく、データフレームのＧＳであるノード装置のノードＩＤと、ＦＩＤとの組み合わせである。そして、ノードＩＤは、上記のとおりネットワーク内でノード装置を一意に識別する情報である。したがって、たとえ異なる複数のノード装置が偶然同じＦＩＤを生成したとしても、異なるノード装置がそれぞれＧＳとなって送信したフレームは、異なるフレーム識別情報を有するので、区別可能である。
【００８０】
なお、フレーム識別情報は、データフレームが１つ以上のノード装置を経由してネットワーク内を転送されても、データフレームを中継するノード装置によって書き換えられることはなく、したがって変化しない。データフレーム処理部１１０は、送信部１０２に送信を依頼したデータフレームのフレーム識別情報をＦＩＤ管理テーブル１０５に記録することにより、後にデータフレームがノード装置１００自身に戻ってきたとき、上記（Ａ１）に該当すると認識することができる。
【００８１】
なお、ノード装置１００は、フレームの受信を契機としないその他の処理も行う。具体的には、ハローフレーム生成部１１２が、ＦＩＤ生成部１１３の生成するＦＩＤを利用して定期的にハローフレームを生成し、送信部１０２に出力する。すると送信部１０２がハローフレームを送信するので、ノード装置１００は、ノード装置１００自身の存在を定期的に周囲に通知することができる。
【００８２】
また、上位層処理部１１１は任意のタイミングで、データフレームにペイロードとして含めて送信する対象のデータをデータフレーム処理部１１０に出力することができる。すると、データフレーム処理部１１０は、上位層処理部１１１の要求に応じてデータフレームを生成し、送信部１０２にデータフレームの送信を指示する。こうして、ノード装置１００は、自らＧＳとなることができる。
【００８３】
図４は、第１実施形態におけるノード装置のハードウェア構成を示す図である。図３のノード装置１００は、例えば図４に示す各種ハードウェアにより実現されてもよい。
図４の例では、ノード装置１００は、ＭＰＵ（MicroProcessing Unit）２０１、ＰＨＹ（PHYsical layer）チップ２０２、およびタイマＩＣ（Integrated
Circuit）２０３を備える。また、ノード装置１００は、ＤＲＡＭ（Dynamic Random access
Memory）２０４、フラッシュメモリ２０５、および無線モジュール２０６を備える。
【００８４】
ＭＰＵ２０１とＰＨＹチップ２０２の間を接続する通信インタフェースは、ＭＩＩ／ＭＤＩＯ（Media
Independent Interface or Management Data Input/Output）２０７である。ＭＩＩとＭＤＩＯはいずれも、物理層とＭＡＣ副層（Media Access Control sublayer）との間のインタフェースである。また、ＭＰＵ２０１とタイマＩＣ２０３は、Ｉ２Ｃ／ＰＩＯ（Inter-Integrated Circuit or Parallel Input/Output）バス２０８を介して接続されている。そして、ＤＲＡＭ２０４とフラッシュメモリ２０５と無線モジュール２０６は、ＰＣＩ（Peripheral Component Interconnect）バス２０９を介してＭＰＵ２０１に接続されている。
【００８５】
ＭＰＵ２０１は、不揮発性記憶装置の一種であるフラッシュメモリ２０５に格納されたファームウェアなどのプログラムをＤＲＡＭ２０４にロードし、ＤＲＡＭ２０４をワーキングメモリとして使いながら各種処理を実行する。ＭＰＵ２０１は、プログラムを実行することで、図３のフレーム分岐処理部１０６、ＡＣＫ処理部１０７、リンク管理部１０８、データフレーム処理部１１０、上位層処理部１１１、ハローフレーム生成部１１２、およびＦＩＤ生成部１１３として動作することができる。
【００８６】
なお、ファームウェアなどのプログラムは、コンピュータ読み取り可能な記憶媒体に格納されて提供され、ノード装置１００にインストールされてもよい。または、プログラムは、ネットワークからＰＨＹチップ２０２もしくは無線モジュール２０６を介してダウンロードされ、ノード装置１００にインストールされてもよい。
【００８７】
なお、実施形態に応じて、ＤＲＡＭ２０４やフラッシュメモリ２０５以外の他の種類の記憶装置が利用されてもよい。例えば、ノード装置１００は、ＣＡＭ（Content Addressable Memory）、ＳＲＡＭ（Static
Random Access Memory）、ＳＤＲＡＭ（Synchronous Dynamic Random
Access Memory）などの記憶装置を有してもよい。
【００８８】
図３の隣接ノード管理テーブル１０３、重み付けテーブル１０４、ＦＩＤ管理テーブル１０５、およびバッファ部１０９は、ＤＲＡＭ２０４、フラッシュメモリ２０５、あるいは不図示のその他の記憶装置により実現される。また、フラッシュメモリ２０５は、プログラムだけでなく、ノード装置１００のノードＩＤなど、ノード装置１００に固有の情報も記憶している。
【００８９】
ＰＨＹチップ２０２は、有線接続における物理層の処理を行う回路である。第１実施形態は無線ネットワークに適用されるので、第１実施形態では、ノード装置１００はＰＨＹチップ２０２を備えなくてもよい。しかし、ノード装置１００と外部ネットワークとの接続のために、ノード装置１００はＰＨＹチップ２０２を備えていてもよい。
【００９０】
例えば、ノード装置１００は、イーサネット（登録商標）規格にしたがった有線ＬＡＮポートを備え、有線ＬＡＮポートに接続されたケーブルを介して外部ネットワークのゲートウェイ装置などに接続されていてもよい。
【００９１】
その場合、ＭＰＵ２０１は、イーサネットフレームを生成し、ＭＩＩ／ＭＤＩＯ２０７を介してＰＨＹチップ２０２に出力することができる。そして、ＰＨＹチップ２０２は、ＭＰＵ２０１からの出力（すなわちイーサネットフレームを表す論理信号）を、ケーブルの種類に応じた信号（つまり電気信号または光信号）に変換し、ケーブルに出力する。こうして、ノード装置１００はＰＨＹチップ２０２を用いて外部ネットワークにデータを送信することができる。
【００９２】
また、ＰＨＹチップ２０２は、ケーブルと有線ＬＡＮポートを介して外部ネットワークから入力される電気信号または光信号を、論理信号に変換し、ＭＩＩ／ＭＤＩＯ２０７を介してＭＰＵ２０１に出力することもできる。こうして、ノード装置１００はＰＨＹチップ２０２を用いて外部ネットワークからデータを受信することができる。
【００９３】
無線モジュール２０６は、無線接続における物理層の処理を行うハードウェアである。無線モジュール２０６は、例えば、アンテナ、ＡＤＣ（Analog-to-Digital Converter）、ＤＡＣ（Digital-to-Analog
Converter）、変調器、復調器、符号化器、復号器などを含む。
【００９４】
第１実施形態では、図３の受信部１０１と送信部１０２は、図４の無線モジュール２０６により実現される。つまり、第１実施形態では、ネットワーク内のリンクは無線リンクである。もちろん、後述の第２および第３実施形態のように、有線リンクが存在する実施形態も可能である。
【００９５】
タイマＩＣ２０３は、設定された時間が経過するまでカウントアップ動作を行い、設定された時間が経過すると割り込み信号を出力する。例えば、タイマＩＣ２０３は、隣接ノード管理テーブル１０３、重み付けテーブル１０４、ＦＩＤ管理テーブル１０５のエージング処理をそれぞれ所定の間隔で実行するための割り込み信号を出力してもよい。
【００９６】
なお、実施形態に応じて、ノード装置のハードウェア構成は図４とは異なっていてもよく、図４に例示した規格・種類以外のその他のハードウェアをノード装置に利用することもできる。
【００９７】
例えば、図３のフレーム分岐処理部１０６、ＡＣＫ処理部１０７、リンク管理部１０８、データフレーム処理部１１０、上位層処理部１１１、ハローフレーム生成部１１２、またはＦＩＤ生成部１１３は、ハードウェア回路により実現されてもよい。具体的には、ＭＰＵ２０１の代わりに、ＦＰＧＡ（Field Programmable Gate Array）などのリコンフィギュラブル回路や、ＡＳＩＣ（Application Specific Integrated Circuit）などにより、これら図３の各部が実現されてもよい。もちろん、ＭＰＵ２０１とハードウェア回路の双方により、図３の各部が実現されてもよい。
【００９８】
なお、以下の説明においては、説明の明確化のため、図３および図４の各部の参照符号の後にノードＩＤを付けた参照符号を用いることがある。例えば、ノード装置Ｎ１が有する図３の隣接ノード管理テーブル１０３を「１０３−Ｎ１」という参照符号で参照する場合がある。
【００９９】
続いて、個々のノード装置の動作の概要について図５を参照して説明し、個々のノード装置の動作の結果としてネットワーク全体として実現される経路選択について図６を参照して説明する。
【０１００】
図５は、１つのノード装置に注目して重みの学習について説明する図である。図５には、ネットワーク３内の６つのノード装置が「ノードα」〜「ノードζ」として抜粋されて示されている。図５に示すように、ノードβにはノードα、γ、δ、ε、およびζが隣接しており、図５では下記５本のリンクが実線で示されている。
・ノードβとαの間のリンクＬβ，α
・ノードβとγの間のリンクＬβ，γ
・ノードβとδの間のリンクＬβ，δ
・ノードβとεの間のリンクＬβ，ε
・ノードβとζの間のリンクＬβ，ζ
【０１０１】
また、図５において雲の形で模式的に表現されたネットワーク３ａは、ネットワーク３のうちの一部分である。ネットワーク３ａは、具体的には、ノードδとζの間を直接的に接続するリンク、または、１つ以上の不図示のノードと２本以上の不図示のリンクを介してノードδとζの間を間接的に接続する経路を含む。
【０１０２】
以下では、図５においてノードβに注目し、ノードβにおける重みの学習について説明する。
あるとき、ノードβが、ネットワーク３内の不図示のあるノード（以下、便宜的に「ノードη」という）をＧＤとするデータフレーム３０１を、リンクＬβ，αを介してノードαから受信する。ノードβは図３の重み付けテーブル１０４を有しており、このうちノードηに対応する重み付けテーブルを、図５の説明では便宜的に「１０４−ｈ」という参照符号で参照する。
【０１０３】
詳しくは図１０および図１１とともに後述するが、ＧＤごとに管理される重み付けテーブル１０４のそれぞれは、隣接ノードと重みの対応付けを記憶している。ノードβにはノードα、γ、δ、ε、およびζが隣接しているので、重み付けテーブル１０４−ｈでは、ノードαと重みＷα、ノードγと重みＷγ、ノードδと重みＷδ、ノードεと重みＷε、およびノードζと重みＷζが、それぞれ対応付けられている。
【０１０４】
説明の便宜上、ノードβがノードαからデータフレーム３０１を受信した時点での重み付けの関係が、式（１）のとおりであったとする。
Ｗγ＜Ｗδ＜Ｗε＜Ｗζ                          （１）
【０１０５】
以下、第１実施形態においては説明の便宜上、重みが０以上１以下の値をとり、重みの値が小さいほど当該重みに対応するノードの優先度が高いことを示すものとする。
したがって、式（１）に基づいてノードβは、最も軽い重みＷγと対応付けられたノードγの優先度が、隣接ノードγ、δ、ε、およびζの中で最も高いことを認識する。よって、ノードβは、データフレーム３０１を転送するためのＬＤとして、隣接ノードγ、δ、ε、およびζの中から、まずノードγを選択し、ノードγにデータフレーム３０１を送信する。
【０１０６】
ここで、ノードβからノードγへの送信が失敗すると、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習する。そして、学習の結果として、ノードβは、ノードγの優先度を下げる。すなわち、ノードβは、重みＷγの値を大きくする。
【０１０７】
送信失敗には何種類かあり、具体的には、ノードβは下記（Ｄ１）または（Ｄ２）のようにして、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習する。
【０１０８】
（Ｄ１）リンク障害の場合
ノードβがデータフレーム３０１をノードγに転送した時点で、偶然リンクＬβ，γ、あるいは、ノードγに障害が発生していると、ノードβはノードγへの送信が失敗したと認識する。
【０１０９】
例えばリンクＬβ，γが無線リンクである場合、ノードγからデータフレーム３０１に対するＡＣＫフレームが所定時間内に返信されてこなければ、ノードβはタイムアウトして、「ノードγへのデータフレーム３０１の送信に失敗した」と判断する。そして、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードγに対応付けられた重みＷγの値を大きくする。
【０１１０】
なお、無線リンクはその品質環境が変化しやすいため、リンク障害が再び解消されている可能性がある。そのため、第１実施形態においては、リンク障害時に一挙に重みＷγを最大値にするのではなく、所定の値だけ大きくすることにしている。このようにすれば、１回のリンク障害発生だけでそのＬＤが不適切となることを防ぐことができる。
【０１１１】
（Ｄ２）ノードγからノードβにデータフレーム３０１が戻ってくる場合
ノードβは、一旦、ノードγへのデータフレーム３０１の送信に成功する。例えば、ノードβは、データフレーム３０１に対するＡＣＫフレームをノードγから受け取ることで、ノードγへのデータフレーム３０１の送信が成功したことを認識する。よって、一旦ノードβは、ＬＤとして選択したノードγに対応付けられた重みＷγの値を小さくする。
【０１１２】
しかしながら、その後、ノードγからノードηまでデータフレーム３０１を転送することのできる経路がネットワーク３内で見つからなければ、後述するバックトラック動作により、ノードγはノードβにデータフレーム３０１を送り返す。例えば、ノードγがノードβにのみ隣接している場合、ノードγはノードηまでデータフレーム３０１を転送することのできる経路を見つけることができない。また、ノードγがノードβ以外にいくつかのノードに隣接している場合でも、ネットワーク３のトポロジによっては、ノードγからノードηまで到達不能なこともある。
【０１１３】
ノードγがバックトラック動作を行うと、ノードβは、ノードβ自身が過去にノードγに送信したデータフレーム３０１をノードγから受信するので、「ノードγへの送信が失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードγをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードγに対応付けられた重みＷγの値を大きくする。
【０１１４】
第１実施形態では、（Ｄ２）のように、ノードβ自身が過去に送信したデータフレーム３０１を受信することでノードβが送信失敗を認識する場合、ノードβは具体的には重みＷγの値を最大値に設定する。
【０１１５】
以下では説明の便宜上、図５の例において（Ｄ２）のようにしてノードβが送信失敗を認識し、重みＷγの値を最大値に設定したとする。その結果、式（２）が成立する。
Ｗδ＜Ｗε＜Ｗζ＜Ｗγ                          （２）
【０１１６】
続いてノードβは、ＧＤである不図示のノードηへデータフレーム３０１を到達させるため、不適切と判明したノードγ以外の隣接ノードをＬＤとして選択し、データフレーム３０１の再送信を試みる。具体的には式（２）に基づいて、ノードβは、現時点で最も軽い重みＷδと対応付けられたノードδをＬＤとして選択し、ノードδにデータフレーム３０１を送信する。
【０１１７】
図５の例では、データフレーム３０１に対するＡＣＫフレームをノードβがノードδから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、ＬＤとして選択したノードδに対応付けられた重みＷδの値を小さくする。その結果、やはり式（２）が成立する。
【０１１８】
続いて、データフレーム３０１はネットワーク３ａを介してノードδからノードζに到達したとする。そして、ノードζがＬＤとしてノードβを選択したとする。
すると、ノードβは、ノードβ自身が過去にノードδに送信したデータフレーム３０１をノードζから受信するので、「ノードδへの送信は、ループの存在により失敗した」と認識することができる。認識の結果、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードδをＬＤとして選択することは不適切である」と学習し、重みＷδの値を大きくする。
【０１１９】
ここで、ループして戻ってきたデータフレーム３０１をノードβがノードζから受信する場合も、「ノードβ自身が過去に送信したデータフレーム３０１を受信することでノードβが送信失敗を認識する」という点では上記（Ｄ２）の場合と同様である。したがって、ノードβは、「ノードηをＧＤとするデータフレームの送信時にノードδをＬＤとして選択することは不適切である」と学習し、ＬＤとして選択したノードδに対応付けられた重みＷδの値を最大値に設定する。その結果、式（３）が成立する。
Ｗε＜Ｗζ＜Ｗγ＝Ｗδ                          （３）
【０１２０】
図５には、ノードζから同一データフレーム３０１を受信して重み付けを更新した結果の新しい重み付けの関係として、式（３）を示してある。
続いてノードβは、ＧＤである不図示のノードηへデータフレーム３０１を到達させるため、不適切と判明したノードγおよびδ以外の隣接ノードをＬＤとして選択し、データフレーム３０１の再送信を試みる。具体的には式（３）に基づいて、ノードβは、現時点で最も軽い重みＷεと対応付けられたノードεをＬＤとして選択し、ノードεにデータフレーム３０１を送信する。
【０１２１】
図５の例では、データフレーム３０１に対するＡＣＫフレームをノードβがノードεから受信し、ノードβは送信の成功を認識する。送信の成功を認識すると、ノードβは、ＬＤとして選択したノードεに対応付けられた重みＷεの値を小さくする。その結果、やはり式（３）が成立する。
【０１２２】
ここで仮に、ノードεからバックトラックによってデータフレーム３０１がノードβへと返信されることがないとする。また、データフレーム３０１がネットワーク３内をループして、ノードβのいずれかの隣接ノードからノードβに送信され、ノードβで受信されることもないとする。
【０１２３】
すると、式（３）から、ノードβは、データフレーム３０１と同じくノードηをＧＤとする別のデータフレームを隣接ノードα、γ、δ、ζのいずれかから受け取った場合に、最も軽い重みＷεと対応付けられたノードεをＬＤとして優先して選択するようになる。
【０１２４】
図６は、図１のネットワーク１において動的かつ自律分散的に経路が選択される様子を説明する図である。具体的には、図６は、ノード装置Ｎ１がＧＳとなって、ノード装置Ｎ７をＧＤとして指定したデータフレームを送信する場合の、ネットワーク１内での経路選択の様子を示す。
【０１２５】
図６には図１のネットワーク１と、ノード装置Ｎ４とＮ７の間で発生した障害が示されている。また、図６の１２本の太い矢印は、ネットワーク１内で経路が動的に選択されながらデータフレームがＧＳ（すなわちノード装置Ｎ１）からＧＤ（すなわちノード装置Ｎ７）まで転送される様子を表す。
【０１２６】
なお、以下では、ノード装置Ｎｉの重み付けテーブル１０４−Ｎｉのうち、ノード装置Ｎ７に対応するものを便宜的に「１０４−ｈｉ−Ｎｉ」という参照符号で参照することにする（１≦ｉ≦６）。
【０１２７】
また、図６の説明においては、特に断らない限りデータフレームの送信が成功してＡＣＫフレームが返信されるものとし、ＡＣＫフレームの返信については省略して説明を簡略化する。ＡＣＫフレームの返信も含めた一連の処理の流れは、図３１とともに後述する。
【０１２８】
ステップＳ１０１で、ＧＳであるノード装置Ｎ１は、唯一ノード装置Ｎ１に隣接するノード装置Ｎ２をＬＤとして選択し、データフレームをノード装置Ｎ２に送信する。
ノード装置Ｎ２には、ステップＳ１０１で送信されたデータフレームのＬＳであるノード装置Ｎ１のほかに、ノード装置Ｎ３とＮ６が隣接している。そして、この２つの隣接ノード装置Ｎ３とＮ６のうちでノード装置Ｎ３の方が、重み付けテーブル１０４−ｈ２−Ｎ２において、より軽い重みと対応付けられているとする。
【０１２９】
すると、ステップＳ１０２でノード装置Ｎ２は、ステップＳ１０１で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３にデータフレームを送信する。
【０１３０】
ノード装置Ｎ３には、ステップＳ１０２で送信されたデータフレームのＬＳであるノード装置Ｎ２のほかに、ノード装置Ｎ４とＮ５が隣接している。そして、この２つの隣接ノード装置Ｎ４とＮ５のうちでノード装置Ｎ４の方が、重み付けテーブル１０４−ｈ３−Ｎ３において、より軽い重みと対応付けられているとする。
【０１３１】
すると、ステップＳ１０３でノード装置Ｎ３は、ステップＳ１０２で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ４を選択し、ノード装置Ｎ４にデータフレームを送信する。
【０１３２】
ノード装置Ｎ４には、ステップＳ１０３で送信されたデータフレームのＬＳであるノード装置Ｎ３のほかに、ノード装置Ｎ５とＮ７が隣接している。そして、この２つの隣接ノード装置Ｎ５とＮ７のうちでノード装置Ｎ７の方が、重み付けテーブル１０４−ｈ４−Ｎ４において、より軽い重みと対応付けられているとする。
【０１３３】
すると、ステップＳ１０４でノード装置Ｎ４は、ステップＳ１０３で受信したデータフレームを転送するためのＬＤとして、ＧＤでもあるノード装置Ｎ７を選択し、ノード装置Ｎ７にデータフレームを送信する。
【０１３４】
しかし、図６に示すように、ノード装置Ｎ４がノード装置Ｎ７にデータフレームを送信した時点で、ノード装置Ｎ４とＮ７の間のリンクには障害が発生しており、したがって送信は失敗する。すなわち、ノード装置Ｎ４は、所定時間待機してもノード装置Ｎ７からＡＣＫフレームが返信されてこないため、タイムアウトし、送信失敗を認識する。
【０１３５】
なお、ステップＳ１０４におけるノード装置Ｎ４は、図５でノードγへのデータフレームの送信に上記（Ｄ１）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ４は、送信失敗に応じて重み付けテーブル１０４−ｈ４−Ｎ４を更新する（具体的には、ステップＳ１０４の送信でのＬＤであるノード装置Ｎ７に対応付けられた重みの値を大きくする）。
【０１３６】
そして、ステップＳ１０５でノード装置Ｎ４は、ステップＳ１０３で受信したデータフレームを転送するためのＬＤとして、まだ試していない他の隣接ノード装置Ｎ５を選択し、ノード装置Ｎ５にデータフレームを送信する。
【０１３７】
ノード装置Ｎ５には、ステップＳ１０５で送信されたデータフレームのＬＳであるノード装置Ｎ４のほかには、ノード装置Ｎ３のみが隣接している。
そこで、ステップＳ１０６でノード装置Ｎ５は、ステップＳ１０５で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３にデータフレームを送信する。
【０１３８】
すると、ステップＳ１０６でノード装置Ｎ３は、「ノード装置Ｎ３自身がステップＳ１０３で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０６におけるノード装置Ｎ３は、図５においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置Ｎ３は、図５と同様にして重み付けテーブル１０４−ｈ３−Ｎ３を更新する（具体的には、ステップＳ１０３の送信のＬＤであるノード装置Ｎ４に対応付けられた重みの値を最大値に設定する）。
【０１３９】
そして、ステップＳ１０７でノード装置Ｎ３は、ＯＬＳ（すなわち、ステップＳ１０２で最初に当該データフレームをノード装置Ｎ３が受信したときのＬＳであるノード装置Ｎ２）以外の隣接ノード装置の中から、まだＬＤとして試していないものを探す。ここで、ＯＬＳ以外の隣接ノード装置はノード装置Ｎ４とＮ５であり、ノード装置Ｎ４はステップＳ１０３で選択済みである。
【０１４０】
よって、ステップＳ１０７でノード装置Ｎ３は、未選択のノード装置Ｎ５をＬＤとして選択し、ノード装置Ｎ５にデータフレームを送信する。つまり、ステップＳ１０７におけるノード装置Ｎ３は、図５においてノードεをＬＤとして選択しなおしてノードεにデータフレームを送信するノードβに相当する。
【０１４１】
すると、ステップＳ１０７でノード装置Ｎ５は、「ノード装置Ｎ５自身がステップＳ１０６で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０７におけるノード装置Ｎ５は、図５においてノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ５は、図５と同様にして重み付けテーブル１０４−ｈ５−Ｎ５を更新する（具体的には、ステップＳ１０６の送信のＬＤであるノード装置Ｎ３に対応付けられた重みの値を最大値に設定する）。
【０１４２】
そして、ノード装置Ｎ５にとって、ＯＬＳ（すなわちステップＳ１０５で最初に当該データフレームをノード装置Ｎ５が受信したときのＬＳであるノード装置Ｎ４）以外で隣接しているノード装置は、既に送信失敗と判明したノード装置Ｎ３のみである。したがって、もはやＬＤとして選択可能な隣接ノード装置がない。
【０１４３】
よってステップＳ１０８でノード装置Ｎ５は、ＯＬＳであるノード装置Ｎ４にデータフレームを送り返す。ステップＳ１０８はバックトラック動作であり、バックトラック動作によってノード装置Ｎ５は、「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ５自身から先の経路は袋小路（dead end）になっている」ということをノード装置Ｎ４に知らせることができる。
【０１４４】
すると、ステップＳ１０８でノード装置Ｎ４は、「ノード装置Ｎ４自身がステップＳ１０５で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０８におけるノード装置Ｎ４は、図５においてノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ４は、図５と同様にして重み付けテーブル１０４−ｈ４−Ｎ４を更新する（具体的には、ステップＳ１０５の送信のＬＤであるノード装置Ｎ５に対応付けられた重みの値を最大値に設定する）。
【０１４５】
しかし、図５のノードβには、ノードγへのデータフレームの送信に失敗しても、まだＬＤとして選択可能なノードδ等が残っていたが、図６のステップＳ１０８のノード装置Ｎ４にとっては、ＬＤとして選択可能な隣接ノード装置が残っていない。すなわち、ＯＬＳ以外の２つの隣接ノード装置Ｎ７とＮ５は、ステップＳ１０４とＳ１０５でそれぞれＬＤとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
【０１４６】
したがって、ステップＳ１０９でノード装置Ｎ４は、ＯＬＳであるノード装置Ｎ３にデータフレームを送り返す。ステップＳ１０９もバックトラック動作であり、ノード装置Ｎ４はノード装置Ｎ３に「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ４自身から先の経路は袋小路になっている」ということを知らせることができる。
【０１４７】
すると、ステップＳ１０９でノード装置Ｎ３は、「ノード装置Ｎ３自身がステップＳ１０７で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１０９におけるノード装置Ｎ４は、図５においてループしてきたデータフレームをノードζから受信したノードβに相当する。よって、ノード装置Ｎ３は、図５と同様にして重み付けテーブル１０４−ｈ３−Ｎ３を更新する（具体的には、ステップＳ１０７の送信のＬＤであるノード装置Ｎ５に対応付けられた重みの値を最大値に設定する）。
【０１４８】
しかし、図５のノードβには、ノードδへのデータフレームの送信が失敗すると判明しても、まだＬＤとして選択可能なノードεが残っていたが、図６のステップＳ１０９のノード装置Ｎ３にとっては、ＬＤとして選択可能な隣接ノード装置が残っていない。すなわち、ＯＬＳ以外の２つの隣接ノード装置Ｎ４とＮ５は、ステップＳ１０３とＳ１０７でそれぞれＬＤとして選択済みであり、両者とも送信失敗という結果になることが既に判明している。
【０１４９】
したがって、ステップＳ１１０でノード装置Ｎ３は、ＯＬＳであるノード装置Ｎ２にデータフレームを送り返す。ステップＳ１１０もバックトラック動作であり、ノード装置Ｎ３はノード装置Ｎ２に「ノード装置Ｎ７をＧＤとするデータフレームの送信においては、ノード装置Ｎ３自身から先の経路は袋小路になっている」ということを知らせることができる。
【０１５０】
すると、ステップＳ１１０でノード装置Ｎ２は、「ノード装置Ｎ２自身がステップＳ１０２で送信したのと同じデータフレームを受信した」と認識する。つまり、ステップＳ１１０におけるノード装置Ｎ２は、図５でノードγへのデータフレームの送信に（Ｄ２）のようにして失敗したノードβに相当する。よって、ノード装置Ｎ２は、図５と同様にして重み付けテーブル１０４−ｈ２−Ｎ２を更新する（具体的には、ステップＳ１０２の送信のＬＤであるノード装置Ｎ３に対応付けられた重みの値を最大値に設定する）。
【０１５１】
そして、ステップＳ１１１でノード装置Ｎ２は、データフレームを転送するためのＬＤとして、まだ試していない他の隣接ノード装置Ｎ６を選択し、ノード装置Ｎ６にデータフレームを送信する。
【０１５２】
ノード装置Ｎ６には、ステップＳ１１１で送信されたデータフレームのＬＳであるノード装置Ｎ２のほかには、ＧＤでもあるノード装置Ｎ７のみが隣接している。
そこで、ステップＳ１１２でノード装置Ｎ６は、ステップＳ１１１で受信したデータフレームを転送するためのＬＤとしてノード装置Ｎ７を選択し、ノード装置Ｎ７にデータフレームを送信する。
【０１５３】
以上のようにして、ネットワーク１内に障害が発生しても、各ノード装置が自律分散的に振る舞うことで、データフレームは成功裡にＧＤまで到達する。
また、データフレームの転送において、局所的に不適切なノード装置がＬＤとして選択されても、最終的にはネットワーク全体としては、ＧＳからＧＤに至る経路が選択される。なぜなら、各ノード装置がＬＤとして選択可能なノード装置を次々と選択し、選択可能なノード装置がなくなればバックトラック動作をするからである。
【０１５４】
具体的には、図６の例では、ステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３をＬＤとして選択したことは、結果的には不適切であるとステップＳ１１０で判明する。しかし、ステップＳ１０３〜Ｓ１１０の動作により、ネットワーク１全体としては、最終的にはＧＳからＧＤに至る経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉の選択に成功する。
【０１５５】
こうして選択された経路は学習され、次回以降のデータフレームの転送の効率化に寄与する。学習による効率化について具体的に説明すれば次のとおりである。
ステップＳ１１０でのデータフレームの受信の結果、ノード装置Ｎ２は重み付けテーブル１０４−ｈ２−Ｎ２の学習を行い、ノード装置Ｎ３に対応付けられた重みを最大値に設定している。したがって、ノード装置Ｎ２は、ノード装置Ｎ７をＧＤとする新たなデータフレームを隣接ノード装置Ｎ１から受信すると、最初からノード装置Ｎ６をＬＤとして選択する。つまり、ネットワーク１全体としては、自律分散的な学習の結果、バックトラックを含む試行錯誤なしに、データフレームを効率的に経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉によりＧＤまで送信することが可能となる。
【０１５６】
さらに、第１実施形態によれば、不適切なＬＤの選択の影響または局所的な障害の影響は、ネットワーク１全体には及ばず、局所的に限定される。すなわち、第１実施形態によれば、例えばノード装置Ｎ４とＮ７の間のリンクに障害が発生しても、代替経路を問い合わせるための制御フレームがネットワーク１全体の全ノード装置へとフラッディングされたりはしない。よって、第１実施形態によれば、障害やループが局所的に発生しても、ネットワーク１全体にブロードキャストストームを引き起こすといった事態には陥らない。
【０１５７】
また、図６の例においてノード装置Ｎ１は、ノード装置Ｎ４とＮ７の間のリンクの障害や、ループ〈Ｎ３，Ｎ４，Ｎ５，Ｎ３〉については全く認識することがないのは明らかである。このことは、不適切なＬＤの選択や局所的な障害の影響が、局所的に限定され、ネットワーク１全体には及ばないということを意味している。
【０１５８】
問題の影響が局所的に限定されるということは、局所的な問題がネットワーク１全体にポジティブにフィードバックされて発散することがないということであり、ネットワーク１が系として安定しているということである。問題が局所的に限定されることの別の例を挙げれば、例えば以下のとおりである。
【０１５９】
例えば、仮にネットワーク１においてノード装置Ｎ５とＮ７の間にもリンクが存在し、重み付けテーブル１０４−ｈ５−Ｎ５においてノード装置Ｎ３よりもノード装置Ｎ７の方が軽い重みに対応づけられているとする。すると、ステップＳ１０５の直後にノード装置Ｎ５がノード装置Ｎ７をＬＤとして選択してデータフレームをノード装置Ｎ７に送信する。その結果、ステップＳ１０８〜Ｓ１１２の送信は行われず、ノード装置Ｎ１だけでなくノード装置Ｎ２とＮ３も、障害の発生を全く認識しない。このように、リンクの障害やループの発生などの問題は、問題が生じた場所に応じて最小限の局所的な範囲にしか影響を及ぼさない。
【０１６０】
続いて、以上説明したノード装置１００の構成および動作、ならびにネットワーク１全体で実現される自律分散協調動作について、更に詳細に説明してゆく。
図７は、フレームの例を示す図である。
【０１６１】
第１実施形態におけるデータフレームは、図７のデータフレーム３０２のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドを含むヘッダと、ペイロードとを含む。例えば図５のデータフレーム３０１も、データフレーム３０２と同様の形式である。
【０１６２】
データフレーム３０２のＬＤフィールド、ＬＳフィールド、ＧＤフィールド、およびＧＳフィールドには、データフレーム３０２のＬＤ、ＬＳ、ＧＤ、およびＧＳである各ノード装置のノードＩＤがそれぞれ指定される。また、データフレーム３０２のＦＩＤフィールドには、データフレーム３０２のＧＳであるノード装置が生成してデータフレーム３０２に割り当てたＦＩＤが指定される。
【０１６３】
データフレーム３０２のタイプフィールドには、「データフレーム」というタイプを示す所定の定数が指定される。また、データフレーム３０２の長さフィールドには、ペイロードの長さが指定される。データフレーム３０２のペイロードは、データフレーム３０２が定義されるプロトコルよりも上位の層のプロトコルのＰＤＵである。
【０１６４】
例えば、ＭＡＣ副層を仮想的にさらに２つの副層に分割することを想定する。第１実施形態のフレームは、この仮想的な２つの副層のうちの下の方の副層で定義されてもよく、すなわち、ＭＡＣ副層で定義される他のプロトコル（例えばイーサネットなど）のＰＤＵをペイロードに含んでもよい。換言すれば、第１実施形態のフレームは、第２層で定義されるイーサネットフレームをカプセル化するフレームであってもよい。この場合、上位層処理部１１１はイーサネットフレームを処理する処理部であるから、公知のＭＡＣチップを用いて実現することもできる。
【０１６５】
以下では説明の便宜上、データフレーム３０２のペイロードは、ＭＡＣ層プロトコルのフレーム（具体的には例えばイーサネットフレーム）であるものとする。
しかし、もちろん実施形態によっては、データフレーム３０２のペイロードは、ネットワーク層（第３層）以上で定義されるプロトコルのＰＤＵであってもよいし、特定の通信プロトコルとは無関係な生のデータであってもよい。例えば、データフレーム３０２のペイロードがＩＰ（Internet Protocol）データグラムであってもよい。この場合、上位層処理部１１１はＩＰデータグラムを処理する処理部である。
【０１６６】
データフレーム３０２の形式は以上説明したとおりであるが、具体的な値を使ってより詳しく例示すれば、データフレーム３０３および３０４のごとくである。
データフレーム３０３は、図６のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３に送信するデータフレームである。データフレーム３０３の具体的な内容は以下のとおりである。
【０１６７】
・ＬＤフィールドには、ステップＳ１０２の送信においてＬＤとして選択されたノード装置Ｎ３のノードＩＤ（すなわちＮ３）が指定されている。
・ＬＳフィールドには、ステップＳ１０２の送信におけるＬＳであるノード装置Ｎ２のノードＩＤ（すなわちＮ２）が指定されている。
【０１６８】
・ＧＤフィールドには、ＧＳであるノード装置Ｎ１がステップＳ１０１の送信のときに指定したノード装置Ｎ７のノードＩＤ（すなわちＮ７）が指定されている。
・ＧＳフィールドには、ＧＳであるノード装置Ｎ１のノードＩＤ（すなわちＮ１）が指定されている。
【０１６９】
・ＦＩＤフィールドには、ＧＳであるノード装置Ｎ１が生成したＦＩＤ（以下Ｆａとする）が指定されている。
・タイプフィールドには、「データフレーム」というタイプを示す所定の定数Ｄが指定されている。例えば、タイプは２ビットによって表すこともでき、Ｄ＝（００）２でもよい。
【０１７０】
・長さフィールドには、データフレーム３０２のペイロードの長さＰａが指定される。なお、長さは例えばバイト単位で表されてもよいし、その他の単位で表されてもよい。
・ペイロードとして、ＭＡＣ層プロトコルのフレーム（例えばイーサネットフレーム）が含まれる。
【０１７１】
また、データフレーム３０３を受信したノード装置Ｎ３が図６のステップＳ１０３でノード装置Ｎ４に送信するのが、図７のデータフレーム３０４である。データフレーム３０４の具体的な内容は以下のとおりである。
【０１７２】
・ＬＤフィールドには、ステップＳ１０３の送信においてＬＤとして選択されたノード装置Ｎ４のノードＩＤ（すなわちＮ４）が指定されている。つまり、転送にあたって、ノード装置Ｎ３はＬＤフィールドを書き換える。
【０１７３】
・ＬＳフィールドには、ステップＳ１０３の送信におけるＬＳであるノード装置Ｎ３のノードＩＤ（すなわちＮ３）が指定されている。つまり、転送にあたって、ノード装置Ｎ３はＬＳフィールドを書き換え、自ノードＩＤを設定する。
【０１７４】
・ＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドと、ペイロードの内容は、ノード装置Ｎ３が受信したデータフレーム３０３と同じである。
また、第１実施形態におけるハローフレームは、図７のハローフレーム３１１のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ハローフレーム３１１の具体例はハローフレーム３１２であり、ハローフレーム３１２は後述の図３１のステップＳ１２０３でノード装置Ｎ３により送信されるものである。
【０１７５】
ハローフレーム３１１のＬＤフィールドには、ハローフレーム３１１を送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値が指定される。なおここでの「ブロードキャスト」は「隣接するすべてのノード装置へのブロードキャスト」であり、「ネットワーク１全体へのフラッディング」ではないので注意されたい。
【０１７６】
以下、説明の便宜上、第１実施形態においてはノードＩＤが３バイトで表されるものとし、「０ｘ」は１６進数を表すものとする。また、０ｘ００００００と０ｘＦＦＦＦＦＦは予約されており、通常のノードＩＤとしては使われないものとする。
【０１７７】
第１実施形態におけるすべてのハローフレームでは、ハローフレーム３１２と同様、ＬＤフィールドに、当該ハローフレームを送信するノード装置に隣接するすべてのノード装置へのブロードキャストを表す特殊な値として、０ｘＦＦＦＦＦＦが指定されている。
【０１７８】
ハローフレーム３１１のＬＳフィールドには、ハローフレーム３１１を送信するノード装置自身のノードＩＤが指定される。よって、ノード装置Ｎ３が送信するハローフレーム３１２のＬＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０１７９】
また、第１実施形態におけるすべてのハローフレームでは、ＧＤフィールドに、ヌル（null）を表す特殊な値０ｘ００００００が指定される。なぜなら、ハローフレームは隣接ノード装置が利用するだけであり、転送されないからである。
【０１８０】
ハローフレーム３１１のＧＳフィールドには、ＬＳフィールドと同じく、ハローフレーム３１１を送信するノード装置自身のノードＩＤが指定される。よって、ハローフレーム３１２のＧＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０１８１】
ハローフレーム３１１のＦＩＤフィールドには、ハローフレーム３１１を送信するノード装置が生成してハローフレーム３１１に割り当てたＦＩＤが指定される。同様に、ハローフレーム３１２のＦＩＤフィールドには、ハローフレーム３１２を送信するノード装置Ｎ３が生成してハローフレーム３１２に割り当てたＦＩＤ（以下Ｆｂとする）が指定される。
【０１８２】
ハローフレーム３１１のタイプフィールドには、「ハローフレーム」というタイプを示す所定の定数が指定される。具体的には、「ハローフレーム」というタイプは、ハローフレーム３１２に例示するように所定の定数Ｈにより表され、例えばＨ＝（１０）２でもよい。
【０１８３】
また、第１実施形態におけるＡＣＫフレームは、図７のＡＣＫフレーム３２１のように、ＬＤ、ＬＳ、ＧＤ、ＧＳ、ＦＩＤ、タイプの各フィールドを含むヘッダを有するが、ペイロードを持たない。ＡＣＫフレーム３２１の具体例はＡＣＫフレーム３２２である。また、ＡＣＫフレーム３２２は、図６のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３にデータフレーム３０３を送信したとき、ノード装置Ｎ３がノード装置Ｎ２に返信するＡＣＫフレームである。後述の図３１では、このノード装置Ｎ３からノード装置Ｎ２へのＡＣＫフレーム３２２の返信をステップＳ１０２ａとして表している。
【０１８４】
ＡＣＫフレーム３２１のＬＤフィールドには、ＡＣＫフレーム３２１の送信の契機となったデータフレームを送信した隣接ノード装置のノードＩＤが指定される。よって、例えばＡＣＫフレーム３２２のＬＤフィールドには、ＡＣＫフレーム３２２をノード装置Ｎ３が送信する契機となったデータフレーム３０３を送信した、ノード装置Ｎ３の隣接ノード装置Ｎ２のノードＩＤであるＮ２が指定される。
【０１８５】
ＡＣＫフレーム３２１のＬＳフィールドには、ＡＣＫフレーム３２１を送信するノード装置自身のノードＩＤが指定される。よって、ノード装置Ｎ３が送信するＡＣＫフレーム３２２のＬＳフィールドには、ノード装置Ｎ３のノードＩＤであるＮ３が指定される。
【０１８６】
また、ハローフレームと同様にＡＣＫフレームも転送されないので、第１実施形態におけるすべてのＡＣＫフレームでは、ＧＤフィールドに、ヌルを表す特殊な値０ｘ００００００が指定される。
【０１８７】
ＡＣＫフレーム３２１のＧＳフィールドとＦＩＤフィールドには、ＡＣＫフレーム３２１の送信の契機となったデータフレームのＧＳフィールドとＦＩＤフィールドの値がコピーされる。上記のように、ＧＳフィールドとＦＩＤフィールドの値の組み合わせにより、データフレームがネットワーク内で一意に識別される。よって、ＡＣＫフレーム３２１を送信するノード装置が、受信したデータフレームから値をコピーすることで、ＡＣＫフレーム３２１がどのデータフレームに対するものなのかを、ＡＣＫフレーム３２１を受信したノード装置において識別することが可能となる。
【０１８８】
よって、例えばデータフレーム３０３の受信を契機として送信されるＡＣＫフレーム３２２では、ＧＳフィールドとＦＩＤフィールドの値は、データフレーム３０３と同じく、それぞれＮ１とＦａである。
【０１８９】
ＡＣＫフレーム３２１のタイプフィールドには、「ＡＣＫフレーム」というタイプを示す所定の定数が指定される。具体的には、「ＡＣＫフレーム」というタイプは、ＡＣＫフレーム３２２に例示するように所定の定数Ａにより表され、例えばＡ＝（１１）２でもよい。
【０１９０】
なお、図７に示したフレームの形式は一例にすぎず、実施形態に応じて、フレームに含まれるフィールドの並び順は適宜決めることができ、また、不図示の他のフィールドをフレームが含んでいてもよい。また、フレームがＦＣＳ（Frame Check Sequence）などのトレイラをさらに含んでいてもよい。
【０１９１】
また、以下では記載の簡単化のため、混乱のおそれがない場合は、例えば「ＬＤフィールド」を単に「ＬＤ」と称することもある。他のフィールドについても同様である。
図８は、図３のバッファ部１０９に格納されるデータの例を示す図である。
【０１９２】
バッファ部１０９は、受信部１０１が受信した個々のデータフレームにそれぞれ対応する複数のエントリを含む。そして、各エントリは、タイムアウト時刻と受信したデータフレームを含む。
【０１９３】
図８は、ノード装置Ｎ３のバッファ部１０９−Ｎ３内のあるエントリを例示している。具体的には、図６のステップＳ１０２において、ノード装置Ｎ２からノード装置Ｎ３が図７のデータフレーム３０３を受信すると、バッファ部１０９−Ｎ３には、タイムアウト時刻ＴＩ３，ｊとデータフレーム３０３とを含むエントリが作成される。バッファ部１０９におけるエントリの作成の詳細は、図１４とともに後述する。また、タイムアウト時刻ＴＩ３，ｊの意味は次のとおりである。
【０１９４】
ノード装置Ｎ３は、ステップＳ１０２で受信したデータフレーム３０３のヘッダを、ステップＳ１０３で図７のデータフレーム３０４のように書き換える。そしてノード装置Ｎ３は、ステップＳ１０３でデータフレーム３０４を送信する。
【０１９５】
図８のタイムアウト時刻ＴＩ３，ｊは、ノード装置Ｎ３が、データフレーム３０４を送信した後、データフレーム３０４に対するＡＣＫフレームの受信をいつまで待つのかを示す。つまり、ノード装置Ｎ３は、タイムアウト時刻ＴＩ３，ｊまでにデータフレーム３０４に対するＡＣＫフレームをノード装置Ｎ４から受信することができなければ、タイムアウトして、ノード装置Ｎ４へのデータフレーム３０４の送信に失敗したと判断する。
【０１９６】
なお、詳しくは図２２、図２６、および図２８に示すように、バッファ部１０９に設定されるタイムアウト時刻は、上書きされることもある。
例えば、図６のステップＳ１０４でノード装置Ｎ７へのデータフレームの送信に失敗したノード装置Ｎ４は、ステップＳ１０５において、ノード装置Ｎ３から受信したデータフレームに対応するバッファ部１０９−Ｎ４内のタイムアウト時刻を更新する。更新後のタイムアウト時刻は、具体的には、ステップＳ１０５でノード装置Ｎ５に送信したデータフレームへのＡＣＫフレームの受信をいつまでノード装置Ｎ４が待つかを表す。
【０１９７】
図９は、図３の隣接ノード管理テーブル１０３の例を示す図である。隣接ノード管理テーブル１０３には、ノードＩＤフィールドと最終更新時刻フィールドがある。
例えば、図１のネットワーク１では、ノード装置Ｎ２にはノード装置Ｎ１、Ｎ３、およびＮ６が隣接している。したがって、ノード装置Ｎ２の隣接ノード管理テーブル１０３−Ｎ２は、これら３つの隣接ノード装置Ｎ１、Ｎ３、およびＮ６にそれぞれ対応する３つのエントリがある。そして、隣接ノード装置Ｎｉ（ｉ＝１，３，６）に対応する各エントリにおいて、ノードＩＤフィールドには隣接ノード装置ＮｉのノードＩＤであるＮｉが格納
されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻ＴＡ２，ｉが格納されている。
【０１９８】
また、図１のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接している。したがって、ノード装置Ｎ３の隣接ノード管理テーブル１０３−Ｎ３は、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリがある。そして、隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリにおいて、ノードＩＤフィールドには隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されており、最終更新時刻フィールドには、当該エントリが最後に更新された時刻ＴＡ３，ｉが格納されている。
【０１９９】
図１０は、図３の重み付けテーブル１０４の例を示す図である。図１０は、具体例として、図１のノード装置Ｎ３の重み付けテーブル１０４−Ｎ３を示している。
図３に示すとおり、「重み付けテーブル１０４」とは、ＧＤごとに管理される複数の重み付けテーブル１０４−１〜１０４−Ｍの総称である。各重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）は、対応するＧＤを記憶している。
【０２００】
そして、各重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）は１つ以上のエントリを有し、各エントリは、最終更新時刻フィールドとＬＤフィールドと重みフィールドを有する。最終更新時刻フィールドには重みの学習のためにエントリが最後に更新された時刻が格納され、ＬＤフィールドには隣接ノード装置のノードＩＤが格納され、重みフィールドには当該隣接ノード装置に対応付けられた重みの値が格納される。
【０２０１】
図１０の例では、１枚目の重み付けテーブル１０４−１−Ｎ３は、ノード装置Ｎ７がＧＤとして指定されているデータフレームの送信用のテーブルなので、ＧＤとしてノード装置Ｎ７のノードＩＤであるＮ７を記憶している。
【０２０２】
また、図１のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接している。したがって、重み付けテーブル１０４−１−Ｎ３は、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリを有する。重み付けテーブル１０４−１−Ｎ３において隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリの内容は、次のとおりである。
【０２０３】
・最終更新時刻フィールドには、エントリの最終更新時刻ＴＷ３，７，ｉが格納されている。
・ＬＤフィールドには、隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されている。
【０２０４】
・重みフィールドには、隣接ノード装置Ｎｉに対応付けられる重みＷ３，７，ｉが格納されている。
すなわち、重みＷ３，７，ｉは、ノード装置Ｎ７（つまり重み付けテーブル１０４−１−Ｎ３に対応するＧＤ）をＧＤとして指定するデータフレームをノード装置Ｎ３が送信する場合に参照される、隣接ノード装置Ｎｉに対応する重みである。
【０２０５】
同様に、図１０の例では、２枚目の重み付けテーブル１０４−２−Ｎ３は、ノード装置Ｎ４がＧＤとして指定されているデータフレームの送信用のテーブルなので、ＧＤとしてノード装置Ｎ４のノードＩＤであるＮ４を記憶している。
【０２０６】
そして、図１のネットワーク１では、ノード装置Ｎ３にはノード装置Ｎ２、Ｎ４、およびＮ５が隣接しているので、重み付けテーブル１０４−２−Ｎ３も、これら３つの隣接ノード装置Ｎ２、Ｎ４、およびＮ５にそれぞれ対応する３つのエントリを有する。重み付けテーブル１０４−１−Ｎ３において隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応する各エントリの内容は、次のとおりである。
【０２０７】
・最終更新時刻フィールドには、エントリの最終更新時刻ＴＷ３，４，ｉが格納されている。
・ＬＤフィールドには、隣接ノード装置ＮｉのノードＩＤであるＮｉが格納されている。
【０２０８】
・重みフィールドには、隣接ノード装置Ｎｉに対応付けられる重みＷ３，４，ｉが格納されている。
もちろん、重み付けテーブル１０４−Ｎ３には、さらに別のＧＤと対応づけられた重み付けテーブル１０４−ｊ−Ｎ３（ｊ＞２）が含まれていてもよい。
【０２０９】
なお、次の点は注意すべきである。すなわち、重み付けテーブル１０４は、同一のＧＤであれば、たとえＦＩＤとＧＳの組み合わせが異なるデータフレームを送信したとしても、送信の度に、送信先となったＬＤの重みが更新される。例えば、あるデータフレームの送信時に、リンク障害のため特定のＬＤの重みが大きくなっても（優先度が低くなっても）、すぐに別データフレーム（ＧＤとＬＤは同一）の送信で、リンク障害が解消されていて送信成功となれば、該ＬＤの重みは小さくなる（優先度は高くなる）。逆に、複数の異なるデータフレーム（ＧＤとＬＤは同一）が立て続けに、リンク障害のため送信失敗となれば、たとえ同一のＦＩＤとＧＳの組み合わせのデータフレームは１度しか送信を試していなくても、該当のＬＤの重みが最大値になってしまうこともありうる。
【０２１０】
図１１は、図１０の重み付けテーブル１０４−１−Ｎ３の変化を説明する図である。図１１の例では、Ｔａ＜Ｔｂ＜Ｔｃ＜Ｔｄ＜Ｔｅである。
例えば、図６のステップＳ１０２でノード装置Ｎ２からデータフレームを受信した時点では、ノード装置Ｎ３の重み付けテーブル１０４−Ｎ３には、ノード装置Ｎ７に対応する重み付けテーブル１０４−１−Ｎ３が存在しなかったとする。そして、ステップＳ１０２の受信を契機として、以下のような内容の新たな重み付けテーブル１０４−１−Ｎ３が重み付けテーブル１０４−Ｎ３に作成されたとする。
【０２１１】
・３つのエントリの最終更新時刻はいずれも時刻Ｔａである。
・３つのエントリにおいて、隣接ノード装置Ｎｉ（ｉ＝２，４，５）に対応付けられる重みＷ３，７，ｉは、いずれも０．５である。
【０２１２】
なお、図６に関しては説明の簡単化のため、「２つの隣接ノード装置Ｎ４とＮ５のうちでノード装置Ｎ４の方が、重み付けテーブル１０４−ｈ３−Ｎ３において、より軽い重みと対応付けられているとする」と説明した。つまり、図１０と図１１はｈ３＝１の例であり、図６の説明ではＷ３，７，４＜Ｗ３，７，５と仮定している。
【０２１３】
しかし、例えば図１１に示すように、Ｗ３，７，２＝Ｗ３，７，４＝Ｗ３，７，５＝０．５という場合もありうる。図１１の例では、ノード装置Ｎ４とＮ５が同じ重み０．５に対応付けられているので、ノード装置Ｎ３はステップＳ１０３での送信のＬＤとしてノード装置Ｎ４とＮ５のいずれを選ぶこともできるが、仮に、図６の例と同様に、ノード装置Ｎ４をＬＤとして選んだとする。
【０２１４】
すると、ステップＳ１０３でノード装置Ｎ３がノード装置Ｎ４にデータフレームを送信する。その後、図３１においてステップＳ１０３ａとして示すようにノード装置Ｎ４がノード装置Ｎ３にＡＣＫフレームを送信すると、ノード装置Ｎ３は、ノード装置Ｎ４へのデータフレームの送信が成功したと認識する。
【０２１５】
そして、図５の例と同様にして、ノード装置Ｎ３は、ノード装置Ｎ４に対応付けられた重みＷ３，７，４の値を小さくする。図１１の例では、具体的には、ノード装置Ｎ３はＷ３，７，４の値を０．５から０．４に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ４に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｂを設定する。
【０２１６】
その後、図６に示すように、ノード装置Ｎ３はステップＳ１０６で再び同一のデータフレームを受信する。その結果、ノード装置Ｎ３は、図６に関して説明したように、重み付けテーブル１０４−１−Ｎ３においてノード装置Ｎ４と対応付けられている重みＷ３，７，４の値を、０．４から最大値である１．０に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ４に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｃを設定する。
【０２１７】
続いて、図６のステップＳ１０７に示すように、ノード装置Ｎ３はノード装置Ｎ５をＬＤとして選択してデータフレームを送信する。その後、図３１においてステップＳ１０７ａとして示すようにノード装置Ｎ５がノード装置Ｎ３にＡＣＫフレームを送信すると、ノード装置Ｎ３は、ノード装置Ｎ５へのデータフレームの送信が成功したと認識する。
【０２１８】
そして、図５の例と同様にして、ノード装置Ｎ３は、ノード装置Ｎ５に対応付けられた重みＷ３，７，５の値を小さくする。図１１の例では、具体的には、ノード装置Ｎ３はＷ３，７，５の値を０．５から０．４に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ５に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｄを設定する。
【０２１９】
その後、図６に示すように、ノード装置Ｎ３はステップＳ１０９で再び同一のデータフレームを受信する。その結果、図６に関して説明したように、重み付けテーブル１０４−１−Ｎ３においてノード装置Ｎ５と対応付けられている重みＷ３，７，５の値を、０．４から最大値である１．０に更新する。また、ノード装置Ｎ３は、ノード装置Ｎ５に対応するエントリの最終更新時刻フィールドに、現在時刻Ｔｅを設定する。
【０２２０】
以上のように、重み付けテーブル１０４−１−Ｎ３は、ＡＣＫフレームの受信を契機として、あるいは、送信済みのデータフレームと同一のデータフレームの受信を契機として、更新される。
【０２２１】
図１２と図１３は、図３のＦＩＤ管理テーブル１０５の例を示す図である。図１２と図１３に示すように、ＦＩＤ管理テーブル１０５には、ＦＩＤ、ＧＳ、ＬＤ、ＯＬＳ、最終更新時刻の各フィールドがある。
【０２２２】
ＦＩＤ管理テーブル１０５におけるＦＩＤフィールドとＧＳフィールドは、データフレームを一意に識別するためのフィールドであり、受信したデータフレームのＦＩＤフィールドとＧＳフィールドから値がそれぞれコピーされる。
【０２２３】
ＦＩＤ管理テーブル１０５のＬＤフィールドには、ＦＩＤフィールドとＧＳフィールドの値により識別されるデータフレームを送信するために、最後にＬＤとして選択した隣接ノード装置のノードＩＤが格納される。
【０２２４】
また、ＦＩＤ管理テーブル１０５のＯＬＳフィールドには、ＦＩＤフィールドとＧＳフィールドの値により識別されるデータフレームを最初に受信したときに当該データフレームのＬＳフィールドに指定されていた隣接ノード装置のノードＩＤが格納される。ＯＬＳフィールドは、データフレームの転送のためにＬＤを選択するにあたって、ＬＤの候補の中からＯＬＳを除くためにも利用され、バックトラック動作のときのＬＤを決定するため
にも利用される。
【０２２５】
そして、ＦＩＤ管理テーブル１０５の最終更新時刻フィールドには、エントリが最後に更新された時刻が格納される。
さて、図１２と図１３は、図６のステップＳ１０１〜Ｓ１１２での各ノード装置のＦＩＤ管理テーブル１０５を具体例として示している。以下、ステップＳ１０１〜Ｓ１１２がそれぞれ実行される時刻をＴＦ１０１〜ＴＦ１１２と表す。
【０２２６】
ステップＳ１０１でノード装置Ｎ１がノード装置Ｎ２にデータフレームを送信するとき、ノード装置Ｎ１はＦＩＤ管理テーブル１０５−Ｎ１に新たなエントリＥ１を作成する。
そして、ノード装置Ｎ１は、エントリＥ１のＦＩＤフィールドとＧＳフィールドに、送信したデータフレームのＦＩＤとＧＳの値を設定する。
【０２２７】
ここで、データフレームのＧＳとＦＩＤの値は、前述のとおり、データフレームがネットワーク１内を転送されても書き換えられない。したがって、図６でネットワーク１内をステップＳ１０１〜Ｓ１１２で送信されるデータフレームのＦＩＤとＧＳの値は、図７のデータフレーム３０３および３０４と同じく、それぞれＦａとＮ１である。よって、ステップＳ１０１でノード装置Ｎ１は、エントリＥ１のＦＩＤフィールドとＧＳフィールドに、それぞれＦａとＮ１という値を設定する。
【０２２８】
なお、以下の各ステップＳ１０２〜Ｓ１１２で他のノード装置がそれぞれのＦＩＤ管理テーブル１０５のエントリのＦＩＤフィールドとＧＳフィールドに設定する値も、同じくＦａとＮ１である。よって、以下ではＦＩＤフィールドとＧＳフィールドに関する説明を省略する。
【０２２９】
また、ステップＳ１０１でノード装置Ｎ１は、ＬＤとして選択したノード装置Ｎ２のノードＩＤであるＮ２を、エントリＥ１のＬＤフィールドに設定する。
ところで、ＧＳとＦＩＤの値の組により一意に識別される、ある特定のデータフレームに関して、ＯＬＳとは、当該特定のデータフレームを最初に受信したときの当該特定のデータフレームのＬＳに指定されたノードＩＤで識別される隣接ノード装置のことである。
【０２３０】
しかしこのようにＯＬＳを定義すると、例えばノード装置Ｎ１がＧＳとなってデータフレームを送信する場合に、ノード装置Ｎ１自身にとっては、送信したデータフレームに関してＯＬＳが未定義となってしまう。そこで、以下ではＯＬＳの定義を拡張する。具体的には、「ノード装置Ｎｉ自身がＧＳとなってデータフレームを送信する場合には、当該データフレームに関するノード装置Ｎｉ自身にとってのＯＬＳとは、ノード装置Ｎｉ自身である」と定義する。
【０２３１】
換言すれば、ＯＬＳとは、ノード装置Ｎｉ自身が直接認識しているネットワークの範囲内において、ノード装置Ｎｉにとってデータフレームの起源として認識されるノード装置である。なおここで、「ノード装置Ｎｉ自身が直接認識しているネットワークの範囲」とは、ノード装置Ｎｉから見てホップ数１以下の範囲であり、具体的にはノード装置Ｎｉ自身と、ノード装置Ｎｉの隣接ノード装置のみが含まれる。例えば、図２の例では、ノード装置Ｎ１０５自身が直接認識しているネットワークの範囲のみが実線で示されている。
【０２３２】
以上の拡張されたＯＬＳの定義より、ステップＳ１０１でノード装置Ｎ１がエントリＥ１のＯＬＳフィールドに設定する値は、ノード装置Ｎ１自身のノードＩＤ（すなわちＮ１）である。ノード装置Ｎ１は、もし今後ＧＳの値がＮ１でＦＩＤの値がＦａのデータフレームを受信することがあれば、以上のようにして作成したエントリＥ１に基づいて、「かつてノード装置Ｎ１自身が送信したデータフレームを受信した」と認識することができる
。
【０２３３】
また、ステップＳ１０１でノード装置Ｎ１は、現在時刻ＴＦ１０１をエントリＥ１の最終更新時刻フィールドに設定する。なお、以下の各ステップＳ１０２〜Ｓ１１２で他のノード装置がそれぞれのＦＩＤ管理テーブル１０５のエントリの最終更新時刻フィールドに設定する値は、同様に、各ステップＳ１０２〜Ｓ１１２が実行される時刻ＴＦ１０２〜ＴＦ１１２である。よって、以下では最終更新時刻フィールドに関する説明も省略する。
【０２３４】
そして、ステップＳ１０１でノード装置Ｎ１からデータフレームを受信したノード装置Ｎ２は、ステップＳ１０２でノード装置Ｎ３にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ２に新たなエントリＥ２を作成する。そして、ノード装置Ｎ２はエントリＥ２において、ＯＬＳフィールドにはＮ１と設定し、ＬＤフィールドにはＮ３と設定する。
【０２３５】
続いて、ステップＳ１０２でノード装置Ｎ２からデータフレームを受信したノード装置Ｎ３は、ステップＳ１０３でノード装置Ｎ４にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリＥ３を作成する。そして、ノード装置Ｎ３はエントリＥ３において、ＯＬＳフィールドにはＮ２と設定し、ＬＤフィールドにはＮ４と設定する。
【０２３６】
続いて、ステップＳ１０３でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ４は、ステップＳ１０４でノード装置Ｎ７にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ４に新たなエントリＥ４を作成する。そして、ノード装置Ｎ４はエントリＥ４において、ＯＬＳフィールドにはＮ３と設定し、ＬＤフィールドにはＮ７と設定する。
【０２３７】
ところが、ステップＳ１０４での送信は、ノード装置Ｎ４とＮ７の間のリンクの障害のために失敗する。すなわち、ノード装置Ｎ４は、ノード装置Ｎ７からＡＣＫフレームを受信することができないため、タイムアウトする。その結果、ノード装置Ｎ４は、ステップＳ１０５のように、他の隣接ノード装置Ｎ５を次のＬＤとして再選択し、ノード装置Ｎ５にデータフレームを送信する。
【０２３８】
ここで、ステップＳ１０４とＳ１０５でそれぞれ送信されるデータフレームは、ＦＩＤの値がＦａでありＧＳの値がＮ１であるから、同一のデータフレームである。したがって、ステップＳ１０５でノード装置Ｎ４は、新たなエントリを作成するのではなく、既存のエントリＥ４を更新する。
【０２３９】
具体的には、ステップＳ１０５でノード装置Ｎ４は、エントリＥ４において、ＬＤフィールドの値をＮ５に上書きする。なお、ＧＳの値がＮ１でＦＩＤの値がＦａである同じデータフレームをノード装置Ｎ４が何度送信しようとも、「ノード装置Ｎ４が当該データフレームを最初に受信したのはノード装置Ｎ３からである」という事実は変わらない。よって、エントリＥ４のＯＬＳフィールドの値は、書き換えられることはなく、Ｎ３のままである。
【０２４０】
続いて、ステップＳ１０５でノード装置Ｎ４からデータフレームを受信したノード装置Ｎ５は、ステップＳ１０６でノード装置Ｎ３にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ５に新たなエントリＥ５を作成する。そして、ノード装置Ｎ５はエントリＥ５において、ＯＬＳフィールドにはＮ４と設定し、ＬＤフィールドにはＮ３と設定する。
【０２４１】
そして、ステップＳ１０６でノード装置Ｎ５からデータフレームを受信したノード装置Ｎ３は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ３を検索し、エントリＥ３を見つける。エントリＥ３が見つかったことから、ノード装置Ｎ３は、「ノード装置Ｎ３自身がかつてステップＳ１０３で送信したのと同一のデータフレームをステップＳ１０６で受信した」と認識することができる。
【０２４２】
したがって、ノード装置Ｎ３は、次のステップＳ１０７でデータフレームをノード装置Ｎ５に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリを作成するのではなく、既存のエントリＥ３を更新する。具体的には、ステップＳ１０７でノード装置Ｎ３は、エントリＥ３において、ＬＤフィールドの値をＮ５に上書きする。なお、エントリＥ３のＯＬＳフィールドの値は書き換えられることはなく、Ｎ２のままである。
【０２４３】
すると、ステップＳ１０７でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ５は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ５を検索し、エントリＥ５を見つける。エントリＥ５が見つかったことから、ノード装置Ｎ５は、「ノード装置Ｎ５自身がかつてステップＳ１０６で送信したのと同一のデータフレームをステップＳ１０７で受信した」と認識することができる。
【０２４４】
したがって、ノード装置Ｎ５は、次のステップＳ１０８でデータフレームをノード装置Ｎ４に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ５に新たなエントリを作成するのではなく、既存のエントリＥ５を更新する。具体的には、ステップＳ１０８でノード装置Ｎ５は、エントリＥ５において、ＬＤフィールドの値をＮ４に上書きする。なお、エントリＥ５のＯＬＳフィールドの値は書き換えられることはなく、Ｎ４のままである。
【０２４５】
すると、ステップＳ１０８でノード装置Ｎ５からデータフレームを受信したノード装置Ｎ４は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ４を検索し、エントリＥ４を見つける。エントリＥ４が見つかったことから、ノード装置Ｎ４は、「ノード装置Ｎ４自身がかつてステップＳ１０５で送信したのと同一のデータフレームをステップＳ１０８で受信した」と認識することができる。
【０２４６】
したがって、ノード装置Ｎ４は、次のステップＳ１０９でデータフレームをノード装置Ｎ３に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ４に新たなエントリを作成するのではなく、既存のエントリＥ４を更新する。具体的には、ステップＳ１０９でノード装置Ｎ４は、エントリＥ４において、ＬＤフィールドの値をＮ３に上書きする。なお、エントリＥ４のＯＬＳフィールドの値は書き換えられることはなく、Ｎ３のままである。
【０２４７】
すると、ステップＳ１０９でノード装置Ｎ４からデータフレームを受信したノード装置Ｎ３は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ３を検索し、エントリＥ３を見つける。エントリＥ３が見つかったことから、ノード装置Ｎ３は、「ノード装置Ｎ３自身がかつてステップＳ１０３で送信したのと同一のデータフレームをステップＳ１０９で受信した」と認識することができる。
【０２４８】
したがって、ノード装置Ｎ３は、次のステップＳ１１０でデータフレームをノード装置Ｎ２に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ３に新たなエントリを作成するのではなく、既存のエントリＥ３を更新する。具体的には、ステップＳ１１０でノード装置Ｎ３は、エントリＥ３において、ＬＤフィールドの値をＮ２に上書きする。なお、エントリＥ３のＯＬＳフィールドの値は書き換えられることはなく、Ｎ２のままである。
【０２４９】
すると、ステップＳ１１０でノード装置Ｎ３からデータフレームを受信したノード装置Ｎ２は、受信したデータフレームのＧＳとＦＩＤの値をキーにしてＦＩＤ管理テーブル１０５−Ｎ２を検索し、エントリＥ２を見つける。エントリＥ２が見つかったことから、ノード装置Ｎ２は、「ノード装置Ｎ２自身がかつてステップＳ１０２で送信したのと同一のデータフレームをステップＳ１１０で受信した」と認識することができる。
【０２５０】
したがって、ノード装置Ｎ２は、次のステップＳ１１１でデータフレームをノード装置Ｎ６に送信するに際して、ＦＩＤ管理テーブル１０５−Ｎ２に新たなエントリを作成するのではなく、既存のエントリＥ２を更新する。具体的には、ステップＳ１１１でノード装置Ｎ２は、エントリＥ２において、ＬＤフィールドの値をＮ６に上書きする。なお、エントリＥ２のＯＬＳフィールドの値は書き換えられることはなく、Ｎ１のままである。
【０２５１】
そして、ステップＳ１１１でノード装置Ｎ２からデータフレームを受信したノード装置Ｎ６は、ステップＳ１１２でノード装置Ｎ７にデータフレームを送信するときにＦＩＤ管理テーブル１０５−Ｎ６に新たなエントリＥ６を作成する。そして、ノード装置Ｎ６はエントリＥ６において、ＯＬＳフィールドにはＮ２と設定し、ＬＤフィールドにはＮ７と設定する。
【０２５２】
続いて、図１４〜図２９のフローチャートを参照して、ノード装置１００の動作の詳細を説明する。
図１４は、フレーム受信処理のフローチャートである。フレーム受信処理は、ノード装置１００に電源が入れられると開始される。
【０２５３】
ステップＳ２０１で受信部１０１は、フレームを受信するまで待機する。つまり、受信部１０１は、フレームを受信していなければステップＳ２０１を繰り返す。フレームを受信すると、受信部１０１は受信したフレームをフレーム分岐処理部１０６に出力し、処理はステップＳ２０２に移行する。
【０２５４】
ステップＳ２０２では、フレーム分岐処理部１０６が、ステップＳ２０１で受信部１０１が受信したフレームのタイプフィールドの値を参照し、フレームのタイプを判定する。受信したフレームのタイプがハローフレームの場合、処理はステップＳ２０３に移行し、データフレームの場合、処理はステップＳ２０４に移行し、ＡＣＫフレームの場合、処理はステップＳ２０６に移行する。
【０２５５】
ステップＳ２０３では、受信されたハローフレームをフレーム分岐処理部１０６がリンク管理部１０８へ出力し、リンク管理部１０８が図１５のハローフレーム受信処理を行う。そして処理はステップＳ２０１に戻る。もちろん、図４のＭＰＵ２０１が図３の各部に対応する複数のタスクを並行して実行するマルチタスク環境では、フレーム分岐処理部１０６がハローフレームを出力したら、ハローフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０２５６】
また、ステップＳ２０４では、フレーム分岐処理部１０６が、ステップＳ２０１で受信されたデータフレームをバッファ部１０９に格納する。つまり、フレーム分岐処理部１０６は、バッファ部１０９内に新たなエントリの領域を確保し、確保した領域にステップＳ２０１で受信されたデータフレームを格納する。また、フレーム分岐処理部１０６は、次のステップＳ２０５のためにデータフレームからＧＳとＦＩＤの値を取り出して記憶しておく。
【０２５７】
なお、図８のとおりバッファ部１０９はタイムアウト時刻フィールドを有するが、ステップＳ２０４の時点では、タイムアウト時刻はまだ設定されない。
そして、ステップＳ２０５でフレーム分岐処理部１０６は、データフレーム処理部１１０にデータフレーム受信処理を行うよう指示する。指示に際してフレーム分岐処理部１０６は、ステップＳ２０４で記憶しておいたデータフレームのＧＳとＦＩＤの値をデータフレーム処理部１１０に通知する。
【０２５８】
なお、ノード装置１００がＧＳとならないタイプの装置である場合（すなわち、ノード装置１００が中継専門の装置である場合）、データフレーム受信処理は図２０〜２３のとおりである。他方、ノード装置１００がＧＳにもなりうるタイプの装置である場合、データフレーム受信処理は、図２０〜２２、２９のとおりである。
【０２５９】
データフレーム処理部１１０が指示にしたがってデータフレーム受信処理を行うと、処理はステップＳ２０１に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部１０６がデータフレーム処理部１１０にデータフレーム受信処理を行うよう指示したら、データフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０２６０】
また、ステップＳ２０６では、受信されたＡＣＫフレームをフレーム分岐処理部１０６がＡＣＫ処理部１０７へ出力し、ＡＣＫ処理部１０７が図２５のＡＣＫフレーム受信処理を行う。そして処理はステップＳ２０１に戻る。もちろん、マルチタスク環境では、フレーム分岐処理部１０６がＡＣＫフレームを出力したら、ＡＣＫフレーム受信処理の終了を待たずに処理がステップＳ２０１に移行してもよい。
【０２６１】
図１５は、図１４のステップＳ２０３におけるハローフレーム受信処理のフローチャートである。図１５の処理は、フレーム分岐処理部１０６からハローフレームがリンク管理部１０８に出力されると開始される。
【０２６２】
ステップＳ３０１でリンク管理部１０８は、受信したハローフレームのＬＳと同じ値をノードＩＤとして持つエントリが、隣接ノード管理テーブル１０３（図９参照）に存在するか否かを判断する。エントリが見つかれは処理はステップＳ３０２に移行し、エントリが見つからなければ処理はステップＳ３０３に移行する。
【０２６３】
なお、図１５の説明における「受信したハローフレーム」とは、図１４のステップＳ２０１で受信部１０１が受信したハローフレームである。つまり、図１５の説明における「受信したハローフレーム」とは、ステップＳ２０２でフレーム分岐処理部１０６がリンク管理部１０８に出力して図１５の処理の開始の契機となったハローフレームである。
【０２６４】
ステップＳ３０２でリンク管理部１０８は、ステップＳ３０１で見つかったエントリの最終更新時刻として、現在時刻を設定する。そして、図１５の処理は終了する。
例えば、ノード装置Ｎ２においてステップＳ３０２が実行された結果として、図９のように隣接ノード管理テーブル１０３−Ｎ２において、Ｎ１というノードＩＤに対応する最終更新時刻フィールドの値がＴＡ２，１と更新される。その結果、ノード装置Ｎ２は「時刻ＴＡ２，１にはノード装置Ｎ２がノード装置Ｎ１を隣接ノード装置として認識可能な状況であった」と記憶しておくことができる。
【０２６５】
他方、ステップＳ３０１でエントリが見つからない場合は、今まで隣接ノード装置として認識していなかった新たなノード装置からハローフレームが受信されたということである。よって、続くステップＳ３０３〜Ｓ３０８において、当該新たなノード装置を隣接ノード装置として登録するための処理が行われる。
【０２６６】
ステップＳ３０３でリンク管理部１０８は、隣接ノード管理テーブル１０３に新規エントリを追加する。
そして、ステップＳ３０４でリンク管理部１０８は、ステップＳ３０３で追加した新規エントリに、受信したハローフレームのＬＳの値と現在時刻を設定する。例えば、図７のハローフレーム３１２を初めて受信したとき、ノード装置Ｎ２は、新規エントリのノードＩＤフィールドに、ハローフレーム３１２のＬＳの値であるＮ３を設定し、新規エントリの最終更新時刻フィールドに現在時刻を設定する。
【０２６７】
続いて、ステップＳ３０５でリンク管理部１０８は、重み付けテーブル１０４−１〜１０４−Ｍ（図１０と図１１を参照）の中に、まだ注目していない重み付けテーブル１０４−ｉ（１≦ｉ≦Ｍ）があるか否かを判断する。既にすべての重み付けテーブル１０４−１〜１０４−Ｍに注目し終わっていれば、図１５の処理は終了し、まだ注目していない重み付けテーブル１０４−ｉがあれば、処理はステップＳ３０６に移行する。
【０２６８】
ステップＳ３０６でリンク管理部１０８は、重み付けテーブル１０４−１〜１０４−Ｍのうちでまだ注目していないものの中から、次の重み付けテーブルに注目する。以下では説明の便宜上、ステップＳ３０６では重み付けテーブル１０４−ｉが注目されたとする。
【０２６９】
そして、ステップＳ３０７でリンク管理部１０８は、注目している重み付けテーブル１０４−ｉに新規エントリを追加する。
さらに、ステップＳ３０８でリンク管理部１０８は、ステップＳ３０７で追加した新規エントリのＬＤ、重み、最終更新時刻の各フィールドに、受信したハローフレームのＬＳの値と、初期重み付け値と、現在時刻を、それぞれ設定する。初期重み付け値は、実施形態に応じて任意に決められる定数である。
【０２７０】
第１実施形態では、上記のとおり重みの値は０以上１以下であり、１はＬＤとして選択不能なことを示す特別な値であるから、初期重み付け値は、０以上１未満の任意の値でよい。より具体的には、初期重み付け値は、例えば０．５でもよい。例えば、図１１の１番上に示した重み付けテーブル１０４−１−Ｎ３の最初のエントリは、次のようにして作成されたものであってもよい（ただし、正確にはその場合、最初のエントリの最終更新時刻には、他の２つのエントリの最終更新時刻Ｔａとは異なる値が設定され、図１１とまったく同じとはならない）。
【０２７１】
・ＧＤとしてノード装置Ｎ７に対応付けられた重み付けテーブル１０４−１−Ｎ３が既に存在している。
・しかし、ノード装置Ｎ３は、ノード装置Ｎ２を隣接ノード装置として今まで認識していなかった。
【０２７２】
・ノード装置Ｎ３は、ノード装置Ｎ２から初めてハローフレームを受信した。
・以上の状況において、ステップＳ３０６では重み付けテーブル１０４−１−Ｎ３が注目された。
【０２７３】
・よって、ステップＳ３０８では、新規エントリのＬＤフィールドに、受信したハローフレームのＬＳの値であるＮ２が設定され、新規エントリの重みフィールドに、初期重み付け値である０．５が設定された。
【０２７４】
ステップＳ３０８の実行後、処理はステップＳ３０５に戻る。
図１６は、ハローフレーム送信処理のフローチャートである。図１６の処理は、図１４の処理とは独立して並行に、ハローフレーム生成部１１２により実行される。具体的には、ノード装置１００に電源が入れられると、ハローフレーム生成部１１２が図１６の処理を開始する。
【０２７５】
ステップＳ４０１でハローフレーム生成部１１２は、現在時刻が送信予定時刻であるか否かを判断する。現在時刻が送信予定時刻であれば処理はステップＳ４０２に移行し、現在時刻が送信予定時刻でなければ処理はステップＳ４０１に戻る。つまり、ハローフレーム生成部１１２は送信予定時刻まで待機する。
【０２７６】
例えば、基準時刻Ｔｒｅｆとハローフレームの送信間隔ΔＴｈｅｌｌｏが予め決められていてもよい。また、ハローフレーム生成部１１２は、例えば図４のＭＰＵ２０１のクロックに基づいて現在時刻Ｔｎｏｗを参照することができる。ハローフレーム生成部１１２は、式（４）のＺが整数のときのみ、「現在時刻は送信予定時刻である」と判断してもよい。
【０２７７】
Ｚ＝（Ｔｒｅｆ−Ｔｎｏｗ）／ΔＴｈｅｌｌｏ        （４）
例えば、基準時刻Ｔｒｅｆは予め決められた定数でもよいし、ノード装置１００に電源が入れられた時刻でもよい。また、送信間隔ΔＴｈｅｌｌｏは実施形態に応じて適宜決めることができ、例えば１０秒などの比較的長い時間でもよい。
【０２７８】
ステップＳ４０２では、ハローフレーム生成部１１２がＦＩＤ生成部１１３に新たなＦＩＤの生成を要求し、ＦＩＤ生成部１１３が新たなＦＩＤを生成する。例えば、ＦＩＤはシーケンス番号でもよく、ＦＩＤ生成部１１３はカウンタ回路を使って実現されてもよい。もちろん、ＦＩＤ生成部１１３はＭＰＵ２０１がプログラムを実行することで実現されてもよい。
【０２７９】
ステップＳ４０２ではさらに、ＦＩＤ生成部１１３が生成したＦＩＤを用いてハローフレーム生成部１１２がハローフレームを生成する。
例えば、図７のハローフレーム３１２は、次のようにして生成される。すなわち、ノード装置Ｎ３のＦＩＤ生成部１１３−Ｎ３が、新たなＦＩＤとしてＦｂという値を生成する。すると、ノード装置Ｎ３のハローフレーム生成部１１２−Ｎ３は、新たなハローフレーム３１２を生成する。
【０２８０】
その際、ハローフレーム生成部１１２−Ｎ３は、ハローフレーム３１２において、ＬＤに０ｘＦＦＦＦＦＦという所定の値を設定し、ＬＳとＧＳに自ノードＩＤであるＮ３を設定し、ＧＤに０ｘ００００００という所定の値を設定する。また、ハローフレーム生成部１１２−Ｎ３は、ハローフレーム３１２において、ＦＩＤにはＦＩＤ生成部１１３−Ｎ３により生成された値Ｆｂを設定し、タイプには所定の値Ｈを設定する。
【０２８１】
以上のようにしてステップＳ４０２でハローフレームが生成されると、続いて、ステップＳ４０３においてハローフレーム生成部１１２は、生成したハローフレームの送信を送信部１０２に依頼し、送信部１０２がハローフレームを送信する。そして、処理はステップＳ４０１に戻る。
【０２８２】
続いて、各種テーブルのエージング処理について図１７〜図１９を参照して説明する。各エージング処理は、例えば、図４のタイマＩＣ２０３からの割り込み信号を契機として開始されてもよい。
【０２８３】
図１７は、隣接ノード管理テーブル１０３のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉａで割り込み信号をリンク管理部１０８に出力し、割り込み信号を契機としてリンク管理部１０８が所定の間隔Ｉａで図１７の処理を行ってもよい。
【０２８４】
ステップＳ５０１でリンク管理部１０８は、隣接ノード管理テーブル１０３（図９を参照）の１つ目のエントリに注目する。以下、図１７に関する説明においては、リンク管理部１０８が注目している隣接ノード管理テーブル１０３のエントリを「注目エントリ」という。
【０２８５】
続いてステップＳ５０２でリンク管理部１０８は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ以上か否かを判断する。なお、実施形態によって、Ｇａ＝Ｉａでもよいし、Ｇａ＜Ｉａでもよいし、Ｇａ＞Ｉａでもよい。
【０２８６】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ以上であれば、処理はステップＳ５０３に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇａ未満であれば、処理はステップＳ５０５に移行する。
【０２８７】
ステップＳ５０３でリンク管理部１０８は、注目エントリのノードＩＤと同じ値をＬＤとして有するエントリを、重み付けテーブル１０４から削除する。
例えば、注目エントリが、図９の隣接ノード管理テーブル１０３−Ｎ３の３番目のエントリである場合、注目エントリのノードＩＤの値はＮ５である。したがって、ステップＳ５０３でリンク管理部１０８は、重み付けテーブル１０４−１−Ｎ３〜１０４−Ｍ−Ｎ３のそれぞれから、ＬＤの値がＮ５であるエントリを削除する。例えば、ステップＳ５０３では、図１０の重み付けテーブル１０４−１−Ｎ３の３つ目のエントリと、重み付けテーブル１０４−２−Ｎ３の３つ目のエントリが削除される。
【０２８８】
そして、ステップＳ５０４でリンク管理部１０８は。注目エントリを隣接ノード管理テーブル１０３から削除する。そして処理はステップＳ５０５に移行する。
ステップＳ５０５でリンク管理部１０８は、まだ注目していないエントリが隣接ノード管理テーブル１０３に残っているか否かを判断する。リンク管理部１０８が、隣接ノード管理テーブル１０３のすべてのエントリに注目し終わっていれば、図１７の処理は終了する。他方、まだリンク管理部１０８が注目していないエントリが隣接ノード管理テーブル１０３に残っていれば、処理はステップＳ５０６に移行する。
【０２８９】
ステップＳ５０６でリンク管理部１０８は、隣接ノード管理テーブル１０３のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ５０２に戻る。
【０２９０】
以上の図１７のエージング処理により、ノード装置１００は、今まで隣接ノード装置として認識していたノード装置からのハローフレームの受信が途絶えると、「当該ノード装置は、もはやノード装置１００に隣接していない」と認識することができるようになる。つまり、図１７の処理により、ノード装置１００は、潜在的なＬＤの候補としての隣接ノード装置を、環境の変化に追従して適切に管理することができるようになる。
【０２９１】
なお、上記の所定の間隔Ｉａおよび所定の値Ｇａは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。なお、第１実施形態では、ネットワーク内のすべてのノード装置に同じハローフレームの送信間隔ΔＴｈｅｌｌｏが設定されており、隣接ノード管理テーブル１０３のエージング時間である上記の所定の値Ｇａは、Ｇａ＞ΔＴｈｅｌｌｏを満たす。
【０２９２】
図１８は、重み付けテーブル１０４のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉｗで割り込み信号をデータフレーム処理部１１０に出力し、割り込み信号を契機としてデータフレーム処理部１１０が所定の間隔Ｉｗで図１８の処理を行ってもよい。
【０２９３】
ステップＳ６０１でデータフレーム処理部１１０は、重み付けテーブル１０４（図１０と図１１を参照）のうち１枚目の重み付けテーブル１０４−１に注目する。以下、図１８に関する説明においては、データフレーム処理部１１０が注目している重み付けテーブルを、「１０４−ｉ」という参照符号で表し（１≦ｉ≦Ｍ）、「注目テーブル」という。ステップＳ６０１の実行直後はｉ＝１である。
【０２９４】
続いてステップＳ６０２でデータフレーム処理部１１０は、注目テーブル１０４−ｉの１つ目のエントリに注目する。以下、注目テーブルのうちでデータフレーム処理部１１０が注目しているエントリを「注目エントリ」という。
【０２９５】
続いてステップＳ６０３でデータフレーム処理部１１０は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ以上か否かを判断する。なお、実施形態によって、Ｇｗ＝Ｉｗでもよいし、Ｇｗ＜Ｉｗでもよいし、Ｇｗ＞Ｉｗでもよい。
【０２９６】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ以上であれば、処理はステップＳ６０４に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｗ未満であれば、処理はステップＳ６０５に移行する。
【０２９７】
ステップＳ６０４でデータフレーム処理部１１０は、注目テーブル１０４−ｉから注目エントリを削除する。そして処理はステップＳ６０５に移行する。
ステップＳ６０５でデータフレーム処理部１１０は、注目テーブル１０４−ｉにまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部１１０が注目テーブル１０４−ｉのすべてのエントリに注目し終わっていれば、処理はステップＳ６０７に移行する。他方、まだデータフレーム処理部１１０が注目していないエントリが注目テーブル１０４−ｉに残っていれば、処理はステップＳ６０６に移行する。
【０２９８】
ステップＳ６０６でデータフレーム処理部１１０は、注目テーブル１０４−ｉ内のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ６０３に戻る。
【０２９９】
ステップＳ６０７でデータフレーム処理部１１０は、注目テーブル１０４−ｉにエントリが存在するか否かを判断する。ステップＳ６０３〜Ｓ６０６の繰り返しの結果、注目テーブル１０４−ｉにエントリがなくなった場合は、処理はステップＳ６０８に移行する。他方、注目テーブル１０４−ｉに１つ以上エントリが存在すれば、処理はステップＳ６０９に移行する。
【０３００】
ステップＳ６０８でデータフレーム処理部１１０は、エントリの存在しない注目テーブル１０４−ｉを削除する。そして、処理はステップＳ６０９に移行する。
ステップＳ６０９でデータフレーム処理部１１０は、まだ注目していない重み付けテーブルが重み付けテーブル１０４の中に残っているか否かを判断する。データフレーム処理部１１０が、すべての重み付けテーブル１０４−１〜１０４−Ｍに注目し終わっていれば、図１８の処理は終了する。他方、まだデータフレーム処理部１１０が注目していない重み付けテーブル１０４−ｊ（１≦ｊ≦Ｍ）が重み付けテーブル１０４の中に残っていれば、処理はステップＳ６１０に移行する。
【０３０１】
ステップＳ６１０でデータフレーム処理部１１０は、重み付けテーブル１０４の中でまだ注目していない次の重み付けテーブル１０４−ｊに注目する（すなわち、重み付けテーブル１０４−ｊを注目テーブル１０４−ｉとして選ぶ）。そして処理はステップＳ６０２に戻る。
【０３０２】
以上の図１８のエージング処理により、ノード装置１００は、「過去の障害の影響が累積されて、どの隣接ノード装置もＬＤとして選択することが不能となる」といった事態に陥らずに済む。
【０３０３】
例えば、図６の例において、ステップＳ１１２の後、ノード装置Ｎ６とＮ７の間のリンクに障害が発生し、ノード装置Ｎ４とＮ７の間のリンクが障害から復旧したという状況を想定する。もし図１８のエージング処理が行われないと、実際には障害からの復旧により、例えば経路〈Ｎ１，Ｎ２，Ｎ３，Ｎ４，Ｎ７〉でのデータフレームの送信が可能になっていても、自律分散協調の結果としてこの経路が選択されることがなくなってしまう。しかし、図１８のエージング処理が行われれば、上記で想定した状況において、経路〈Ｎ１，Ｎ２，Ｎ３，Ｎ４，Ｎ７〉が選択されうるようになる。
【０３０４】
なお、上記の所定の間隔Ｉｗおよび所定の値Ｇｗは、環境の変化しやすさなどに応じて、実施形態によって適宜決められることが望ましい。
図１９は、ＦＩＤ管理テーブル１０５のエージング処理のフローチャートである。例えば、タイマＩＣ２０３が所定の間隔Ｉｆで割り込み信号をデータフレーム処理部１１０に出力し、割り込み信号を契機としてデータフレーム処理部１１０が所定の間隔Ｉｆで図１９の処理を行ってもよい。
【０３０５】
ステップＳ７０１でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５（図１２と図１３を参照）のうち１つ目のエントリに注目する。以下、図１９に関する説明においては、データフレーム処理部１１０が注目しているエントリを「注目エントリ」という。
【０３０６】
続いてステップＳ７０２でデータフレーム処理部１１０は、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ以上か否かを判断する。なお、実施形態によって、Ｇｆ＝Ｉｆでもよいし、Ｇｆ＜Ｉｆでもよいし、Ｇｆ＞Ｉｆでもよい。
【０３０７】
また、図２１のステップＳ８０７に関して後述する理由から、第１実施形態では、重み付けテーブル１０４のエージング時間である所定の値Ｇｗと、ＦＩＤ管理テーブル１０５のエージング時間である所定の値Ｇｆは、Ｇｆ＜Ｇｗを満たす。
【０３０８】
現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ以上であれば、処理はステップＳ７０３に移行する。他方、現在時刻と、注目エントリの最終更新時刻との差が、所定の値Ｇｆ未満であれば、処理はステップＳ７０４に移行する。
【０３０９】
ステップＳ７０３でデータフレーム処理部１１０は、注目エントリをＦＩＤ管理テーブル１０５から削除する。そして処理はステップＳ７０４に移行する。
そして、ステップＳ７０４でデータフレーム処理部１１０は、まだ注目していないエントリがＦＩＤ管理テーブル１０５に残っているか否かを判断する。データフレーム処理部１１０がＦＩＤ管理テーブル１０５のすべてのエントリに注目し終わっていれば、図１９の処理は終了する。他方、まだデータフレーム処理部１１０が注目していないエントリがＦＩＤ管理テーブル１０５に残っていれば、処理はステップＳ７０５に移行する。
【０３１０】
ステップＳ７０５でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５のまだ注目していないエントリの中で、次のエントリに注目する。そして処理はステップＳ７０２に戻る。
【０３１１】
以上の図１９のエージング処理により、「ＦＩＤ管理テーブル１０５のエントリが増え続けて記憶領域を使い尽くしてしまう」といった事態を防ぐことができる。
なお、上記の所定の値Ｇｆは、例えば、何度もバックトラックが生じる最悪ケースにおいてデータフレームがＧＳからＧＤに到達するのにかかると予測される時間の長さ以上になるよう、決められていてもよい。なお、「最悪ケース」とは、詳しくは図３０とともに後述するが、探索空間において、刈り込まれていない全探索ノードをバックトラックしながら深さ優先探索順にたどる場合を意味する。一般には、ネットワークの規模が大きいほど、所定の値Ｇｆも大きく設定しておくことが望ましい。
【０３１２】
図２０〜図２３は、図１４のステップＳ２０５におけるデータフレーム受信処理のフローチャートである。なお、説明の便宜上、まず、ノード装置１００がＧＳとはならず中継専門のタイプである場合のデータフレーム受信処理について、図２０〜図２３を参照して説明する。ノード装置１００がＧＳにもなりうるタイプの場合については、図２３の部分が後述の図２９の処理に置き換わる。
【０３１３】
図１４のステップＳ２０５でフレーム分岐処理部１０６からデータフレーム受信処理を行うよう指示されると、データフレーム処理部１１０は図２０の処理を開始する。なお、前述のとおり、フレーム分岐処理部１０６からの指示は、受信したデータフレームのＧＳとＦＩＤの値の通知をともなっている。
【０３１４】
ステップＳ８０１でデータフレーム処理部１１０は、受信したデータフレームのＬＤの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＬＤの値が自ノードＩＤでなければ、処理はステップＳ８０２に移行し、受信したデータフレームのＬＤの値が自ノードＩＤであれば、処理はステップＳ８０３に移行する。
【０３１５】
なお、データフレーム受信処理の説明において、「受信したデータフレーム」とは、図１４のステップＳ２０１で受信部１０１が受信し、ステップＳ２０４でバッファ部１０９に格納され、図２０の処理の開始の契機となったデータフレームのことである。
【０３１６】
また、フレーム分岐処理部１０６は、データフレーム受信処理の開始をデータフレーム処理部１１０に指示するとき、受信したデータフレームのＧＳとＦＩＤの値をデータフレーム処理部１１０に通知している。よって、データフレーム処理部１１０は、通知されたＧＳとＦＩＤの値をキーにしてバッファ部１０９を検索することで、受信したデータフレームを含むエントリを見つけることができる。したがって、データフレーム処理部１１０は、見つけたエントリから、受信したデータフレームのヘッダに含まれる各フィールドの値を読み出すことができる。
【０３１７】
正確には、ステップＳ８０１では、データフレーム処理部１１０はまず、以上のようにして、受信したデータフレームのヘッダに含まれる各フィールドの値をバッファ部１０９から読み出して記憶する。そして、記憶したＬＤの値（すなわち受信したデータフレームのＬＤの値）を自ノードＩＤと比較する。なお、ノード装置１００自身のノードＩＤである自ノードＩＤは、例えば、図４のフラッシュメモリ２０５に予め記録されているので、データフレーム処理部１１０は自ノードＩＤを参照することができる。
【０３１８】
受信したデータフレームのＬＤの値が自ノードＩＤと異なるとき、ノード装置１００はノード装置１００自身には無関係なデータフレームを偶然受信したということである。よって、ステップＳ８０２でデータフレーム処理部１１０は、受信したデータフレームを破棄する。つまり、データフレーム処理部１１０は、ステップＳ８０１で見つけたバッファ部１０９のエントリを削除する。そして、データフレーム受信処理は終了する。
【０３１９】
他方、受信したデータフレームのＬＤの値が自ノードＩＤと等しい場合は、ステップＳ８０３でデータフレーム処理部１１０は、ＡＣＫフレームを生成し、ＡＣＫフレームの送信を送信部１０２に依頼する。そして、送信部１０２がＡＣＫフレームを送信する。
【０３２０】
例えば、図７のデータフレーム３０３をノード装置Ｎ３が受信すると、ノード装置Ｎ３のデータフレーム処理部１１０−Ｎ３は、ステップＳ８０３において図７のＡＣＫフレーム３２２を生成する。そして、送信部１０２−Ｎ３がＡＣＫフレーム３２２を送信する。
【０３２１】
具体的には、データフレーム処理部１１０−Ｎ３は、受信したデータフレーム３０３のＬＳの値であるＮ２をＡＣＫフレーム３２２のＬＤに設定し、自ノードＩＤ（すなわちノード装置Ｎ３自身のノードＩＤであるＮ３）をＡＣＫフレーム３２２のＬＳに設定する。また、ＡＣＫフレーム３２２は、対応するデータフレーム３０３のＬＳであるノード装置Ｎ２以外には無関係なので、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のＧＤには、ヌルを表す特殊な値０ｘ００００００を設定する。
【０３２２】
また、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２を受信したノード装置Ｎ２が「ＡＣＫフレーム３２２はデータフレーム３０３に対するＡＣＫフレームである」と認識することができるように、ＡＣＫフレーム３２２のＧＳとＦＩＤを設定する。すなわち、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のＧＳとＦＩＤに、それぞれ、受信したデータフレーム３０３のＧＳとＦＩＤの値Ｎ１とＦａを設定する。
【０３２３】
そして、データフレーム処理部１１０−Ｎ３は、ＡＣＫフレーム３２２のタイプとして、「ＡＣＫフレーム」を示す所定の値Ａを設定する。ステップＳ８０３では、以上のようにしてデータフレーム処理部１１０−Ｎ３がＡＣＫフレーム３２２を生成し、送信部１０２−Ｎ３がＡＣＫフレーム３２２を送信する。
【０３２４】
続いて、ステップＳ８０４でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＧＤの値が自ノードＩＤであれば、処理はステップＳ８０５に移行する。他方、受信したデータフレームのＧＤの値が自ノードＩＤと異なれば、処理は図２１のステップＳ８０６に移行する。
【０３２５】
ステップＳ８０５でデータフレーム処理部１１０は、上位層処理部１１１に、受信したデータフレームのペイロードを渡し、データフレーム受信処理を終了する。具体的には、データフレーム処理部１１０は、ステップＳ８０１で見つけたバッファ部１０９のエントリからペイロードを取り出して上位層処理部１１１に出力し、当該エントリをバッファ部１０９から削除する。そしてデータフレーム受信処理は終了する。
【０３２６】
例えば、図６のステップＳ１１２でデータフレームをノード装置Ｎ６から受信したノード装置Ｎ７では、受信したデータフレームのペイロードは上位層処理部１１１−Ｎ７に出力され、上位層処理部１１１−Ｎ７において処理される。
【０３２７】
図２１のステップＳ８０６以降の処理は、受信したデータフレームのＬＤの値が自ノードＩＤと等しく、かつ受信したデータフレームのＧＤの値が自ノードＩＤと異なる場合に実行される。
【０３２８】
ステップＳ８０６でデータフレーム処理部１１０は、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いて、ＦＩＤ管理テーブル１０５を検索する。なお、上記のように、受信したデータフレームのＦＩＤとＧＳの値は、図２０の処理の開始時にフレーム分岐処理部１０６から通知されている。
【０３２９】
続いて、ステップＳ８０７でデータフレーム処理部１１０は、ステップＳ８０６の検索の結果エントリがヒットしたか否かを判断する。エントリがヒットした場合、ノード装置
１００が以前送信したことのあるデータフレームと同じデータフレームが受信されたということなので、処理はステップＳ８０８に移行する。他方、エントリがヒットしなかった場合、ノード装置１００が送信したことのないデータフレームが受信されたということなので、処理はステップＳ８１０に移行する。
【０３３０】
なお、正確には、「ノード装置１００が以前送信したことのあるデータフレームと同じデータフレームが受信されたが、検索対象のエントリは既にエージングにより消滅してしまった」という場合も、エントリはヒットしない。このような場合が生じないように、ネットワーク内でバックトラックが繰り返される最悪の時間の見積もりなどに基づいて、適切にＦＩＤ管理テーブル１０５のエージング時間Ｇｆが定められることが望ましい。
【０３３１】
ステップＳ８０８でデータフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたＦＩＤ管理テーブル１０５のエントリのＬＤとＯＬＳの値を取り出し、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０３３２】
続いてステップＳ８０９でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル（以下、図２１〜２３の説明においては「１０４−ｉ」という参照符号で参照する）を次のように更新する。すなわち、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、ステップＳ８０８で取り出したＬＤに対応する重みを、最大値に変更する。なお、第１実施形態では重みの最大値は１である。重みの変更後、処理はステップＳ８１７に移行する。
【０３３３】
なお、ステップＳ８０７、Ｓ８０８、Ｓ８０９と処理が進む場合、ステップＳ８０８で取り出したＬＤに対応するエントリが、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉに存在することが、ステップＳ８０９では保証されている。その理由は以下のとおりである。
【０３３４】
図１２と図１３に関して説明したように、ＦＩＤ管理テーブル１０５のエントリにおいて最終更新時刻は、データフレームの送信時に設定される。また、図１９に関して説明したように、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆは、例えば、最悪ケースで予測される時間以上に設定される。よって、ノード装置１００が過去に送信したデータフレームがネットワーク内を巡ってノード装置１００で受信されるとき、当該データフレームに対応するエントリは、まだＦＩＤ管理テーブル１０５に残っていることが保証される。
【０３３５】
そして、図１１に関して説明したように、データフレームが送信されてＡＣＫフレームが返信されると、重みが更新され、重み付けテーブル１０４−１〜１０１−Ｍ内の各エントリにおいては、重みが更新されるときに最終更新時刻も設定される。
【０３３６】
したがって、時系列を追うと下記（Ｅ１）〜（Ｅ５）の順となる。
（Ｅ１）ＧＤの値がＮＧＤで、ＧＳの値がＮＧＳで、ＬＤの値がＮＬＤで、ＦＩＤの値がＦｃのデータフレームがノード装置１００から送信される。このとき、ＦＩＤ管理テーブル１０５において最終更新時刻が設定される。例えば、図６のノード装置Ｎ３において、ステップＳ１０３で図１２のエントリＥ３に最終更新時刻Ｔ１０３が設定される。
【０３３７】
（Ｅ２）上記データフレームに対するＡＣＫフレームが受信されると、ノード装置ＮＧＤに対応する重み付けテーブル１０４−ｉにおいて、ＬＤフィールドの値がＮＬＤであるエントリの重みが更新される。このとき、当該エントリの最終更新時刻が設定される。例えば、ノード装置Ｎ３において、図１１に示すようにステップＳ１０３ａで重み付けテーブル１０４−１−Ｎ３の、ＬＤフィールドの値がＮ４であるエントリの最終更新時刻がＴｂに設定される。
【０３３８】
（Ｅ３）ＧＳの値がＮＧＳで、ＦＩＤの値がＦｃの同じデータフレームが、ノード装置１００で受信される。例えば、図６のステップＳ１０６でノード装置Ｎ３がデータフレームを受信する。なお、データフレームのＧＤの値は中継に際して書きかえられることはないので、（Ｅ３）で受信されるデータフレームのＧＤの値は、上記（Ｅ１）より当然、ＮＧＤである。
【０３３９】
（Ｅ４）上記（Ｅ１）の時点から、ＦＩＤ管理テーブル１０５のエージング時間Ｇｆが経過する。
（Ｅ５）上記（Ｅ２）の時点から、重み付けテーブル１０４のエージング時間Ｇｗが経過する。
【０３４０】
以上のとおり、（Ｅ３）の時点は（Ｅ５）の時点より前である。よって、（Ｅ３）の時点では、ノード装置ＮＧＤに対応する重み付けテーブル１０４−ｉにおいて、ＬＤフィールドの値がＮＬＤであるエントリの存在が保証される。
【０３４１】
例えば、上記の例では、重み付けテーブル１０４−１−Ｎ３の、ＬＤフィールドの値がＮ４であるエントリの存在が、図６のステップＳ１０６の時点保証されている。なお、ここでの「ステップＳ１０６の時点」とは、より詳しくは、ステップＳ１０６での受信を契機とするデータフレーム受信処理に含まれるステップＳ８０９の処理を、ノード装置Ｎ３が実行する時点のことである。
【０３４２】
したがって、図２１のステップＳ８０６の検索でＦＩＤ管理テーブル１０５にエントリが見つかった場合、ステップＳ８０９では必ず、ステップＳ８０８で取り出したＬＤに対応するエントリが、重み付けテーブル１０４−ｉに存在する。よって、ステップＳ８０９でデータフレーム処理部１１０は、存在が保証されているエントリにおいて、重みの値を最大値に設定している。
【０３４３】
逆に、ステップＳ８０６の検索でエントリが見つからなかった場合、ステップＳ８１０でデータフレーム処理部１１０は、受信したデータフレームのＬＳの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に、ＯＬＳとして記憶する。
【０３４４】
そして、ステップＳ８１１でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値を検索キーとして用いて、重み付けテーブル１０４を検索する。
続いて、ステップＳ８１２でデータフレーム処理部１１０は、ステップＳ８１１の検索の結果、テーブルがヒットしたか否かを判断する。
【０３４５】
受信したデータフレームのＧＤの値に対応する重み付けテーブルが重み付けテーブル１０４の中に存在すれば、処理はステップＳ８１２ａに移行する。なお、ステップＳ８０９で導入した「１０４−ｉ」という参照符号は、受信したデータフレームのＧＤの値に対応する重み付けテーブルを指すので、ステップＳ８１１の検索の結果ヒットしたテーブルも、「重み付けテーブル１０４−ｉ」である。
【０３４６】
他方、受信したデータフレームのＧＤの値に対応する重み付けテーブルが重み付けテーブル１０４の中に存在しなければ、処理はステップＳ８１３に移行する。
ステップＳ８１２ａでデータフレーム処理部１１０は、ステップＳ８１１の検索でヒットした重み付けテーブル１０４−ｉを調整する。ステップＳ８１２ａの重み付けテーブル調整処理は、詳しくは図２４とともに後述するが、エージング処理の副作用を中和する処理である。
【０３４７】
ステップＳ８１２ａの結果、隣接ノード管理テーブル１０３で管理されているすべての隣接ノード装置に対応するエントリが重み付けテーブル１０４−ｉに存在することが保証される。そして、処理はステップＳ８１７に移行する。
【０３４８】
ステップＳ８１３でデータフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する新規重み付けテーブルを追加する。なお、ステップＳ８１３で追加されるテーブルも、「重み付けテーブル１０４−ｉ」である。
【０３４９】
そして、ステップＳ８１４でデータフレーム処理部１１０は、新規重み付けテーブル１０４−ｉにおいて、受信したデータフレームのＧＤの値を、重み付けテーブル１０４−ｉのＧＤとして設定する。
【０３５０】
さらに、ステップＳ８１５でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３のエントリ数と同数の新規エントリを、新規重み付けテーブル１０４−ｉに作成する。
【０３５１】
そして、ステップＳ８１６でデータフレーム処理部１１０は、ステップＳ８１５で作成した各エントリに、それぞれ、隣接ノード管理テーブル１０３の各エントリのノードＩＤと、初期重み付け値と、現在時刻を設定する。
【０３５２】
なお、以上のステップＳ８１１〜Ｓ８１６の具体例を挙げれば、以下のとおりである。
例えば、図６のステップＳ１０２でノード装置Ｎ２から図７のデータフレーム３０３を受信したとき、ノード装置Ｎ３の重み付けテーブル１０４−Ｎ３には、図１１の重み付けテーブル１０４−１−Ｎ３が存在しなかったとする。すると、ノード装置Ｎ３が受信したデータフレーム３０３のＧＤの値であるＮ７を検索キーにしてノード装置Ｎ３のデータフレーム処理部１１０−Ｎ３がステップＳ８１１で重み付けテーブル１０４−Ｎ３を検索しても、テーブルはヒットしない。
【０３５３】
そこで、データフレーム処理部１１０−Ｎ３は、ステップＳ８１３で新たに重み付けテーブル１０４−１−Ｎ３を作成し、ステップＳ８１４で重み付けテーブル１０４−１−Ｎ３のＧＤにＮ７を設定する。そして、データフレーム処理部１１０−Ｎ３は、ステップＳ８１５で、図９の隣接ノード管理テーブル１０３−Ｎ３と同数の（すなわち３つの）新規エントリを重み付けテーブル１０４−１−Ｎ３に作成する。
【０３５４】
ここで、隣接ノード管理テーブル１０３−Ｎ３の各エントリのノードＩＤは、図１０のとおり、Ｎ２とＮ４とＮ５である。よって、ステップＳ８１６でデータフレーム処理部１１０−Ｎ３は、ステップＳ８１５で作成した３つのエントリそれぞれに、ＬＤとしてＮ２とＮ４とＮ５を設定する。また、データフレーム処理部１１０−Ｎ３は、これら３つのエントリの重みフィールドに、いずれも０．５という初期重み付け値を設定し、これら３つのエントリの最終更新時刻フィールドに、いずれも現在時刻を設定する。
【０３５５】
以上のステップＳ８１３〜Ｓ８１６の結果として、図１１の１段目のような重み付けテーブル１０４−１−Ｎ３が重み付けテーブル１０４−Ｎ３の中に追加される。
ここで、具体例の説明から図２１の処理一般の説明に戻る。ステップＳ８１７が実行されるのは、ステップＳ８０９の実行後、ステップＳ８１６の実行後、またはステップＳ８１１の検索においてテーブルがヒットしたとステップＳ８１２で判断された後である。よって、ステップＳ８１７の実行時には、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉの存在が保証されている。
【０３５６】
そこで、ステップＳ８１７においてデータフレーム処理部１１０は、受信したデータフ
レームのＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、ＯＬＳとは異なるＬＤのうちで最小の重みと対応付けられているＬＤの値を取得する。
【０３５７】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なる値をＬＤとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部１１０は、選択したエントリのＬＤと重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０３５８】
続いて、ステップＳ８１８でデータフレーム処理部１１０は、下記の２つの条件（Ｆ１）と（Ｆ２）のいずれかが成立するか否かを判断する。
（Ｆ１）ステップＳ８１７（または後述のＳ８２９）で取得したＬＤの値に対応する重みが、重みの最大値（第１実施形態では１．０）である。
【０３５９】
（Ｆ２）ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なるＬＤへのデータフレームの転送がすべて失敗した（ただし、重み付けテーブル１０４−ｉにおけるＬＤが、もともとＯＬＳしか存在しなかった場合も含む）。
【０３６０】
条件（Ｆ１）または（Ｆ２）が成立する場合、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理は図２３のステップＳ８３０に移行する。
他方、条件（Ｆ１）と（Ｆ２）のいずれも成立しない場合、まだＬＤとして選択可能な隣接ノード装置が残っている。換言すれば、（Ｇ１）〜（Ｇ４）のいずれにも該当しない隣接ノード装置が、少なくとも１つは存在する。そして、ＬＤとして選択可能な隣接ノード装置のノードＩＤが、ステップＳ８１７（または後述のＳ８２９）で取得されている。
【０３６１】
（Ｇ１）当該隣接ノード装置から先の経路が袋小路またはループになっている、と判断されたため、当該隣接ノード装置は最大値の重みと対応付けられている。
（Ｇ２）過去に当該隣接ノード装置への同一ＧＤ宛てのデータフレームの送信に失敗した結果が累積したため、当該隣接ノード装置は最大値の重みと対応付けられている。
【０３６２】
（Ｇ３）今回のデータフレーム受信処理において当該隣接ノード装置へのデータフレームの送信を試した結果として、「送信失敗」と判明した。すなわち、データフレームを送信した隣接ノード装置から、所定時間が経っても、ＡＣＫフレームを受信することができなかった。
【０３６３】
（Ｇ４）当該隣接ノード装置はＯＬＳである。
そこで、ステップＳ８１８で条件（Ｆ１）と（Ｆ２）のいずれも成立しないと判断されると、処理はステップＳ８１９に移行する。ステップＳ８１９以降の処理は、取得済みのＬＤの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理である。
【０３６４】
ステップＳ８１９でデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０３６５】
具体的には、データフレーム処理部１１０は、ステップＳ８１７（または後述のＳ８２９）で取得したＬＤの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップＳ８０１で見つかったバッファ部１０９内のエントリに格納されているデータフレームである。
【０３６６】
ステップＳ８１９での送信後、処理はステップＳ８２０に移行し、データフレーム処理部１１０がバッファ部１０９のタイムアウト時刻を更新する。すなわち、データフレーム処理部１１０は、バッファ部１０９において、受信したデータフレームを格納しているエントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。
【０３６７】
Ｔｔｉｍｅｏｕｔ＝Ｔｎｏｗ＋Ｔｗａｉｔ          （５）
なお、式（５）において時刻Ｔｎｏｗは現在時刻であり、時間ＴｗａｉｔはＡＣＫフレーム待ち時間である。
【０３６８】
そして、ステップＳ８２１でデータフレーム処理部１１０は、ステップＳ８０６のＦＩＤ管理テーブル１０５の検索においてエントリがヒットしているか、または、後述するステップＳ８２３、および、ステップＳ８２４で、ＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定しているか否かを確認する。つまり、受信したデータフレームのＧＳとＦＩＤの値に等しい値を、ＧＳおよびＦＩＤとして有するエントリが、ＦＩＤ管理テーブル１０５に存在するか否かを、データフレーム処理部１１０は確認する。
【０３６９】
ステップＳ８０６の検索でエントリがヒットしているか、ステップＳ８２３およびステップＳ８２４でＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定していれば、今回のデータフレーム受信処理は、過去にノード装置１００自身が送信したのと同じデータフレームの受信を契機とする処理である。よって、データフレーム処理部１１０は続いてステップＳ８２２を実行する。他方、ステップＳ８０６の検索でエントリがヒットしておらず、かつ、ステップＳ８２３およびステップＳ８２４でＦＩＤ管理テーブル１０５に新規エントリを追加して値を設定していなければ、ノード装置１００は、初めて受信するデータフレームの初めての転送を試みているところである。よって、処理はステップＳ８２３に移行する。
【０３７０】
ステップＳ８２２でデータフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ステップＳ８０６の検索でヒットしたエントリにおいて、ＬＤフィールドには、ステップＳ８１９で送信したデータフレームのＬＤの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップＳ８２５に移行する。
【０３７１】
また、ステップＳ８２３でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ８２４でデータフレーム処理部１１０は、新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳとＬＤの各フィールドには、それぞれステップＳ８１９で送信したデータフレームの値をコピーする。また、データフレーム処理部１１０は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、ＯＬＳフィールドには、ステップＳ８１０で記憶したＯＬＳの値をコピーする。そして、処理はステップＳ８２５に移行する。
【０３７２】
ステップＳ８２５でデータフレーム処理部１１０は、ステップＳ８１９における送信の成否の通知を待つ。
例えば、データフレーム処理部１１０が、所定のプログラムのスレッドを実行する図４のＭＰＵ２０１により実現される場合、ステップＳ８２５ではスレッドがスリープしてもよい。その場合、「送信成功」または「送信失敗」の通知は、スレッドを起こす処理である。
【０３７３】
ステップＳ８１９における送信が成功した場合は、ステップＳ８１９で送信したデータフレームにおいてＬＤとして指定されている隣接ノード装置からＡＣＫフレームが返信される。そして、ＡＣＫ処理部１０７が後述の図２５の処理を行い、データフレーム処理部１１０に「送信成功」を通知する。
【０３７４】
また、ステップＳ８１９における送信の失敗とは、ステップＳ８１９で送信したデータフレームにおいてＬＤとして指定されている隣接ノード装置からのＡＣＫフレームが、式（５）の時刻Ｔｔｉｍｅｏｕｔになってもノード装置１００で受信されないことである。ＡＣＫフレームの受信は、ＡＣＫ処理部１０７による後述の図２６の処理により監視されており、ＡＣＫフレームがタイムアウト時刻Ｔｔｉｍｅｏｕｔになっても受信されないと、ＡＣＫ処理部１０７がデータフレーム処理部１１０に「送信失敗」を通知する。
【０３７５】
データフレーム処理部１１０が、ステップＳ８２５での待機の後、ＡＣＫ処理部１０７から「送信成功」または「送信失敗」の通知を受けると、処理はステップＳ８２６に移行する。
【０３７６】
ステップＳ８２６でデータフレーム処理部１１０は、ＡＣＫ処理部１０７から受けた通知に基づいて、ステップＳ８１９の送信が成功したか否かを判断する。送信が成功した場合、処理はステップＳ８２７に移行し、送信が失敗した場合、処理はステップＳ８２８に移行する。
【０３７７】
送信が成功した場合、ステップＳ８２７でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８１９で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。ここで、データフレームのＧＤは転送によって書き換えられないことに注意して換言すれば、ステップＳ８２７でデータフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、重みの更新を行う。
【０３７８】
つまり、データフレーム処理部１１０は、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有するエントリを重み付けテーブル１０４−ｉで探し、見つかったエントリの重みの値を小さくする。重みの値を小さくすることは、対応するＬＤの優先度を上げることである。
【０３７９】
ここで、見つかったエントリの現在の重みの値をＷｃｕｒｒｅｎｔとすると、ステップＳ８２７でデータフレーム処理部１１０は、見つかったエントリの重みの値を例えば式（６）のＷｒｅｖｉｓｅｄに更新してもよい。
【０３８０】
Ｗｒｅｖｉｓｅｄ＝ｍａｘ（Ｗｍｉｎ，Ｗｃｕｒｒｅｎｔ−ΔＷｓｕｃｃｅｓｓ）
（６）
なお、式（６）において、Ｗｍｉｎは重みの最小値であり、第１実施形態ではＷｍｉｎ＝０である。また、ΔＷｓｕｃｃｅｓｓは、送信が成功したときに重みを減らす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔＷｓｕｃｃｅｓｓ＝０．１でもよい。
【０３８１】
さらに、データフレーム処理部１１０はステップＳ８２７で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有する重み付けテーブル１０４−ｉのエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０３８２】
他方、送信が失敗した場合、ステップＳ８２８でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８１９で送信したデータフレームのＧＤとＬＤの組に対応する重みを大きくする。つまり、ステップＳ８２８でデータフレーム処理部１１０は、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有するエントリを重み付けテーブル１０４−ｉで探し、見つかったエントリの重みの値を大きくする。重みの値を大きくすることは、対応するＬＤの優先度を下げることである。
【０３８３】
例えば、ステップＳ８２８でデータフレーム処理部１１０は、見つかったエントリの重みの値を式（７）のＷｒｅｖｉｓｅｄに更新してもよい。
Ｗｒｅｖｉｓｅｄ＝ｍｉｎ（Ｗｍａｘ，Ｗｃｕｒｒｅｎｔ＋ΔＷｆａｉｌｕｒｅ）
（７）
なお、式（７）において、Ｗｍａｘは重みの最大値であり、第１実施形態ではＷｍａｘ＝１である。また、ΔＷｆａｉｌｕｒｅは、送信が失敗したときに重みを増やす所定の量であり、実施形態に応じて適宜値を決めることができる。例えば、ΔＷｆａｉｌｕｒｅ＝０．１でもよい。もちろん、ΔＷｆａｉｌｕｒｅ≠ΔＷｓｕｃｃｅｓｓでもよい。
【０３８４】
なお、データフレーム処理部１１０はステップＳ８２８で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値を、例えば図４のＤＲＡＭ２０４などのワークエリアに「転送に失敗したＬＤ」として記憶する。例えば、データフレーム処理部１１０は、ＤＲＡＭ２０４上の線形リストをステップＳ８１７で空に初期化し、ステップＳ８２８の実行のたびに、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値を保持する要素を線形リストに追加してもよい。もちろん、「転送に失敗したＬＤ」の記憶のために配列など他のデータ構造が使われてもよい。
【０３８５】
さらに、データフレーム処理部１１０はステップＳ８２８で、ステップＳ８１７（または後述のステップＳ８２９）で取得したＬＤの値をＬＤとして有する重み付けテーブル１０４−ｉのエントリにおいて、最終更新時刻に現在時刻を設定する。そして処理はステップＳ８２９に移行する。
【０３８６】
ステップＳ８２９でデータフレーム処理部１１０は、今までにＬＤとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部１１０は、受信したデータフレームのＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、転送に失敗したＬＤ以外で、かつＯＬＳとは異なるＬＤのうちで、最小の重みと対応付けられているＬＤの値を取得する。なお、転送に失敗したＬＤは、ステップＳ８２８において例えば図４のＤＲＡＭ２０４などのワークエリアに、例えば線形リストなどの形で、記憶されている。
【０３８７】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、（Ｈ１）かつ（Ｈ２）である値をＬＤとして有するエントリの中から、重みの値が最小のものを選択する。そして、データフレーム処理部１１０は、選択したエントリのＬＤと重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０３８８】
（Ｈ１）過去にステップＳ８１７またはＳ８２９で取得したＬＤの値とは異なる値
（Ｈ２）ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値とは異なる値
したがって、例えば、ステップＳ８２８で０．２に更新された重みと対応付けられた隣接ノード装置は、ステップＳ８２９でＬＤとして選択されず、ステップＳ８２９では０．２より大きな、０．８などの重みの隣接ノード装置が選択されることもありうる。
【０３８９】
以上のステップＳ８１７〜Ｓ８２９の具体例を挙げれば、以下のとおりである。例えば、図６のノード装置Ｎ４には、ノード装置Ｎ３、Ｎ５、およびＮ７が隣接している。そして、図１２のとおり、ノード装置Ｎ４のＦＩＤ管理テーブル１０５−Ｎ４のエントリＥ４のＯＬＳの値は、Ｎ３である。
【０３９０】
図６の例では、ノード装置Ｎ４のデータフレーム処理部１１０−Ｎ４が、最初にステップＳ８１７でＬＤの値Ｎ７を取得するので、ステップＳ１０４のようにノード装置Ｎ７へのデータフレームの送信が行われる。しかし、図６に示すとおりステップＳ１０４の送信は失敗するので、データフレーム処理部１１０−Ｎ４はステップＳ８２６で「送信失敗」と判断する。
【０３９１】
すると、データフレーム処理部１１０−Ｎ４がステップＳ８２９を実行する時点で、転送に失敗したＬＤ（すなわちＮ７）以外で、かつＯＬＳ（すなわちＮ３）とは異なるＬＤの値は、Ｎ５のみである。よって、ステップＳ８２９ではＬＤの値Ｎ５が取得される。
【０３９２】
こうしてステップＳ８２９でＬＤの値が取得されると、処理はステップＳ８２９からステップＳ８１８へ戻る。
よって、上記のノード装置Ｎ４の例では、ステップＳ８２９の後、再度ステップＳ８１８〜Ｓ８２６が実行される。そして、図６にステップＳ１０５として示すように、今度はステップＳ８２６で「送信成功」と判断され、ステップＳ８２７が実行されて、データフレーム受信処理が終了する。
【０３９３】
なお、ステップＳ８２８で、例えば式（７）のように重みを更新することの影響について具体例を挙げて説明すれば、以下のとおりである。
例えば、図２のネットワーク２において、ノード装置Ｎ１０６が隣接ノード装置Ｎ１０８から、ノード装置Ｎ１１８をＧＤとして指定する第１のデータフレームを時刻Ｔｒｃｖ１に受信したとする。そして、時刻Ｔｒｃｖ１にノード装置Ｎ１０６には、ノード装置Ｎ１１８に対応する重み付けテーブル１０４−ｇ１０６−Ｎ１０６が存在したとする。また、時刻Ｔｒｃｖ１の重み付けテーブル１０４−ｇ１０６−Ｎ１０６においては、ノード装置Ｎ１０２には重み０．４が、ノード装置Ｎ１０３には重み０．７が、ノード装置Ｎ１０７には重み０．１が、ノード装置Ｎ１０８には重み０．５が、それぞれ対応付けられていたとする。
【０３９４】
すると、ステップＳ８１７では、最小の重み０．１と対応付けられているノード装置Ｎ１０７がＬＤとして選択される。ところが、ステップＳ８１９でデータフレームが送信されるとき、偶然、ノード装置Ｎ１０６とＮ１０７の間に遮蔽物が置かれるなどの理由で、一時的に、ノード装置Ｎ１０６とＮ１０７の無線リンクが通信不能になったとする。
【０３９５】
すると、ＡＣＫフレームが返信されないので、ステップＳ８２８では、ノード装置Ｎ１０７の重みが０．１から０．２に更新される。そして、ステップＳ８２９では、重み０．４と対応付けられているノード装置Ｎ１０２がＬＤとして選択される。ここで、ステップＳ８１９におけるデータフレームの送信が成功し、ノード装置Ｎ１０２からＡＣＫフレームが返信されたとする。すると、ステップＳ８２７でノード装置Ｎ１０２の重みが０．４から０．３に更新され、データフレーム受信処理が終了する。
【０３９６】
ここで、ノード装置Ｎ１０６からノード装置Ｎ１０２へ送信された第１のデータフレームは、ノード装置Ｎ１０６にバックトラックすることなく、ノード装置Ｎ１１８に到達したとする。つまり、重み付けテーブル１０４−ｇ１０６−Ｎ１０６においては、第１のデータフレームの転送にともなって重みが１に更新されるエントリはなかったとする。
【０３９７】
すると、ノード装置Ｎ１０６が、その後の時刻Ｔｒｃｖ２に、同じくノード装置Ｎ１１８をＧＤとして指定する第２のデータフレームを今度はノード装置Ｎ１０３から受信したとき、重み付けテーブル１０４−ｇ１０６−Ｎ１０６の内容は次のとおりである。すなわち、ノード装置Ｎ１０２には重み０．３が、ノード装置Ｎ１０３には重み０．７が、ノード装置Ｎ１０７には重み０．２が、ノード装置Ｎ１０８には重み０．５が、それぞれ対応付けられている。
【０３９８】
よって、ステップＳ８１７では、第１のデータフレームの転送に失敗したとはいえ、なお最小の重みと対応付けられているノード装置Ｎ１０７が、ＬＤとして選択される。そして、もし時刻Ｔｒｃｖ２にノード装置Ｎ１０６とＮ１０７の間の無線リンクの通信品質が好転しており、ステップＳ８１９での第２のデータフレームの送信が成功すれば、ステップＳ８２７でノード装置Ｎ１０７の重みは再度０．１に戻る。
【０３９９】
ここで、第２のデータフレームのノード装置Ｎ１０７への転送の結果、バックトラックが生じないものとすると、ノード装置Ｎ１０７の重みは０．１のままである。よって、さらにその後の時刻Ｔｒｃｖ３に、同じくノード装置Ｎ１１８をＧＤとして指定する第３のデータフレームを、ノード装置Ｎ１０７以外の隣接ノード装置からノード装置Ｎ１０６が受信すれば、ＬＤとして最も優先的に選択されるのは、やはりノード装置Ｎ１０７である。
【０４００】
このように、ステップＳ８２９で重みを急激に最大値に設定するのではなく少しだけ大きくすると、重み付けテーブル１０４が通信環境の変化に過剰に反応することはない。よって、同じノード装置をＧＤとして指定する複数のデータフレームを次々とノード装置Ｎ１０６が受信しているうちに、一時的に障害の生じていたリンクが障害から回復すれば、環境の好転に追従して、過去の学習結果が再びＬＤの選択に活かされるようになる。つまり、上記の例では、ＬＤとして適切だと過去に学習済みのノード装置Ｎ１０７が、再びＬＤとして優先的に選択されるようになる。
【０４０１】
あるいは、時刻Ｔｒｃｖ２においてノード装置Ｎ１０６とＮ１０７の間の無線リンクが障害から復旧していない場合もありうる。その場合、第２のデータフレームの送信時のＬＤとして、一旦は重み０．２のノード装置Ｎ１０７が選択されるが、ＡＣＫフレームが受信されないために、ノード装置Ｎ１０７の重みは０．３に更新される。そして、最終的には重み０．３と対応付けられたノード装置Ｎ１０２がＬＤとして選択され、送信が成功して重みが０，２に更新されることもありうる。
【０４０２】
すると、時刻Ｔｒｃｖ３に、例えばノード装置Ｎ１０３から、ノード装置Ｎ１０６が第３のデータフレームを受信すると、重み０．２に対応付けられたノード装置Ｎ１０２がＬＤとして選択され、また送信が成功し、ノード装置Ｎ１０２の重みが０．１になるかもしれない。そして、その後しばらくは、ノード装置Ｎ１１８をＧＤとして指定するデータフレームのＬＤとして、ノード装置Ｎ１０６はノード装置Ｎ１０２を選択し続けるかもしれない。
【０４０３】
しかし、さらにその後、ノード装置Ｎ１０６とＮ１０２の間の無線リンクに障害が生じたとすると、ノード装置Ｎ１０２からはＡＣＫフレームが返信されてこない。するとステップＳ８２９でＬＤの再選択が行われる。
【０４０４】
その場合、時刻Ｔｒｃｖ１以前にＬＤとして好適であると学習されていたノード装置Ｎ１０７が、重み０．５や０．７と対応付けられており相対的にＬＤとしてあまり適切ではないノード装置Ｎ１０８やＮ１０３よりも、優先的にＬＤとして選ばれる。その理由は、第１と第２のデータフレームの送信時の重みの学習は、ステップＳ８２８に示すように重みをなだらかに変化させるものであり、ノード装置Ｎ１０７の重みは、なおノード装置Ｎ１０８やＮ１０３の重みよりも小さいからである。
【０４０５】
そして、この時点でノード装置Ｎ１０６とＮ１０７の間の無線リンクが障害から復旧していれば、再度、ノード装置Ｎ１０７の重み０．２に減らされる。このように、多少復旧に時間がかかっても、一時的な環境の変化が過剰に重み付けテーブル１０４に反映されないため、過去の学習の成果が緩やかに反映される。したがって、適切なＬＤが選択される蓋然性も高まる。
【０４０６】
以上のとおり、一時的な障害の影響を過剰に受けないようにするため、ステップＳ８２８では、少しだけ重みが調整されるのである。
さてここで、ステップＳ８１８の分岐の説明に戻る。ステップＳ８１８で２つの条件（Ｆ１）と（Ｆ２）のいずれかが成立すると判断されると、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理は図２３のステップＳ８３０に移行する。
【０４０７】
ステップＳ８３０でデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０４０８】
具体的には、データフレーム処理部１１０は、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。なお、「受信したデータフレーム」とは、上記のとおり、ステップＳ８０１で見つかったバッファ部１０９内のエントリに格納されているデータフレームである。ステップＳ８３０で行われる送信処理が、すなわち、バックトラック動作である。
【０４０９】
なお、ステップＳ８３０の送信の具体例は、図６のステップＳ１１０である。
ステップＳ８３０での送信後、処理はステップＳ８３１に移行する。ステップＳ８３１でデータフレーム処理部１１０は、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いてＦＩＤ管理テーブル１０５を検索する。
【０４１０】
そして、ステップＳ８３２でデータフレーム処理部１１０は、ステップＳ８３１の検索の結果、エントリがヒットしたか否かを判断する。エントリがヒットしていれば処理はステップＳ８３３に移行し、エントリがヒットしていなければ処理はステップＳ８３４に移行する。
【０４１１】
なお、ステップＳ８０７で「エントリがヒットした」と判断されている場合に、ステップＳ８３１の検索の結果見つかるエントリは、ステップＳ８０６の検索の結果見つかったエントリである。また、ステップＳ８０７で「エントリがヒットしなかった」と判定され、かつステップＳ８２３において新規エントリが作成された場合は、ステップＳ８３１の検索の結果、ステップＳ８２３で作成された新規エントリが見つかる。
【０４１２】
ステップＳ８３２で「エントリがヒットしなかった」と判断されるのは、（Ｉ１）かつ（Ｉ２）の場合であり、換言すれば、（Ｊ１）かつ（Ｊ２）の場合である。
（Ｉ１）ステップＳ８０７で「エントリがヒットしなかった」と判断された。
【０４１３】
（Ｉ２）１回目にステップＳ８１８が実行された直後に、ステップＳ８３０に処理が移行した。
（Ｊ１）ノード装置１００が今までに受信したことのないデータフレームが受信された。
【０４１４】
（Ｊ２）受信したデータフレームのＧＳの値に対応する重み付けテーブル１０４−ｉでは、すべてのＬＤに最大値の重みが対応付けられている。
ステップＳ８３３でデータフレーム処理部１１０は、ステップＳ８３１の検索の結果ヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ヒットしたエントリにおいて、ＬＤには、ヒットしたエントリ自身のＯＬＳの値をコピーし、最終更新時刻には、現在時刻を設定する。そして処理はステップＳ８３６に移行する。
【０４１５】
他方、ステップＳ８３４では、データフレーム処理部１１０はＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ８３５でデータフレーム処理部１１０は、ステップＳ８３４で追加した新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳには、受信したデータフレームの値をそれぞれコピーし、最終更新時刻には、現在時刻を設定し、ＯＬＳとＬＤには、受信したデータフレームのＬＳの値をコピーする。そして処理はステップＳ８３６に移行する。
【０４１６】
ステップＳ８３６でデータフレーム処理部１１０は、ステップＳ８３０で送信したデータフレームに関する送信成否の通知を待つ。そして、「送信成功」または「送信失敗」の通知をデータフレーム処理部１１０がＡＣＫ処理部１０７から受けると、処理はステップＳ８３７に移行する。ステップＳ８３６はステップＳ８２５と類似しているので、詳しい説明は省略する。
【０４１７】
そして、ステップＳ８３７でデータフレーム処理部１１０は、ステップＳ８３０におけるデータフレームの送信が成功したか否かを判断する。送信が失敗した場合、処理はステップＳ８３８に移行し、送信が成功した場合、処理はステップＳ８３９に移行する。
【０４１８】
ステップＳ８３８が実行されるのは、（Ｋ１）かつ（Ｋ２）という、例外的な場合である。
（Ｋ１）ＯＬＳ以外のすべての隣接ノード装置が、（Ｋ１−１）または（Ｋ１−２）である。
【０４１９】
（Ｋ１−１）最大値の重みと対応付けられている。
（Ｋ１−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
【０４２０】
（Ｋ２）ＯＬＳへのデータフレームの送信（つまりバックトラック動作）は失敗した。
この場合、データフレーム処理部１１０はステップＳ８３８で、受信したデータフレームを破棄する。すなわち、データフレーム処理部１１０は、ステップＳ８０１で見つけたエントリをバッファ部１０９から削除する。そして、データフレーム受信処理は終了する。
【０４２１】
なお、ステップＳ８３８の影響について、具体例とともに説明すれば以下のとおりである。
例えば、図６のステップＳ１１０は、ノード装置Ｎ３がステップＳ８３０で行う送信である。図６の例では、ステップＳ１１０でのノード装置Ｎ３からノード装置Ｎ２へのデータフレームの送信に対して、ノード装置Ｎ２がＡＣＫフレームをノード装置Ｎ３に返信する。
【０４２２】
ここで、逆に、ステップＳ１１０の時点でノード装置Ｎ２とＮ３の間のリンクに障害が発生し、ステップＳ１１０（すなわちステップＳ８３０）でノード装置Ｎ３が送信したデータフレームが、ノード装置Ｎ２には届かなかったと仮定する。すると、当然ノード装置Ｎ３がノード装置Ｎ２からＡＣＫフレームを受信することもないので、ノード装置Ｎ３は、ステップＳ８３７で「送信失敗」と判断し、ステップＳ８３８を実行する。つまり、ステップＳ１０１でノード装置Ｎ１が送信したデータフレームは、ＧＤであるノード装置Ｎ７に到達する前に、ネットワーク１内で消滅してしまう。
【０４２３】
しかも、ノード装置Ｎ２にとっては、「ステップＳ１０２で送信が成功した後、どの隣接ノード装置からも同じデータフレームは受信されていない」という状態である。したがって、ノード装置Ｎ２には、「ＧＤとしてノード装置Ｎ７が指定されているとき、ノード装置Ｎ２がＬＤとしてノード装置Ｎ３を選択することは不適切である」とは認識されない。つまり、図６の例のように、ノード装置Ｎ２が「ＧＤとしてノード装置Ｎ７が指定されているとき、ノード装置Ｎ２はＬＤとしてノード装置Ｎ６を選択するのが適切である」と学習することはできない。
【０４２４】
その結果、ＧＤとしてノード装置Ｎ７が指定されている新たな別のデータフレームをノード装置Ｎ２が受信した場合（またはそのようなデータフレームをノード装置Ｎ２がＧＳとなって送信する場合）、ノード装置Ｎ２は、ＬＤとしてノード装置Ｎ３を選択する。
【０４２５】
仮に、その時点でもまだノード装置Ｎ２とＮ３の間のリンクが障害から復旧していなければ（例えば、悪い電波状況が続いていれば）、ノード装置Ｎ２から送信されたデータフレームがノード装置Ｎ３には届かない。したがって、ノード装置Ｎ２はＡＣＫフレームを受信することができず、図２２のステップＳ８２６で「送信失敗」と判断する。
【０４２６】
その結果、ノード装置Ｎ２はステップＳ８２８で、ＧＤであるノード装置Ｎ７に対応する重み付けテーブル１０４−ｈ２−Ｎ２（この参照符号は図６の説明と同様）においてノード装置Ｎ２に対応する重みを大きくする。そして、ノード装置Ｎ２は、続くステップＳ８２９で、ＬＤとしてノード装置Ｎ６を再選択する。
【０４２７】
このように、データフレームがネットワーク１内のノード装置Ｎ３においてステップＳ８３８で破棄されると、破棄されたデータフレームに関するＯＬＳである他のノード装置Ｎ２における重み付けテーブル１０４−ｈ２−Ｎ２の学習が、遅れることがある。
【０４２８】
しかしながら、上記の例示から明らかなとおり、ノード装置Ｎ２における学習は単に少し遅れるだけである。ノード装置Ｎ２は、先のデータフレームと同じくノード装置Ｎ７をＧＤとする次のデータフレームを受信した後、その受信を契機とする一連の処理により、適切な重みを学習することができる。つまり、複数のデータフレームが次々に流通するネットワーク１全体の動作として見れば、ＯＬＳへのバックトラックのためのデータフレームの送信失敗により局所的に重みの学習が遅れるノード装置があっても、学習の遅れはすぐに挽回することができる。
【０４２９】
ここで、図２３のフローチャートの説明に戻る。ステップＳ８３９は、ＯＬＳへのデータフレームの送信に成功した場合に実行される。
ステップＳ８３９でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８３０で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。換言すれば、データフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤ（つまりステップＳ８０８またはＳ８１０で記憶したＯＬＳ）に対応する重みを更新する。
【０４３０】
ステップＳ８３９の詳細はステップＳ８２７と同様なので詳しい説明は省略するが、データフレーム処理部１１０は、例えば式（６）を使って重みを更新してもよい。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０４３１】
続いて、図２４を参照して、図２１のステップＳ８１２ａの重み付けテーブル調整処理の詳細を説明する。なお、図２４の重み付けテーブル調整処理は、後述の図２７のステップＳ１１０８ａでも呼び出される。図２４の説明において「ヒットした重み付けテーブル１０４−ｉ」とは、図２１のステップＳ８１１の検索または図２７のステップＳ１１０７の検索でヒットしたテーブルを意味する。
【０４３２】
ステップＳ８５１でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３（図９参照）の１つ目のエントリに注目する。なお、以下の図２４の説明において、データフレーム処理部１１０が注目している隣接ノード管理テーブル１０３のエントリを「注目エントリ」という。
【０４３３】
次に、ステップＳ８５２では、ヒットした重み付けテーブル１０４−ｉに注目エントリのノードＩＤの値をＬＤとして含むエントリがあるか否かを、データフレーム処理部１１０が判断する。ヒットした重み付けテーブル１０４−ｉに、注目エントリのノードＩＤの値をＬＤとして含むエントリがあれば、処理はステップＳ８５５に移行する。逆に、ヒットした重み付けテーブル１０４−ｉに、注目エントリのノードＩＤの値をＬＤとして含むエントリがなければ、処理はステップＳ８５３に移行する。
【０４３４】
ステップＳ８５３でデータフレーム処理部１１０は、ヒットした重み付けテーブル１０４−ｉに新規エントリを追加する。
続いてステップＳ８５４でデータフレーム処理部１１０は、ステップＳ８５３で重み付けテーブル１０４−ｉに追加した新規エントリに値を設定する。つまり、データフレーム処理部１１０は、新規エントリにおいて、隣接ノード管理テーブル１０３の注目エントリのノードＩＤの値をＬＤフィールドに、初期重み付け値を重みフィールドに、現在時刻を最終更新時刻フィールドに、それぞれ設定する。
【０４３５】
なお、ステップＳ８５４における初期重み付け値は、図１５のステップＳ３０８における初期重み付け値とは異なる。具体的には、ステップＳ８５４での初期重み付け値は、ヒットした重み付けテーブル１０４−ｉの重みフィールドにおいて、１未満の重みのうちの最大値である。
【０４３６】
例えば、ヒットした重み付けテーブル１０４−ｉの重みフィールドに４つのエントリが存在し、それぞれの重みフィールドの値が０．４、０．７、１、および０．５であれば、ステップＳ８５４での初期重み付け値は、０．７である。なお、ヒットした重み付けテーブル１０４−ｉの重みフィールドの値が、全エントリで１の場合は、ステップＳ８５４での初期重み付け値は、１未満の任意の値であり、例えば図１５のステップＳ３０８での初期重み付け値と同様に０．５でもよい。
【０４３７】
以上のような初期重み付け値をステップＳ８５４で用いることにより、重み付けテーブル１０４−ｉの既存のエントリに反映されている学習結果が優先的に考慮される。その結果、経路が必要以上に変動することがなくなり、換言すれば、経路が安定する。
【０４３８】
例えば、４つのエントリの重みフィールドの値がそれぞれ０．４、０．７、１、および０．５である上記の例において、ステップＳ８５４で初期重み付け値として図１５のステップＳ３０８と同様に０．５が使われるとする。すると、重みが何も学習されていない隣接ノード装置（すなわちステップＳ８５３で追加された新規エントリにＬＤとしてノードＩＤが記録されている隣接ノード装置）が、重みが０．７の隣接ノード装置よりも優先的にＬＤとして選択されてしまう。つまり、今までの学習の蓄積としての重み０．７が無視されてしまう。
【０４３９】
そこで、第１実施形態では、重みが何も学習されていない隣接ノード装置が、重みが学習済みの隣接ノード装置よりも優先的にＬＤとして選択されることを防ぎ、今までの学習結果を優先的に考慮するために、上記のように定義される初期重み付け値が利用される。
【０４４０】
ステップＳ８５５でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３にまだ注目していないエントリが残っているか否かを判断する。データフレーム処理部１１０が隣接ノード管理テーブル１０３のすべてのエントリに注目し終えていれば、図２４の処理は終了する。他方、まだデータフレーム処理部１１０が注目していないエントリが隣接ノード管理テーブル１０３に残っていれば、処理はステップＳ８５６に移行する。
【０４４１】
そして、ステップＳ８５６でデータフレーム処理部１１０は、隣接ノード管理テーブル１０３のまだ注目していないエントリのうち、次のエントリに注目する。そして処理はステップＳ８５２に戻る。
【０４４２】
なお、図２４の処理の意義は以下のとおりである。
重み付けテーブル１０４−ｉにおけるエントリごとのエージング処理の副作用として、図２４の処理の直前には、次のような状況の可能性もある。すなわち、隣接ノード管理テーブル１０３に登録されているある隣接ノード装置のノードＩＤを、ＬＤとして有するエントリが、重み付けテーブル１０４−ｉに存在しない可能性がある。
【０４４３】
ここで、ノード装置１００の隣接ノード装置は、データフレームを送信する際にデータフレーム処理部１１０が選択するＬＤの潜在的な候補である。よって、ヒットした重み付けテーブル１０４−ｉのＬＤフィールドにおいて全隣接ノード装置が網羅されるようにすることが、ノード装置１００の適切な動作のためには望ましい。
【０４４４】
以上の図２４の重み付けテーブル調整処理によれば、エージング処理の副作用として生じる可能性のある上記のような状況が解消される。つまり、隣接ノード管理テーブル１０３に登録されているすべてのノードＩＤが、ヒットした重み付けテーブル１０４−ｉにＬＤとして登録されていることが、保証される。
【０４４５】
以上、図２０〜２４を参照して、図１４のステップＳ２０５におけるデータフレーム受信処理について詳しく説明した。続いて、データフレーム受信処理のステップＳ８２６およびＳ８３７における送信成否の通知に関連する処理について、図２５と図２６を参照して説明する。
【０４４６】
図２５は、図１４のステップＳ２０６におけるＡＣＫフレーム受信処理のフローチャートである。図２５の処理は、フレーム分岐処理部１０６からＡＣＫフレームがＡＣＫ処理部１０７に出力されると開始される。
【０４４７】
ステップＳ９０１でＡＣＫ処理部１０７は、フレーム分岐処理部１０６から受け取ったＡＣＫフレームのＬＤの値が自ノードＩＤと等しいか否かを判断する。ＡＣＫフレームのＬＤの値が自ノードＩＤと等しければ、処理はステップＳ９０２に移行し、ＡＣＫフレームのＬＤの値が自ノードＩＤと異なれば、図２５の処理は終了する。ＡＣＫ処理部１０７も、例えばフラッシュメモリ２０５などに予め格納された自ノードＩＤを参照することができる。
【０４４８】
例えば、図６のステップＳ１０５でノード装置Ｎ４が送信したデータフレームに対するＡＣＫフレームを、図３１にステップＳ１０５ａとして示すようにノード装置Ｎ５が送信すると、無関係なノード装置Ｎ３もＡＣＫフレームを受信する。なぜなら、ノード装置Ｎ３はノード装置Ｎ５に隣接しているからである。
【０４４９】
しかし、ノード装置Ｎ３のＡＣＫ処理部１０７−Ｎ３は、ステップＳ９０１の判断の結果、直ちに図２５の処理を終了するので、ノード装置Ｎ３は、ノード装置Ｎ３と無関係なＡＣＫフレームによる副作用を受けることはない。
【０４５０】
ステップＳ９０２でＡＣＫ処理部１０７は、ＡＣＫフレームのＧＳとＦＩＤの値から、ＡＣＫフレームに対応する送信済みのデータフレームを特定する。
例えば、図６のステップＳ１０２でノード装置Ｎ２がノード装置Ｎ３へ送信する図７のデータフレーム３０３に対して、ノード装置Ｎ３は図７のＡＣＫフレーム３２２をノード装置Ｎ２に返信する。ここで、ＡＣＫフレーム３２２の受信を契機にノード装置Ｎ２のＡＣＫ処理部１０７−Ｎ２が図２５の処理を行う場合について詳しく説明すると、以下のとおりである。
【０４５１】
ＡＣＫ処理部１０７−Ｎ２は、ステップＳ９０２において、ＡＣＫフレーム３２２のＧＳとＦＩＤの値（すなわちＮ１とＦａ）を取り出す。また、バッファ部１０９−Ｎ２は、図８と同様の形式であるから、バッファ部１０９−Ｎ２には、ノード装置Ｎ２から送信済みのデータフレーム３０３が格納されている。よって、ＡＣＫ処理部１０７−Ｎ２は、取り出したＧＳとＦＩＤの値（すなわちＮ１とＦａ）をキーにしてバッファ部１０９−Ｎ２のエントリを検索し、データフレーム３０３を含むエントリを特定する。
【０４５２】
続いて、ステップＳ９０３でＡＣＫ処理部１０７は、ステップＳ９０２で特定した送信済みのデータフレームをバッファ部１０９から削除する。つまり、ステップＳ９０２の検索で見つかったエントリを、ＡＣＫ処理部１０７はバッファ部１０９から削除する。
【０４５３】
また、ステップＳ９０４でＡＣＫ処理部１０７は、ステップＳ９０２で特定した送信済みのデータフレームに関して、データフレーム処理部１１０に「送信成功」を通知する。そして、図２５の処理は終了する。
【０４５４】
例えば、データフレーム処理部１１０は、図４のＭＰＵ２０１がプログラムを実行することにより実現されていてもよい。その場合、ＭＰＵ２０１をデータフレーム処理部１１０として機能させるスレッドは、データフレームの送信後、ＡＣＫフレームを受信するまでスリープしていてもよい。ステップＳ９０４における「送信成功」の通知は、スリープしているスレッドを起こす処理である。
【０４５５】
なお、ステップＳ９０４の通知は、ステップＳ９０２で特定したデータフレームのＧＳとＦＩＤの値の通知をともなう。例えば上記の例においては、ＡＣＫ処理部１０７−Ｎ２は、データフレーム３０３を識別するためのＧＳとＦＩＤの値（すなわちＮ１とＦａ）も、データフレーム処理部１１０に通知する。
【０４５６】
図２６は、ＡＣＫフレームがタイムアウト時刻までに受信されない場合の処理を示すフローチャートである。図２６の処理は、例えば、図４のタイマＩＣ２０３が所定の間隔で発生させる割り込み信号を契機として、定期的に行われる。
【０４５７】
ステップＳ１００１でＡＣＫ処理部１０７は、バッファ部１０９（図８を参照）の１つ目のエントリに注目する。以下、図２６に関する説明においては、ＡＣＫ処理部１０７が注目しているバッファ部１０９のエントリを「注目エントリ」という。
【０４５８】
続いてステップＳ１００２でＡＣＫ処理部１０７は、現在時刻と注目エントリのタイムアウト時刻フィールドの値を比較する。そして、現在時刻がタイムアウト時刻以降であれば、処理はステップＳ１００３に移行する。他方、現在時刻がまだタイムアウト時刻に達していなければ、処理はステップＳ１００５に移行する。
【０４５９】
ステップＳ１００３でＡＣＫ処理部１０７は、バッファ部１０９の注目エントリに格納されているデータフレームに関して、「送信失敗」をデータフレーム処理部１１０に通知する。ステップＳ１００３の通知は、図２５のステップＳ９０４の通知と同様に、具体的には、例えばスリープしているスレッドを起こす処理であってもよい。
【０４６０】
また、ステップＳ９０４の通知と同様に、ステップＳ１００３の通知も、データフレームのＧＳとＦＩＤの値の通知をともなう。具体的には、ＡＣＫ処理部１０７は、注目エントリに格納されているデータフレームのＧＳとＦＩＤの値を読み取り、読み取ったＧＳとＦＩＤの値によりデータフレームを特定して、特定したデータフレームの「送信失敗」をデータフレーム処理部１１０に通知する。
【０４６１】
なお、送信失敗の場合、データフレーム処理部１１０が今までＬＤとして試していない隣接ノード装置を新たなＬＤとして選択してデータフレームの再送を試みることがある。よって、ステップＳ１００３の時点では、注目エントリはバッファ部１０９から削除されない。
【０４６２】
続いてステップＳ１００４でＡＣＫ処理部１０７は、注目エントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。そして、処理はステップＳ１００５に移行する。
【０４６３】
ステップＳ１００５では、まだ注目していないエントリがバッファ部１０９に残っているか否かをＡＣＫ処理部１０７が判断する。ＡＣＫ処理部１０７が、バッファ部１０９のすべてのエントリに注目し終わっていれば、図２６の処理は終了する。他方、まだＡＣＫ処理部１０７が注目していないエントリがバッファ部１０９に残っていれば、処理はステップＳ１００６に移行する。
【０４６４】
ステップＳ１００６でＡＣＫ処理部１０７は、バッファ部１０９の中でまだ注目していない次のエントリに注目する。そして処理はステップＳ１００２に戻る。
ところで、図２０〜図２３を参照して説明したデータフレーム受信処理は、上記のとおり、ノード装置１００がＧＳとならないタイプのノード装置である場合の例である。以下では、図２７〜図２９を参照して、ＧＳとなりうるタイプのノード装置に特有の処理について説明する。
【０４６５】
図２７と図２８は、ノード装置１００がＧＳとなってデータフレームを送信する場合の送信処理のフローチャートである。図２７の処理は、上位層処理部１１１からデータフレーム処理部１１０への要求を契機として開始される。
【０４６６】
ステップＳ１１０１でデータフレーム処理部１１０は、上位層処理部１１１から、上位層処理部１１１における上位層のプロトコルの処理の結果として、データフレームのＧＤの値とペイロードを取得する。
【０４６７】
例えば、「上位層のプロトコル」がイーサネットプロトコルであってもよい。その場合、上位層処理部１１１は、第１実施形態で定義されるデータフレームのペイロードとして、イーサネットフレームをデータフレーム処理部１１０に出力する。また、上位層処理部１１１は、第１実施形態におけるデータフレームのＧＤに設定する値を、データフレーム処理部１１０に通知する。
【０４６８】
そして、データフレーム処理部１１０は、上位層処理部１１１から取得したペイロードを含む新たなデータフレームを作成し、作成したデータフレームのＧＤに、上位層処理部１１１から取得した値を設定する。例えば、図６の例では、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、上位層処理部１１１−Ｎ１からＧＤの値としてＮ７を取得し、データフレームのＧＤにＮ７と設定する。
【０４６９】
続いて、ステップＳ１１０２でデータフレーム処理部１１０は、ステップＳ１１０１で取得したペイロードの長さを求め、作成したデータフレームの長さフィールドに設定する。例えば、図６の例では、図７のデータフレーム３０２と３０３に例示するように、ペイロードの長さはＰａであるから、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、作成したデータフレームの長さフィールドにＰａと設定する。
【０４７０】
そして、ステップＳ１１０３でデータフレーム処理部１１０は、作成したデータフレームのＧＳとＬＳに自ノードＩＤを設定する。例えば、図６の例では、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１は、作成したデータフレームのＧＳとＬＳにそれぞれＮ１と設定する。
【０４７１】
そして、ステップＳ１１０４でデータフレーム処理部１１０は、ＦＩＤ生成部１１３に新たなＦＩＤの生成を要求する。するとＦＩＤ生成部１１３が新たなＦＩＤを生成してデータフレーム処理部１１０に出力するので、データフレーム処理部１１０は、生成されたＦＩＤを作成したデータフレームのＦＩＤフィールドに設定する。
【０４７２】
さらに、ステップＳ１１０５でデータフレーム処理部１１０は、「データフレーム」を示す所定の値Ｄ（図７を参照）を、作成したデータフレームのタイプフィールドに設定する。なお、以上のステップＳ１１０２〜Ｓ１１０５の実行順序は順不同である。
【０４７３】
以上のようにして、送信するデータフレームを作成し終わると、ステップＳ１１０６でデータフレーム処理部１１０は、作成したデータフレームをバッファ部１０９に格納する。すなわち、データフレーム処理部１１０は、バッファ部１０９内に新たなエントリの領域を確保し、確保した領域に、作成したデータフレームを格納する。なお、図８に示すようにバッファ部１０９にはタイムアウト時刻フィールドがあるが、この時点ではタイムアウト時刻は設定されない。
【０４７４】
続いてステップＳ１１０７でデータフレーム処理部１１０は、ステップＳ１１０１で上位層処理部１１１から指定されたＧＤの値を用いて重み付けテーブル１０４を検索する。
そしてステップＳ１１０８でデータフレーム処理部１１０は、指定されたＧＤの値に対応する重み付けテーブルが、ステップＳ１１０７の検索の結果としてヒットしたか否かを判断する。指定されたＧＤの値に対応する重み付けテーブルがヒットした場合、処理はステップＳ１１０８ａに移行し、指定されたＧＤの値に対応する重み付けテーブルが存在しない場合、処理はステップＳ１００９に移行する。
【０４７５】
ステップＳ１１０８ａでデータフレーム処理部１１０は、図２４の重み付けテーブル調整処理を行い、エージング処理の副作用を中和する。そして、処理はステップＳ１１１０に移行する。
【０４７６】
ステップＳ１１０９でデータフレーム処理部１１０は、ステップＳ１１０１で指定されたＧＤの値に対応する新規重み付けテーブルを重み付けテーブル１０４の中に追加する。具体的には、図２１のステップＳ８１３〜Ｓ８１６と類似の処理をデータフレーム処理部１１０はステップＳ１１０９で行う。
【０４７７】
すなわち、データフレーム処理部１１０はステップＳ１１０９で、上位層処理部１１１から指定されたＧＤの値に対応する新規重み付けテーブルを追加し、新規重み付けテーブルにおいて、上位層処理部１１１から指定されたＧＤの値をＧＤとして設定する。さらに、データフレーム処理部１１０は、隣接ノード管理テーブル１０３と同数の新規エントリを新規重み付けテーブル内に作成する。そして、データフレーム処理部１１０は、作成した各エントリに、それぞれ、隣接ノード管理テーブル１０３の各エントリのノードＩＤと初期重み付け値と現在時刻を設定する。
【０４７８】
なお、以下では説明の便宜上、ステップＳ１１０１で指定されたＧＤの値に対応する重み付けテーブルを、「１０４−ｉ」という参照符号で参照する。すなわち、重み付けテーブル１０４−ｉは、ステップＳ１１０７の検索でヒットしたテーブルまたはステップＳ１１０９で追加されたテーブルである。
【０４７９】
以上のようにして、重み付けテーブル１０４−ｉがヒットしたとステップＳ１１０８で判断された後、またはステップＳ１１０９で重み付けテーブル１０４−ｉが作成された後、処理はステップＳ１１１０に移行する。
【０４８０】
そして、ステップＳ１１１０でデータフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、最小の重みと対応付けられているＬＤの値を取得する。なお、図１１に例示するように、重み付けテーブル１０４−ｉにおいて複数のエントリが同じ最小の重みを有する場合もありうる。その場合、データフレーム処理部１１０は、最小の重みと対応付けられている複数のＬＤの値のうち任意の１つをステップＳ１１１０で選択して取得する。データフレーム処理部１１０は、取得したＬＤの値および対応する重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。
【０４８１】
続いて、処理は図２８のステップＳ１１１１に移行し、ステップＳ１１１１でデータフレーム処理部１１０は、下記の２つの条件（Ｌ１）と（Ｌ２）のいずれかが成立するか否かを判断する。
【０４８２】
（Ｌ１）ステップＳ１１１０で取得したＬＤの値に対応する重みが、重みの最大値（第１実施形態では、具体的には１．０）である。
（Ｌ２）重み付けテーブル１０４−ｉに登録されているすべてのＬＤへの送信が、いずれも失敗した。
【０４８３】
条件（Ｌ１）または（Ｌ２）が成立する場合、もはやＬＤとして選択可能な隣接ノード装置は残っていないので、処理はステップＳ１１１２に移行する。
他方、条件（Ｌ１）と（Ｌ２）のいずれも成立しない場合、まだＬＤとして選択可能な隣接ノード装置が残っている。換言すれば、データフレーム受信処理のステップＳ８１８に関して説明した（Ｇ１）〜（Ｇ３）のいずれにも該当しない隣接ノード装置が、少なくとも１つは存在する。そして、ＬＤとして選択可能な隣接ノード装置のノードＩＤが、ステップＳ１１１０（または後述のステップＳ１１２５）で取得されている。そこで、ステップＳ１１１１で条件（Ｌ１）と（Ｌ２）のいずれも成立しないと判断されると、処理はステップＳ１１１４に移行する。
【０４８４】
条件（Ｌ１）または（Ｌ２）が成立する場合、ステップＳ１１１２でデータフレーム処理部１１０は、データフレームを破棄する。つまり、データフレーム処理部１１０は、ステップＳ１１０６で新たに作成してデータフレームを格納したエントリを、バッファ部１０９から削除する。
【０４８５】
そして、続くステップＳ１１１３でデータフレーム処理部１１０は、上位層処理部１１１に「送信失敗」を通知する。つまり、データフレーム処理部１１０は、どの隣接ノード装置にもデータフレームを成功裡に送信することはできなかったことを、上位層処理部１１１に通知する。そして図２７〜図２８の処理が終了する。
【０４８６】
他方、ステップＳ１１１１において、条件（Ｌ１）と（Ｌ２）のいずれも成立しないと判断されると、取得済みのＬＤの値で識別される隣接ノード装置へのデータフレームの転送を試みる処理が、ステップＳ１１１４〜Ｓ１１２５で行われる。
【０４８７】
ステップＳ１１１４では、データフレーム処理部１１０が、ステップＳ１１０６でバッファ部１０９に格納したデータフレームのＬＤに、ステップＳ１１１０または後述のステップＳ１１２５で取得したＬＤの値を設定する。そして、データフレーム処理部１１０は、ＬＤの値を設定したデータフレームの送信を、送信部１０２に依頼する。すると、送信部１０２がデータフレームを送信する。
【０４８８】
続いてステップＳ１１１５でデータフレーム処理部１１０は、ステップＳ１１０６でデータフレームを格納したバッファ部１０９内のエントリのタイムアウト時刻に、式（５）の時刻Ｔｔｉｍｅｏｕｔを設定する。
【０４８９】
そして、ステップＳ１１１６でデータフレーム処理部１１０は、自ノードＩＤと、ステップＳ１１０４でＦＩＤ生成部１１３が生成したＦＩＤを使ってＦＩＤ管理テーブル１０５を検索する。
【０４９０】
次にステップＳ１１１７でデータフレーム処理部１１０は、ステップＳ１１１６のＦＩＤ管理テーブル１０５の検索においてエントリがヒットしたか否かを判断する。なお、ステップＳ１１１７が１回目に実行される場合には「エントリがヒットしなかった」と判断され、ステップＳ１１１７が２回目以降に実行されるときは「エントリがヒットした」と判断される。
【０４９１】
ステップＳ１１１６の検索でエントリがヒットしていれば、処理はステップＳ１１１８に移行する。他方、ステップＳ１１１６の検索でエントリがヒットしていなければ、処理はステップＳ１１１９に移行する。
【０４９２】
ステップＳ１１１８でデータフレーム処理部１１０は、ステップＳ１１１６の検索でヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ステップＳ１１１６の検索でヒットしたエントリにおいて、ＬＤフィールドには、ステップＳ１１１４で送信したデータフレームのＬＤの値を設定し、最終更新時刻フィールドには、現在時刻を設定する。そして、処理はステップＳ１１２１に移行する。
【０４９３】
また、ステップＳ１１１９でデータフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ１１２０でデータフレーム処理部１１０は、新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳとＬＤの各フィールドには、それぞれステップＳ１１１４で送信したデータフレームの値をコピーする。また、データフレーム処理部１１０は、新規エントリにおいて、最終更新時刻フィールドには現在時刻を設定し、ＯＬＳフィールドには、自ノードＩＤをコピーする。
【０４９４】
例えば、図１２に示した、ノード装置Ｎ１のＦＩＤ管理テーブル１０５−Ｎ１のエントリＥ１は、ノード装置Ｎ１のデータフレーム処理部１１０−Ｎ１が以上の処理により作成したものである。
【０４９５】
ステップＳ１１２１でデータフレーム処理部１１０は、ステップＳ１１１４における送信の成否の通知を待つ。ステップＳ１１２１の詳細は、図２２のステップＳ８２５と同様である。データフレーム処理部１１０が、ステップＳ１１２１での待機の後、ＡＣＫ処理部１０７から「送信成功」または「送信失敗」の通知を受けると、処理はステップＳ１１２２に移行する。
【０４９６】
ステップＳ１１２２でデータフレーム処理部１１０は、ＡＣＫ処理部１０７から受けた通知に基づいて、ステップＳ１１１４の送信が成功したか否かを判断する。送信が成功した場合、処理はステップＳ１１２３に移行し、送信が失敗した場合、処理はステップＳ１１２４に移行する。
【０４９７】
送信が成功した場合、ステップＳ１１２３でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ１１１４で送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。
【０４９８】
つまり、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤに対応する重みを、例えば式（６）を使って更新する。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、図２７〜図２８の処理は終了する。
【０４９９】
逆に、送信が失敗した場合、ステップＳ１１２４でデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ１１１４で送信したデータフレームのＧＤとＬＤの組に対応する重みを大きくする。
【０５００】
つまり、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤに対応する重みを、例えば式（７）を使って更新する。
【０５０１】
なお、データフレーム処理部１１０はステップＳ１１２４でさらに、送信したデータフレームのＬＤの値を、例えば図４のＤＲＡＭ２０４などのワークエリアに「送信に失敗したＬＤ」として記憶する。図２２のステップＳ８２８と同様に、「送信に失敗したＬＤ」の記憶のためには、線形リストや配列などのデータ構造が利用されてもよい。
【０５０２】
また、データフレーム処理部１１０はステップＳ１１２４でさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、処理はステップＳ１１２５に移行する。
【０５０３】
ステップＳ１１２５でデータフレーム処理部１１０は、今までにＬＤとして試していない他の選択可能な隣接ノード装置を探す。具体的には、データフレーム処理部１１０は、上位層処理部１１１から指定されたＧＤの値に対応する重み付けテーブル１０４−ｉにおいて、送信に失敗したＬＤ以外のＬＤのうちで、最小の重みと対応付けられているＬＤの値を取得する。ここで、送信に失敗したＬＤは、ステップＳ１１２４において例えば図４のＤＲＡＭ２０４などのワークエリアに、例えば線形リストや配列の形で記憶されている。
【０５０４】
つまり、データフレーム処理部１１０は、重み付けテーブル１０４−ｉにおいて、過去にステップＳ１１１０またはＳ１１２５で取得されていないＬＤの値のうちで、最小の重みと対応付けられているものを取得する。データフレーム処理部１１０は、取得したＬＤの値および対応する重みの値を、例えば図４のＤＲＡＭ２０４などの記憶領域に記憶する。そして、処理はステップＳ１１１１に戻る。
【０５０５】
さて、図２９は、ＧＳにもなりうるノード装置１００が、データフレーム受信処理の一部として図２３の処理の代わりに行う処理のフローチャートである。
ノード装置１００がＧＳにもなりうるタイプの装置である場合、データフレーム受信処理におけるステップＳ８０１〜Ｓ８２９は、ノード装置１００が中継専用の場合と同様であり、図２０〜図２２に示したとおりである。しかし、ノード装置１００がＧＳにもなりうるタイプの装置の場合は、図２２のステップＳ８１８においてデータフレーム処理部１１０が「条件（Ｆ１）と（Ｆ２）のいずれかが成立する」と判断すると、処理は図２９のステップＳ８３０ａに移行する。
【０５０６】
ステップＳ８３０ａでデータフレーム処理部１１０は、受信したデータフレームのＧＳの値が自ノードＩＤであるか否かを判断する。受信したデータフレームのＧＳの値が自ノードＩＤと異なれば、処理はステップＳ８３０ｂに移行し、受信したデータフレームのＧＳの値が自ノードＩＤであれば、処理はステップＳ８３０ｃに移行する。
【０５０７】
ステップＳ８３０ｂでデータフレーム処理部１１０は、以下のようにして新たなデータフレームを作成して送信部１０２に出力し、作成されたデータフレームを送信部１０２が送信する。
【０５０８】
具体的には、データフレーム処理部１１０は、ステップＳ８０８またはＳ８１０で記憶したＯＬＳの値を新たなデータフレームのＬＤに指定し、自ノードＩＤを新たなデータフレームのＬＳに指定する。また、データフレーム処理部１１０は、受信したデータフレームからＧＤ、ＧＳ、ＦＩＤ、タイプ、長さの各フィールドの値と、ペイロードを、新たなデータフレームにコピーする。データフレームの送信後、処理はステップＳ８３１ａに移行する。
【０５０９】
また、ステップＳ８３０ｃでは、データフレーム処理部１１０は、上位層処理部１１１に「送信失敗」を通知する。通知にあたって、データフレーム処理部１１０は、例えば受信したデータフレームからペイロードを取り出し、ペイロードまたはペイロードの一部を上位層処理部１１１に出力してもよい。すると、上位層処理部１１１はどのデータの送信に失敗したのかを、データフレーム処理部１１０から受け取ったペイロードの内容に基づいて認識することができる。送信失敗の通知の後、処理はステップＳ８３８ａに移行する。
【０５１０】
さて、ステップＳ８３１ａでは、データフレーム処理部１１０が、受信したデータフレームのＦＩＤとＧＳの値を検索キーとして用いてＦＩＤ管理テーブル１０５を検索する。なお、以下のステップＳ８３１ａ〜Ｓ８３９ａは、それぞれ図２３のステップＳ８３１〜Ｓ８３９と類似のステップである。
【０５１１】
次のステップＳ８３２ａでデータフレーム処理部１１０は、ステップＳ８３１ａの検索の結果、エントリがヒットしたか否かを判断する。エントリがヒットしていれば処理はステップＳ８３３ａに移行し、エントリがヒットしていなければ処理はステップＳ８３４ａに移行する。
【０５１２】
なお、ステップＳ８０７で「エントリがヒットした」と判断されている場合に、ステップＳ８３１ａの検索の結果見つかるエントリは、ステップＳ８０６の検索の結果見つかったエントリである。また、ステップＳ８０７で「エントリがヒットしなかった」と判定され、かつステップＳ８２３において新規エントリが作成された場合は、ステップＳ８３１ａの検索の結果、ステップＳ８２３で作成された新規エントリが見つかる。
【０５１３】
ステップＳ８３２ａで「エントリがヒットしなかった」と判断されるのは、（Ｍ１）かつ（Ｍ２）の場合である。
（Ｍ１）ステップＳ８０７で「エントリがヒットしなかった」と判断された。
【０５１４】
（Ｍ２）１回目にステップＳ８１８が実行された直後に、ステップＳ８３０ａに処理が移行した。
ステップＳ８３３ａでデータフレーム処理部１１０は、ステップＳ８３１ａの検索の結果ヒットしたエントリを更新する。具体的には、データフレーム処理部１１０は、ヒットしたエントリにおいて、ＬＤには、ヒットしたエントリ自身のＯＬＳの値をコピーし、最終更新時刻には、現在時刻を設定する。そして処理はステップＳ８３６ａに移行する。
【０５１５】
他方、ステップＳ８３４ａでは、データフレーム処理部１１０はＦＩＤ管理テーブル１０５に新規エントリを追加する。
そして、次のステップＳ８３５ａでデータフレーム処理部１１０は、ステップＳ８３４ａで追加した新規エントリに値を設定する。具体的には、データフレーム処理部１１０は、新規エントリにおいて、ＦＩＤとＧＳには、受信したデータフレームの値をそれぞれコピーし、最終更新時刻には、現在時刻を設定し、ＯＬＳとＬＤには、受信したデータフレームのＬＳの値をコピーする。そして処理はステップＳ８３６ａに移行する。
【０５１６】
ステップＳ８３６ａでデータフレーム処理部１１０は、ステップＳ８３０ｂで送信したデータフレームに関する送信成否の通知を待つ。そして、「送信成功」または「送信失敗」の通知をデータフレーム処理部１１０がＡＣＫ処理部１０７から受けると、処理はステップＳ８３７ａに移行する。
【０５１７】
ステップＳ８３７ａでデータフレーム処理部１１０は、ステップＳ８３０ｂにおけるデータフレームの送信が成功したか否かを判断する。送信が失敗した場合、処理はステップＳ８３８ａに移行し、送信が成功した場合、処理はステップＳ８３９ａに移行する。
【０５１８】
ステップＳ８３８ａが実行されるのは、（Ｎ１）または（Ｎ２）の場合である。
（Ｎ１）ノード装置１００自身がＧＳとなって送信したデータフレームがバックトラックによりノード装置１００に戻ってきて受信されたのであり、かつ、ノード装置１００の隣接ノード装置はすべて（Ｎ１−１）または（Ｎ１−２）である。
【０５１９】
（Ｎ１−１）最大値の重みと対応付けられている。
（Ｎ１−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する。
【０５２０】
（Ｎ２）受信したデータフレームのＧＳは、ノード装置１００以外の他のノード装置であり、かつ、ＯＬＳ以外のすべての隣接ノード装置が（Ｎ２−１）または（Ｎ２−２）であり、かつ、ＯＬＳへのデータフレームの送信は失敗した。
【０５２１】
（Ｎ２−１）最大値の重みと対応付けられている。
（Ｎ２−２）ＬＤとして指定してデータフレームを送信すると、送信に失敗する
。
【０５２２】
この場合、データフレーム処理部１１０はステップＳ８３８ａで、受信したデータフレームを破棄する。すなわち、データフレーム処理部１１０は、ステップＳ８０１で見つけたエントリをバッファ部１０９から削除する。そして、データフレーム受信処理は終了する。
【０５２３】
他方、ステップＳ８３９ａは、ノード装置１００ではない別のノード装置がＧＳであるデータフレームに関して、ノード装置１００からノード装置１００のＯＬＳへの送信が成功した場合に実行される。ステップＳ８３９ａでデータフレーム処理部１１０は、重み付けテーブル１０４において、ステップＳ８３０ｂで送信したデータフレームのＧＤとＬＤの組に対応する重みを小さくする。換言すれば、データフレーム処理部１１０は、受信したデータフレームのＧＤに対応する重み付けテーブル１０４−ｉにおいて、送信したデータフレームのＬＤ（つまりステップＳ８０８またはＳ８１０で記憶したＯＬＳ）に対応する重みを更新する。
【０５２４】
例えば、ステップＳ８２９やＳ８３９と同様に、データフレーム処理部１１０は、式（６）を使って重みを更新してもよい。データフレーム処理部１１０はさらに、重み付けテーブル１０４−ｉの、重みを更新したエントリにおいて、最終更新時刻に現在時刻を設定する。そして、データフレーム受信処理は終了する。
【０５２５】
続いて、以上の詳細な説明を踏まえて、再度、図６の例について説明する。
図３０は、経路を探索するための探索空間を表す探索木の形式で、図６における経路選択を説明する図である。人工知能の分野では、探索空間はしばしば探索木の形式で表現される。図３０は、第１実施形態におけるデータフレームの転送を、ネットワーク内で動的に行われる経路探索という観点から見て、探索空間を探索木４００として表現した図である。なお、探索木４００は、ノード装置内に作成されるデータ構造ではなく、ネットワークトポロジそのものでもない。
【０５２６】
探索木４００に含まれる各探索ノードには、ネットワーク１内のノード装置のノードＩＤのラベルが付けられる。なお、図３０では、各探索ノードを、円、正方形、六画形の３種類の図形で表しているが、円、正方形、六画形の意味の違いについては後述する。
【０５２７】
また、図６の例では、データフレームのＧＳとＧＤは、それぞれノード装置Ｎ１とＮ７なので、探索木４００のルートノードは、Ｎ１というラベルが付けられた探索ノード４０１である。そして、経路探索のゴールは、探索木４００においてＮ７というラベルが付けられた探索ノード４０９を発見することである。
【０５２８】
ここで、図６のネットワーク１においてノード装置ＮｉとＮｊが隣接していれば、（１≦ｉ，ｊ≦７）、ノード装置Ｎｉにとって隣接ノード装置Ｎｊは潜在的なＬＤの候補であり、ノード装置Ｎｊにとっても隣接ノード装置Ｎｉは潜在的なＬＤの候補である。よって、探索木４００内において、Ｎｉというラベルが付けられた探索ノードは、Ｎｊというラベルが付けられた探索ノードを子ノードとして有する。
【０５２９】
したがって、探索木４００では、Ｎｉというラベルが付けられた第１の探索ノードが、Ｎｊというラベルが付けられた第２の探索ノードを子ノードとして有し、第２の探索ノードが、Ｎｉというラベルが付けられた第３の探索ノードを子ノードとして有する。以下同様であるから、探索木４００は、潜在的には無限の探索ノードを有する。
【０５３０】
潜在的には無限に大きい探索木４００の探索においては、探索空間の刈り込み（pruning）が行われつつ、深さ優先探索が行われる。「探索空間の刈り込み」とは、探索効率を上げるために探索木の１つ以上の枝を無視するという技法であり、探索アルゴリズムの研究分野においては、応用分野に応じて種々の刈り込み手法が提案されている。
【０５３１】
第１実施形態のノード装置１００の自律分散協調の結果としての刈り込みには２種類ある。以下、便宜的に「第１種の刈り込み」と「第２種の刈り込み」と称する。
第１種の刈り込みは、親ノードと同じラベルを有する子ノードの刈り込みである。例えば、上記の第１〜第３の探索ノードの例では、第２の探索ノードの子ノードである第３の探索ノードのラベルは、第２の探索ノードの親ノードである第１の探索ノードのラベルと等しい。そこで、第２の探索ノードから先の探索においては、第３の探索ノードが刈り込まれる。第１種の刈り込みによって刈り込まれる探索ノードは、図３０において正方形で表されている。
【０５３２】
第２種の刈り込みは、祖先ノードと同じラベルを有する子ノードの刈り込みである。第２種の刈り込みは、第１実施形態のＦＩＤ管理テーブル１０５によって可能となっている。第２種の刈り込みによって刈り込まれる探索ノードは、図３０において六画形で表されている。
【０５３３】
なお、図３０において円は、刈り込まれずに探索された探索ノードを表す。
以下、具体的に図６の例と探索木４００との関係について説明する。
上記のように、探索木４００のルートノードである探索ノード４０１のラベルは、データフレームのＧＳであるノード装置Ｎ１のノードＩＤ・Ｎ１である。そして、ネットワーク１においてノード装置Ｎ１にはノード装置Ｎ２のみが隣接するので、探索ノード４０１は１つの探索ノード４０２のみを子ノードとして有し、探索ノード４０２のラベルはＮ２である。
【０５３４】
また、ノード装置Ｎ１にはノード装置Ｎ２のみが隣接するので、図６のステップＳ１０１のように、データフレームがノード装置Ｎ１からノード装置Ｎ２へと送信される。ステップＳ１０１の送信は、図３０では、探索ノード４０１から探索ノード４０２へと探索が進むことに対応する。
【０５３５】
そして、ネットワーク１においてノード装置Ｎ２には、ノード装置Ｎ１とＮ３とＮ６が隣接している。よって、探索ノード４０２は、３つの探索ノード４０３と４０４と４０５を子ノードとして有し、探索ノード４０３と４０４と４０５それぞれのラベルはＮ３とＮ６とＮ１である。
【０５３６】
図６においてノード装置Ｎ２が、最初にノード装置Ｎ３をＬＤとして選択して、ステップＳ１０２でノード装置Ｎ３へデータフレームを送信することは、図３０では、探索ノード４０２から探索ノード４０３へ探索が進むことに対応する。
【０５３７】
そして、ネットワーク１においてノード装置Ｎ３には、ノード装置Ｎ２とＮ４とＮ５が隣接している。よって、探索ノード４０３は、３つの探索ノード４０６、４０７および４０８を子ノードとして有し、探索ノード４０６、４０７、および４０８それぞれのラベルは、Ｎ４とＮ２とＮ５である。
【０５３８】
図６においてノード装置Ｎ３が、最初にノード装置Ｎ４をＬＤとして選択して、ステップＳ１０３でノード装置Ｎ４へデータフレームを送信することは、図３０では、探索ノード４０３から探索ノード４０６へ探索が進むことに対応する。
【０５３９】
そして、ネットワーク１においてノード装置Ｎ４には、ノード装置Ｎ７とＮ５とＮ３が隣接する。よって、探索ノード４０６は、３つの探索ノード４１１、４１２、および４１３を子ノードとして有し、探索ノード４１１、４１２、および４１３それぞれのラベルは、Ｎ７とＮ５とＮ３である。
【０５４０】
図６においてノード装置Ｎ４が、最初にノード装置Ｎ７をＬＤとして選択して、ステップＳ１０４でノード装置Ｎ７へデータフレームを送信することは、図３０では、探索ノード４０６から探索ノード４１１へ探索が進むことに対応する。
【０５４１】
ところが、図６に示すように、ステップＳ１０４ではノード装置Ｎ４とＮ７の間のリンクの障害により、送信が失敗する。つまり、探索木４００においては、探索ノード４１１で探索が失敗してバックトラックが生じる。なお、探索ノード４１１から探索ノード４０６への、探索木４００上でのバックトラックは、実際のネットワーク１上では、ＡＣＫフレームが受信されずにノード装置Ｎ４がタイムアウトするという現象である。
【０５４２】
図６においては、ステップＳ１０４の送信失敗の後、ノード装置Ｎ４は、次にノード装置Ｎ５をＬＤとして選択してステップＳ１０５でノード装置Ｎ５へデータフレームを送信する。このステップＳ１０５での送信は、図３０では、探索ノード４０６から探索ノード４１２へ探索が進むことに対応する。
【０５４３】
そして、ネットワーク１においてノード装置Ｎ５にはノード装置Ｎ３とＮ４が隣接するので、探索ノード４１２は、２つの探索ノード４１４と４１５を子ノードとして有し、探索ノード４１４と４１５それぞれのラベルは、Ｎ３とＮ４である。
【０５４４】
図６においてノード装置Ｎ５が最初にノード装置Ｎ３をＬＤとして選択してステップＳ１０６でノード装置Ｎ３へデータフレームを送信することは、図３０では、探索ノード４１２から探索ノード４１４へと探索が進むことに対応する。
【０５４５】
なお、探索木４００において、探索ノード４１４は、祖先ノードである探索ノード４０３と同じラベルを持つ。しかし、探索ノード４０３と４１４の間には、２つの探索ノード４０６と４１２がはさまっているため、この時点では探索ノード４１４は刈り込まれない。
【０５４６】
そして、ネットワーク１においてノード装置Ｎ３にはノード装置Ｎ２とＮ４とＮ５が隣接するので、探索ノード４１４は、３つの探索ノード４１６、４１７、および４１８を子ノードとして有し、探索ノード４１６、４１７、および４１８それぞれのラベルは、Ｎ２とＮ４とＮ５である。
【０５４７】
ところで、ステップＳ１０６でデータフレームを受信した時点で、ノード装置Ｎ３のＦＩＤ管理テーブル１０５−Ｎ３には、図１２のとおりエントリＥ３が既に存在している。このことは、次の（Ｏ１）と（Ｏ２）を意味する。
【０５４８】
（Ｏ１）探索木４００において、探索ノード４１４から見た祖先ノードとして、探索ノード４１４自身と同じラベルＮ３を有する探索ノード４０３が存在している。
（Ｏ２）したがって、探索ノード４１４の子ノードである探索ノード４１６、４１７、および４１８は、刈り込み対象である。
【０５４９】
そして、刈り込みは次のようにして実現される。
ラベルＮ３を有する探索ノード４１４の祖先ノードにラベルＮ４を有する探索ノード４０６があることは、ノード装置Ｎ３のＦＩＤ管理テーブル１０５−Ｎ３のエントリＥ３において、ステップＳ１０６の時点でＬＤの値がＮ４であることに対応する（図１２参照）。そして、ステップＳ１０６でデータフレームを受信すると、ノード装置Ｎ３は、ステップＳ１０３でＬＤとして選択したノード装置Ｎ４に対応する重みを、図１１に示すように最大値に設定している。
【０５５０】
換言すれば、ステップＳ１０６でのデータフレームの受信を契機として、ノード装置Ｎ３は、ノード装置Ｎ４を潜在的なＬＤの候補から除外している。そして、潜在的なＬＤの候補からの除外とは、探索木４００における刈り込みであるから、ラベルＮ４を持つ探索ノード４１７は刈り込まれる。
【０５５１】
また、探索ノード４１４の祖先ノードにラベルＮ２を有する探索ノード４０２があることは、ノード装置Ｎ３のＦＩＤ管理テーブル１０５−Ｎ３のエントリＥ３において、ＯＬＳの値がＮ２であることに対応する（図１２参照）。
【０５５２】
そして、ステップＳ１０６でデータフレームを受信した時点では、ＯＬＳ以外で潜在的にＬＤとして選択可能なノード装置Ｎ５が存在しているので、ノード装置Ｎ３は、ＯＬＳであるノード装置Ｎ２をＬＤとして選択しない。つまり、ラベルＮ２を持つ探索ノード４１６は刈り込まれる。
【０５５３】
また、ステップＳ１０６の受信を契機に、ノード装置Ｎ３はＬＤとしてノード装置Ｎ５を選択する。ここで、探索木４００において探索ノード４１４の子ノードである探索ノード４１８は、探索ノード４１４の親ノードである探索ノード４１２と同じラベルＮ５を有することに注目すると、探索ノード４１８は第１種の刈り込みの対象である。
【０５５４】
実際、ステップＳ１０７でのノード装置Ｎ３からノード装置Ｎ５へのデータフレームの送信は、図３０に示すように、探索木４００上での探索ノード４１４から親ノードである探索ノード４１２へのバックトラックとして表すことができる。換言すれば、探索ノード４１４の子ノードであり、親ノードの探索ノード４１２と同じラベルＮ５を有する探索ノード４１８は、刈り込まれる。
【０５５５】
次のステップＳ１０８では、図６に示すように、ノード装置Ｎ５はＯＬＳであるノード装置Ｎ４へとデータフレームをバックトラックさせている。このステップＳ１０８の動作は、図３０では、探索木４００においてラベルＮ５を有する探索ノード４１２からラベルＮ４を有する探索ノード４０６へのバックトラックとして表現される。換言すれば、探索ノード４１２の子ノードであり、探索ノード４１２の親ノードの探索ノード４０６と同じラベルＮ４を有する探索ノード４１５は、刈り込まれる。
【０５５６】
そして、次のステップＳ１０９でも、図６に示すように、ノード装置Ｎ４がＯＬＳであるノード装置Ｎ３へとデータフレームをバックトラックさせている。このステップＳ１０９の動作も、図３０では、探索木４００においてラベルＮ４を有する探索ノード４０６からラベルＮ３を有する探索ノード４０３へのバックトラックとして表現される。換言すれば、探索ノード４０６の子ノードであり、探索ノード４０６の親ノードの探索ノード４０３と同じラベルＮ３を有する探索ノード４１３は、刈り込まれる。
【０５５７】
この段階で、ラベルＮ３を有する探索ノード４０３の子ノードのうち未探索なのは、ラベルＮ２を有する探索ノード４０７と、ラベルＮ５を有する探索ノード４０８である。
しかし、ノード装置Ｎ３はステップＳ１０７でノード装置Ｎ５にデータフレームを送信済みであり、ステップＳ１０９でのデータフレームの受信を契機として、図１１に示すように、ノード装置Ｎ５に対応する重みは最大値に設定されている。よって、ノード装置Ｎ５はＬＤの候補から除外され、ラベルＮ５を有する探索ノード４０８は刈り込まれる。
【０５５８】
結局、ステップＳ１１０では、図６に示すように、ノード装置Ｎ３はＯＬＳであるノード装置Ｎ２へとデータフレームをバックトラックさせている。このステップＳ１１０の動作は、図３０では、探索木４００においてラベルＮ３を有する探索ノード４０３からラベルＮ２を有する探索ノード４０２へのバックトラックとして表現される。換言すれば、探索ノード４０３の子ノードであり、探索ノード４０３の親ノードの探索ノード４０２と同じラベルＮ２を有する探索ノード４０７は、刈り込まれる。
【０５５９】
続いて、ステップＳ１１１で、ノード装置Ｎ２はＬＤとして新たにノード装置Ｎ６を選択し、ノード装置Ｎ６にデータフレームを送信する。ステップＳ１１１の送信は、図３０では、ラベルＮ２を有する探索ノード４０２からラベルＮ６を有する探索ノード４０４へ探索が進むことに対応する。
【０５６０】
そして、ネットワーク１においてノード装置Ｎ６にはノード装置Ｎ７とＮ２が隣接するので、探索ノード４０４は、２つの探索ノード４０９と４１０を子ノードとして有し、探索ノード４０９と４１０それぞれのラベルは、Ｎ７とＮ２である。
【０５６１】
図６においてノード装置Ｎ６は、ＯＬＳであるノード装置Ｎ２ではなく、まずノード装置Ｎ７をＬＤとして選択してデータフレームをステップＳ１１２で送信する。つまり、ラベルＮ２を有する探索ノード４１０は刈り込まれる。そして、ステップＳ１１２の送信により、ＧＤであるノード装置Ｎ７のノードＩＤ・Ｎ７をラベルとして有する探索ノード４０９へと探索が進み、探索が終了する。なお、ステップＳ１１２で探索が終了するので、探索ノード４０２の子ノードである探索ノード４０５は探索されないが、探索ノード４０５は、第１種の刈り込みの対象でもあるから、図３０では便宜的に正方形で表現してある。
【０５６２】
なお、探索木４００において、ルートノードである探索ノード４０１から、以上のようにして探索により見つかったリーフノードである探索ノード４０９に至る、経路上の各探索ノードのラベルを順に並べてタプルで表すと、〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉となる。そして、このタプルは、図６のネットワーク１において学習された経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉である。
【０５６３】
第１実施形態によれば、データフレームが転送されながら動的に経路が探索されるが、その探索順を探索木４００で表すと、図３０のとおり深さ優先探索順である。幅優先探索ではなく深さ優先探索が行われることは、データフレームがマルチキャストされず常にユニキャストされることからも理解される。
【０５６４】
そして、以上の説明から明らかなとおり、ＦＩＤ管理テーブル１０５のエントリのエージング時間Ｇｆが適切に設定されていれば、ネットワーク１内でＧＳからＧＤに至る経路が見つかるまで、潜在的に可能な経路が深さ優先探索により調べつくされる。すなわち、エージング時間Ｇｆが短すぎなければ、ＧＳからＧＤに至る経路が存在さえすれば、経路は必ず見つかる。なお、図１９に関して述べた「最悪ケース」とは、探索木４００の深さ優先探索順でのトラバース（traverse）において、ＧＤのノード装置のノードＩＤをラベルとして有する探索ノードが、一番最後に見つかる場合のことである。
【０５６５】
続いて、さらに別の観点から第１実施形態について説明する。
図３１は、ハローフレームの送受信による隣接ノードの認識と図６の経路選択とを示すタイミングチャートである。
【０５６６】
図１のネットワーク１において、各ノード装置Ｎ１〜Ｎ７は、独立してそれぞれ図１６のハローフレーム送信処理を行う。どのノード装置が先にハローフレームを送信するかは任意であるが、図３１の例では、まずステップＳ１２０１でノード装置Ｎ２が図１６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ２に隣接するノード装置Ｎ１、Ｎ３、およびＮ６でそれぞれ受信される。そして、ノード装置Ｎ１、Ｎ３、およびＮ６は、それぞれ図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ２を隣接ノード装置として認識する。
【０５６７】
また、図３１の例では、続いてステップＳ１２０２で、ノード装置Ｎ４が図１６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ４に隣接するノード装置Ｎ３、Ｎ５、およびＮ７でそれぞれ受信される。そして、ノード装置Ｎ３、Ｎ５、およびＮ７は、それぞれ図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ４を隣接ノード装置として認識する。
【０５６８】
さらに、ステップＳ１２０３では、ノード装置Ｎ３が図１６のステップＳ４０３を実行し、図７のハローフレーム３１２を送信する。すると、ハローフレーム３１２はノード装置Ｎ３に隣接するノード装置Ｎ２、Ｎ４、およびＮ５でそれぞれ受信される。そして、ノード装置Ｎ２、Ｎ４、およびＮ５は、それぞれ図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ３を隣接ノード装置として認識する。
【０５６９】
また、ステップＳ１２０４では、ノード装置Ｎ７が図１６のステップＳ４０３を実行し、ハローフレームを送信する。なお、ステップＳ１２０４の時点では、ノード装置Ｎ４とＮ７の間のリンクには障害がまだ生じていないものとする。よって、ハローフレームはノード装置Ｎ７に隣接するノード装置Ｎ４とＮ６でそれぞれ受信される。そして、ノード装置Ｎ４とＮ６は、それぞれ図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ７を隣接ノード装置として認識する。
【０５７０】
また、ステップＳ１２０５では、ノード装置Ｎ１が図１６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ１に隣接するノード装置Ｎ２で受信される。そして、ノード装置Ｎ２は、図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ１を隣接ノード装置として認識する。
【０５７１】
さらに、ステップＳ１２０６では、ノード装置Ｎ６が図１６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ６に隣接するノード装置Ｎ２とＮ７でそれぞれ受信される。そして、ノード装置Ｎ２とＮ７は、それぞれ図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ６を隣接ノード装置として認識する。
【０５７２】
そして、ステップＳ１２０７では、ノード装置Ｎ５が図１６のステップＳ４０３を実行し、ハローフレームを送信する。すると、ハローフレームはノード装置Ｎ５に隣接するノード装置Ｎ３とＮ４でそれぞれ受信される。そして、ノード装置Ｎ３とＮ４は、それぞれ図１４のステップＳ２０３で図１５のハローフレーム受信処理を呼び出して実行し、ノード装置Ｎ５を隣接ノード装置として認識する。
【０５７３】
以上のステップＳ１２０１〜Ｓ１２０７により、図１および図６に示すネットワーク１内のノード装置Ｎ１〜Ｎ７は、それぞれ隣接ノード装置を認識し、隣接ノード管理テーブル１０３−Ｎ１〜１０３−Ｎ７を更新する。また、図１５に示すように、ノード装置Ｎ１〜Ｎ７は、ハローフレームの受信を契機として、場合によっては重み付けテーブル１０４−Ｎ１〜１０４−Ｎ７）を更新することもある。
【０５７４】
その後、ステップＳ１２０８でノード装置Ｎ４とＮ７の間のリンクに障害が発生する。
また、障害の発生とは関係なく、ステップＳ１０１でノード装置Ｎ１が、ノード装置Ｎ７をＧＤとして指定するデータフレームを、ノード装置Ｎ２をＬＤとして指定して送信する。つまり、ステップＳ１０１でノード装置Ｎ１は、図２７〜２８の処理を行う。
【０５７５】
すると、データフレームを受信したノード装置Ｎ２は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ２がＡＣＫフレームを送信することが、図３１ではステップＳ１０１ａとして表現されている。
【０５７６】
他方、ノード装置Ｎ１は、図２８のステップＳ１１２１でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ１は、ステップＳ１０１ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ１１２１の待機を終え、ステップＳ１１２２とＳ１１２３を実行し、図２８の処理を終える。
【０５７７】
また、ステップＳ１０１ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ２は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ３を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０２に相当する。なお、図７には、ステップＳ１０２で送信されるデータフレーム３０３が例示されている。
【０５７８】
すると、データフレームを受信したノード装置Ｎ３は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図３１ではステップＳ１０２ａとして表現されている。なお、図７には、ステップＳ１０２ａで送信されるＡＣＫフレーム３２２が例示されている。
【０５７９】
他方、ノード装置Ｎ２は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ２は、ステップＳ１０２ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２２の処理を終える。
【０５８０】
また、ステップＳ１０２ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ４を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０３に相当する。なお、図７には、ステップＳ１０３で送信されるデータフレーム３０４が例示されている。
【０５８１】
すると、データフレームを受信したノード装置Ｎ４は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ４がＡＣＫフレームを送信することが、図３１ではステップＳ１０３ａとして表現されている。
【０５８２】
他方、ノード装置Ｎ３は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１０３ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２２の処理を終える。
【０５８３】
また、ステップＳ１０３ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ４は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ７を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０４に相当する。
【０５８４】
しかし、ステップＳ１２０８でノード装置Ｎ４とＮ７の間のリンクには障害が発生しており、データフレームはノード装置Ｎ７に到達しない。そのため、図３１ではステップＳ１０４の矢印は、途中から破線になっている。
【０５８５】
ノード装置Ｎ４は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。しかし、ノード装置Ｎ７からＡＣＫフレームが受信されないため、ノード装置Ｎ４は、定期的に実行している図２６の処理のステップＳ１００３において、ノード装置Ｎ７へのデータフレームの送信が失敗したと認識する。
【０５８６】
その結果、ノード装置Ｎ４は、ステップＳ８２５の待機を終え、ステップＳ８２６、Ｓ８２８、Ｓ８２９、Ｓ８１８の処理を順に実行する。そして、ノード装置Ｎ４は、続くステップＳ８１９において、ＬＤとしてノード装置Ｎ５を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０５に相当する。
【０５８７】
すると、データフレームを受信したノード装置Ｎ５は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ５がＡＣＫフレームを送信することが、図３１ではステップＳ１０５ａとして表現されている。
【０５８８】
他方、ノード装置Ｎ４は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ４は、ステップＳ１０５ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２２の処理を終える。
【０５８９】
また、ステップＳ１０５ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ５は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ３を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０６に相当する。
【０５９０】
すると、データフレームを受信したノード装置Ｎ３は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図３１ではステップＳ１０６ａとして表現されている。
【０５９１】
他方、ノード装置Ｎ５は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ５は、ステップＳ１０６ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２２の処理を終える。
【０５９２】
また、ステップＳ１０６ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ５を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１０７に相当する。
【０５９３】
すると、データフレームを受信したノード装置Ｎ５は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ５がＡＣＫフレームを送信することが、図３１ではステップＳ１０７ａとして表現されている。
【０５９４】
他方、ノード装置Ｎ３は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１０７ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２２の処理を終える。
【０５９５】
また、ステップＳ１０７ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ５は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図２２のステップＳ８１８から図２３のステップＳ８３０へと進み、ノード装置Ｎ５はステップＳ８３０で、ＯＬＳであるノード装置Ｎ４をＬＤとして指定してデータフレームを送信する。ステップＳ８３０での送信が、図３１のステップＳ１０８に相当する。
【０５９６】
すると、データフレームを受信したノード装置Ｎ４は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ４がＡＣＫフレームを送信することが、図３１ではステップＳ１０８ａとして表現されている。
【０５９７】
他方、ノード装置Ｎ５は、図２３のステップＳ８３６でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ５は、ステップＳ１０８ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８３６の待機を終え、ステップＳ８３７とＳ８３９を実行し、図２３の処理を終える。
【０５９８】
また、ステップＳ１０８ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ４は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図２２のステップＳ８１８から図２３のステップＳ８３０へと進み、ノード装置Ｎ４はステップＳ８３０で、ＯＬＳであるノード装置Ｎ３をＬＤとして指定してデータフレームを送信する。ステップＳ８３０での送信が、図３１のステップＳ１０９に相当する。
【０５９９】
すると、データフレームを受信したノード装置Ｎ３は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ３がＡＣＫフレームを送信することが、図３１ではステップＳ１０９ａとして表現されている。
【０６００】
他方、ノード装置Ｎ４は、図２３のステップＳ８３６でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ４は、ステップＳ１０９ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８３６の待機を終え、ステップＳ８３７とＳ８３９を実行し、図２３の処理を終える。
【０６０１】
また、ステップＳ１０９ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ３は、ステップＳ８０４以降の処理を続行する。具体的には、処理が図２２のステップＳ８１８から図２３のステップＳ８３０へと進み、ノード装置Ｎ３はステップＳ８３０で、ＯＬＳであるノード装置Ｎ２をＬＤとして指定してデータフレームを送信する。ステップＳ８３０での送信が、図３１のステップＳ１１０に相当する。
【０６０２】
すると、データフレームを受信したノード装置Ｎ２は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ２がＡＣＫフレームを送信することが、図３１ではステップＳ１１０ａとして表現されている。
【０６０３】
他方、ノード装置Ｎ３は、図２３のステップＳ８３６でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ３は、ステップＳ１１０ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８３６の待機を終え、ステップＳ８３７とＳ８３９を実行し、図２３の処理を終える。
【０６０４】
また、ステップＳ１１０ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ２は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ６を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１１１に相当する。
【０６０５】
すると、データフレームを受信したノード装置Ｎ６は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ６がＡＣＫフレームを送信することが、図３１ではステップＳ１１１ａとして表現されている。
【０６０６】
他方、ノード装置Ｎ２は、図２２のステップＳ８２５でＡＣＫフレームの受信を待っている。そして、ノード装置Ｎ２は、ステップＳ１１１ａで送信されるＡＣＫフレームを受信すると、図１４のステップＳ２０６から図２５の処理を呼び出して実行し、その結果、ステップＳ８２５の待機を終え、ステップＳ８２６とＳ８２７を実行し、図２２の処理を終える。
【０６０７】
また、ステップＳ１１１ａに示すように図２０のステップＳ８０３でＡＣＫフレームを送信したノード装置Ｎ６は、ステップＳ８０４以降の処理を続行し、図２２のステップＳ８１９で、ＬＤとしてノード装置Ｎ７を指定してデータフレームを送信する。ステップＳ８１９での送信が、図３１のステップＳ１１２に相当する。
【０６０８】
すると、データフレームを受信したノード装置Ｎ７は、図１４のステップＳ２０５から図２０〜２３の処理を呼び出して実行する。図２０のステップＳ８０３でノード装置Ｎ７がＡＣＫフレームを送信することが、図３１ではステップＳ１１２ａとして表現されている。
【０６０９】
以上説明した一連の処理により、ネットワーク１全体では、たとえステップＳ１２０８で障害が発生しようとも、ノード装置Ｎ１〜Ｎ７の自律分散協調の結果として、動的に経路〈Ｎ１，Ｎ２，Ｎ６，Ｎ７〉が選択され、学習される。すなわち、以上の一連の処理によりノード装置Ｎ１〜Ｎ６では重み付けテーブル１０４−Ｎ１〜１０４−Ｎ６が更新されている。
【０６１０】
したがって、ステップＳ１１２ａの後には、学習の結果として、ノード装置Ｎ７をＧＤとして指定するデータフレームは、図６のようにネットワーク１内で試行錯誤的にバックトラックしながら転送される代わりに、初めから効率よく転送される。具体例をいくつか挙げれば、下記のとおりである。
【０６１１】
（Ｐ１）ノード装置Ｎ１がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを隣接するノード装置Ｎ２に送信すると、ノード装置Ｎ２は、学習された重み付けテーブル１０４−Ｎ２に基づき、最初からＬＤとしてノード装置Ｎ６を選択する。そして、データフレームはノード装置Ｎ６からＧＤであるノード装置Ｎ７へと送信される。
【０６１２】
（Ｐ２）同様に、ノード装置Ｎ２がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを送信するときも、ノード装置Ｎ２は、学習された重み付けテーブル１０４−Ｎ２に基づき、最初からＬＤとしてノード装置Ｎ６を選択する。そして、データフレームはノード装置Ｎ６からＧＤであるノード装置Ｎ７へと送信される。
【０６１３】
（Ｐ３）ノード装置Ｎ５がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを送信するとき、ノード装置Ｎ５は、学習された重み付けテーブル１０４−Ｎ５に基づき、バックトラックの生じたノード装置Ｎ３ではなく、ノード装置Ｎ４を最初にＬＤとして選択する。以下同様にして、ノード装置Ｎ４はＬＤとしてノード装置Ｎ３を選択し、ノード装置Ｎ３はＬＤとしてノード装置Ｎ２を選択し、ノード装置Ｎ２はＬＤとしてノード装置Ｎ６を選択し、ノード装置Ｎ６はＬＤとしてノード装置Ｎ７を選択する。
【０６１４】
（Ｐ４）ノード装置Ｎ３がＧＳとなって、ノード装置Ｎ７をＧＤとして指定するデータフレームを送信するとき、ノード装置Ｎ３は、学習された重み付けテーブル１０４−Ｎ３に基づき、ノード装置Ｎ２をＬＤとして選択する。したがって、データフレームは、最初から効率よく経路〈Ｎ３，Ｎ２，Ｎ６，Ｎ７〉に沿って転送される。
【０６１５】
以上のように第１実施形態によれば、図６のようにバックトラックによってネットワーク１内で試行錯誤的かつ動的に経路が選択されると、バックトラックの過程で経由した各ノード装置において、重み付けテーブル１０４の重みという形で、適切な経路が学習される。よって、ＧＤとして同じくノード装置Ｎ７が指定されたデータフレームが今後送信される場合には、上記（Ｐ１）〜（Ｐ４）の例のように、学習の結果にしたがって、経路選択が効率化される。
【０６１６】
続いて、有線ネットワークに適用される第２実施形態について説明する。第１実施形態では、図３の受信部１０１と送信部１０２が図４の無線モジュール２０６により実現され、図１のネットワーク１が無線ネットワークである場合を例として説明した。しかし、第２実施形態では、例えば図１や図２のネットワーク１や２が、有線リンクで接続された有線アドホックネットワークであってもよい。以下、具体例について、図３２を参照して説明する。
【０６１７】
図３２は、第２実施形態が適用される有線ネットワークの例を示す図である。図３２のネットワーク４は、複数のノード装置１００ａ〜１００ｉを含み、有線アドホックネットワークの一例である。まず、ノード装置１００ａの構成の概略を説明する。
【０６１８】
なお、ノード装置１００ａ〜１００ｉの構成は同様である。互いに同様のコンポーネントには、「２１１ａ−１」、「２１１ａ−２」、「２１１ｂ−１」などのように、添え字を除いて同じ参照符号を割り当て、詳しい説明を省略することがある。
【０６１９】
ノード装置１００ａ〜１００ｉは、無線モジュール２０６により実現される図３の受信部１０１および送信部１０２の代わりに、有線通信のための物理ポート（以下単に「ポート」という）とＰＨＹチップにより実現される不図示の受信部および送信部を有する。図３２の例では、ノード装置１００ａは、４つのポート２１１ａ−１〜２１１ａ−４を備えるが、ポートの数は実施形態に応じて任意である。
【０６２０】
なお、ポート２１１ａ−１〜２１１ａ−４は、第２実施形態によるフレームの通信を行うためのポートである。つまり、図７に示す第１実施形態と同様のデータフレームが、ポート２１１ａ−１〜２１１ａ−４を介して送受信される。換言すれば、ポート２１１ａ−１〜２１１ａ−４は、ノード装置１００ａが隣接ノード装置と有線接続するためのポートである。
【０６２１】
以下では説明の便宜上、１つのポートに対応して１つのＰＨＹチップがあるものと仮定するが、物理的には１つのＰＨＹチップが４つのポートの入出力処理を行うことも可能である。
【０６２２】
また、第２実施形態ではＡＣＫフレームとハローフレームが使われない。よって、ノード装置１００ａは、図３のＡＣＫ処理部１０７とハローフレーム生成部１１２を含まない。また、詳しくは後述するが、第２実施形態では、フレーム分岐処理部１０６とリンク管理部１０８とデータフレーム処理部１１０の動作の一部が、第１実施形態とは異なる。そして、図９に示す第１実施形態の隣接ノード管理テーブル１０３の代わりに、図３３に示す隣接ノード管理テーブル１０３ａが使われる。
【０６２３】
ところで、第１実施形態では、外部ネットワークとの接続のためにノード装置１００が図４のＰＨＹチップ２０２を備えている場合を例示した。第２実施形態のノード装置１００ａも同様に、外部ネットワークとの接続のため、汎用ＬＡＮポート２１２ａを備えている。
【０６２４】
汎用ＬＡＮポート２１２ａは、例えばイーサネット規格にのっとった有線接続用の物理ポートであり、不図示のＰＨＹチップと接続されている。図３２では、汎用ＬＡＮポート２１２ａ〜２１２ｉを斜線で示して、ポート２１１ａ−１〜２１１ｉ−４とは区別してある。なお、本実施形態における汎用ＬＡＮポート２１２ａ〜２１２ｉは有線ＬＡＮポートであるが、実施形態によっては無線ＬＡＮインタフェイスを代わりに用いることもできる。
【０６２５】
そして、上記のごとき構成を有する各ノード装置１００ａ〜１００ｉは、ネットワーク４において、ケーブル（例えば、銅ケーブルなどの金属線ケーブル、または光ファイバケーブル）により、物理的にはメッシュ状（換言すれば格子状）に接続されている。
【０６２６】
もちろん、ネットワークにおける物理的な接続トポロジは、実施形態に応じて任意であり、必ずしもメッシュ状でなくてもよい。
図３２に示すメッシュ状の物理的なトポロジは、具体的には、次の（Ｑ１）〜（Ｑ１２）のようなケーブル配線により実現されている。
【０６２７】
（Ｑ１）ノード装置１００ａと１００ｄは、ポート２１１ａ−１と２１１ｄ−１の間のリンク５１５により接続されている。
（Ｑ２）ノード装置１００ａと１００ｂは、ポート２１１ａ−４と２１１ｂ−１の間のリンク５１６により接続されている。
【０６２８】
（Ｑ３）ノード装置１００ｂと１００ｅは、ポート２１１ｂ−２と２１１ｅ−２の間のリンク５１７により接続されている。
（Ｑ４）ノード装置１００ｂと１００ｃは、ポート２１１ｂ−４と２１１ｃ−１の間のリンク５１８により接続されている。
【０６２９】
（Ｑ５）ノード装置１００ｃと１００ｆは、ポート２１１ｃ−３と２１１ｆ−３の間のリンク５１９により接続されている。
（Ｑ６）ノード装置１００ｄと１００ｇは、ポート２１１ｄ−２と２１１ｇ−２の間のリンク５２１により接続されている。
【０６３０】
（Ｑ７）ノード装置１００ｄと１００ｅは、ポート２１１ｄ−４と２１１ｅ−１の間のリンク５２２により接続されている。
（Ｑ８）ノード装置１００ｅと１００ｈは、ポート２１１ｅ−３と２１１ｈ−３の間のリンク５２３により接続されている。
【０６３１】
（Ｑ９）ノード装置１００ｅと１００ｆは、ポート２１１ｅ−４と２１１ｆ−１の間のリンク５２４により接続されている。
（Ｑ１０）ノード装置１００ｆと１００ｉは、ポート２１１ｆ−４と２１１ｉ−４の間のリンク５２５により接続されている。
【０６３２】
（Ｑ１１）ノード装置１００ｇと１００ｈは、ポート２１１ｇ−４と２１１ｈ−１の間のリンク５２６により接続されている。
（Ｑ１２）ノード装置１００ｈと１００ｉは、ポート２１１ｈ−４と２１１ｉ−１の間のリンク５２７により接続されている。
【０６３３】
もちろん、実施形態に応じて、図３２に例示した以外の組み合せのポート間をケーブルで接続することで図３２と等価なメッシュトポロジを実現することも可能である。
ところで、図３２の例では、ネットワーク４は孤立したネットワークではなく、ＬＡＮやＷＡＮ（Wide Area
Network）などの外部ネットワークとも接続される。
【０６３４】
例えば、図３２の例では、ネットワーク４は次のようにして外部ネットワークと接続される。すなわち、リンク５１１を介してＰＣ（Personal Computer）５０１と接続されたＬ２ＳＷ（Layer 2
Switch）５０２が、ノード装置１００ａと１００ｂそれぞれの汎用ＬＡＮポート２１２ａと２１２ｂに、それぞれリンク５１２と５１３を介して接続されている。また、ＰＣ５０３、５０５、５０６が、ノード装置１００ｃ、１００ｇ、１００ｈそれぞれの汎用ＬＡＮポート２１２ｃ、２１２ｇ、２１２ｈに、それぞれリンク５１４、５２８、５２９を介して接続されている。
【０６３５】
なお、Ｌ２ＳＷ５０２は、不図示のルータや、不図示の他のＰＣとさらに接続されていてもよい。また、ＰＣ５０３、５０５、および５０６も、不図示の他の外部ネットワークに接続されていてもよい。
【０６３６】
また、説明の便宜上、図３２には９個のノード装置１００ａ〜１００ｉを含むネットワーク４を例示したが、実施形態によっては、例えば数千個〜数十万個といった多数のノード装置を有線アドホックネットワークが含んでいてもよい。
【０６３７】
例えば、いたる所に配置された多数のセンサから様々な情報を収集するためのネットワークであるセンサネットワークに、本実施形態の有線アドホックネットワークが適用されてもよい。その場合、多数のセンサに対応して、有線アドホックネットワークは、数千個〜数十万個のオーダの、多数のノード装置を含んでもよい。センサネットワークでは、例えば、画像センサ、温度センサ、湿度センサ、圧力センサ、加速度センサなど、任意の種類のセンサが利用される。
【０６３８】
図３２も、本実施形態による有線アドホックネットワークの、センサネットワークへの適用例の１つを示している。すなわち、図３２においてノード装置１００ｅと１００ｉそれぞれの汎用ＬＡＮポート２１２ｅと２１２ｉには、ＬＡＮインタフェイスを備えたセンサ５０４と５０７が、それぞれリンク５２０と５３０を介して接続されている。センサ５０４と５０７は、感知した結果を示すデータを、ＬＡＮインタフェイスを介してイーサネットフレームとして出力する。これらのセンサ５０４と５０７の種類は任意である。
【０６３９】
図３２に示すような本実施形態による有線アドホックネットワークを利用すると、無線通信では通信困難な環境でも有線通信ならば通信可能な場合が多いため、過酷な環境においてもセンサネットワークを構築することが可能となる。
【０６４０】
例えば、畑や崖などの土中、水田や河川や海などの水中、建物の壁や柱などの構造物中などに、センサと、汎用ＬＡＮポートを介して当該センサに接続されたノード装置とが埋め込まれてもよい。そのような場合でも、ノード装置は有線接続によって他のノード装置と確実に通信することが可能である。よって、本実施形態による有線アドホックネットワークを利用すると、土中、水中、構造物中などの、無線通信が困難な環境においても、センサネットワークを構築することが可能である。
【０６４１】
続いて、図３２のようなネットワーク４における各ノード装置１００ａ〜１００ｉの構成と動作について、第１実施形態に関する図７〜２９を順に参照しながら、第１実施形態との違いを説明する。
【０６４２】
まず図７を参照すると、第２実施形態では、ハローフレームとＡＣＫフレームが利用されない。その理由は、有線リンクは無線リンクと比べて格段に通信品質が良いからである。つまり、物理ポート間を１対１に接続する有線通信においては、伝送媒体上の搬送波信号が検出されさえすれば、通信は事実上１００％成功する。
【０６４３】
例えば、ノード装置１００ａは、ハローフレームの受信を契機として隣接ノード装置を認識する必要はなく、単にポート２１１ａ−１〜２１１ａ−４を監視して、搬送波信号が検出されるか否かを調べればよい。搬送波信号が検出されれば、隣接ノード装置が存在する。
【０６４４】
また、例えば、ケーブルの切断などによりポート２１１ａ−４がリンクダウン状態でない限り、ノード装置１００ａがポート２１１ａ−４からリンク５１６を介して隣接するノード装置１００ｂにデータフレームを送信すると、送信の成功が保証される。したがってＡＣＫフレームも不要である。
【０６４５】
次に、図８を参照すると、第２実施形態ではＡＣＫフレームが使われないので、バッファ部１０９においてタイムアウト時刻フィールドは不要である。
また、第２実施形態においては、図９のような形式の隣接ノード管理テーブル１０３の代わりに、図３３のような隣接ノード管理テーブル１０３ａが使われる。図３３は、第２実施形態における隣接ノード管理テーブル１０３ａの例を示す図である。
【０６４６】
なお、以下ではノード装置１００ａにおいて、４つのポート２１１ａ−１〜２１１ａ−４をそれぞれ識別するポートＩＤが、各ポート２１１ａ−１〜２１１ａ−４に予め割り当てられているものとする。
【０６４７】
図３３を図９と比較すると、図３３ではポートＩＤフィールドが追加されている点のみが異なる。例えば、図１のネットワーク１が、有線ネットワークである場合、ノード装置Ｎ２の隣接ノード管理テーブル１０３ａ−Ｎ２は、図９と同様にノード装置Ｎ２に隣接する３つのノード装置Ｎ１、Ｎ３、およびＮ６にそれぞれ対応する３つのエントリを有する。そして、各エントリにおいて、ポートＩＤフィールドの値Ｑ２，ｉ（ｉ＝１，３，６）は、「ノード装置Ｎ２においてポートＩＤとしてＱ２，ｉが割り当てられたポートには、ノード装置Ｎｉが接続されている」ということを示す。
【０６４８】
例えば、ノード装置Ｎ２は、あるポートＩＤ・Ｑ２，ｉが割り当てられたポートにおいて受信したデータフレームからＬＳの値Ｎｉを取り出し、取り出した値ＮｉとポートＩＤ・Ｑ２，ｉとを対応付けて、図３３のような隣接ノード管理テーブル１０３ａを作成する。
【０６４９】
次に、図１０と図１１を参照すると、第２実施形態でも重み付けテーブル１０４の形式は第１実施形態と同様である。しかし、第２実施形態では重みの値が「０」と「１」の２値である。
【０６５０】
第１実施形態では、無線リンクの品質も考慮して、より適切な隣接ノード装置をＬＤとして選択するために、ＡＣＫフレームが受信されるか否かに応じて式（６）または（７）により重みが小刻みに調整される。しかし、ポート間が１対１に接続されている有線リンクの状態は、以下の（Ｒ１）と（Ｒ２）の二者択一である。
【０６５１】
（Ｒ１）搬送波信号が検出されているので、事実上１００％通信が成功すると保証されている。
（Ｒ２）搬送波信号が検出されないリンクダウン状態なので、通信が失敗することは明らかである。
【０６５２】
そのため、第２実施形態においては、重みの値は２値でよい。重みの値の操作の詳細は後述する。
続いて図１２と図１３を参照すると、第２実施形態でもＦＩＤ管理テーブル１０５の形式は、第１実施形態と同様である。
【０６５３】
次に図１４を参照すると、第２実施形態では受信したフレームのタイプによるステップＳ２０２での分岐がなく、したがって、ステップＳ２０３とＳ２０６も存在しない。
ただし、第２実施形態では、ステップＳ２０３から呼び出される図１５の処理の代わりに、リンク管理部１０８は、定期的に各ポートの状態を監視する。そして、リンク管理部１０８は、搬送波信号が検出されたポートのポートＩＤを有するエントリが図３３の隣接ノード管理テーブル１０３ａに存在するか否かを調べる。
【０６５４】
エントリが存在すれば、リンク管理部１０８は、見つかったエントリの最終更新時刻フィールドの値を現在時刻に更新する。エントリが見つからなければ、リンク管理部１０８は、新規エントリを作成し、搬送波信号が検出されたポートのポートＩＤと現在時刻を新規エントリに登録する。この段階ではノードＩＤフィールドは空である。
【０６５５】
また、第２実施形態では、図１４のステップＳ２０１でデータフレームが受信されたとき、フレーム分岐処理部１０６はステップＳ２０４の処理に加えて、さらに次の処理を行う。すなわち、フレーム分岐処理部１０６は、データフレームのＬＳの値と、データフレームを受信したポートのポートＩＤとを、リンク管理部１０８に通知する。
【０６５６】
すると、リンク管理部１０８は図３３の隣接ノード管理テーブル１０３ａを検索し、以下の（Ｓ１）〜（Ｓ４）の操作を行う。
（Ｓ１）ノードＩＤフィールドの値がデータフレームのＬＳの値に一致し、かつポートＩＤフィールドの値が、データフレームを受信したポートのポートＩＤに一致するエントリがある場合。
【０６５７】
リンク管理部１０８は、当該エントリの最終更新時刻として現在時刻を設定する。
（Ｓ２）ノードＩＤフィールドが空であり、かつポートＩＤフィールドの値が、データフレームを受信したポートのポートＩＤに一致するエントリがある場合。
【０６５８】
リンク管理部１０８は、当該エントリにおいて、ノードＩＤとしてデータフレームのＬＳの値を設定し、最終更新時刻として現在時刻を設定する。また、図１５における「受信したハローフレームのＬＳの値」の代わりに、受信したデータフレームのＬＳの値を用いて、リンク管理部１０８は、図１５のステップＳ３０５〜Ｓ３０８の処理を行う。
【０６５９】
（Ｓ３）ポートＩＤフィールドの値が、データフレームを受信したポートのポートＩＤに一致するエントリがない場合。
リンク管理部１０８は、隣接ノード管理テーブル１０３ａに新規エントリを作成し、新規エントリに、データフレームのＬＳの値と、データフレームを受信したポートのポートＩＤと、現在時刻を設定する。また、図１５における「受信したハローフレームのＬＳの値」の代わりに、受信したデータフレームのＬＳの値を用いて、リンク管理部１０８は、図１５のステップＳ３０５〜Ｓ３０８の処理を行う。
【０６６０】
（Ｓ４）ノードＩＤフィールドの値がデータフレームのＬＳの値に一致するが、ポートＩＤフィールドの値は、データフレームを受信したポートのポートＩＤに一致しないエントリがある場合。
【０６６１】
リンク管理部１０８は当該エントリを削除する。つまり、リンク管理部１０８はケーブルの接続替えを隣接ノード管理テーブル１０３ａに反映させる。
続いて、図１６を参照して第１実施形態との違いを説明すると、第２実施形態ではハローフレームは使われないので、図１６の処理も行われない。
【０６６２】
また、図１７〜１９の各種エージング処理は、第２実施形態でも第１実施形態と同様である。
第２実施形態において、図２０〜２３のデータフレーム受信処理は次のように変形される。
【０６６３】
図２０において、ステップＳ８０３は省略される。また、図２１のステップＳ８１６では、初期重み付け値として、送信可能であることを示す「０」が使われる。
また、第２実施形態ではＡＣＫフレームが存在しないため、当然、タイムアウトを契機としたＬＤの再選択も行われない。そして、第２実施形態では重みが２値である。したがって、図２２のステップＳ８１８は次のように変形される。すなわち、データフレーム処理部１１０は、取得したＬＤの値に対応する重みが１であるか否かを判断し、当該重みが１ならば処理は図２３のステップＳ８３０に移行し、当該重みが０ならば処理はステップＳ８１９に移行する。
【０６６４】
そして、ステップＳ８１９では、データフレーム処理部１１０は、第１実施形態と同様にして新たなデータフレームを作成して送信部１０２に出力する。すると、第２実施形態の送信部１０２は、隣接ノード管理テーブル１０３ａを参照して、ＬＤとして指定された隣接ノード装置に対応するポートＩＤを特定する。そして、送信部１０２は、データフレーム処理部１１０から受け取った新たなデータフレームを、特定したポートＩＤの割り当てられたポートに出力する。
【０６６５】
その後、第２実施形態ではステップＳ８２０が省略される。ステップＳ８２１〜Ｓ８２４は第１実施形態と同様である。
また、第２実施形態ではＡＣＫフレームがないため、ステップＳ８２５とＳ８２６は省略される。そして、データフレーム処理部１１０は、ステップＳ８１９で送信部１０２に送信を依頼し終わった時点で、「送信成功」と認識し、受信したデータフレームをバッファ部１０９から削除する。
【０６６６】
よって、ステップＳ８２２またはＳ８２４の直後に、データフレーム処理部１１０はステップＳ８２７を実行することになる。ただし、第２実施形態では、ステップＳ８２７において、データフレーム処理部１１０は重みの更新は行わない。なぜなら第２実施形態での重みは０と１の２値であり、重みは０のままでよいからである。
【０６６７】
また、ステップＳ８１９でデータフレーム処理部１１０が既に「送信成功」と認識しているので、ステップＳ８２８とＳ８２９は、第２実施形態では存在しない。
そして、図２３では、ステップＳ８３０での送信が、ステップＳ８１９と同様に変形される。また、ステップＳ８３６およびＳ８３７は、ステップＳ８２５およびＳ８２６と同様に省略される。ステップＳ８３８はステップＳ８２８と同様に省略される。そして、ステップＳ８３９では、ステップＳ８２７と同様に、重みの更新が省略され、最終更新時刻のみが更新される。
【０６６８】
そして、第２実施形態ではＡＣＫフレームが存在しないので、図２５と２６の処理も存在しない。
また、図２７〜２８のデータフレーム送信処理は、第２実施形態では次のように変形される。
【０６６９】
図２７のステップＳ１１０１〜Ｓ１１１０は第１実施形態と同様である。しかし、図２８のステップＳ１１１１は、ステップＳ８１８と同様に変形される。すなわち、データフレーム処理部１１０はステップＳ１１１１において、取得したＬＤの値に対応する重みが１であるか否かを判断し、当該重みが１ならば処理はステップＳ１１１２に移行し、当該重みが０ならば処理はステップＳ１１１４に移行する。
【０６７０】
また、ステップＳ１１１４での送信はステップＳ８１９と同様に変形され、受信したデータフレームは、新たなデータフレームの送信後すぐにバッファ部１０９から削除される。よってステップＳ１１１５は省略される。
【０６７１】
ステップＳ１１１６〜Ｓ１１２０は第１実施形態と同様だが、ステップＳ１１２１、Ｓ１１２２、Ｓ１１２４、およびＳ１１２５は第２実施形態には存在しない。また、ステップＳ１１２３はステップＳ８２７と同様に変形される。すなわち、データフレーム処理部１１０はステップＳ１１２３において、重みは更新せず、最終更新時刻のみを更新する。
【０６７２】
また、図２９の処理は図２３の処理と同様に、第２実施形態において変形される。
続いて、第３実施形態について説明する。第３実施形態は、第１および第２実施形態を合わせた実施形態であり、有線接続と無線接続が混在するネットワークに適用される実施形態である。
【０６７３】
具体的には、第３実施形態では、下記の３種類のノード装置がネットワーク内に混在している。
（Ｔ１）第１実施形態のノード装置１００のように無線リンクを介して隣接ノード装置と通信を行う、無線タイプのノード装置。
【０６７４】
（Ｔ２）第２実施形態のノード装置１００ａ〜１００ｈのように有線リンクを介して隣接ノード装置と通信を行う、有線タイプのノード装置。
（Ｔ３）第１実施形態のノード装置１００のように無線モジュール２０６により実現される受信部１０１および送信部１０２を有し、さらに、第２実施形態のノード装置１００ａ〜１００ｈのように有線接続用のポートとＰＨＹチップを備える、混合タイプのノード装置。つまり、無線リンクを介して隣接ノード装置と通信を行うこともでき、かつ有線リンクを介して隣接ノード装置と通信を行うこともできる、混合タイプのノード装置。
【０６７５】
なお、混合タイプのノード装置においては、例えば、図３３のような隣接ノード管理テーブルが使われてもよい。その場合、ポートＩＤフィールドには、有線リンクを介した隣接ノード装置に関しては、ポートＩＤの値が格納され、無線リンクを介した隣接ノード装置に関しては、ポートＩＤとしては利用されない特定の値が格納されてもよい。混合タイプのノード装置は、無線リンクを介したフレームの送受信に関しては、第１実施形態のノード装置１００と同様に動作し、有線リンクを介したデータフレームの送受信に関しては、第２実施形態のノード装置１００ａ〜１００ｈと同様に動作する。
【０６７６】
続いて、第４実施形態について説明する。第４実施形態は、ＡＣＫフレームを利用しないように、無線ネットワークに関する第１実施形態を変形した実施形態である。
ここで、まず先に、無線ネットワークにおいてＡＣＫフレームを利用しないことの意味について説明する。
【０６７７】
一般に、ＡＣＫフレームを利用することで、データフレームが隣接ノード装置に成功裡に到達したという到達保証が得られる。しかし、データフレームに対してＡＣＫフレームを返信することで、レイテンシの増大、実質的なスループットの低下といった影響が出るので、ネットワークシステム全体としてパフォーマンスが低下することもある。
【０６７８】
また、図２２に示すように、ＡＣＫフレームが受信されないことが原因でノード装置１００が次々と別の隣接ノード装置をＬＤとして選択する場合がある。すると、経路が次々と切り替わり、結果として、同じＧＳから同じＧＤへと宛てられた複数のデータフレーム間で、順序が保たれない可能性がある。つまり、複数のデータフレームがＧＳから送信された順序と、それら複数のデータフレームがＧＤに到達する順序が異なるかもしれない。
【０６７９】
他方で、無線ネットワークにおいてＡＣＫフレームをなくすと、データフレームが隣接ノード装置に到達するという保証はされなくなるが、逆に、ＧＤへの到達順序は保たれる。
【０６８０】
つまり、到達保証と順序保証はトレードオフの関係にある。よって、ネットワークの用途、あるいはデータフレームのペイロードに何のプロトコルのＰＤＵが含まれるか、といった要素を考慮して、無線ネットワークにおいてＡＣＫフレームを利用するか否かが決められてもよい。
【０６８１】
例えば、データフレームのペイロードがイーサネットフレームであり、イーサネットフレームのペイロードがＩＰデータグラムであり、ＩＰデータグラムのペイロードがＴＣＰ（Transmission Control Protocol）セグメントである、という場合がありうる。この場合、ＴＣＰは、ＴＣＰセグメントがドロップすることを前提に設計されているので、ＡＣＫフレームによる到達保証はなくてもよい。つまり、到達しないデータフレームがあったとしても、上位層のプロトコルであるＴＣＰにより、再送制御が行われるので、問題は生じない。逆に、ＴＣＰでは順序保証が必要である。
【０６８２】
よって、ＡＣＫフレームを利用しない第４実施形態は、例えば上記のようにＴＣＰセグメントが図７のデータフレーム３０１のペイロードの中に含まれている場合などに好適である。
【０６８３】
具体的には、第４実施形態は、ＡＣＫフレームが存在しないという点で第２実施形態と同様である。ただし、第４実施形態では、隣接ノード装置は第１実施形態と同様にハローフレームを利用して管理される。
【０６８４】
よって、第４実施形態では、図１４からステップＳ２０６が省略されるが、図１５〜１９の処理は第１実施形態と同様である。また、図２０では第２実施形態と同様にステップＳ８０３が省略されるが、続く図２１の処理は第１実施形態と同様である。
【０６８５】
図２２において、ステップＳ８１８は第２実施形態と同様に変形され、ステップＳ８１９は第１実施形態と同様である。ただし、第４実施形態でデータフレーム処理部１１０は、ステップＳ８１９で送信部１０２に送信を依頼し終わった時点で、「送信成功」と認識し、受信したデータフレームをバッファ部１０９から削除する。よって、ステップＳ８２０は第２実施形態と同様に省略される。
【０６８６】
ステップＳ８２１〜Ｓ８２４は第１実施形態と同様である。そして、ステップＳ８２５とＳ８２６は第２実施形態と同様に省略される。よって、ステップＳ８２２またはＳ８２４の直後に、データフレーム処理部１１０はステップＳ８２７を実行することになり、ステップＳ８２８とＳ８２９は存在しない。したがって、重みが式（７）により更新されることはない。
【０６８７】
なお、ステップＳ８２７は第１実施形態と同様でもよいし、第２実施形態と同様に重みの更新が省略されたステップであってもよい。
そして、図２３では、ステップＳ８３０での送信が、ステップＳ８１９と同様に変形される。また、ステップＳ８３６およびＳ８３７は、ステップＳ８２５およびＳ８２６と同様に省略され、ステップＳ８３８はステップＳ８２８と同様に省略される。ステップＳ８３９は、第１実施形態と同様でもよいし、第２実施形態と同様に重みの更新が省略されたステップであってもよい。
【０６８８】
第４実施形態ではＡＣＫフレームが存在しないので、図２５と２６の処理も存在しない。
また、図２７〜２８のデータフレーム送信処理は、第４実施形態では次のように変形される。
【０６８９】
図２７のステップＳ１１０１〜Ｓ１１１０は第１実施形態と同様であるが、図２８のステップＳ１１１１は、ステップＳ８１８と同様に変形される。すなわち、データフレーム処理部１１０はステップＳ１１１１において、取得したＬＤの値に対応する重みが１であるか否かを判断し、当該重みが１ならば処理はステップＳ１１１２に移行し、当該重みが０ならば処理はステップＳ１１１４に移行する。
【０６９０】
また、ステップＳ１１１４での送信はステップＳ８１９と同様に変形され、受信したデータフレームは、新たなデータフレームの送信後すぐにバッファ部１０９から削除される。よってステップＳ１１１５は省略される。
【０６９１】
ステップＳ１１１６〜Ｓ１１２０は第１実施形態と同様だが、ステップＳ１１２１、Ｓ１１２２、Ｓ１１２４、およびＳ１１２５は第４実施形態には存在しない。したがって、重みが式（７）により更新されることはない。
【０６９２】
また、ステップＳ１１２３は、第１実施形態と同様でもよいし、第２実施形態と同様に重みの更新が省略されたステップであってもよい。
また、図２９の処理は図２３の処理と同様に、第４実施形態において変形される。
【０６９３】
続いて、第５実施形態について説明する。第５実施形態は、第１実施形態と第４実施形態を折衷した実施形態であり、ＡＣＫフレームの頻度が調整される実施形態である。
すなわち、第５実施形態では、ＡＣＫフレームを要求する第１種のデータフレームと、ＡＣＫフレームを要求しない第２種のデータフレームが利用される。第１種と第２種のデータフレームは、図７に示すタイプフィールドの値により区別される。
【０６９４】
例えば、第１種のデータフレームのタイプフィールドには、図７のデータフレーム３０３と同様に、所定の定数Ｄが指定され、第２種のデータフレームのタイプフィールドには、別の定数Ｃが指定される。具体的には、タイプフィールドが２ビットのとき、例えば、Ｄ＝（００）２かつＣ＝（０１）２でもよい。
【０６９５】
ところで、ＡＣＫフレームを利用する目的の１つは、第４実施形態に関して述べたとおり到達保証であるが、他の目的は、リンクの品質の良さの把握のためである。
一般に、ノード装置ＮｉとＮｊの間の無線リンクＬｉ，ｊの通信品質が非常に悪ければ、ノード装置Ｎｉからノード装置Ｎｊへ（あるいはノード装置Ｎｊからノード装置Ｎｉへ）の無線リンクＬｉ，ｊを介した通信はほぼ不可能である。ハローフレームのようにごく短いフレームでさえも、非常に通信品質の悪い無線リンクＬｉ，ｊを介してノード装置Ｎｉからノード装置Ｎｊへ（あるいはノード装置Ｎｊからノード装置Ｎｉへ）到達することは難しい。
【０６９６】
他方、ノード装置ＮｉとＮｊの間の無線リンクＬｉ，ｊの通信品質が非常に良ければ、データフレームのように長いフレームでさえも、無線リンクＬｉ，ｊを介してノード装置Ｎｉからノード装置Ｎｊへ（あるいはノード装置Ｎｊからノード装置Ｎｉへ）成功裡に到達する。
【０６９７】
しかし、ノード装置ＮｉとＮｊの間の無線リンクＬｉ，ｊの通信品質が中程度であれば、「ごく短いフレームに関しては無線リンクＬｉ，ｊを介した送信が成功するが、長いフレームに関しては無線リンクＬｉ，ｊを介した送信が失敗する」という場合もありうる。図２２のステップＳ８２６などで送信失敗と判断される場合の中には、一時的にリンクに障害が発生じた場合だけでなく、上記のように、無線リンクの通信品質が、ハローフレームの送信には十分だがデータフレームの送信には不十分である場合も含まれる。
【０６９８】
ここで図２２のステップＳ８２７とＳ８２８に注目すると、ＡＣＫフレームが受信されるか否かによって、重みが漸減または漸増する。よって、学習された結果の重みの値は、ＡＣＫフレームが受信される割合を反映しており、すなわち、通信品質の良さを反映している。つまり、通信品質が良いリンクを介して隣接しているノード装置に対応する重みほど、値が小さく、したがって、ＬＤとしてより優先的に選択される。
【０６９９】
さて、このようにＡＣＫフレームは、到達保証のほかにリンクの品質の良さの把握のためにも使えるが、第４実施形態に関して述べたとおり、ネットワークシステム全体のパフォーマンス低下を招くこともある。そこで、第５実施形態では、上記のように第１種と第２種のデータフレームが使われる。
【０７００】
例えば、ノード装置１００は、基本的にはパフォーマンス向上のために第２種のデータフレームを利用し、時々、リンクの品質の良さを把握するために抜き打ち検査的に第１種のデータフレームを利用してもよい。あるいは、上位層のプロトコルなどに応じて、ＧＳとしてデータフレームを送信するノード装置１００が、第１種と第２種のどちらが適切かを判断して、データフレームのタイプフィールドに値を設定してもよい。
【０７０１】
第５実施形態には、例えば、以下の（Ｕ１）〜（Ｕ４）のような、様々なバリエーションがありうる。
（Ｕ１）ＧＳとしてデータフレームを送信するノード装置１００において、データフレーム処理部１１０は、最後にデータフレームを送信した時刻Ｔｌａｓｔを記憶する。そして、データフレームの送信時に、現在時刻Ｔｎｏｗと最終送信時刻Ｔｌａｓｔの差が所定の間隔Ｉａｃｋ以上である場合のみ、データフレーム処理部１１０は、第１種を示す所定の値Ｄをデータフレームのタイプフィールドに設定する。その他の場合、データフレーム処理部１１０は、第２種を示す所定の値Ｅをデータフレームのタイプフィールドに設定する。例えば、間隔Ｉａｃｋは、１０秒などの比較的長い時間でもよい。
【０７０２】
（Ｕ２）ＧＳとしてデータフレームを送信するノード装置１００において、データフレーム処理部１１０は、ＧＤごと、あるいは選択したＬＤごとに、時刻Ｔｌａｓｔを記憶するようにして、上記（Ｕ１）と同様に動作してもよい。
【０７０３】
（Ｕ３）ＧＳとしてデータフレームを送信するノード装置１００において、データフレーム処理部１１０は、送信したデータフレームの数Ｃを数える。つまり、データフレームの送信時に、データフレーム処理部１１０はＣをインクリメントする。数えた値Ｃが所定の値Ｃａｃｋと等しい場合のみ、データフレーム処理部１１０は、第１種を示す所定の値Ｄをデータフレームのタイプフィールドに設定し、Ｃをゼロにリセットする。その他の場合、データフレーム処理部１１０は、第２種を示す所定の値Ｅをデータフレームのタイプフィールドに設定する。例えば、所定の値Ｃａｃｋは、数千といった比較的大きな数でもよい。
【０７０４】
（Ｕ４）ＧＳとしてデータフレームを送信するノード装置１００において、データフレーム処理部１１０は、ＧＤごと、あるいは選択したＬＤごとに、送信したデータフレームの数Ｃを数えるようにして、上記（Ｕ３）と同様に動作してもよい。
【０７０５】
なお、隣接ノード装置から受信したデータフレームを転送するノード装置１００において、データフレーム処理部１１０は、受信したデータフレームに指定されたタイプの値をそのまま、送信するデータフレームのタイプフィールドにコピーする。
【０７０６】
あるいは、選択したＬＤに対応付けられた重みの値に応じて、データフレーム処理部１１０は、タイプフィールドの値を書き換えてもよい。例えば、選択したＬＤに対応付けられた重みが所定の閾値以上の場合、リンク品質が悪いと推測される。そこで、データフレーム処理部１１０は、受信したデータフレームにおけるタイプフィールドの値にかかわらず、送信するデータフレームのタイプフィールドに、第２種を示す所定の値Ｅを設定してもよい。
【０７０７】
または、タイプフィールドが３ビット以上で表され、データフレームに以下の（Ｖ１）〜（Ｖ４）のような複数のサブタイプがあってもよい。
（Ｖ１）ＡＣＫフレームを要求しており、中継時のタイプフィールドの値の書き換えが許されないデータフレーム。
【０７０８】
（Ｖ２）ＡＣＫフレームを要求しており、中継時のタイプフィールドの値の書き換えが許されるデータフレーム。
（Ｖ３）ＡＣＫフレームを要求せず、中継時のタイプフィールドの値の書き換えが許されないデータフレーム。
【０７０９】
（Ｖ４）ＡＣＫフレームを要求せず、中継時のタイプフィールドの値の書き換えが許
されるデータフレーム。
以上、第１〜第５実施形態について詳細に説明したが、これらの実施形態の利点の理解を助けるため、続いて第１および第２比較例について説明する。なお、以下では説明の便宜上、「受信したデータフレームのＧＳとＦＩＤの値が、過去に送信したデータフレームのＧＳとＦＩＤの値に等しいのか否か」という判定（つまり図２１のステップＳ８０７）を、「ループ判定」と称する。
【０７１０】
図３４と図３５は、ループ判定があるがバックトラック動作のない第１比較例について説明する図である。図３４と図３５には、図６と同様に、図１のネットワーク１におけるデータフレームの転送の様子が示されている。
【０７１１】
第１比較例のノード装置は、第１実施形態と同様のＦＩＤ管理テーブルを有し、ループ判定を行う。つまり、図２１のステップＳ８０９と同様に、第１比較例のノード装置も、過去に送信したデータフレームが受信された場合、送信の際に選択したＬＤに対応する重みを最大値に設定する。
【０７１２】
しかし、第１比較例のノード装置は、バックトラック動作を行わない。つまり、第１比較例のノード装置では、ＦＩＤ管理テーブルのＯＬＳフィールドは、ＯＬＳにあたるノード装置をＬＤの候補から除外するために参照される（図２１のステップＳ８１７と図２２のステップＳ８２９を参照）だけである。そして、第１比較例では、図２３のステップＳ８３０〜Ｓ８３９の処理の代わりに、単にステップＳ８３８と同様に、受信したデータフレームを破棄する処理だけが行われる。
【０７１３】
よって、図１のノード装置Ｎ１〜Ｎ７がいずれも第１比較例のノード装置である場合に、ノード装置Ｎ１がＧＤとしてノード装置Ｎ７を指定し、ノード装置Ｎ４とＮ７の間のリンクに障害が発生していると、データフレームは図３４または図３５のように転送される。
【０７１４】
図３４において、ステップＳ１０６までは図６の第１実施形態と同様なので、説明を省略する。
第１実施形態と同様に、ステップＳ１０６でデータフレームを受信したノード装置Ｎ３は、ステップＳ１０３でＬＤとして選択したノード装置Ｎ４に対応する重みを１に設定する。そして、新たにノード装置Ｎ５をＬＤとして選択し、ステップＳ１０７でデータフレームを送信する。
【０７１５】
すると、ステップＳ１０７でデータフレームを受信したノード装置Ｎ５は、ＦＩＤ管理テーブルに基づいて、ステップＳ１０６で送信したのと同じデータフレームが受信されたと認識する。そして、ノード装置Ｎ５は、ステップＳ１０６でＬＤとして選択したノード装置Ｎ３の重みを最大値に設定する。
【０７１６】
ここで、ノード装置Ｎ５には、ＯＬＳであるノード装置Ｎ４と、重みが最大値に設定されたノード装置Ｎ３しか隣接していない。よって、ノード装置Ｎ５は、ＬＤとして選択可能な隣接ノード装置がないと判断し、ステップＳ１０７で受信したデータフレームを破棄する。こうしてデータフレームは、ＧＤであるノード装置Ｎ７に到達することなく、ネットワーク１から消滅してしまう。
【０７１７】
そして、ノード装置Ｎ３にとっては、「ステップＳ１０７の送信の後、どの隣接ノード装置からも同じデータフレームが返ってこない」という状況である。よって、ノード装置Ｎ３は、「ＧＤとしてノード装置Ｎ７が指定されているデータフレームの送信時にＬＤとしてノード装置Ｎ５を選択することは適切である」と誤った学習をしてしまう。同様に、
ノード装置Ｎ２も、「ＧＤとしてノード装置Ｎ７が指定されているデータフレームの送信時にＬＤとしてノード装置Ｎ３を選択することは適切である」と誤った学習をしてしまう。
【０７１８】
つまり、第１実施形態の図６の例では、ステップＳ１０９やＳ１１０のバックトラック動作によって誤った学習結果が正されるが、第１比較例では、誤った学習結果が正されない。
【０７１９】
すると、図３４のデータフレームの転送の後、再度ノード装置Ｎ１がＧＤとしてノード装置Ｎ７を指定し、ノード装置Ｎ４とＮ７の間のリンクは障害から復旧していないとすると、次は図３５のようにデータフレームが転送される。
【０７２０】
図３５のステップＳ１０１とＳ１０２は図６と同様なので説明を省略する。ステップＳ１０２でデータフレームを受信したノード装置Ｎ３は、図３４での学習の結果に基づいて、ステップＳ１０３ｂでＬＤとしてノード装置Ｎ５を選択し、データフレームを転送する。
【０７２１】
すると、図３４のステップＳ１０７の受信により、「ＧＤとしてノード装置Ｎ７が指定されている場合、ＬＤとしてノード装置Ｎ３は選択不能である」と学習したノード装置Ｎ５は、他の隣接ノード装置Ｎ４をＬＤとして選択する。そして、ノード装置Ｎ５は、ノード装置Ｎ４をＬＤとして指定して、ステップＳ１０４ｂでデータフレームを送信する。
【０７２２】
この時点のノード装置Ｎ４において、ＧＤであるノード装置Ｎ７に対応する重み付けテーブルでは、図３４のステップＳ１０４で送信失敗と判定されて値が増やされたノード装置Ｎ７の重みよりも、ノード装置Ｎ３の重みの方が、値が小さいとする。すると、ード装置Ｎ４は、ノード装置Ｎ３をＬＤとして選択し、ステップＳ１０５ｂでデータフレームを送信する。
【０７２３】
すると、ノード装置Ｎ３は、ステップＳ１０３ｂで送信したのと同じデータフレームが受信されたと認識し、ノード装置Ｎ５の重みを最大値に設定する。そして、ノード装置Ｎ３は、まだＬＤとして選択していない隣接ノード装置Ｎ４を新たにＬＤとして選択し、ステップＳ１０６ｂでデータフレームを送信する。
【０７２４】
すると、データフレームを受信したノード装置Ｎ４は、ステップＳ１０５ｂで送信したのと同じデータフレームが受信されたと認識し、ノード装置Ｎ３の重みを最大値に設定する。その結果、ノード装置Ｎ４は、ＬＤとして選択可能な隣接ノード装置が残っていないと判断し、ステップＳ１０６ｂで受信したデータフレームを破棄する。こうしてデータフレームは、ＧＤであるノード装置Ｎ７に到達することなく、ネットワーク１から消滅してしまう。
【０７２５】
しかしながら、ノード装置Ｎ２にとっては、「ステップＳ１０２の送信の後、どの隣接ノード装置からも同じデータフレームが返ってこない」という状況である。よって、ノード装置Ｎ２は、「ＧＤとしてノード装置Ｎ７が指定されているデータフレームの送信時にＬＤとしてノード装置Ｎ３を選択することは適切である」と誤った学習をしてしまう。
【０７２６】
よって、その後もノード装置Ｎ２は、ＧＤとしてノード装置Ｎ７が指定されているデータフレームの送信時にＬＤとしてノード装置Ｎ３を選択し続ける。そのため、ード装置Ｎ４とＮ７の間のリンクが障害から復旧しない限り、データフレームはネットワーク内で消滅してしまう。
【０７２７】
以上のように、ノード装置がループ判定を行ったとしても、バックトラック動作を行わなければ、ＧＳのノード装置は、データフレームがネットワーク内で破棄されて消滅することを認識せずに、データフレームを送り続ける。その結果、送り続けられるデータフレームは、ネットワークのどこかで廃棄し続けられる。よって、第１比較例は、好ましくない。
【０７２８】
図３５は、擬似的なバックトラック動作は行うがループ判定を行わない第２比較例について説明する図である。
第２比較例のノード装置は、ＦＩＤ管理テーブル１０５を持たず、ループ判定も行わない。また、第２比較例のノード装置は、擬似的なバックトラック動作を行う。
【０７２９】
すなわち、第２比較例のノード装置は、ＧＤとして自ノード装置以外が指定されたデータフレームを受信すると、データフレームのＬＳ以外の隣接ノード装置のうち、最大値でない重みと対応付けられているものをＬＤとして選択し、データフレームを送信する。そして、第２比較例のノード装置は、送信が成功するまで順次、選択可能な隣接ノードを選択してゆく。
【０７３０】
その結果、重みが最大値の隣接ノードおよび受信したデータフレームのＬＳ以外の、すべての隣接ノード装置をＬＤとして試しても送信が成功しなかった場合に、第２比較例のノード装置は、受信したデータフレームのＬＳへとデータフレームを返送する。この返送が、第２比較例における擬似的なバックトラック動作である。
【０７３１】
図３５において、ステップＳ１０１〜Ｓ１０６は第１実施形態の図６と同様であるから、説明を省略する。
第２比較例のノード装置はＦＩＤ管理テーブル１０５を持たず、ループ判定を行わない。よって、ノード装置Ｎ３は、ステップＳ１０６でデータフレームを受信すると、ステップＳ１０３と同様にして再度ノード装置Ｎ４をＬＤとして選択し、ステップＳ１０７ｂでデータフレームを送信する。
【０７３２】
すると、やはりＦＩＤ管理テーブル１０５を持たないノード装置Ｎ４は、ステップＳ１０７ｂでデータフレームを受信すると、ステップＳ１０５と同様にして再度ノード装置Ｎ５をＬＤとして選択し、ステップＳ１０８ｂでデータフレームを送信する。
【０７３３】
以下同様にして、ループ判定が行われない第２比較例においては、閉路〈Ｎ３，Ｎ４，Ｎ５〉内でデータフレームが永遠に転送され続けるという、無限ループに陥ってしまう。よって、第２比較例も好ましくない。
【０７３４】
それに対し、第１〜第５実施形態のノード装置は、ループ判定とバックトラック動作をともに行うので、アドホックネットワークに適した装置である。
なお、上記で説明した各実施形態は、互いに矛盾しない限り、適宜組み合わせることが可能である。例えば、第３実施形態と第５実施形態を組み合わせた実施形態（すなわち、有線接続と無線接続が混在するネットワークにおいて、ＡＣＫフレームの頻度調整が行われる実施形態）などが可能である。
【０７３５】
また、本発明は上記の実施形態に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
変形の第１の観点は、データ構造である。図８〜１３はテーブル形式で表されているが、実施形態に応じて、各種データの形式は任意であり、テーブル、有限ＦＩＦＯ（First In First Out）、線形リストなど任意のデータ構造を利用することができる。
【０７３６】
例えば、ＦＩＤ管理テーブル１０５は、有限ＦＩＦＯにより実現されてもよい。この場合、エントリは、古いものから順に、有限ＦＩＦＯから追い出される。よって、図１９に示すＦＩＤ管理テーブル１０５のエージング処理は不要である。したがって、ＦＩＤ管理テーブル１０５の最終更新時刻フィールドも不要である。
【０７３７】
具体的には、図２２のステップＳ８２２、図２３のステップＳ８３３、図２８のステップＳ１１１８、および図２９のステップＳ８３３ａにおいて、既存のエントリを更新する代わりに、新規エントリの作成と、作成した新規エントリでの値の設定が行われてもよい。
【０７３８】
例えば、ステップＳ８２２は、以下の（Ｗ１）〜（Ｗ３）の処理に置き換えられる。
（Ｗ１）データフレーム処理部１１０は、ＦＩＤ管理テーブル１０５に新規エントリを作成する。
【０７３９】
（Ｗ２）データフレーム処理部１１０は、受信したデータフレームのＧＳとＦＩＤに等しい値をＧＳおよびＦＩＤとして有する既存のエントリから、ＦＩＤ、ＧＳ、ＯＬＳの各フィールドの値を新規エントリにコピーする。
【０７４０】
（Ｗ３）データフレーム処理部１１０は、送信したデータフレームのＬＤの値を新規エントリのＬＤとして設定する。
なお、図２１のステップＳ８０６、図２３のステップＳ８３１、図２８のステップＳ１１１６、および図２９のステップＳ８３１ａでは、有限ＦＩＦＯの最も新しいエントリから古いエントリへと向かう順で、各エントリが順々に調べられる。
【０７４１】
変形の第２の観点は、重みの表現である。重みを表す数値の範囲は実施形態によって任意である。例えば、上記の例のように０から１の範囲の値で重みを表す代わりに、０から２５５の範囲の整数により重みを表してもよい。また、上記各実施形態では、優先度が高いほど重みの値は小さいが、実施形態によっては逆に、優先度が高いほど重みの値が大きくてもよい。その場合、重みを変更する各ステップの動作が適宜変更される。
【０７４２】
変形の第３の観点は、ポーリング処理と割り込み処理の置き換えである。例えば、タイマＩＣ２０３は、データフレームの送信の後ＡＣＫフレームが返信されないときにタイムアウトするための割り込み信号を出力することもできる。つまり、図２６のようにＡＣＫ処理部１０７がバッファ部１０９の各エントリの最終更新時刻の値をポーリングにより調べる代わりに、バッファ部１０９の各エントリの最終更新時刻になったらタイマＩＣ２０３が割り込み信号を発するような実施形態も可能である。
【０７４３】
変形の第４の観点は、隣接ノード装置の管理に関する。
他のノード装置がハローフレームを送信する間隔が既知の場合、リンク管理部１０８は、現在隣接ノード装置として認識しているノード装置から次にハローフレームを受信する時刻を予測することができる。例えば、ネットワーク内のすべてのノード装置においてハローフレームの送信間隔ΔＴｈｅｌｌｏが等しい場合には、他のノード装置がハローフレームを送信する間隔が既知である。
【０７４４】
また、図７のハローフレーム３１１の代わりに、ハローフレームの送信間隔を示すフィールドをさらに有する別の形式のハローフレームが使われてもよい。その場合、リンク管理部１０８は、受信済みのハローフレームから、隣接ノード装置から次にハローフレームを受信する時刻を予測することができる。
【０７４５】
このように、他のノード装置がハローフレームを送信する間隔が既知の場合は、例えば、隣接ノード管理テーブル１０３（図９参照）において、最終更新時刻フィールドが省略され、代わりに次のようなフィールドが追加されてもよい。
【０７４６】
（Ｘ１）ハローフレームの受信に連続して失敗した回数を記録するための連続失敗回数フィールド
（Ｘ２）次にハローフレームが受信されると予測される時刻を記録するための予測時刻フィールド
そして、リンク管理部１０８は、図１５のステップＳ３０２とＳ３０４で、現在時刻を最終更新時刻として設定する代わりに、連続失敗回数の値を０にクリアし、ハローフレームの既知の送信間隔を現在時刻に足した時刻を、予測時刻として設定してもよい。また、図１７のステップＳ５０２の代わりに、次のような処理が行われてもよい。
【０７４７】
すなわち、注目エントリの予測時刻フィールドの値が現在時刻よりも前の時刻を示す場合、リンク管理部１０８は、注目エントリの連続失敗回数の値をインクリメントし、予測時刻フィールドの値を、ハローフレームの既知の送信間隔の分だけ後ろにずらす。そして、注目エントリの連続失敗回数の値が所定の回数（例えば３回）以上であれば、処理はステップＳ５０３に移行し、注目エントリの連続失敗回数の値が所定の回数未満であれば、処理はステップＳ５０５に移行する。
【０７４８】
また、隣接ノード装置の管理という上記第４の観点から、上記各実施形態は、次のように変形されてもよい。
すなわち、データフレームの受信時にも、受信したデータフレームのＬＳの値に基づいて、ハローフレーム受信処理と同様にして、必要に応じてリンク管理部１０８が隣接ノード管理テーブル１０３と重み付けテーブル１０４を更新してもよい。同様に、ＡＣＫフレームの受信時にも、受信したＡＣＫフレームのＬＳの値に基づいて、ハローフレーム受信処理と同様にして、必要に応じてリンク管理部１０８が隣接ノード管理テーブル１０３と重み付けテーブル１０４を更新してもよい。
【０７４９】
変形の第５の観点は、ＬＤを選択する際の基準である。すなわち、上記の各実施形態では、データフレームの送信時に重みに基づいてＬＤが選択されるが、ＬＤの選択において、さらにリンク品質が考慮されてもよい。例えば、ノード装置１００は、受信電波強度などに基づいて無線リンクのリンク品質を計測してもよい。そして、データフレーム処理部１１０は、重みとリンク品質の関数として表される評価値に基づいてＬＤを選択してもよい。
【０７５０】
変形の第６の観点は、ＡＣＫフレームが受信されないときの処理に関する。
例えば、図２２のステップＳ８２９では、一度ステップＳ８２６で「送信失敗」と判断された隣接ノード装置が、ＬＤの候補から除外されている。しかし、一度ステップＳ８２６で「送信失敗」と判断された隣接ノード装置も候補から除外せず、ステップＳ８２９で選択可能とする実施形態も可能である。
【０７５１】
その場合、ステップＳ８１８は次のように変形される。すなわち、データフレーム処理部１１０は、取得したＬＤの値に対応する重みが最大値であるか否かを判断する。そして、当該重みが最大値のとき、処理は図２３のステップＳ８３０に移行し、当該重みが最大値未満のとき、処理はステップＳ８１９に移行する。
【０７５２】
同様に、図２８のステップＳ１１２５も、一度ステップＳ１１２２で「送信失敗」と判断された隣接ノード装置をＬＤの候補から除外しないように、変形することができる。そして、ステップＳ１１１１は、取得したＬＤの値に対応する重みが最大値であるか否かをデータフレーム処理部１１０が判断するように、変形される。
【０７５３】
ステップＳ８１９とＳ８１９が上記のように変形されると、例えば、図２のノード装置Ｎ１１１が、ＧＤとしてノード装置Ｎ１０１を指定するデータフレームをノード装置Ｎ１１６から受信したとき、次のようにノード装置Ｎ１１１が動作する。
【０７５４】
上記データフレームの受信時に、ノード装置Ｎ１１１が有するノード装置Ｎ１０１に対応する重み付けテーブルにおいて、隣接ノード装置Ｎ１０５、Ｎ１０９、Ｎ１１５それぞれの重みが０．１、０．６、０．７だったとする。すると、まずＬＤとして隣接ノード装置Ｎ１０５が選択される。
【０７５５】
仮に、ノード装置Ｎ１０５からＡＣＫフレームが返ってこないとすると、ノード装置Ｎ１０５の重みは０．２に更新される。そして、第１実施形態では、送信に失敗したノード装置Ｎ１０５はＬＤの候補から除外されて、次に隣接ノード装置Ｎ１０９がＬＤとして選択されるが、この変形例においては、０．２＜０．６＜０．７なので、再度ノード装置Ｎ１０５がＬＤとして選択される。
【０７５６】
そして、またもやノード装置Ｎ１０５からはＡＣＫフレームが返ってこないとすると、ノード装置Ｎ１０５の重みは０．３に更新され、０．３＜０．６＜０．７なので、再度ノード装置Ｎ１０５がＬＤとして選択される。ノード装置Ｎ１１１とＮ１０５の間のリンクの状態が改善しない限り、以下同様にして繰り返しノード装置Ｎ１０５がＬＤとして選択されては送信が失敗する。そして、ノード装置Ｎ１０５の重みが０．６（または０．７）になった段階で、初めて、重み０．６と対応付けられたノード装置Ｎ１０９がＬＤとして選択される。
【０７５７】
以上例示したように、一度「送信失敗」と判断された隣接ノード装置をＬＤの候補から除外しないことも可能である。この変形例は、「リンクに一時的に障害が発生しても、すぐにリンクが障害から復旧する」といった場合に好適である。例えば、ステップＳ８１８〜Ｓ８２９の繰り返しループの実行中にリンクが障害から復旧すれば、ノード装置１００は、「ＬＤとして好適」と今までの学習の結果から判っている隣接ノード装置を、瞬間的な障害の影響を受けずに、ＬＤとして選択することができる。
【０７５８】
ただし、障害からの復旧が常に瞬間的であるとは限らない。そこで、第１実施形態では、経路の収束にかかる時間を短縮するために、一度「送信失敗」と判断された隣接ノード装置はＬＤの候補から除外されている。つまり、一度「送信失敗」と判断された隣接ノード装置をＬＤの候補から除外することで、ある１つのデータフレームに関してノード装置１００がＬＤを最終的に決定するのにかかる時間が短縮される。その結果、ネットワーク全体としても、データフレームがＧＳで送信されてからＧＤに到着するまでのレイテンシが短縮される。
【０７５９】
また、上記の第６の観点からの変形例として、図２２のステップＳ８２８において式（７）の代わりに下記の式（８）を用いてデータフレーム処理部１１０が重みの更新を行う変形例も可能である。
【０７６０】
Ｗｒｅｖｉｓｅｄ＝Ｗｍａｘ                          （８）
式（８）による重みの更新は、障害が生じているリンクを介してノード装置１００に隣接するノード装置を、重みが更新される当該エントリがエージング処理により消去されるまで、ＬＤの候補から除外し続けることを意味する。
【０７６１】
さらに、上記の第６の観点からは、次のような変形も可能である。
すなわち、第１実施形態では、図２６に示すように、１度データフレームの送信を試みてもＡＣＫフレームが所定のＡＣＫフレーム待ち時間Ｔｗａｉｔのうちに受信されなければ、送信失敗と見なされる。しかし、所定の回数（例えば３回）データフレームの送信を試みてもＡＣＫフレームが返信されないときにはじめて、「送信失敗」と見なす実施形態も可能である。
【０７６２】
例えば、送信済みのデータフレームを送信回数と対応付けて格納する送信バッファを、送信部１０２が備えていてもよい。送信部１０２は、最初にデータフレーム処理部１１０からデータフレームの送信を依頼されたとき、送信回数として１を設定し、データフレーム処理部１１０から出力されたデータフレームを送信バッファに格納する。そして、ＡＣＫ処理部１０７は、図２６のステップＳ１００３の処理を行う代わりに、次のように動作してもよい。
【０７６３】
すなわち、ＡＣＫ処理部１０７は、バッファ部１０９の注目エントリに格納されているデータフレームに対応する、送信バッファ中の送信済みデータフレームを、ＧＳフィールドとＦＩＤフィールドの値に基づいて特定する。
【０７６４】
そして、ＡＣＫ処理部１０７が特定した送信済みデータフレームに対応付けられている送信回数の値が、所定の回数に達していれば、ＡＣＫ処理部１０７はステップＳ１００３の処理を行い、処理は続いてステップＳ１００４へと移行する。
【０７６５】
他方、ＡＣＫ処理部１０７が特定した送信済みデータフレームに対応付けられている送信回数の値が、所定の回数未満であれば、ステップＳ１００３の処理は行われず、代わりにＡＣＫ処理部１０７は送信回数の値をインクリメントする。そして、処理はステップＳ１００４へと移行する。
【０７６６】
なお、上記の様々な実施形態とその変形例についてまとめれば、以下のとおりである。
ノード装置は、複数の隣接ノード装置のうち任意の１つからフレームを受信する受信手段として、例えば図３の受信部１０１、図４の無線モジュール２０６、図２１のポート２１１ａ−１〜２１１ａ−４とそこに接続されたＰＨＹチップなどを備える。
【０７６７】
また、図３のＦＩＤ管理テーブル１０５は、図４のＤＲＡＭ２０ネットワーク４やフラッシュメモリ２０５により実現され、図１２や図１３のような情報を格納している。このＦＩＤ管理テーブル１０５は、以下の（Ｙ１）〜（Ｙ３）の各情報を対応付けて記憶する記憶手段の一例である。
【０７６８】
（Ｙ１）送信対象フレームを識別するフレーム識別情報
（Ｙ２）複数の隣接ノード装置のうちで、送信対象フレームの送信先である送信先隣接ノード装置を識別する送信先隣接ノード識別情報
（Ｙ３）送信対象フレームを最初に送信してきた隣接ノード装置を識別する起源ノード識別情報
なお、上記（Ｙ１）の送信対象フレームの例は、図２２のステップＳ８１９、図２３のステップＳ８３０、図２８のステップＳ１１１４、図２９のステップＳ８３０ｂなどで送信されるデータフレームである。そして、フレーム識別情報の例は、ＧＳフィールドの値とＦＩＤフィールドの値の組み合わせである。
【０７６９】
また、上記（Ｙ２）の送信先隣接ノード識別情報の具体例は、ＦＩＤ管理テーブル１０５のＬＤフィールドに格納される、隣接ノード装置のノードＩＤである。
そして、上記（Ｙ３）の起源ノード識別情報の具体例は、ＦＩＤ管理テーブル１０５のＯＬＳフィールドに格納されるノードＩＤである。
【０７７０】
上記のとおり、ノード装置１００がデータフレームを中継する場合には、ノード装置１００が最初に当該データフレームを受信したときの当該データフレームのＬＳフィールドの値が、ＦＩＤ管理テーブル１０５のＯＬＳフィールドに格納される。つまり、送信対象フレームを最初に送信してきた隣接ノード装置のノードＩＤが、ＯＬＳフィールドに格納される。
【０７７１】
なお、拡張されたＯＬＳの定義にしたがい、ノード装置１００自身がＧＳとなる場合はＦＩＤ管理テーブル１０５のＯＬＳフィールドには自ノードＩＤが格納される。つまり、ノード装置１００自身が送信対象フレームを生成した場合、ＯＬＳフィールドには、ノード装置１００自身の識別情報である自ノードＩＤが格納される。換言すれば、ＯＬＳフィールドに格納されるノードＩＤは、ノード装置１００自身を中心としたホップ数１以下の範囲において、ノード装置１００が送信対象フレームの起源として認識するノード装置のノードＩＤである。
【０７７２】
また、図３の重み付けテーブル１０４は、図４のＤＲＡＭ２０４やフラッシュメモリ２０５により実現され、図１０や図１１のような情報を格納している。この重み付けテーブル１０４は、データフレームの最終宛先であるＧＤに対応付けて、複数の隣接ノード装置それぞれへの送信可能性を表す送信可能性情報を記憶する記憶手段の一例である。
【０７７３】
なお、送信可能性情報は、上記実施形態では、具体的にはＬＤフィールドのノードＩＤと重みの値との組をそれぞれ含む、１つまたは複数のエントリで表されている。そして、送信可能性は、例えば「重みの値が１ならば送信不能であり、重みの値が１未満ならば送信可能である」というように表される。
【０７７４】
また、図３のデータフレーム処理部１１０は、例えば図４のＭＰＵ２０１とＤＲＡＭ２０４により実現され、送信可能性情報を更新する更新手段の一例である。受信部１０１などの受信手段が受信した受信フレームを識別する受信フレーム識別情報が、ＦＩＤ管理テーブル１０５などの記憶手段に（Ｙ１）のフレーム識別情報として記憶されている場合、更新手段としてのデータフレーム処理部１１０は、送信可能性情報を更新する。
【０７７５】
具体的には、この場合に更新される送信可能性情報は、受信フレームに指定された最終宛先（つまりＧＤ）である受信フレーム宛先に対応付けられて、重み付けテーブル１０４などの記憶手段に記憶されている送信可能性情報である。送信可能性情報は、ＦＩＤ管理テーブル１０５などの記憶手段に、受信フレーム識別情報と対応付けられて記憶されている、（Ｙ２）の送信先隣接ノード識別情報により識別される第１の隣接ノード装置への送信可能性が「送信不能」を示すように、更新される。
【０７７６】
具体的には、例えば、「ＦＩＤ管理テーブル１０５のＬＤフィールドと同じ値をＬＤフィールドに持つ、重み付けテーブル１０４−ｉのエントリにおいて、重みを１に設定する」という動作が、更新手段としてのデータフレーム処理部１１０により行われる。
【０７７７】
また、データフレーム処理部１１０と送信部１０２は、協働して、複数の隣接ノード装置の中から、送信可能な第２の隣接ノード装置を選択し、第２の隣接ノード装置へ受信フレームを送信する送信手段として機能する。送信手段の一部としてのデータフレーム処理部１１０は、受信フレーム宛先に対応付けられて重み付けテーブル１０４などの記憶手段に記憶されている送信可能性情報に基づいて、第２の隣接ノード装置を選択する。
【０７７８】
ここで、ＦＩＤ管理テーブル１０５などの記憶手段において、受信フレーム識別情報に対応付けられた（Ｙ３）の起源ノード識別情報として第３の隣接ノード装置が記憶されているとする。
【０７７９】
すると、受信フレーム識別情報が、ＦＩＤ管理テーブル１０５などの記憶手段に（Ｙ１）のフレーム識別情報として記憶されている場合、送信手段としてのデータフレーム処理部１１０は、第３の隣接ノード装置を送信可能性情報によらず送信不能と見なす。
【０７８０】
つまり、データフレーム処理部１１０は、「ＯＬＳである隣接ノード装置は、重みの値によらず、送信不能である」と見なして、ＯＬＳである隣接ノード装置をＬＤの候補から除外する。そして、送信手段としてのデータフレーム処理部１１０は、第３の隣接ノード装置とは異なる、送信可能な第２の隣接ノード装置を選択する。
【０７８１】
また、データフレーム処理部１１０と送信部１０２は、協働してバックトラック手段としても機能する。バックトラック手段としてのデータフレーム処理部１１０と送信部１０２は、重み付けテーブル１０４などの記憶手段の送信可能性情報において、複数の隣接ノード装置の中に送信可能なものがなく、かつ受信フレーム識別情報がＦＩＤ管理テーブル１０５などの記憶手段に（Ｙ１）のフレーム識別情報として記憶されている場合に、第３の隣接ノード装置へ受信フレームを送信する。
【０７８２】
なお、ここで「複数の隣接ノード装置の中に送信可能なものがない」とは、「重みが１であるなど、送信可能性情報により送信不能と示されている隣接ノード装置か、上記のように送信可能性情報によらず送信不能と見なされている第３の隣接ノード装置しかない」という意味である。つまり、バックトラック手段としてのデータフレーム処理部１１０と送信部１０２は、第３の隣接ノード装置以外の（０個、１個、または複数の）隣接ノード装置の中に送信可能なものがない場合に、第３の隣接ノード装置へ受信フレームを送信する。
【０７８３】
また、ノード装置は、新規フレームを生成する生成手段を備えてもよい。生成手段のいくつかの例は、下記（Ｚ１）〜（Ｚ４）のとおりである。
（Ｚ１）図３の上位層処理部１１１
（Ｚ２）図３１において汎用ＬＡＮポート２１２ｅを介してセンサ５０４に接続されているノード装置１００ｅが備える、不図示のＭＡＣチップとＭＰＵ
（Ｚ３）図３１において汎用ＬＡＮポート２１２ｇを介してＰＣ５０５と接続されているノード装置１００ｇが備える、不図示のＭＡＣチップとＭＰＵ
（Ｚ４）図３１において汎用ＬＡＮポート２１２ａを介してＬ２ＳＷ５０２と接続されているノード装置１００ａが備える、不図示のＭＡＣチップとＭＰＵ
なお、上記の様々な実施形態とその変形例によれば、データ伝送フェーズとは独立した事前の経路生成フェーズが別途存在する訳ではなく、データ伝送フェーズで動的に経路生成が行われる。その利点を説明すれば、下記のとおりである。
【０７８４】
一般に、データ伝送フェーズとは独立した事前の経路生成フェーズを有する通信プロトコルでは、制御用の短いＰＤＵを用いて経路が生成される。しかし無線リンクの通信品質には、「制御用の短いＰＤＵの通信には十分だが、データ伝送用の長いＰＤＵの通信には不十分」という、中間的なレベルもありうる。その理由の一つは、ＰＤＵの長さによって、通信可能な距離が異なるからである。
【０７８５】
そのため、経路生成フェーズでは有効と思われた経路が、データ伝送フェーズになってはじめて、現実的には使用不能であると判明するかもしれない。また、電波状況は常に変わりうるし、有線ネットワークであっても、ノード装置の増設もしくは撤去、またはケーブルの接続替えなどは、常に起こりうる。
【０７８６】
しかし、上記の様々な実施形態とその変形例によれば、データ伝送フェーズで、データフレームを送信しながら、データフレームの送信が可能な経路が動的に生成されていく。したがって、「現実的なデータフレームの伝送には使用不能な経路が、データ伝送フェーズとは独立した経路生成フェーズで作られてしまう」といった無駄は生じない。
【０７８７】
また、上記の様々な実施形態とその変形例によれば、データ伝送フェーズにおけるネットワーク環境の動的な変化にも、動的に応じつつ、経路が選択される。そして、上記の説明から明らかなとおり、人手による設定なしに、各ノード装置の自律分散協調の結果として、動的に適切な経路が見出される。
【０７８８】
さらに、図６の例からも明らかなとおり、上記の様々な実施形態とその変形例によれば、たとえバックトラックが生じても、必ずしもＧＳまで影響が及ぶ訳ではない。つまり、局所的に起こる変化に応じて、限られた局所的な範囲の中だけで経路が修正される。よって、「局所的な変化がネットワーク全体にポジティブにフィードバックし、その結果ネットワーク全体が過負荷状態に陥る」といった事態は生じない。
【図１】
2011013165.tif 000003
【図２】
2011013165.tif 000004
【図３】
2011013165.tif 000005
【図４】
2011013165.tif 000006
【図５】
2011013165.tif 000007
【図６】
2011013165.tif 000008
【図７】
2011013165.tif 000009
【図８】
2011013165.tif 000010
【図９】
2011013165.tif 000011
【図１０】
2011013165.tif 000012
【図１１】
2011013165.tif 000013
【図１２】
2011013165.tif 000014
【図１３】
2011013165.tif 000015
【図１４】
2011013165.tif 000016
【図１５】
2011013165.tif 000017
【図１６】
2011013165.tif 000018
【図１７】
2011013165.tif 000019
【図１８】
2011013165.tif 000020
【図１９】
2011013165.tif 000021
【図２０】
2011013165.tif 000022
【図２１】
2011013165.tif 000023
【図２２】
2011013165.tif 000024
【図２３】
2011013165.tif 000025
【図２４】
2011013165.tif 000026
【図２５】
2011013165.tif 000027
【図２６】
2011013165.tif 000028
【図２７】
2011013165.tif 000029
【図２８】
2011013165.tif 000030
【図２９】
2011013165.tif 000031
【図３０】
2011013165.tif 000032
【図３１】
2011013165.tif 000033
【図３２】
2011013165.tif 000034
【図３３】
2011013165.tif 000035
【図３４】
2011013165.tif 000036
【図３５】
2011013165.tif 000037
【図３６】
2011013165.tif 000038
【国際調査報告】
2011013165.tif 000039
2011013165.tif 000040