9

内部クラスター用に独自の dht を実装中です。bittorrent のようなファイル共有プログラムで使用されるため、最初に見たのは「Mainline DHT」でした。その後、「絡み合った」(python、ツイストマトリックスを使用したdht)、議会(python、pyev + libevを使用したdht)、そしてもちろんオリジナルの「kademlia」を見つけました。

k-bucket を整理するためのさまざまなアプローチがあります。

1) 議会、kademlia は、0 <= i < 160 の場合、2* i <= (各 ID の差) < 2 *(i+1) の範囲で固定の 160 バケットを使用します。

2) メインラインの DHT と entangled はダイナミック バケットを使用します。最初は、スペース全体をカバーするバケツが 1 つしかありません。8 つの生きているノードでいっぱいになると、バケットは 2 つの新しいノードに分割されます。ただし、そのバケット内に独自の ID がある場合のみ。そうでない場合 -- バケットは決して分割されません。そのため、すぐに 160 個の最も近いバケットとその他のバケットがいくつかあります。

どちらのバリアントでも十分です。しかし、IDがバケットに属しているかどうかを検出するロジックに大きな違いがあることがわかりました。これが私の質問です。

congress と kademlia は、バケット境界線を「私たちからの最小距離」および「私たちからの最大距離」として扱います。したがって、私たち自身の ID は常にbucket0 にあります。バケット 1 の最大 2 つの他の ID (2* 1 <= x < 2 *2 の距離をカバーするため) は、常に私たちに最も近いものになります。だから私の脳は壊れません。

しかし、Mainline DHT または entangled を調べると、xor 距離ではなく、絶対ノード ID 境界として扱われるバケット境界が表示されます。したがって、理論的に完全なテーブル ID では、0、1、2、3、4、5、6、7 が 1 つのバケットになります。

そう。一部の実装では、バケット境界を「私たちからの最大/最小距離」として扱い、他の実装では「最大/最小 160 ビット整数値」として扱うのはなぜですか??

4

1 に答える 1

10

Kademlia の論文では、ルーティング テーブルが大きくなるにつれてバケットを動的に分割する最適化について実際に言及しています。これら 2 つのアプローチに論理的な違いはありません。スペースを節約するための最適化にすぎません。固定のフル サイズのルーティング テーブルを実装する場合、要求を送信する k 個のノードを見つける必要があります。ターゲットが入るバケットが空であるか、その中のノードが k 未満の場合、隣接するバケットから選択する必要があります。そのため、最初から最も近いバケットを分割しないようにすると、その検索がより簡単かつ高速になります。

あなたのポイント(1)については、kademliaを誤解している可能性があると思います。ルーティング テーブルのバケット境界は、常に独自のノード ID に相対的です。また、バケットがまたがる ID スペースは、あなたから離れたバケットごとに 2 倍になります。このプロパティがなければ (たとえば、各バケットが ID 空間の等しい範囲をカバーしている場合)、適切に検索を行うことができず、それらは確かに log(n) ではありません。

メインラインの DHT は kademlia を実装しています。

于 2011-10-10T05:05:30.440 に答える