仮想ネットワーク
仮想ネットワークは、それぞれのノードが他のこのようなノードへのリンクを表す所定数(L)のアドレスまで記憶するためのリストを備えた複数のノードを有する。これらのリンクは、第1のノードと第2のノードの間のリンクを要求するメッセージを受信すること(300)と、前記第1のノードと第2のノードの両方が、それぞれのケースで、前記所定数未満であるそのリストの中に多くのアドレスを有しているかどうかを判断すること(301、305)と、この条件が満たされる場合に、第1ノードのアドレスを第2のノードのリストの中に挿入(308)し、第2のノードのアドレスを第1のノードのリストの中に挿入すること(307)と、この条件が満たされないときに、第1のノードが、前記所定数より少なくとも2少ないそのリストの中に多くのアドレスを有するかどうかを判断すること(309)と、有する場合に(a)第3のノードのアドレスを第2のノードのリストから選択すること(310)と、(b)第3のノードのアドレスを第2のノードのリストから削除すること(313)と、(c)第2のノードのアドレスを第3のノードのリストから削除すること(314)と、(d)第1のノードのリストの中に第2のノードのアドレスを挿入すること(311)と、第1のノードのリストの中に第3のノードのアドレスを挿入すること(312)と、(e)第2のノードのリストの中に第1のノードのアドレスを挿入し(313)、第3のノードのリストの中に第1のノードのアドレスを挿入すること(314)とによって管理される。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は仮想ネットワークに関し、特に集中記憶装置または制御装置を備えないものなど、ピアツーピアシステムなどの分散型システムに関するが、それに限定されない。
【発明の開示】
【課題を解決するための手段】
【0002】
本発明のある態様によれば、各ノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを有する複数のノードを有する仮想ネットワークを操作する方法が提供され、
(i)第1のノードと第2のノードの間のリンクを要求するメッセージを受信することと、
(ii)第1のノードと第2のノードの両方が、それぞれのケースでそのリスト内に所定数未満であるいくつかのアドレスを有するかどうかを判断することと、
(iii)この条件が満たされる場合には、第1のノードのアドレスを第2のノードのリストに挿入し、第2のノードのアドレスを第1のノードのリストの中に挿入することと、
(iv)この条件が満たされない場合には、第1のノードがそのリストの中に前記所定数より少なくとも2少ないいくつかのアドレスを有するかどうかを判断し、そうである場合には、
(a)第3のノードのアドレスを第2のノードのリストから選択することと、
(b)第3のノードのアドレスを第2のノードのリストから削除することと、
(c)第2のノードのアドレスを第3のノードのリストから削除することと、
(d)第2のノードのアドレスを第1のノードのリストに挿入し、第3のノードのアドレスを第1のノードのリストに挿入することと、
(e)第1のノードのアドレスを第2のノードのリストに挿入し、第1のノードのアドレスを第3のノードのリストに挿入することと、
を含む。
【0003】
別の態様では、本発明は仮想ネットワークのノードを提供し、前記ノードは他のこのようなノードの所定数のアドレスまでを記憶するためのリストを含む記憶手段と、以下の動作、つまり
メッセージを受信することと、
リストの内容についての情報を要求するメッセージに応えることと、
リストからアドレスを削除するために受信した要求に従うことと、
リストへのアドレスの挿入を要求するメッセージに従うことと、
ノードと第2のノード間のリンクを要求するメッセージの受信に応えて、
(A)そのリストの内容についての情報を要求する第2のノードに対するメッセージを作成することと、
(B)第1のノードと第2のノードの両方が、それぞれのケースで、そのリストに所定数未満であるいくつかのアドレスを有するかどうかを判断することと、
(C)この条件が満たされる場合、第2のノードのアドレスをそのリストに挿入し、そのリストにノードのアドレスを追加するように第2のノードに要求するメッセージを第2のノードに対して作成することと、
(D)この条件が満たされない場合には、ノードがそのリストに、所定数より少なくとも2少ないいくつかのアドレスを有するかどうかを判断することと、そうである場合に、
(a)第3のノードのアドレスを第2のノードのリストから選択することと、
(b)第2のノードのアドレスを第1のノードのリストに挿入し、第3のノードのアドレスを第1のノードのリストに挿入することと、
(c)第2のノードのリストからの第3のノードアドレスの削除、及びノードのアドレスの挿入を要求するメッセージを第2のノードに作成することと、
(d)第3のノードのリストからの第2のノードのアドレスの削除、及びノードのアドレスの挿入を要求するメッセージを第3のノードに作成することと、
を実行するようにプログラミングされる処理手段によって定められる。
【0004】
本発明の他の好ましい態様は請求項に定められる。
【0005】
本発明のいくつかの実施形態は、以下、添付図面を参照して一例として説明する。
【発明を実施するための最良の形態】
【0006】
(ノード)
本説明中、処理機能、記憶機能及び通信機能を有するコンピューティングノードについて言及する。コンピューティングノードは、1台のコンピュータでも、他のデバイスでもよく、あるいは−単一のコンピュータがその上で実行するいくつかの独立したプログラムまたはプロセスを有することができることに注意すると−このようなプログラムまたはプロセスであってよい。記憶されるデータの項目は、いくつかのこのような項目は単一のプログラムまたはプロセスによってサービスを受けてよいが、別個のノードとして見なされてもよい。
【0007】
本説明は、各コンピューティングノードが、メッセージがそれに送信できるようなIP(インターネットプロトコル)ネットワークのような電気通信網など、なんらかの通信インフラストラクチャに接続されていることを前提とする。したがって、各コンピューティングノードは通信インフラストラクチャ内のノードも構成する。
【0008】
また、仮想ネットワークに属する仮想ノードに対しても述べる。コンピューティングノードはそれに関連付けられる(おそらくは異なる仮想ネットワークに属する)2つまたは3つの仮想ノードを有することができるため、区別は重要である。その名が暗示するように、仮想ノードはいかなる物理的な意味でも存在しない。むしろやがて明らかになるように、その存在は、仮想ノードの間のリンクを定義し、したがってそれが属する仮想ネットワークも定義する記憶されているデータにより確立される。
【0009】
必然的に、仮想ノードは、それに処理機能、記憶機能、及び通信機能を与えるコンピューティングノードと関連付けられなければならない。つまり仮想ノードによるメッセージの送信、受信及び処理に対する参照は、仮想ノードの代わりにコンピューティングノードによるこのような送信、受信または処理を参照する。
【0010】
例は図1に図示されている。コンピュータは、ネットワーク10を介する通信のために通常の構成要素、すなわちプロセッサ1、メモリ2、ディスプレイ3、キーボード4及び通信インタフェース5を有する。
【0011】
メモリ2は、オペレーティングシステムと他のプログラム(図示せず)、及び図示されているテキストファイル20などのデータファイルを格納している。それは、テキストファイル20とそれ自体のアドレス21bに対応するラベル21aを含む21も有する。さらに、それはアドレスリスト22、及びコンピュータ上で仮想ネットワークのノードの存在をともに定義するサポートプログラム23を有する。このノードにはアドレス24が付いている。別の仮想ネットワークのノードの、コンピュータ上での存在をともに定義するアドレスリスト25及びサポートプログラム26も図示されている。このノードにはアドレス27が付いている。リスト22、25に記憶されているアドレスは、同じ仮想ネットワーク内の他のノードのアドレスである。
【0012】
(ルックアップシステム)
これは本発明の応用例の考えられる1つの例でしかありえないが、ここで分散型ルックアップシステムを説明する。このシステムによってユーザはコメントをウェブページと関連付けることができる。ユーザはこのページをビジットするたびに、他のユーザが行ったコメントを見る機会もある。コメントは、(例えばテキストファイルとして)コメントを寄せたユーザのコンピュータに記憶されている。
【0013】
ウェブページ(またはむしろ、自分のコンピュータ)を見ているユーザは、ウェブページのユニバーサルリソースロケータ(URL)を有し、必要とされているのはユーザがコメントを取り出すことができる機構である。この例では、前記機構は以下のとおりである。
【0014】
他のウェブページについてのコメントを含む他のテキストファイル、及びおそらく他の関連していないファイルもそうである可能性があるように、テキストファイルはコメントを寄せたユーザのコンピュータに記憶され、我々の国際特許出願WO第03/034669号[代理人参照第A30044号]に説明される方の仮想ネットワークのノードと関連付けられている。(本説明の文脈では一次仮想ネットワーク、または単に一次ネットワークと呼ばれる)この仮想ネットワークは、それを特定するラベルを有するのであればそのアドレスを知らなくてもノードにメッセージを送信できるようにするのに役立つ。その種のネットワークは一意のラベル(ノードあたり1つ)で機能できるが、この例ではラベルは一意ではない。むしろ、ある特定のウェブページについてのコメントを含むテキストファイルに関連付けられるすべてのノードが同じラベルを有する。このラベルはウェブページのURLのハッシュ関数である。この仮想ネットワークは、ただ1つのノードに到達する取り出し機構を提供する。
【0015】
テキストファイルは、第2の仮想ネットワークのノードとも関連付けられる。これ(二次仮想ネットワーク)は前記1つの特定のウェブページについてのコメントを含むテキストファイルと関連付けられているノードだけを含む。
【0016】
しかしながら、我々の前述された国際特許出願による一次ネットワークの使用が好ましいが、それが必須ではないことに注意する。事実上、仮想ネットワークを使用することはまったく必須ではない。ラベルを受信し、それに対応する1つのノードのアドレスを返す別の一次取り出し機構が代わりに使用できるであろう。
【0017】
コメントをポストするコンピュータは図1に図示されるとおりであり、
・一次ネットワーク内でノードを作成しなければならない。このノードはラベル21a及びネットワークアドレス24を有している。
【0018】
・二次ネットワーク内でノードを作成しなければならない。このノードにはネットワークアドレス27が付いている。
【0019】
当初、アドレスリスト22、25は、リスト22がブートストラップリンクを含んでいるのを除き、空である。リスト22が一次ネットワークのいくつかの他のノードのラベルとアドレスを含み、リスト25が二次ネットワークのいくつかの他のノードのアドレスを含むことを確実にするためのネットワークの自己組織化については、後述する。まず当分は、システムはこれらのラベルとアドレスが存在しているという仮定に基づいて説明する。
【0020】
この時点でアドレスについて少し説明することが必要である。テキストファイル20によって形成されるノード、一次仮想ネットワークのノード、及び二次仮想ネットワークのノードは、概念上はただ1つのアイデンティティを有しているが、独自のアドレスを有している。実際問題としてはこれは特に便利ではないが、それぞれのノードに通信網10内の異なるアドレスを割り当てることが可能であろう。我々の好ましいインプリメンテーションでは、各ノードは以下の3つの部分から構成されるアドレスを有する。
【0021】
・コンピューティングノードの場所を指定するインターネットアドレス。例えば、130.146.209.15
・コンピューティングノードにおけるある特定の通信ポートの場所を指定するポート番号。ポートはインターネットアドレスの標準的な部分である。例えば、それらは異なる独立したアプリケーションプログラムがメッセージを独立して送信、受信できるようにする。つまり、それぞれが専用のポートでメッセージを受信し、他のアプリケーションプログラム向けのメッセージは受信しない、あるいは他のアプリケーションプログラム向けのメッセージによって「混乱」しないであろう。ポート番号とともにインターネットアドレスは、(使用されるTCP/IPなどの通信プロトコルの一部であるため)ネットワークアドレスと見なすことができる。すべての一次ノード及び二次ノードのためのネットワークアドレスは同じである場合があるが、必ずしもそうである必要はない。例えば、一次ノードのための全メッセージは、(このようなメッセージを区別する1つの方法である)二次メッセージがそこで受信されるそれとは別のポートで受信されてよい。
【0022】
・メッセージが向けられる特定のノードの場所を指定するノード識別子(整数値)。例えば一次ネットワークでのすべてのメッセージが専用ポートで受信される場合も、各ノードと関連付けられた局所的に一意の識別子がある。したがって、複数のノードがあるときに、メッセージがどのノード向けであるのかが明確である。このノード識別子はアプリケーションに特殊なアドレス拡張子(それは標準インターネットプロトコルの一部ではない)である。それは送信されるメッセージに含まれるだけである。それを受信するプロセスはこれを「知って」おり、メッセージがどのノードに転送される必要があるのかを判断するためにこのノード識別子を調べる。
【0023】
両方のノードが同じネットワークアドレスを有することはありえるが、必ずしもそうである必要はない。(部分的には使用可能なポートの数が制限されることがあるため)すべてのノードが専用のポートを有するわけではないが、2つのポート(したがって、2つの異なるネットワークアドレス)を有することもある。つまり、1つは一次ネットワーク用、1つは二次ネットワーク用である。通常、すべて同じポートを使用できるであろういくつかの二次ネットワークがある。
【0024】
以下では、ノードのアドレスに対する参照がそのノードの完全なアドレスを指すことが強調されなければならない。
【0025】
特に魅力的な手法は、テキストファイル及び一次ノードと二次ノードがすべて同じノード識別子(及びIPアドレス)を有し、ポート番号だけが異なっていることを提供することである。このようなアドレス指定プロトコルは、あるノードのアドレスを有し、それに関連付けられる別のノードのアドレスを必要とする場合に、後者のノードのアドレスが、調べられなければならないよりはむしろ、前者のアドレスから推定される可能性があるという点で、処理のいくらかを簡略化するための機会を与える可能性がある。しかしながら、以下の説明では、このような簡略化は行われておらず、その結果これらのプロセスは任意のアドレスプロトコルを扱うであろう。
【0026】
ウェブページを見るコンピュータは、
・ラベルを取得するために同じハッシュ関数をURLに適用することによって
・あるノードのアドレスを取得するために一次仮想ネットワーク上で(ラベルを含む)照会を送信することによって、
・見つけられたアドレスを使用して、二次仮想ネットワーク上の多くの(あるいはすべての)他のノードのアドレスも取得するために二次仮想ネットワーク上で照会を送信することによって、
・表示するためのコメントを取り出すためにこれらのアドレスを使用することによって
関連付けられたコメントを取り出す。
【0027】
取り出すコンピュータが必ずしも仮想ネットワークのノードを含まなくてもよいことに注意する。つまり、それは、取り出しプロセスを実現するためのソフトウェアをロードされ、それが仮想ネットワークのノードが常駐するコンピュータと通信できるように通信インタフェースをロードされた従来のコンピュータである場合がある。このプロセスは図1Aのフローチャートに示され、以下のように進行する。
【0028】
ステップ30:ユーザがURLを入力する(あるいはハイパーリンクを呼び出す)のに続き、コンピュータは対応するウェブページを取り出す。このステップはまったく従来的である。
【0029】
ステップ31:ラベルを取得するためにハッシュ関数がURLに適用される。我々の以前の国際特許出願に説明されるように、これはSHA−1アルゴリズムを使用できる。
【0030】
ステップ32:このラベルと取り出し側コンピュータのネットワークアドレスを含む「Find」メッセージが一次ネットワークに送信される。コンピュータが少なくとも1つのこのようなアドレスを所有していることが必要なのは明白である。
【0031】
ステップ33:取り出し側コンピュータが一次コンピュータから「Found」メッセージを受信する。このメッセージは二次ネットワークの関連付けられたノードのアドレス及びコメントのアドレスだけではなく、発見されたノードのラベルとアドレスも含む。「Found」メッセージが妥当な時間内に受信されない場合にプロセスを打ち切るためのタイムアウト機構を含むことができる。
【0032】
ステップ34:この例では、一次ネットワークは常に、それが「Find」メッセージに含まれるラベルに最も近いラベルを含むノードのアドレスを返すように配置される。したがって、返されるラベルが要求されたラベルと同じであるかどうかを確かめるためにチェックが実行され、同じではない場合、プロセスは終了する。「最も近い」の意味の説明については以下を参照されたい。
【0033】
ステップ35:ラベルが一致すると仮定し、取り出し側コンピュータは、それがそれにより二次ネットワークを使用して追加のアドレスを取り出すために発見(Found)メッセージによって返されるアドレスを使用する(詳しく後述される)プロセスを実行する。
【0034】
ステップ36:次にこれらのアドレスはコメントを含むテキストファイルを「ポスト側」コンピュータから取り出すために使用される(uses)。
【0035】
(二次仮想ネットワーク)
このネットワークの目的は、ノードのグループを、グループの一部であるすべてのノードを発見するためにその後使用できる単一の仮想ネットワークに自己組織化することである。主要な要件は、結果としてネットワークがすべてのノードを含んでいることである。別の要件は、ネットワークを作成、維持するために必要とされるシステム負荷がすべてのノード全体で等しく拡散されることである。これは、さまざまなユーザが自分のリソースを1つの分散型アプリケーションに寄与するときに重要である、最も「公平」であるだけではなく、システムを過負荷から保護するのに役立つ。
【0036】
したがって、ネットワークには以下の特性がある。
【0037】
・各ノードによって維持されるリンクの数は好ましくは同じである。
【0038】
・すべてのリンクは双方向である。その結果ノードへのリンク数も各ノードについて同じである。これはノードが受信し、処理しなければならないメッセージ数に影響を及ぼすため重要である。
【0039】
・それは「平坦な」構造を有している。ノードは自らを階層的に配列しない。その結果システム負荷はすべてのノード全体で等しく拡散される。
【0040】
(各ノードの構造)
各ノードは、それに関連付けられる以下のデータを有する。
【0041】
・他のノードに対する複数のリンク。各リンクは別のノードのアドレスにすぎない。核リンクに関連付けられているのは、「確認済み」または「未確認」である場合があるステータスである。各ノードは、システム全体のパラメータLによって指定される最大数のリンクを維持できるにすぎない。Lの典型的な値は、例えば6である。このパラメータがすべてのノードについて同じであることは必須ではないが、それらが異なるようにすることにより獲得される利点はない。
【0042】
・スペアリンク、つまり手短に言えばスペアのリスト。各スペアは別のノードのアドレスにすぎない。スペアは仮想ネットワークを構築するために自己組織化プロセスによって使用される。ノードは、それがすでにノードにリンクしているため、またはそれがすでに最大数のリンクを有しているためのどちらかの理由により、それがリンクとして追加できない前記ノードについて通知されると他のノードをスペアとして追加する。ノードが維持できるスペアの数も制限され、システム全体のパラメータSによって指定される。Sの典型的な値は、例えば3である。スペアリンクのリストは概して必須ではないが、それにより局所的に収容できないリンクを仮想ネットワークのなんらかの他のポイントに伝搬できる追加の機構を提供する上で非常に貴重である。しかしながら、スペアリンク(または類似した伝搬機構)を使用することは、入信するNotifyメッセージがつねに二次ネットワークの同じノード(または非常に少ない数のノードの内の1つ)に到着するシステムでは必要である。
【0043】
(メッセージ)
ネットワークに自己組織化するため、及びどのノードが特定のネットワークの一部であるのかを発見するために、ノードは互いにメッセージを送信する。以下に示すタイプのメッセージが二次ネットワークによって使用される。
【0044】
・以下を含むAddLinkメッセージ
・送信者のアドレス
・受信者のアドレス
メッセージは相互リンクを要求するためにノード(送信者)によって別のノード(受信者)に送信される。
【0045】
・以下を含むChangeLinkメッセージ
・送信者のアドレス
・受信者のアドレス
・主題のアドレス
メッセージは、それがそのリンク(Z)の内の1つをそれ自体(X)のリンクに変更することを要求するためにノード(X)によって別のノード(Y)に送信される。プロトコルは、Xが、それにYに対するそのリンクをそれ自体(X)に対するリンクで変更するように要求する、類似したメッセージをZに送信するになている。したがって、事実上Xは現在XとZの間にあるリンクにそれ自体を挿入することを要求すr。
【0046】
・以下を含むLinkAddedメッセージ
・送信者のアドレス
・受信者のアドレス
メッセージは、送信者がそれに対するリンクをちょうど追加したところであることをノードに通知するために使用される。
【0047】
・以下を含むLinkErrorメッセージ
・送信者のアドレス
・受信者のアドレス
・主題のアドレス
・エラーコード
メッセージはノードに、そのリンクの内の1つに問題があると考えられることを知らせるために使用される。例えば、主題ノードが応答しない可能性がある、あるいはリンクが相互的でない可能性がある。メッセージはエラーのタイプを示すためにエラーコードを含む。
【0048】
・以下を含むLinksメッセージ
・送信者のアドレス
・受信者のアドレス
・すべてのリンクのアドレス
・基準値
・Linksメッセージは送信者ノードからのなんらかの他のデータも含む。ウェブページコメント例では、これは関連コメントのアドレスである。
【0049】
メッセージは送信側ノードのすべてのカレントリンクを含む。それはつねにLinksQueryメッセージに応えて送信される。参照は、応答される前記特定の照会を区別するために使用できる。
【0050】
・以下を含むLinksQueryメッセージ
・送信者のアドレス
・受信者のアドレス
・基準値
メッセージは、ノードにLinksメッセージを(そのカレントリンクを含む)返事として送信するように要求するために使用される。
【0051】
・以下を含むNotifyメッセージ
・送信者のアドレス
・受信者のアドレス
・主題のアドレス
・通知レベル
メッセージは、ノードにネットワーク内の別のノードを通知するために使用される。通知レベルはNotifyメッセージの伝搬を制御、制限するために使用される。ここで説明されるように、送信者アドレスは使用されないが、デバッグのために、あるいは肯定応答を送信することが所望される場合に有効である。
【0052】
(二次ネットワークの構築)
システムはグループノードに単一の仮想ネットワークへ自己組織化させ、その結果1つのノードのアドレスを有すると、グループ内の他者のアドレスを発見できる。本項では、同じ二次ネットワークに所属するはずであるノードが発見されると、新しいリンクがどのようにして作成されるのかを説明する。ここでは2つの部分が区別できる。
【0053】
同じ二次ネットワークに所属するはずであるノードの組の発見。複数のノードを同じネットワークの中にグループ化するための基準が何であるのかは、アプリケーション特有である。ウェブページ注釈例では、同じURLについてのコメントを表すすべてのノードは二次ネットワーク内で一緒にグループ化されなければならない。一緒にグループ化されなければならないノードがどのようにして発見されるのかもアプリケーション特有である。例を簡単に示す。
【0054】
二次ネットワークをノード発見の結果として更新する/拡張すること。同じ二次ネットワークに所属しなければならない1組のノードが発見されると、システムは結果として1つまたは複数の新しいリンクを構築してよい。新しいリンクは必ずしもノードの前記組の間にはないが、例えばこれらの2つのノードのリンク先であるノードの間にあってよい。どのようにして新しいリンクが作成されるのかの詳細は後述する。
【0055】
(Initial Notify(初期通知)メッセージ)
二次ネットワークの組織化は、例えばグループの既存のメンバーと新しいメンバーを特定できる入信「通知」メッセージの存在を前提としている(早い段階ではどちらのノードもまだグループの一部ではないが、後に自己組織化プロセスの間に両方のノードともすでにグループの一部である可能性がある)。それに属さなければならないノードの二次ネットワークに通知するのはシステムの別の部分しだいである。それを行うことができるさまざまな方法がある。ここで、我々は、二次ネットワークが我々の以前の国際特許出願に説明される型の一次ネットワークと組み合わせて使用されるときに、これがどのようにして行われるのかの例を示す。ウェブページ注釈例では、各コメントは対応するウェブページのURLに基づくラベルの下で一次ネットワーク内のノードとして自らを公表する。このようにして、一次ネットワークは、URLが存在する場合に特定のURLついてのコメントをルックアップするのに使用できる。特定のURLについてのすべてのコメントを示すために、各コメントはそれに関連付けられる二次ネットワークのノードも有する。同じURLについてのコメントに相当するノードはそのURLに特定的な二次ネットワークに自己組織化する。このようにして、いったん一次ネットワークがURLについての単一のコメントを見つけるのに使用されると、二次ネットワークは前記同じURLについての他のコメントを診付けるために使用できる。
【0056】
したがって、このケースでは、ともにグループ化されなければならない二次ネットワークのノードはそれぞれ一次ネットワークの同じラベルの下で公表される。ノードが同じラベルの下で公表された別のノードを認識すると必ず、必要とされるNotifyメッセージが作成されるような改善策を含む、一次ネットワーク内で、ノードがリンクを構築し、維持するために周期的に「Push(プッシュ)」更新を実行する機構について、以下に説明する。
【0057】
(通知メッセージの取り扱い)
ノードが、それがまだリンクしていないノードについてNotifyメッセージを受信すると、以下の1つが起こる。
【0058】
受信側ノードがすでに最大数の許容リンクを有する場合、それ(受信側ノード)は(それがすでにそれ(リンク)をスペアとして有していない限り)代わりにそれをスペアとして追加する。これを行う際に、前記ノードがその最大スペア数を超えると、それは1つのスペアを削除する。次に、それ(前記ノード)はそれが削除した前記スペアにNotifyメッセージも転送する。それがこれを行うかどうかは、通知レベルの値次第である。通知レベルは、メッセージが際限なく伝搬するのを妨ぐために毎回減少する。
【0059】
それ以外の場合、主題ノードがまだ最大数のリンクを有していない場合、受信側ノードは両方のノードの間に相互リンクを作成しようと試みる。これは図2のaとbに描かれている。ここでは、L=3であり、ノード1はノード2についてのNotifyメッセージを受信した。両方のノードとも2つのリンクしか有していなかったため、ノード1とノード2の間にリンクが作成される。
【0060】
それ以外の場合、主題ノードがすでに最大数のリンクを有している場合は、単に両方のノード間に相互リンクを作成することは可能ではない。したがって、何が起こるかというと(what happens)、受信側ノードが既存のリンクにそれ自体を挿入しようと試みる。これは図2のcとdに描かれている。ここでノード2とノード3の間のリンクは破壊されるが、それは2つの新しいリンク、つまりノード1とノード2の間のリンクとノード1とノード3の間のリンクによって置き換えられる。したがってリンクの総数は1だけ増加する。それは、たとえノード2とノード3がすでに最大数のリンクを有していたとしてもうまく行く。しかしながら、これが成功するためにはノード1が2つの新しいリンクを作成できることが必要であった。このプロセスは図3から図9のフローチャートにさらに詳細に説明される。
【0061】
図3は、ノードが入信Notifyメッセージをどのように処理するのかを示す。ここでは、新しいリンクを作成する必要があるかどうかが決定され、そうである場合にはどのように(新しいリンクを追加することによって、あるいは既存のリンクを2つのリンクに変更することによって)作成されるべきかが決定される。新しいリンクが作成される場合、スペアの集合は更新され、Notifyメッセージが送信されてよい。
【0062】
ステップ300では、それを送信したノード(送信者)のアドレス、主題ノードのアドレス、及び伝搬制限値であるnotifylevelを含むNotifyメッセージが受信される。受信側ノードは最初に、それが新しいリンクをセットアップする空間を有するかどうかをチェックし(301)、空間がある場合には、それがすでに主題ノードへのアクセスを有しているかどうかをチェックする(302)。有していない場合、それ(受信側ノード)は主題とリンクをセットアップしようと試みる。
【0063】
ステップ303では、それ(受信側ノード)は主題ノードにLinksQueryメッセージを送信し、ステップ304で応答を待つ。いったん応答−Linkメッセージ−が受信されると、それ(「受信側ノード」または「前記ノード」)は、(それがその間にも他のメッセージを受信、処理し、その結果としてリンクを作成した場合)それが依然として新しいリンクをセットアップするための空間を有しているかどうかを再びチェックする(305)。空間がある場合、それは次に主題ノードが新しいリンクをセットアップするための空間を有するかどうかをチェックするために受信されたLinksメッセージを調べる(306)。それが有する場合、ステップ307と308で、受信側ノードは主題ノードのアドレスを(「未確認」とマークされているが)そのリンクのリストに追加し、AddLinkメッセージを主題ノードに送信する。
【0064】
しかしながら、ステップ306で、主題ノードが追加リンクを受け入れることができないと判断されると、受信側ノードは、図2を参照して前述されたように、それ自体を既存のリンクの中に挿入しようと試みる。第1のステップ(309)は、受信側ノードが2つのリンク分の空間を有するかどうかをチェックすることである。ない場合には、プロセスは終了する。しかしながら、ある場合には、受信側ノードは受信されたLinksメッセージの中のリンクのリストから無作為に(受信側ノードがすでにリンクを有しているノードではない)リンク、すなわち主題ノードと、ここでは他と呼ばれる別のノードの間のリンクを選択する。それから、受信側ノードは、
311 主題ノード(未確認)のアドレスをそのリンクのリストに追加する
312 他のノード(未確認)のアドレスをそのリンクのリストに追加する
313 他のアドレスを含むChangeLinkメッセージを主題ノードに送信する
314 主題のアドレスを含むChangeLinkメッセージを他のノードに送信する
ことによって、それ自体をこのリンクに挿入しようと試みる。
【0065】
しかしながら、ステップ301で、受信側ノードがリンクを追加するための空間を持たないと判断されると、あるいはステップ302で、それが主題ノードに対してすでにリンクを有していると判断されると、プロセスは受信側ノードがそのスペアリンクのリストにリンクを追加する必要があるかどうかを調べる。ステップ315では、主題ノードがすでにスペアリストにあると判明するとプロセスが終了する。ステップ316では、スペアリストにリンクを追加するための空間があるかどうかがチェックされ、ある場合には、これは317で正式に追加される。ない場合には、ステップ318でスペアリンクの内の既存のリンクが無作為に選択され、それがステップ317で主題へのリンクによって置換できるようにステップ319で削除される。また、変数notifylevelは320で減分され、(ステップ321)それがゼロ以外のままであると、ステップ322で元のNotifyメッセージが−notifylevelのこの新しい値とともに−無作為に選択された既存のリンクによって指される(置換と呼ばれる)ノードに転送される。
【0066】
このプロセスの効果は、すでにリンクの完全な集合を有するノードAがそれに主題ノードBにリンクするように依頼するNotifyメッセージを受信すると、Bのアドレスがスペアリンクとして記録されるという点である。このリンクは、Aのスペアリンクのリストがいっぱいになるまで休眠したままである。次に、AがそれにノードCにリンクするように依頼する、後のNotifyメッセージを受信し、ノードBへのスペアリンクがステップ318で選択されると、ステップ322で作成される新しいNotifyメッセージは、事実上、それ自体からノードCへのリンクを作成するというノードBに対する要求である。
【0067】
リンクが未確認であり、受信側ノードが一定の期間内に(図6を参照して後述されるように、LinkAddedメッセージを介して)確認を受信しないとき、未確認のリンクが削除される機構も提供されるが、フローチャートには図示されていない。受信側ノードが、依然として「未確認」ステータスを有するリンクを有するときには、それはLinksQueryメッセージに応えて(言うまでもなく確認済みのリンクだけではなく)これらの未確認リンクも返し、他のノードが、それがリンクをセットアップしようと試みていることを確認できるようにする。
【0068】
図3では、ステップ305と309で「ノー」に出ると、プロセスは終了する。しかしながら所望される場合、それらはステップ315で始まる、効率がわずかに改善されて「スペアリンク」プロセスに送ることができる。
【0069】
ステップ309から314では、ノードは事実上、主題のリンクの1つを破壊し、それ自体を間に挿入する。フローチャートに図示されていない別の考えられるオプションは、ノードが(言うまでもなくそれがすでに1つのリンクを有していると仮定し)独自のリンクの内の1つを破壊し、主題を間に挿入することであろう。このオプションは、実現される場合、ステップ301で「ノー」に出た直後に試されるであろう。最初に、受信側ノードは、主題がL−1個より少ないリンクを有していたかどうかを確かめ、無作為に(ノード他に対する)独自のリンクの内の1つを選択し、これを主題に対する未確認リンクで置換し、主題にAddLinkメッセージを送信する必要があるであろう。次に、主題と他の間に双方向リンクを設立するために、それは、(a)主題に無条件で他を未確認リンクとしてそのリンクのリストに追加することを要求する特別のAddLinkメッセージを主題に送信し、(b)受信側ノードが旧リンクとして削除され、主題を追加される新規リンクとして指定する特別なChangeLinkメッセージを他に送信するであろう。このオプションは、ステップ309から314と同様に、あるいはステップ309から314の代わりに含まれるであろう。
【0070】
受信側ノードが独自のリンクの内の1つを破壊するための別のオプションは、(最初に、主題がL−1個より少ないリンクを有していたと検証した)それ(受信側ノード)が主題に、それ自体を主題として指定するNotifyメッセージを送信することであろう。これは同じ結果をもたらすが、わずかに大きなメッセージングオーバヘッドを必要とするであろう。
【0071】
図4は、ノードが入信ChangeLinkメッセージをどのように処理するのかを示している。これらのメッセージは、Notifyメッセージを受信したノードXが既存のリンクを2つの新しいリンクに変更することを希望するときに送信される(図2を参照されたい)。受信側ノードYは、400でノードZをsubjectとするNotify、つまりノードYにその既存のノードZリンクを、ノードXに置換するように求めるメッセージを受信する。それ(ノードY)が事実上ノードZへのリンクを所有していない(402)場合は、それはsenderXにエラーメッセージを送信する403が、それがすでにXへのリンクを有する場合は、それは追加の処置を講じない(401)。
【0072】
すべてがうまくいくと仮定して、それはsenderXにLinkQueryメッセージを送信し(404)、後者(送信者)が、それが主題リンクを変更する前に作成しなければならなかった2つの新しいリンクを実際に作成したかどうかチェックするために、送信側ノードXからの応答としてLinksメッセージを待機する(405)。これらのチェック(406、407)が無事に終了すると、受信側ノードはZへのリンクを削除し(408)、確認されたリンクとしてXを追加し(409)、LinkAddedメッセージをsenderXに返す(410)。
【0073】
図5は、ノードが入信AddLinkメッセージをどのようにして処理するのかを示している。これらのメッセージは、ノードがノードとの新しいリンクの作成を希望するときに送信される(図1を参照されたい)。メッセージは501で受信され、ノードはステップ502で、それが別のリンクのための空間を有するかどうかをチェックし、ない場合には503でエラーメッセージを返す。ある場合には、それはLinksQueryメッセージをsenderに送信し(504)、送信側ノードからの応答としてLinksメッセージを待機し(505)、その結果それは506で後者(送信者)が実際に受信側ノードへのリンクを作成したことをチェックできる。ノーである場合、それはリンクを追加するのを拒否し、終了するが、そうであるならば、それは次にsenderを確認されたリンクとして追加し(507)、確認する目的でLinkAddedメッセージをsenderに返す(508)。
【0074】
図6は、ノードが入信LinkAddedメッセージをどのように処理するのかを示す。これらのメッセージは、ChangeLinkメッセージまたはAddLinkメッセージのどちらかに応えて、別のノードが受信側ノードへのリンクを受け入れると送信される。リンクが受け入れられたことを示すLinkAddedメッセージが600で受信されると、そのステータスはステップ601で「確認済み」に変更される。それからリンクは、それが(ChangeLinkメッセージに応えて)新しいリンクのために変更されるのか、あるいはリンクが破壊されるかのどちらかまで維持される。
【0075】
図7は、ノードが入信LinkErrorメッセージをどのようにして処理するのかを示す。これらのメッセージは、ノードが受信側ノードへのリンクを、後者が(ChangeLinkメッセージまたはAddLinkメッセージを手段として)相互リンクを要求した後に作成できなかったとき、あるいはリンクが壊れていると考えられる(他端でのノードがメッセージに応答していない可能性がある、あるいはリンクが相互的ではない可能性がある)ときのどちらかに送信される。壊れたリンクは自己組織化プロセスによってではなく、(後述されるように)クライアントが二次ネットワークを横断するときに検出される。
【0076】
700でのメッセージの受信に続き、メッセージが、受信側ノードが未確認リンクを有するノードについてであるかどうかが判断される(701)。そうである場合、及びそれが要求されたリンクを作成できなかったことを示すエラーコードを伝搬する(702)場合、リンクは703で削除される。しかしながら、メッセージが、受信側ノードが未確認リンクを有するノードについてではない場合、受信側ノードはsubjectにLinkQueryメッセージを送信し(704)、応答としてLinksメッセージを待機し(705)、主題がそれ自体にリンクを有するかどうかをチェックするために706で応答をチェックし、有さない場合にはステップ703で主題ノードに対するそのリンクを削除する。
【0077】
図8は、ノードが入信LinksQueryメッセージをどのように処理するのかを示す。これらのメッセージは、別のノードが受信側ノードのリンクを知ることを希望するときに送信され、したがって後者(受信側ノード)は800でその受信時に801でLinksメッセージで応答する。
【0078】
図9は、ノードが入信Linksメッセージをどのようにして処理するのかを示す。それがどのように処理されるのかは、なぜ対応するLinksQueryメッセージが送信されたのかに完全に左右される。これは、とりわけ図3、図4、図5及び図7に示されるようにさまざまな理由から起こる。したがって、何が起こるかというと(what happens)、LinksQueryメッセージが送信されると、それは局所的に一意である基準を与えられ、メッセージハンドラが前記基準に関連付けられる。それから、Linksメッセージが受信されると(900)、適切なメッセージハンドラが特定され、メッセージは、ステップ902でメッセージがただちに処理されるように適切なメッセージハンドラに送られる。
【0079】
言うまでもなく、例えば受信側ノードが停止していたために、LinksQueryに応えてLinksメッセージがいままで送信されていない場合がある。したがって、一定の期間後にLinksメッセージが受信されない場合は、対応するメッセージハンドラは削除される。これはここに説明されるフローチャートのいずれにおいても明示的に示されていないが、それは単にリンク照会が時間切れになると、追加の処置は講じられず、フローチャート全体が「完了した」ことを意味する。
【0080】
(ノードの取り出し)
二次ネットワークの単一のノードのアドレスを考慮すると、ネットワークの他の、潜在的にはすべてのノードを発見することが可能である。これを行うことができる方法は非常に簡単である。既知のノードにすべてのリンクを要求するためにLinksQuerryメッセージを送信する。ノードは、それがリンクするノードのすべてのアドレスを含むLinksメッセージで応答する。それから、これらのノードのそれぞれに順々に連絡し、それらのリンクを要求し、このようにしてそれらすべてのリンクのアドレスを得ることができる。このように続けることで、ネットワークを横断し、それが含むすべてのノードを徐々に発見する。
【0081】
図10は、プロセスを詳細に示している。これが図1Aに示されている取り出しステップ35で使用されるプロセスであることが理解されるであろう。無事に連絡されたすべての既知のノードのアドレスは「確認済み」リストに入れられる。データは同時に取り出されてよい。「ウェブページコメント」例のケースでは、データの関連する項目はコメントのアドレスであり、これもノードアドレスと同時にconfirmed(確認済み)リストに入れられる。confirmed(確認済み)リストは、図1Aのコメント「取り出し」ステップ(36)に必要とされるアドレスを提供する。他方、「未確認」リストはまだ連絡を受けていない既知のノードのアドレスを含む。最後に「既知」のリストはすべての既知のノードのアドレスを含んでいる。それは「確認済み」リストと「未確認」リストの中のすべてのアドレスを含んでいるが、連絡されたノード及び応答していないノードのアドレスも含む。known(既知の)リストは、それに入れられたアドレスごとに、ソースaddress(アドレス)を含む追加フィールド−つまり、エラー報告のために、そのリストからcurrent(カレント)ポインタが指すアドレスが取得されたノードのアドレスを有する。
【0082】
どこで取り出しプロセスが発生するのかは重要ではない。それはノードあるいは他のどこかである可能性がある。ステップ1000では、ノードアドレスを取り出す要求がstart(開始)アドレス、つまり対象とする仮想ネットワークに属すると判断された1つのノードのアドレスとともに受信される。ステップ1002では、第2のアドレスポインタ、source(ソース)は当初ヌルである(1003)が、アドレスポインタcurrent(カレント)は当初このアドレスに設定される。
【0083】
ステップ1004と1005では、LinksQueryメッセージは、current(カレント)によって指定されるアドレスに送信され、応答が待機される。Linksメッセージが受信されると、それと並行して、current(カレント)は、Linksメッセージからのコメントアドレスとともにconfirmed(確認済み)リストに追加される(ステップ1006)。
【0084】
ステップ1007では、Linksメッセージに含まれるアドレスのそれぞれについて実行されるサブプロセスが入力される。アドレスがすでに既知のリスト内にあると(1008)、プロセスは次のアドレスに移動する(steps on to)。それ以外の場合、アドレスはknown(既知の)リストに、及びunconfirmed(未確認)リストに追加される(ステップ1009、1010)。また(1011)、current(カレント)のアドレスは追加されたアドレスのソースであるとしてknown(既知の)リストに入力される。
【0085】
いったんこのサブプロセスが完了すると、(その場合プロセスがステップ1012で終了する、uncofirmed(未確認)リストが空でない限り)ステップ1013でunconfirmed(未確認)リストから無作為にアドレスが選択される。このアドレスが新しいcurrent(カレント)アドレスになり、unconfirmed(未確認)リストから削除される。次のステップ(1014)は、それに関連付けられるソースアドレスを取り出すためにknown(既知の)リストの中でcurrent(カレント)をルックアップし、これをsource(ソース)ポインタに入れることである。無作為選択は必須ではない。例えば、カレントは未確認リスト内の「最も旧い」ノードとして選ぶことができるであろう、あるいはリストは別の基準(例えばノードのアドレス)でソートされ、current(カレント)はつねにこのリストの「最初の」ノードとなることができるであろう。しかしながら、current(カレント)の無作為選択にはその利点がある。それは(特にすべてのノードがつねに取り出されるわけではない場合に)システム内で負荷を拡散し、壊れたリンクがより迅速に発見されるようにネットワークのリンクの試験も拡散する。
【0086】
それから、プロセスはステップ1004から再び続行し、unconfirmed(未確認)リストが空になる−つまり、追加の新しいアドレスが見つからなくなる−まで反復する。
【0087】
取り出しプロセスの思わぬ結果は、それが壊れたリンクを発見することである。例えば、ノードが応答していない、あるいはリンクが相互的ではない場合がある。後者は、ノードAがノードBにリンクするが、ノードBがそのリンクテーブルにノードAを入れていないケースである。壊れたリンクが発見されると、前記リンクの「ソース」であるノードはLinkErrorメッセージを手段として通知される。図7がすでに示していたように、ソースノードは、次に(エラーレポートの精度を確認するために)リンク自体をチェックすることができ、結果としてリンクを削除する場合がある。応答していないノードは、設定されたタイムアウト期間内にLinksメッセージを受信できないことによってステップ1005で認識され、ステップ1015では、current(カレント)のアドレスと「応答なし」エラーコードを含むエラーメッセージがsource(ソース)に送信され、その結果制御はステップ1012に戻る。リンクの相互性の欠如(non−mutuality)は、current(カレント)について受信されたLinksメッセージがsource(ソース)のアドレスを含んでいるかどうかを判断するためにステップ1016での試験によって認識される。含んでいない場合、current(カレント)のアドレス及び「非相互的」エラーコードを含むエラーメッセージがsource(ソース)に送信される(ステップ1017)が、(図7のプロセスに従って)救済処置を講じるのはソースノードの責任であるため、取り出しプロセスは以前のように続行する。ステップ1106での試験は、source(ソース)がヌルである場合には省略される。
【0088】
複数の確認済みノードが、Linksメッセージに応答しないノードにリンクするとしても、最初にリンクに貢献したノード(ソースノード)だけが、「応答なし」であったことを通知されることに注意されたい。これは、部分的には、その方がフローチャートを理解しやすいためである。しかしながら、別の実際的な利点があると主張することができる。ノードは、それが一時的にオーバロードされているために(時間内に)応答しない可能性がある。この場合、(図7でのように)エラーがあるかどうかを試験するために、複数のノードにLinksQueryメッセージを同時に送信してほしくない場合がある。いずれにせよ、所望される場合、壊れたリンクにより影響を受けるすべての既知のノードに、このようなリンクが発見されると通知するようにノード取り出しアルゴリズムを更新することは分かりやすい。
【0089】
図10では、ノード取り出しは、すべての既知のノードが連絡を受けるまで停止しない。実際には、プロセスを早期に終了することを希望する場合がある。例えば、ユーザがファイルをそこからダウンロードする場所を探している場合、例えばすべて、1000の代わりに10の可能性のあるダウンロードアドレスの選択肢をユーザに提供することで十分である可能性がある。
【0090】
図10のアルゴリズムは完全にシリアルとして示されている。一度に1つのノードだけが連絡される。別のLinksQueryメッセージは、過去のメッセージに対する応答が受信された(あるいはそれが時間切れになった)後にのみ送信される。しかしながら、実際には、我々は複数のLinksQueryメッセージを同時に発行することにより取り出しを加速することを好む。ボックス1000では、複数の取り出し要求が図10のプロセスの複数のインスタンスによって同時に処理される場合がある。
【0091】
(説明)
(自己組織化の成功)
二次仮想ネットワークの目的とは、複数の接続されていないネットワークとは対照的に単一のネットワークの中にともにグループ化されなければならないすべてのノードを自己組織化することである。これが当てはまるかどうかは、初期のNotifyメッセージがどのように作成されるのかに負うところが大きい。例えば、すべてともにグループ化されなければならない12のノードのグループがあるが、このグループの内、5つのノードだけが5つのこのグループ内の他のノードについて通知を受信し、他の7つのノードのどれもこれらの5つのノードのどれかについて通知されない場合、ノードが単一のネットワークに自己組織化することは不可能である。代わりに、それらは、5つのノードの1つと7つのノードの1つという2つの別々のネットワークに配置される(arrange into)。しかしながら、初期通知が、ノードが単一のネットワークに自己組織化することが不可能でないようであれば、自己組織化のプロセスは、ノードが単一のネットワークに自己組織化しない可能性がきわめて低いほどである。自己組織化の結果単一ネットワークが生じる確率の計算は複雑であり、初期通知を作成する機構に左右される。しかしながら、我々はシミュレーションで複数の異なる初期通知機構を経験し、これまでノードが単一のネットワークに自己組織化することができなかったことはない。
【0092】
(悪意のあるノードに対するロバスト性)
これまで、すべてのノードはプロトコルに従うと仮定されてきた。しかしながら、ルールに従って行動しない悪意のあるノードがいる可能性がある。それらは、他のノードによって維持されているリンクを破壊しようとする、及び/あるいはそれら自体に多すぎるリンクを取得しようとする。全体的なシステムがこのような悪用に対し可能な限りロバストであることが望ましい。
【0093】
これまで説明されてきたシステムは悪意のあるノードに対してすでにかなりロバストである。それは、各ノードが、自身のリンクを変更する前に、つねにLinksQuery−Linksメッセージ交換を用いて他の関連性のあるノードによって維持されるリンクをチェックするためである。例えば、ノードがAddLinkメッセージを受信するとき(図3を参照されたい)、それは、自身のリンクとして送信者を追加する前に、最初に、送信側ノードが実際にそれにリンクしたかどうかをチェックする。
【0094】
しかしながら、システムには依然として相対的な弱さがある。現状では、ノードは、それらがLinksメッセージで応答するときに容易に「ウソをつく」ことができる。多くの場合、ノードは受信側ノードがそれにリンクしていることをチェックするためにLinksQueryメッセージを送信する。受信側ノードは、このことを知っているので、それがつねにリンクとしてLinksメッセージの送信者を含むように修正された捏造Linksメッセージで応答できる。これにより、ノードはそれにリンクするL個のノードという許容数よりはるかに多いノードを有することができる。結果として、これはシステム内の「よい」リンクの総数を削減するであろう。
【0095】
幸いなことに、この弱さに対処する方法がある。これは、ノードがプロキシノードを通してそれらのLinksQueryを送信する場合に行うことができる。これらのプロキシは、ノードが照会を送信することを希望するたびに無作為に選ばれる。各ノードは、例えば、それが現在リンクしているノードをプロキシとして使用できる。このようにして、別のノード(B)のリンクを知ることを希望するノード(A)は、それ(ノードB)が受信するLinksQueryメッセージがプロキシノード(C)からであり、ノードBがノードCから受信するメッセージはまったくノードAを参照しないため、ノードBにとっては未知である。したがって、ノードBが全体的なシステムに重大な影響を及ぼす捏造メッセージを送信する手っ取り早い方法はない。
【0096】
言うまでもなく、悪意のあるプロキシの影響はどのようなものであるかに関する疑問がある。明らかに悪意のあるプロキシは有害な影響を及ぼすが(プロトコルに従わないノードがパフォーマンスにある程度影響を与えるのは避けられない)、この影響は限られている。その理由は、それらが不当に処理できるのは、それらが転送するように依頼されるLinksQueryだけであり、これらの要求はすべてのノード全体でだいたい均一に拡散されるためである。他方、プロキシが使用されないときには、悪意のあるノードは非常にアクティブであることによる大混乱を引き起こすことがある。これらのノードが多くの偽のAddLinkメッセージを送信し、それらが実質的に送信する多くのLinksメッセージを捏造すると、全体的なシステムに及ぼされる影響ははるかに大きくなる。
【0097】
(一次仮想ネットワーク)
一次ネットワークは、我々の前述された国際特許出願に詳しく説明されている。ここでは、二次ネットワークの自己組織化を促進するNotifyメッセージの作成を可能にする改善策とともに、基本的な取り出し機構と自己組織化機構が説明される。
【0098】
最初に、この機構によって使用される仮想座標空間の概念を説明することが必要である。各ノードがラベルを有することはすでに言及された。ラベルは仮想空間で座標に変換される。空間は一次元、二次元またはさらに高い次元である場合がある。正確な変換機構はあまり重大ではない。つまり一次元空間の場合、バイナリ数と見なされるラベルは座標として直接的に使用できる。二次元及び三次元以上の場合、好ましい方法では、ビットの文字列として見なされるラベルが2つまたは3つ以上の等しいグループに区分され、バイナリ数と見なされる各グループが座標の1つを形成する。各座標(つまり、一次元空間での前記座標)は範囲[0,1]にあるように拡大縮小される。
【0099】
所望される場合、(多くの場合マンハッタン距離と呼ばれる)都市ブロック距離のような他の距離が使用できるであろうが、この仮想空間の2つのラベルの間の距離が、2つの座標集合の間のユークリッド距離である。座標空間は、x1とx2の間のx方向の距離が
Min{(1−|x1−x2|),|x1−x2|}
となるように重なり(wraps)、したがって点(x1,y1)と(x2,y2)の間の二次元のユークリッド距離は、
【数1】
【0100】
である。
【0101】
我々は、この点で各ノードが、多くのエントリが他のノードへのリンクを表すリスト22(図1)を有することも思い出す。各エントリは、このような別のノードのラベルとアドレスから構成される。当初、このリストは空であるため、ノードは、ブートストラップリンク−すなわちそれがネットワークの他のノードに最初に連絡できるように2、3のリンク(通常は4つ)−の第2の類似したリストを有する。ノードは(短距離リンクと呼ばれる)リスト22の中のリンクだけではなく、階層的に配列された追加のこのようなリスト、及び/または長距離リンクのリストも有する場合がある。これらは、我々の初期の国際特許出願に説明されているが、それらは付加的であるため、ここでは説明されない。
【0102】
(メッセージ)
最初に、以下のメッセージが使用される(一次仮想ネットワークで使用されるメッセージが二次仮想ネットワークで使用されるメッセージとは異なり、二次仮想ネットワークで使用されるメッセージから完全に独立していることに注意する)。
【0103】
FINDメッセージは、ノードルックアップを起動し、実行するため、及び「PULL(プル)」更新をサポートするために使用される。それらは、
・ターゲットノードのラベル
・照会を開始したノードのアドレス
を含む。
【0104】
FOUNDメッセージは照会の結果を返すために使用される。それらは、
・ターゲットノードのラベル
・発見されたノードのラベル
・発見されたノードのアドレス
・発見されたノードと関連付けられる二次ネットワークのノードのアドレス
・アプリケーション特有データ−このケースでは、発見されたノードと関連付けられるコメントノードのアドレス
PUSH(プッシュ)メッセージは、ノードのラベルを他のノードに宣伝する。それらは、
・主題ノードのラベル
・主題ノードのアドレス
・ターゲットノードに到達するためのhops to go(移動ホップ)数
NOTIFYメッセージはプッシュ−更新を伝搬するために使用される。それらは、
・主題ノードのラベル
・主題ノードのアドレス
を含む。
【0105】
(取り出し)
図11は、各ノードが入信Findメッセージをどのようにして処理するのかを示している。原則的には、受信側ノードはそれ自体よりFindメッセージで特定されたターゲットノードにより近いノードを探し、成功した場合はFindメッセージを次へ回す。成功しない場合、それは独自のアドレスとラベルを返す。それは、以下のステップを実行することによってこれを行う。
【0106】
ステップ1100:ノードは、ターゲットノードのラベルと開始側ノードのアドレスを含むFindメッセージを受信する。
【0107】
ステップ1105:ノードはターゲットノードのラベルをラベル空間の座標に変換し、それが記録しているすべてのリンク(ノード)の内で、どれがラベル空間内のターゲットノードに最も近いのかを計算する。当該ノードはnearestノードと指定される。
【0108】
ステップ1110:ノードは自身の座標とターゲットノードの座標の間の距離を、nearestノードの座標とターゲットノードの座標の間の距離に比較する。
【0109】
ステップ1115:自身の座標とターゲットノードの座標の間の距離が少ない(あるいは等しい)場合、ノードは開始側ノードにネットワーク10を介して、自身のラベルとアドレスを含んだFoundメッセージを送信する。
【0110】
ステップ1120:nearestノードの座標とターゲットノードの座標の間の距離が少ない場合、ノードはFindメッセージをnearestノードに転送する。
【0111】
ステップ1115で返されるノードのアドレスはターゲットラベルが付いたノードのアドレス、またはラベル空間内でそれに近いもののどちらかである。返されるラベルがターゲットラベルに一致しないときは、それはターゲットノードが存在していない、または仮想ネットワークが十分に自己組織化されていないかのどちらかを意味する。
【0112】
(プッシュ)
各ノードはPush(プッシュ)更新を自発的に開始する。例えば、各ノードは定期的にPush(プッシュ)更新プロセスを開始する可能性がある。Push(プッシュ)更新では、ノードはノードの無作為系列(random series)を通して自身のラベルとアドレスとともにPush(プッシュ)メッセージを送出し、系列の長さに制限を設定する。系列の中の最後のノードは開始側ノードに向かってNotifyメッセージを送り返す。図12、図13、及び図14はこのプロセスの多用な部分を示している。
【0113】
図12は、以下のステップを使用してノードがどのようにしてPush(プッシュ)更新を開始するのかを示す。
【0114】
ステップ1200:ノードはそのブートストラップリンクの中から無作為にリンクを選択し、選択されたリンクによって特定されるノードのアドレスを次のメッセージのforward(転送)アドレスとして入力する。
【0115】
ステップ1205:ノードはPush(プッシュ)メッセージのフィールドhops to go(移動ホップ)に小さい正の乱数を入力する。
【0116】
ステップ1210:ノードは自身のラベルとアドレスをPush(プッシュ)メッセージの中のsubjectノードのラベルとアドレスとして入力し、ネットワーク10を使用して、Push(プッシュ)メッセージをforward(転送)アドレスにあるノードに送信する。
【0117】
図13及び図14は、短距離リンクがどのようにして更新されるのかを示している。Push(プッシュ)メッセージは、短距離リンクを更新するためにNotifyメッセージとともに使用される。この更新には2つの段階がある。第1の段階では、各ノードは、受信されるようなメッセージの移動ホップ(hops to go)の値が「0」になるまでPush(プッシュ)メッセージを無作為に転送する。移動ホップ(hops to go)の値が「0」である場合、受信側ノードはNotifyメッセージを送信することによってPush(プッシュ)更新の第2段階を開始する。第2段階では、Notifyメッセージは、そのラベルが漸次的に仮想空間の主題に近くなるノードに連続して転送される。より近いラベルをもつノードが発見されない場合、必要に応じ、最後に発見されたノードのリンクが更新される。これは、例えば、それがまだ確立されていない短距離リンクを有していないためなど、それ以外の場合それが特定の主題ノードを発見できないときにつねに当てはまる。また最後に発見されたノードは、潜在的にそのリンク集合も改善できるであろうノードに追加のNotifyメッセージを送信する。
【0118】
図13のPush(プッシュ)更新の第1の段階を参照すると、入信Push(プッシュ)メッセージを処理するには以下のステップが必要となる。
【0119】
ステップ1300:ノードはPush(プッシュ)メッセージを受信する。Push(プッシュ)メッセージは、開始側ノードのラベルとアドレスをsubjectノードとして含み、フィールドhops to go(移動ホップ)に値を有する。
【0120】
ステップ1305:受信側ノードはそのブートストラップリンクの中からリンクを無作為に選択し、選択されたリンクによって特定されるノードのアドレスを次のメッセージのforward(転送)アドレスとして入力する。
【0121】
ステップ1310と1315:受信側ノードはフィールドhops to go(移動ホップ)の値を1だけ減少させ、hops to go(移動ホップ)の減少した値が依然としてゼロより大きいかどうかをチェックする。
【0122】
ステップ1320:減少した値が依然としてゼロより大きい場合、ノードはPush(プッシュ)メッセージをそれが入力したforward(転送)アドレスに転送する。
【0123】
ステップ1325:値がゼロである場合、ノードは、代わりに、(受信されたPush(プッシュ)メッセージに指定される)開始側ノードのラベルとアドレスをNotifyメッセージのsubject(主題ノード)として入力し、それが入力したforward(転送)アドレスにNotifyメッセージを送信する。
【0124】
図14を参照すると、Push(プッシュ)更新を処理し、Notifyメッセージを処理する第2の段階は以下のステップを伴なう。
【0125】
ステップ1400:ノードは、subjectノードとしてノードのラベルとアドレスを含むNotifyメッセージを受信する。
【0126】
ステップ1401:受信側ノードは、Notifyメッセージのsubjectが受信側ノードと同じラベルを有するかどうかをチェックする。
【0127】
ステップ1402:そうである場合は、受信側ノードはNotifyメッセージのsubjectが受信側ノードと同じアドレスを有するかどうかをチェックする。その場合、それは追加の処置を講じない。
【0128】
しかしながらNotifyメッセージのsubjectが受信側ノードと同じラベルの付いているが、受信側ノードとは異なるアドレスのノードである場合、2つのイベントが発生する。第1に(ステップ1403)受信側ノードは入信Notify(通信)メッセージの主題ノードに、主題として受信側ノードの自身の短距離リンクのリストから無作為に選ばれたノードを指定するNotifyメッセージを送信する。第2に、ステップ1404は、二次ネットワークによる動作のためにNotify(通知)メッセージを作成させる。しかしながら、受信側ノードはこのようなメッセージを直接的に作成することはできない。一般的には、通信網上での異なる仮想ネットワーク間でメッセージを送信するのを回避することが好まれるが、主要な問題は受信側ノードが二次ネットワークのそれ自体のノードのアドレスだけではなく、subjectノードに関連する二次ノードのノードアドレスも必要とするという点である。受信側ノードはこのアドレスを持っていない。したがって、2段階プロセスが使用される。
【0129】
第1に、受信側ノードは、入信Notifyメッセージの中の主題として指定される特別な一次ネットワークのノードにCrossNotifyメッセージを送信する。このメッセージは以下のものを含む。
【0130】
・受信側ノード(つまり、入信(一次ネットワーク)メッセージを受信したノード)のアドレスに設定されたsenderアドレス
・入信Notifyメッセージに含まれるアドレスに設定されたreceiver(つまり宛て先)アドレス
・受信側ノードと関連付けられる二次ネットワークのノードのアドレスに設定されるsubjectアドレス
最初の2つのアドレスが一次ネットワーク上のノードのアドレスであり、第3のアドレスが二次ネットワーク上のノードのアドレスであることに注意する。
【0131】
第2に、CrossNotifyメッセージを受信する一次ネットワークのノードは、実質的には、それを二次ネットワークの関連するノードに転送する。必要ならば、転送側ノードはメッセージを二次ネットワークで使用されているフォーマットにフォーマットし直し、(一次ネットワーク)receiverアドレスを二次ネットワークの関連するノードのアドレスで置換できるであろう。メッセージは、それから、まさに図3に示されているように処理されるであろう。我々が「実質的には」という理由は、実際には、CrossNotifyメッセージを受信する一次ネットワークのノードだけが二次ネットワークのその関連するノードに、CrossNotifyメッセージのsubjectフィールドに指定されるアドレスを含む簡略で局所的なメッセージを送信することが好まれるからである。その場合、図3のプロセスは、notifylevelを適切な値に設定するステップを含むように修正されるであろう。
【0132】
このプロセスは、ボックスがノードを表し、矢印がメッセージを表す図15を参照して例によって図解される。一次ネットワークのノードP1が、図14のステップ1400で、一次ネットワークのノードP2のラベルLP2とアドレスAP2をsubjectとして含むNotify(通知メッセージ)を受信すると仮定する。ノードP1では、主題ノードがP1と同じラベルを有する(つまりLP1=LP2)が、別のアドレス(AP1≠AP2)を有することが認識される(図14のステップ1401、1402)。ノードP1は、その二次ネットワークノードS1のアドレスAS1を知っており、(図14のステップ1404で)送信者アドレスAP1、受信者アドレスAP2、及び主題アドレスAS1でCrossNotifyメッセージを作成する。このメッセージは一次ネットワークのノードP2で受信され、これは、アドレスAS1で局所通知メッセージを二次ネットワークの関連するノードS2に送信する。代わりに、二次ネットワークのノードS2は、LocalNotifyメッセージの受信時に、図3のプロセスに従ってそれ自体リンクを作成する代わりに、それがノードS1に送信し、それ自体を主題として指定する(図12の点線によって示される)(二次ネットワークの)追加のNotifyメッセージを作成できるであろう。Notifyメッセージは、それから、図3のプロセスを使用するノードS1で処理される。このオプションは追加のメッセージを必要とするが、図3のプロセスが実行されるようになると、Notifyメッセージが、そのアドレスがメッセージのsubjectフィールド内にあるノードによって実際に送信され、subjectノードがこのようにして依然として存在しているとして本質的に確認されるという利点を有する。
【0133】
いま図14ステップ、1405に戻ると受信側ノードはsubjectノードのラベルを座標に変換し、それが記録した短距離リンクの内のどれが、その座標が仮想空間内のsubjectノードの座標にもっとも近いノードラベルにつながるのかを計算する。当該ノードはnearestノードと指定される。
【0134】
ステップ1415:受信側ノードは自身の座標とsubjectノードの座標の間の距離を、nearestノードの座標とsubjectノードの座標の間の距離と比較する。
【0135】
ステップ1415では、受信側ノードとsubjectノードの間の距離が同じまたは少ないことが判明すると、受信側ノードはsubjectノードのラベルとアドレスを自身の短距離リンク集合((ステップ1420)。このプロセスは、図16を参照してさらに説明される)の中のリンクとして追加し、subjectノードに受信側ノードのラベルとアドレスを含むNotifyメッセージを送信し(ステップ(1430)、nearestノードに、subjectのノードのラベルとアドレスを含むNotifyメッセージを送信する(ステップ1435)。
【0136】
ステップ1415で、最も近いノードとsubjectノードの間の距離がより大きいと判明すると、受信側ノードは、それがnearestノードにsubjectノードのラベルとアドレスを含むNotifyメッセージを送信するという点でステップ1435に戻る。
【0137】
図16は、ノードが、その短距離リンクを更新するときにどのように動作するのかを詳細に示している。それは新しいリンクをその短距離リンクに追加し、このリンクに代わられるすべての短距離リンクを削除する。
【0138】
図16を参照すると、例えば図14のステップ1420の結果として、ノードは新しいリンクをその短距離リンクに追加する必要がある。
【0139】
ステップ1600:更新ノード(すなわち、その短距離リンク集合に対して更新を行うノード)は、新しいリンクのためのノードのアドレスを有する。
【0140】
ステップ1600:更新ノードは、更新ノードに対してより新しいノードにさらに近いノードに関するすべての既存のリンクを特定する。これらの特定されたリンクは入れ替えられなければならない。これらのリンクを特定するために更新ノードは、各既存のリンクに、新しいノードの座標とその既存のリンクで指定されるノードの座標の間の距離を計算する。それは、これらの距離のそれぞれを自身の座標とそれぞれの既存のリストに指定されるノードの座標の間の距離と比較する。
【0141】
ステップ1610:新しいノードに関する距離が更新ノードに関する距離より短いすべてのリンクは短距離リンクから削除される。
【0142】
ステップ1620:更新ノードは、その短距離リンクに新しいノードのためのリンクを追加する。
【図面の簡単な説明】
【0143】
【図1】本発明のある実施形態で使用されるコンピュータのブロック図である。
【図1A】一次仮想ネットワークと二次仮想ネットワークを使用するデータ検索動作を示すフローチャートである。
【図2】コンピュータネットワークのノード間のリンクの管理の概略図である。
【図3】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図4】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図5】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図6】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図7】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図8】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図9】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図10】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図11】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図12】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図13】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図14】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図15】図14に描かれているプロセスの間のメッセージの流れを描く概略図である。
【図16】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【技術分野】
【0001】
本発明は仮想ネットワークに関し、特に集中記憶装置または制御装置を備えないものなど、ピアツーピアシステムなどの分散型システムに関するが、それに限定されない。
【発明の開示】
【課題を解決するための手段】
【0002】
本発明のある態様によれば、各ノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを有する複数のノードを有する仮想ネットワークを操作する方法が提供され、
(i)第1のノードと第2のノードの間のリンクを要求するメッセージを受信することと、
(ii)第1のノードと第2のノードの両方が、それぞれのケースでそのリスト内に所定数未満であるいくつかのアドレスを有するかどうかを判断することと、
(iii)この条件が満たされる場合には、第1のノードのアドレスを第2のノードのリストに挿入し、第2のノードのアドレスを第1のノードのリストの中に挿入することと、
(iv)この条件が満たされない場合には、第1のノードがそのリストの中に前記所定数より少なくとも2少ないいくつかのアドレスを有するかどうかを判断し、そうである場合には、
(a)第3のノードのアドレスを第2のノードのリストから選択することと、
(b)第3のノードのアドレスを第2のノードのリストから削除することと、
(c)第2のノードのアドレスを第3のノードのリストから削除することと、
(d)第2のノードのアドレスを第1のノードのリストに挿入し、第3のノードのアドレスを第1のノードのリストに挿入することと、
(e)第1のノードのアドレスを第2のノードのリストに挿入し、第1のノードのアドレスを第3のノードのリストに挿入することと、
を含む。
【0003】
別の態様では、本発明は仮想ネットワークのノードを提供し、前記ノードは他のこのようなノードの所定数のアドレスまでを記憶するためのリストを含む記憶手段と、以下の動作、つまり
メッセージを受信することと、
リストの内容についての情報を要求するメッセージに応えることと、
リストからアドレスを削除するために受信した要求に従うことと、
リストへのアドレスの挿入を要求するメッセージに従うことと、
ノードと第2のノード間のリンクを要求するメッセージの受信に応えて、
(A)そのリストの内容についての情報を要求する第2のノードに対するメッセージを作成することと、
(B)第1のノードと第2のノードの両方が、それぞれのケースで、そのリストに所定数未満であるいくつかのアドレスを有するかどうかを判断することと、
(C)この条件が満たされる場合、第2のノードのアドレスをそのリストに挿入し、そのリストにノードのアドレスを追加するように第2のノードに要求するメッセージを第2のノードに対して作成することと、
(D)この条件が満たされない場合には、ノードがそのリストに、所定数より少なくとも2少ないいくつかのアドレスを有するかどうかを判断することと、そうである場合に、
(a)第3のノードのアドレスを第2のノードのリストから選択することと、
(b)第2のノードのアドレスを第1のノードのリストに挿入し、第3のノードのアドレスを第1のノードのリストに挿入することと、
(c)第2のノードのリストからの第3のノードアドレスの削除、及びノードのアドレスの挿入を要求するメッセージを第2のノードに作成することと、
(d)第3のノードのリストからの第2のノードのアドレスの削除、及びノードのアドレスの挿入を要求するメッセージを第3のノードに作成することと、
を実行するようにプログラミングされる処理手段によって定められる。
【0004】
本発明の他の好ましい態様は請求項に定められる。
【0005】
本発明のいくつかの実施形態は、以下、添付図面を参照して一例として説明する。
【発明を実施するための最良の形態】
【0006】
(ノード)
本説明中、処理機能、記憶機能及び通信機能を有するコンピューティングノードについて言及する。コンピューティングノードは、1台のコンピュータでも、他のデバイスでもよく、あるいは−単一のコンピュータがその上で実行するいくつかの独立したプログラムまたはプロセスを有することができることに注意すると−このようなプログラムまたはプロセスであってよい。記憶されるデータの項目は、いくつかのこのような項目は単一のプログラムまたはプロセスによってサービスを受けてよいが、別個のノードとして見なされてもよい。
【0007】
本説明は、各コンピューティングノードが、メッセージがそれに送信できるようなIP(インターネットプロトコル)ネットワークのような電気通信網など、なんらかの通信インフラストラクチャに接続されていることを前提とする。したがって、各コンピューティングノードは通信インフラストラクチャ内のノードも構成する。
【0008】
また、仮想ネットワークに属する仮想ノードに対しても述べる。コンピューティングノードはそれに関連付けられる(おそらくは異なる仮想ネットワークに属する)2つまたは3つの仮想ノードを有することができるため、区別は重要である。その名が暗示するように、仮想ノードはいかなる物理的な意味でも存在しない。むしろやがて明らかになるように、その存在は、仮想ノードの間のリンクを定義し、したがってそれが属する仮想ネットワークも定義する記憶されているデータにより確立される。
【0009】
必然的に、仮想ノードは、それに処理機能、記憶機能、及び通信機能を与えるコンピューティングノードと関連付けられなければならない。つまり仮想ノードによるメッセージの送信、受信及び処理に対する参照は、仮想ノードの代わりにコンピューティングノードによるこのような送信、受信または処理を参照する。
【0010】
例は図1に図示されている。コンピュータは、ネットワーク10を介する通信のために通常の構成要素、すなわちプロセッサ1、メモリ2、ディスプレイ3、キーボード4及び通信インタフェース5を有する。
【0011】
メモリ2は、オペレーティングシステムと他のプログラム(図示せず)、及び図示されているテキストファイル20などのデータファイルを格納している。それは、テキストファイル20とそれ自体のアドレス21bに対応するラベル21aを含む21も有する。さらに、それはアドレスリスト22、及びコンピュータ上で仮想ネットワークのノードの存在をともに定義するサポートプログラム23を有する。このノードにはアドレス24が付いている。別の仮想ネットワークのノードの、コンピュータ上での存在をともに定義するアドレスリスト25及びサポートプログラム26も図示されている。このノードにはアドレス27が付いている。リスト22、25に記憶されているアドレスは、同じ仮想ネットワーク内の他のノードのアドレスである。
【0012】
(ルックアップシステム)
これは本発明の応用例の考えられる1つの例でしかありえないが、ここで分散型ルックアップシステムを説明する。このシステムによってユーザはコメントをウェブページと関連付けることができる。ユーザはこのページをビジットするたびに、他のユーザが行ったコメントを見る機会もある。コメントは、(例えばテキストファイルとして)コメントを寄せたユーザのコンピュータに記憶されている。
【0013】
ウェブページ(またはむしろ、自分のコンピュータ)を見ているユーザは、ウェブページのユニバーサルリソースロケータ(URL)を有し、必要とされているのはユーザがコメントを取り出すことができる機構である。この例では、前記機構は以下のとおりである。
【0014】
他のウェブページについてのコメントを含む他のテキストファイル、及びおそらく他の関連していないファイルもそうである可能性があるように、テキストファイルはコメントを寄せたユーザのコンピュータに記憶され、我々の国際特許出願WO第03/034669号[代理人参照第A30044号]に説明される方の仮想ネットワークのノードと関連付けられている。(本説明の文脈では一次仮想ネットワーク、または単に一次ネットワークと呼ばれる)この仮想ネットワークは、それを特定するラベルを有するのであればそのアドレスを知らなくてもノードにメッセージを送信できるようにするのに役立つ。その種のネットワークは一意のラベル(ノードあたり1つ)で機能できるが、この例ではラベルは一意ではない。むしろ、ある特定のウェブページについてのコメントを含むテキストファイルに関連付けられるすべてのノードが同じラベルを有する。このラベルはウェブページのURLのハッシュ関数である。この仮想ネットワークは、ただ1つのノードに到達する取り出し機構を提供する。
【0015】
テキストファイルは、第2の仮想ネットワークのノードとも関連付けられる。これ(二次仮想ネットワーク)は前記1つの特定のウェブページについてのコメントを含むテキストファイルと関連付けられているノードだけを含む。
【0016】
しかしながら、我々の前述された国際特許出願による一次ネットワークの使用が好ましいが、それが必須ではないことに注意する。事実上、仮想ネットワークを使用することはまったく必須ではない。ラベルを受信し、それに対応する1つのノードのアドレスを返す別の一次取り出し機構が代わりに使用できるであろう。
【0017】
コメントをポストするコンピュータは図1に図示されるとおりであり、
・一次ネットワーク内でノードを作成しなければならない。このノードはラベル21a及びネットワークアドレス24を有している。
【0018】
・二次ネットワーク内でノードを作成しなければならない。このノードにはネットワークアドレス27が付いている。
【0019】
当初、アドレスリスト22、25は、リスト22がブートストラップリンクを含んでいるのを除き、空である。リスト22が一次ネットワークのいくつかの他のノードのラベルとアドレスを含み、リスト25が二次ネットワークのいくつかの他のノードのアドレスを含むことを確実にするためのネットワークの自己組織化については、後述する。まず当分は、システムはこれらのラベルとアドレスが存在しているという仮定に基づいて説明する。
【0020】
この時点でアドレスについて少し説明することが必要である。テキストファイル20によって形成されるノード、一次仮想ネットワークのノード、及び二次仮想ネットワークのノードは、概念上はただ1つのアイデンティティを有しているが、独自のアドレスを有している。実際問題としてはこれは特に便利ではないが、それぞれのノードに通信網10内の異なるアドレスを割り当てることが可能であろう。我々の好ましいインプリメンテーションでは、各ノードは以下の3つの部分から構成されるアドレスを有する。
【0021】
・コンピューティングノードの場所を指定するインターネットアドレス。例えば、130.146.209.15
・コンピューティングノードにおけるある特定の通信ポートの場所を指定するポート番号。ポートはインターネットアドレスの標準的な部分である。例えば、それらは異なる独立したアプリケーションプログラムがメッセージを独立して送信、受信できるようにする。つまり、それぞれが専用のポートでメッセージを受信し、他のアプリケーションプログラム向けのメッセージは受信しない、あるいは他のアプリケーションプログラム向けのメッセージによって「混乱」しないであろう。ポート番号とともにインターネットアドレスは、(使用されるTCP/IPなどの通信プロトコルの一部であるため)ネットワークアドレスと見なすことができる。すべての一次ノード及び二次ノードのためのネットワークアドレスは同じである場合があるが、必ずしもそうである必要はない。例えば、一次ノードのための全メッセージは、(このようなメッセージを区別する1つの方法である)二次メッセージがそこで受信されるそれとは別のポートで受信されてよい。
【0022】
・メッセージが向けられる特定のノードの場所を指定するノード識別子(整数値)。例えば一次ネットワークでのすべてのメッセージが専用ポートで受信される場合も、各ノードと関連付けられた局所的に一意の識別子がある。したがって、複数のノードがあるときに、メッセージがどのノード向けであるのかが明確である。このノード識別子はアプリケーションに特殊なアドレス拡張子(それは標準インターネットプロトコルの一部ではない)である。それは送信されるメッセージに含まれるだけである。それを受信するプロセスはこれを「知って」おり、メッセージがどのノードに転送される必要があるのかを判断するためにこのノード識別子を調べる。
【0023】
両方のノードが同じネットワークアドレスを有することはありえるが、必ずしもそうである必要はない。(部分的には使用可能なポートの数が制限されることがあるため)すべてのノードが専用のポートを有するわけではないが、2つのポート(したがって、2つの異なるネットワークアドレス)を有することもある。つまり、1つは一次ネットワーク用、1つは二次ネットワーク用である。通常、すべて同じポートを使用できるであろういくつかの二次ネットワークがある。
【0024】
以下では、ノードのアドレスに対する参照がそのノードの完全なアドレスを指すことが強調されなければならない。
【0025】
特に魅力的な手法は、テキストファイル及び一次ノードと二次ノードがすべて同じノード識別子(及びIPアドレス)を有し、ポート番号だけが異なっていることを提供することである。このようなアドレス指定プロトコルは、あるノードのアドレスを有し、それに関連付けられる別のノードのアドレスを必要とする場合に、後者のノードのアドレスが、調べられなければならないよりはむしろ、前者のアドレスから推定される可能性があるという点で、処理のいくらかを簡略化するための機会を与える可能性がある。しかしながら、以下の説明では、このような簡略化は行われておらず、その結果これらのプロセスは任意のアドレスプロトコルを扱うであろう。
【0026】
ウェブページを見るコンピュータは、
・ラベルを取得するために同じハッシュ関数をURLに適用することによって
・あるノードのアドレスを取得するために一次仮想ネットワーク上で(ラベルを含む)照会を送信することによって、
・見つけられたアドレスを使用して、二次仮想ネットワーク上の多くの(あるいはすべての)他のノードのアドレスも取得するために二次仮想ネットワーク上で照会を送信することによって、
・表示するためのコメントを取り出すためにこれらのアドレスを使用することによって
関連付けられたコメントを取り出す。
【0027】
取り出すコンピュータが必ずしも仮想ネットワークのノードを含まなくてもよいことに注意する。つまり、それは、取り出しプロセスを実現するためのソフトウェアをロードされ、それが仮想ネットワークのノードが常駐するコンピュータと通信できるように通信インタフェースをロードされた従来のコンピュータである場合がある。このプロセスは図1Aのフローチャートに示され、以下のように進行する。
【0028】
ステップ30:ユーザがURLを入力する(あるいはハイパーリンクを呼び出す)のに続き、コンピュータは対応するウェブページを取り出す。このステップはまったく従来的である。
【0029】
ステップ31:ラベルを取得するためにハッシュ関数がURLに適用される。我々の以前の国際特許出願に説明されるように、これはSHA−1アルゴリズムを使用できる。
【0030】
ステップ32:このラベルと取り出し側コンピュータのネットワークアドレスを含む「Find」メッセージが一次ネットワークに送信される。コンピュータが少なくとも1つのこのようなアドレスを所有していることが必要なのは明白である。
【0031】
ステップ33:取り出し側コンピュータが一次コンピュータから「Found」メッセージを受信する。このメッセージは二次ネットワークの関連付けられたノードのアドレス及びコメントのアドレスだけではなく、発見されたノードのラベルとアドレスも含む。「Found」メッセージが妥当な時間内に受信されない場合にプロセスを打ち切るためのタイムアウト機構を含むことができる。
【0032】
ステップ34:この例では、一次ネットワークは常に、それが「Find」メッセージに含まれるラベルに最も近いラベルを含むノードのアドレスを返すように配置される。したがって、返されるラベルが要求されたラベルと同じであるかどうかを確かめるためにチェックが実行され、同じではない場合、プロセスは終了する。「最も近い」の意味の説明については以下を参照されたい。
【0033】
ステップ35:ラベルが一致すると仮定し、取り出し側コンピュータは、それがそれにより二次ネットワークを使用して追加のアドレスを取り出すために発見(Found)メッセージによって返されるアドレスを使用する(詳しく後述される)プロセスを実行する。
【0034】
ステップ36:次にこれらのアドレスはコメントを含むテキストファイルを「ポスト側」コンピュータから取り出すために使用される(uses)。
【0035】
(二次仮想ネットワーク)
このネットワークの目的は、ノードのグループを、グループの一部であるすべてのノードを発見するためにその後使用できる単一の仮想ネットワークに自己組織化することである。主要な要件は、結果としてネットワークがすべてのノードを含んでいることである。別の要件は、ネットワークを作成、維持するために必要とされるシステム負荷がすべてのノード全体で等しく拡散されることである。これは、さまざまなユーザが自分のリソースを1つの分散型アプリケーションに寄与するときに重要である、最も「公平」であるだけではなく、システムを過負荷から保護するのに役立つ。
【0036】
したがって、ネットワークには以下の特性がある。
【0037】
・各ノードによって維持されるリンクの数は好ましくは同じである。
【0038】
・すべてのリンクは双方向である。その結果ノードへのリンク数も各ノードについて同じである。これはノードが受信し、処理しなければならないメッセージ数に影響を及ぼすため重要である。
【0039】
・それは「平坦な」構造を有している。ノードは自らを階層的に配列しない。その結果システム負荷はすべてのノード全体で等しく拡散される。
【0040】
(各ノードの構造)
各ノードは、それに関連付けられる以下のデータを有する。
【0041】
・他のノードに対する複数のリンク。各リンクは別のノードのアドレスにすぎない。核リンクに関連付けられているのは、「確認済み」または「未確認」である場合があるステータスである。各ノードは、システム全体のパラメータLによって指定される最大数のリンクを維持できるにすぎない。Lの典型的な値は、例えば6である。このパラメータがすべてのノードについて同じであることは必須ではないが、それらが異なるようにすることにより獲得される利点はない。
【0042】
・スペアリンク、つまり手短に言えばスペアのリスト。各スペアは別のノードのアドレスにすぎない。スペアは仮想ネットワークを構築するために自己組織化プロセスによって使用される。ノードは、それがすでにノードにリンクしているため、またはそれがすでに最大数のリンクを有しているためのどちらかの理由により、それがリンクとして追加できない前記ノードについて通知されると他のノードをスペアとして追加する。ノードが維持できるスペアの数も制限され、システム全体のパラメータSによって指定される。Sの典型的な値は、例えば3である。スペアリンクのリストは概して必須ではないが、それにより局所的に収容できないリンクを仮想ネットワークのなんらかの他のポイントに伝搬できる追加の機構を提供する上で非常に貴重である。しかしながら、スペアリンク(または類似した伝搬機構)を使用することは、入信するNotifyメッセージがつねに二次ネットワークの同じノード(または非常に少ない数のノードの内の1つ)に到着するシステムでは必要である。
【0043】
(メッセージ)
ネットワークに自己組織化するため、及びどのノードが特定のネットワークの一部であるのかを発見するために、ノードは互いにメッセージを送信する。以下に示すタイプのメッセージが二次ネットワークによって使用される。
【0044】
・以下を含むAddLinkメッセージ
・送信者のアドレス
・受信者のアドレス
メッセージは相互リンクを要求するためにノード(送信者)によって別のノード(受信者)に送信される。
【0045】
・以下を含むChangeLinkメッセージ
・送信者のアドレス
・受信者のアドレス
・主題のアドレス
メッセージは、それがそのリンク(Z)の内の1つをそれ自体(X)のリンクに変更することを要求するためにノード(X)によって別のノード(Y)に送信される。プロトコルは、Xが、それにYに対するそのリンクをそれ自体(X)に対するリンクで変更するように要求する、類似したメッセージをZに送信するになている。したがって、事実上Xは現在XとZの間にあるリンクにそれ自体を挿入することを要求すr。
【0046】
・以下を含むLinkAddedメッセージ
・送信者のアドレス
・受信者のアドレス
メッセージは、送信者がそれに対するリンクをちょうど追加したところであることをノードに通知するために使用される。
【0047】
・以下を含むLinkErrorメッセージ
・送信者のアドレス
・受信者のアドレス
・主題のアドレス
・エラーコード
メッセージはノードに、そのリンクの内の1つに問題があると考えられることを知らせるために使用される。例えば、主題ノードが応答しない可能性がある、あるいはリンクが相互的でない可能性がある。メッセージはエラーのタイプを示すためにエラーコードを含む。
【0048】
・以下を含むLinksメッセージ
・送信者のアドレス
・受信者のアドレス
・すべてのリンクのアドレス
・基準値
・Linksメッセージは送信者ノードからのなんらかの他のデータも含む。ウェブページコメント例では、これは関連コメントのアドレスである。
【0049】
メッセージは送信側ノードのすべてのカレントリンクを含む。それはつねにLinksQueryメッセージに応えて送信される。参照は、応答される前記特定の照会を区別するために使用できる。
【0050】
・以下を含むLinksQueryメッセージ
・送信者のアドレス
・受信者のアドレス
・基準値
メッセージは、ノードにLinksメッセージを(そのカレントリンクを含む)返事として送信するように要求するために使用される。
【0051】
・以下を含むNotifyメッセージ
・送信者のアドレス
・受信者のアドレス
・主題のアドレス
・通知レベル
メッセージは、ノードにネットワーク内の別のノードを通知するために使用される。通知レベルはNotifyメッセージの伝搬を制御、制限するために使用される。ここで説明されるように、送信者アドレスは使用されないが、デバッグのために、あるいは肯定応答を送信することが所望される場合に有効である。
【0052】
(二次ネットワークの構築)
システムはグループノードに単一の仮想ネットワークへ自己組織化させ、その結果1つのノードのアドレスを有すると、グループ内の他者のアドレスを発見できる。本項では、同じ二次ネットワークに所属するはずであるノードが発見されると、新しいリンクがどのようにして作成されるのかを説明する。ここでは2つの部分が区別できる。
【0053】
同じ二次ネットワークに所属するはずであるノードの組の発見。複数のノードを同じネットワークの中にグループ化するための基準が何であるのかは、アプリケーション特有である。ウェブページ注釈例では、同じURLについてのコメントを表すすべてのノードは二次ネットワーク内で一緒にグループ化されなければならない。一緒にグループ化されなければならないノードがどのようにして発見されるのかもアプリケーション特有である。例を簡単に示す。
【0054】
二次ネットワークをノード発見の結果として更新する/拡張すること。同じ二次ネットワークに所属しなければならない1組のノードが発見されると、システムは結果として1つまたは複数の新しいリンクを構築してよい。新しいリンクは必ずしもノードの前記組の間にはないが、例えばこれらの2つのノードのリンク先であるノードの間にあってよい。どのようにして新しいリンクが作成されるのかの詳細は後述する。
【0055】
(Initial Notify(初期通知)メッセージ)
二次ネットワークの組織化は、例えばグループの既存のメンバーと新しいメンバーを特定できる入信「通知」メッセージの存在を前提としている(早い段階ではどちらのノードもまだグループの一部ではないが、後に自己組織化プロセスの間に両方のノードともすでにグループの一部である可能性がある)。それに属さなければならないノードの二次ネットワークに通知するのはシステムの別の部分しだいである。それを行うことができるさまざまな方法がある。ここで、我々は、二次ネットワークが我々の以前の国際特許出願に説明される型の一次ネットワークと組み合わせて使用されるときに、これがどのようにして行われるのかの例を示す。ウェブページ注釈例では、各コメントは対応するウェブページのURLに基づくラベルの下で一次ネットワーク内のノードとして自らを公表する。このようにして、一次ネットワークは、URLが存在する場合に特定のURLついてのコメントをルックアップするのに使用できる。特定のURLについてのすべてのコメントを示すために、各コメントはそれに関連付けられる二次ネットワークのノードも有する。同じURLについてのコメントに相当するノードはそのURLに特定的な二次ネットワークに自己組織化する。このようにして、いったん一次ネットワークがURLについての単一のコメントを見つけるのに使用されると、二次ネットワークは前記同じURLについての他のコメントを診付けるために使用できる。
【0056】
したがって、このケースでは、ともにグループ化されなければならない二次ネットワークのノードはそれぞれ一次ネットワークの同じラベルの下で公表される。ノードが同じラベルの下で公表された別のノードを認識すると必ず、必要とされるNotifyメッセージが作成されるような改善策を含む、一次ネットワーク内で、ノードがリンクを構築し、維持するために周期的に「Push(プッシュ)」更新を実行する機構について、以下に説明する。
【0057】
(通知メッセージの取り扱い)
ノードが、それがまだリンクしていないノードについてNotifyメッセージを受信すると、以下の1つが起こる。
【0058】
受信側ノードがすでに最大数の許容リンクを有する場合、それ(受信側ノード)は(それがすでにそれ(リンク)をスペアとして有していない限り)代わりにそれをスペアとして追加する。これを行う際に、前記ノードがその最大スペア数を超えると、それは1つのスペアを削除する。次に、それ(前記ノード)はそれが削除した前記スペアにNotifyメッセージも転送する。それがこれを行うかどうかは、通知レベルの値次第である。通知レベルは、メッセージが際限なく伝搬するのを妨ぐために毎回減少する。
【0059】
それ以外の場合、主題ノードがまだ最大数のリンクを有していない場合、受信側ノードは両方のノードの間に相互リンクを作成しようと試みる。これは図2のaとbに描かれている。ここでは、L=3であり、ノード1はノード2についてのNotifyメッセージを受信した。両方のノードとも2つのリンクしか有していなかったため、ノード1とノード2の間にリンクが作成される。
【0060】
それ以外の場合、主題ノードがすでに最大数のリンクを有している場合は、単に両方のノード間に相互リンクを作成することは可能ではない。したがって、何が起こるかというと(what happens)、受信側ノードが既存のリンクにそれ自体を挿入しようと試みる。これは図2のcとdに描かれている。ここでノード2とノード3の間のリンクは破壊されるが、それは2つの新しいリンク、つまりノード1とノード2の間のリンクとノード1とノード3の間のリンクによって置き換えられる。したがってリンクの総数は1だけ増加する。それは、たとえノード2とノード3がすでに最大数のリンクを有していたとしてもうまく行く。しかしながら、これが成功するためにはノード1が2つの新しいリンクを作成できることが必要であった。このプロセスは図3から図9のフローチャートにさらに詳細に説明される。
【0061】
図3は、ノードが入信Notifyメッセージをどのように処理するのかを示す。ここでは、新しいリンクを作成する必要があるかどうかが決定され、そうである場合にはどのように(新しいリンクを追加することによって、あるいは既存のリンクを2つのリンクに変更することによって)作成されるべきかが決定される。新しいリンクが作成される場合、スペアの集合は更新され、Notifyメッセージが送信されてよい。
【0062】
ステップ300では、それを送信したノード(送信者)のアドレス、主題ノードのアドレス、及び伝搬制限値であるnotifylevelを含むNotifyメッセージが受信される。受信側ノードは最初に、それが新しいリンクをセットアップする空間を有するかどうかをチェックし(301)、空間がある場合には、それがすでに主題ノードへのアクセスを有しているかどうかをチェックする(302)。有していない場合、それ(受信側ノード)は主題とリンクをセットアップしようと試みる。
【0063】
ステップ303では、それ(受信側ノード)は主題ノードにLinksQueryメッセージを送信し、ステップ304で応答を待つ。いったん応答−Linkメッセージ−が受信されると、それ(「受信側ノード」または「前記ノード」)は、(それがその間にも他のメッセージを受信、処理し、その結果としてリンクを作成した場合)それが依然として新しいリンクをセットアップするための空間を有しているかどうかを再びチェックする(305)。空間がある場合、それは次に主題ノードが新しいリンクをセットアップするための空間を有するかどうかをチェックするために受信されたLinksメッセージを調べる(306)。それが有する場合、ステップ307と308で、受信側ノードは主題ノードのアドレスを(「未確認」とマークされているが)そのリンクのリストに追加し、AddLinkメッセージを主題ノードに送信する。
【0064】
しかしながら、ステップ306で、主題ノードが追加リンクを受け入れることができないと判断されると、受信側ノードは、図2を参照して前述されたように、それ自体を既存のリンクの中に挿入しようと試みる。第1のステップ(309)は、受信側ノードが2つのリンク分の空間を有するかどうかをチェックすることである。ない場合には、プロセスは終了する。しかしながら、ある場合には、受信側ノードは受信されたLinksメッセージの中のリンクのリストから無作為に(受信側ノードがすでにリンクを有しているノードではない)リンク、すなわち主題ノードと、ここでは他と呼ばれる別のノードの間のリンクを選択する。それから、受信側ノードは、
311 主題ノード(未確認)のアドレスをそのリンクのリストに追加する
312 他のノード(未確認)のアドレスをそのリンクのリストに追加する
313 他のアドレスを含むChangeLinkメッセージを主題ノードに送信する
314 主題のアドレスを含むChangeLinkメッセージを他のノードに送信する
ことによって、それ自体をこのリンクに挿入しようと試みる。
【0065】
しかしながら、ステップ301で、受信側ノードがリンクを追加するための空間を持たないと判断されると、あるいはステップ302で、それが主題ノードに対してすでにリンクを有していると判断されると、プロセスは受信側ノードがそのスペアリンクのリストにリンクを追加する必要があるかどうかを調べる。ステップ315では、主題ノードがすでにスペアリストにあると判明するとプロセスが終了する。ステップ316では、スペアリストにリンクを追加するための空間があるかどうかがチェックされ、ある場合には、これは317で正式に追加される。ない場合には、ステップ318でスペアリンクの内の既存のリンクが無作為に選択され、それがステップ317で主題へのリンクによって置換できるようにステップ319で削除される。また、変数notifylevelは320で減分され、(ステップ321)それがゼロ以外のままであると、ステップ322で元のNotifyメッセージが−notifylevelのこの新しい値とともに−無作為に選択された既存のリンクによって指される(置換と呼ばれる)ノードに転送される。
【0066】
このプロセスの効果は、すでにリンクの完全な集合を有するノードAがそれに主題ノードBにリンクするように依頼するNotifyメッセージを受信すると、Bのアドレスがスペアリンクとして記録されるという点である。このリンクは、Aのスペアリンクのリストがいっぱいになるまで休眠したままである。次に、AがそれにノードCにリンクするように依頼する、後のNotifyメッセージを受信し、ノードBへのスペアリンクがステップ318で選択されると、ステップ322で作成される新しいNotifyメッセージは、事実上、それ自体からノードCへのリンクを作成するというノードBに対する要求である。
【0067】
リンクが未確認であり、受信側ノードが一定の期間内に(図6を参照して後述されるように、LinkAddedメッセージを介して)確認を受信しないとき、未確認のリンクが削除される機構も提供されるが、フローチャートには図示されていない。受信側ノードが、依然として「未確認」ステータスを有するリンクを有するときには、それはLinksQueryメッセージに応えて(言うまでもなく確認済みのリンクだけではなく)これらの未確認リンクも返し、他のノードが、それがリンクをセットアップしようと試みていることを確認できるようにする。
【0068】
図3では、ステップ305と309で「ノー」に出ると、プロセスは終了する。しかしながら所望される場合、それらはステップ315で始まる、効率がわずかに改善されて「スペアリンク」プロセスに送ることができる。
【0069】
ステップ309から314では、ノードは事実上、主題のリンクの1つを破壊し、それ自体を間に挿入する。フローチャートに図示されていない別の考えられるオプションは、ノードが(言うまでもなくそれがすでに1つのリンクを有していると仮定し)独自のリンクの内の1つを破壊し、主題を間に挿入することであろう。このオプションは、実現される場合、ステップ301で「ノー」に出た直後に試されるであろう。最初に、受信側ノードは、主題がL−1個より少ないリンクを有していたかどうかを確かめ、無作為に(ノード他に対する)独自のリンクの内の1つを選択し、これを主題に対する未確認リンクで置換し、主題にAddLinkメッセージを送信する必要があるであろう。次に、主題と他の間に双方向リンクを設立するために、それは、(a)主題に無条件で他を未確認リンクとしてそのリンクのリストに追加することを要求する特別のAddLinkメッセージを主題に送信し、(b)受信側ノードが旧リンクとして削除され、主題を追加される新規リンクとして指定する特別なChangeLinkメッセージを他に送信するであろう。このオプションは、ステップ309から314と同様に、あるいはステップ309から314の代わりに含まれるであろう。
【0070】
受信側ノードが独自のリンクの内の1つを破壊するための別のオプションは、(最初に、主題がL−1個より少ないリンクを有していたと検証した)それ(受信側ノード)が主題に、それ自体を主題として指定するNotifyメッセージを送信することであろう。これは同じ結果をもたらすが、わずかに大きなメッセージングオーバヘッドを必要とするであろう。
【0071】
図4は、ノードが入信ChangeLinkメッセージをどのように処理するのかを示している。これらのメッセージは、Notifyメッセージを受信したノードXが既存のリンクを2つの新しいリンクに変更することを希望するときに送信される(図2を参照されたい)。受信側ノードYは、400でノードZをsubjectとするNotify、つまりノードYにその既存のノードZリンクを、ノードXに置換するように求めるメッセージを受信する。それ(ノードY)が事実上ノードZへのリンクを所有していない(402)場合は、それはsenderXにエラーメッセージを送信する403が、それがすでにXへのリンクを有する場合は、それは追加の処置を講じない(401)。
【0072】
すべてがうまくいくと仮定して、それはsenderXにLinkQueryメッセージを送信し(404)、後者(送信者)が、それが主題リンクを変更する前に作成しなければならなかった2つの新しいリンクを実際に作成したかどうかチェックするために、送信側ノードXからの応答としてLinksメッセージを待機する(405)。これらのチェック(406、407)が無事に終了すると、受信側ノードはZへのリンクを削除し(408)、確認されたリンクとしてXを追加し(409)、LinkAddedメッセージをsenderXに返す(410)。
【0073】
図5は、ノードが入信AddLinkメッセージをどのようにして処理するのかを示している。これらのメッセージは、ノードがノードとの新しいリンクの作成を希望するときに送信される(図1を参照されたい)。メッセージは501で受信され、ノードはステップ502で、それが別のリンクのための空間を有するかどうかをチェックし、ない場合には503でエラーメッセージを返す。ある場合には、それはLinksQueryメッセージをsenderに送信し(504)、送信側ノードからの応答としてLinksメッセージを待機し(505)、その結果それは506で後者(送信者)が実際に受信側ノードへのリンクを作成したことをチェックできる。ノーである場合、それはリンクを追加するのを拒否し、終了するが、そうであるならば、それは次にsenderを確認されたリンクとして追加し(507)、確認する目的でLinkAddedメッセージをsenderに返す(508)。
【0074】
図6は、ノードが入信LinkAddedメッセージをどのように処理するのかを示す。これらのメッセージは、ChangeLinkメッセージまたはAddLinkメッセージのどちらかに応えて、別のノードが受信側ノードへのリンクを受け入れると送信される。リンクが受け入れられたことを示すLinkAddedメッセージが600で受信されると、そのステータスはステップ601で「確認済み」に変更される。それからリンクは、それが(ChangeLinkメッセージに応えて)新しいリンクのために変更されるのか、あるいはリンクが破壊されるかのどちらかまで維持される。
【0075】
図7は、ノードが入信LinkErrorメッセージをどのようにして処理するのかを示す。これらのメッセージは、ノードが受信側ノードへのリンクを、後者が(ChangeLinkメッセージまたはAddLinkメッセージを手段として)相互リンクを要求した後に作成できなかったとき、あるいはリンクが壊れていると考えられる(他端でのノードがメッセージに応答していない可能性がある、あるいはリンクが相互的ではない可能性がある)ときのどちらかに送信される。壊れたリンクは自己組織化プロセスによってではなく、(後述されるように)クライアントが二次ネットワークを横断するときに検出される。
【0076】
700でのメッセージの受信に続き、メッセージが、受信側ノードが未確認リンクを有するノードについてであるかどうかが判断される(701)。そうである場合、及びそれが要求されたリンクを作成できなかったことを示すエラーコードを伝搬する(702)場合、リンクは703で削除される。しかしながら、メッセージが、受信側ノードが未確認リンクを有するノードについてではない場合、受信側ノードはsubjectにLinkQueryメッセージを送信し(704)、応答としてLinksメッセージを待機し(705)、主題がそれ自体にリンクを有するかどうかをチェックするために706で応答をチェックし、有さない場合にはステップ703で主題ノードに対するそのリンクを削除する。
【0077】
図8は、ノードが入信LinksQueryメッセージをどのように処理するのかを示す。これらのメッセージは、別のノードが受信側ノードのリンクを知ることを希望するときに送信され、したがって後者(受信側ノード)は800でその受信時に801でLinksメッセージで応答する。
【0078】
図9は、ノードが入信Linksメッセージをどのようにして処理するのかを示す。それがどのように処理されるのかは、なぜ対応するLinksQueryメッセージが送信されたのかに完全に左右される。これは、とりわけ図3、図4、図5及び図7に示されるようにさまざまな理由から起こる。したがって、何が起こるかというと(what happens)、LinksQueryメッセージが送信されると、それは局所的に一意である基準を与えられ、メッセージハンドラが前記基準に関連付けられる。それから、Linksメッセージが受信されると(900)、適切なメッセージハンドラが特定され、メッセージは、ステップ902でメッセージがただちに処理されるように適切なメッセージハンドラに送られる。
【0079】
言うまでもなく、例えば受信側ノードが停止していたために、LinksQueryに応えてLinksメッセージがいままで送信されていない場合がある。したがって、一定の期間後にLinksメッセージが受信されない場合は、対応するメッセージハンドラは削除される。これはここに説明されるフローチャートのいずれにおいても明示的に示されていないが、それは単にリンク照会が時間切れになると、追加の処置は講じられず、フローチャート全体が「完了した」ことを意味する。
【0080】
(ノードの取り出し)
二次ネットワークの単一のノードのアドレスを考慮すると、ネットワークの他の、潜在的にはすべてのノードを発見することが可能である。これを行うことができる方法は非常に簡単である。既知のノードにすべてのリンクを要求するためにLinksQuerryメッセージを送信する。ノードは、それがリンクするノードのすべてのアドレスを含むLinksメッセージで応答する。それから、これらのノードのそれぞれに順々に連絡し、それらのリンクを要求し、このようにしてそれらすべてのリンクのアドレスを得ることができる。このように続けることで、ネットワークを横断し、それが含むすべてのノードを徐々に発見する。
【0081】
図10は、プロセスを詳細に示している。これが図1Aに示されている取り出しステップ35で使用されるプロセスであることが理解されるであろう。無事に連絡されたすべての既知のノードのアドレスは「確認済み」リストに入れられる。データは同時に取り出されてよい。「ウェブページコメント」例のケースでは、データの関連する項目はコメントのアドレスであり、これもノードアドレスと同時にconfirmed(確認済み)リストに入れられる。confirmed(確認済み)リストは、図1Aのコメント「取り出し」ステップ(36)に必要とされるアドレスを提供する。他方、「未確認」リストはまだ連絡を受けていない既知のノードのアドレスを含む。最後に「既知」のリストはすべての既知のノードのアドレスを含んでいる。それは「確認済み」リストと「未確認」リストの中のすべてのアドレスを含んでいるが、連絡されたノード及び応答していないノードのアドレスも含む。known(既知の)リストは、それに入れられたアドレスごとに、ソースaddress(アドレス)を含む追加フィールド−つまり、エラー報告のために、そのリストからcurrent(カレント)ポインタが指すアドレスが取得されたノードのアドレスを有する。
【0082】
どこで取り出しプロセスが発生するのかは重要ではない。それはノードあるいは他のどこかである可能性がある。ステップ1000では、ノードアドレスを取り出す要求がstart(開始)アドレス、つまり対象とする仮想ネットワークに属すると判断された1つのノードのアドレスとともに受信される。ステップ1002では、第2のアドレスポインタ、source(ソース)は当初ヌルである(1003)が、アドレスポインタcurrent(カレント)は当初このアドレスに設定される。
【0083】
ステップ1004と1005では、LinksQueryメッセージは、current(カレント)によって指定されるアドレスに送信され、応答が待機される。Linksメッセージが受信されると、それと並行して、current(カレント)は、Linksメッセージからのコメントアドレスとともにconfirmed(確認済み)リストに追加される(ステップ1006)。
【0084】
ステップ1007では、Linksメッセージに含まれるアドレスのそれぞれについて実行されるサブプロセスが入力される。アドレスがすでに既知のリスト内にあると(1008)、プロセスは次のアドレスに移動する(steps on to)。それ以外の場合、アドレスはknown(既知の)リストに、及びunconfirmed(未確認)リストに追加される(ステップ1009、1010)。また(1011)、current(カレント)のアドレスは追加されたアドレスのソースであるとしてknown(既知の)リストに入力される。
【0085】
いったんこのサブプロセスが完了すると、(その場合プロセスがステップ1012で終了する、uncofirmed(未確認)リストが空でない限り)ステップ1013でunconfirmed(未確認)リストから無作為にアドレスが選択される。このアドレスが新しいcurrent(カレント)アドレスになり、unconfirmed(未確認)リストから削除される。次のステップ(1014)は、それに関連付けられるソースアドレスを取り出すためにknown(既知の)リストの中でcurrent(カレント)をルックアップし、これをsource(ソース)ポインタに入れることである。無作為選択は必須ではない。例えば、カレントは未確認リスト内の「最も旧い」ノードとして選ぶことができるであろう、あるいはリストは別の基準(例えばノードのアドレス)でソートされ、current(カレント)はつねにこのリストの「最初の」ノードとなることができるであろう。しかしながら、current(カレント)の無作為選択にはその利点がある。それは(特にすべてのノードがつねに取り出されるわけではない場合に)システム内で負荷を拡散し、壊れたリンクがより迅速に発見されるようにネットワークのリンクの試験も拡散する。
【0086】
それから、プロセスはステップ1004から再び続行し、unconfirmed(未確認)リストが空になる−つまり、追加の新しいアドレスが見つからなくなる−まで反復する。
【0087】
取り出しプロセスの思わぬ結果は、それが壊れたリンクを発見することである。例えば、ノードが応答していない、あるいはリンクが相互的ではない場合がある。後者は、ノードAがノードBにリンクするが、ノードBがそのリンクテーブルにノードAを入れていないケースである。壊れたリンクが発見されると、前記リンクの「ソース」であるノードはLinkErrorメッセージを手段として通知される。図7がすでに示していたように、ソースノードは、次に(エラーレポートの精度を確認するために)リンク自体をチェックすることができ、結果としてリンクを削除する場合がある。応答していないノードは、設定されたタイムアウト期間内にLinksメッセージを受信できないことによってステップ1005で認識され、ステップ1015では、current(カレント)のアドレスと「応答なし」エラーコードを含むエラーメッセージがsource(ソース)に送信され、その結果制御はステップ1012に戻る。リンクの相互性の欠如(non−mutuality)は、current(カレント)について受信されたLinksメッセージがsource(ソース)のアドレスを含んでいるかどうかを判断するためにステップ1016での試験によって認識される。含んでいない場合、current(カレント)のアドレス及び「非相互的」エラーコードを含むエラーメッセージがsource(ソース)に送信される(ステップ1017)が、(図7のプロセスに従って)救済処置を講じるのはソースノードの責任であるため、取り出しプロセスは以前のように続行する。ステップ1106での試験は、source(ソース)がヌルである場合には省略される。
【0088】
複数の確認済みノードが、Linksメッセージに応答しないノードにリンクするとしても、最初にリンクに貢献したノード(ソースノード)だけが、「応答なし」であったことを通知されることに注意されたい。これは、部分的には、その方がフローチャートを理解しやすいためである。しかしながら、別の実際的な利点があると主張することができる。ノードは、それが一時的にオーバロードされているために(時間内に)応答しない可能性がある。この場合、(図7でのように)エラーがあるかどうかを試験するために、複数のノードにLinksQueryメッセージを同時に送信してほしくない場合がある。いずれにせよ、所望される場合、壊れたリンクにより影響を受けるすべての既知のノードに、このようなリンクが発見されると通知するようにノード取り出しアルゴリズムを更新することは分かりやすい。
【0089】
図10では、ノード取り出しは、すべての既知のノードが連絡を受けるまで停止しない。実際には、プロセスを早期に終了することを希望する場合がある。例えば、ユーザがファイルをそこからダウンロードする場所を探している場合、例えばすべて、1000の代わりに10の可能性のあるダウンロードアドレスの選択肢をユーザに提供することで十分である可能性がある。
【0090】
図10のアルゴリズムは完全にシリアルとして示されている。一度に1つのノードだけが連絡される。別のLinksQueryメッセージは、過去のメッセージに対する応答が受信された(あるいはそれが時間切れになった)後にのみ送信される。しかしながら、実際には、我々は複数のLinksQueryメッセージを同時に発行することにより取り出しを加速することを好む。ボックス1000では、複数の取り出し要求が図10のプロセスの複数のインスタンスによって同時に処理される場合がある。
【0091】
(説明)
(自己組織化の成功)
二次仮想ネットワークの目的とは、複数の接続されていないネットワークとは対照的に単一のネットワークの中にともにグループ化されなければならないすべてのノードを自己組織化することである。これが当てはまるかどうかは、初期のNotifyメッセージがどのように作成されるのかに負うところが大きい。例えば、すべてともにグループ化されなければならない12のノードのグループがあるが、このグループの内、5つのノードだけが5つのこのグループ内の他のノードについて通知を受信し、他の7つのノードのどれもこれらの5つのノードのどれかについて通知されない場合、ノードが単一のネットワークに自己組織化することは不可能である。代わりに、それらは、5つのノードの1つと7つのノードの1つという2つの別々のネットワークに配置される(arrange into)。しかしながら、初期通知が、ノードが単一のネットワークに自己組織化することが不可能でないようであれば、自己組織化のプロセスは、ノードが単一のネットワークに自己組織化しない可能性がきわめて低いほどである。自己組織化の結果単一ネットワークが生じる確率の計算は複雑であり、初期通知を作成する機構に左右される。しかしながら、我々はシミュレーションで複数の異なる初期通知機構を経験し、これまでノードが単一のネットワークに自己組織化することができなかったことはない。
【0092】
(悪意のあるノードに対するロバスト性)
これまで、すべてのノードはプロトコルに従うと仮定されてきた。しかしながら、ルールに従って行動しない悪意のあるノードがいる可能性がある。それらは、他のノードによって維持されているリンクを破壊しようとする、及び/あるいはそれら自体に多すぎるリンクを取得しようとする。全体的なシステムがこのような悪用に対し可能な限りロバストであることが望ましい。
【0093】
これまで説明されてきたシステムは悪意のあるノードに対してすでにかなりロバストである。それは、各ノードが、自身のリンクを変更する前に、つねにLinksQuery−Linksメッセージ交換を用いて他の関連性のあるノードによって維持されるリンクをチェックするためである。例えば、ノードがAddLinkメッセージを受信するとき(図3を参照されたい)、それは、自身のリンクとして送信者を追加する前に、最初に、送信側ノードが実際にそれにリンクしたかどうかをチェックする。
【0094】
しかしながら、システムには依然として相対的な弱さがある。現状では、ノードは、それらがLinksメッセージで応答するときに容易に「ウソをつく」ことができる。多くの場合、ノードは受信側ノードがそれにリンクしていることをチェックするためにLinksQueryメッセージを送信する。受信側ノードは、このことを知っているので、それがつねにリンクとしてLinksメッセージの送信者を含むように修正された捏造Linksメッセージで応答できる。これにより、ノードはそれにリンクするL個のノードという許容数よりはるかに多いノードを有することができる。結果として、これはシステム内の「よい」リンクの総数を削減するであろう。
【0095】
幸いなことに、この弱さに対処する方法がある。これは、ノードがプロキシノードを通してそれらのLinksQueryを送信する場合に行うことができる。これらのプロキシは、ノードが照会を送信することを希望するたびに無作為に選ばれる。各ノードは、例えば、それが現在リンクしているノードをプロキシとして使用できる。このようにして、別のノード(B)のリンクを知ることを希望するノード(A)は、それ(ノードB)が受信するLinksQueryメッセージがプロキシノード(C)からであり、ノードBがノードCから受信するメッセージはまったくノードAを参照しないため、ノードBにとっては未知である。したがって、ノードBが全体的なシステムに重大な影響を及ぼす捏造メッセージを送信する手っ取り早い方法はない。
【0096】
言うまでもなく、悪意のあるプロキシの影響はどのようなものであるかに関する疑問がある。明らかに悪意のあるプロキシは有害な影響を及ぼすが(プロトコルに従わないノードがパフォーマンスにある程度影響を与えるのは避けられない)、この影響は限られている。その理由は、それらが不当に処理できるのは、それらが転送するように依頼されるLinksQueryだけであり、これらの要求はすべてのノード全体でだいたい均一に拡散されるためである。他方、プロキシが使用されないときには、悪意のあるノードは非常にアクティブであることによる大混乱を引き起こすことがある。これらのノードが多くの偽のAddLinkメッセージを送信し、それらが実質的に送信する多くのLinksメッセージを捏造すると、全体的なシステムに及ぼされる影響ははるかに大きくなる。
【0097】
(一次仮想ネットワーク)
一次ネットワークは、我々の前述された国際特許出願に詳しく説明されている。ここでは、二次ネットワークの自己組織化を促進するNotifyメッセージの作成を可能にする改善策とともに、基本的な取り出し機構と自己組織化機構が説明される。
【0098】
最初に、この機構によって使用される仮想座標空間の概念を説明することが必要である。各ノードがラベルを有することはすでに言及された。ラベルは仮想空間で座標に変換される。空間は一次元、二次元またはさらに高い次元である場合がある。正確な変換機構はあまり重大ではない。つまり一次元空間の場合、バイナリ数と見なされるラベルは座標として直接的に使用できる。二次元及び三次元以上の場合、好ましい方法では、ビットの文字列として見なされるラベルが2つまたは3つ以上の等しいグループに区分され、バイナリ数と見なされる各グループが座標の1つを形成する。各座標(つまり、一次元空間での前記座標)は範囲[0,1]にあるように拡大縮小される。
【0099】
所望される場合、(多くの場合マンハッタン距離と呼ばれる)都市ブロック距離のような他の距離が使用できるであろうが、この仮想空間の2つのラベルの間の距離が、2つの座標集合の間のユークリッド距離である。座標空間は、x1とx2の間のx方向の距離が
Min{(1−|x1−x2|),|x1−x2|}
となるように重なり(wraps)、したがって点(x1,y1)と(x2,y2)の間の二次元のユークリッド距離は、
【数1】
【0100】
である。
【0101】
我々は、この点で各ノードが、多くのエントリが他のノードへのリンクを表すリスト22(図1)を有することも思い出す。各エントリは、このような別のノードのラベルとアドレスから構成される。当初、このリストは空であるため、ノードは、ブートストラップリンク−すなわちそれがネットワークの他のノードに最初に連絡できるように2、3のリンク(通常は4つ)−の第2の類似したリストを有する。ノードは(短距離リンクと呼ばれる)リスト22の中のリンクだけではなく、階層的に配列された追加のこのようなリスト、及び/または長距離リンクのリストも有する場合がある。これらは、我々の初期の国際特許出願に説明されているが、それらは付加的であるため、ここでは説明されない。
【0102】
(メッセージ)
最初に、以下のメッセージが使用される(一次仮想ネットワークで使用されるメッセージが二次仮想ネットワークで使用されるメッセージとは異なり、二次仮想ネットワークで使用されるメッセージから完全に独立していることに注意する)。
【0103】
FINDメッセージは、ノードルックアップを起動し、実行するため、及び「PULL(プル)」更新をサポートするために使用される。それらは、
・ターゲットノードのラベル
・照会を開始したノードのアドレス
を含む。
【0104】
FOUNDメッセージは照会の結果を返すために使用される。それらは、
・ターゲットノードのラベル
・発見されたノードのラベル
・発見されたノードのアドレス
・発見されたノードと関連付けられる二次ネットワークのノードのアドレス
・アプリケーション特有データ−このケースでは、発見されたノードと関連付けられるコメントノードのアドレス
PUSH(プッシュ)メッセージは、ノードのラベルを他のノードに宣伝する。それらは、
・主題ノードのラベル
・主題ノードのアドレス
・ターゲットノードに到達するためのhops to go(移動ホップ)数
NOTIFYメッセージはプッシュ−更新を伝搬するために使用される。それらは、
・主題ノードのラベル
・主題ノードのアドレス
を含む。
【0105】
(取り出し)
図11は、各ノードが入信Findメッセージをどのようにして処理するのかを示している。原則的には、受信側ノードはそれ自体よりFindメッセージで特定されたターゲットノードにより近いノードを探し、成功した場合はFindメッセージを次へ回す。成功しない場合、それは独自のアドレスとラベルを返す。それは、以下のステップを実行することによってこれを行う。
【0106】
ステップ1100:ノードは、ターゲットノードのラベルと開始側ノードのアドレスを含むFindメッセージを受信する。
【0107】
ステップ1105:ノードはターゲットノードのラベルをラベル空間の座標に変換し、それが記録しているすべてのリンク(ノード)の内で、どれがラベル空間内のターゲットノードに最も近いのかを計算する。当該ノードはnearestノードと指定される。
【0108】
ステップ1110:ノードは自身の座標とターゲットノードの座標の間の距離を、nearestノードの座標とターゲットノードの座標の間の距離に比較する。
【0109】
ステップ1115:自身の座標とターゲットノードの座標の間の距離が少ない(あるいは等しい)場合、ノードは開始側ノードにネットワーク10を介して、自身のラベルとアドレスを含んだFoundメッセージを送信する。
【0110】
ステップ1120:nearestノードの座標とターゲットノードの座標の間の距離が少ない場合、ノードはFindメッセージをnearestノードに転送する。
【0111】
ステップ1115で返されるノードのアドレスはターゲットラベルが付いたノードのアドレス、またはラベル空間内でそれに近いもののどちらかである。返されるラベルがターゲットラベルに一致しないときは、それはターゲットノードが存在していない、または仮想ネットワークが十分に自己組織化されていないかのどちらかを意味する。
【0112】
(プッシュ)
各ノードはPush(プッシュ)更新を自発的に開始する。例えば、各ノードは定期的にPush(プッシュ)更新プロセスを開始する可能性がある。Push(プッシュ)更新では、ノードはノードの無作為系列(random series)を通して自身のラベルとアドレスとともにPush(プッシュ)メッセージを送出し、系列の長さに制限を設定する。系列の中の最後のノードは開始側ノードに向かってNotifyメッセージを送り返す。図12、図13、及び図14はこのプロセスの多用な部分を示している。
【0113】
図12は、以下のステップを使用してノードがどのようにしてPush(プッシュ)更新を開始するのかを示す。
【0114】
ステップ1200:ノードはそのブートストラップリンクの中から無作為にリンクを選択し、選択されたリンクによって特定されるノードのアドレスを次のメッセージのforward(転送)アドレスとして入力する。
【0115】
ステップ1205:ノードはPush(プッシュ)メッセージのフィールドhops to go(移動ホップ)に小さい正の乱数を入力する。
【0116】
ステップ1210:ノードは自身のラベルとアドレスをPush(プッシュ)メッセージの中のsubjectノードのラベルとアドレスとして入力し、ネットワーク10を使用して、Push(プッシュ)メッセージをforward(転送)アドレスにあるノードに送信する。
【0117】
図13及び図14は、短距離リンクがどのようにして更新されるのかを示している。Push(プッシュ)メッセージは、短距離リンクを更新するためにNotifyメッセージとともに使用される。この更新には2つの段階がある。第1の段階では、各ノードは、受信されるようなメッセージの移動ホップ(hops to go)の値が「0」になるまでPush(プッシュ)メッセージを無作為に転送する。移動ホップ(hops to go)の値が「0」である場合、受信側ノードはNotifyメッセージを送信することによってPush(プッシュ)更新の第2段階を開始する。第2段階では、Notifyメッセージは、そのラベルが漸次的に仮想空間の主題に近くなるノードに連続して転送される。より近いラベルをもつノードが発見されない場合、必要に応じ、最後に発見されたノードのリンクが更新される。これは、例えば、それがまだ確立されていない短距離リンクを有していないためなど、それ以外の場合それが特定の主題ノードを発見できないときにつねに当てはまる。また最後に発見されたノードは、潜在的にそのリンク集合も改善できるであろうノードに追加のNotifyメッセージを送信する。
【0118】
図13のPush(プッシュ)更新の第1の段階を参照すると、入信Push(プッシュ)メッセージを処理するには以下のステップが必要となる。
【0119】
ステップ1300:ノードはPush(プッシュ)メッセージを受信する。Push(プッシュ)メッセージは、開始側ノードのラベルとアドレスをsubjectノードとして含み、フィールドhops to go(移動ホップ)に値を有する。
【0120】
ステップ1305:受信側ノードはそのブートストラップリンクの中からリンクを無作為に選択し、選択されたリンクによって特定されるノードのアドレスを次のメッセージのforward(転送)アドレスとして入力する。
【0121】
ステップ1310と1315:受信側ノードはフィールドhops to go(移動ホップ)の値を1だけ減少させ、hops to go(移動ホップ)の減少した値が依然としてゼロより大きいかどうかをチェックする。
【0122】
ステップ1320:減少した値が依然としてゼロより大きい場合、ノードはPush(プッシュ)メッセージをそれが入力したforward(転送)アドレスに転送する。
【0123】
ステップ1325:値がゼロである場合、ノードは、代わりに、(受信されたPush(プッシュ)メッセージに指定される)開始側ノードのラベルとアドレスをNotifyメッセージのsubject(主題ノード)として入力し、それが入力したforward(転送)アドレスにNotifyメッセージを送信する。
【0124】
図14を参照すると、Push(プッシュ)更新を処理し、Notifyメッセージを処理する第2の段階は以下のステップを伴なう。
【0125】
ステップ1400:ノードは、subjectノードとしてノードのラベルとアドレスを含むNotifyメッセージを受信する。
【0126】
ステップ1401:受信側ノードは、Notifyメッセージのsubjectが受信側ノードと同じラベルを有するかどうかをチェックする。
【0127】
ステップ1402:そうである場合は、受信側ノードはNotifyメッセージのsubjectが受信側ノードと同じアドレスを有するかどうかをチェックする。その場合、それは追加の処置を講じない。
【0128】
しかしながらNotifyメッセージのsubjectが受信側ノードと同じラベルの付いているが、受信側ノードとは異なるアドレスのノードである場合、2つのイベントが発生する。第1に(ステップ1403)受信側ノードは入信Notify(通信)メッセージの主題ノードに、主題として受信側ノードの自身の短距離リンクのリストから無作為に選ばれたノードを指定するNotifyメッセージを送信する。第2に、ステップ1404は、二次ネットワークによる動作のためにNotify(通知)メッセージを作成させる。しかしながら、受信側ノードはこのようなメッセージを直接的に作成することはできない。一般的には、通信網上での異なる仮想ネットワーク間でメッセージを送信するのを回避することが好まれるが、主要な問題は受信側ノードが二次ネットワークのそれ自体のノードのアドレスだけではなく、subjectノードに関連する二次ノードのノードアドレスも必要とするという点である。受信側ノードはこのアドレスを持っていない。したがって、2段階プロセスが使用される。
【0129】
第1に、受信側ノードは、入信Notifyメッセージの中の主題として指定される特別な一次ネットワークのノードにCrossNotifyメッセージを送信する。このメッセージは以下のものを含む。
【0130】
・受信側ノード(つまり、入信(一次ネットワーク)メッセージを受信したノード)のアドレスに設定されたsenderアドレス
・入信Notifyメッセージに含まれるアドレスに設定されたreceiver(つまり宛て先)アドレス
・受信側ノードと関連付けられる二次ネットワークのノードのアドレスに設定されるsubjectアドレス
最初の2つのアドレスが一次ネットワーク上のノードのアドレスであり、第3のアドレスが二次ネットワーク上のノードのアドレスであることに注意する。
【0131】
第2に、CrossNotifyメッセージを受信する一次ネットワークのノードは、実質的には、それを二次ネットワークの関連するノードに転送する。必要ならば、転送側ノードはメッセージを二次ネットワークで使用されているフォーマットにフォーマットし直し、(一次ネットワーク)receiverアドレスを二次ネットワークの関連するノードのアドレスで置換できるであろう。メッセージは、それから、まさに図3に示されているように処理されるであろう。我々が「実質的には」という理由は、実際には、CrossNotifyメッセージを受信する一次ネットワークのノードだけが二次ネットワークのその関連するノードに、CrossNotifyメッセージのsubjectフィールドに指定されるアドレスを含む簡略で局所的なメッセージを送信することが好まれるからである。その場合、図3のプロセスは、notifylevelを適切な値に設定するステップを含むように修正されるであろう。
【0132】
このプロセスは、ボックスがノードを表し、矢印がメッセージを表す図15を参照して例によって図解される。一次ネットワークのノードP1が、図14のステップ1400で、一次ネットワークのノードP2のラベルLP2とアドレスAP2をsubjectとして含むNotify(通知メッセージ)を受信すると仮定する。ノードP1では、主題ノードがP1と同じラベルを有する(つまりLP1=LP2)が、別のアドレス(AP1≠AP2)を有することが認識される(図14のステップ1401、1402)。ノードP1は、その二次ネットワークノードS1のアドレスAS1を知っており、(図14のステップ1404で)送信者アドレスAP1、受信者アドレスAP2、及び主題アドレスAS1でCrossNotifyメッセージを作成する。このメッセージは一次ネットワークのノードP2で受信され、これは、アドレスAS1で局所通知メッセージを二次ネットワークの関連するノードS2に送信する。代わりに、二次ネットワークのノードS2は、LocalNotifyメッセージの受信時に、図3のプロセスに従ってそれ自体リンクを作成する代わりに、それがノードS1に送信し、それ自体を主題として指定する(図12の点線によって示される)(二次ネットワークの)追加のNotifyメッセージを作成できるであろう。Notifyメッセージは、それから、図3のプロセスを使用するノードS1で処理される。このオプションは追加のメッセージを必要とするが、図3のプロセスが実行されるようになると、Notifyメッセージが、そのアドレスがメッセージのsubjectフィールド内にあるノードによって実際に送信され、subjectノードがこのようにして依然として存在しているとして本質的に確認されるという利点を有する。
【0133】
いま図14ステップ、1405に戻ると受信側ノードはsubjectノードのラベルを座標に変換し、それが記録した短距離リンクの内のどれが、その座標が仮想空間内のsubjectノードの座標にもっとも近いノードラベルにつながるのかを計算する。当該ノードはnearestノードと指定される。
【0134】
ステップ1415:受信側ノードは自身の座標とsubjectノードの座標の間の距離を、nearestノードの座標とsubjectノードの座標の間の距離と比較する。
【0135】
ステップ1415では、受信側ノードとsubjectノードの間の距離が同じまたは少ないことが判明すると、受信側ノードはsubjectノードのラベルとアドレスを自身の短距離リンク集合((ステップ1420)。このプロセスは、図16を参照してさらに説明される)の中のリンクとして追加し、subjectノードに受信側ノードのラベルとアドレスを含むNotifyメッセージを送信し(ステップ(1430)、nearestノードに、subjectのノードのラベルとアドレスを含むNotifyメッセージを送信する(ステップ1435)。
【0136】
ステップ1415で、最も近いノードとsubjectノードの間の距離がより大きいと判明すると、受信側ノードは、それがnearestノードにsubjectノードのラベルとアドレスを含むNotifyメッセージを送信するという点でステップ1435に戻る。
【0137】
図16は、ノードが、その短距離リンクを更新するときにどのように動作するのかを詳細に示している。それは新しいリンクをその短距離リンクに追加し、このリンクに代わられるすべての短距離リンクを削除する。
【0138】
図16を参照すると、例えば図14のステップ1420の結果として、ノードは新しいリンクをその短距離リンクに追加する必要がある。
【0139】
ステップ1600:更新ノード(すなわち、その短距離リンク集合に対して更新を行うノード)は、新しいリンクのためのノードのアドレスを有する。
【0140】
ステップ1600:更新ノードは、更新ノードに対してより新しいノードにさらに近いノードに関するすべての既存のリンクを特定する。これらの特定されたリンクは入れ替えられなければならない。これらのリンクを特定するために更新ノードは、各既存のリンクに、新しいノードの座標とその既存のリンクで指定されるノードの座標の間の距離を計算する。それは、これらの距離のそれぞれを自身の座標とそれぞれの既存のリストに指定されるノードの座標の間の距離と比較する。
【0141】
ステップ1610:新しいノードに関する距離が更新ノードに関する距離より短いすべてのリンクは短距離リンクから削除される。
【0142】
ステップ1620:更新ノードは、その短距離リンクに新しいノードのためのリンクを追加する。
【図面の簡単な説明】
【0143】
【図1】本発明のある実施形態で使用されるコンピュータのブロック図である。
【図1A】一次仮想ネットワークと二次仮想ネットワークを使用するデータ検索動作を示すフローチャートである。
【図2】コンピュータネットワークのノード間のリンクの管理の概略図である。
【図3】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図4】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図5】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図6】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図7】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図8】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図9】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図10】二次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図11】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図12】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図13】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図14】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【図15】図14に描かれているプロセスの間のメッセージの流れを描く概略図である。
【図16】一次仮想ネットワークのノードの動作の態様を示すフローチャートである。
【特許請求の範囲】
【請求項1】
それぞれのノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを有する、複数のノードを有する仮想ネットワークを操作する方法であって、
(i)第1のノードと第2のノードの間のリンクを要求するメッセージを受信することと、
(ii)前記第1のノードと第2のノードの両方がそれぞれのケースで、前記所定数未満であるいくつかのアドレスをそのリストの中に有するかどうかを判断することと、
(iii)この条件が満たされた場合に、前記第1のノードの前記アドレスを前記第2のノードの前記リストに挿入し、前記第2のノードの前記アドレスを前記第1のノードの前記リストに挿入することと、
(iv)この条件が満たされない場合に、前記第1のノードが、前記所定数より少なくとも2少ないいくつかのアドレスをそのリストに有するかどうかを判断し、そうである場合、
(a)第3のノードのアドレスを前記第2のノードの前記リストから選択することと、
(b)前記第2のリストの前記リストから前記第3のノードの前記アドレスを削除することと、
(c)前記第3のノードの前記リストから前記第2のノードの前記アドレスを削除することと、
(d)前記第2のノードの前記アドレスを前記第1のノードの前記リストに挿入し、前記第3のノードの前期アドレスを前記第1のノードの前記リストに挿入することと、
(e)前記第1のノードの前記アドレスを前記第2のノードの前記リストに挿入し、前記第1のノードの前記アドレスを前記第3のノードの前記リストに挿入することと、
を含む、方法。
【請求項2】
リンクを要求する前記メッセージが前記第1のノードで受信され、ステップ(iii)で、
前記第2のノードの前記アドレスが、それが未確認であることを示すマーカが付随する前記第1のノードの前記リストに挿入され、
前記第2のノードに前記第1のノードの前記アドレスを前記第2のノードの前記リンクに追加するように要求するメッセージが前記第1のノードから前記第2のノードに送信され、
前記第2のノードで、前記アドレスがこのように追加され、確認のメッセージが前記第1のノードに送信され、
前記第1のノードで、肯定応答の前記メッセージの受信時に、前記「未確認」マーカが削除される、
請求項1に記載の方法。
【請求項3】
ノードが、それがそのリストに指定されたノードのアドレスを追加するように要求するメッセージの受信時に、最初に前記指定されたノードに、前記指定されたノードの前記リストのコピーを要求するメッセージを送信し、次にそれが前記指定されたノードから、前記要求を受信する前記ノードの前記アドレスを含むリストを受信する場合にだけ前記追加要求に従う、請求項2に記載の方法。
【請求項4】
リンクを要求する前記メッセージが前記第1のノードで受信され、
前記第1のノードは前記第2のノードに前記第2のノードの前記リストのコピーに対する要求を送信し、
前記第2のノードは前記第1のノードに前記要求されたコピーを送信し、
第3のノードの前記アドレスを前記リストから選択するステップ(iv)(a)が前記第1のノードで実行され、
ステップ(iv)の(a)および(b)が、
前記第1のノードが前記第2のノードの前記アドレス及び前記第3のノードの前記アドレスを前記第1のノードの前記リストに追加し、それぞれのケースでそれが未確認であることを示すマーカが付随し、
前記第1のノードが前記第2のノードに、それがそのリストから前記第3のノードの前記リストを削除し、それを前記第1のノードの前記アドレスで置き換えることを要求するメッセージを送信し、
前記第1のノードが前記第3のノードに、それがそのリストから前記第2のノードの前記アドレスを削除し、それを前記第1のノードの前記アドレスで置き換えることを要求するメッセージを送信し、
前記第2のノードは、このようなメッセージの受信時にそのリストから前記第3のノードの前記アドレスを削除し、それを前記第1のノードの前記アドレスで置き換え、前記第1のノードに確認のメッセージを送信し、
前記第3のノードは、このようなメッセージの受信時にそのリストから前記第2のノードの前記アドレスを削除し、それを前記第1のノードの前記アドレスで置き換え、前記第1のノードに確認のメッセージを送信し、
前記第1のノードが前記第2のノードまたは前記第3のノードから前記確認のメッセージを受信すると、それぞれの「未確認」マーカをそのリストから削除する、
という点で実行される、請求項1から3のいずれか1項に記載の方法。
【請求項5】
ノードが、それが別のノードの前記アドレスをそのリストから削除し、それを指定されたノードのアドレスで置き換えることを要求するメッセージの受信時に、最初に前記指定されたノードに、前記指定されたノードの前記リストのコピーを要求するメッセージを送信し、それが、前記要求を受信する前記ノードの前記アドレスを含むリストを前記指定されたノードから受信する場合にだけ前記要求に従う、請求項4に記載の方法。
【請求項6】
前記指定されたノードに対する前記リスト要求メッセージと、このようなメッセージに対する応答が、前記リスト要求メッセージを送信する前記ノードの前記アドレスが前記指定されたノードに伝達されないように中間ノードを介して送信される、請求項3または5に記載の方法。
【請求項7】
各ノードが、少なくとも1つのスペアリンクを記憶するための手段も有し、
第1のノードと第2のノードの間のリンクを、前記第1のノードがそのリストの中に前記所定数に等しいいくつかのアドレスを有するときに要求するメッセージの受信時に、前記スペアリンク記憶装置に前記第2のノードのアドレスを挿入することと、
前記第1のノードと別のノードの間のリンクを要求する後のメッセージの受信時に、前記第1のノードの前記スペアリンク記憶手段から取り出される前記アドレスまたは1つのアドレスにそのメッセージを転送することと、
を含む、請求項1から6のいずれか1項に記載の方法。
【請求項8】
各ノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを含む記憶手段と、処理手段とを有する複数のノードを有する仮想ネットワークであって、前記処理手段が、請求項1から7のいずれか1項に記載の方法を実行するために動作中配列される仮想ネットワーク。
【請求項9】
仮想ネットワークのノードであって、前記ノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを含む記憶手段と、
メッセージを受信する、
前記リストの内容についての情報を要求するメッセージに応える、
前記リストからアドレスを削除するために受信された要求に従う、
前記リストへのアドレスの挿入を要求するメッセージに従う、
動作を実行するようにプログラミングされる処理手段によって定義され、
前記ノードと第2のノードの間にリンクを要求するメッセージの受信に応えて、
(A)そのリストの前記コンテンツについての情報を要求する第2のノードに対するメッセージを作成する、
(B)前記第1のノードと第2のノードの両方が、それぞれのケースで、前記所定数未満であるいくつかのアドレスをそのリストの中に有するかどうかを判断する、
(C)この条件が満たされる場合に、前記第2のノードの前記アドレスをそのリストに挿入し、前記第2のノードに前記ノードの前記アドレスをそのリストに追加するように要求する前記第2のノードに対するメッセージを作成する、
(D)この条件が満たされない場合に、前記ノードが前記所定数より少なくとも2少ないいくつかのアドレスをそのリストの中に有するかどうかを判断し、そうである場合には、
(a)第3のノードの前記アドレスを前記第2のノードの前記リストから選択し、
(b)前記第2のノードの前記アドレスを前記第1のノードの前記リストに挿入し、前記第3のノードの前記アドレスを前記第1のノードの前記リストに挿入し、
(c)前記第2のノードの前記リストからの前記第3のノードの前記アドレスの前記削除及び前記ノードの前記アドレスの挿入を要求する、前記第2のノードに対するメッセージを作成し、
(d)前記第3のノードの前記リストからの前記第2のノードの前記アドレスの前記削除及び前記ノードの前記アドレスの挿入を要求する、前記第3のノードに対するメッセージを作成するノード。
【請求項1】
それぞれのノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを有する、複数のノードを有する仮想ネットワークを操作する方法であって、
(i)第1のノードと第2のノードの間のリンクを要求するメッセージを受信することと、
(ii)前記第1のノードと第2のノードの両方がそれぞれのケースで、前記所定数未満であるいくつかのアドレスをそのリストの中に有するかどうかを判断することと、
(iii)この条件が満たされた場合に、前記第1のノードの前記アドレスを前記第2のノードの前記リストに挿入し、前記第2のノードの前記アドレスを前記第1のノードの前記リストに挿入することと、
(iv)この条件が満たされない場合に、前記第1のノードが、前記所定数より少なくとも2少ないいくつかのアドレスをそのリストに有するかどうかを判断し、そうである場合、
(a)第3のノードのアドレスを前記第2のノードの前記リストから選択することと、
(b)前記第2のリストの前記リストから前記第3のノードの前記アドレスを削除することと、
(c)前記第3のノードの前記リストから前記第2のノードの前記アドレスを削除することと、
(d)前記第2のノードの前記アドレスを前記第1のノードの前記リストに挿入し、前記第3のノードの前期アドレスを前記第1のノードの前記リストに挿入することと、
(e)前記第1のノードの前記アドレスを前記第2のノードの前記リストに挿入し、前記第1のノードの前記アドレスを前記第3のノードの前記リストに挿入することと、
を含む、方法。
【請求項2】
リンクを要求する前記メッセージが前記第1のノードで受信され、ステップ(iii)で、
前記第2のノードの前記アドレスが、それが未確認であることを示すマーカが付随する前記第1のノードの前記リストに挿入され、
前記第2のノードに前記第1のノードの前記アドレスを前記第2のノードの前記リンクに追加するように要求するメッセージが前記第1のノードから前記第2のノードに送信され、
前記第2のノードで、前記アドレスがこのように追加され、確認のメッセージが前記第1のノードに送信され、
前記第1のノードで、肯定応答の前記メッセージの受信時に、前記「未確認」マーカが削除される、
請求項1に記載の方法。
【請求項3】
ノードが、それがそのリストに指定されたノードのアドレスを追加するように要求するメッセージの受信時に、最初に前記指定されたノードに、前記指定されたノードの前記リストのコピーを要求するメッセージを送信し、次にそれが前記指定されたノードから、前記要求を受信する前記ノードの前記アドレスを含むリストを受信する場合にだけ前記追加要求に従う、請求項2に記載の方法。
【請求項4】
リンクを要求する前記メッセージが前記第1のノードで受信され、
前記第1のノードは前記第2のノードに前記第2のノードの前記リストのコピーに対する要求を送信し、
前記第2のノードは前記第1のノードに前記要求されたコピーを送信し、
第3のノードの前記アドレスを前記リストから選択するステップ(iv)(a)が前記第1のノードで実行され、
ステップ(iv)の(a)および(b)が、
前記第1のノードが前記第2のノードの前記アドレス及び前記第3のノードの前記アドレスを前記第1のノードの前記リストに追加し、それぞれのケースでそれが未確認であることを示すマーカが付随し、
前記第1のノードが前記第2のノードに、それがそのリストから前記第3のノードの前記リストを削除し、それを前記第1のノードの前記アドレスで置き換えることを要求するメッセージを送信し、
前記第1のノードが前記第3のノードに、それがそのリストから前記第2のノードの前記アドレスを削除し、それを前記第1のノードの前記アドレスで置き換えることを要求するメッセージを送信し、
前記第2のノードは、このようなメッセージの受信時にそのリストから前記第3のノードの前記アドレスを削除し、それを前記第1のノードの前記アドレスで置き換え、前記第1のノードに確認のメッセージを送信し、
前記第3のノードは、このようなメッセージの受信時にそのリストから前記第2のノードの前記アドレスを削除し、それを前記第1のノードの前記アドレスで置き換え、前記第1のノードに確認のメッセージを送信し、
前記第1のノードが前記第2のノードまたは前記第3のノードから前記確認のメッセージを受信すると、それぞれの「未確認」マーカをそのリストから削除する、
という点で実行される、請求項1から3のいずれか1項に記載の方法。
【請求項5】
ノードが、それが別のノードの前記アドレスをそのリストから削除し、それを指定されたノードのアドレスで置き換えることを要求するメッセージの受信時に、最初に前記指定されたノードに、前記指定されたノードの前記リストのコピーを要求するメッセージを送信し、それが、前記要求を受信する前記ノードの前記アドレスを含むリストを前記指定されたノードから受信する場合にだけ前記要求に従う、請求項4に記載の方法。
【請求項6】
前記指定されたノードに対する前記リスト要求メッセージと、このようなメッセージに対する応答が、前記リスト要求メッセージを送信する前記ノードの前記アドレスが前記指定されたノードに伝達されないように中間ノードを介して送信される、請求項3または5に記載の方法。
【請求項7】
各ノードが、少なくとも1つのスペアリンクを記憶するための手段も有し、
第1のノードと第2のノードの間のリンクを、前記第1のノードがそのリストの中に前記所定数に等しいいくつかのアドレスを有するときに要求するメッセージの受信時に、前記スペアリンク記憶装置に前記第2のノードのアドレスを挿入することと、
前記第1のノードと別のノードの間のリンクを要求する後のメッセージの受信時に、前記第1のノードの前記スペアリンク記憶手段から取り出される前記アドレスまたは1つのアドレスにそのメッセージを転送することと、
を含む、請求項1から6のいずれか1項に記載の方法。
【請求項8】
各ノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを含む記憶手段と、処理手段とを有する複数のノードを有する仮想ネットワークであって、前記処理手段が、請求項1から7のいずれか1項に記載の方法を実行するために動作中配列される仮想ネットワーク。
【請求項9】
仮想ネットワークのノードであって、前記ノードが他のこのようなノードの所定数のアドレスまでを記憶するためのリストを含む記憶手段と、
メッセージを受信する、
前記リストの内容についての情報を要求するメッセージに応える、
前記リストからアドレスを削除するために受信された要求に従う、
前記リストへのアドレスの挿入を要求するメッセージに従う、
動作を実行するようにプログラミングされる処理手段によって定義され、
前記ノードと第2のノードの間にリンクを要求するメッセージの受信に応えて、
(A)そのリストの前記コンテンツについての情報を要求する第2のノードに対するメッセージを作成する、
(B)前記第1のノードと第2のノードの両方が、それぞれのケースで、前記所定数未満であるいくつかのアドレスをそのリストの中に有するかどうかを判断する、
(C)この条件が満たされる場合に、前記第2のノードの前記アドレスをそのリストに挿入し、前記第2のノードに前記ノードの前記アドレスをそのリストに追加するように要求する前記第2のノードに対するメッセージを作成する、
(D)この条件が満たされない場合に、前記ノードが前記所定数より少なくとも2少ないいくつかのアドレスをそのリストの中に有するかどうかを判断し、そうである場合には、
(a)第3のノードの前記アドレスを前記第2のノードの前記リストから選択し、
(b)前記第2のノードの前記アドレスを前記第1のノードの前記リストに挿入し、前記第3のノードの前記アドレスを前記第1のノードの前記リストに挿入し、
(c)前記第2のノードの前記リストからの前記第3のノードの前記アドレスの前記削除及び前記ノードの前記アドレスの挿入を要求する、前記第2のノードに対するメッセージを作成し、
(d)前記第3のノードの前記リストからの前記第2のノードの前記アドレスの前記削除及び前記ノードの前記アドレスの挿入を要求する、前記第3のノードに対するメッセージを作成するノード。
【図1】
【図1A】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図1A】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【公表番号】特表2007−507142(P2007−507142A)
【公表日】平成19年3月22日(2007.3.22)
【国際特許分類】
【出願番号】特願2006−527462(P2006−527462)
【出願日】平成16年9月17日(2004.9.17)
【国際出願番号】PCT/GB2004/004003
【国際公開番号】WO2005/032069
【国際公開日】平成17年4月7日(2005.4.7)
【出願人】(390028587)ブリティッシュ・テレコミュニケーションズ・パブリック・リミテッド・カンパニー (104)
【氏名又は名称原語表記】BRITISH TELECOMMUNICATIONS PUBLIC LIMITED COMPANY
【Fターム(参考)】
【公表日】平成19年3月22日(2007.3.22)
【国際特許分類】
【出願日】平成16年9月17日(2004.9.17)
【国際出願番号】PCT/GB2004/004003
【国際公開番号】WO2005/032069
【国際公開日】平成17年4月7日(2005.4.7)
【出願人】(390028587)ブリティッシュ・テレコミュニケーションズ・パブリック・リミテッド・カンパニー (104)
【氏名又は名称原語表記】BRITISH TELECOMMUNICATIONS PUBLIC LIMITED COMPANY
【Fターム(参考)】
[ Back to top ]