Основной процесс начальной загрузки DHT

Может кто-нибудь прояснить мне утверждение из спецификации основного DHT?

После вставки первого узла в его таблицу маршрутизации и после запуска после этого узел должен попытаться найти самые близкие узлы в DHT к себе. Это делается путем выдачи сообщений find_node все более и более близким узлам, пока он не может найти что-либо более близкое.

Что значит "пока не может найти ближе"?

Когда моя программа начинает отправлять сообщения find_node, она имеет пустой набор узлов. Каждый ответ на сообщение find_node возвращает около 8 dht узлов. Моя программа собирает их в списке.

Когда моя программа должна прекратить отправку сообщений о поиске узла?

Я думаю, что он должен прекратить отправку, когда он получит набор узлов dht, все элементы которых находятся в списке уже собранных узлов?

Я прав?

Заранее спасибо.

1 ответ

Решение

Mainline DHT является реализацией kademlia, подробности см. В документе.

Получив 8 узлов, отсортируйте их по близости их идентификаторов к своему собственному идентификатору, затем отправьте find_node 3 лучших (3 ближайших к вам). Затем вы получите еще 8 х 3 узла, вставьте их в свой список узлов, все еще упорядочив их по степени близости к вам. Продолжай посылать find_node сообщения на 3 верхних узла (игнорируя те, на которые вы уже отправили сообщения), пока вернувшиеся узлы уже не будут в вашем списке. то есть условие завершения - вы отправили сообщение всем 8 ближайшим к вам узлам (вверху списка).

Как поясняется в статье, метрика расстояния равна XOR. Чтобы вычислить, как далеко ваш идентификатор узла находится от другого узла, вы XOR идентификаторы узла. Чем ниже результат, тем ближе узлы друг к другу.

В реальной жизни вы можете захотеть сделать это немного сложнее, сохраняя 3 невыполненных запроса в любой момент времени и временно открывая более невыполненные запросы на половине тайм-аута.

Другие вопросы по тегам