私は分散型にしたいp2p実装をコーディングしていますが、ビットトレントのようなプロトコルでDHTがどのように機能するかを把握するのに苦労しています。トラッカーがない場合、クライアントはピアがどこにあるかをどのように知るのですか?ピアは実際のトレントファイルに保存されていますか?
トラッカーレス/ DHTトレントでは、BitTorrentインフォハッシュをキーとして使用して、ピアIPアドレスがDHTに保存されます。基本的にすべてのトラッカーはput/getリクエストに応答するため、この機能はDHT(分散ハッシュテーブル)が提供するインターフェイスに正確に対応しています。これにより、infohashによってIPアドレスを検索してDHTに保存できます。
したがって、「get」リクエストはBT情報ハッシュを検索し、IPアドレスのセットを返します。 「put」は、特定の情報ハッシュのIPアドレスを保存します。これは、ピアIPアドレスのディクショナリを受信するためにトラッカーに送信する「アナウンス」リクエストに対応します。
DHTでは、キースペースのごく一部に属する値を格納するためにピアがランダムに割り当てられます。ハッシュにより、キーは参加ピア間でランダムに分散されます。 DHTプロトコル( Kademlia BitTorrentの場合)は、特定のキーのIPアドレスリストを管理するピアにput/get要求が効率的にルーティングされるようにします。
一般的な理論は、ウィキペディアの Kademlia に関する記事にあります。 bittorrentで使用される特定のプロトコル仕様はこちらです。 http://wiki.theory.org/BitTorrentDraftDHTProtocol
BittorrentとDHTで起こることは、bittorrentが最初にトレントファイルに埋め込まれた情報を使用して、DHTからトラッカーまたはノードセットのいずれかに移動することです。その後、1つのノードが見つかると、他のノードを探し続け、DHTを使用して持続することができ、それを維持するための集中型トラッカーは必要ありません。
元の情報は、DHTの以降の使用をブートストラップします。
DHTノードには、Node IDと呼ばれる一意の識別子があります。 Node IDは、BitTorrent情報ハッシュと同じ160ビットスペースからランダムに選択されます。近さは、Node IDのルーティングテーブルを比較することで測定されます。ノードが近いほど、詳細になり、最適な結果が得られます。
次に、単純な符号なし整数を使用した前の「Kademlia」よりもそれらを最適化するもの:distance(A、B)= | A xor B |値が小さいほど近いです。 XOR。安全ではないことに加えて、そのロジックには欠陥がありました。
クライアントがDHTをサポートしている場合、0x09の後にUDPポートとDHTノードを持つ2バイトのペイロードが含まれる8バイトが予約されています。ハンドシェイクが成功した場合、上記が続行されます。