Kademlia DHT の結合プロセスについて頭を悩ませることはできません。オンラインでいくつかのチュートリアルとプレゼンテーションを見てきましたが、それらはすべて同じように言っているようで、すべての疑似コードなどはほとんど同じです (実際のコピー/貼り付け)。
誰かがこれについて高レベルのウォークスルーを提供できますか?
Kademlia の論文を読んだことがあると思います。これは私の記事「カデムリア DHT の紹介と仕組み」からの抜粋です。
背景情報:
Kademlia ネットワークを実行している場合、ネットワークに参加するために、他のすべてのノードが認識しているノードが常に存在する必要があります。これを Bootstrap ノード と呼びましょうBN
。
K
は、ノードのルーティング テーブル内のバケットのサイズと、データの一部を保存する必要があるノードの量を決定する Kademlia の定数です。
参加プロセス:
新しいノードNN
は、NodeId (何らかの方法で割り当てられます) と IP アドレス (ホストされているコンピューターの IP) を使用して作成されます。
NN
にを送信LookupRequest(A.NodeId)
しBN
ます。ルックアップ リクエストは基本的に、特定の NodeId に認識されている K-Closest ノードを受信ノードに要求します。この場合、BN
は、認識している K-Closest ノードを返しNN
ます。
BN
NN
がルーティング テーブルに追加されるようNN
になり、ネットワークに追加されます。
NN
から自身に K-Closest ノードのリストを受け取りBN
ます。ルーティング テーブルにNN
追加します。BN
NN
から受信したこれらの K ノードに ping を実行しBN
、応答したノードが、距離に基づいて必要なバケット内のルーティング テーブルに追加されます。これらのノードに ping を実行することで、ノードの存在を認識し、ルーティング テーブルにNN
追加します。NN
NN
は現在ネットワークに接続されており、ネットワーク上のノードによって認識されています。
NN
各 K-Buckets をループするようになりました
foreach(K-Buckets as KB)
1. NN generates a random NodeId `RNID` // A NodeId that will be in KB
2. NN sends LookupRequest(RNID) to the K-Closest nodes it knows to RNID.
3. The response will be K nodes closest to RNID.
4. NN now fills KB.
NN
これらのバケットを満たすために、バケットごとにこれを行います。この操作の後NN
、ネットワーク上で自分自身から離れたさまざまな距離にあるノードをよりよく把握できます。
注:この手順は必須ではありませんが、各ノードがネットワークに参加したときにネットワークをよりよく把握できるように、Kademlia の実装で実行しました。
An Introduction to Kademlia DHT & How It Worksで Kademlia の完全な紹介を書きました
私の推測では、いくつかのスーパー ノードと地理空間情報を使用して、最小スパニング ツリーを計算しています。また、スーパー ノードからボロノイ図または二重ドローネ三角形分割を計算し、それを使用して近接検索を実行することもできます。例を次に示します: http://www.mathworks.de/de/help/matlab/math/spatial-searching.html。