分散ルーティング テーブルについて
分散ルーティング テーブル (DRT) は、連携するノードのメッシュとして存在します。各ノードは、DRT API を使用するアプリケーションのインスタンスです。 キーを発行するノードは、他のノードによるキーの発行と解決を支援する役割を担います。 ノードは"解決のみ" の方法で参加することもできます。これは、ピアを支援する必要はありません。 DRT プロトコルは UDP/IPv6 トランスポート経由で実行されます。
キーを発行するノードは、メッシュ内の他のノードのローカル ルーティング テーブルを構築し、維持します。 このルーティング テーブルは、ローカル ルーティング テーブルで直接キーを検索するか、ターゲットに近いキーを数値的に公開する他のノードに依頼することで、ノードがメッシュ内の特定のキーをすばやく見つけられるように最適化されています。 このアクションは、必要なキーが見つかるか、ノードがそのようなキーが存在しないと判断するまで繰り返されます。
DRT キーは 256 ビット符号なし整数です。 キー間の近接性は、キー間の数値の差によって定義されます。 DRT キースペースは循環と見なされます。 たとえば、最初に指定できるキー値と、最後に使用可能なキー値は近隣と見なされます。
セキュリティで保護された DRT では、発行するキーを認証するためにノードが必要です。 DRT の初期化時に、ノードが DRT API を使用してキーを認証するメカニズムを設定する必要があります。 これを行うには、DRT のセキュリティ プロバイダーを選択します。 セキュリティ プロバイダーは、キーの認証に使用されるトークンを生成し、他のノードによって生成されたトークンを検証できるモジュールです。 このドキュメントで定義されているセキュリティ プロバイダー インターフェイスを実装する必要があります。 Windows 7 DRT には、Windows アプリケーションの構築に使用できる 2 つの完全に実装されたセキュリティ プロバイダーが付属しています。
初期化中は、アプリケーションで DRT にブートストラップ プロバイダーを提供する必要もあります。 ブートストラップ プロバイダーは、DRT メッシュに既に存在するノードのネットワーク エンドポイントを取得できるモジュールであり、新しいノードが確立されたときに DRT によって呼び出されます。 セキュリティ プロバイダー モジュールと同様に、ブートストラップ プロバイダーは適切に定義されたインターフェイスを実装する必要があります。 Windows 7 DRT には、完全に実装された 2 つのブートストラップ プロバイダーが付属しています。
DRT は、キーの直属の隣人を特別と見なします。 最も近い 5 つのキーは数値的に小さく、5 つの最も近いキーはリーフ セットと呼ばれる形式で公開されたキーよりも数値的に大きくなります。 DRT は、DRT API を介してキーのリーフ セットに対する変更を報告します。
DRT のライフ サイクルと状態遷移
アプリケーションは、 DrtOpen 関数を使用してローカル DRT インスタンスを初期化できます。 この関数はブートストラップ プロセスをトリガーします。この場合、DRT API はブートストラップ プロバイダーを呼び出して、DRT に既に参加している他のノードのキーとネットワーク エンドポイントを学習します。 ブートストラップ プロバイダーが少なくとも 1 つの他のノードを正常に見つけた場合、DRT はDRT_ACTIVE状態になります。 この状態では、アプリケーションは他のノードによって発行されたキーを検索し、解決できるキーを発行できます。 ブートストラップ プロバイダーが他のノードを正常に見つけられない場合、DRT はDRT_ALONE状態になります。 DRT はDRT_ALONE状態のままであり、ピアを見つけてDRT_ACTIVE状態に移行するために定期的にブートストラップを試みます。
ノードは、DRT_ACTIVEからこれらの状態に移行できます。
ライフ サイクルの状態 | 条件 |
---|---|
DRT_ALONE | ローカル ノードが DRT 内の他のノードを検出していません。 この状態の間、ノードは引き続き DRT 内の他のノードをリッスンします。 別のノードが DRT に参加すると、ローカル ノードはDRT_ACTIVE状態に遷移します。 ネットワークがダウンしている場合は、DRT_NO_NETWORKに移行します。 DRT で重大なエラーが発生した場合、ノードはDRT_FAULTED状態に移行します。 |
DRT_NO_NETWORK | ノードがネットワーク接続を失うと、DRT_NO_NETWORK状態に遷移します。 この時点で、アプリケーションはネットワーク接続が復元されるのを待ち、DRT を閉じることができます。 |
DRT_FAULTED | ローカル ノード内で重大なエラーが発生しました。 たとえば、ローカル コンピューターが物理メモリを使い切った場合などです。 ノードがこの状態になる間、アプリケーションは DrtClose API を呼び出し、問題を修正し、 DrtOpen を使用して DRT を再初期化する必要があります。 |