(57)【要約】【課題】  ピアツーピアシステム用のオーバレイネットワークを構築および維持するためにスキップネットを使用するためのシステムおよび方法を提供すること。【解決手段】  スキップネットは、データをキー順序付けによって編成することにより、分散ハッシュテーブルのいくつかの欠点を避けるために使用可能な、分散データ構造である。スキップネットは、ノードあたりの対数状態を使用し、対数時間での検索、挿入、および削除を確率的にサポートすることができる。【選択図】  図５
2004266796.tif 000002
【特許請求の範囲】
【請求項１】
ネットワーク化されたノードのセットからオーバレイネットワークを作成するための方法であって、
各ノードに異なる名前を割り当てること、
各ノードに異なる番号を割り当てることであって、各番号は、ネットワーク化されたノードのセット全体にわたって固有であり、ノード全体にわたる番号の分散は、確率的に均一であること、および
各ノードのルーティングテーブルを作成することであって、各テーブルは、２以上のポインタを含み、前記ネットワーク化されたノードのセットが名前によって辞書編集的に順序付けされたときに、各ポインタは、現在のノードからの異なる数のポジションオフセットである特定のノードを指すこと
を備えたことを特徴とする方法。
【請求項２】
同じドメイン上にあるノードは、名前によって辞書編集的に順序付けされたときに互いに隣接することを特徴とする請求項１に記載の方法。
【請求項３】
各ノードのテーブル内にある第１のポインタは、前記ノードが名前によって辞書編集的に順序付けされたときに、直後のノードを指すことを特徴とする請求項１に記載の方法。
【請求項４】
各ノードのテーブル内にある第２のポインタは、前記ノードが名前によって辞書編集的に順序付けされたときに、直前のノードを指すことを特徴とする請求項３に記載の方法。
【請求項５】
各ノードのテーブル内にある第３のポインタは、前記ノードが名前によって辞書編集的に順序付けされたときに、Ｋポジションだけ前にある距離ノードを指すことを特徴とする請求項４に記載の方法。
【請求項６】
各ノードのテーブル内にある第４のポインタは、前記ノードが名前によって辞書編集的に順序付けされたときに、Ｋポジションだけ後ろにある距離ノードを指すことを特徴とする請求項５に記載の方法。
【請求項７】
前記ポインタは、ノードのネットワークアドレスであることを特徴とする請求項１に記載の方法。
【請求項８】
前記ネットワークアドレスは、ＩＰアドレスであり、前記オーバレイネットワークは、インターネットに接続されたノードのサブセットを含むことを特徴とする請求項７に記載の方法。
【請求項９】
各ノードのテーブルに追加のアドレスを加えることによって前記オーバレイネットワーク内に１つまたは複数のサブリングを形成することであって、前記追加のアドレスは、同じサブリングに属する他のノードを識別することをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１０】
前記ノード名は、ユーザの電子メールアドレスであることを特徴とする請求項１に記載の方法。
【請求項１１】
前記ノード名は、ユニフォームリソースロケータ（ＵＲＬ）であることを特徴とする請求項１に記載の方法。
【請求項１２】
前記ノード名は、ＤＮＳ（ドメインネームサービス）名であることを特徴とする請求項１に記載の方法。
【請求項１３】
各ノードについて近接テーブルを作成することであって、前記近接テーブルは、ネットワーク位置に基づいて隣接ノードを指す１つまたは複数のポインタを格納することをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１４】
各ノードについて２以上のリーフセットポインタを格納することをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１５】
広域一意識別子（ＧＵＩＤ）を取得するためにファイル名をハッシュすること、
ＧＵＩＤに最も近い番号を備えた前記オーバレイネットワーク上のノードを見つけること、および
前記ファイルをそのノードに格納すること
をさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１６】
ファイル名を受け取り、前記ファイル名に最も緊密に一致する名前の、前記オーバレイネットワーク上にあるノードを識別すること、および
前記ファイル名に関連付けられた前記ファイルを、前記識別されたノードに格納すること
をさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１７】
広域一意識別子（ＧＵＩＤ）を取得するためにファイル名をハッシュすることであって、前記ファイル名は、前記オーバレイネットワーク上のどのドメインに前記ファイルを格納すべきであるかを示すドメイン識別子接頭部を含むこと、
前記ドメイン識別子に一致するノード名を備えた前記オーバレイネットワーク上のノードのＧＵＩＤに最も近い番号を有する前記オーバレイネットワーク上のノードを見つけること、および
前記ファイルをそのノードに格納すること
をさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１８】
前記オーバレイネットワーク上に格納するためにファイルを受け取り、制約付きロードバランシングを実行することをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項１９】
コンピュータ読取り可能媒体上で実施されるコンピュータプログラムであって、前記コンピュータプログラムは、請求項１ないし１８のいずれか一項に記載の方法を実施するように実行可能であることを特徴とするコンピュータプログラム。
【請求項２０】
ネットワーク化されたノードのセットからオーバレイネットワークを作成するための方法であって、各ノードはアドレスを有し、前記方法は、
各ノードに異なる名前を割り当てること、
各ノードに異なる番号を割り当てること、および
各ノードにテーブルを作成することであって、前記テーブルは、それぞれのレベル番号ｈを有する２以上のレベルを有し、第１のレベルは、レベル番号ｈ＝０を有し、辞書編集的に隣接するノードのアドレスを含み、さらに前記テーブルの後続のレベルは、それぞれ辞書編集的にｈｋノード離れたノードのアドレスを含み、ここで、ｋは正の整数であって、前記ノードの辞書編集順序は、前記ノードの名前によって決定されること
を備えたことを特徴とする方法。
【請求項２１】
前記ノードに関連付けられた番号は、ノードをほぼ均等にサブリングに分散させるために使用され、特定のサブリングに属する各ノードは、前記サブリング内にあるノードがノード名により辞書編集的に順序付けられる場合に、前記サブリング内のすぐ隣にあるノードを指す少なくとも１つのポインタを有することを特徴とする請求項２０に記載の方法。
【請求項２２】
ネットワーク化されたノードをピアツーピアアプリケーションに好適な方法で編成するための方法であって、
各ノードに異なる辞書編集的な名前を割り当てること、
各ノードに異なる番号を割り当てること、
各ノードにテーブルを作成すること、
前記ノードを各ノード名により辞書編集的に論理リングに配置構成することであって、各ノードのテーブルは、１つまたは複数の隣接ノードのアドレスを前記リング上に格納すること、
前記ノードを２つの論理サブリングに分割することであって、前記ノードの一部は、各サブリング内にあり、各ノードのテーブルは、前記１つまたは複数のノードのアドレスを前記サブリングに格納すること、および
前記分割を複数のノードを有する各サブリングにつき１または複数回反復すること
を備えたことを特徴とする方法。
【請求項２３】
各ノードに割り当てられた前記番号は、ほぼランダムおよび固有であり、前記ノードは、ランダム数に基づいてサブリングに分割されることを特徴とする請求項２２に記載の方法。
【請求項２４】
前記ノードは、パスに従って辞書編集的に順序付けられ、各ノードのパスは、少なくとも１つのドメイン名およびノード名を含むことを特徴とする請求項２２に記載の方法。
【請求項２５】
少なくとも１つのノードのパスは、複数のネストされたドメイン名を含むことを特徴とする請求項２４に記載の方法。
【請求項２６】
ファイルをオーバレイネットワークに格納するための方法であって、
前記ファイルが共通の名前接頭部を共用する前記オーバレイネットワーク上のノードセットに制約されているか否かを判別すること、
前記ファイルのファイル名をハッシュして広域一意識別子（ＧＵＩＤ）を生成すること、および
前記オーバレイネットワークで最高に一致するノードを検索することであって、前記オーバレイ上の各ノードは、関連付けられた番号を有し、前記最高に一致するノードは、ＧＵＩＤと関連付けられた番号を比較することによって決定され、共通の名前接頭部を共用するノードのみが、前記ファイルが共通の名前接頭部を共用する前記オーバレイネットワーク上のノードセットに制約されているか否かを考慮されること
を備えたことを特徴とする方法。
【請求項２７】
前記方法は、アプリケーションレベルオーバレイネットワークとして実施されることを特徴とする請求項２６に記載の方法。
【請求項２８】
複数のノードを有するオーバレイネットワークを作成するためのデータ構造であって、
前記オーバレイネットワークの所与のノードに格納されるように構成されたアドレステーブルを備え、ノードが辞書編集用ノード名に基づいて辞書編集的に順序付けされる場合に、各アドレスは、所与のノードからの異なる一定のオフセットでノードを識別することを特徴とするデータ構造。
【請求項２９】
数値アドレススペース内でのルーティングを最適化する近接テーブルをさらに備えたことを特徴とする請求項２８に記載のデータ構造。
【請求項３０】
辞書編集用アドレススペース内でのルーティングを最適化する近接テーブルをさらに備えたことを特徴とする請求項２８に記載のデータ構造。
【請求項３１】
数値アドレススペース内でのルーティングを最適化する近接テーブル、および辞書編集用アドレススペース内でのルーティングを最適化する近接テーブルをさらに備えたことを特徴とする請求項２８に記載のデータ構造。
【請求項３２】
２以上のノードが単一の物理位置を共用する場合にオーバレイネットワークを管理するための方法であって、
各ノードに異なる辞書編集的な名前を割り当てること、
前記ノードの一部に関する部分的なルーティングテーブルのみを格納すること、および
前記ノードの共用近接テーブルを格納することであって、各ルーティングテーブルは、２以上のルーティングポインタを含み、前記ネットワーク化されたノードのセットが名前によって辞書編集的に順序付けされたときに、各ルーティングポインタは、現在のノードからの異なる数のポジションオフセットである特定のノードを指し、各近接テーブルは、１つまたは複数の近接ポインタを含み、前記ネットワーク化されたノードのセットが互いのネットワーク距離によって順序付けされたときに、各近接ポインタは、現在のノードからの異なる数のネットワークポジションオフセットである特定のノードを指すこと
を備えたことを特徴とする方法。
【請求項３３】
複数のノード用にオーバレイネットワークを作成する方法であって、
異なる任意の文字列識別子を各ノードに割り当てること、および
各ノードにポインタテーブルを作成することであって、各テーブルは、２以上のポインタを含み、前記ネットワーク化されたノードのセットが前記任意の文字列識別子によって辞書編集的に順序付けされたときに、各ポインタは、現在のノードからの異なる数のポジションオフセットである特定のノードを指すこと
を備えたことを特徴とする方法。
【請求項３４】
ノードが前記オーバレイネットワークに接合するかまたは離れるときに前記オーバレイネットワーク内の各ノードの前記ポインタテーブルを維持することをさらに備えたことを特徴とする請求項３３に記載の方法。
【請求項３５】
前記オーバレイネットワーク上に格納するためにファイルを受け取ること、および
前記オーバレイネットワーク上のノードに前記ファイルを格納するために制約付きロードバランシングを実行すること
をさらに供えたことを特徴とする請求項１に記載の方法。
【請求項３６】
任意の文字列識別子の間隔を確立すること、および
それらの間隔に充填するために、所望の特性を備えたノードを選択すること
をさらに備えたことを特徴とする請求項１に記載の方法。
【請求項３７】
前記所望の特性は、ネットワーク近接であることを特徴とする請求項３６に記載の方法。
【請求項３８】
ピアツーピアネットワークを実施するために前記オーバレイネットワークを使用することをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項３９】
前記ピアツーピアネットワークは、ユーザが、前記特定ノードの文字列識別子を使用して前記特定ノードを指定することにより、前記オーバレイネットワークの特定ノード上にデータを格納できるようにすることを特徴とする請求項３５に記載の方法。
【請求項４０】
前記オーバレイネットワーク内の組織上の境界線にあるネットワーク区分により、２つの接合していないが内的に接続され、動作可能に小規模なオーバレイネットワークが生じることを特徴とする請求項１に記載の方法。
【請求項４１】
前記ローカル区分が完全なオーバレイネットワークを形成するように、前記ネットワークが区分された後に前記ポインタテーブルを更新することをさらに備えたことを特徴とする請求項４０に記載の方法。
【請求項４２】
前記ネットワークが修復され、個々の区分されたオーバレイネットワークが再接合された後に、前記ポインタテーブルを更新することをさらに備えたことを特徴とする請求項４０に記載の方法。
【請求項４３】
ネットワーク化されたノードのセットからオーバレイネットワークを作成するための方法であって、
各ノードに異なる名前を割り当てること、
各ノードに異なる番号を割り当てることであって、各番号は、ネットワーク化されたノードのセット全体にわたって固有であり、ノード全体にわたる番号の分散は、確率的に均一であること、および
各ノードのルーティングテーブルを作成することであって、各テーブルは、１つまたは複数のポインタを含み、前記ネットワーク化されたノードのセットが名前によって辞書編集的に順序付けされたときに、各ポインタは、現在のノードからの異なる数のポジションオフセットである特定のノードを指すこと
を備えたことを特徴とする方法。
【請求項４４】
前記ノードの番号は、前記ルーティングテーブル内で使用される前記ポインタを決定するために使用されることを特徴とする請求項４３に記載の方法。
【請求項４５】
前記ノードの番号は、ランダムに生成されることを特徴とする請求項４３に記載の方法。
【請求項４６】
前記ノードの番号の接頭部は、リング内のメンバシップを決定するために使用されることを特徴とする請求項４３に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的にコンピュータネットワークに関し、より具体的には、ピアツーピアネットワークアプリケーションおよび分散データベースに使用可能なオーバレイネットワークに関する。
【背景技術】
【０００２】
今もなお増え続けるコンピュータがインターネット上で相互にネットワーク化されるにつれて、ピアツーピア（Ｐ２Ｐ）ネットワークアプリケーションおよび分散データベースの有用性および重要性が明らかになってきた。
【０００３】
ピアツーピアネットワークとは、一般的に、単一のサーバまたは制御装置がネットワークを管理する責務を負うことのない、コンピュータの自己管理型ネットワークと考えられる。ピアツーピアネットワークおよびアプリケーションの生成には、いくつかの異なるアーキテクチャを使用できる。こうしたアーキテクチャの１つがオーバレイネットワークである。一般に、オーバレイネットワークは、インターネットプロトコル（ＩＰ）アドレスなどの従来のネットワーキングアドレスを介して、あるレベルの間接的な処理を提供する。オーバレイネットワークを使用することの重要な利点は、アプリケーションソフトウェアによってルーティングを決定できることである。
【０００４】
図１Ａは、典型的なオーバレイネットワークを示す図である。オーバレイネットワークに属するコンピュータ（１０）は、基礎となるネットワーク媒体１１を使用して相互間でメッセージをルーティングする。基礎となるネットワーク媒体は、特定のコンピュータ間でメッセージを直接ルーティングするための情報および機能を有するが、オーバレイネットワークは、典型的には部分的なルーティング情報のみを維持し、その意図する宛先にメッセージを送達するために中間ノードを介した連続的な転送に依拠する。オーバレイネットワークが一般的に使用されるのが、分散ハッシュテーブルを構築する場合である。各コンピュータ名は、ＧＵＩＤ（広域的一意識別子）を生成するために、ハッシングアルゴリズム（例えばＭＤ５ハッシュ）を介して実行される。オーバレイネットワークの各メンバは、分散ハッシュテーブルの一部を格納する。オーバレイネットワーク上のノードから文書の要求または更新が送信されると、発信元ノードは要求された文書のファイル名をハッシュした後、そのルーティングテーブルエントリを調べて、その文書のハッシュに最も近いＩＤのノードを見つける。次に要求は、この最も近い中間ノードに転送される。中間ノードは同じプロセスを実行して、文書のハッシュと中間ノードのルーティングテーブルエントリとを比較する。オーバレイネットワークは、ノードのＩＤが他のどんなノードのＩＤよりも文書のハッシュに近い場合にこれを伝えられるように、そのルーティングテーブル内に十分な情報を維持する。その後、この最も近いノードが文書を格納し、これに関する照会に応答する責務を負う。
【０００５】
ピアツーピアネットワーク用の現在のオーバレイネットワークのタイプ例には、Ben Y.Zhao等によりカリフォルニア大学バークレー校で開発されたTapestry、マサチューセッツ工科大学で開発されたChord、およびMicrosoft社によって開発されたPastryが含まれる。Tapestry、Chord、およびPastryは、分散システムを構築するためのツールキットである。
【０００６】
Tapestryは、ピアツーピア、ワイドエリア非集中型ルーティング、およびロケーションネットワークのインフラストラクチャを提供する。Tapestryは、アプリケーションレイヤ（オペレーティングシステムの一番上）にあるオーバレイネットワークである。Tapestryをネットワーク内の別々のマシン上に配置すると、ロケーションおよびネットワークに無関係の名前が与えられるとすれば、任意のノードがネットワーク内の任意の他のノードにメッセージをルーティングすることができる。さらに、Tapestryネットワーク内の任意のノードは、オブジェクト名が与えられるとすれば、他のTapestryノード上のアプリケーションがこれらのオブジェクトを容易かつ効率的に見つけられるような方法で、所有するオブジェクトに関するロケーション情報を広告または「公表」することができる。Tapestryは、障害または攻撃のポイントとなる可能性のあるどんな集中化ポイントもなしに、個々のマシンを真のピアツーピアネットワークに形成する。
【０００７】
Pastryは、ピアツーピアアプリケーション用の汎用、スケーラブル、かつ有効な基板である。Pastryノードは、インターネット内に非集中型、自己編成型、かつ耐障害性のオーバレイネットワークを形成する。Pastryは、アプリケーション独立な方法により、有効な要求ルーティング、確定的オブジェクトロケーション、およびロードバランシングを提供する。さらにPastryは、アプリケーション特有のオブジェクト複製、キャッシング、および障害回復をサポートし、容易にするメカニズムを提供する。
【０００８】
ＭＩＴのChordプロジェクトは、ピアツーピア概念を使用するスケーラブルで堅固な分散システムに関する。Chordは、分散ハッシュ検索基本要素に基づくものである。Chordは、非集中型および対称形であり、ｌｏｇ（Ｎ）メッセージのみを使用してデータを見つけることが可能であって、Ｎはシステム中のノード数である。これらに加えて他のオーバレイシステムもある。例えば、ＣＡＮ、Kademlia、およびViceroyは、同様の他のシステムである。新しいオーバレイ設計が次々と登場している。
【０００９】
Tapestry、Pastry、およびChordなどの多くの既存のシステムは、通常、わずかに異なる方法ではあるが、ハッシングの特徴に依存している。これらには、均一分散識別子、識別子スペース内での演算、および固定長識別子が含まれる。ChordおよびPastryは、どちらも効率的なオペレーションに関する第１の特性に依存する。Chordは、その「フィンガ（finger）」を決定するための識別子スペース内での演算に依存する。最終的にPastryは、固定深さルーティングテーブルを保証するための固定長識別子に依存する。
【００１０】
ハッシングの使用は、分散ハッシュテーブルを実施する際にも必須であることは明らかである。ハッシングの主な利点は、ノード間でのデータの均一分散である。この特徴は、しばしば「ロードバランシング」として大いに推奨されるが、ロードバランシング設計の単なる一面にすぎない。ハッシングに基づく多くのオーバレイネットワークは、ある種のピアツーピアアプリケーションにとって重要な局所性（locality）の特徴が欠けている。（例えば、非特許文献１参照）ピアツーピアシステムには役立つが、ハッシュベースのオーバレイネットワークで実施するのが困難な２つのこうした特徴が、コンテンツ局所性およびパス局所性である。
【００１１】
コンテンツ局所性とは、特定ノード上にデータ項目を格納する機能のことである。より洗練されていない形では、コンテンツ局所性は、特定セットのノードのうちの任意の１つにデータ項目を格納する機能である。会社や政府機関などの組織にとって、機密文書が組織ネットワークの外に配布されないようにするために、複雑なネットワークセキュリティ手段を実施することは珍しいことではない。従って、これらの組織が、特定の文書がどこに格納されるかを管理することのないピアツーピアアプリケーションを使用する可能性は少ない。例えばＸＹＺ社は、一定の文書がxyz.comドメインに属するコンピュータにのみ確実に格納されることを望む場合がある。
【００１２】
パス局所性とは、ネットワークの特定領域内にある任意の２つのノード間でのルーティングパスがその領域を離れないことを保証する機能のことである。領域は建物、管理ドメインなどであってよい。上記の例を使用すると、ＸＹＺ社は、機密メッセージがxyz.comドメイン外にルーティングされるのを制限したい場合がある。パス局所性を使用すると、ＵｓｅｒＡ（usera@xyz.com）からＵｓｅｒＢ（userb@xyz.com）へのメッセージは、xyz.comドメイン内のコンピュータ間でのみルーティングされるように制限することができる。これは、オーバレイネットワーク上のいくつかの他のドメインがＸＹＺ社の競合会社に属している場合に、特に重要となる可能性がある。
【００１３】
現在のハッシュベースのシステムは、本質的にコンテンツ局所性またはパス局所性をサポートするものではない。実際に、全体的な目的は、システムのすべてのマシンに渡ってロードを均一に拡散させることである。従って、そうしたシステムに普及しているハッシングの使用により、どこにデータが格納されるかおよびどのようにトラフィックがルーティングされるかに関する管理を、実際に減らすかまたは止めることができる。
【００１４】
以下の参照文献は、読者に便利なようにさらに役立つ背景情報を提供することができる。
【００１５】
【非特許文献１】Pete Keleher, Bobby Bhattacharjee, Bujor Silaghi, "Are Virtualized Overlay networks Too Much of a Good Things?" (IPTPS 2002)
【非特許文献２】I. Stoica, R. Morris, D. Karger, M. F. Kaashoek, and H. Balakrishnan, "Chord: A scalable peer-to-peer lookup service for Internet applications," Proc. ACM SIGCOMM' 01, San Diego, CA, Aug. 2001
【非特許文献３】A. Rowstron and P. Druschel, "Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems," IFIP/ACM International Conference on Distributed Systems Platforms (Middleware), Heidelberg, Germany, pages 329-350, Nov. 2001
【非特許文献４】Sylvia Ratnasamy, Paul Francis, Mark Handley, Richard Karp, and Scott Shenker, "A Scalable content-Addressable Network," Proceedings of ACM SIGCOMM, San Diego, CA, pp. 161-172, Aug. 2001
【非特許文献５】Ben Y. Zhao, John D. Kubiatowiez, and Anthony D. Joseph, "Tapestry: An Infrastructure for Fault-tolerant Wide-area Location and Routing," U. C. Berkeley Technical Report
【非特許文献６】W. Pugh, "Skip Lists: A Probabilistic Alternative to Balanced Trees," Communications of the ACM, vol. 33, no. 6, June 1990, pp. 668-676
【非特許文献７】W. Pugh, "A Skip List Cookbook," Technical Report CS-TR-2286. 1, University of Maryland, 1989
【非特許文献８】J. I. Munro, T. Papadakis and R. Sedgewick, "Deterministic skip lists," Proc. 3rd Annual ACM-SIAM Symposium on Discrete Algorithms, pages 367-375, 1992
【非特許文献９】Bozanis P. and Manolopoulos Y., "DSL: Accommodating Skip Lists in the SDDS Model," Proceedings 3rd Workshop on Distributed Data and Structures (WDAS' 2000), L' Aquila, 2000
【非特許文献１０】Sylvia Ratnasamy, Scott Shenker, Ion Stoica "Routing Algorithms for DHTs: Some Open Questions" IPTPS 2002
【発明の開示】
【発明が解決しようとする課題】
【００１６】
本発明の目的は、オーバレイネットワークを作成するための改良型システムおよび方法を提供することである。
【００１７】
具体的には、コンテンツ局所性を提供することのできるオーバレイネットワークが求められる。パス局所性を提供することのできるオーバレイネットワークも望ましい。さらに、既存のオーバレイネットワークのルーティング性能を保持しながら、コンテンツ局所性およびパス局所性の特徴を提供するオーバレイネットワークも望ましい。
【課題を解決するための手段】
【００１８】
前述のように、スケーラブルなピアツーピアオーバレイネットワーク上に構築された分散ハッシュテーブルが、ピアツーピアシステムを構築するためのフレキシブルなインフラストラクチャとして近年登場してきた。こうしたシステムの２つの欠点は、データがどこに格納されるかを管理するのが困難であること、およびルーティングパスが管理ドメイン内に留まるように保証するのが困難であることである。スキップネット（SkipNet）とは、キーの順序付けによってデータを編成することで、分散ハッシュテーブルの欠点を補償するために使用することのできる、ある種の分散データ構造のことである。スキップネットは、ノード当たりの対数状態を使用して、対数時間での検索、挿入、および削除をサポートすることができる。スキップネットは、実施に応じて、分散ハッシュテーブルに勝るいくつかの他の潜在的な利点も有する可能性がある。これらの潜在的利点には、効率的な領域照会のサポート、物理ノード上で複数の仮想ノードを実施するより効率的な方法、組織全体または他の別のセグメントが残りのシステムから切り離される（後に再接続される）、区画障害を処理するより効率的な方法、ならびに、システムに参加しているすべてのノードの指定されたサブセットに渡ってロードバランスを実行する機能が含まれる。
【００１９】
本明細書では、スキップネットを使用してオーバレイネットワークを作成、管理、および動作させるための改良型システムおよび方法について開示する。有利なことに、これらのシステムは、典型的には分散ハッシュテーブルの使用に関連付けられたいくつかの欠点を克服する可能性を有する。一実施形態では、ピアツーピアネットワークアプリケーション用のオーバレイネットワークを作成するための方法が企図される。具体的に言えば、図２および８で様々な形で示されるようなルーティングテーブルがリング構造を符号化し、数値スペースまたは辞書編集用（lexicographic）スペースのいずれかで使用することができる。ネットワーク近接を補償することによって、数値スペースおよび辞書編集用スペースそれぞれでのルーティングを最適化するために、２つの追加テーブルが作成されることが好ましい。数値アドレススペースを確立するのに使用されるハッシュ値は、特定のノードがどのリングを接合することになるかを決定し、結果として生じる確率的ネットを保証する際にも使用される。
【００２０】
オーバレイネットワーク上でファイルを格納および取り出すための方法も開示される。一部の実施形態では、この方法が、（例えば、ファイルの格納を特定の１つまたは複数のドメインに限定することによって）あるファイルをオーバレイネットワークの特定のサブセットに拘束することを含むことができる。こうした制約付きのロードバランシングの一実施形態は、数値スペースアドレス割当ての擬似ランダム性に関連付けられたロードバランシングを提供するために、以下で論じるように、ルーティングの終わり近くで数値スペースに移行する前に名前スペースで初期にルーティングすることを伴う。
【００２１】
スキップネットベースのオーバレイネットワークを修復するための方法も開示され、単一のコンピュータ上で複数の仮想ノードをより効率的にホストするための方法も同様に開示される。
【００２２】
本発明の追加の特徴および利点は以下の説明に記載され、一部は説明から明らかになるか、または本発明の実施によって学ぶことができる。本発明の特徴および利点は、添付の特許請求の範囲で具体的に指摘された計器および組合せの手段によって実現および取得することができる。本発明のこれらおよび他の特徴は、以下の説明および添付の特許請求の範囲から、より完全に明らかになろう。以下の詳細な記述に含まれる見出しは、編成のためだけのものであり、本発明または添付の特許請求の範囲を制限または修正することを意図するものではない。
【００２３】
添付の特許請求の範囲は本発明の特徴を詳細に記載したものであり、本発明ならびにその目的および利点は、添付の図面と共に以下の詳細な説明を読むことによって、最も良く理解することができる。
【発明を実施するための最良の形態】
【００２４】
本発明の様々な実施形態の説明に移る前に、本発明の様々な実施形態が実施可能なコンピュータおよびネットワーキング環境について説明する。これは必須ではないが、本発明はコンピュータによって実行されるプログラムによって実施することができる。一般にプログラムには、特定のタスクを実行するかまたは特定の抽象データ型を実施する、ルーチン、オブジェクト、構成要素、データ構造などが含まれる。本明細書で使用される「プログラム」という用語は、単一のプログラムモジュールまたは協働する複数のプログラムモジュールを意味することができる。本明細書で使用される「コンピュータ」という用語は、パーソナルコンピュータ（ＰＣ）、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースのプログラム可能民生電子製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、マイクロプロセッサまたはマイクロコントローラを有する家庭用電化製品、ルータ、ゲートウェイ、ハブなどの、１つまたは複数のプログラムを電子的に実行する任意のデバイスが含まれる。本発明は、通信ネットワークを介してリンクされたリモート処理デバイスによってタスクが実行される、分散コンピューティング環境でも使用することができる。分散コンピューティング環境では、プログラムはローカルとリモートの両方のメモリ記憶デバイスに位置することができる。
【００２５】
次に、本発明が使用可能なネットワーク環境の一例について、図１Ａを参照しながら説明する。このネットワーク例には、クラウドで表されたネットワーク１１を介して互いに通信する、いくつかのコンピュータ１０が含まれる。ネットワーク１１は、ルータ、ゲートウェイ、ハブなどの多くのよく知られた構成要素を含むことが可能であり、コンピュータ１０が無線および／または有線の媒体を介して通信できるようにするものである。１つまたは複数のコンピュータがネットワーク１１を介して互いに対話する場合、他のコンピュータに関してクライアント、サーバ、またはピアとして動作することができる。従って、たとえ本明細書に含まれる特定の例がこれらすべてのタイプのコンピュータについて言及していなくとも、本発明の様々な実施形態は、クライアント、サーバ、ピア、またはそれらの組合せ上で実施可能である。
【００２６】
図１Ｂを参照すると、本明細書に記載された発明のすべてまたは一部が実施可能なコンピュータに関する基本構成の一例が示されている。コンピュータ１０は、その最も基本的な構成では、通常少なくとも１つの処理ユニット１４およびメモリ１６を含む。処理ユニット１４は、本発明の様々な実施形態に従ってタスクを実行するための命令を実行する。こうしたタスクを実行する場合、処理ユニット１４は、何らかの結果を生じさせるためにコンピュータ１０の他の部分およびコンピュータ１０の外部デバイスに電子信号を伝送する。コンピュータ１０の正確な構成および種類に応じて、メモリ１６は揮発性（ＲＡＭなど）、不揮発性（ＲＯＭまたはフラッシュメモリなど）、またはこの２つの何らかの組合せであってよい。この最も基本的な構成は、図１Ｂの破線１８で示されている。さらにコンピュータは、追加の特徴／機能を有することもできる。例えば、コンピュータ１０は、磁気または光学式のディスクまたはテープを含むがこれらに限定されることのない、追加の記憶装置（取外し可能および／または取外し不能）を含むこともできる。コンピュータ記憶媒体は、コンピュータ実行可能命令、データ構造、プログラムモジュール、または他のデータを含む情報を記憶するための、任意の方法または技法で実施された、揮発性および不揮発性、取外し可能および取外し不能の媒体を含む。コンピュータ記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリ、ＣＤ−ＲＯＭ、デジタル汎用ディスク（ＤＶＤ）または他の光記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置、または他の磁気記憶デバイス、あるいは、所望の情報の格納に使用可能でありコンピュータ１０がアクセス可能である任意の他の媒体を含むが、これらに限定されるものではない。任意のこうしたコンピュータ記憶媒体は、コンピュータ１０の一部であってよい。
【００２７】
コンピュータ１０は、デバイスが他のデバイスと通信できるようにする通信接続も含むことが好ましい。通信接続とは、通信媒体の一例である。通信媒体は、典型的には、搬送波または他の移送メカニズムなどの変調データ信号中で、コンピュータ読取り可能命令、データ構造、プログラムモジュール、または他のデータを具体化し、任意の情報送達媒体を含むものである。例を挙げると、「通信媒体」という用語は、有線ネットワークまたはダイレクトワイヤード接続などの有線媒体、および音響、ＲＦ、赤外線、および他の無線媒体などの無線媒体を含むが、これらに限定されるものではない。本明細書で使用される「コンピュータ読取り可能媒体」という用語は、コンピュータ記憶媒体と通信媒体の両方を含む。
【００２８】
コンピュータ１０は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイスなどの入力デバイスも含むことができる。ディスプレイ２０、スピーカ、プリンタなどの出力デバイスも含むことができる。これらのデバイスはすべて当分野でよく知られており、ここでこれ以上論じる必要はない。
【００２９】
以下の考察の各トピックに関して、本発明の実施形態に関する追加の資料について詳細な説明の付録を参照するものであることに留意されたい。
【００３０】
（スキップネット）
当分野で知られた特定のリスト構造は、スキップリストと呼ばれることがある。スキップリストとは、メモリ内辞書データ構造である。つまり、スキップリストとは、一部のノードが多くのリスト要素に渡ってスキップするポインタで補完された、分類されたリンク済みリストである。図７Ａに示されるような「完全」スキップリストは、リスト内のｉ'番目のノードの高さが、ｉを分ける２の最大累乗の指数によって決定されるものである。高さｉのポインタは、長さ２ｉを有する（すなわち、リスト内で２ｉノードをトラバースする）。従って完全スキップリストは、Ｏ（ｌｏｇ  ｎ）時間の検索を明確にサポートする。
【００３１】
完全スキップリストで挿入および削除を実行するにはかなりの費用がかかるため、確率的スキームが提案されてきた。（例えば、非特許文献７参照）目的は、図７Ｂに示されるように、Ｏ（ｌｏｇ  ｎ）検索を高い確率で維持するためのノード高さを決定しながら、挿入または削除の際に調整されたポインタが相対的にローカルであること、例えば挿入／削除済みノードにあること、および／または隣に近いことを保証することである。つまり、ノードは、高さ１で確率０．５、高さ２で確率０．２５などとなる。スキップリストは、各リスト要素を分散システムの異なるノード上に配置するだけで、分散構造にすることができる。ただし、最も高さが高い数個のノードは、それよりも高さの低いノードよりも多くの検索メッセージを処理しなければならなくなるため、こうした構造は、ピアツーピアシステムで使用するのには適していない。オリジナルのスキップリストが、各ノードが高さｎを有するように修正された場合、すべてのポインタは高さに関係なく長さ１を有することになり、リストは長距離ホップをまったく実行できないリンクリストに退歩してしまう。
【００３２】
スキップネットでは、前述のようなスキップリストと区別するために、あらゆるノードが高さｌｏｇ  ｎを有するが、にもかかわらず高さｉのポインタはほぼ２ｉの予測高さを有することが好ましい。スキップネットは、ハッシュ関数から取得される数の代わりに文字列の宛先フィールドを有するメッセージを使用する。メッセージは、文字列名が、オーバレイネットワーク中の任意のノードのメッセージ宛先文字列に一致する最も長い接頭部であるノードにルーティングされる。
【００３３】
ノード用の文字列名を使用して、オーバレイネットワーク中のすべてのノードを辞書編集用に分類されたリンク済みリスト（「ベースリング」）に配置構成することが可能であり、これはメッセージをその正しい最終宛先にルーティングするのに十分である。ただしこれは遅く、Ｏ（Ｎ）ステップを要するものであって、ここでＮは、オーバレイネットワーク中のノード数である。すべてのノードの辞書編集用に分類されたリストの様々なメンバを「スキップ」する複数のリングを維持することによって、ルーティング性能を向上させることができる。これらの追加リングにより、所望の最終宛先ノードをより速く見つけることができる。
【００３４】
複数のリングを有する編成は、ベースリングのみが維持されている場合に必要なＯ（Ｎ）ステップの代わりに、ルーティングをＯ（ｌｏｇ  ｎ）転送ステップで完了させることができる。図８に示されたポインタ構造に対応するような「パーフェクト」スキップネット（図２にリング構造形式で示されている）では、ネットワークは、高さｈに２ｈの接合されていないリングがあるように配置構成され、各ノードは各高さにある厳密に１つのリングに属している。従って、高さｈにある各リングがｎ／２ｈのノードを含むと予測する。さらにこの実施形態では、高さｈにあるリングｒは、高さｈ＋１でリング２＊ｒおよび２＊ｒ＋１に区分されるように指定する。
【００３５】
従って、図２の理想的なスキップネット例では、ノードＡ、Ｄ、Ｍ、Ｑ、Ｔ、Ｖ、Ｘ、およびＺを含むオーバレイネットワークが、ベースリング２００に示されている。スキップネットを使用すると、オーバレイネットワークは論理上異なるレベルのリングに分けることができる。例えば、レベル１では、ベースリング（オーバレイネットワークのすべてのノードを含む）が２つの小規模リング（時にサブリングと呼ばれる）に分けられる。これら２つの小規模リングは、リング０（ノードＡ、Ｍ、Ｔ、およびＸを含む）およびリング１（ノードＤ、Ｑ、Ｖ、およびＺを含む）とラベル付けされる。この例では、ベースリングからのノードは、それらの辞書編集名に基づいて交互に小規模リングに割り当てられる。各小規模リング内では、ノードは辞書編集的に再度論理的に順序付けられる。
【００３６】
このプロセスは、追加の小規模リングを形成するために繰り返すことができる。例えば、リング００はリング０からのノードＡおよびＴを含み、リング０１はリング０からのノードＭおよびＸを含む。同様にリング１０はリング１からのノードＤおよびＶを含み、リング１１はリング１からのノードＱおよびＺを含む。従って、さらに小規模レベルの各リングは、対応する大規模リングからのノードのサブセットを含む。このプロセスは、すべてのノードがノードを１つだけ含む「リーフリング」に割り当てられるまで続けることができる。この例では、リング高さまたはレベルが３のリング０００から１１１が、すべてリーフリングである。
【００３７】
残念なことに、完全スキップネットを使用したオーバレイネットワークからのノードの追加および削除には、多くのリングメンバシップをかなり再配置する必要があり、これは計算上多くの費用がかかることになる。リングメンバシップを拾い集めることのできる本質的にランダムな２進数を割り当てることにより、各レベルでの確率的な決定を確実にする。さらに、特定ネット内のこうした数をそれぞれ確実に実質上固有なものにすることによって、こうした数が使用可能な数値アドレススペースを提供することもできる。
【００３８】
従って、本発明の実施形態では、実質上ランダムな数を選び取り、これを使用してノードが接合しなければならないリングを指定することによって、様々なリング内のメンバシップが決定される。詳細には、ノードは、ノードが自身によってリングに存在するに至るレベルにおけるリングに接合する。典型的には、一方向ハッシュ関数を使用して、これをノード名に適用することによって、ノードの固有ＩＤが生成される。その結果、多くの桁を有する数が生じることになり、１２８ビットは、いくつかの一般に使用される一方向ハッシュ関数によって生成される。リングは、図２に示されたように番号付けされる。構造内のノード数に関する上記例での２１２８などの上限は、実際には一般にこれよりもずっと少ないが、結果としてこの例では１２７などのリングレベル数の上限を生じさせる。前述の例を考えると、リングメンバシップの決定は、以下の様により一般的に説明することができる。挿入時に、各ノードは、ノードの「マスク」と呼ばれる１２７ランダムビットのシーケンスを生成する。高さｈでノードのリングメンバシップを決定するには、第１のｈビットがマスクから抽出され、当該ノードはそれらのビットによって示されるリングと接合する。あらゆるノードが高さ０の１つのリングと接合する。このスキームは依然として、高さｈにあるリングｒが、高さｈ＋１でリング２＊ｒおよび２＊ｒ＋１に区分されるという、所望の特性を備えていることに留意されたい。さらに、高さｈの各リング内で予測されるノード数はｎ／２ｈであり、従って、高さｈにあるポインタの予測長さは２ｈである。
【００３９】
ここで図４Ａを見ると、スキップネットを使用したオーバレイネットワークの他の例が示されている。この例では、ベースリング４００が「abc.com」ドメイン内のいくつかのノードを含む。これらのノードは、ローカルな辞書編集用名、Ａ、Ｂ、Ｃ、Ｆ、Ｇ、Ｔ、Ｖ、およびＺを有するノードを含む。図に示されるように、これらのノードの完全な辞書編集用名は、「ドメイン名／ローカル辞書編集用名」という形式に従って指定することができる。従って、ノードＡの完全な辞書編集用ノード名は、「abc.com/A」と指定することができる。
【００４０】
（ポインタテーブル）
次に図３を見ると、オーバレイネットワーク上のノード３００は、近接テーブル３１０およびルーティングテーブル３４０という２つのポインタテーブルを使用して、オーバレイネットワーク上にあるいくつかの他のノードを指すポインタを格納する。近接テーブル３１０は、名前スペースでの基本ルーティングテーブル３４０の最適化を表す。さらに、前述のように、数値スペースでのルーティングを最適化する近接テーブルも維持されることが好ましいことに留意されたい。一般に、オーバレイネットワークの一部である各ノードは、ポインタを格納するためにそれ独自のテーブルセットを持たなければならない。ルーティングテーブル３４０は、リングメンバシップと、ノード３００とリスト済み隣接ノードとの間の辞書編集用距離に基づいて、隣接ノードを指すポインタを格納する。最適化として、近接テーブル３１０は、ノード３００と隣接ノードとの間のネットワーク距離に基づいて、隣接ノードを指すポインタを格納する。名前スペースおよび／または数値スペースで近接テーブルを実施するための様々なスキームが可能である。（例えば、非特許文献１０参照）例えば、一実施形態では、各ノードがそのルーティングテーブルにある隣接ノードを使用して、辞書編集用識別子「インターバル」のセットを確立する。次に各ノードは、それらインターバルそれぞれに充填するために、ネットワーク近接に関して近傍ノードを見つける。
【００４１】
ルーティングテーブル３４０は、ｌｏｇ（ｎ）転送ステップで、メッセージの送達を可能にする。ただし、各ステップはネットワーク距離に関してはるかに遠いノードまで到達して終わる可能性がある。近接テーブル３１０ならびに数値スペース内の近接テーブルは、ネットワーク近接を考慮に入れたルーティング選択肢の代替セットを提供する。２つのタイプのテーブルは、ルーティングテーブルがｌｏｇ（ｎ）転送ホップ特性を維持するために近接テーブルを正しく構築する際に必要であるという点で、相互に関係する。
【００４２】
（識別子によるスキップネットの検索）
識別子によってスキップネットを検索する場合、検索はノード「ソース」から最も近いノードを識別するために一連の中間ノードを横切り、識別子「destID」まで進む。本発明の一実施形態では、各中間が、宛先に最も近いがそれを越えないポインタを使用して、メッセージ転送をルーティングする。
【００４３】
各ポインタは双方向であるため、検索方向に選択肢がある。destID<sourceIDの場合、検索は左に進むことが好ましい。これに対して、destID>sourceIDの場合、検索は右に進むことが好ましい。下記のアルゴリズム１は、右方向に検索するためのアルゴリズムに関する擬似コードを与えるものである。当分野の技術者であれば、左方向に検索する場合が対称形であることを理解されよう。このアルゴリズムは、currNode.RightFinger[]オペレーションがＲＰＣ呼出しであることを想定しているが、こうしたものは必須ではなく、「メッセージ通過」などの他のスキームが可能であり望ましい場合がある。
[Algorithm 1]
Node SearchRight( Node source, string destID, bit[] searchMask )
{
currNode = source
while( true ) {
h = 128
nextNode = currNode.RightFinger[h]
while(nextNode.ID>destID || nextNode.ID<currNode.ID ) {
if( h==0 ) {
return currNode;
}
h--;
nextNode = currNode.RightFinger[h]
}
currNode = nextNode
}
}
【００４４】
各中間ノードで、アルゴリズム１は宛先を越えて指示することのない最高位のポインタを見つけて、そのノードにメッセージを送信する。あらゆるポインタが宛先を越えて指示している場合、ローカルノードまたは中間隣接をメッセージの宛先としなければならない。これらの段階のランタイムについて、読者の便宜上、以下で論じる。
【００４５】
ノードＳで始まりノードＤで終わる検索オペレーションについて考えてみる。ここで、ＳからＤまでのリスト中の距離（すなわち、高さ０でのそれらの間のポインタ数）がｄである。この状況では、アルゴリズム１が遭遇する中間ノードの予測数は、およそｌｏｇ  ｄであることがわかる。これは、以下のことから理解できる。高さが増加していく検索中に達成される最高の高さがｈであると想定する。上記で述べたように、高さｈから高さ０までのソースノードを含むリングは、ノードに関するスキップリスト構造を含む。従って、アルゴリズム１によって実行される比較数は、長さｄのスキップリストに関する検索に使用される比較数と同じである。この数の予測値は、2*log d+1である。アルゴリズム１が遭遇する中間ノード数は、比較数によって制限されるため、スキップネット上での検索オペレーション中のネットワークホップの予測数は、≦2*log n+1である。
【００４６】
さらに続けると、識別子source.IDおよびdestIDの最も長い接頭部がｓであると想定すると、検索オペレーションは、接頭部内にとどまるように初期の検索方向が選択されると想定して、識別子が接頭部としてのｓを持たないノードとは通信しないことになる。具体的に言えば、例えば右方向検索アルゴリズムでは、currNodeが宛先より大きいかまたはソースより小さいノードに設定されることは決してない。従って、アルゴリズムは一般に、不変のsource.ID≦currNode.ID≦destIDを維持する。その結果、source.IDおよびdestIDの最も長い共通接頭部は、currNode.IDの接頭部でもあることになる。
【００４７】
（数値識別子によるスキップネットの検索）
スキップネットは、他のオーバレイネットワークと同じ分散ハッシュテーブル機能をサポートすることもできる。分散ハッシュテーブルが実施できるので、数値アドレススペースを使用してロードバランシングされたデータの格納および取出しを実行する。この項では、数値アドレススペースにおけるこれらアクティビティの性能について、具体的には関連する数値ｉｄを取得するためのノード名およびデータ名のハッシングについて説明する。オーバレイネットワークに文書を格納する場合、文書のファイル名が一方向ハッシュに入力される。このハッシュが、オーバレイネットワーク内のどこへファイルを格納するかを決定する際に使用できる、擬似ランダム広域一意識別子（ＧＵＩＤ）を生成する。ＧＵＩＤを使用することにより、格納されたファイルの場所が十分にランダムとなるはずであり、これによってロードバランシングが実施される。例えば、格納するファイルに「ShoppingList.doc」という名前が付けられた場合、ＧＵＩＤ（２進形式）は１０１０．．．で始まるかもしれない。どのノードがファイルを格納することになるかを決定するには、格納を開始するノード（例えばノードabc.com/A）がそのポインタテーブルからリング１の中で最も近いノードを検索する。図４Ａのオーバレイネットワークの例では、リング１の中で最も近いノードはノードabc.com/Bであってよい。次に、ノードabc.com/Bはそのポインタテーブルからリング１０で最も近いノードを検索する。この例では、これはノードabc.com/Bである。このプロセスは、要求が、リング１０１の中の唯一のノードであるノードabc.com/Tに達するまで続く。この時点で、ファイルはノードabc.com/Tに格納される。
【００４８】
文書を辞書編集スペースに格納することで、どのデータがどのノードで終わるかを自分で制御するようになることに留意されたい。ただしこれを実施しても、結果として確率的に均一のロードバランシングにはならないため、ＤＨＴは実施されない。すなわち、ノード名およびデータ名が均一に分散されないため、ある程度の量のデータの塊がノードで終わるが、これは一部の設計にとっては望ましい場合がある。
【００４９】
（制約付きロードバランシング）
前述のように、一部の実施では、オーバレイネットワーク上で特定のファイルが格納される場所を制限するので有利である場合がある。次に図４Ｂを見ると、複数のドメインに広がるオーバレイネットワークの一例が示されている。例えば、ＡＢＣ社が自社の「ShoppingList.doc」ファイルを、競合相手のＢＣＤ社のbcd.comドメインに属するマシン上に格納させたくない場合がある。ただし、上記で概説したＤＨＴプロセスに従うと、結果としてファイルがbcd.com/Tに格納されることになる（ここでも再度ハッシュ済みＧＵＩＤを１０１０．．．と想定する）。この問題には、制約付きロードバランシングと呼ばれるプロセスを使用して対処することができる。特定のファイルをどのドメインに制限するかを指定する場合、一部の実施では明示的ドメイン制限子（restrictor）を含むファイル名を提供することがある。例えば、ファイル名「ShoppingList.doc」を「abc.com?ShoppingList.doc」と指定することができる。この例で「？」の文字は、ファイルが前のドメインabc.comに属するノードにしか格納してはならないことを指定するものである。この制限を使用して、「abc.com?ShoppingList.doc」ファイルを格納するために割り当てられたノード（ＧＵＩＤを１０１０．．．と想定する）は、abc.com/Bとなり、これはabc.comドメインに属するリング１０１に最も近いノードである。ノードは、単一のドメイン名ではなく複数のネストされたドメイン名に関連付けられること、およびこうした複数のネストされたドメイン名が制約付きロードバランシングの場合と同じ方法でも使用できることを理解されよう。ドメイン部分を使用する検索が辞書編集検索であり、ファイル名部分のハッシュを使用する検索が、ドメイン部分を接頭部として共用する名前を有するノードに制約された数値検索であることに留意されたい。制約があろうとなかろうと、辞書編集検索と数値検索はどちらもＯ（ｌｏｇ  ｎ）オペレーションであるため、検索の全体効率もＯ（ｌｏｇ  ｎ）である。
【００５０】
（リング修復）
再度図４Ｂを参照すると、ノードabc.com/Cがオフラインになると、リング０中のノードaaa.com/Aおよびbcd.com/Aは、リング中の破損した接続を修理または「修復」するように構成される。一実施形態では、規模の大きいリング（この場合はリング４５０）に下がって、リング０中にある次の隣接ノードを探すことによって、これが実行できる。従って、ノードaaa.com/Aはリング０中の新しい隣接ノードがbcd.com/Aであることを見つけ、ノードbcd.com/Aはリング０中の新しい隣接ノードがabc.com/Aであることを見つけ、それによってリング０およびベースリング中の破損リンクを閉じる。
【００５１】
リングの修復プロセスは、すでに格納されたリーフポインタを使用することによって、リングを検索せずに実施することもできる。リーフポインタについては、以下で詳細に説明する（「リーフセット」と題する項を参照）。ほとんどの場合、高位レベルを修復することも望ましいが、このプロセスはそれほど重要ではなく、時間およびリソースが許すときに「ゆっくりと」実行してよいことに留意されたい。
【００５２】
（ノード挿入）
新しいノードが確率的スキップネットを使用してオーバレイネットワークに追加される場合、新しいノードは、その辞書編集名およびランダムな固有識別子に基づいて、ベースリング４５０および小規模リングに追加される。挿入オペレーションは、数値スペースでの検索と同様の方法を使用して、ランダム固有識別子の値によって決定された、新しいノードが接合しなければならない最も高位の空でないリングを見つけることから開始される。このリングが見つかると、挿入オペレーションは新しいノードの文字列識別子を検索することによって続行される。この検索プロセス中に、新しいノードは、そのルーティングテーブルがそれを指すポインタを含んでいなければならないすべてのノードを追跡する。検索が完了すると、新しいノードは新しいノードが指していなければならないノードへのポインタを作成し、それらのノードに対して新しいノードを指し返すように要求する。
【００５３】
検索に関して上記で述べた分析を使用すると、挿入オペレーションに必要なノードホップの予測数はｌｏｇ  ｎとなる。挿入オペレーション用の擬似コードを、下記のアルゴリズム２に示す。
[Algorithm 2]
Init (){
phase =upward
currentH    = 0
}
Insert (){
If (phase == upward) then
nextHop       = NextHopUp ()
else
nextHop       = NexHopDown ()
if      (phase        != complete) then
SendMessage (InsertMsg, nextHop)
}
Node NextHop (){
h     = LongestCommononPrefix (currNode, RandID, newNode, RandID);
if    (h > currentH) then
currentH       = h
ringStart      = currNode
nextHop      = currNode.ClockwiseFinger [h]
if    (ringStart    == nextHop) then
phase = downward
return NextHopDown ()
else
return nextHop
}
Node NextHopDowm (){
While (currentH > 0)
nextHop = currNode.ClockwiseFinger[currentH]
if (LliesBetweenClockwise (newNode.LexID, currNode.LexID,
nextHop.LexID)) then
InsertHere (newNode)
else
return nextHop
currentH        = current H - 1
endwhile
phase = complete
return null
}
【００５４】
一例として、例示されたオーバレイネットワークに新しいノードabc.com/Pが追加される場合、ノードabc.com/Fとbcd.com/Aの間のベースリング４５０に挿入されることになり、レベルｉで、ランダムｉｄのｉ番目の数字によってそれが接合するリングが決定される。
【００５５】
基本スキップネット構造内のノードに隣接するノードは、高さｈでのポインタの予測長さが実質上確実に２ｈとなるように、リングメンバシップのランダムな選択と、それらリング内での識別子の順序付けによって決められる。従って、ネットワーク近接に関して、ノードとそれに隣接するノードが近くにあるかどうかはまったく保証されない。スキップネットは、この点でChordと同様である。これに対してPastryは、ネットワーク近接をそのルーティングテーブルエントリの選択に組み込むように、特に設計される。新しいPastryノードは、近接ノードに接触し、新しいノードのルーティングテーブルを構築するためにそのルーティングテーブルエントリを活用することによって、リングに接合する。
【００５６】
ネットワーク近接がスキップネットのリングメンバシップの決定に組み込まれた場合、高さｈでのポインタの予測長さが依然として確実に２ｈとなるようにすることは困難である。この問題に対処するために、前述のようにスキップネット内の各ノードで、近接テーブルと呼ばれる追加のルーティングテーブルを維持することができる。近接テーブルは、ルーティングテーブルと同様に、左と右の両方のフィンガを有する。
【００５７】
スキップネットがネットワーク近接を組み込む場合、挿入オペレーションは基本段階と近接段階という２つの段階を有するように修正される。基本段階とは、上述のような単なる挿入オペレーションである。近接段階とは、近接的に（proximity-wise）新しいノードに近い既存のノードＪからのブートストラッピングを含む点で、Pastry接合オペレーションと同様である。より具体的に言えば、近接段階は、第１に、Pastryが一定の接頭部で始まるルーティングテーブルエントリを使用するのとある程度類似した、近接テーブル内の各エントリに関する上限および下限を決定するためにルーティングテーブルを使用することを含む。スキップネットの場合、識別子スペースは必ずしも均一に配置されないため、エントリが特定の接頭部で始まるように要求しても、エントリが識別子スペース内に適切に分散されることを保証するのには十分でない。次に、新しいノードは、可能であればその近接テーブルの任意のエントリに充填するために、本明細書ではノードＪと呼ばれるもう１つのノードで近接テーブルを使用することができる。その後、新しいノードは、可能であれば任意の残りの近接テーブルエントリに充填するために、ノードＪの一定の隣接ノードで近接テーブルを使用する。下記のアルゴリズム３は、左近接テーブルを対称になるように構築するためのコードを備えた、右近接テーブルを構築するための擬似コードを示したものである。読者の便宜上、この単純化されたアルゴリズムの完全なバージョンが、以下の詳細な説明の付録に含まれる技術レポートに示されている。
【００５８】
[Algorithm 3]
BuildRightPTable (Node newNode, Node J) {
// Compute bounds for each entry in the P table
for( h=127; newNode.RightFingers[h]==null; h-- ) { }
maxH = h;
while( h>0 ) {
newNode.upperBound[h] = newNode.RightFingers[h].ID;
newNode.lowerBound[h] = newNode.RightFingers[h-1].ID;
if( newNode.upperBound[h]==newNode.lowerBound[h] ) {
newNode.RightP[h] = newNode. RightFingers[h];
}
h--;
}
currNode = J;
while( true ) {
FillEntries( newNode, currNode );
// Find the highest empty entry in the right P table
for( h=maxH; h>0; h-- ) {
if( newNode.RightP[h]==null ) break;
}
if (h==0) break;
// Search for any node that fits newNode's bounds at height h
if( currNode.ID < newNode.lowerBound[h] ) {
Let nextNode = the closest node in currNode's P Table to
the left of newNode.upperBound[h]
Set currNode = nextNode
} else {
Let nextNode = the closest node in currNode's P Table to
the right of newNode.lowerBound[h]
Set currNode = nextNode
}
}
newNode.RightP[0] = newNode.RightFinger[0];
}
FillEntries( Node newNode, Node J ) {
TryInsertOne( newNode, J );
for( i=0; i<128; i++ ) {
if( J.LeftP[i]!=null ) TryInsertOne ( newNode, J.LeftP[i] ) ;
if( J.RightP[i]!=null ) TryInsertone ( newNode, J.RightP[i] );
}
}
TryInsertOne( Node newNode, Node n ) {
for( i=0; i<128; i++ ) {
if( newNode.RightP[i]!=null ) continue;
if( FitBounds(newNode, i, n.ID) ) {
newNode.RightP[i] = n;
}
}
}
bool FitBounds( Node newNode, int h, bit[] ID ) {
if( newNode.lowerBound[h]<ID && ID<=newNode.upperBound[h] )
return true;
if( newNode.upperBound[h]<newNode.lowerBound[h]
&& (newNode.lowerBound[h]<ID || ID<=newNode.upperBound[h])
)
return true;
}
【００５９】
これからわかるように、BuildRightPTable()では、外側の「while(true)」ループが繰り返されるたびに、より多くのテーブルのエントリに充填しようと試みる。高さｈのエントリに充填する場合、プロセスは予測サイズ２ｈ−１の範囲内で任意のノードを探す。プロセスが検索するこの範囲とノードとの間の予測距離は２ｈである。この検索を完了するためのネットワークホップの予測数は２であるため、ネットワークホップの合計予測数は２＊ｌｏｇ（ｎ）である。
【００６０】
（リーフセット）
リーフセットは、システムの耐障害性を向上させるために使用することができる。例えば、各ノードのアドレステーブルはｋ個の隣接ノードのアドレスを（辞書編集用順序で）格納することが可能であり、ここでｋは正の整数（例えば８）である。ｋ個の最も近い隣接ノードのアドレスを（辞書編集的に）格納することによって、１つの隣接ノードが障害（例えばオフラインになる）を経験すると、複数の隣接ノードはリンクを閉じるのに必要な情報を得ることになる。これらのリーフセットは、実施に応じて、近接テーブルなどの他のテーブルの一部であるか、または近接テーブルに加えて格納することができる。一部の実施形態では、追加のポインタ記憶域が使用可能な場合は、選択されたポインタのみ（例えばスキップ０、スキップ１、スキップ２、スキップ４、スキップ８、スキップ１６、スキップ３２、以下参照）を格納する代わりに、選択されたポインタに隣接する追加のポインタ（例えば、スキップ０、スキップ１、スキップ２、スキップ４、スキップ７、スキップ８、スキップ９、スキップ１５、スキップ１６、スキップ１７、スキップ３１、スキップ３２、スキップ３３、以下参照）も格納することができる。格納されたノードまたはスキップされたノードのパターンの他の組合せが可能であり、企図される。
【００６１】
（ドメイン接続障害）
ネットワークに関する一般的な障害モードの１つが、特定のドメインがＷＡＮ（例えばインターネット）から切断されることである。これは、ドメインの拠点サーバ、ファイアウォール、またはルータの障害に起因する場合がある。ドメインがオフラインになった場合、ドメイン内のものにとって引き続き相互に通信できることが有利である。図４Ｂに示されたスキップネットの例を参照し、abc.comのインターネットルータに障害が発生したと想定する。スキップネットが双方向である（すなわち、左の隣接および右の隣接の両方を指すポインタを維持する）場合、ルーティングアルゴリズムは、abc.comドメイン内の任意のノードがabc.comドメイン内の任意の他のノードに首尾よくルーティングできることを保証する。すなわち、一般に、切断された組織のノード名がいくつかの組織の接頭部のうちの１つを使用している場合、スキップネットの関連する部分は、接合していない（disjoint）が内的には適切に接続された、いくつかのセグメントに区分されることになる。スキップネットのルーティング局所性により、各セグメント内のメッセージトラフィックは、切断による影響を受けることなく、Ｏ（ｌｏｇ  ｎ）の効率で引き続きルーティングされることになる。
【００６２】
組織の切断がオーバレイ全体の相当な部分を表すものでない限り、クロスセグメント間のほとんどのクロスセグメントポインタは有効なままとなるので、スキップネットの他の部分の間でのクロスセグメントトラフィックもそれほど影響を受けることがない。これは、切断された組織のセグメントのケースではない場合があるので、切断および再接続後の主な修復タスクは、オーバレイセグメントをマージすることである。具体的に言えば、切断の場合、セグメントが２つ（またはそれ以上）の接合していないスキップネットにマージされ、再接続の場合、２つのセグメント（またはそれ以上）の接合していないスキップネットが単一のスキップネットにマージされる。
【００６３】
どちらの場合も第１のステップは発見である。組織が切断されると、そのセグメントはスキップネットポインタを使用するだけでは互いを見つけられない場合がある。これは、連続していないセグメントが互いを指すポインタを有することになるという保証がないからである。この問題は、組織が一般にそのノードを相対的に数の少ない名前セグメントに分けることを想定し、各セグメント内のいくつかのノードを「周知」と指定するように要求することによって解決できる。組織内の各ノードは、これら周知ノードのリストを維持し、これらを様々なオーバレイセグメント間の接触ポイントとして使用する。
【００６４】
組織が再接続すると、組織およびグローバルスキップネットは、そのセグメントエッジノードを介して互いを発見する。前述のように、各ノードは、レベル０リング中でそれ自体の両側にある、８つの最も近いノード（または他の数の最も近いノード）を指す「リーフセット」を維持する。ノードは、そのリーフセットの一方の側は完全に到達不能であるが他方の側はそうでないことを発見すると、切断イベントが発生し、それがセグメントのエッジノードであると結論付ける場合がある。これらのエッジノードはそれらの到達不能なリーフセットポインタを追跡し、到達可能性のためにそれらを定期的にｐｉｎｇして、ポインタが到達可能になると、ノードがマージプロセスを開始する。例えば、新しい組織がシステムに接合する場合、２つの以前独立していたスキップネットを一緒にマージすることは、異なる発見メカニズムが使用できることを除いて、以前接続されていたものを再接続することと機能的に等価であることに留意されたい。
【００６５】
セグメントのマージプロセスは、レベル０リングを含むポインタの修復と、すべてのより高位のリングに関するポインタの修復という、２つのステップに分けられる。第１のステップは、各セグメントの「エッジ」ノードのレベル０ポインタの修復のみを含んでいるため、即時に実行可能である。第１のステップが実行されると、様々なセグメント内のノード間でメッセージを正しくルーティングすること、およびＯ（ｌｏｇ  ｎ）効率でそのように実行することが可能なはずである。その結果、第２の、より費用のかかるステップを背景タスクとして実行することができる。
【００６６】
レベル０でスキップネットセグメントを接続するための主なタスクは、１セグメント内のノードに、他のセグメント内のノードのＩＤに向けてメッセージをルーティングさせることによって、関連するエッジノードを発見することである。このメッセージは、他のノードのＩＤに最も近い第１のセグメント内のエッジノードにルーティングされることになる。この方法でルーティングされたメッセージは、すべてのセグメントのエッジノードのリストをひとまとめにする際に使用することができる。その後、実際のセグメント間ポインタ更新は、分散２相コミットを使用して、セグメントエッジノード間の単一の自動オペレーションとして実行される。これにより、ルーティングの不一致を回避する。
【００６７】
レベル０リング接続の直後、クロスセグメント宛先に送信されたメッセージは、一定係数での劣化にもかかわらず、Ｏ（ｌｏｇ  ｎ）効率でルーティングされることになる。この係数は、切断を修復中であるか再接続を実行中であるかに応じて異なる。切断の場合、レベル０以外のクロスセグメントポインタは、たとえあったとしてもわずかとなる。従って、クロスセグメントメッセージは、Ｏ（ｌｏｇ  ｎ）ホップで、トラバースする各セグメントのエッジにルーティングされ、セグメントを接続しているレベル０ポインタを使用して、次のセグメントへホップすることになる。従って、切断された組織がＳセグメントを含む場合、クロスセグメントトラフィックは、レベル０リング接続後Ｏ（Ｓ  ｌｏｇ  ｎ）効率でルーティングされることになる。
【００６８】
組織が、その完全に修復されたスキップネットをレベル０でグローバルなスキップネットに再接続する場合、外部ノード宛のトラフィックは、Ｏ（ｌｏｇ  ｎ）ホップで、組織のスキップネットのエッジノードにルーティングされることになる。２つのスキップネットを接続しているレベル０ポインタはトラバースされ、その後、Ｏ（ｌｏｇ  ｎ）ホップは、グローバルスキップネット内のトラフィックをルーティングする必要が生じる。２つのスキップネット間を横切る必要のないトラフィックには、このルーティングペナルティは発生しない。
【００６９】
レベル０リング接続段階が完了すると、修復が必要なすべての残りのポインタは、背景タスクを使用して更新することができる。本発明の一実施形態では、ポインタは、各セグメントで所望のノードを見つけるために、下のレベルの正しいポインタを使用して１つのレベルで繰り返し修復される。１つのレベルのポインタは、高位レベルの修復が開始される前に、すべてのセグメント境界をまたがって修復されるべきである。高位レベルのリングは下位レベルのリング内にネストされるため、レベルｈ＋１でのリング修復は、レベルｈでの囲みリング（enclosing rung）用にそのポインタを修復したノードのうちの１つによって開始することができる。レベルｈリングが（ａ）単一のメンバしか含んでいない場合、または（ｂ）修復が必要なセグメント間ポインタを持たない場合、レベルｈ＋１での修復オペレーションは必要ない。後者の終了状態は、グローバルスキップネット内のほとんどのリング、すなわちほとんどのノードが、修復の可能性について検査される必要がなくなることを暗に示している。
【００７０】
この修復アルゴリズムに関係する作業の合計はＯ（Ｍ  ｌｏｇ（ｎ／Ｍ））となり、ここでＭは、組織の切断または再接続のサイズである。レベルｈ＋１でのリングは、レベルｈでのその囲みリングがすべてのセグメント境界を横切って修復されると、平行して修復可能であるため、すべてのリングの修復を完了するのに必要な時間はＯ（Ｓ  ｌｏｇ  ｎ）となり、ここでＳはセグメントの数である。
【００７１】
（同時更新および予期せぬ障害）
同時更新および予期せぬノード障害は、前述のように一定のスキップネット特性に破損を生じさせる場合がある。これに関するいくつかの潜在的な問題についての考察、それらを検出するためのプローブ、およびそれらを解決するための修正アクションを、下記に示す。
【００７２】
（問題）
１．予期せぬ障害は、一定の高さで有効な隣接ノードを持たないノードを作成する可能性がある。これは、以下で論じるプローブ１によって検出可能である。
【００７３】
２．予期せぬ障害は、あるノードに、実際に別のノードが依然として生きているときに、当該ノードが死んでいることを反映させる可能性がある。例えば、ノードＮは、ノードＭが死んでいないときにノードＭが死んでいることを反映する可能性がある。その後Ｎは、ノードＭの代わりに新しい隣接ノードになるものとしてＬを選択する可能性がある。プローブ１はこの状況を検出することができる。
【００７４】
３．同時ノード接合は、リング内に誤った順序付けを発生させる（おそらく接合中に一時的のみ）可能性がある。問題が高さ０で発生すると、検索が誤った結果を戻す可能性がある。問題が高さ＞０で発生すると、検索は効率的でなくなる。この状況は、以下で論じるプローブ２および３によって部分的に検出することができる。
【００７５】
４．厳密なネットワーク区分の場合、２つの区画が識別されると、それらは可能であれば最接合されるはずである。区画が連続していると想定すれば、エンドポイントで高さ０のポインタを修復し、定期的なリング修正によって他のすべてのポインタを修復できるようにするだけで、最接合が可能である。
【００７６】
（プローブ（各プローブは各高さｈについて定期的に実行される））
１．プロービングノードは、高さｈでその左および右の隣接ノードに定期的に接触する。接触されたノードが死んでいる場合、以下で論じる修正１が使用されるはずである。隣接ノードが、プロービングノードをその隣接ノードであると認識しない場合、以下で論じる修正２が使用されるはずである。
【００７７】
２．プロービングノードは、両方向で次のｋ個の隣接ノードを検証し、それ自体に遭遇することなくそれ自体を通り越して移動していないかどうかをチェックする。その目的は、ループの長さが＜ｋである複数のループを備えたリングを検出することである。
【００７８】
３．プロービングノードは、高さｈのその隣接ノードが、高さｈでのリングのメンバの可能性がある、高さｈ−１でのリング内で最も近いノードであることをチェックする。これが成り立たない場合、以下で論じる修正３が使用されるはずである。
【００７９】
（修正）
１．ｈ＝０の場合、障害が発生したノードをスキップするために高さ＞０のポインタが使用され、その後、最も近い生きたノードを見つけるためにスキップバックする際に、ポインタが逆方向で使用される。ｈ＞０の場合、高さ＜ｈのポインタを使用して、リングｈのメンバである可能性のある最も近い生きたノードを見つけるためにスキップする。
【００８０】
２．プロービングノードの隣接ノードから始まり、レベルｈのそのポインタからプロービングノードへと続く。プロービングノードを通過する前に最後に遭遇したノードが、プロービングノードの新しい隣接ノードである。ポインタが新しい隣接ノードを指すように設定し、そのポインタがプロービングノードを指すように設定する。
【００８１】
３．新しい隣接ノードを適切なノードに設定し、新しい隣接ノードに対してプローブ３を即時に実行するように通知する。
【００８２】
（仮想ノード）
Ｗｅｂホスティングなどのいくつかのアプリケーションでは、単一の物理サーバ上で複数のドメインをホストすることが有利な場合がある。従って、２つまたはそれ以上のノードが単一の物理ネットワークノードに関連付けられる場合がある。この仮想ノード構成は、Ｗｅｂホスティングサービスをそれらのクライアントに提供しているＩＳＰ（インターネットサービスプロバイダ）にとって、特に有利な場合がある。各仮想ドメインに関連付けられたオーバヘッドの量を減らすために、アドレステーブルを共用するように仮想ノードを構成することができる。
【００８３】
次に図５を見ると、３つのノードが単一の物理アドレスに関連付けられた、オーバレイネットワークの一例が示されている。この例では、ノードbbb.com、ddd.com、およびzzz.comがすべて単一の物理位置６００上でホストされている。
【００８４】
次に図６を見ると、単一の物理コンピュータ上で仮想ノードを効率良く処理するための方法の一例が示されている。この例では、１つの物理コンピュータ６００が３つの仮想ノード５００、５０４、および５１６をホストしている。ただし、コンピュータ６００は、各仮想ノードについてアドレスポインタテーブル全体を格納する代わりに、完全ルーティングテーブル６１２および他の仮想ノードに関する部分ルーティングテーブルのみを格納する。仮想ノードに関するルーティングテーブルのサイズは、これらの部分ルーティングテーブル中の平均ノード数が一定になるように、（幾何分布を使用して）確率的に選択することができる。典型的な構成は、部分ルーティングテーブルにつき平均２つのポインタを有するものであってよい。図に示されるように、この実施形態では、アドレスポインタテーブルは、（ｉ）ノード６０２が属する各リングについて隣接ノードを指すｌｏｇ（ｎ）ポインタ６１２のセット、（ｉｉ）他のすべての仮想ノードに関する部分ルーティングテーブル６１４のセット、および（ｉｉｉ）リーフノードポインタ６１６のセットを含む。
【００８５】
従って、ノード５００、５０４、および５１６それぞれが、ノード５００の近接テーブルを使用してルーティングし、これはコンピュータ６００のネットワーク位置に基づくことができる。ノードはそれぞれ、耐障害性についてそれ独自のそれぞれのリーフポインタセットを使用することができる。これは、近接テーブルが、コンピュータ６００上に常駐する各ノードについて同じであるコンピュータ６００のネットワーク位置に基づいていることから動作する。これに対して、リーフポインタはノードの辞書編集用ドメイン名に基づいている。
【００８６】
この実施形態によってもたらされるオーバヘッド記憶域の節約は、仮想ノード数が多い場合に劇的となる可能性がある。例えば、１００ノードについてフルセットのポインタを格納すると、結果的におよそ100*log(n)+100*Lポインタとなり、ここでＮはオーバレイネットワーク内のノード数、Ｌは各ノードのリーフノードポインタ数である。これに対して、物理コンピュータあたりフルセットポインタを１つだけ格納することにより、格納されるポインタの数はおよそlog(n)+100*(L+2)まで減ることになり、およそ99*(log(n)-2)ポインタの節約となる。多くのＷｅｂホスティングサービスが単一サーバ上で多数のＷｅｂサイトを運営しているため、一部の実施ではこうした節約が重要となる可能性がある。もちろん、フィンガ分散の変更は、検索パスに影響を与える。検索パス上でのノードホップの予測数は、<=4*log4(d)+1の、p=1/4のスキップリスト中での検索の予測費用に等しい。従って合計検索費用は、4*log4(d)=2*log2(d)となり、これは基本スキップネットでの検索費用に等しい。
【００８７】
（変形）
前述の基本スキップネット構造に関して可能ないくつかの変形がある。以下に、こうした変形のいくつかについてより詳細に説明するが、以下の考察は網羅的なリストを提供することを意図するものではない。本発明の一実施形態では、ノードは、それが属する各リング上で直後の後続者（immediate successor）（および直前者（predecessor））を示すポインタを維持する。その結果、ノードがいくつかのリング上で同じ後続者を示し、重複ポインタを維持することが可能となる。この実施形態では、各ノードがこれらの冗長性を検出し、重複ではない第１の後続者を示す重複ポインタを再使用する。これらのポインタは潜在的にスキップネットの精密な構造を変えることが可能であるため、これらのポインタ再調整はノードに対して透過ではなく、代わりにノードは、ノードの挿入および／または除去用ではなく検索用に再調整されたポインタのみを使用することになるのが好ましい。重複ポインタの再調整は、ノード挿入中に実行することができる。
【００８８】
具体的に言えば、前述の擬似コードで示したように、ノードはスキップネットリングを、任意の他のノードと共用していない最も独占的なリングから、残りのすべてのノードと共用している最も包含的なリングまで、上から下へと接合する。従って、本実施形態により、新参者（newcomer）がリングに接合する場合、その新しい隣接が１つ上のレベルのリングでの隣接と重複しているかどうかをチェックする。新しい隣接が１つ上のレベルのリングでの隣接と重複している場合、ノードはこのポインタを重複ポインタとしてマークし、その隣接に対して、その隣接中からの「非重複」ポインタの検索を開始するように要求する。このプロセスは、重複しない隣接が見つかるまで拡大することができる。こうした非重複がいったん見つかると、新参者は非重複ポインタにリンクするようにその重複ポインタを再調整する。
【００８９】
さらに、時には、１つまたは複数のノードのフィンガ数を増加させることが望ましい場合がある。例えば、ランダムＩＤを生成するのに使用されるランダム数生成器の分散を調整することによって、１つのノードを基準にしてポインタ数を調整することができる。あるいは、ランダムビット（すなわち０または１）を生成する代わりに、［０，．．．，ｋ］の範囲内でランダム整数を生成することが可能であり、ここでｋは正の整数である。一般に、ｋの値が大きいと格納されるフィンガは少なく、従ってルーティングテーブルも小規模であることを意味する。ただし、この一方の影響は、ルーティングの効率が悪いことである。しかしながら、前述のように、各レベルで追加のポインタを追加し、ルーティングテーブルのサイズを大きくする費用で、ルーティング効率を取り戻すこともできる。以下に示すアルゴリズム４を使用して、追加のフィンガを追加することができる。
【００９０】
[Algorithm 4]
for i=log(n) downto 1
if( i==log(n) ) stop = me
else stop = Fingers[i+1]
while n < stop
AddToList( AdditionalFingers[i], n )
n = n.Fingers [i]
end
end
【００９１】
以上で、効率的な分散データ構造を備えた改良型オーバレイネットワークを作成および維持するための、新しい有用なシステムおよび方法が提供されたことがわかる。本発明の原理が適用できる多くの可能な実施形態に鑑みて、図に関して本明細書に記載したような実施形態は、例示的なものを意味しているに過ぎず、本発明の範囲を制限するものとみなすべきでないことを理解されたい。例えば、当分野の技術者であれば、ソフトウェアで示された例示的実施形態の要素がハードウェアで実施可能であり、またその逆も可能であること、および例示的実施形態が、本発明の精神を逸脱することなく配置構成および細部において修正可能であることを理解されよう。従って本明細書に記載された本発明は、すべて、添付の特許請求の範囲およびその等価物の範囲内に入れることのできる実施形態を企図するものである。本明細書に記載されたすべての参照文献、特許、出版物、および他の印刷物は、例外または除外なしにその中のすべての教示について、全体として参照により組み込まれたものである。
【００９２】
（詳細な説明の付録）
以下の技術レポートは、本発明の実施形態およびその実施に関する追加の考察を提供するために、本明細書に含まれるものである。技術レポートに示された各参照は、例外なしにその中のすべての教示に関して全体として参照により組み込まれている。以下に示される参照番号は、本項の末尾に掲載された参照番号を表すものであることに留意されたい。
【００９３】
要約：近年、大規模なピアツーピアシステムを構築するためのフレキシブルなインフラストラクチャとして、Chord、Pastry、およびTapestryなどのスケーラブルオーバレイネットワークが出現してきた。実際には、こうしたシステムには、データがどこに格納されるかを管理せず、可能であれば必ずルーティングパスを管理ドメイン内に維持するという保証がない、という２つの欠点がある。SkipNetとは、データを主として文字列名によって編成することにより、管理されたデータの配置および保証されたルーティング局所性を提供する、スケーラブルオーバレイのことである。SkipNetは、データの配置に関して、きめ細かい管理ときめの粗い管理の両方を可能にするものであって、コンテンツは所定のノード上に配置するか、または階層状に命名されたサブツリーのノードを横切って均一の分散させることができる。SkipNetの局所特性の追加の役立つ重要な点は、組織全体が残りのシステムから切断されるという区分障害により、結果的に２つが接合していないが適切に接続されたオーバレイネットワークを生じさせることができることである。さらにSkipNetは、区分が解決したときに、これらの接合していないネットワークを効率よく再マージすることができる。
【００９４】
１  概説
近年、大規模なピアツーピアシステムを構築するためのフレキシブルなインフラストラクチャとして、Chord［３０］、ＣＡＮ［２５］、Pastry［２７］、およびTapestry［３６］などのスケーラブルオーバレイネットワークが出現してきた。これらのネットワークが実行できる主要な機能が分散ハッシュテーブル（ＤＨＴ）であり、これは、ピアツーピアシステム内のすべての参加者にわたってデータを均一に拡散できるものである。
【００９５】
ＤＨＴは、見事なロードバランシング特性を提供するが、これはデータが格納される場所の管理を犠牲にした上で行われている。これには、データがユーザからかなり遠くに格納される場合があること、およびデータが属する管理ドメインの外に格納される可能性があることという、少なくとも２つの欠点がある。本書では、SkipNet、すなわちピアツーピアシステムの目的に合致するように適合および拡張された、スキップリストの分散一般化（generalization）［２３］について紹介する。SkipNetとは、従来のオーバレイ機能をサポートし、コンテンツ局所性およびパス局所性と呼ばれる２つの局所特性を有する、スケーラブルオーバレイネットワークのことである。
【００９６】
コンテンツ局所性とは、データを特定のオーバレイノード上に明示的に配置するか、または所与の組織内のノードを横切って分散させることのできる機能のことである。パス局所性とは、同じ組織内の２つのオーバレイノード間でのメッセージトラフィックが、その組織内でのみルーティングされることを保証する機能のことである。
【００９７】
コンテンツ局所性およびパス局所性は、改善された可用性、性能、管理容易性、およびセキュリティを含む、データの取出しに関するいくつかの利点を提供する。例えば、ノードは重要なデータを自分の組織内に格納することが可能であり（コンテンツ局所性）、ノードは、たとえ組織がインターネットの残りの部分から切断されている場合であっても、オーバレイネットワークを介して自分のデータに到達することができる（パス局所性）。データを使用するクライアントの近くにデータを格納することで、性能の恩恵が得られる。コンテンツを特定のオーバレイノード上に配置することで、そのノードの提供によって要求を反映させることができる。コンテンツの配置は、重要なデータを格納しているマシンの保守スケジューリングなどの問題を管理することも可能となり、その結果管理容易性が向上する。
【００９８】
コンテンツ局所性は、ＤＨＴで使用できないセキュリティ保証を提供する。多くの組織は、組織外のノードよりも組織内のノードを信頼する。たとえ暗号化およびデジタル署名化されていても、組織外の任意オーバレイノード上に格納されたデータは、サービス不能（ＤｏＳ）攻撃ならびにトラフィック分析の影響を受けやすい。ＤｏＳ攻撃に対するＤＨＴの弾力性を改善するための他の技法は存在するが［３］、コンテンツ局所性は単純かつオーバヘッドのない技法である。
【００９９】
コンテンツ局所性がいったん達成されると、必然的に望まれる第２の特性はパス局所性である。いくつかのオーバレイ設計［４］は、おそらくほとんどの時間、メッセージのルーティングを組織内で維持するが、パス局所性を保証するものは何もない。例えば、こうした保証なしに、explorer.ford.comからmustang.ford.comへのルートが、camaro.gm.comを介して渡される可能性があり、これはford.comの人々が避けたいであろうシナリオである。パス局所性を備えていれば、自分の組織内のデータを要求するノードは、決して組織を離れることのないパスをトラバースする。この例は、たとえノード上に何のコンテンツも配置されないシナリオでも、パス局所性が望ましいことを示すものでもある。
【０１００】
コンテンツの配置を管理することは、自動的にシステムを横切ってデータを均一に分散させるというＤＨＴの目的と直接の緊張関係にある。これら２つの概念を組み合わせる一般化が制約付きロードバランシングであり、ここでは、データは、単一組織内のすべてのノード、所与の建物内に常駐するすべてのノード、または１つまたは複数のデータセンタ内に常駐するすべてのノードなどの、システム内のノードの明確なサブセットを横切って均一に分散される。
【０１０１】
SkipNetは、スキップリストの分散一般化［２３］である、スケーラブルピアツーピアオーバレイネットワークである。これは、オーバレイノード間での効率的なメッセージルーティング、コンテンツ配置、パス局所性、および制約付きロードバランシングをサポートするものである。これは、文字列名IDspaceならびに数値IDspaceという、２つの別々な、しかし関係するアドレススペースを使用することで実施される。ノード名およびコンテンツ識別子文字列は、名前IDspaceに直接マッピングされ、ノード名のハッシュおよびコンテンツ識別子は、数値IDspaceにマッピングされる。各オーバレイノード上の単一セットのルーティングポインタは、いずれかのアドレススペースでの効率的なルーティングを可能にし、両方のアドレススペースでのルーティングの組合せは、制約付きロードバランシングを実行する機能を提供する。
【０１０２】
SkipNetの局所特性の役立つ重要性は、一般的なインターネット障害に対する弾力性である。SkipNetは、ノードをその名前IDorderingに従ってクラスタ化するため、単一の組織内の名前は、組織を残りのインターネットから切断する障害を乗り越える。さらに、組織のSkipNetセグメントは、接続性が復元されたときに、外部SkipNetと効率よく再マージすることができる。相関していない独立した障害の場合、SkipNetは前のオーバレイネットワークと同じ弾力性を有する［３０］。
【０１０３】
本書の以下の部分は、次のように編成されている。第２項は関連作業について、第３項はSkipNetの基本設計について、第４項はSkipNetの局所特性について、第５項は基本設計の拡張機能について、第６項はリングマージアルゴリズムについて、第７項はSkipNetの代替設計について、第８項はSkipNetの理論的分析について、第９項は実験に基づく評価について、第１０項は本書の結論について記載する。
【０１０４】
２  関連作業
近年、ＣＡＮ［２５］、Chord［３０］、Freenet［６］、Gnutella［１１］、Kademlia［２０］、Pastry［２７］、Tapestry［３６］、およびViceroy［１９］などの、多くのピアツーピアオーバレイネットワーク設計が提案されてきた。SkipNetは、既存のピアツーピアオーバレイネットワークと同じ機能を提供し、さらにコンテンツ配置に関する明示的な管理を介して改善されたコンテンツ可用性も提供するように設計されている。
【０１０５】
ＣＡＮ、Chord、Pastry、およびTapestryなどのシステムの主要な特徴は、各ノードでスケーラブルな量のルーティング状態を維持しながら、スケーラブルなルーティングパスを提供することである。スケーラブルなルーティングパスにより、任意の２つの通信中のノード間でのホップ転送の予測数が、システム内の合計ノード数を基準にすると少ないことを意味する。Chord、Pastry、およびTapestryはｌｏｇ  Ｎで基準化（scale）し、ここでＮはシステムサイズであって、各オーバレイノードでｌｏｇ  Ｎルーティング状態を維持する。ＣＡＮはＤ−Ｎ１／Ｄで基準化し、ここでＤは典型的な値６の次元係数であって、Ｄに比例してノードあたりのルーティング状態量を維持する。
【０１０６】
これらシステムの第２の主要な特徴は、任意の既存ノードのアドレスに等しくない宛先アドレスにルーティングできることである。各メッセージは、アドレスがメッセージの宛先フィールドに指定されたものに「最も近い」ノードにルーティングされ、指定された宛先に最も近いノードにルーティングすることを意味する場合に、「ルート」および「検索」という用語を区別なく使用する。この特徴は、コンテンツが、そのノードＩＤが耐衝突性のハッシュ関数をそのコンテンツ名に適用した結果に最も近い（すなわち整合的ハッシング［１５］）オーバレイノードに格納される、分散ハッシュテーブル（ＤＨＴ）［１２］の実施を可能にする。
【０１０７】
分散ハッシュテーブルは、例えばＰＡＳＴ［２８］およびＣＦＳ［８］分散ファイルシステム、Overlook［３３］スケーラブル名前サービス、Squirrel［１３］協働Ｗｅｂキャッシュ、およびスケーラブルアプリケーションレベルマルチキャスト［５、２９、２６］を構築する際に使用されてきた。これらシステムのすべてではない場合、そのほとんどで、それらが設計されたオーバレイネットワークを簡単にSkipNetに置き換えることができる。
【０１０８】
SkipNetには、目的がＤＨＴの実施であるChordおよびPastryなどの既存のオーバレイネットワークとは基本的な哲学上の違いがある。ChordおよびPastryのようなシステムの基本哲学は、均一の、ロードバランシングされた、ピアツーピアの挙動を得るために、オーバレイ全体にランダムにコンテンツを拡散させることである。SkipNetの基本哲学は、システムが、参加ノードの制約付きサブセットにわたってロードバランシングを可能にしながらも、有用なコンテンツ局所性およびパス局所性を保持できることである。
【０１０９】
本書は、ピアツーピアシステムで局所特性が重要であることに初めて気付いたものではない。Keleher等［１６］は、ＤＨＴが局所性を破壊すること、および局所性は重要なことであるという、２つの主要点を重視している。Vahdat等［３４］も局所性の問題を提起している。SkipNetはこの問題に直接対処している。オーバレイ中でのノードの順序付けにハッシュ済み識別子ではなく名前を使用することによって、オブジェクトの名前に基づいた自然な局所性が保たれる。さらに、コンテンツを分散させるのではなく名前順に配置することによって、SkipNetでの名前の領域に関するオペレーションが可能である。
【０１１０】
３  基本的なSkipNet構造
この項では、SkipNetの基本設計について紹介する。SkipNetでルーティングする方法およびSkipNetと接合しこれを離れる方法を含む、SkipNetアーキテクチャを示す。
【０１１１】
３．１  スキップリストとの類比
第１にPugh［２３］に記載されたスキップリストは、典型的にはメモリ内に格納された辞書データ構造である。スキップリストとは、一部のノードが多くのリスト要素をスキップするポインタによって補完された、分類されたリンク済みリストである。「完全」スキップリストとは、ｉ番目のノードの高さがｉを分ける２の最大累乗の指数であるものである。図７ａは、完全スキップリストを示す図である。レベルｈのポインタの長さが２ｈである（すなわちリスト内で２ｈノードをトラバースする）ことに留意されたい。完全スキップリストは、Ｏ（ｌｏｇ  Ｎ）時間の検索をサポートする。
【０１１２】
完全スキップリストで挿入および削除を実行することは法外な費用がかかるため、Ｐｕｇｈは、高い確率でＯ（ｌｏｇ  Ｎ）検索を維持しながら、ノード高さを決定するための確率的スキームを提案している。簡潔に言えば、各ノードは、高さｈを選択する確率が１／２ｈとなるように高さを選択する。従って、確率１／２でノードの高さは１、確率１／４では高さ２となる。図７ｂは、確率的スキップリストを示す。
【０１１３】
スキップリストは、そのヘッドノードからトラバースされるメモリ内データ構造であるが、分散コンピュータノードを一緒にリンクし、システム内の任意のノードから開始できるトラバースをサポートするデータ構造が望ましい。さらに、ピアツーピアシステムではピアが均一の役割および責務を有するはずであるため、すべてのノードの状態および処理オーバヘッドがほぼ同じであることが望ましい。これに対して、スキップリストは、データレコードあたりかなりの違いがあるポインタ数を維持し、各データレコードで大幅に異なるトラバーストラフィックの量を経験する。
【０１１４】
３．２  SkipNet構造
スキップリストから取り入れた主な所見は、数が変化するレコードを「スキップする」すべてのデータレコードならびにポインタの分類済みリストを維持するという概念である。データレコードをコンピュータノードに置き換え、ノードの文字列名ＩＤをデータレコードキーとして使用し、リストの変わりにリングを形成することによって、スキップリストの概念を分散システムセッティングに変形させる。第３．３項で説明するように、パス局所性を実行可能にするためにリングは２重リンクしていなければならない。
【０１１５】
スキップリストの場合のように、ノードに数が大きく変化するポインタを格納させるのではなく、各SkipNetノードは、ほぼ２ｌｏｇ  Ｎのポインタを格納するが、ここでＮはオーバレイシステム内のノード数である。ポインタはノード間でメッセージトラフィックをルーティングする際に使用されるので、各ノードのポインタセットはそのルーティングテーブル、またはＲ−Ｔａｂｌｅと呼ばれる。所与のノードのルーティングテーブルのレベルｈにあるポインタは、所与のノードの左および右へほぼ２ｈのノードであるノードを指す。図９は８ノードを含むSkipNetを記載したものであり、ノードＡおよびＶを維持するルーティングテーブルポインタを示す。
【０１１６】
図９のSkipNetは「完全」SkipNetであり、各レベルｈのポインタが正確に２ｈノードをトラバースする。挿入および削除が存在する完全SkipNetを維持することは、完全スキップリストの場合と同様に実現不可能である。効率的な挿入および削除を容易にするために、確率的SkipNet設計を導出した。図１０は、図９と同じSkipNetを、各レベルで同時にすべてのノードの相互接続を示すように配置構成した図である。すべてのノードは、レベル０の各ノードのポインタによって形成されたルートリングによって接続される。レベル１のポインタは離れた２つのノードであるノードを指し、従ってオーバレイノードは暗黙的に２つの接合していないリングに分けられる。同様に、レベル２のポインタは４つの接合していないノードリングを形成する、という具合である。レベルｈ＋１のリングは、レベルｈのリングを２つの接合していないセットに分割することによって得られ、それぞれのリングがレベルｈリングのあらゆる第２のメンバを含むことに留意されたい。確率的SkipNet設計を得るためには、各ノードに２つのリングのうちで自分の属するリングをランダムおよび均一に選択させることによって、レベルｈの各リングがレベルｈ＋１で２つのリングに分割される。この確率的スキームでは、ノードの挿入／削除のみが、自分が属することをノードがランダムに選択した各リングの他の２つのノードに影響を与える。さらに、レベルｈのポインタは、依然として２ｈノードを予測してスキップし、ルーティングは高い確率でＯ（ｌｏｇ  Ｎ）のホップ転送が可能である。
【０１１７】
各ノードのリングメンバシップのランダムな選択は、ノードの数値ＩＤと呼ばれる固有の２進数として符号化することが可能である。図１０に示されるように、数値の最初のｈビットがレベルｈのリングメンバシップを決定する。例えば、ノードＸの数値ＩＤは０１１であり、レベル２でのそのメンバシップは０１１の最初の２ビットを取って決定され、Ｒｉｎｇ０１と指定される。［３０］に記載されるように、ノードのＤＮＳ名の耐衝突性ハッシュ（ＭＤ−５など）を数値ＩＤとして使用することには利点がある。本書の以下の部分では、数値ＩＤがどのように生成されるかについては対象としておらず、実際にランダムかつ固有であると想定しているだけである。
【０１１８】
ノードの数値ＩＤは固有であるため、同じSkipNetデータ構造によって維持される第２のアドレススペースとみなすことができる。SkipNetの文字列アドレススペースにあるノード名ＩＤは、スペース全体に均一に分散されていないが、SkipNetの数値アドレススペースにあるノード数値ＩＤは、均一に分散されている。後者のアドレススペースの存在により、適切な数のノードをスキップする前者のアドレススペース用のルーティングテーブルエントリを構築することができる。
【０１１９】
Chordに精通している読者であれば、SkipNetのルーティングテーブルが、レベルｈのポインタが２ｈノードを予測してホップする、Chordによって維持されるそれと同様であることに気付くであろう。根本的な違いは、SkipNetのルーティングテーブルが、ノードの名前ＩＤがある名前スペースを介したルーティングをサポートするのに対して、Chordのルーティングテーブルは、ノードの文字列名から導出された固有ハッシュのある数値スペースを介したルーティングをサポートすることである。Chordは、数値アドレススペース内でノード識別子を均一に分散させることによって、Ｏ（ｌｏｇ  Ｎ）のルーティングおよびノード挿入性能を保証する。SkipNetは、そのうちの１つがChordの数値アドレススペースと同じ特性を有する、そのルーティングテーブル内の２つのアドレススペースに関する情報を符号化することにより、その文字列名スペースに関して同じ目標を達成する。
【０１２０】
３．３  名前ＩＤによるルーティング
SkipNetにおける名前ＩＤによるルーティングは、意図された宛先に最も近くルーティングするポインタに従うという、スキップリストにおける検索と同じ基本原理に基づくものである。各ノードでは、メッセージが、宛先値を超えて示すことのない最高位ポインタに沿ってルーティングされることになる。名前ＩＤが宛先に最も近いノードにメッセージが達したときに、ルーティングは終了する。
【０１２１】
図１１は、このアルゴリズムの擬似コード図である。ノードが関数RouteByNameIDを呼び出し、ルーティングする宛先名前ＩＤおよびメッセージに移ると、ルーティングオペレーションが開始する。この関数は、ルーティングする名前ＩＤ用のフィールドおよびルーティングする方向も含んだより大きなメッセージの中に、メッセージをラップするものである。方向は、宛先名前ＩＤがローカルノードの名前ＩＤよりも辞書編集的に大きいか小さいかに応じて設定される。
【０１２２】
メッセージをラップした後、実際にメッセージを次のノードに転送するために、関数RouteMessageByNameIDが呼び出される。この関数は、メッセージがルーティングされるときに通過する各ノードで呼び出されることになる（発信元ノードを含む）。RouteMessageByNameIDは、ローカルノードのルーティングテーブルを使用して、その最終宛先に向かってメッセージの転送を試みる。ローカルノードが宛先名前ＩＤに最も近いノードであれば、ローカルノード上でのメッセージの実際の送達を実行するためにDeliverMessageが呼び出される。
【０１２３】
ノードは各リングに沿って名前ＩＤ順に並べられ、メッセージがその宛先を越えて転送されることは決してないため、ルーティング中に遭遇するすべてのノードはソースから宛先までの間の名前ＩＤを有する。従って、メッセージが、名前ＩＤが宛先と共通の接頭部を共用するノードから発信される場合、メッセージによってトラバースされるすべてのノードは、ソースと宛先が共用するのと同じ接頭部を共用する名前ＩＤを有する。リングは２重にリンクされているため、このスキームでは、それぞれソース名前ＩＤが宛先名前ＩＤよりも小さいか大きいかに応じて、右と左の両方のポインタを使用してルーティングすることができることに留意されたい。この方式の考えは、名前ＩＤによるルーティングが、減少しない名前ＩＤ接頭部の宛先との一致を使用してノードをトラバースすることである。
【０１２４】
ソース名前ＩＤおよび宛先が共通の接頭部を共用しない場合、メッセージは右または左のポインタを使用していずれかの方向にルーティングすることができる。公平を期すため、名前ＩＤが辞書編集用順序の中間付近にあるノードが、名前ＩＤが順序の最初または最後付近にあるノードよりも不釣合いに多くの転送トラフィックの共用をしないように、進行方向をランダムに選ぶことができる。ただし話を簡単にするために、現在の実施ではＺからＡまたはその逆のラップアラウンドは決してしていない。第８．５項は、たとえこのスキームの下でも、ノードストレスのバランスがうまく取られていることを証明している。
【０１２５】
名前ＩＤによってルーティングされる際にメッセージがトラバースするホップの予測数は、高い確率でＯ（ｌｏｇ  Ｎ）となる。その証明については、第８．１項を参照されたい。
【０１２６】
３．４  数値ＩＤによるルーティング
所与の数値ＩＤに従って、効率的にメッセージをルーティングすることも可能である。手短に言えば、ルーティングオペレーションは、第１桁で数値ＩＤが宛先数値ＩＤと一致するノードが見つかるまで、レベル０リングでノードを検査することによって開始される。この時点で、ルーティングオペレーションは、宛先ノードも含むこのノードのレベル１リングにジャンプする。次にルーティングオペレーションは、第２桁で数値ＩＤが宛先数値ＩＤと一致するノードが見つかるまで、このレベル１リング中のノードを検査する。前述のように、このノードのレベル２リングは宛先ノードも含まなければならないため、ルーティングオペレーションはこのレベル２リングに進むと結論付ける。
【０１２７】
この手順は、これ以上進行できなくなるまで、すなわちそのリング内のノードで宛先数値ＩＤとｈ＋１桁を共用するものがないような何らかのレベルｈのリングに達するまで反復する。ここで、何らかの方法により、このリング内のノードの１つを宛先ノードとして確定的に選択しなければならない。本アルゴリズムでは、宛先ノードを、この最高位リング中のすべてのノードの中で数値ＩＤが数値的に宛先数値ＩＤに最も近いノードであると定義している。（より単純な代替方法は、［２０］で提案されたＸＯＲメートル法の下で最も近いノードを選択することであろう。）
【０１２８】
図１２は、このアルゴリズムの擬似コード図である。ノードが関数RouteByNumericIDを呼び出し、ルーティングする宛先数値ＩＤおよびメッセージに移ると、ルーティングオペレーションが開始する。これは、（分散）ルーティング手順全体を通じて維持および更新する必要のあるいくつかの状態変数用のフィールドも含んだより大きなメッセージの中に、メッセージをラップするものである。これらのフィールドには以下のものが含まれる。
【０１２９】
numericID：ルーティング先の宛先数値ＩＤ
currH：トラバースされる現在のリングのレベル
startNode：現在のリング中で遭遇する最初のノード
bestNode：これまでに遭遇したすべてのノードの中で宛先に最も近いノード
finalDestination：メッセージを処理するための次のノードがメッセージにとって正しい最終宛先である場合に、ｔｒｕｅに設定されるフラグ
メッセージをラップした後、実際にメッセージを次のノードに転送するために、関数RouteMessageByNumericIDが呼び出される。この関数は、メッセージがルーティングされるときに通過する各ノードで呼び出されることになる（発信元ノードを含む）。RouteMessageByNumericIDは、メッセージの最終宛先がそれ自体であるかどうかをチェックし、そうであれば、メッセージのローカル送達を実行するために、関数DeliverMessageを呼び出す。
【０１３０】
そうでなければ、メッセージがcurrHによって示されるルーティングテーブルリングをすべて回ってトラバースされたかどうかがチェックされる。トラバースされた場合は、宛先ＩＤの接頭部に一致する高位リングが見つからなかったことを暗に意味する。その場合、bestNodeは、メッセージの最終宛先であるはずの現在のリング上のノードの識別を含むことになり、メッセージはそのノードに転送される。
【０１３１】
メッセージが現在のリングを完全にトラバースされていなかった場合、RouteMessageByNumericIDは、ローカルノードが宛先ＩＤの接頭部に一致する高位リングのメンバでもあるかどうかをチェックする。そうであれば、そのリングの検索が開始される。そうでなければ、ローカルノードがこれまでにリング上で発見されたベストノードよりも宛先ＩＤに近いかどうかをチェックする。どちらの場合も、メッセージは、トラバースのためにルーティングリングの次のメンバに転送されることになる。（リング内を時計回りまたは反時計回りのどちらの方向に進むかの選択は任意であり、本発明者は時計回り方向を選択した。）
数値ＩＤによってルーティングされる際にメッセージがトラバースするホップの予測数は、高い確率でＯ（ｌｏｇ  Ｎ）となる。その証明については、第８．３項を参照されたい。
【０１３２】
３．５  ノードの接合および離脱（departure）
SkipNetを接合するために、新参者は第１に新参者の数値ＩＤに対応するトップレベルのリングを見つけなければならない。これは、第３．４項に記載したように、新参者の数値ＩＤにメッセージをルーティングすることに等しい。
【０１３３】
新参者は第１に、このリング内のみでの名前ＩＤによる検索を使用して、このトップレベルリング中でその隣接を見つける。これら隣接のうちの１つから始まり、次に下位のレベルで新参者は、この下位レベルでのその隣接に関してその名前ＩＤを検索する。このプロセスは、新参者がルートリングに達するまで各レベルで繰り返される。正確を期すために、新しいノードがルートリングに接合するまで、既存ノードが新参者を指すことはなく、その後新参者は各リングに沿ってその隣接に、自分がそれらの隣に挿入されることを示すメッセージを送信する。
【０１３４】
図１３は、このアルゴリズムの擬似コード図である。接合ノードはInsertNodeを呼び出し、それが使用する名前ＩＤおよび数値ＩＤに移る。この関数は、接合ノードの数値ＩＤに向かってルーティングされることになるメッセージを作成する。メッセージは、新しいノードが接合するべきトップレベルリングに属しているノードで終わることになる。そこで、メッセージは汎用メッセージ送達ルーチンDeliverMessageに移る。
【０１３５】
このルーチンは、InsertNodeIntoRingsを呼び出すことによってノード挿入の第２相を開始することになり、これが、接合ノードがそれ自体を挿入するはずのすべてのリングの隣接ノードをまとめるために使用される新しいメッセージを作成する。このメッセージによって符号化される状態には、以下のフィールドが含まれる。  
JoiningNode：新しく接合するノードの識別
nameID：新しく接合するノードの名前ＩＤ
numericID：新しく接合するノードの数値ＩＤ
currH：挿入隣接が現在検索されているリング
ringNeighbors：挿入隣接ノードのアレイ
doInsertion:ringNeighborsのアレイが完全に充填され、メッセージを処理するための次のノードが新しく接合するノード（次に各リングへの実際の挿入を実行しなければならない）である場合に、ｔｒｕｅに設定されるフラグ
挿入隣接集合メッセージを実際に処理するために、関数CollectRingNeighborsが呼び出される。この関数は、InsertNodeIntoRingsによって作成されたメッセージがルーティングされるときに通過する各ノードで呼び出されることになる。
【０１３６】
CollectRingNeighborsは、挿入隣接の集合が完了したかどうか、および新しく接合するノードのすべての関連リングへの実際の挿入を実行する時間であるかどうかをチェックする。これにあてはまらなければ、現在のリングの隣接ノードが先に挿入される正しいノードであるかどうかがチェックされる。これにあてはまれば、挿入隣接がメッセージに記録され、次に下位レベルのリングに対して検索が開始される。あてはまらなければ、メッセージは現在のリングに沿って隣接に転送される。すべてのリングレベルで隣接が見つかると、挿入隣接の完了リストが新しく接合するノードに返送される。
【０１３７】
このアルゴリズムの効率に関する主な所見は、新参者が高位レベルリングで接合した後、一定レベルのリングのみに接合するということである。その結果、接合されるリング内での名前ＩＤによる検索は、典型的にはリングのすべてのメンバをトラバースしないことになる。代わりに、トラバースされるノードの範囲は、高位レベルで新参者の隣接間の範囲に限定される。従って、高い確率で、SkipNetでのノード接合は、Ｏ（ｌｏｇ  Ｎ）ホップをトラバースすることになる（証明については第８．４項を参照）。
【０１３８】
ノード逸脱の処理における基本的な所見は、最下位レベルのリングが維持されている限り、SkipNetが正しくルーティングできることである。レベル０以外のすべてのポインタをルーティング最適化ヒントとみなすことができるため、ルーティングプロトコルの正確さを維持する必要はない。従って、ChordおよびPastryのように、SkipNetはこれらのリングのメンバシップを、背景修復プロセスを使用してゆっくりと維持および修復する。ただし、ノードが自発的にSkipNetを離脱する場合は、それらのポインタを後でゆっくりと修復するのではなく即時に修復するように、その隣接に先回りして通知することができる。
【０１３９】
最下位リングを正しく維持するために、各SkipNetノードは、最下位リングに沿って追加のノードを指すリーフセットを維持する。次に、リーフセットについて説明する。
【０１４０】
３．６  リーフセット
あらゆるSkipNetノードは、左側および同様に右側の、名前ＩＤで最も近いＬ／２ノードを指すポインタセットを維持する。このポインタセットをリーフセットと呼ぶ。いくつかの以前のピアツーピアシステム［２７］が同様のアーキテクチャ特徴を組み込んでおり、Chord［３１］では、これを後続者リストと呼ぶ。
【０１４１】
これら最下位レベルのリングの追加ポインタは２つの利点を与える。第１に、リーフセットは耐障害性を向上させる。検索オペレーションが障害ノードに遭遇した場合、障害ノードに隣接するノードは、障害ノードの反対側の宛先を有するリーフセットポインタを含むことになり、従って、最終的に検索は障害ノードを越えていくことになる。最下位リングを第１に修復し、高位リングを修復するために下位リングの正確さに再帰的に依拠することによって、修復も容易になる。リーフセットがないと、高位レベルのポインタ（障害ノードを越えて示す）が十分に修復を実行できるかどうかは明らかでない。２つのノードが障害を起こした場合、それらの間にある何らかのノードが、高位レベルのポインタのみを使用してそれを探している他のノードには見えなくなる可能性がある。さらに、組織切断のノード障害シナリオでは、ほとんどのノードのリーフセットポインタは、高位レベルポインタよりも無傷のままである可能性が高い。リーフセットが提供する（組織切断シナリオを除く）ノード障害に対する弾力性については、［３１］によっても示されている。
【０１４２】
リーフセットの第２の利点は、必要な検索ホップ数から著しい加法定数を引くことによって、検索性能を上げることである。検索メッセージがその宛先のＬ／２内にある場合、検索メッセージは即時に宛先に転送されることになる。現在の実施では、Pastryが実行するのと同じ、Ｌ＝１６のリーフセットサイズを使用する。
【０１４３】
３．７  背景修復
SkipNetは、レベル０リング内の隣接ポインタが正しいノードを指す確率が確実に高くなるように、リーフセットを使用する。Chord［３０］の場合と同様に、効率的でない可能性がある場合、名前ＩＤによるルーティングが正しいことを保証するのに必要なのはこれだけである。なぜこれが真であるかを直感的に議論する場合、何らかの高位レベルポインタが正しいノードを示しておらず、検索アルゴリズムがこのポインタを使用しようとしているものと想定する。２つのケースがある。第１のケースでは、正しくないポインタは、リングを回ってルーティングの宛先よりも遠くを指す。この場合、宛先を越えるとポインタは使用されなくなる。第２のケースでは、正しくないポインタは、現在の場所と宛先との間の場所を指す。この場合、ポインタに安全に従っていくことが可能であり、ルーティングはそれが指すところであればどこからでも進んでいくことになる。唯一の潜在的な損失はルーティングの効率である。最悪の場合、正しいルーティングはレベル０リングを使用して発生することになる。
【０１４４】
にもかかわらず、効率的なルーティングの場合、他のポインタが正しいことをできる限り保証することが重要である。SkipNetは、正しくないリングポインタの検出および修復のために、２つの背景アルゴリズムを使用する。
【０１４５】
これらのうち第１のアルゴリズムは、レベルｈの正しいリングポインタセットを、その上のレベルｈ＋１のリングに正しいポインタセットを構築するために使用できるという不変式（invariant）に基づいている。各ノードは、レベル０から始まり、それが属する各リングを短い距離だけ回って定期的にメッセージをルーティングし、それより上のリング内のポインタが正しいノードを指すことを検証し、必要であればそれらを調整する。レベルｈのポインタが検証されると、このアルゴリズムは１つ上位のポインタを反復的に検証および修復する。各レベルでのポインタの検証および修復には、予測した一定量の作業のみが必要である。
【０１４６】
これらのうち第２のアルゴリズムは、ノードが矛盾して挿入された可能性があるかまたはメンバが消去された可能性があるリングに対して、ローカル修復を実行する。このアルゴリズムでは、ノードは各レベルでその隣接に定期的に接触し、「レベルｈであなたの左（右）の隣接であると確信する」と伝える。隣接がこの情報に同意した場合は、回答は不要である。同意しない場合、隣接は自分の左（右）の隣接がだれであると確信しているのかを回答し、この情報に基づいて、発見された任意のローカルリングの矛盾を修正するために調停が実行される。
【０１４７】
４  SkipNetの有用な局所特性
本項では、SkipNetが提供できる有用な局所特性と、その結果について論じる。
【０１４８】
４．１  コンテンツおよびルーティングパスの局所性
SkipNetが基本的構造であるとして、SkipNetがコンテンツ局所性およびパス局所性をどのようにサポートするかについて端的に説明する。ノードの名前ＩＤをコンテンツ名に組み込むことによって、コンテンツがそのノードでホストされることを保証する。一例として、ノードjohn.microsoft.com上の文書doc-nameを格納するためには、これにjohn.microsoft.com/doc-nameと命名すれば十分である。
【０１４９】
SkipNetは、ノードの名前ＩＤに使用される命名規則については念頭にない。本発明者のSkipNetのシミュレーションおよび開発では、ＤＮＳ名の構成要素を適切にリバースした後、名前ＩＤにＤＮＳ名を使用する。このスキームでは、john.microsoft.comは、com.microsoft.johnとなり、microsoft.com内のすべてのノードがそれらの名前ＩＤでcom.microsoft接頭部を共用する。これにより、すべてのノードが単一のＤＮＳ接尾部を共用する（従って単一の名前ＩＤ接頭部を共用する）、組織のパス局所性を生み出す。
【０１５０】
４．２  制約付きロードバランシング
概説部で述べたように、SkipNetは、制約付きロードバランシング（ＣＬＢ）をサポートしている。ＣＬＢを実施するために、データオブジェクト名は、ＤＨＴロードバランシングの実行に使用されるノードセットを指定する部分と、ＤＨＴのハッシュ関数への入力として使用される部分という、２つの部分に分けられる。SkipNetでは、名前の２つの部分の区切り文字として、特殊文字「！」が使用される。例えば、名前msn.com/DataCenter!TopStories.htmlは、名前が接頭部msn.com/DataCenterで始まるノードを介したロードバランシングを示す。接尾部TopStories.htmlは、ＤＨＴハッシュ関数への入力として使用され、これがmsn.com/DataCenter内のどのノードにデータオブジェクトを配置するかを決定する。
【０１５１】
ＣＬＢを使用して格納されたデータオブジェクトを検索するためには、第１に、名前ＩＤによる検索を使用してノードの適切なサブセットを検索する。データオブジェクトを格納しているサブセット内の特定ノードを見つけるためには、このサブセット内で接尾部のハッシュに関して数値ＩＤによる検索を実行する。
【０１５２】
名前ＩＤによる検索は、第３．３項の説明と変わらず、Ｏ（ｌｏｇ  Ｎ）メッセージホップを利用する。数値ＩＤによる検索は名前ＩＤ接頭部によって制約されるため、任意のレベルで、リングではなく２重にリンクされたリストを介して効率良く進めていかなければならない。リストの右境界線（名前ＩＤ接頭部境界線によって決定される）に遭遇すると同時に、ノードの見落としが決してないように検索を方向転換しなければならない。この方法での方向転換は、数値ＩＤによる検索の性能に多くても２分の１までの影響を与えるため、合計でＯ（ｌｏｇ  Ｎ）メッセージホップが必要である。
【０１５３】
従来のシステム全体のＤＨＴ意味論と明示的コンテンツ配置は、どちらも制約付きロードバランシングの特別なケースであり、システム全体のＤＨＴ意味論は、文書名の始めに「！」ハッシング区切り文字を配置することによって得られることに留意されたい。ハッシング区切り文字を省略し、特定のSkipNetノードの名前に一致する接頭部を有するようにデータオブジェクトの名前を選択することによって、オブジェクトがそのSkipNetノード上に配置される結果となる。
【０１５４】
制約付きロードバランシングは、SkipNetのどんな命名サブツリーでも実行可能であるが、オーバレイネットワークのノードの任意のサブセットでは実行できない。この点では、階層型ファイルシステムと同様の柔軟性を有する。もう１つの制約は、ロードバランシングのドメインがデータオブジェクト名の中に符号化されることである。従って、異なるロードバランシングドメインに対して透過な再マッピングは不可能である。
【０１５５】
４．３  耐障害性
以前の研究［１８、２１］で、今日のインターネットにおけるネットワーク接続障害は、主に境界ゲートウェイプロトコル（ＢＧＰ）の構成誤りおよび障害によるものであることがわかった。他のハードウェア、ソフトウェア、および人為的障害の果たす役割は、それほど大きくない。その結果、オーバレイシステムのノード障害は独立しておらず、代わりに、同じ組織またはＡＳドメインに属するノードも一緒に障害を起こす傾向がある。従って、組織境界に沿って発生する障害を処理するためのSkipNetの耐障害性の設計に焦点をあてた。SkipNetの相関していない独立した障害に対する耐性は、以前のオーバレイ設計（例えばChordおよびPastry）とほぼ同じであり、同様のメカニズムを介して達成される。
【０１５６】
４．３．１  障害回復
障害回復における主な所見は、レベル０リングにおいて正しい隣接ポインタを維持することでオーバレイの正しい機能が十分に保証されるということである。各ノードがＬ個のレベル０隣接のリーフセットを維持するので、レベル０リングポインタは、それらを、障害を起こしたノードに続く最も近い生きたノードを指すリーフセットエントリに置き換えることによって修復できる。リーフセットを再度完全に占有させるために、リーフセット内の生きたノードに接触することができる。
【０１５７】
第３．７項に記載したように、SkipNetは、ノードが障害を起こしたときに、背景内ですべての必要なルーティングテーブルエントリを段階的に更新するゆっくりとした安定化メカニズムも使用する。この間、生きた到達可能なノードへのどんな照会も依然として続くことになり、安定化メカニズムは最適なルーティングを簡単に復元する。
【０１５８】
４．３．２  組織境界に沿った障害
以前のピアツーピアオーバレイ設計「２５、３０、２７、３６」では、オーバレイトポロジでのノード配置は、ランダムに選択された数値ＩＤによって決定された。その結果、単一組織内のノードは、オーバレイのアドレススペース全体に均一に配置される。均一な分散はオーバレイのＯ（ｌｏｇ  Ｎ）ルーティング性能を可能にするが、オーバレイネットワーク上での物理リンク障害の影響を制御するのを困難にさせる。具体的に言えば、組織間ネットワークリンクの障害は、オーバレイでの複合的な拡散されたリンク障害として現れることになる。実際に、インターネットへの接続性を失った単一組織内の各ノードにとっては、オーバレイ全体および組織内の他のすべてのノードから切断される可能性がある。第９．４項では、この考えを確認する実験によって得られた結果を報告する。
【０１５９】
SkipNetの名前ＩＤは組織のメンバシップを符号化する傾向があるため、共通の名前ＩＤ接頭部を備えたノードはオーバレイの中で連続しており、組織境界に沿った障害はオーバレイを完全に断片化するものではないが、結果的には代わりにリングセグメントを区分することになる。従って、切断された組織内のノードのルーティングテーブルエントリの重要な部分は、依然として同じネットワーク区画内の生きたノードを指している。この特性により、SkipNetは組織境界に沿った障害を難なく乗り越えることができる。さらに、切断された組織のSkipNetセグメントは、第６項で説明するように、接続性が復元されたときに、外部SkipNetと効率的に再マージすることができる。
【０１６０】
４．４  セキュリティ
コンテンツ局所性およびパス局所性の利点についての考察では、名前ＩＤの選択に関するアクセス制御メカニズムが想定されている。SkipNetは、このメカニズムを直接提供していないが、他のレイヤで提供されると想定している。名前ＩＤにＤＮＳ名を使用することでこれを提供しており、任意のノードはmicrosoft.com接尾部を備えたグローバルＤＮＳ名を作成することはできない。
【０１６１】
パス局所性により、SkipNetは、以前のピアツーピアシステムが提供するものを超えた、名前ＩＤスペース内の共通接頭部に対応する単一の管理ドメイン内にある２つのマシン間でのメッセージは管理ドメインを決して離れることはない、という何らかのセキュリティを保証することができる。従って、これらのメッセージは、管理ドメインの外部に位置するマシンによるトラフィック分析またはサービス不能攻撃の影響をたやすく受けることがない。実際に、SkipNetは、Sybil攻撃［９］に対する弾力性さえも提供しており、microsoft.com外部に無限数のノードを作成することによって、攻撃者がmicrosoft.com内部のどんなトラフィックも見えないようにすることができる。
【０１６２】
攻撃者は、SkipNetをターゲットに隣接する名前ＩＤ（例えばmicrosofta.com）に接合させるように選択することによって、特定のドメイン（例えばmicrosoft.com）をターゲットにしようと試みる可能性がある。microsoft.comがＭ個のノードからなると想定する。この場合攻撃者は、均一なトラフィックという仮定の下では、microsoft.comノードと外界との間で渡されるメッセージのＯ（（ｌｏｇ  Ｍ）／Ｍ）部分を見ると予測する。
【０１６３】
パス局所性のないシステムであるChordでは、それ自体をターゲットノードの隣に挿入し、ターゲットへのトラフィックの一定の部分を遮断するためには、（メッセージがChord後続者リストではなくChordフィンガテーブルのみを使用してルーティングされると想定して）システム内にあるノードと同じ数のＳＨＡ−１ハッシュを計算する必要がある場合がある。これに対して、SkipNetでは、名前ＩＤの生成に対する計算上のオーバヘッドはないが、その名前ＩＤを作成する特権のない場所でSkipNetにそれ自体を挿入するのは不可能である。SkipNetでは、パス局所性のない他のシステムで必要な数よりも少ない攻撃ノードで、組織全体と外界との間の接続をターゲットにすることが可能な場合がある。たとえパス局所性がこの種の攻撃を容易にするものであっても、望ましい特性であると確信している。
【０１６４】
ピアツーピアシステムのセキュリティを向上させることに関する最近の研究［３］では、ノード識別子の証明、ルーティングを成功させるためのテスト、冗長ルーティングパスの使用に焦点が当てられた。本考察は、コンテンツ局所性およびパス局所性のセキュリティ特典に焦点を当てたが、SkipNet設計もこの最近の研究からの技法を組み込むことができる。
【０１６５】
４．５  領域照会
SkipNetの設計はスキップリストに基づき、スキップリストによって影響を受けるものであるため、効率的な領域照会をサポートする中でそれらの機能性および柔軟性を引き継ぐ。具体的に言えば、ノードおよびデータは名前ＩＤ順で格納されるため、共通の接頭部を共用している文書は、連続したリングセグメントに渡って格納される。従ってSkipNetでの領域照会への回答は、対応するリングセグメントに沿ったルーティングと等価である。現在はSkipNetのアーキテクチャおよび局所特性に焦点を当てているため、本書ではこれ以上領域照会について論じることはしない。
【０１６６】
５  SkipNetの機能拡張
本項では、基本的なSkipNet設計に対するいくつかの最適化および機能拡張について示す。
【０１６７】
５．１  疎および密なルーティングテーブル
第３項に記載した基本的なSkipNetルーティングテーブルの構造およびアルゴリズムは、ルーティング性能を向上させるために修正することができる。そこで、より詳細に論じると、SkipNetの数値ＩＤは、１２８のランダム２進数字からなる。ただし、ランダム数字は２進である必要はない。実際に、非２進のランダム数字を使用するスキップリストがよく知られている［２３］。
【０１６８】
SkipNetの数値ＩＤが非２進数字からなる場合、図１０に示されたリング構造、格納されると予測するポインタ数、および予測される検索コストが変わることになる。本発明者は数字の様々な可能性の数をｋで示し、２進数字の場合、ｋ＝２である。ｋ＝３の場合、SkipNetのルートリングは依然として単一のリングだけであるが、レベル１のリングは３つ（２つだけではない）、レベル２のリングは９つなどとなる。ｋが増加するにつれて、任意の所与の桁数でノードが一致する可能性が低くなり、ポインタの合計数は少なくなる。ポインタが少なくなるため、任意の特定ノードに到達するまでにより多くのホップが必要になることも予測される。ｋの値が増加する場合、ポインタ数はＯ（ｌｏｇｋ  ｎ）まで減少し、検索に必要なホップ数はＯ（ｋｌｏｇｋ  ｎ）まで増加する。この修正の結果として生じるルーティングテーブルを、パラメータｋの疎Ｒ−Ｔａｂｌｅと呼ぶ。
【０１６９】
密Ｒ−Ｔａｂｌｅを構築することも可能である。疎な構造体の場合と同様に、各数字についてｋの可能性があると想定する。さらに、各レベルおよび両方向で、連続するノードにｋ−１ポインタを格納すると想定する。この場合、予測される検索ホップ数はＯ（ｌｏｇｋ  ｎ）まで減少し、１ノードでの予測されるポインタ数はＯ（ｋｌｏｇｋ  ｎ）まで増加するが、これは疎な構造体とは反対のトレードオフである。これらの結果については、第８項で正式に証明する。１レベル１方向あたりｋ−１個のポインタを格納する理由に関する直感的洞察については、レベルｈでのノードのｋ番目の隣接が、レベルｈ＋１でのその第１の隣接にもなる好機を有することに留意されたい。
【０１７０】
本発明の密度パラメータｋは、Pastryの密度パラメータｂとほとんど同じである。Pastryは常に２進数値ＩＤを生成するが、数字をｂのグループに分ける。これは、ｋ＝２ｂの数値ＩＤを選択する場合の本発明の方法と類似している。
【０１７１】
疎Ｒ−Ｔａｂｌｅのケースでノードの接合および離脱を実施する場合、以前のアルゴリズムを修正する必要はない。密Ｒ−Ｔａｂｌｅの場合、ノード接合メッセージは、次のリングに降りる前に、新参者を含むあらゆるリングで両方向に、少なくともｋ−１ノードをトラバース（およびそれらについての情報を収集）しなければならない。前述のように、ノード離脱の際には、あらゆる隣接に通知するだけでよい。
【０１７２】
ｋ＝２の場合、疎および密の構造体は同一である。ｋが増加すると疎Ｒ−Ｔａｂｌｅはますます疎になり、密Ｒ−Ｔａｂｌｅはますます密になる。任意の所与の疎／密の程度は、ｋならびに疎または密のいずれかのＲ−Ｔａｂｌｅを適切に選択することで、適切に概算することができる。本実施では、ノードあたりの状態とルーティング性能との良好なバランスを達成するために、ｋ＝８を選択する。
【０１７３】
５．２  重複ポインタの消去
レベルｈのリング内で隣接する２つのノードは、レベルｈ＋１のリングでも隣接する可能性がある。この場合、これら２つのノードはレベルｈおよびｈ＋１で互いに「重複」ポインタを維持する。直感的に、より多くの別個のポインタを有するルーティングテーブルは、別個のポインタが少ないテーブルよりも優れたルーティング性能を生み出すため、重複ポインタはルーティングテーブルの有効性を低下させることになる。重複ポインタを、下位リングの次の隣接などの好適な代替に置き換えることで、適度な量（典型的にはおよそ２０％）のルーティング性能が向上する。この方式で調整されたルーティングテーブルエントリは、数値ＩＤによる正しいルーティングに必要なリング上で最も近い隣接を指すノードである不変式を侵害するため、名前ＩＤによるルーティングの際にしか使用できない。
【０１７４】
５．３  ネットワーク近接の組込み：Ｐ−Ｔａｂｌｅ
SkipNetでは、ノードの隣接はリングメンバシップのランダムな選択、およびそれらリング内での識別子の順序付けによって決定される。従って、SkipNetオーバレイは、潜在的にルーティング性能を損なう物理ネットワークトポロジを直接考慮せずに構築される。例えば、どちらも米国内のノードsaturn.com/nodeAからノードchrysler.com/nodeBへメッセージを送信する場合、このメッセージは、英国内の中間ノードjaguar.com/nodeCを通ってルーティングされる可能性がある。その結果、メッセージが米国内にある他の中間ノードを通ってルーティングされる場合よりもかなり長いパスになってしまう。
【０１７５】
この問題に対処するために、近接テーブル（proximity table）の略語であるＰ−Ｔａｂｌｅと呼ばれる第２のルーティングテーブルを導入する。このＰ−Ｔａｂｌｅの設計は、Pastryの近接認識ルーティングテーブル［４］に示唆されたものである。ネットワーク近接を組み込むための主な所見は、名前ＩＤスペース内でほぼ適切な距離だけ離れている任意のノードを、基礎となるＯ（ｌｏｇ  Ｎ）ホップのルーティング挙動を維持することになる受入れ可能なルーティングテーブルエントリとして使用できることである。例えば、レベル３のルーティングテーブルエントリが、正確に８ノードはなれたノード、あるいは７または９ノードはなれたノードのどちらを指すかは、統計的にメッセージが使用することになる転送ホップ数が同じになるので、問題ではない。ただし、７番目または９番目のノードがネットワーク距離において近い場合、これをルーティングテーブルエントリとして使用すれば、かなり良いルーティング性能を引き出すことができる。
【０１７６】
Ｐ−Ｔａｂｅｌ構築プロセスをブートストラップするためには、ノードの基本ルーティングテーブル（Ｒ−Ｔａｂｌｅ）にすでに含まれている情報を使用する。Ｒ−Ｔａｂｌｅエントリは、指数的に距離が遠くなっていくノードを指すと予想されることを想起されたい。Ｒ−Ｔａｂｌｅ内で隣接するエントリをインタリーブするノードを選択することによって、Ｐ−Ｔａｂｌｅのルーティングエントリを構築する。言い換えれば、Ｒ−Ｔａｂｌｅエントリは、名前ＩＤによって分類された場合、ルートリングの連続するセグメントのエンドポイントを定義し、Ｐ−Ｔａｂｌｅの構築プロセスは、それら各セグメント内の接合ノード近くにあるノードを見つける。２つのノード間のラウンドトリップ待ち時間を推定することによって、それらが互いに近いと判断する。
【０１７７】
以下の項では、SkipNetノードがそのＰ−Ｔａｂｌｅの構築に使用するアルゴリズムについて、詳細に説明する。初期のＰ−Ｔａｂｌｅが構築された後、SkipNetはそのＰ−Ｔａｂｌｅエントリの品質改善、ならびに、定期的な安定化アルゴリズムを使用したノードの接合および逸脱の調整を継続的に試みる。定期的な安定化アルゴリズムは、以下に示される初期の構築アルゴリズムに非常によく似ている。最終的に、第８．８項で、Ｐ−Ｔａｂｌｅのルーティング性能およびＰ−Ｔａｂｌｅの構築が効率的であることについて論じる。
【０１７８】
５．３．１  Ｐ−Ｔａｂｌｅの構築
Ｒ−Ｔａｂｌｅは、値ｋと疎または密の構造体という、２つの構成パラメータしか備えていないことを想起されたい。Ｐ−Ｔａｂｌｅは、その基になるＲ−Ｔａｂｌｅからこれらのパラメータを受け継ぐ。あるケースでは、第１に所望のパラメータを備えた一時Ｒ−Ｔａｂｌｅを構築することによって、Ｒ−Ｔａｂｌｅのパラメータと異なるパラメータを備えたＰ−Ｔａｂｌｅを構築することが可能である。例えば、Ｒ−Ｔａｂｌｅが疎である場合、Ｐ−Ｔａｂｌｅ構築アルゴリズムへの入力として使用する一時密Ｒ−Ｔａｂｌｅを第１に構築することによって、密なＰ−Ｔａｂｌｅを構築することができる。
【０１７９】
Ｐ−Ｔａｂｌｅの構築を開始するには、別のリストにＲ−Ｔａｂｌｅのエントリ（一時であるか否か）がコピーされ、ここで名前ＩＤによって分類され、重複するエントリは消去される。Ｒ−Ｔａｂｌｅ構築の確率的性質により、重複エントリおよび不適切なエントリが生じる可能性がある。次に、接合ノードは、ｊ−１間隔を定義するｊノードのリストであるエンドポイントの分類済みリストを含む、Ｐ−Ｔａｂｌｅ接合メッセージを構築する。次にノードは、このＰ−Ｔａｂｌｅ接合メッセージを、ネットワーク距離に関して近いはずのシード（seed）ノードと呼ばれるノードに送る。
【０１８０】
Ｐ−Ｔａｂｌｅ接合メッセージを受け取ったいずれのノードも、独自のＰ−Ｔａｂｌｅエントリを使用して間隔に「候補」ノードを充填する。実際的に考えて、多くのノードが累積しすぎないように、間隔あたりの最大候補数は１０に制限する。任意の可能な間隔に充填した後、ノードは、依然として空の間隔がないかどうかを調べるために、接合メッセージを検査する。まだ充填されていない間隔があった場合、ノードは独自のＰ−Ｔａｂｌｅエントリを使用し、接合ノードから最も遠くにある充填されていない間隔の最も遠いエンドポイントに向けて、接合メッセージを転送する。すべての間隔に少なくとも１つの候補があれば、ノードは接合完了メッセージを接合ノードに返送する。
【０１８１】
オリジナルノードが独自の接合メッセージを受け取ると、それぞれの間隔がその間隔のＰ−Ｔａｂｌｅエントリとして候補ノードのうちの１つを選択することによって反復する。候補ノード間の最終選択は、各候補に対するネットワーク待ち時間を推定し、最も近いノードを選択することによって実行される。
【０１８２】
Ｐ−Ｔａｂｌｅの構築に関する残りの主な詳細について概説する。SkipNetは２重にリンクされたリングを維持するので、Ｐ−Ｔａｂｌｅの構築には、接合ノードから時計回り方向および反時計回り方向の両方のアドレススペースをカバーする間隔を定義することが含まれる。従って、同じ開始ノードから２つの接合メッセージが送信される。本発明者のシミュレータでは、Ｐ−Ｔａｂｌｅ接合メッセージのシードノードは、実際にシステム内で最も近いノードである。実際に実施するために、シードノードは、リーフセット内のすべてのノードに対するネットワーク待ち時間を推定し、最も近いリーフセットノードを選択することによって決定すべきであるという、単純な提案をする。SkipNetの名前ＩＤは命名局所性を組み込んでいるため、ノードは、ネットワーク近接に関してそのリーフセット内のノードに近いと見込まれる。従って、最も近いリーフセットノードをシードノードに選ぶのが最も良いと見込まれる。
【０１８３】
経時的に変化する可能性のあるSkipNet内の名前ＩＤの分散を、Ｐ−Ｔａｂｌｅセグメントエンドポイントが正確に反映するために、Ｐ−Ｔａｂｌｅは定期的に更新される。Ｐ−Ｔａｂｌｅ構築とＰ−Ｔａｂｌｅ更新との唯一の違いは、更新の場合、Ｐ−Ｔａｂｌｅ接合メッセージによって戻される候補に加えて、現在のＰ−Ｔａｂｌｅエントリも候補ノードとみなされる点である。Ｐ−Ｔａｂｌｅエントリは、ノードの接合および離脱が通常のメッセージトラフィックを介して発見されるにつれて、増分的に更新することもできる。
【０１８４】
５．４  ネットワーク近接の組込み：Ｃ−Ｔａｂｌｅ
名前ＩＤによる検索の際にネットワーク近接が組み込まれるＰ−Ｔａｂｌｅとほぼ同様に、数値ＩＤによる検索の際にネットワーク近接を組み込むために、第３のテーブルであるＣ−Ｔａｂｌｅを追加する。制約付きロードバランシング（ＣＬＢ）は、名前ＩＤと数値ＩＤの両方による検索を含むため、Ｐ−ＴａｂｌｅとＣ−Ｔａｂｌｅの両方を利用する。ＣＬＢ検索の一部としての数値ＩＤによる検索は、ＣＬＢ検索の名前制約に従わなければならず、名前制約を守らないＣ−Ｔａｂｌｅエントリは使用できない。こうしたエントリに遭遇すると、ＣＬＢ検索はＲ−Ｔａｂｌｅの使用に戻らなければならない。
【０１８５】
Ｃ−Ｔａｂｌｅは、Pastryが維持するルーティングテーブルと同一の機能および設計を有する［２７］。Pastryのルーティングテーブル向けに推奨されるパラメータ選択は、ｂ＝４（すなわちｋ＝１６）であるが、本発明の実施では、第５．１項で述べたようにｋ＝８を選択している。Ｒ−Ｔａｂｌｅを使用する数値ＩＤによる検索の場合と同様に、またはPastryの場合と同様に、Ｃ−Ｔａｂｌｅを使用する数値ＩＤによる検索では、多くてもＯ（ｌｏｇ  Ｎ）のメッセージホップが必要である。
【０１８６】
具体性を持たせるために、ｋ＝８の場合のＣ−Ｔａｂｌｅについて説明するが、この説明は［２７］から推測できるものではない。各ノードで、Ｃ−Ｔａｂｌｅはノードポインタのアレイセットからなり、数値ＩＤの１桁あたり１アレイであって、各アレイは可能な８桁値それぞれについて１つのエントリを有する。第１のアレイの各エントリは、第１の数値ＩＤの桁がアレイのインデックス値に一致するノードを指す。第２のアレイの各エントリは、第１の桁が現在のノードの第１の桁に一致し、第２の桁がアレイのインデックス値に一致するノードを指す。この構築は、空のアレイに到達するまで繰り返される。
【０１８７】
５．４．１  Ｃ−Ｔａｂｌｅの構築および更新
Ｃ−Ｔａｂｌｅ構築の詳細は［４］に示されている。主な考え方は、Ｃ−Ｔａｂｌｅの各アレイについて、必要な数値ＩＤ接頭部を備えた近くのノードにルーティングし、そのレベルでそのＣ−Ｔａｂｌｅエントリを取得し、その後接合ノードのアレイにそれらのエントリを配置することである。特定のテーブルエントリにはいくつかの候補ノードが使用可能であるため、最適なネットワーク近接を備えた候補が選択される。第８．８項は、メッセージトラフィックに関してＣ−Ｔａｂｌｅの構築コストがＯ（ｌｏｇ  Ｎ）であることを示している。Pastryの場合と同様に、Ｃ−Ｔａｂｌｅは背景安定化アルゴリズムを使用してゆっくりと更新される。
【０１８８】
ＣＬＢ検索時にＣ−Ｔａｂｌｅを使用するとＲＤＰ（相対的遅延ペナルティ）が減少することを示した第９．５項で、実験について報告する。Pastryについて［４］に記載された議論の適応では、これがそのケースである理由について説明している。
【０１８９】
５．５  仮想ノード
規模の経済および別個のＷｅｂサイト間でハードウェアリソースを多重化する機能が、Ｗｏｒｌｄ  Ｗｉｄｅ  Ｗｅｂにおけるホスティングサービスの出現につながった。ピアツーピアシステムの単一ハードウェアプラットフォーム上で仮想ノードをホストすることについても、同様の需要が予想される。この項では、SkipNet設計の中で仮想ノードをスケーラブルにサポートするための方法について説明する。説明をわかりやすくするために、Ｒ−Ｔａｂｌｅの変更についてのみ記載し、Ｐ−ＴａｂｌｅおよびＣ−Ｔａｂｌｅへの対応する変更については明白であるので省略する。
【０１９０】
SkipNet設計では、複数のノードが単一のマシン上で共存するのを妨げるものは何もないが、仮想ノードの数が増加するにつれて、スケーラビリティが問題となる。第８．２項に示されるように、単一のSkipNetノードのＲ−Ｔａｂｌｅには、おそらくほぼｌｏｇ  Ｎのポインタが含まれる。単一の物理マシンがｖ個の仮想ノードをホストしている場合、すべての仮想ノードに対するＲ−Ｔａｂｌｅポインタの合計数は、およそｖ  ｌｏｇ  Ｎとなる。ｖが増加するにつれて、これらポインタそれぞれに必要な定期的な保守トラフィックが、スケーラビリティの問題を引き起こす。この潜在的な障害を緩和するために、本項では、名前ＩＤによる検索に関する対数予測パス長さを維持しながら、ｖ個の仮想ノードに必要な予測ポインタ数をＯ（ｖ＋ｌｏｇ  ｎ）まで減少させる、SkipNet設計の変化について記載する。第８．６項では、この仮想ノードスキームの性能に関して数学的に証明する。
【０１９１】
スキップリストはSkipNetと同等のルーティングパス長さを有するが、第３項では、以下のオーバレイルーティングデータ構造としてのスキップリストの２つの基本的な欠点を述べた。
・スキップリスト内のノードは、著しく不均衡なルーティングロードを経験する。  
・スキップリスト内のノードは、平均エッジ接続性が低い。
【０１９２】
発明者の主な見識は、これら２つのスキップリストの欠点はどちらも仮想ノードに当てはまらないということである。仮想ノードのコンテキストでは、以下のことが望ましい。  ・ピアツーピアシステムは、どんな所与の物理マシン上でも、作業量の著しい不均衡は避けなければならない。単一の物理マシン上で仮想ノードが量の不均衡な作業を実行することはそれほど重要ではない。  
・同様に、各物理マシンのエッジ接続性は高くなければならない。単一の物理マシン上の仮想ノードのエッジ接続性が高いことは、それほど重要ではない。
【０１９３】
これらの改訂された目的に鑑み、各仮想ノードがおよそｌｏｇ  ｎ個のポインタを有するという要求条件を緩和することができる。代わりに、仮想ノードあたりのポインタ数を、スキップリスト内のデータレコードあたりのポインタ数と同様の分散にすることができる。より精密には、１つを除くすべての仮想ノードが独立して、自分の数値ＩＤを１／２ｉ＋１の確率で長さｉ≧０になるように切り捨てる。残った１つの仮想ノードは、物理マシンが少なくともｌｏｇ  ｎの予測される隣接を確実に有するように、その全長さの数値ＩＤを維持する。結果としてこのスキームでは、ｖ個の仮想ノードのセットに関する予測される合計ポインタ数は2v+log n+O(1)である。
【０１９４】
仮想ノードがメッセージをルーティングする場合、同じ場所に配置された任意の仮想ノードのＲ−Ｔａｂｌｅにある任意のポインタを使用することができる。単に宛先に最も近い（それを越えない）ポインタを使用することで、パス局所性および対数予測ルーティング性能が維持されることになる。
【０１９５】
仮想ノードとＤＨＴ機能との間の対話は、さらに複雑である。ＤＨＴ機能には所与の数値ＩＤの検索が含まれる。数値ＩＤによる検索は、それ以上高位に進めないリングに到達すると終了するが、これは、相対的に高位レベルのリングで発生しやすい。構造により、仮想ノードは低レベルのリングのメンバでしかない可能性が高く、ＤＨＴ格納負担を等しく引き受けない可能性が高い。ただし、物理マシンあたり少なくとも１つのノードが仮想化されないため、物理マシンの格納負担は仮想ノードがない場合よりも少なくはならない。
【０１９６】
６  組織切断からの回復
本項では、組織がインターネットから切断された場合という、一般的な障害モードに関するSkipNetの挙動について特徴付ける。こうした障害が発生した場合にSkipNetオーバレイの修復に使用される回復アルゴリズムについて説明および評価する。SkipNetの局所特性の主要な特典の１つが、ルータの構成誤りならびにリンクおよびルータの故障による組織の切断に応答した、適切な低均化（graceful degradation）である［１８］。SkipNetはその名前に従った順にノードを並べるため、組織がノード名に１つまたは数個の組織接頭部を割り当てると想定すると、組織のノードは自然に、数個の連続したオーバレイセグメントに配置構成される。１つの組織が切断されると、そのセグメントは内的には適切に接続されたままとなり、セグメント内トラフィックは以前と同じＯ（ｌｏｇ  Ｍ）ホップ効率でルーティングされることが可能であって、ここでＭは任意のセグメントでの最大ノード数である。
【０１９７】
各セグメントの「エッジ」ノード上にある数個の主要なルーティングポインタのみを修復することによって、組織全体を単一のSkipNetに接続することができる。セグメント内トラフィックは依然としてＯ（ｌｏｇ  Ｍ）ホップ内でルーティングされるが、セグメント内トラフィックは、トラバースするあらゆるセグメントについてＯ（ｌｏｇ  Ｍ）ホップが必要な可能性がある。合計では、セグメント内トラフィックについてＯ（Ｓ  ｌｏｇ  Ｍ）ホップが必要となり、ここでＳは組織内のセグメント数である。
【０１９８】
背景プロセスは、残りの破損したルーティングポインタを修復することが可能であり、これによってセグメント間トラフィックによって生じた性能ペナルティを消去する。SkipNetの構造は、作業の不要な重複を避ける方法で、この修復プロセスを先回りして実行することが可能である。組織がインターネットに再接続すると、これらと同じ修復オペレーションを使用して、組織のセグメントをグローバルSkipNetに再度マージすることができる。
【０１９９】
これに対して、以前のほとんどのスケーラブルなピアツーピアオーバレイ設計［２５、３０、２７、３６］は、固有のランダム数値ＩＤに従ってオーバレイトポロジにノードを配置する。これらのシステムで組織が切断されると、結果としてそのノードが多くの接合していないオーバレイ部分に断片化されることになる。これらの断片が単一のオーバレイに再生される間、たとえそれが実行できたとしても、ネットワークルーティングは信頼できない可能性があり、効率性に乏しいであろう。
【０２００】
６．１  回復アルゴリズム
組織がインターネットから切断されたとき、そのノードはＩＰを介して少なくとも互いに通信は可能であるが、組織外のノードとは通信できなくなるであろう。組織のノード名がいくつかの組織接頭部のうちの１つを使用している場合、グローバルSkipNetはそれ自体を、接合していないが内的には適切に接続されている、いくつかのセグメントに区分する。図１４は、この状況を示した図である。
【０２０１】
SkipNetのルーティング局所特性により、各セグメント内でのメッセージトラフィックは切断による影響を受けることがなく、引き続きＯ（ｌｏｇ  Ｍ）の効率でルーティングされることになる。組織の切断がオーバレイ全体のかなりの部分を表していない限り、グローバルセグメント間でのクロスセグメントポインタは有効のままなので、SkipNetのグローバル部分間でのクロスセグメントトラフィックも、ほとんど影響を受けないままとなる。これは、切断された組織のセグメントにはあてはまらない。従って、切断と再接続の両方が実行された後の主な修復タスクは、オーバレイセグメントのマージに関するものである。
【０２０２】
切断および再接続の両方で使用されるアルゴリズムは非常に似通っており、SkipNetセグメントは互いを発見し、互いにマージしなければならない。切断の場合、セグメントは２つの接合していないSkipNetにマージされる。再接続の場合、２つの接合していないSkipNetのセグメントは、単一のSkipNetにマージされる。
【０２０３】
６．１．１  発見技法
組織が切断されると、そのセグメントは、SkipNetポインタのみを使用したのでは、互いを見つけることができない場合がある。これは、連続していないセグメントが互いの中へのポインタを有することになるという保証がないためである。組織がそのノードを相対的に少数の名前セグメントに分割すると想定し、それらが各セグメントの中のいくつかのノードを「周知」として指定するように要求することによって、この問題を解決する。組織内の各ノードは、これらの周知ノードのリストを維持し、それらを様々なオーバレイセグメント間の接触ポイントとして使用する。
【０２０４】
組織が再接続すると、組織SkipNetおよびグローバルSkipNetは、それらのセグメントエッジノードを介して互いを発見する。各ノードは、レベル０リング中でそれ自体のそれぞれの側にある８つの最も近いノードを指す「リーフセット」を維持する。ノードがそのリーフセットの一方の側は完全に到達不可能であるが、他方はそうでないことを発見すると、切断イベントが発生したこと、およびそれがセグメントのエッジノードであることを結論付ける。これらのエッジノードは、自分の到達不可能なリーフセットポインタを追跡して、定期的にそれらの到達可能性をｐｉｎｇし、ポインタが到達可能になると、ノードはマージプロセスを開始する。例えば、新しい組織がシステムに接合する場合など、２つの以前に独立していたSkipNetを一緒にマージすることは、何らかの他の発見手段が必要である場合を除き、以前に接続していたものに再接続することと機能的に等価であることに留意されたい。
【０２０５】
６．１．２  レベル０でのSkipNetセグメントの接続
セグメントマージプロセスを、レベル０リングを含むポインタの修復と、すべての高位レベルリングに関するポインタの修復という、２つのステップに分ける。第１のステップは、各セグメントの「エッジ」ノードのレベル０ポインタの修復のみを含む場合、即時に実行可能である。第１のステップが実行されると、様々なセグメント内のノード間でメッセージを正しくルーティングすること、およびＯ（Ｓ  ｌｏｇ  Ｍ）の効率でそのように実行することが可能になり、ここでＳはセグメントの合計数、Ｍは１セグメント内の最大ノード数である。従って、第２のより費用のかかるステップは、第６．１．３項で説明するように、背景タスクとして実行することができる。
【０２０６】
レベル０のSkipNetセグメントを接続するための主な考え方は、１セグメント内のノードに他のセグメント内のノードの名前ＩＤに向けてメッセージをルーティングさせることによって、関連するエッジノードを発見することである。このメッセージは、他のノードの名前ＩＤに最も近い第１のセグメント内のエッジノードにルーティングされることになる。この方式でルーティングされたメッセージは、すべてのセグメントのエッジノードのリストを集める際に使用することができる。次に実際のセグメント間ポインタ更新が、分散２相コミットを使用して、セグメントエッジノード間の単一のアトミックオペレーションとして実行される。これにより、ルーティングの不一致を回避する。
【０２０７】
図１４は、例示の目的でマージされる２つのSkipNetを示した図であり、それぞれが２つの異なる名前セグメントを含んでいる。ノードｎ１はノードｎ２の存在を知っていると想定する。ノードｎ１は、ノードｎ２に（ＩＰを介して）メッセージを送り、SkipNetＢ内でｎ１に向けて検索メッセージをルーティングするように依頼する。ｎ２のメッセージはノードｄ１で終わり、さらに、SkipNetＢ上でのｄ１の隣接はｄ０となる。ｄ１はｎ１に（ＩＰを介して）回答を送り、ｄ０およびｄ１について伝える。ｎ１は、同じ方法でｓ１およびｓ０を発見するための検索メッセージをSkipNetＡ上でｄ０に向けてルーティングする。手順は、ｓ２、ｓ３、ｄ２、およびｄ３に関する情報を得るために、ｓ０およびｄ０を使用して繰り返し呼び出される。図１５は、擬似コードのアルゴリズムを示す図である。
【０２０８】
レベル０リング接続の直後に、クロスセグメント宛先に送られたメッセージは効率良くルーティングされることになる。クロスセグメントメッセージは、トラバースする各セグメントのエッジにルーティングされ、その後セグメントを接続しているレベル０ポインタを使用して次のセグメントに飛ぶ。これがＯ（Ｓ  ｌｏｇ  Ｍ）のルーティング効率につながる。組織がレベル０でその完全に修復されたSkipNetをグローバルなSkipNetに再接続すると、組織外部にあるノード宛のトラフィックは、Ｏ（ｌｏｇ  Ｍ）のホップで組織のSkipNetのエッジノードにルーティングされることになる。２つのSkipNetを接続しているレベル０ポインタがトラバースされ、その後グローバルSkipNet内のトラフィックをルーティングするためにＯ（ｌｏｇ  Ｍ）のホップが必要になる。２つのSkipNetの間を横断する必要のないトラフィックは、このルーティングペナルティを負わないことに留意されたい。
【０２０９】
６．１．３  レベル０リング接続後のルーティングポインタの修復
レベル０リング接続段階が完了すると、修復を必要とする残りのすべてのポインタを、背景タスクを使用して更新することができる。ここでは、修復アクティビティの適切な順序付けを通じて作業の不要な重複を避ける、事前対応型アルゴリズムを示す。
【０２１０】
主な考え方は、各セグメントで所望のノードを見つけるために、下位レベルの正しいポインタを使用することによって１つのレベルのポインタを繰り返し修復することである。１つのレベルのポインタは、高位レベルの修復を開始する前に、すべてのセグメント境界線をまたがって修復しなければならない。例示のために、ポインタが修復された後の２つのSkipNetセグメント間にある単一の境界線を示した、図１６について考えてみる。図１７は、単一境界線をまたがってレベル０より上のポインタを修復するための擬似コードのアルゴリズムを示す図である。単一境界線のケースについての考察から始まり、その後、複数境界線のケースの処理にまでアルゴリズムを拡張する。
【０２１１】
レベル０ポインタがすでに正しく接続されていると想定する。レベル１でセグメント間を接続するために、２つのポインタのセットが２つあり、１つは０とラベル表示されたルーティングリング用、１つは１とラベル表示されたルーティングリング用である（図１０を参照）。０とラベル表示されたリングに属する各セグメント内にノードを見つけるまで、エッジノードの１つからレベル０リングをトラバースすることによって、０とラベル表示されたレベル１リングを修復することができる。同じ手順に従って、１とラベル表示されたレベル１リングを正しく接続する。レベル１リングの後、同じ方法を使用して、４つのレベル２リングを修復する。
【０２１２】
高位レベルのリングは下位レベルのリング内にネストされているので、レベルｈ＋１でのリングの修復は、レベルｈの囲みリング用にそのポインタを修復したノードのうちの１つによって開始することができる。レベルｈリングが（ａ）単一のメンバしか含まない場合、または（ｂ）修復が必要なセグメント間ポインタがない場合、レベルｈ＋１での修復オペレーションは不要である。後者の終了条件は、グローバルSkipNet内のほとんどのリング、従ってほとんどのノードが、実際には潜在的な修復に関して検査される必要がないことを暗に示している。
【０２１３】
この修復アルゴリズムに関する作業の合計はＯ（Ｍ  ｌｏｇ（Ｎ／Ｍ））であり、ここでＭは切断／再接続するSkipNetセグメントのサイズであり、Ｎは外部SkipNetのサイズである。レベルｈ＋１のリングは、レベルｈのそれらの囲みリングがすべてのセグメント境界をまたがっていったん修復されると、平行して修復可能であることに留意されたい。従って、所与のセグメント境界線に関する修復プロセスは、基礎となるネットワークインフラストラクチャによってサポートされる程度まで対応する。修復を完了するための作業の合計および合計時間の理論的な分析は、第８．７項に示す。
【０２１４】
複数のセグメント境界線を修復するためには、上記のアルゴリズムを各セグメント境界線につき１回呼び出すだけである。現在の実施では、このプロセスを繰り返し実行し、１つの境界線上での修復オペレーションが完了するのを待ってから、次の境界線での修復を開始する。将来の作業では、セグメント修復オペレーションを平行して開始するのを調査するように計画している。未解決の問題は、修復オペレーションによって異なる境界線が相互に干渉し合うのを避ける方法である。
【０２１５】
７  代替設計
SkipNetによって提供される局所特性は、既存のオーバレイネットワーク設計に対する好適な機能拡張によってある程度までは得ることができる。ただし、これらの代替設計の中には、SkipNetの提供しているすべての局所性の利点を提供するものはない。本項では、SkipNetの様々な代替について説明し、これらとSkipNetの手法とを比較する。
【０２１６】
代替設計選択のスペースは、以下の３つのケースに分けることができる。
・オーバレイネットワークをまったく使用せず、代わりに、基礎となるＩＰネットワークおよびＤＮＳ命名の本来の局所特性に依拠する。
・増補された可能性のある単一の既存のオーバレイネットワークを使用して、局所性を提供する。
・メンバノードの異なるセットを広げることで局所性を提供する、複数の既存のオーバレイネットワークを使用する。
【０２１７】
オーバレイネットワークなしで実行する手法を考えてみる。これを正当化する事実の１つは、明示的なコンテンツ配置が、データオブジェクトをノード文字列名とノード関係文字列名との連結として命名すること、すなわち単にノード文字列名をノードのＤＮＳ名とすることからなることである。この手法は、ほとんどの組織がその内部ネットワークをパスローカル方法で構築することから、パス局所性を提供すると言ってもよいであろう。ただし、オーバレイネットワークを廃棄すると、以下を含むその利点もすべて廃棄してしまうことになる。  
・ＤＨＴの暗黙のサポート、およびSkipNetの場合には制約付きロードバランシングのサポート  
・ノード障害発生時の、適切に定義された代替ノードへのトラフィックのシームレスな再割当て  
・マルチキャスト「５、２９、２６」およびロード認識複製［３３］などの、高位レベル抽象化のサポート  
・ＤＮＳサービスの可用性とは無関係で、メッセージを文字列名宛先に直接ルーティングする機能  
ここで、SkipNetの目標を、何らかの方法で増補された可能性のある既存のオーバレイネットワークで達成しようと試みる手法について考える。SkipNetに対するスケーラブルな汎用代替は、Chord、Pastry、およびTapestryなどの、すべてＤＨＴベースの設計である。こうしたオーバレイネットワークは、それらが使用するアドレススペース内で均一のノード分散を得るために、ノードＩＤのランダムな割当てに依存する。
【０２１８】
組織の切断によって、組織にとって重要なデータが組織から分離しないようにしたい場合、明示的なコンテンツ配置は必要な機能である。所与のデータオブジェクトを既存のオーバレイネットワーク内の特定ノード上へ明示的にコンテンツ配置するのをサポートするには、オブジェクトの所望の受取り手であるデータオブジェクトまたはノードのいずれかに関する現在の命名規則を修正することであると想像できる。
【０２１９】
データオブジェクトの名前またはその名前のある部分のハッシュＩＤに直接対応するノードＩＤを選択することによって、明示的なコンテンツ配置を達成するために、ノードに関する命名規則を修正することができる。これによって、各ノードがデータオブジェクトにつきオーバレイを１回接合するように、オーバレイノードを効率良く仮想化する。このスキームには、所与の物理的オーバレイノードに割り当てられた各データオブジェクトに別々のルーティングテーブルが必要であるという欠点がある。単一のノードが数百より多くのデータオブジェクトを格納する必要がある場合、メモリリソースは近年安くなったとは言え、すべてのルーティングテーブルを維持する場合のネットワークトラフィックのオーバヘッドが、ノードのネットワークおよびＣＰＵリソースを圧倒することから、このコストは法外に高くなる。たとえルーティングテーブルを構築するだけでも、かなりの量の追加のネットワークトラフィックが必要となる。
【０２２０】
代わりにデータオブジェクトの命名規則を修正すると、データオブジェクト名が仮想ノード名とそれに続くノード関係名からなる、SkipNetの場合とほとんど同様の２部命名スキームが使用可能である。ノード名を仮想化することにより、どの物理ノードが各仮想ノードに対する責任を負うかを制御することができる。データオブジェクト名をノード名に基づいて束ねることにより、各物理ノード上で単一または少数の仮想ノードのみをサポートすればよい。この方式では、明示的なコンテンツ配置はサポートするが、保証されたパス局所性も、制約付きロードバランシング（フェイルオーバの場合の継続的なコンテンツ局所性も含む）もサポートしない。
【０２２１】
次に、第２の種類の局所性SkipNetが提供するパス局所性について考えてみる。既存のオーバレイネットワークはパス局所性を保証しないが、これを提供するようになることを望む場合がある。具体的に言えばPastryは、ネットワーク近接認識ルーティングをサポートするため、組織ローカルメッセージが主にその組織内を移動すると予測する［４］。ただし、Pastryのネットワーク近接サポートは、オーバレイに接合する場合に「シード」ノードとして使用するための近傍ノードを有することに依存する。近傍ノードが接合するノードと同じ組織内にない場合、Pastryは、保証はもちろんのこと、適切なパス局所性を提供できない場合がある。この問題は、ネットワーク距離に関して遠く離れた複数の別個のノードの「島」からなる組織の場合はさらに悪化する。これに対してSkipNetは、たとえ別個のノードのクラスタからなる組織をまたがる場合であっても、名前ＩＤスペース内で連続している限り、パス局所性を保証することができる。
【０２２２】
Pastryなどの設計では、メッセージにルーティング制約を追加することによって、パス局所性を提供すると想像できる場合があるため、メッセージは所与の組織境界線の外に転送することはできない。こうした制約は、ルーティング制約を侵害する使用法から、ルーティングテーブルエントリを遮断するために使用される。残念なことに、こうした制約は、ルーティングの一貫性も妨げてしまうことになる。すなわち、２つの異なるソースノードから同じ宛先ＩＤに送信されるメッセージは、同じ宛先ノードで終わることが保証されない。
【０２２３】
ここで論じるSkipNetの最後の局所特性は、組織境界線に沿った障害に対する耐性のそれである。この特性はパス局所性に起因するものであるため、代替設計は、パス局所性をサポートするよりもある程度うまくいくはずである。
【０２２４】
ノード名の仮想化に代わる興味ある代替は、オーバレイネットワークの数値ＩＤを長くすること、およびそれらを別々の部分に区分することによって、既存のオーバレイ内の命名規則を修正することであろう。例えば、２部方式では、ノード名は２つの連結したランダムな、均一に分散された固有数値ＩＤからなる。第１の部分はノードＩＤの一部分の関数であり、第２の部分はノードＩＤの残りの部分の関数であってよい。さらにデータオブジェクト名は、数値ＩＤ値および文字列名という２つの部分からなる。数値ＩＤはオーバレイＩＤの第１の部分にマッピングし、文字列名のハッシュは第２の部分にマッピングすることになる。
【０２２５】
その結果、データオブジェクト名の数値ＩＤ部分が、同じ数値ＩＤを共用するすべてのノードによって形成されるＤＨＴを選択し、文字列名部分が、選択されたＤＨＴ内にどのノードをマッピングするかを決定する、静的な形の制約付きロードバランシングとなる。この方式は、明示的なコンテンツ配置も提供するために、ノードの仮想化と組み合わせることができる。この手法の主な欠点は、人間の決定によるオーバレイ作成時に、階層のあらゆる層が数値ＩＤの長さおよび維持しなければならないルーティングテーブルのサイズにおいて追加のコストを負い、階層はSkipNetが提供する相対関数ではなくノードＩＤの絶対関数でなければならず、さらにパス局所性の保証が静的階層内の境界線のみを基準にしたものであるというように、階層の細分性が凍結されることである。より大きなルーティングテーブルを維持しなければならないという文言を代替解釈すると、ルーティングテーブルを維持するために充当できる一定のリソースのまとまり（budget）について、ルーティング性能が低下することになる。
【０２２６】
局所特性をサポートするために単一のＤＨＴベースのオーバレイネットワークを拡張するのが困難であることを考えると、それぞれが異なるセットの参加ノードを含んでいる複数のオーバレイを使用することを考慮してもよい。所望の局所性要求条件を反映するオーバレイネットワークの静的セット、または特定アプリケーションへのノードの参加を反映するオーバレイネットワークの動的セットの、いずれかを定義することができる。
【０２２７】
オーバレイネットワークの静的セットが階層状である場合、ノードは例えば、グローバルオーバレイ、組織全体のオーバレイ、およびおそらくは区分的または建物全体のオーバレイなどの、複数のオーバレイネットワークに属することのオーバヘッドを払わなければならない。これは、各オーバレイ内に、制約付きロードバランシングおよびパス局所性の静的形成を与える。明示的コンテンツ配置は、依然として前述のようにオーバレイ設計の拡張を必要とする。さらに、これでロードバランシングは特定のオーバレイに参加しているそれらのノードに制約される可能性があるが、この方法でロードバランシングされているデータにアクセスしても、そのオーバレイネットワークに属していないクライアントには容易にアクセスできない。従って、例えばデータセンタのマシンをまたがっているデータは、世界全体に対しては使用可能なままになっていても、ロードバランシングはこの手法では不可能である。
【０２２８】
様々なオーバレイに属することに代わるものは、多くのほとんど接合されていないオーバレイを存在させることである。その後、周知のゲートウェイノードを使用して、自分がメンバになっていないオーバレイにルーティングすることができる。ゲートウェイノードの隣接するオーバレイＩＤがバックアップゲートウェイ用に予約された場合、オーバレイルーティングの暗黙的フェイルオーバ意味論を使用して、ゲートウェイノードが障害の単一ポイントになるのを避けることができる。ただしゲートウェイノードは、たとえ障害のポイントでない場合でも輻輳のポイントであり、この手法は、人間がオーバレイネットワークの適切なセットを構成しなければならない前述の問題をこうむる。
【０２２９】
これらの手法は組み合わせることができる。各ノードは、階層の複数レベルでオーバレイネットワークに参加することが可能であり、適切に定義されたゲートウェイを使用して、他のオーバレイ（単なるノードではない）にルーティングすることが可能である。次に、グローバルオーバレイのメンバとしてのその役割、または小規模なオーバレイのメンバとしてのその役割のいずれかで、任意のノードにルーティングすることができる。実際に、この手法は、オーバレイＩＤの連結された部分が階層を介してパス名を定義する、階層型オーバレイネットワークを定義するものである。階層の特定のサブツリーへのゲートウェイノードは、そのサブツリーのパス名接頭部からなる仮想名を有することになる。
【０２３０】
この組み合わせられた手法は、ほとんどSkipNetと同じ局所性意味論を提供することになり、明示的コンテンツ配置、静的な形の制約付きロードバランシング、および各数値ＩＤドメイン内でのパス局所性を提供する。ただし、ドメイン内のルーティングは、ドメイン階層の逐次トラバースを必要とすることになり、階層内で遠く離れた２つのドメインが、それらの間でのルーティング待ち時間の無視できない増加を被ることになることを暗示している。これに対してSkipNetは、明示的コンテンツ配置を提供し、クライアントがどんな所望の名前接頭部範囲を介しても新しいＤＨＴを動的に定義できるようにし、任意の共用名前接頭部内でのパス局所性を保証し、さらに名前接頭部を共用しないソースと宛先との間でのルーティングの際に逐次トラバースペナルティを払うことがない。
【０２３１】
複数オーバレイを含む最終の代替設計は、アプリケーション１つにつき１つのオーバレイネットワークを定義することである。これにより、守らせたい局所性要件をアプリケーションに動的に定義させ、ノードが実際に使用するオーバレイネットワークにのみノードを参加させることができる。ただし、この手法には、静的に定義された複数のオーバレイ手法が明示的コンテンツ配置およびコンテンツの外部可視性に関して被る問題と同じ問題があり、各アプリケーションについて別々のオーバレイを維持する追加コストを負う。これに対して、SkipNetは共用インフラストラクチャを提供するものである。
【０２３２】
８  SkipNetの分析
本項では、SkipNetにおけるオペレーションの様々な特性およびそのコストについて分析する。各サブセクションでは、最初に簡単な直感的説明、続いて主要な結果の概要について述べる。各サブセクションの残りの部分では、結果について正式に証明する。
【０２３３】
８．１  名前ＩＤによる検索
密なSkipNetでの名前ＩＤによる検索には、予想としてＯ（ｌｏｇｋ  Ｎ）ホップが必要であり、疎SkipNetではＯ（ｋ  ｌｏｇｋ  Ｎ）ホップが必要である。さらにこれらの限度（bound）は、高い確率で持続する。（「疎」、「密」、およびパラメータｋの定義については、第５．１項を参照のこと。第３項に記載された基本的なSkipNet設計は、ｋ＝２の疎のSkipNetである。）これらの結果については、定理８．５および定理８．２で正式に証明する。直感的に言えば、スキップリスト検索の場合と同じ理由で、SkipNetでの検索にはこの多くのホップが必要であり、あらゆるノードのポインタがほぼ指数的に分散されているため、宛先までの残りの距離を半分にする何らかのポインタが存在することになる確率が最も高い。密なSkipNetは、およそｋ倍のポインタを維持し、あらゆるホップ上をおよそｋ倍で進行する。
【０２３４】
正式な分析では、第１に疎Ｒ−Ｔａｂｌｅについて考え、その後その分析を密Ｒ−Ｔａｂｌｅに拡張する。検索オペレーションが開始されるノードがソースノードと呼ばれ、検索オペレーションが終了するノードが宛先ノードと呼ばれる、という定義を有することが有用であろう。検索オペレーションは、宛先ノードが見つかるまでノードシーケンスを訪れるが、このシーケンスが検索パスと呼ばれる。１つのノードから次のノードまでの検索パスに沿った各ステップが、ホップと呼ばれる。このサブセクション全体で、ノードのことをその名前ＩＤで呼び、ソースの名前ＩＤをｓで示し、宛先の名前ＩＤをｄで示す。
【０２３５】
ｓが属するリングは、ヘッドのｓですべてのノードに関してスキップリスト構造を誘導する。SkipNetの検索パスを分析するには、スキップリスト検索アルゴリズムが誘導されたスキップリスト上で使用することになるパスを考慮し、次に、SkipNetの検索パスがスキップリストの検索パスより大きくないことを証明する。疎Ｒ−Ｔａｂｌｅを使用して、ＰをｓからｄまでのSkipNet検索パスとする。スキップリスト検索アルゴリズムがノードｓによって誘導されたスキップリストで使用することになるパスをＱとする。どちらの検索パスもｓで始まりｄで終わるものであり、パス内のすべてのノードがｓからｄの間にあることに留意されたい。ＰおよびＱが同一である必要がないことを調べるには、スキップリスト検索パス内でトラバースされるポインタのレベルは増加し続けず、SkipNet検索パス内ではこれが必ずしも真でないことに留意されたい。
【０２３６】
パスＰおよびＱを特徴付けるには、ｘおよびｙの数値ＩＤ内でＦ（ｘ，ｙ）が最も長い共通接頭部を示すようにすることが有用となる。Ｆの定義のすぐ後に以下の役立つ恒等式（ｉｄｅｎｔｉｔｙ）が続く。  
Ｆ（ｘ，ｙ）＝Ｆ（ｙ，ｘ）                                        （１）
Ｆ（ｘ，ｙ）＜Ｆ（ｙ，ｚ）⇒Ｆ（ｘ，ｚ）＝Ｆ（ｘ，ｙ）            （２）
Ｆ（ｘ，ｙ）≦Ｆ（ｙ，ｚ）⇒Ｆ（ｘ，ｚ）≧Ｆ（ｘ，ｙ）            （３）
Ｆ（ｘ，ｙ）＞ｆ、Ｆ（ｘ，ｚ）＞ｆ⇒Ｆ（ｙ，ｚ）＞ｆ              （４）
スキップリスト検索パスＱは、ｄに近いノードほどｓと共有の桁をより多く持たないような、ｓとｄの間のあらゆるノードｘを含む。正式には、Ｑは、Ｆ（ｓ、ｙ）＞Ｆ（ｓ、ｘ）であるように、βｙ∈［ｘ，ｄ］の場合およびその場合のみｘ∈［ｓ，ｄ］を含む。
【０２３７】
SkipNet検索パスＰは、ｄに近いノードほどパス上の前のノードと共有の桁をより多く持たないような、ｓとｄの間のあらゆるノードを含む。これは、ノードを順序正しく指定することによってＰを固有に定義するものであり、ｓに続くノードが固有に定義され、これによって後続のノードが固有に定義されるという具合になる。正式には、βｙ∈［ｘ，ｄ］がＦ（ｗ，ｙ）＞Ｆ（ｗ，ｘ）を満たすように、ｘ∈［ｓ，ｄ］は、ｗの後の最も近いノードである場合およびその場合にのみＰ内でｗの直後に続く。
【０２３８】
補助定理８．１．  疎Ｒ−Ｔａｂｌｅを使用して、ＰをｓからｄまでのSkipNet検索パスとし、Ｑを、誘導されたスキップリスト内でスキップリスト検索アルゴリズムが使用するパスとする。次いで、ＰはＱの後続である。すなわち、SkipNet検索で遭遇するあらゆるノードは、スキップリスト検索でも遭遇する。
【０２３９】
証明：Ｐ内の何らかのノードｘがＱ内には現れないという矛盾を明らかにする目標を想定する。ｘを第１のこうしたノードとする。ｓはＰとＱのどちらにも現れなければならないため、ｘ≠ｓは明らかである。ｗがＰ内でｘの先行者を示すものとすると、ｘ≠ｓであるため、ｘはＰ内の第１のノードではなく、ｗは実際に適切に定義される。ｘはＱではなくＰ内の第１のノードであったことから、ノードｗはＱに属していなければならない。
【０２４０】
第１に、Ｆ（ｓ，ｘ）＞Ｆ（ｓ，ｗ）、すなわちｘがｗよりも多くの桁をｓと共用するケースを考えてみる。これが、ｗがＱ、すなわちスキップリスト検索パス内にない（矛盾）ことを含意していることを明らかにする。もう一度スキップリスト検索パス不変式を参照すると、ｘ∈［ｗ，ｄ］はｙの役割を果たし、それによってｗがＱ内にないことが明らかになる。
【０２４１】
次に、Ｆ（ｓ，ｘ）＝Ｆ（ｓ，ｗ）、すなわちｘがｗと同じ数の桁をｓと共用するケースを考えてみる。これが、ｘがＱ、すなわちスキップリスト検索パス内にある（矛盾）ことを含意していることを明らかにする。もう一度スキップリスト検索パス不変式を参照すると、Ｆ（ｓ，ｙ）＞Ｆ（ｓ，ｗ）であるように、βｙ∈［ｗ，ｄ］である。このケースの仮定Ｆ（ｓ，ｗ）＝Ｆ（ｓ，ｘ）を［ｘ，ｄ］⊂［ｗ，ｄ］と組み合わせると、Ｆ（ｓ，ｙ）＞Ｆ（ｓ，ｘ）であるように、βｙ∈［ｘ，ｄ］であり、従ってｘはＱ内にある。
【０２４２】
最後に、Ｆ（ｓ，ｘ）＜Ｆ（ｓ，ｗ）、すなわちｘがｗよりも少ない桁をｓと共用するケースを考えてみる。これが、ｘがＰ、すなわちSkipNet検索パス内にない（矛盾）ことを含意していることを明らかにする。恒等式２を適用すると、Ｆ（ｓ，ｘ）＝Ｆ（ｗ，ｘ）、すなわちｘがｓと同じ数の桁をｗと共用することが引き出される。ｘがＱ、すなわちスキップリスト検索パス内にないという仮定により、Ｆ（ｓ，ｙ）＞Ｆ（ｓ，ｘ）を満たすｙ∈［ｘ，ｄ］が存在する。Ｆ（ｓ，ｙ）＞Ｆ（ｓ，ｘ）とＦ（ｓ，ｗ）＞Ｆ（ｓ，ｘ）というケース仮定を組み合せ、恒等式４を適用すると、Ｆ（ｗ，ｙ）＞Ｆ（ｓ，ｘ）が引き出される。Ｆ（ｓ，ｘ）＝Ｆ（ｗ，ｘ）であるため、このｙもＦ（ｗ，ｙ）＞Ｆ（ｗ，ｘ）を満たす。これとｙ∈［ｘ，ｄ］を組み合わせると、ｙがｘに関するSkipNet検索パス不変式に反し、ｘがＰ内にないことを含意する。
【０２４３】
補助定理８．１に続くのは、スキップリスト検索パスの長さが、SkipNet検索パスの長さを制限することである。以下の定理では、スキップリスト検索パスを分析することにより、SkipNet検索パスの長さに関する制限を、ソースｓと宛先ｄとの間の距離、Ｄの関数として証明する。この確率の高い結果は、Ｄの任意値に関して保持され、発明者の知る限りでは、スキップリストおよび他のオーバレイネットワークの分析［３１、２７］が、大規模Ｎに関して高い確率で保持される限度を証明するものであることに留意されたい。SkipNetの設計により、Ｄ≪Ｎが一般のケースになると予測する。これをスキップリストまたは他のオーバレイネットワークで予測する根拠はない。
【０２４４】
これはいくつかの標準的な確率分布関数を定義するのに便利である。ｆｎ，１／ｋ（ｇ）を２項分布の分布関数とし、各実験が確率１／ｋで成功した場合、ｆｎ，１／ｋ（ｇ）は、ｎ回の実験後、ｇが確実に成功するとわかる確率である。Ｆｎ，１／ｋ（ｇ）を２項分布の累積分布関数とし、Ｆｎ，１／ｋ（ｇ）は、ｎ回の実験後、多くてｇが成功するとわかる確率である。Ｇｇ，１／ｋ（ｎ）を負の２項分布の累積分布関数とし、Ｇｇ，１／ｋ（ｎ）は、多くてｎ回の実験後、ｇが成功するとわかる確率である。
【０２４５】
以下の２つの恒等式を使用する。
【０２４６】
【数１】
2004266796.tif 000003
【０２４７】
恒等式５は、本発明の累積分布関数、ＦおよびＧの定義の直後に続くものである。恒等式６は、［７、定理６．４］に続くものであり、ここではｋの代わりにαｎ、ｐの代わりに１／ｋ、ｑの代わりに１−１／ｋを使用する。
【０２４８】
定理８．２．  疎Ｒ−Ｔａｂｌｅを使用すると、ソースから距離Ｄだけ離れたノードに到達するための、SkipNet内の検索ホップ予測数は、
Ｏ（ｋ  ｌｏｇｋ  Ｄ）
である。より精密には、定数
【０２４９】
【数２】
2004266796.tif 000004
【０２５０】
およびｔ０＝９が存在し、その結果検索には、ｔ≧ｔ０の場合に、少なくとも
【０２５１】
【数３】
2004266796.tif 000005
【０２５２】
の確率で（tk logk D+t2k）を決して超えないホップが必要である。
【０２５３】
証明：補助定理８．１により、これでスキップリスト検索パス内のホップ数の上限には十分であり、証明の残り部分については、スキップリスト検索パスに焦点を当てる。ｇがｔ＋ｌｏｇｋ  Ｄとなるように定義する。Ｘを、スキップリスト検索パス内でトラバースされる最大レベルを与えるランダム変数とする。ここで、Ｐｒ［Ｘ≧ｇ］が小さいことを明らかにする。所与のノードがｇまたはより多くの数でｓに一致する確率が１／ｋｇであることに留意されたい。単一の合併限度（union bound）により、ｓとｄの間の任意のノードがｇまたはより多くの数でｓに一致する確率はＤ／ｋ２である。従って、
【０２５４】
【数４】
2004266796.tif 000006
【０２５５】
となる。
【０２５６】
Ｙを、スキップリスト検索パス内でトラバースされるホップ数を与えるランダム変数とし、ｍがｔｋｇとなるように、すなわちm=(tk logk D+t2k)となるように定義する。Ｙがｍより多いホップを必要とする確率の上限を、以下の式を介して制限する。  
Ｐｒ［Ｙ＞ｍ］＝  Ｐｒ［Ｙ＞ｍおよびＸ＜ｇ］
＋Ｐｒ［Ｙ＞ｍおよびＸ≧ｇ］
≦  Ｐｒ［Ｙ＞ｍおよびＸ＜ｇ］
＋Ｐｒ［Ｘ≧ｇ］
これでは、検索がレベルｇポインタをトラバースせずにｍより多いホップを必要とする確率が小さいことがまだ明らかにされていない。従来のスキップリスト分析［２４］は、負の２項分布を使用して、Pr[Y>mおよびX<g]≦1-Gg,1/k(m)を示す、この確率の上限を制限する。恒等式５を使用すると、1-Gg,1/k(m)=Fm,1/k(g-1)が得られる。α＝１／ｔｋと設定し、恒等式６を適用すると、以下の上限が与えられる。
【０２５７】
【数５】
2004266796.tif 000007
【０２５８】
ｔおよびｋがどちらも少なくとも２であるため、
【０２５９】
【数６】
2004266796.tif 000008
【０２６０】
は多くても２であることに留意されたい。これにより、Ｆｍ，１／ｋ（ｇ−１）が
【０２６１】
【数７】
2004266796.tif 000009
【０２６２】
より小さいことがわかる。
ｔ≧９の場合、-t+log t+2<-t/2<0が得られ、ｅ（−ｔ＋ｌｏｇ ｔ＋２）ｇ＜ｅ−ｔ／２となる。従って、
Ｆｍ，１／ｋ（ｇ）＜２ｅ−ｔ／２
である。
これらの結果を組み合わせ、
【０２６３】
【数８】
2004266796.tif 000010
【０２６４】
とすると、
【０２６５】
【数９】
2004266796.tif 000011
【０２６６】
となる。
【０２６７】
ｔ０＝９と設定し、ｔ≧ｔ０の場合、
【０２６８】
【数１０】
2004266796.tif 000012
【０２６９】
が得られる。すなわち、
【０２７０】
【数１１】
2004266796.tif 000013
【０２７１】
である。期待値限度は簡単に得られる。
【０２７２】
次に、SkipNetでの密Ｒ−Ｔａｂｌｅを使用した名前ＩＤによる検索のケースについて考えてみる。密Ｒ−Ｔａｂｌｅが、各レベルで各方向の、ｋ−１の最も近い隣接を指すことを想起されたい。「密スキップリスト」を作成するのと同じ手法が使用できるが、スキップリストでは、比較は典型的にはホップよりも費用がかかるため、こうした構造は有用でないことに留意されたい。スキップリストと言う場合は、常に疎のスキップリストのことである。Ｐを、密Ｒ−Ｔａｂｌｅを備えたSkipNet検索パスとなるように定義し、前述のように、Ｑを、誘導されたスキップリスト内でスキップリスト検索アルゴリズムが使用するパスとする。
【０２７３】
パスＰを特徴付けるには、Ｇ（ｘ，ｙ，ｈ）が、レベルｈで両方を含むリング内のノードｘとｙの間のホップ数であることを示すようにすると有用である。ｈ＞Ｆ（ｘ，ｙ）（すなわち、ノードｘおよびｙがレベルｈで同じリング内にないことを意味する）の場合、Ｇ（ｘ，ｙ，ｈ）＝∞と定義する。Ｇ（ｘ，ｙ，ｈ）＜ｋの場合およびその場合にのみ、ノードｘはレベルｈのノードｙを指すポインタを有することに留意されたい。SkipNet検索パス上の各中間ノードで、宛先を越えることなく、宛先にできるだけ近づかせるポインタを使用してホップする。正式な特徴付けでは、ｘ＜ｙ≦ｄおよびＧ（ｗ，ｙ，ｈ）＜ｋとなるように、ｘ∈［ｓ，ｄ］は、Ｇ（ｗ，ｘ，Ｆ（ｗ，ｘ））＜ｋおよびβｙ，ｈの場合およびその場合にのみ、Ｐ内でｗの直後に続く。
【０２７４】
補助定理８．３．  Ｐを密Ｒ−Ｔａｂｌｅを備えたSkipNet検索パスとし、Ｑを、誘導されたスキップリスト内でスキップリスト検索アルゴリズムが使用するパスとする。次いで、ＰはＱの後続である。
【０２７５】
証明：証明は、補助定理８．１の証明の場合と同じ量を定義することで始まる。Ｐ内の何らかのノードｘがＱ内には現れないという矛盾を明らかにする目標を想定する。ｘを第１のこうしたノードとし、ｓはＰとＱのどちらにも現れなければならないため、ｘ≠ｓは明らかである。ｗがＰ内でｘの先行者を示すものとすると、ｘ≠ｓであるため、ｘはＰ内の第１のノードではなく、ｗは実際に適切に定義される。ｘはＱではなくＰ内の第１のノードであったことから、ノードｗはＱに属していなければならない。
【０２７６】
Ｆ（ｓ，ｘ）＞Ｆ（ｓ，ｗ）、Ｆ（ｓ，ｘ）＝Ｆ（ｓ，ｗ）、およびＦ（ｓ，ｘ）＜Ｆ（ｓ，ｗ）の、３つのケースについて別々に考えてみる。最初の２つは、SkipNet検索パスとは関係なく、補助定理８．１の証明にある矛盾を導くことが明らかになっており、従って、Ｆ（ｓ，ｘ）＜Ｆ（ｓ，ｗ）のケースについての考察のみが残されている。
【０２７７】
ｌ＝Ｇ（ｗ，ｘ，Ｆ（ｗ，ｘ））を、ｗとｘをどちらも含む最高位リング内でのｗとｘの間のホップ数とする。ｘ∈Ｐであるので、（密SkipNet検索パスの特徴付けから）ｌ＜ｋを得る必要がある。
【０２７８】
【数１２】
2004266796.tif 000014
【０２７９】
であるので、（スキップリスト検索パスの特徴付けから）Ｆ（ｓ，ｙ）＞Ｆ（ｓ，ｘ）となるように、ｙ∈［ｘ，ｄ］が存在しなければならない。ｗ∈Ｑおよびｙ∈［ｗ，ｄ］であるので、これはＦ（ｓ，ｙ）＞Ｆ（ｓ，ｗ）のケースにはならず、そうでない場合は、ｗ∈Ｑという事実と矛盾することになる（再度スキップリスト検索パスの特徴づけを使用する）。従って、Ｆ（ｓ，ｙ）≦Ｆ（ｓ，ｗ）となり、恒等式３がＦ（ｗ，ｙ）≧Ｆ（ｓ，ｙ）を引き出す。恒等式２をＦ（ｓ，ｘ）＜Ｆ（ｓ，ｗ）（ケース仮定）に適用することは、Ｆ（ｗ，ｘ）＝Ｆ（ｓ，ｘ）を含意する。不等式をまとめると、Ｆ（ｗ，ｙ）≧Ｆ（ｓ，ｙ）＞Ｆ（ｓ，ｘ）＝Ｆ（ｗ，ｘ）となる。矛盾を導出するために、この結論Ｆ（ｗ，ｙ）＝Ｆ（ｗ，ｘ）を残りの証明で適用する。
【０２８０】
レベルＦ（ｗ，ｙ）でｗを含むリングについて考えてみる。ノードｙはこのリング内になければならないが、Ｆ（ｗ，ｙ）＞Ｆ（ｗ，ｘ）であるため、ノードｘはそれができない。ｗから始まり、ｘ＜ｚ（ｘの右側）でこのリング上の最初のノードであるｚに遭遇するまでこのリングをトラバースすると考えてみる。こうしたノードｚは、ｙがこのリング内にあり、ｘ＜ｙであるため、存在しなければならない。ｘ＜ｚ≦ｙ≦ｄであることに留意されたい。
【０２８１】
レベルＦ（ｗ，ｙ）のこのリングは、レベルＦ（ｗ，ｘ）のリングの厳密なサブセットである（具体的に言えば、ｘはその中にない）ため、ｗからｚまでトラバースするためには多くてもｌ＜ｋのホップを必要とする。これで、ｘ＜ｚ≦ｄおよびＧ（ｗ，ｚ，Ｆ（ｗ，ｙ））＜ｋが得られ、これはｘ∈Ｑという事実に矛盾する。
【０２８２】
補助定理８．４．  密Ｒ−Ｔａｂｌｅを使用して、ＰをｓからｄまでのSkipNet検索パスとする。Ｑを、誘導されたスキップリスト内のｓからｄまでの検索パスとする。ｍをパスＱに沿ったホップ数とし、ｇをパスＱ上でトラバースされるポインタの最高レベルとする。パスＰ上で必要とされるホップ数は、多くとも
【０２８３】
【数１３】
2004266796.tif 000015
【０２８４】
である。
【０２８５】
証明：Ｑ＝（ｓ，ｑ１，．．．，ｑｍ）をパスＱ上のノードのシーケンスとし、ここでｑｍ＝ｄである。ｇの選択により、すべてｉ≧１の場合、Ｆ（ｓ，ｑｉ）≦ｇである。従って、ｑｉノードは、Ｆ（ｓ，ｑｉ）の値に従ったレベルに区分される。Ｑがスキップリスト検索パスであるため、Ｆ（ｓ，ｑｉ）はｉと共に増加し続けないことを想起されたい。従って、各区分内のノードは、パスＱ上で連続している。
【０２８６】
Ｐがｑｉを含むと想定する。密Ｒ−Ｔａｂｌｅを使用すると、スキップリストパス内のレベルＦ（ｓ，ｑｉ）で多くともｋ−１ホップ離れた任意のノードへ１ホップ進むことは可能である。従って、Ｐ内のレベルｉにｌｉのノードがある場合、Ｑは多くとも［ｌｉ／（ｋ−１）］のそれらのノードを含む。すべてのレベルにわたって合計すると、Ｑは多くとも
【０２８７】
【数１４】
2004266796.tif 000016
【０２８８】
のノードを含む。
【０２８９】
定理８．５．  密Ｒ−Ｔａｂｌｅを使用すると、ソースから距離Ｄだけ離れたノードに到達するための、SkipNet内の検索ホップ予測数は、
Ｏ（ｌｏｇｋ  Ｄ）
である。より精密には、定数
【０２９０】
【数１５】
2004266796.tif 000017
【０２９１】
およびｔ０＝９、さらにｔ≧ｔ０の場合、検索は少なくとも
【０２９２】
【数１６】
2004266796.tif 000018
【０２９３】
の確率で、多くとも(2t+1)logk D+2t2+t+1のホップで完了する。
証明：定理８．２の証明の場合と同様に、少なくとも
【０２９４】
【数１７】
2004266796.tif 000019
【０２９５】
の確率で、スキップリスト検索パス内のレベル数は、多くともg=t+logk Dであり、ホップ数は、多くともm=tkg=(tk logk D+t2k)である。補助定理８．４を適用すると、密SkipNet検索パス内のホップ数は
【０２９６】
【数１８】
2004266796.tif 000020
【０２９７】
である。
【０２９８】
８．２  SkipNetとトライとの間の対応関係
SkipNetのポインタは、効率良くあらゆるノードをノードの名前ＩＤによって順序付けられたスキップリストのヘッドにする。同時に、あらゆるノードは、ノードの数値ＩＤ上のトライのルートでもある［１０］。従って、SkipNetは２つの別個のデータ構造を単一の構造内で同時に実施する。１つの含意は、トライ分析を再使用して、SkipNetノードの疎Ｒ−Ｔａｂｌｅ内での予測される非ｎｕｌｌポインタ数を決定することができるということである。これは、Ｎ個のノードおよびパラメータｐを備えたスキップリスト予測高さは、均一な［０，１］分布から引き出されたＮ＋１個のキーを備えた
【０２９９】
【数１９】
2004266796.tif 000021
【０３００】
に帰属するトライの予測高さに正確に対応する、という［２２、ｐｐ．３８］のＰａｐａｄａｋｉｓによる、スキップリストおよびトライを関連付ける以前の研究を拡張するものである。
【０３０１】
SkipNet内のリングメンバシップは、ｉ≧０の場合、２つのノードが、それらの数値ＩＤの第１のｉ桁が正確に一致すればレベルｉで同じリングに属する、というように決定されることを想起されたい。すべてのノードは、レベル０で１つのリングに属し、これがルートリングと呼ばれる。２つのノードがレベルｉ＞０のリングＲに属する場合、それらはレベルｉ―１の同じリングにも属していなければならず、これはリングＲの親リングと呼ばれることに留意されたい。さらに、レベルｉ≧０のあらゆるリングＲは、レベルｉ＋１の多くともｋの接合していないリングに区分され、これはリングＲの子リングと呼ばれる。従って、リングは本来、ルートリングに根付いているリングツリーを形成する。
【０３０２】
リングツリーを考えると、トライは以下のように構築することができる。第１に、親リングが単一のノードを含んでいるすべてのリングを除去し、これによって単一のノードしか含んでいないトライのどんなサブツリーも隠れることになる。単一のノードを含む残りのあらゆるリングはリーフリングと呼ばれ、リーフリングは、その単一ノードの数値ＩＤでラベル表示される。結果としてリング上に生じる構造が、SkipNet内のノードのすべての数値ＩＤを含むトライである。
【０３０３】
ＹＮを、Ｎ個のノードを含むSkipNet内の特定ノードでの非ｎｕｌｌの右の（同様な意味で左の）ポインタの数を示す、ランダム変数とする。Papadakisは、ＤＮを、均一な［０，１］分布から引き出されたキーを備えたｋに帰属するトライ内のノード深さを与えるランダム変数とする。ＹＮは、上記で構築されたトライ内のノードの数値ＩＤの深さを与えるランダム変数と同一であり、従って、ＹＮ＝ＤＮが得られることに留意されたい。
【０３０４】
この対応関係およびPapadakisの分析を使用して、
【０３０５】
【数２０】
2004266796.tif 000022
【０３０６】
を明らかにすることが可能であり、上式で、
【０３０７】
【数２１】
2004266796.tif 000023
【０３０８】
は（［１７］で定義されるように）
【０３０９】
【数２２】
2004266796.tif 000024
となる。
【０３１０】
Ｋｎｕｔｈは、［１７、例６．３．１９］で、
【０３１１】
【数２３】
2004266796.tif 000025
【０３１２】
であることを証明しており、従って右の（同様な意味で左の）非ｎｕｌｌポインタの予測数は、Ｅ［ＹＮ］＝ｌｏｇｋ  Ｎ＋Ｏ（１）によって与えられる。
【０３１３】
８．３  数値ＩＤによる検索
SkipNetは、数値ＩＤによる検索ならびに名前ＩＤによる検索をサポートする。密なSkipNetにおける数値ＩＤによる検索は、予測ではＯ（ｌｏｇｋ  Ｎ）ホップが必要であり、疎SkipNetではＯ（ｋ  ｌｏｇｋ  Ｎ）が必要である。直感的に言えば、数値ＩＤによる検索は１回に桁１を訂正し、多くともＯ（ｌｏｇｋ  Ｎ）桁を訂正する必要がある。疎SkipNetでは、単一の桁を訂正するにはおよそＯ（ｋ）ホップが必要であるのに対して、密な場合はＯ（１）ホップしか必要としない。
【０３１４】
定理８．６．  疎Ｒ−Ｔａｂｌｅを使用した数値ＩＤによる検索で予測されるホップ数はＯ（ｋ  ｌｏｇｋ  Ｎ）である。密Ｒ−Ｔａｂｌｅでは、ホップの予測数はＯ（ｌｏｇｋ  Ｎ）である。さらに、これらの限度は高い確率で保持される（すなわち、ホップ数は予測数に近い）。
【０３１５】
証明：以下のように定理８．２の証明と同じ上限を使用し、
Ｐｒ［検索はｍより多くのホップを必要とする］
≦Ｐｒ［ｍより多くのホップおよび多くともｇレベル］
＋Ｐｒ［ｇより多くのレベル］
【０３１６】
２つの項を別々に制限する。定理８．２では、１つのノードを固有に識別するのに必要な最大桁数は、高い確率でｇ＝Ｏ（ｌｏｇｋ  Ｎ）であり、従ってこの多くのレベルより上にあがるために、数値ＩＤによる検索は必要でない。これが右側の項の上限を決める。疎Ｒ−Ｔａｂｌｅの任意の所与のレベルで次の一致する桁が見つかるまでに必要なホップ数は、パラメータ１／ｋを備えた幾何ランダム変数によって上限が決められる。これらのランダム変数のｇの合計は予測値ｇｋを有し、このランダム変数は高い確率でその予測値に近い（標準的な議論（ａｒｇｕｍｅｎｔ）による）。従って疎Ｒ−Ｔａｂｌｅを使用した数値ＩＤによる検索におけるホップの予測数は、Ｏ（ｋ  ｌｏｇｋ  Ｎ）であり、さらにこの限度は高い確率で保持される。
【０３１７】
密Ｒ−Ｔａｂｌｅを使用した数値ＩＤによる検索の場合、任意の所与のレベル上で必要なホップ数の上限は、別々に決める。略式では、確率１／ｋで繰り返し成功する１つの実験を実行する代わりに、こうした実験をｋ−１回同時に実行する。正式には、１つのホップ内で一致する桁を見つける確率は、これで１−（１−１／ｋ）ｋ−１≧１／２となる。従って、疎Ｒ−Ｔａｂｌｅのケースでの分析は、パラメータ１／ｋを１／２に置き換えることによって修正するだけでよい。従って、密Ｒ−Ｔａｂｌｅを使用した数値ＩＤによる検索で予測されるホップ数は、Ｏ（ｌｏｇｋ  Ｎ）であり、さらにこの限度は高い確率で保持される。
【０３１８】
８．４  ノードの接合および離脱
次に、前の項からの名前ＩＤによる検索および数値ＩＤによる検索の両方の分析を使用して、ノードの接合および離脱オペレーションを分析する。第３．５で述べたように、ノード接合は数値ＩＤによる検索を使用し、その後名前ＩＤによる検索を使用して実施することが可能であり、疎または密のどちらのSkipNetでもＯ（ｋ  ｌｏｇｋ  Ｎ）ホップが必要となる。ノード離脱の実施も簡単であり、第３．５項で述べたように、離脱ノードに必要なのは、あらゆるレベルでその右および左の隣接に離れることを通知するだけであり、離脱ノードの左および右の隣接は互いを指すものとする。これにより、疎SkipNetの場合はＯ（ｌｏｇｋ  Ｎ）ホップ、密SkipNetの場合はＯ（ｋ  ｌｏｇｋ  Ｎ）の限度が得られ、ここでホップはメッセージによってトラバースされるホップの合計数を示すが、これは、これらのメッセージが平行に送信できるためである。
【０３１９】
定理８．７．  ノード接合オペレーションによって要求されるホップ数は、予測ではＯ（ｋ  ｌｏｇｋ  Ｎ）であり、疎または密のどちらのSkipNetでも高い確率である。
【０３２０】
証明：接合オペレーションは、数値ＩＤによる検索、およびその後の名前ＩＤによるスキップリスト検索に分解することが可能である。そのため、ホップ数の限度は、定理８．２および８．６に即時に従う。これで後は、接合オペレーションが接合するノードのすべての必要な隣接を見つけることを確立するだけである。
【０３２１】
疎SkipNetの場合、接合するノードは、名前ＩＤの順で右に最も近いかまたは左に最も近い、数値ＩＤが各レベルｈでｈ個の桁で一致するノードを指すポインタを必要とする。密SkipNetの場合、接合ノードは疎SkipNetの場合と同じノードを見つけて、その後各レベルでｋ−２の追加隣接に通知しなければならない。
【０３２２】
接合オペレーションは、接合ノードと共有の最も多い数値ＩＤ桁を備えたノードの検索で始まる。接合ノードに関する名前ＩＤによる検索オペレーションは、このノードで始まり、名前ＩＤによるスキップリスト検索として実施され、通常の名前ＩＤによるSkipNet検索とは対照的に、トラバースされるポインタは高さが減少を続ける。スキップリスト検索パスがレベルを下げる場合は必ず、レベルｈでの現在のノードが接合ノードを超えたノードを指すためである。従って、スキップリスト検索パス上のレベルｈでのこの最後のノードは、ｈ桁で接合ノードに一致する最も近いノードである。これにより、一方の側でのレベルｈの隣接が与えられ、他方の側での接合ノードのレベルｈの隣接は、そのノードの以前の隣接である。スキップリスト検索パスをトラバースするメッセージは、接合ノードまでの道のりでのすべての必要な隣接に関するこの情報を累積する。これにより、接合オペレーションの正確さが確立される。
【０３２３】
８．５  ノードストレス
次に、Ｒ−Ｔａｂｌｅを使用して名前ＩＤによる検索を実行する場合の、負荷の分散を分析する。ルーティング負荷を分析するには、ルーティングトラフィックの何らかの分散を想定しなければならない。すべてのルーティングトラフィックのソースと宛先の両方の分布が一様であると仮定する。何らかのルーティングアルゴリズム（偶然にパス局所性を保持していない）の下では、ルーティング負荷の分散は明らかに均一である。例えば、ルーティングトラフィックが常に右側にルーティングされる場合、負荷は均一になる。ソースおよび宛先の名前ＩＤが共通の接頭部を共用していない場合、パス局所性は問題ではなく、SkipNetルーティングアルゴリズムはルーティングの方向をランダムに選択することが可能であり、こうしたトラフィックは均一に分散される。
【０３２４】
SkipNetルーティングアルゴリズムがパス局所性を保持できる場合は、常に宛先の方向にルーティングすることによってこれを実行する（すなわち、宛先がソースの右側の場合は、ルーティングが右方向に進行する）。この場合にはほぼ負荷のバランスがとられ、ごくわずかなノードの負荷は平均負荷よりもかなり少なくなることを明らかにする。ノードの負荷が高い確率で一定の係数より多く平均負荷を超えることはないことも明らかにするが、この結果は、ルーティングアルゴリズムがパス局所性を保持しているか否かに関連する。わかりやすくするために、本発明の証明ではｋ＝２と想定するが、任意のｋでも同様の結果が得られる。また以前に、距離ｄの２つのノード間のホップ数に関して、Ｏ（ｌｏｇ  ｄ）の上限を与えた。平均負荷を推定するために、証明なしでθ（ｌｏｇ  ｄ）の緊密な限度を想定する。
【０３２５】
定理８．８．  Ｎ個のノードを含むパス局所性を保持する間隔を考えてみる。次に、間隔のｕ番目のノードは、予測で
【０３２６】
【数２４】
2004266796.tif 000026
【０３２７】
分数の平均負荷を負う。
【０３２８】
証明：第１に、特定のソースｌと宛先ｒとの間でのトラフィックのルーティングのためにノードｕ上で予測される負荷を確立する。検索パスは、何らかのｈの場合、ｌおよびｕの数値ＩＤが長さｈの共通の接頭部を有するが、ｕとｒとの間のノードはそれよりも長いｌとの共通の接頭部を有することのない場合に、ｕのみに遭遇する可能性がある。あらゆるノードの数値ＩＤの桁のランダム選択が独立していることに注目し、検索がｕに遭遇する確率に関して以下の上限を得るために、ｈにわたって合併限度を適用する。ｕからｒまでの距離はｄで表す。
【０３２９】
【数２５】
2004266796.tif 000027
【０３３０】
上記の合計における項はＨ（ｈ）で表す。ｈが１ずつ増加する場合、Ｈ（ｈ）は多くとも２分の１ずつ減少するので、合計の上限は
【０３３１】
【数２６】
2004266796.tif 000028
【０３３２】
を使用して決定することができる。
【０３３３】
変数
【０３３４】
【数２７】
2004266796.tif 000029
【０３３５】
を
【０３３６】
【数２８】
2004266796.tif 000030
【０３３７】
に変更し、以下を得る。
【０３３８】
【数２９】
2004266796.tif 000031
【０３３９】
これで、単一のソース／宛先ペアの分析が完了する。同様の単一ペアの分析は、［１］でも記載された。すべてのソース／宛先ペアを考えることで、本発明の定理を完了する。
【０３４０】
ノードの平均負荷に関する限度は、ソース／宛先ペアの合計数に検索ホップの限度を掛け、ノードの合計数で割ることによって与えられる。ｕを通過するすべてのルーティングトラフィックを合計し、平均負荷で割ることにより、ｕが負う平均負荷の割合が得られる。一定の係数の範囲内にするためには、以下のようになる。
【０３４１】
【数３０】
2004266796.tif 000032
【０３４２】
推論８．９．  θ（α・平均負荷）より少ない予測負荷を伴うノード数はＮαである。
【０３４３】
証明：定理８．８を適用すると、
【０３４４】
【数３１】
2004266796.tif 000033
【０３４５】
となることに留意されたい。
【０３４６】
これで、パス局所性が存在する状態で、わずかなノードが平均ノードよりもかなり少ない作業を実行すると予測されることを明らかにする分析は完了する。次の定理は、任意のノードが平均負荷の一定倍を超える負荷を負うことになる可能性は非常に低いことを明らかにするものであり、この分析は、ルーティングポリシーがパス局所性を維持しているか否かに関連する。
【０３４７】
定理８．１０．  高い確率で、平均負荷の一定倍を超える負荷を負うノードはない。
【０３４８】
証明：任意のノードｕを考えてみる。ｕの左側には多くともＮ個のノード、右側には多くとのＮ個のノードがある。以前の定理の場合と同様に、ｌおよびｒはそれぞれｕの左側および右側のノードを示す。次に、スキップリストのｌからｒへのパス（その後にSkipNetのパスが続く）は、ｌおよびｕは厳密にｈビットを共用するが、ｕとｒの間には厳密にｈビットをｕと共用するノードがないような何らかのｈがある場合にのみ、ｕに遭遇する。ルーティングトラフィックが左から右へのみ通過すると考えると、限度に多くとも２倍の影響を与える。
【０３４９】
Ｌｈを、ｕと厳密にｈビットを共用するｌの数を示すランダム変数とする。Ｒｈを、ｕとｒの間にｕと厳密にｈビットを共用するノードがないようなｒの数を示すものとする。（ｒがｕと厳密にｈビットを共用する場合、ｌとはｈより多くのビットを共用するはずであり、従ってｌからｒへのルーティングトラフィックはｕを通過しないことに留意されたい。）前の段落での分析は、ｕにかかる負荷が厳密にΣｈＬｈＲｈであることを含意している。この数量が高い確率でＯ（Ｎ  ｌｏｇ  Ｎ）であることを明らかにしたい。
【０３５０】
ランダム変数Ｌｈはパラメータ１／２ｈ＋１の２項分布を有する。この考えから、標準的な議論（本項の前述の証明で明白にした）では、ＬｈはＮ／２ｈ＋１の予測値を有し、ｈ∈［０，ｌｏｇ  Ｎ−ｌｏｇ  ｌｏｇ  Ｎ］の場合、高い確率でＬｈ＝Ｏ（Ｎ／２ｈ＋１）であることが明らかである。ｕとｌｏｇ  Ｎ−ｌｏｇ  ｌｏｇ  Ｎビットよりも多くを共用するｌの数は、予測ではｌｏｇ  Ｎであり、高い確率でＯ（ｌｏｇ  Ｎ）であって、これらのｌ（そのｕとの共通ビット数は制限しない）は、最終合計に多くともＯ（Ｎ  ｌｏｇ  Ｎ）を寄与することができる。
【０３５１】
ランダム変数Ｒｈを分析するために、Ｒｈを確率的に支配する新しいランダム変数
【０３５２】
【数３２】
2004266796.tif 000034
【０３５３】
を導入する。具体的に言えば、
【０３５４】
【数３３】
2004266796.tif 000035
【０３５５】
を、ｕから、厳密にｈビットでｕに一致するノード
【０３５６】
【数３４】
2004266796.tif 000036
【０３５７】
後の最初のノードまでの距離とする。さらに、
【０３５８】
【数３５】
2004266796.tif 000037
【０３５９】
とする。繰り返し
【０３６０】
【数３６】
2004266796.tif 000038
【０３６１】
を使用して、追加のランダム変数Ｙｈを定義する。Ｙｈは互いに完全に独立しており、ＹｈはＹｈ−１を決定するノード後のノードのランダムビット選択にのみ依存する。
【０３６２】
ランダム変数Ｙｈは、パラメータ１／２ｈ＋１の幾何ランダム変数として分布している（さらに上限はＮに決められている）。制限したい数量を、以下のように書き直す。
【０３６３】
【数３７】
2004266796.tif 000039
【０３６４】
Ｎ／２ｈ＋１が幾何級数を形成することを使用して、以下の上限を適用する。
【０３６５】
【数３８】
2004266796.tif 000040
【０３６６】
ΣｈＬｈＲｈが、Ｏ（Ｎ  ｌｏｇ  Ｎ）に、独立したランダム変数（わずかに少ない）ｌｏｇ  Ｎの合計を加えたものと等しいことが得られ、ここでｈ番目のランダム変数は、パラメータ１／２ｈの幾何ランダム変数にＯ（Ｎ／２ｈ）を掛けたと同様に分布され、従って予測値Ｏ（Ｎ）を有する。これにより、高い確率で限度Ｏ（Ｎ  ｌｏｇ  Ｎ）が得られる。
【０３６７】
８．６  仮想ノード分析
第５．５項で、単一の物理ノードが複数の可能ノードをホストする場合に使用できるスキームについて概説した。このスキームを使用すると、検索ホップの限度には影響を与えず、物理ノードあたりのポインタ数は密な場合でＯ（ｋ  ｌｏｇｋ  Ｎ＋ｋｖ）のみであって、この式でｖは仮想ノードの数である。疎な場合、ポインタ数はＯ（ｌｏｇｋ  Ｎ＋ｖ）のみである。
【０３６８】
直感的に言えば、これが、第１のノードの後のノードが高さＯ（ｌｏｇｋ  Ｎ）を有するという要件を緩和することによって得られる。代わりに、ノード高さがスキップリスト内にあるときに、ランダムに分布できるようにする。スキップリストノードは、予測では一定数のポインタを維持するため、密な場合には仮想ノードあたりＯ（ｋ）のポインタのみを追加し、疎な場合にはＯ（１）を追加する。検索は、スキップリスト内の場合とまったく同様に効率的なままである。
【０３６９】
定理８．１１．  第５．５項のスキームを使用してｖ個の仮想ノードをサポートする、単一の物理ノードを考えてみる。密な場合、検索にはＯ（ｌｏｇｋ  Ｄ）のホップが必要であり、ポインタ数はＯ（ｋ  ｌｏｇｋ  Ｎ＋ｋｖ）である。疎な場合、検索にはＯ（ｋ  ｌｏｇｋ  Ｄ）のホップが必要であり、ポインタ数はＯ（ｌｏｇｋ  Ｎ＋ｖ）である。これらの限度は、すべて予測および高い確率で保持される。
【０３７０】
証明：ポインタ数に関する限度は構造体によるものである。疎な場合を考えてみる。限度の先行項であるＯ（ｌｏｇｋ  Ｎ）は、すべてのSkipNetポインタが与えられた１つの仮想ノードによるものである。追加の仮想ノードの高さは、パラメータ１／２の幾何ランダム変数によって与えられ、これは予測ではＯ（１）である。その直後にポインタ数に関する要求された限度が続き、追加の係数ｋを備えた同一の議論により密な場合が続く。
【０３７１】
次に、第１に疎な場合に焦点を当てながら、検索ホップ数を分析する。全高さを持たない仮想ノードから検索を開始し、２つの段階に分けて分析していく。第１段階では、検索パスはレベルが増加するポインタを使用する。ある地点で、最高位のポインタが宛先を越えるノードに遭遇する。この地点以降（第２段階）は、このノードから開始する宛先へのスキップリスト検索パスを考えてみる。定理８．２の場合と同様に、実際の検索パスの残りの部分はこのスキップリストパスの続きとなる。
【０３７２】
定理８．２の場合と同様に、このＤ個のノードの間隔にある任意のポインタの最高レベルは、高い確率でＯ（ｌｏｇｋ  Ｄ）である。何らかの特定ノードｔは最初に遭遇したノードであり、そのノードの最高位ポインタは宛先を越えた向こうを指していると想定する。この場合、第１段階は厳密に、ｔの数値ＩＤに関する数値ＩＤによる検索であり、従って、ホップ数に関する定理８．６の高い確率の限度が適用される。第２段階は、ｔからｄまでの検索であり、ホップ数に関する定理８．２の高い確率の限度が適用される。この第２の議論には微妙な違いがあり、一部またはすべての中間ノードは仮想であってもよいが、実際の検索パスは、必然的にｔによって誘導されたスキップリスト内の検索パスのサブセットである（補助定理８．１および補助定理８．３の議論による）。以前に、ｔは固定されていると想定したが、これは、ｔには多くてもＤの可能性があり、こうした可能性はすべて、Ｏ（ｋ  ｌｏｇｋ  Ｄ）ホップの多くてもＤ倍より多くを要求する可能性を増加させると考えるからである。初期に限度が高い確率で保持されるため、この限度を超える可能性は引き続きごくわずかである。
【０３７３】
これにより、疎な場合の結果が得られる。同じ議論が密な場合にも保持される。
【０３７４】
８．７  リングマージ
次に、第６項で述べたように、接合していないSkipNetセグメントをマージするための事前対応型アルゴリズムの性能を分析する。Ｍ個のノードを含む単一のSkipNetセグメントの、Ｎ個のノードを含む大規模なSkipNetセグメントとのマージを考えてみる。わかりやすくするために、考察ではｋ＝２であると想定し、同様の分析を任意のｋに適用する。マージされたSkipNet内のリングの予測最大レベルは、高い確率でＯ（ｌｏｇ  Ｎ）である（第８．２項）ことを想起されたい。直感的に言えば、所与のレベルで、そのレベルに到達した後にリングを修復するための予測時間はＯ（１）であり、リングの修復は、所与のレベルのすべてのリングにまたがって平行に発生する。これは、マージオペレーションを実行するのに必要な予測時間がＯ（ｌｏｇ  Ｎ）であることを示唆するものであり、これについては、基礎となるネットワークが修復トラフィックの無制限の並列化に対処するという想定の下で、定理８．１２で正式に明らかにする。実際には、ネットワークの帯域幅は制限を加える場合があり、多くの修復を平行して実行すると、ネットワークを飽和させ、より多くの時間がかかる可能性がある。
【０３７５】
マージが必要とする作業の予測量は、Ｏ（Ｍ  ｌｏｇ（Ｎ／Ｍ））＝Ｏ（Ｎ）である。これに対して、第１に直感的な正当化を与える。マージオペレーションでは、SkipNetリングあたり多くとも４つのポインタを修復する。マージされたSkipNet内のリングの合計数はＯ（Ｎ）であり、リングの修復に必要な予測作業はＯ（１）であるため、マージオペレーションによって実行される予測合計作業はＯ（Ｎ）である。さらに、ＭがＮよりもかなり小さい場合、定理８．１３で証明された限度、Ｏ（Ｍ  ｌｏｇ（Ｎ／Ｍ））は、Ｏ（Ｎ）よりもかなり小さくなる。
【０３７６】
次に、それぞれのサイズが多くてもＭであり、サイズＮのグローバルSkipNetにマージされる、Ｓ個の接合していないSkipNetセグメントからなる組織を考えてみる。この場合、マージアルゴリズムは、組織の各セグメントを１回に１つずつ、グローバルSkipNetに逐次マージする。この場合、必要な合計時間はＯ（Ｓ  ｌｏｇ  Ｎ）であり、実行される作業合計はＯ（ＳＭ  ｌｏｇ（Ｎ／Ｍ））であって、これらは定理８．１２および定理８．１３の直接的な推論である。
【０３７７】
定理８．１２．  サイズＭのSkipNetセグメントとサイズＮのより大きなSkipNetセグメントとをマージするための時間が、高い確率でＯ（ｌｏｇ  Ｎ）であり、基礎となるネットワーク内で十分な帯域幅であると想定する。
【０３７８】
証明：リングを修復した後、マージオペレーションは、これ以上子リングがなくなるまで、どちらの子リングも平行して修復するように分岐する。第８．２項からのトライを伴う類推を使用して、ルートリングから子を持たないリングまでの分岐に沿った任意のパスを考える。このパスが、高い確率でＯ（ｌｏｇ  Ｎ）のホップを使用することを明らかにする。すべてのこうしたパスにわたる合併限度付けにより、この定理は完了する。
【０３７９】
任意のポインタの高さは、多くともｃ１  ｌｏｇ  Ｎであると想定することができる。このパスをトラバースするためのホップ数は、パラメータ１／２でのｃ１  ｌｏｇ  Ｎの幾何ランダム変数の合計によって上限が決められる。次に、高い確率でこの合計が多くともｃ２  ｌｏｇ  Ｎ＝Ｏ（ｌｏｇ  Ｎ）であることを明らかにする。恒等式５および恒等式６を使用して、第８．１項と同じ低減（ｒｅｄｕｃｔｉｏｎ）を適用することにより、ｃ２  ｌｏｇ  Ｎより多くのホップを必要とする可能性に関して以下の上限を得る。
【０３８０】
【数３９】
2004266796.tif 000041
【０３８１】
ｃ２＝ｍａｘ｛７ｃ１，７｝を選択するが、これは多くとも２Ｎ−２である。Ｎ個の可能なパスにわたって合併限度を適用すると、この証明は完了する。
【０３８２】
定理８．１３．  サイズＭのSkipNetセグメントとサイズＮのより大きなSkipNetセグメントとをマージするための予測作業合計は、Ｏ（Ｍ  ｌｏｇ（Ｎ／Ｍ））である。
【０３８３】
証明：レベルｉのすべてのポインタが修復されたと想定し、単一のレベルｉリングの子である任意の２つのレベルｉ＋１リングを考えてみる。これら２つの子リング内のポインタを修復するには、レベルｉのセグメント境界に隣接するノードは、それぞれが、セグメント境界から離れる方向でｉ番目のビットで異なる第１のノードを見つけなければならない。いずれかのノードを見つけるために必要なホップ数は、パラメータ１／２で幾何ランダム変数によって上限が決められる。修復オペレーションを完了するためには、Ｏ（１）の追加ホップのみが必要である。
【０３８４】
ランダムビット選択に関する特定の順序を考えることによって、あらゆるリング修復オペレーションで被る追加のホップ数が独立したランダム変数であることを明らかにする。すべてのレベルｉビットが、レベルｉ＋１ビットより前に選択されるようにする。次に、同じレベルｉリングの子である任意の２つのレベルｉ＋１リングの修復で被るホップ数は、それら２つのリングのレベルｉ＋１ランダムビットにのみ依存する。また、修復が必要なリングのみが、それらの子での修復オペレーションを開始する。従って、マージオペレーションを続行することになるレベルｉリングは、レベルｉ＋１ビットを選択する前に修復されると想定することができる。そこで、これら２つの子リングの修復で被るホップ数は、任意の他のリングの修復で被るホップ数とは無関係である。
【０３８５】
次に、修復が必要なポインタのレベルを考えてみる。レベルが低い場合、レベルｉで修復が必要なポインタ数は、このレベルには多くとも２ｉのリングがあることから、多くとも２ｉであるという限度を使用する。レベルが高い場合、修復が必要なポインタ合計数に関する高い確率の限度について証明し、Ｍにおいて高い確率で合計数がＭ（ｌｏｇ  Ｎ＋Ｏ（１））であることを明らかにする。
【０３８６】
高さｉのノードは、修復が必要な合計数にｉより多くのポインタを寄付することはできない。特定ノードの高さがｈを超える確率の上限は、以下によって決められる。
【０３８７】
【数４０】
2004266796.tif 000042
【０３８８】
従って、各ノードの高さは、パラメータ１／２で（ｌｏｇ  Ｎ＋１）で始まる幾何ランダム変数によって上限が決められ、これらのランダム変数は独立している。標準的な論議によれば、これらの合計は、Ｍにおいて高い確率で合計が多くてＭ（ｌｏｇ  Ｎ＋３）である。
【０３８９】
第１のｌｏｇ  Ｍレベルの寄付は多くとも２Ｍポインタであり、残りのレベルの寄付は多くとも高い確率でＭ（ｌｏｇ  Ｎ＋３−ｌｏｇ  Ｍ）である。全体で、ポインタ数はＯ（Ｍ  ｌｏｇ（Ｎ／Ｍ））である。ホップの合計数は、この多くの幾何ランダム変数の合計によって限度が決められる。この合計は予測値Ｏ（Ｍ  ｌｏｇ（Ｎ／Ｍ））であり、ここでも標準的な議論によれば、高い確率でこの予測値に近い。
【０３９０】
８．８  Ｐ−ＴａｂｌｅおよびＣ−Ｔａｂｌｅの組込み
第１に、数値ＩＤによる検索、ノードの接合、およびノードの逸脱に関する限度が、Ｃ−ＴａｂｌｅのSkipNetへの追加で引き続き保持されることについて論議する。数値ＩＤによる検索は各ホップ上の少なくとも１桁を訂正し、訂正する桁がＯ（ｌｏｇｋ  Ｎ）より多いことは決してない（第８．２項）。ノード接合時のＣ−Ｔａｂｌｅの構築は、結果的にＣ−Ｔａｂｌｅを使用した任意のSkipNetノードから接合ノードまでの数値ＩＤによる検索に等しい。これにより、数値ＩＤによる検索の場合と同じノード接合の限度が与えられる。ノード逸脱時に、Ｃ−Ｔａｂｌｅを維持するために実行される作業はない。
【０３９１】
名前ＩＤによる検索、ノード接合、および逸脱がＰ−Ｔａｂｌｅの追加でも引き続き効率的であることについては、略式でのみ議論する。直感的に言えば、Ｐ−Ｔａｂｌｅを使用した名前ＩＤによる検索は、Ｒ−Ｔａｂｌｅノードをインタリーブするノードに遭遇し、Ｒ−Ｔａｂｌｅノードは予測では指数的に分布されるため、Ｐ−Ｔａｂｌｅノードも同様にほぼ指数的に分布されると予測する。従って、検索は依然として、宛先までの距離を各ホップ上でｋごとにおおよそ分けるものでなければならない。
【０３９２】
ノード接合中のＰ−Ｔａｂｌｅの構築は、さらに複雑である。Ｒ−Ｔａｂｌｅによって定義された間隔が、完全に指数的に分布していると想定する。最も遠い間隔内のノードを見つけることは、本来名前ＩＤによる単一の検索であり、従ってＯ（ｌｏｇｋ  Ｎ）時間を要する。現在自分のいる間隔内にｇ個のノードが含まれると想定する。次の最も近い（少なくともｇ／ｋノードを含む）間隔内のノードを見つけるには、ホップを１つだけ必要とする少なくとも一定の確率を有する。第１のホップの後、次の最も近い間隔に到達しない場合、かなり近づいたと予測し、第２のホップがかなりの確率で次の最も近い間隔に到達することに成功すると予測する。すべての間隔にわたって反復すると、あらゆるＰ−Ｔａｂｌｅエントリに充填するためのホップの合計数はＯ（ｋ  ｌｏｇｋ  Ｎ）である。
【０３９３】
これで、ノード接合時にＰ−Ｔａｂｌｅを構築するための略式の論議は完了する。Ｃ−Ｔａｂｌｅを使用する場合と同様に、ノード逸脱時にＰ−Ｔａｂｌｅを維持するために実行される作業はない。
【０３９４】
９  実験に基づく評価
SkipNetの設計および性能を理解および評価するために、物理リンクを介して送信されたパケット数をカウントし、使用されるトポロジに応じて単位ホップカウントまたは指定された遅延のいずれかを各リンクに割り当てる、単純なパケットレベルの離散型イベントシミュレータを使用した。これは、待ち行列遅延またはパケット損失のいずれかをモデリングすると、大規模ネットワークのシミュレーションを妨げることになるため、これらをモデリングすることはない。
【０３９５】
Pastry、Chord、およびSkipNetの、３つのオーバレイネットワーク設計を実施した。Pastry実施については、RowstronおよびDruschel［２７］に記載されている。Chordの実施は、MIT Chord Webサイト［１４］から入手可能であり、発明者のシミュレータ内で動作可能なように適合されている。シミュレーションのために、すべてのノードが接合された後、フィンガポインタの更新が必要なくなるまで、Chord安定化アルゴリズムを実施する。第３項の設計に基づいた「基本的な」実施、および第５項に記載した拡張機能を使用する「完全な」実施の、２つの異なるSkipNetの実施を使用する。「完全な」SkipNetの場合、各実験の前に、Ｐ−Ｔａｂｌｅエントリ用の安定化を２ラウンド実施する。
【０３９６】
Mercatorトポロジ［３２］およびＧＴ−ＩＴＭトポロジ［３５］の両方で、すべての実験を実行した。Mercatorトポロジは、１０２、６３９のノードおよび１４２、３０３のリンクを有する。各ノードには、２６６２の自律システム（ＡＳ）のうちの１つが割り当てられる。トポロジ内のＡＳ間には４８５１のリンクがある。Mercatorトポロジは、各リンクに単位ホップカウントを割り当てる。本項で示されたすべての図面は、Mercatorトポロジに関するものである。ＧＴ−ＩＴＭトポロジに基づいた実験も、同様の結果を出した。
【０３９７】
ＧＴ−ＩＴＭトポロジは、トランジットスタブ（transit-stub）モデルに従ったGeorgia Techランダムグラフ生成器を使用して生成された、５０５０のコアルータを有する。アプリケーションノードは、均一の確率でコアルータに割り当てられた。各エンドシステムは、その割り当てられたルータへのＬＡＮリンクによって、直接取り付けられた（［５］での実施と同様）。ＩＰユニキャストルーティングを実行するために、Georgia Techランダムグラフ生成器によって生成されたルーティングポリシー重みを使用した［３５］。各ＬＡＮリンクの遅延は１ミリ秒に設定され、コアリンクの平均遅延は４０．５ミリ秒であった。
【０３９８】
９．１  方法論
以下の評価基準を使用して、ルックアップの性能特徴を測定した。
【０３９９】
相対遅延ペナルティ（ＲＤＰ）：２つのノード間でのオーバレイネットワークパスの長さと、それらの間でのＩＰレベルパスの長さとの比率。
【０４００】
物理ネットワーク距離：基礎となるネットワーク距離を基準にした、２つのノード間でのオーバレイパスの絶対長さ。これに対してＲＤＰは、ＩＰと比較した、オーバレイネットワークの使用のペナルティを測定する。ただし、SkipNetの目標の一部が、クライアントの近くにデータを配置できるようにすることであるため、ＤＨＴルックアップによってトラバースされたパスのネットワーク距離における絶対長さについても注目する。Mercatorトポロジの場合、Mercatorトポロジがリンク待ち時間を提供しないため、パスの長さは物理ネットワークホップに関して与えられる。ＧＴ−ＩＴＭトポロジの場合、ミリ秒基準で測定された待ち時間を使用する。
【０４０１】
障害ルックアップの数：障害が発生した場合の、成功しなかったルックアップ要求の数。
【０４０２】
各参加ノードが単一の組織に属する、オーバレイネットワーク内での組織の存在もモデル化する。組織の数は、オーバレイにおけるノード合計数と同様に、実験のパラメータである。各実験では、クライアントルックアップの合計数はオーバレイにおけるノード数の２倍である。
【０４０３】
参加ノードの名前のフォーマットは、org-name/node-nameである。データオブジェクト名のフォーマットは、org-name/node-name/random-obj-nameである。従って、特定のデータオブジェクトの「所有者」は、所有者のノード名の後にノードローカルオブジェクト名をつけることになる。その結果、SkipNetでは、データオブジェクトが所有者のノード上に配置されることになり、ChordおよびPastryでは、オブジェクトはオブジェクト名のＭＤ−５ハッシュに対応するノード上に配置される。制約付きロードバランシングの実験では、「！」区切り文字およびその後に続く組織名を含むデータオブジェクト名を使用する。
【０４０４】
組織サイズは、均一モデルおよびジップ様（Zipf-like）モデル、という２つの方法でモデル化する。
・均一モデルでは、各組織のサイズは１からＮの間で均一に分布され、Ｎはオーバレイネットワークにおけるアプリケーションノードの合計数である。  
・ジップ様モデルでは、組織のサイズは、ｘ−１．２５＋０．５によって決定される分布に従って決定され、システム内にあるオーバレイノードの合計数に正規化される。本項で言及する他のすべてのジップ様分布は、同様の方式で定義される。  
【０４０５】
均一、クラスタ化、およびジップクラスタ化の、３種類のノード局所性をモデル化する。  
・均一モデルでは、ノードはオーバレイ全体にわたって均一に拡散する。  
・クラスタ化モデルでは、組織のノードは、Mercatorトポロジ内で単一のランダムに選択された自律システム全体、およびＧＴ−ＩＴＭでランダムに選択されたスタブネットワーク全体にわたって、均一に拡散する。Mercatorでは、選択されたＡＳが、オーバレイノードと同じ数のコアルータノードの少なくとも１／１０を有することを保証する。ＧＴ−ＩＴＭでは、一定サイズより上の組織を「スタブクラスタ」上に配置する。これらは、すべて同じトランジットリンクに接続されたスタブネットワークである。  
・ジップクラスタ化の場合、前述のように、組織はＡＳまたはスタブネットワーク内に配置する。ただし組織のノードは、「ルート」物理ノードはＡＳまたはスタブネットワーク内にランダムに配置され、すべてのオーバレイノードはこのルートを基準にしてジップ様分布によってモデル化された距離で配置されるという具合に、そのＡＳまたはスタブネットワーク全体にわたって拡散される。この構成では、組織のほとんどのオーバレイノードは、そのＡＳまたはスタブネットワーク内に緊密にまとめてクラスタ化されることになる。この構成は、一部のＡＳがトポロジ全体の広い部分にわたって拡散されるMercatorトポロジに、特に関連するものである。
【０４０６】
データオブジェクト名、従ってデータの配置も、同様にモデル化される。均一モデルでは、データ名は、組織をランダムに選択した後、その組織内でランダムノードを選択することによって生成される。クラスタ化モデルでは、データ名は、ジップ様分布に従って組織を選択した後、その組織内でランダムメンバノードを選択することによって生成される。ジップクラスタ化の場合、データ名は、ジップ様分布に従って組織をランダムに選択した後、組織の「ルート」ノードから、その距離のジップ様分布に従ってメンバノードを選択することによって生成される。ChordおよびPastryの場合は、これら３つのモデルすべてにおいて、ハッシングがすべてのオーバレイノード間で均一にデータオブジェクトを拡散するが、SkipNetではそうでないことに留意されたい。
【０４０７】
すべてのデータルックアップのうちのどの部分が、要求側の組織に対してローカルなデータを強制的に要求させられることになるかを指定することによって、データアクセスの局所性をモデル化する。最終的に、インターネット様障害の下でのシステム挙動をモデル化し、切断された組織内での文書可用性について研究する。組織のＡＳをMercator内のネットワークの残りの部分に接続するリンクの障害、およびＧＴ−ＩＭ内の関連するトランジットリンクの障害による、ドメインの分離をシミュレートする。
【０４０８】
各実験は、異なるランダムシードで別々に１０回実行され、平均値が提示される。SkipNetの場合、１２８ビットのランダム識別子および１６ノードのリーフセットサイズを使用した。PastryおよびChordの場合、それらのデフォルト構成を使用した［１４、２７］。
【０４０９】
実験では、オーバレイメッセージをオーバレイノードに送信するコストを、ノードおよびコンテンツの様々な分布の下で様々なオーバレイを使用して測定した。集められたデータには、以下のものが含まれた。  
アプリケーションホップ：オーバレイを介して宛先にメッセージをルーティングするのに必要な、アプリケーションレベルのホップ数  
相対遅延ペナルティ：オーバレイルーティングを使用する平均遅延とＩＰルーティングを使用する平均遅延との比率。
【０４１０】
変更された実験パラメータには以下のものが含まれた。  
オーバレイタイプ：Chord、Pastry、基本SkipNet、または完全SkipNet  
トポロジ：Mercator（デフォルト）またはＧＴ−ＩＴＭ  
メッセージタイプ：メッセージがＤＨＴルックアップであることを示すDHT Lookup（デフォルト）、またはメッセージがランダムに選択されたオーバレイノードに送信されることを示すＳｅｎｄのいずれか  
ノード（Ｎ）：オーバレイノードの数。ほとんどの実験ではＮを２８から２１６まで、２の累乗ずつ変更する。Ｎを２１６に固定する場合もある。  
ルックアップ：実験あたりのルーティングされたルックアップ要求数。通常は２×Ｎ。  
試行：各実験が、それぞれ異なるランダムシード値で実行される回数。通常は１０。報告された結果は、すべての実行の結果である。  
組織：中にコンテンツが位置する別個の組織名の数。典型的な値には、１、１０、１００、および１０００組織が含まれる。１組織内のノードは、シミュレートされたネットワークトポロジの同じ領域内に位置する。Mercatorトポロジの場合、同じ自律システム（ＡＳ）内に位置する。ＧＴ−ＩＴＭトポロジでは、小規模な組織の場合、同じスタブネットワークに接続されたすべてのノードであり、大規模な組織の場合、選択されたコアノードに接続されたすべてのノードである。  
組織サイズ：サイズが１からＮまでの、ランダムに選択された組織サイズを示すUniform、または、
【０４１１】
【数４１】
2004266796.tif 000043
【０４１２】
ジップ分布を使用して選択された組織サイズを示し、最大組織サイズが
【０４１３】
【数４２】
2004266796.tif 000044
【０４１４】
となるＺｉｐｆ、のうちの１つ。  
ノード局所性：UniformまたはＺｉｐｆのうちの１つ。各組織内でノード位置がクラスタ化される方法を制御する。Uniformは、組織のトポロジ内のノード間で、ノードをランダムに拡散させる。Ｚｉｐｆは、組織のトポロジ内で選択されたルートノードからの距離によって候補ノードを分類し、ジップ分布を使用してそのノードに近いノードをクラスタ化する。  
文書局所性：Uniform、Ｂｙ  Ｏｒｇ、またはＢｙ  Ｎｏｄｅのうちの１つ。Uniformは、すべてのノードにわたって文書名を均一に拡散させる。Ｂｙ  Ｏｒｇは、より規模の大きい組織により多くの文書が割り当てられるジップ分布を適用し、文書は各組織内のノードにわたって均一に分布される。  
％ローカル：クライアントの組織内の文書に対してローカルであるように制約された、ルックアップの部分。ローカルでないルックアップは、実験のすべての文書間で分布される。  
オーバレイ特有のパラメータのデフォルト値は、以下のとおりであった。  
Chord：ノードＩＤビット＝４０  
Pastry：ノードＩＤビット＝１２８、桁あたりビット数（ｂ）＝４、リーフセットサイズ＝１６  
SkipNet：基本構成：ランダムＩＤビット＝１２８、リーフセットサイズ＝１６、リング分岐係数（ｋ）＝２。完全構成：ｋ＝８であり、近接認識にはＰ−Ｔａｂｌｅの使用、効率的な数値ルーティングにはＣ−Ｔａｂｌｅの使用を追加することを除き、基本と同じである。
【０４１５】
９．２  基本ルーティングコスト
SkipNetのルーティング性能を理解するために、Ｎ＝２ｉノードでオーバレイネットワークをシミュレートし、ここでｉは１０から１６の範囲である。実験は、１０、１００、および１０００の組織、ならびに、組織サイズ分布、ノード配置、およびデータ配置に関して取得可能なすべての順列を使用して実施した。その意図は、様々な構成の下でＲＤＰがどのように挙動するかをみるためであった。特に、データオブジェクト名の非均一な分布が、ChordおよびPastryに比べて、SkipNetルックアップの性能に悪い影響を与えるかどうかをみることに関心があった。
【０４１６】
図１８は、組織サイズ、ノード配置、およびデータ配置がすべてジップ様分布によって決められる構成の場合の、SkipNetの実施、ならびにChordおよびPastryの両方について測定したＲＤＰを示す図である。表１は、２１６ノードのオーバレイ内での、ノードあたりの固有のルーティングテーブルエントリの平均数を示す表である。完全に均一なものを含む他のすべての構成が、ここで示されたものと同様の結果を示した。
【０４１７】
発明者の結論は、基本SkipNetはChordと同様に実行し、完全SkipNetはPastryと同様に実行するということである。これは、基本SkipNetおよびChordがどちらもネットワーク近接認識ルーティングをサポートしておらず、完全SkipNetおよびPastryはサポートしていることから、驚くには当たらない。他のすべての構成が同様の結果を出したため、SkipNetの性能が名前の非均一分布によって悪い影響を受けることはないと結論付ける。
【０４１８】
【表１】
2004266796.tif 000045
【０４１９】
９．３  配置の局所性の活用
ＲＤＰは、ＩＰベースのルーティングを基準にした性能のみを測定する。ただし、SkipNetの重要な得点の１つは、データの局所的配置を可能にすることである。図１９は、２１６のオーバレイノードおよび１００の組織を含み、組織サイズ、ノード配置、およびデータ配置がすべてジップ様分布によって決められる、実験構成に関するルックアップ要求用の、物理ネットワークホップの平均数を示す図である。ｘ軸は、ルックアップのどの部分が強制的にローカルデータとされたか（すなわち、ルックアップされたデータオブジェクト名が要求側クライアントと同じ組織からのものであった）を示す。ｙ軸は、ルックアップ要求に対する物理ネットワークホップの数を示す。
【０４２０】
予測どおり、ChordおよびPastryはそれらのオーバレイネットワーク全体にデータを拡散させるため、どちらもデータ参照の局所性は気に留めない。これに対して、SkipNetはどちらのバージョンも、データ参照の局所性が増加するにつれて大幅な性能向上を示す。Mercatorトポロジでは、ドメイン間リンクにはドメイン内リンクと同様のコストがかかることから、図１９が実際にはSkipNetによって得られる特典を控えめに表していることに留意されたい。ＧＴ−ＩＴＭトポロジに関して実行された同等の実験では、SkipNetのエンドツーエンドルックアップ待ち時間は、１００％ローカルルックアップについて、Pastryのものよりも少なく、７分の１を超えた。
【０４２１】
９．４  組織切断に対する耐障害性
配置の局所性は、耐障害性も向上させる。図２０は、組織がネットワークの残りの部分から切断されたときに障害が発生したルックアップ要求の数を示す図である。
【０４２２】
この（一般的な）インターネットに似た障害は、ChordおよびPastryにとって破局的な結果をもたらした。この実験で分離された組織のサイズは、システム内のノード合計のおよそ１５％であった。従って、ChordおよびPastryは、どちらも組織のデータのほぼ８５％を、組織外のノード上に配置することになる。さらに、（切断された組織から見て）オーバレイネットワークのノードの８５％に事実上障害が生じながら、ルックアップ要求をルーティングさせる試みも実行しなければならない。このレベルの障害では、ルーティングは事実上不可能である。最終的な結果として、障害ルックアップの比率はほぼ１００％に近い。
【０４２３】
これに対して、SkipNetはどちらのバージョンも、基準となる局所性が多いほど良好に実施される。強制的にローカルとされるルックアップがない場合、SkipNetは、組織に対してローカルでないデータの８５％のアクセスに失敗する。ローカルルックアップの割合が１００％に近づくにつれて、障害を起こすルックアップの割合は０に近づく。
【０４２４】
第６項で述べたSkipNetの切断アルゴリズムおよびマージアルゴリズムの挙動を実験に基づいて確認するために、シミュレータがＡＳサブネットワークの切断をサポートするように拡張した。図２１は、組織のSkipNetがレベル０でいったんグローバルSkipNetに接続された場合の、以前に切断された組織とシステムの残りの部分との間で観察したルーティング性能を示す図である。また、すべての高位レベルポインタが修復された場合に観察されたルーティング性能も示す。
【０４２５】
９．５  制約付きロードバランシング
図２２は、２つの異なるＣＬＢ構成のルーティング性能を探求し、それらの性能をPastryと比較した図である。各システムでは、すべてのルックアップトラフィックが組織的にローカルなデータである。組織サイズならびにノードおよびデータの配置は、ジップ様分布でクラスタ化される。基本ＣＬＢ構成は第３項で述べたＲ−Ｔａｂｌｅのみを使用し、完全ＣＬＢは第５．４項で述べたＣ−Ｔａｂｌｅを使用する。
【０４２６】
完全ＣＬＢ曲線は、基本ＣＬＢを超えるかなりの性能向上を示し、特別なルーティング状態を維持するコストを正当化している。ただし、たとえ追加のルーティングテーブルを使用しても、完全ＣＬＢの性能はPastryの性能に劣る。ただし主な観察点は、従来のピアツーピアオーバレイネットワークを備えたＣＬＢ機能を模倣するためには、全体にロードバランシングを実行したい各ドメインにつき１つの、複数のルーティングテーブルが必要なことである。
【０４２７】
１０  結論
他のピアツーピアシステムは、すべてのピアが等しいと想定している。任意の特定のピアに対して、同じ組織内にあるピアはシステム内のほとんどのピアよりも重要であると想定することによって、これを補足説明する。具体的に言えば、それらは障害を起こす確率が低く、ネットワーク距離が近い確率が高く、さらに攻撃のソースとなる確率が低い。
【０４２８】
SkipNetは、機能レベルでのこの哲学的想定を、コンテンツ局所性およびパス局所性、すなわち、データ配置を制御する機能、および可能であればいつでもルーティングが管理ドメイン内に留まることの保証を提供することによって、実現する。ピアツーピアシステムが分散型アプリケーション用のインフラストラクチャとして広く成功していくものである場合、この機能は不可欠であると信じる。発明者の知る限りでは、SkipNetはコンテンツ局所性およびルーティングパス局所性の両方を達成する、第１のピアツーピアシステム設計である。SkipNetは、以前のピアツーピアシステムの性能目標を犠牲にすることなくこれを達成するものであり、SkipNetノードは状態の対数量を維持し、SkipNetオペレーションはメッセージの対数数を必要とする。
【０４２９】
SkipNetは、任意の所望の細分度でコンテンツ局所性を提供する。制約付きロードバランシングは、データの特定ノード上への配置、ならびに従来のＤＨＴ機能、および任意の中間レベルの細分性を包含する。この細分性は、ノードの名前ＩＤによって符号化された階層によってのみ制限される。
【０４３０】
SkipNetの設計は、他のピアツーピアシステムが提供していない、一般的なインターネット障害に対する弾力性を提供するものである。組織境界線に沿ったネットワーク区分の場合、SkipNetは少数のセグメントに断片化される。さらにSkipNetは、ネットワーク分割が解消されたときに、これらのセグメントをグローバルSkipNetと効率良く再マージするためのメカニズムも提供する。相関していない独立したノードの障害に直面した場合、SkipNetは、他のピアツーピアシステムにも同様の保証を提供する。
【０４３１】
発明者の評価努力は、SkipNetが、均一のアクセスパターンの下で、ChordおよびPastryなどの他のピアツーピアシステムと同様の性能を有することを実証した。組織内トラフィックが優位を占めるアクセスパターンの下で、SkipNetはより優れた性能を提供する。さらに、SkipNetが、他のピアツーピアシステムよりもネットワーク区分に対してかなりの弾力性があることも、実験に基づいて検証した。
【０４３２】
今後の研究では、ＷＡＮをエミュレートする２０００マシンのテストベッドをまたがってSkipNetを展開していく計画である。この展開により、動的なホストの接合および離脱、ネットワークの輻輳、および他の実世界のシナリオに直面した場合の、SkipNetの挙動をさらに理解していくことになろう。スケーラブルなイベント通知サービス［２］を実施するためのインフラストラクチャとしてのSkipNetの好適性を評価することも計画している。
【０４３３】
謝辞  
Antony Rowstron、Miguel Castro、およびAnne-Marie Kermarrecに対し、彼らのPastryの実施およびネットワークシミュレータの使用を許可いただけたことに感謝する。また、Scott Sheffieldに対しても、名前による検索の分析に関する彼の洞察に感謝する。
【０４３４】
参考文献  
［１］J.Aspnes, G.Shah著。スキップグラフ。SODA 2003への出版認可済み。  
［２］L.F.Cabrera, M.B.Jones, M.Theimer著。Herald：グローバルイベント通知サービスの達成。２００１年５月HotOS VIIIにて。  
［３］M.Castro, P.Druschel, A.Ganesh, A.Rowstron, D.Wallach著。ピアツーピアオーバレイルーティングに関するセキュリティ。Operating System Design and Implementation（ＯＳＤＩ）第５回シンポジウム議事録より。２００２年１２月、USENIX。  
［４］M.Castro, P.Druschel, Y.C.Hu, A.Rowstron著。構造化ピアツーピアオーバレイネットワークにおけるトポロジ認識ルーティング。Microsoftテクニカルレポート  #MSR-TR-2002-82、２００２年より。  
［５］Y.H.Chu, S.G.Rao, H.Zhang著。エンドシステムマルチキャストの事例。ACM SIGMETRICS 2000、１〜１２ページより。２０００年６月  カリフォルニア州サンタクララ。ＡＣＭ。  
［６］I.Clarke, O.Sandberg, B.Wiley, T.W.Hong著。フリーネット：分散匿名情報記憶および検索システム。２０００年７月、匿名および不可観測性における設計問題に関するワークショップ、３１１〜３２０ページより。ＩＣＳＩ、米国カリフォルニア州バークレー。  
［７］T.H.Cormen, C.E.Leiserson, R.L.Rivest著。アルゴリズム入門。ＭＩＴプレス、１９９０年マサチューセッツ州ケンブリッジ。  
［８］F.Dabek, M.F.Kaashoek, D.Karger、R.Morris, I.Stoica著。ＣＦＳによる広域協同記憶域。２００１年１０月、オペレーティングシステムの原理に関する第１８回ＡＣＭシンポジウムより。  
［９］J.R.Douceur著。Ｓｙｂｉｌアタック。第１回ピアツーピアシステムに関する国際ワークショップ（IPTPS '02）より。２００２年３月。  
［１０］E.Fredkin著。トライメモリ。Communications of the ACM、３（９）：４９０−４９９、１９６０年９月。  
［１１］Gnutella。http://www.gunutelliums.com/  
［１２］S.Gribble, E.Brewer, J.Hellerstein, D.Culler著。インターネットサービス構造向けのスケーラブルな分散データ構造。Operating System Design and Implementation（OSDI 2000）第４回シンポジウム議事録、２０００年１０月より。  
［１３］S.Iyer, A.Rowstron, P.Druschel著。Squirrel：分散型ピアツーピアＷｅｂキャッシュ。Principles of Distributed Computing（ＰＯＤＣ）第２１回ＡＣＭ年次シンポジウム議事録、２００２年７月より。  
［１４］F.Kaashoek, R.Morris, F,Dabek, I.Stoica, E.Brunskill, D.Karger, R.Cox, A.Muthitacharoen著。Chordプロジェクト２００２。http://www.pdos.jcs.mit.edu/Chord/。  
［１５］D.Karger, E.Lehman, F.Leighton, M.Levine、D.Lewin, R.Panigraphy著。整合的ハッシングおよびランダムツリー：World Wide Web上のホットスポットを軽減するための分散キャッシングプロトコル。計算理論に関する第２９回ＡＣＭ年次シンポジウム議事録、６５４〜６６３ページ、１９９７年５月より。  
［１６］P.Keleher, S.Bhattacharjee, B.Silaghi著。仮想化オーバレイネットワークの氾濫を見過ごせるか。第１回ピアツーピアシステムに関する国際ワークショップ（IPTPS '02）、２００２年３月。  
［１７］D.E.Knuth著。コンピュータプログラミングの芸術、第３巻：ソートと検索。Addison-Wesley、マサチューセッツ州リーディング、１９７３年。  
［１８］C.Labovitz, A.Ahuja著。インターネットの安定化および広域バックボーン障害に関する実験に基づく研究。耐障害性コンピューティングシンポジウム（ＦＴＣＳ）、１９９９年６月より。  
［１９］D.Malkhi, M.Naor, D.Ratajczak著。Viceroy:Butterflyのスケーラブルかつ動的なエミュレーション。Principles of Distributed Computing（ＰＯＤＣ）第２１回ＡＣＭ年次シンポジウム議事録、ＡＣＭ、２００２年７月より。  
［２０］P.Maymounkov, D.Mazieres著。Kademilia：ＸＯＲ測定規準に基づくピアツーピア情報システム。第１回ピアツーピアシステムに関する国際ワークショップ（IPTPS '02）、ＭＩＴ、２００２年３月。  
［２１］D.Oppenheimer, D.A.Patterson著。大規模インターネットサービスからの障害データの研究および使用。第１０回ＡＣＭ  ＳＩＧＯＰＳ  ヨーロッパワークショップ、２００２年９月より。  
［２２］T.Papadakis著。スキップリストおよびアルゴリズムの確率分析。ワーテルロー大学博士論文、１９９３年。テクニカルレポートCS93-28としても入手可。  
［２３］W.Pugh著。スキップリスト：平衡木の確率的代替。アルゴリズムおよびデータ構造に関するワークショップ、４３７〜４４９ページ、１９８９年より。  
［２４］W.Pugh著。スキップリスト解説書。メリーランド大学テクニカルレポートCS-TR-2286.1，１９９０年。  
［２５］S.Ratnasamy, P.Francis, M.Handley, R.Karp, S.Shenker著。スケーラブルコンテンツアドレス可能ネットワーク。ACM SIGCOMM議事録、２００１年８月より。  
［２６］S.Ratnasamy, M.Handley, R.Karp, S.Shenker著。コンテンツアドレス可能ネットワークを使用するアプリケーションレベルマルチキャスト。ネットワーク化グループ通信に関する第３回国際ワークショップ議事録、２００１年１１月より。  
［２７］A.Rowstron, P.Druschel著。Pastry：大規模ピアツーピアシステムに関するスケーラブルな分散オブジェクトのロケーションおよびルーティング。分散システムプラットフォーム（ミドルウェア）に関する国際会議、３２９〜３５０ページ、ドイツ、ハイデルベルグ、２００１年１１月より。  
［２８］A.Rowstron, P.Druschel著。ＰＡＳＴ（大規模永続ピアツーピア記憶ユーティリティ）における記憶管理およびキャッシング。オペレーティングシステムの原理に関する第１８回ＡＣＭシンポジウム、２００１年１０月より。  
［２９］A.Rowstron, A.M.Kermarrec, M.Castro, P.Druschel著。Scribe：大規模イベント通知インフラストラクチャの設計。ネットワーク化グループ通信に関する第３回国際ワークショップ、２００１年１１月より。  
［３０］I.Stoica, R.Morris, D.Karger, M.F.Kaashoek, H.Balakrishnan著。Chord：インターネットアプリケーションのためのスケーラブルピアツーピアルックアップサービス。ACM SIGCOMM '01会議議事録、１４９〜１６０ページ、カリフォルニア州サンディエゴ、２００１年８月より。  
［３１］I.Stoica, R.Morris, D.Karger, M.F.Kaashoek, H.Balakrishnan著。Chord：インターネットアプリケーションのためのスケーラブルピアツーピアルックアップサービス。テクニカルレポートTR-819、ＭＩＴ、２００１年３月。  
［３２］H.Tangmunarunkit, R.Govindan, S.Shenker, D.Estrin著。インターネットパスにおけるルーティングポリシーの影響。ＩＮＦＯＣＯＭ、７３６〜７４２ページ、２００１年４月より。  
［３３］M.Theimer, M.B.Jones著。Overlook：オーバレイネットワーク上でのスケーラブルな名前サービス。第２２回分散コンピューティングシステム国際会議（ＩＣＤＣＳ）議事録より。IEEE Computer Society、２００２年７月。  
［３４］A.Vahdat, J.Chase, R.Braynard, D.Kostic, A.Rodriguez著。自己編成サブセット：From Each According to His Abilities, To Each According to His Needs。第１回ピアツーピアシステムに関する国際ワークショップ（IPTPS '02）より。２００２年３月。  
［３５］E.W.Zegura, K.L.Calvert, S.Bhattacharjee著。インターネットワークのモデル化方法。IEEE Infocom '96、１９９６年４月、議事録より。  
［３６］B.Y.Zhao, J.D.Kubiatowiez, A.D.Joseph著。Tapestry：障害弾力性のある広域ロケーションおよびルーティングに関するインフラストラクチャ。テクニカルレポートUCB//CSD-01-1141、Ｕ．Ｃ．バークレー、２００１年４月。
【図面の簡単な説明】
【０４３５】
【図１Ａ】本発明の実施形態を実施するために使用可能なコンピュータネットワークシステムの一例を一般的に示す概略図である。
【図１Ｂ】本発明の実施形態を実施するために使用可能なコンピュータシステムの一例を一般的に示す概略図である。
【図２】本発明の一実施形態に従ったスキップネット構造を示すネットワーク図である。
【図３】本発明の一実施形態に従ったポインタテーブル構造を示すデータ構造図である。
【図４Ａ】本発明の一実施形態に従ったスキップネット構造を示す代替ネットワーク図である。
【図４Ｂ】本発明の一実施形態に従ったスキップネット構造を示す他の代替ネットワーク図である。
【図５】辞書編集的に別個のノードが単一の物理位置でホストされる、本発明の一実施形態に従ったスキップネット構造を示すネットワーク図である。
【図６】辞書編集的に別個のノードが単一の物理位置でホストされる、本発明の一実施形態に従ったノード構造およびポインタテーブル構造を示す概略図である。
【図７Ａ】完全スキップリストを示すスキップリスト図である。
【図７Ｂ】確率的スキップリストを示すスキップリスト図である。
【図８】本発明の一実施形態に従った完全スキップリストに対応するポインタ図である。
【図９】本発明の一実施形態に従ったスキップネットリングを示すネットワーク概略図である。
【図１０】本発明の一実施形態に従ったスキップネットを示すネットワーク概略図である。
【図１１】本発明の一実施形態に従ったルーティングアルゴリズムを示す図である。
【図１２】本発明の一実施形態に従った他のルーティングアルゴリズムを示す図である。
【図１３】本発明の一実施形態に従ったスキップネットノード挿入アルゴリズムを示す図である。
【図１４】本発明の一実施形態に従ったスキップネット区画の合併を示すネットワーク概略図である。
【図１５】本発明の一実施形態に従ったスキップネットレベルゼロのリング接続アルゴリズムを示す図である。
【図１６】本発明の一実施形態に従った修復後の境界ノードでのノードポインタを示すポインタ図である。
【図１７】本発明の一実施形態に従ったスキップネットレベルｈのリング修復アルゴリズムを示す図である。
【図１８】本発明の実施形態に従ったネットワークを含む様々なネットワークのネットワークサイズの関数として相対的な遅延ペナルティを示すグラフである。
【図１９】本発明の実施形態に従ったネットワークを含む様々なネットワークのデータアクセス局所性の関数として絶対的な検索要求待ち時間を示すグラフである。
【図２０】本発明の実施形態に従ったネットワークを含む様々なネットワークのデータアクセス局所性の関数として失敗した検索要求の数を示すグラフである。
【図２１】本発明の実施形態に従ったネットワークサイズの関数として組織間メッセージをルーティングするために使用したルーティングホップの数を示すグラフである。
【図２２】本発明の実施形態に従ったネットワークサイズの関数として制約付きでロードバランシングされたデータの検索の相対的遅延ペナルティを比較したグラフである。
【符号の説明】
【０４３６】
５００、５０４、５１６  仮想ノード
６００  単一の物理位置
６１２  ｌｏｇ（ｎ）ポインタ
６１４  部分ルーティングテーブル
６１６  リーフノードポインタ
【図１Ａ】
2004266796.tif 000046
【図１Ｂ】
2004266796.tif 000047
【図２】
2004266796.tif 000048
【図３】
2004266796.tif 000049
【図４Ａ】
2004266796.tif 000050
【図４Ｂ】
2004266796.tif 000051
【図５】
2004266796.tif 000052
【図６】
2004266796.tif 000053
【図７Ａ】
2004266796.tif 000054
【図７Ｂ】
2004266796.tif 000055
【図８】
2004266796.tif 000056
【図９】
2004266796.tif 000057
【図１０】
2004266796.tif 000058
【図１１】
2004266796.tif 000059
【図１２】
2004266796.tif 000060
【図１３】
2004266796.tif 000061
【図１４】
2004266796.tif 000062
【図１５】
2004266796.tif 000063
【図１６】
2004266796.tif 000064
【図１７】
2004266796.tif 000065
【図１８】
2004266796.tif 000066
【図１９】
2004266796.tif 000067
【図２０】
2004266796.tif 000068
【図２１】
2004266796.tif 000069
【図２２】
2004266796.tif 000070
【外国語明細書】
2004266796.tif 000071
2004266796.tif 000072
2004266796.tif 000073
2004266796.tif 000074
2004266796.tif 000075
2004266796.tif 000076
2004266796.tif 000077
2004266796.tif 000078
2004266796.tif 000079
2004266796.tif 000080
2004266796.tif 000081
2004266796.tif 000082
2004266796.tif 000083
2004266796.tif 000084
2004266796.tif 000085
2004266796.tif 000086
2004266796.tif 000087
2004266796.tif 000088
2004266796.tif 000089
2004266796.tif 000090
2004266796.tif 000091
2004266796.tif 000092
2004266796.tif 000093
2004266796.tif 000094
2004266796.tif 000095
2004266796.tif 000096
2004266796.tif 000097
2004266796.tif 000098
2004266796.tif 000099
2004266796.tif 000100
2004266796.tif 000101
2004266796.tif 000102
2004266796.tif 000103
2004266796.tif 000104
2004266796.tif 000105
2004266796.tif 000106
2004266796.tif 000107
2004266796.tif 000108
2004266796.tif 000109
2004266796.tif 000110
2004266796.tif 000111
2004266796.tif 000112
2004266796.tif 000113
2004266796.tif 000114
2004266796.tif 000115
2004266796.tif 000116
2004266796.tif 000117
2004266796.tif 000118
2004266796.tif 000119
2004266796.tif 000120
2004266796.tif 000121
2004266796.tif 000122
2004266796.tif 000123
2004266796.tif 000124
2004266796.tif 000125
2004266796.tif 000126
2004266796.tif 000127
2004266796.tif 000128
2004266796.tif 000129
2004266796.tif 000130
2004266796.tif 000131
2004266796.tif 000132
2004266796.tif 000133
2004266796.tif 000134
2004266796.tif 000135
2004266796.tif 000136
2004266796.tif 000137
2004266796.tif 000138
2004266796.tif 000139
2004266796.tif 000140
2004266796.tif 000141
2004266796.tif 000142
2004266796.tif 000143
2004266796.tif 000144
2004266796.tif 000145
2004266796.tif 000146
2004266796.tif 000147
2004266796.tif 000148
2004266796.tif 000149
2004266796.tif 000150
2004266796.tif 000151
2004266796.tif 000152
2004266796.tif 000153
2004266796.tif 000154
2004266796.tif 000155
2004266796.tif 000156
2004266796.tif 000157
2004266796.tif 000158
2004266796.tif 000159
2004266796.tif 000160
2004266796.tif 000161
2004266796.tif 000162
2004266796.tif 000163
2004266796.tif 000164
2004266796.tif 000165
2004266796.tif 000166
2004266796.tif 000167
2004266796.tif 000168
2004266796.tif 000169
2004266796.tif 000170
2004266796.tif 000171
2004266796.tif 000172