Понимание Kademlia find_node и добавление узлов в таблицу маршрутизации - PullRequest
0 голосов
/ 24 июня 2018

Я читаю документ Kademlia и пытаюсь реализовать кусок таблицы маршрутизации.

Я использую 160-битное адресное пространство и у меня есть массив из 160 k-сегментов. Из того, что я понимаю, эта реализация будет хранить идентификаторы узлов в сегментах по тому, сколько старших нулей битов имеет идентификатор узла. То есть bucket[0] будет иметь идентификаторы узлов с 160 ведущими нулями (только 1 узел), а bucket[159] будет иметь узлы без ведущих нулей (50% всего адресного пространства).

Вопрос Используя эту реализацию, при поиске ближайших k-узлов к целевому nodeId я бы просто посчитал начальные нули для цели и возвратил все в этом k-сегменте?

Используя эту реализацию, я не вижу места / необходимости использовать XOR, из которого построен Kademlia, поэтому я не думаю, что моя реализация верна.

1 Ответ

0 голосов
/ 26 июня 2018

Первый заголовок: статья, на которую вы ссылаетесь, является версией до разбирательства, содержащей только базовый набросок без последующих уточнений .Макет таблицы маршрутизации массива из 160 блоков является упрощенным подходом для доказательства статьи, более поздние версии представляют более сложную таблицу на основе дерева.

Т.е. корзина [0] будет иметь идентификаторы узлов с 160начальные нули (только 1 узел) и сегмент [159] будут иметь узлы без начальных нулей (50% всего адресного пространства).

Ну, вы можете сделать это таким образом, но это прощепросто посчитать начальные нули на расстоянии xor и использовать его в качестве индекса.Т.е. 0 битов общего префикса = нет (0) начальных нулей = buckets[0] = корзина, наиболее удаленная от вашего собственного идентификатора.

Вопрос При использовании этой реализации при поиске ближайших k-узлов к целевому nodeId будетЯ просто подсчитываю начальные нули для цели и возвращаю все в этом k-сегменте?

Ниже предполагается, что вы спрашиваете, как ответить на запросы удаленного узла.

Сегменты в плоской компоновке таблицы маршрутизации организованы с учетом вашего собственного идентификатора узла.При ответе на запросы для некоторого произвольного идентификатора цели это не обязательно совпадает с близостью к этой цели.Таким образом, самый простой подход - просто просканировать все заполненные сегменты в таблице маршрутизации и вычислить N ближайших узлов относительно целевого адреса запроса, а затем вернуть их в качестве ответа.Чтобы избежать полного сканирования, потребовалась бы некоторая арифметика для метрики xor, чтобы найти правильные локальные сегменты , но я сделал это только для древовидного макета, а не для плоского макета.

...