Основной процесс начальной загрузки 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 невыполненных запроса в любой момент времени и временно открывая более невыполненные запросы на половине тайм-аута.