Что означает, что ключи Kademlia используются для идентификации узлов, а также данных?

Хорошо, я читал статьи и бумага о Kademlia недавно реализовала простую программу p2p, которая использует алгоритм kademlia dht. И в этих документах говорится, что этот 160-битный ключ в узле Kademlia используется для идентификации обоих узлов (ID узла) и данных (которые хранятся в виде кортеж).

Я совсем запутался в этой части "оба".

Насколько я понимаю, каждый узел в двоичном дереве Kademlia однозначно представляет клиента (IP, порт), каждый из которых содержит список файлов.

Вот общий поток в моем понимании.

  1. Клиент (.exe) загружается
  2. Создает компонент узла
  3. Вновь созданный узел присоединяется к сети (самозагрузка)
  4. Sends find_node(filehash) to k-closest nodes
    • Let's say hash is generated by hashing file binary named file1.txt
  5. Received nodes each finds the queried filehash in its different hash table
    • Say, a hash map that has a list of files(File Hash, file location)
  6. Шаг 4,5 повторяется до тех пор, пока узел не будет найден (при этом все связанные узлы обновляют сегменты)

С этим потоком все в порядке?

Кроме того, метод начальной загрузки Kademlia меня тоже смущает. Когда узел создается (пользователь выполняет программу), кажется, что он использует узел начальной загрузки для заполнения ведер. Но тогда что такое загрузочный узел? Это другой процесс, который всегда работает? Что делать, если узел начальной загрузки отключается?

Может ли кто-нибудь помочь мне лучше понять концепцию?

Спасибо за помощь заранее.


person vaska11    schedule 09.01.2020    source источник


Ответы (1)


С этим потоком все в порядке?

Вроде примерно правильно, но ваша формулировка не очень точна.

У каждого узла есть таблица маршрутизации, в которой он упорядочивает известных ему соседей, и другая таблица, в которой он упорядочивает данные, которые его просят сохранить другие. Узлы имеют квазислучайный идентификатор, определяющий их позицию в пространстве ключей маршрутизации. Хеши ключей для сохраненных данных не совпадают точно с каким-либо конкретным идентификатором узла, поэтому данные хранятся на узлах, чей идентификатор ближе всего к хэшу, как определено метрикой расстояния. Вот как идентификаторы узлов и хэши ключей используются для обоих.

Когда вы выполняете поиск данных (т. е. find_value), вы запрашиваете у удаленных узлов набор k-ближайших соседей, который у них есть в их таблице маршрутизации, что позволит вам найти набор k-ближайших соседей. для конкретного целевого ключа. Тот же запрос также просит удаленный узел вернуть любые данные, которые у них есть, соответствующие этому целевому идентификатору.

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

Это абстрактные операции, при необходимости реальная реализация может отделить поиск от поиска данных, т. е. сначала выполнить find_node, а затем использовать набор результатов для выполнения одной или нескольких отдельных операций get, которые не включают дополнительные поиски соседей (аналогично операция store).

Поскольку kademlia основана на UDP, вы не можете обслуживать произвольные файлы, потому что они могут легко превысить разумные размеры пакетов UDP. Таким образом, на практике kademlia обычно служит просто хеш-таблицей для небольших двоичных значений (например, контактной информации, открытых ключей и т. д.). Массовые операции выполняются либо другими протоколами, загруженными из этих значений, либо дополнительными операциями, помимо тех, что упомянуты в документе kademlia.

То, что описывается в документе, — это только базовая функциональность алгоритма маршрутизации и самое основное хранилище значений ключей. Это сферическая корова в вакууме. Фактические реализации обычно требуют дополнительных функций или обхода проблем безопасности и надежности, с которыми сталкиваются в общедоступном Интернете.

Но тогда что такое загрузочный узел? Это другой процесс, который всегда работает? Что делать, если узел начальной загрузки отключается?

Это рассматривается в этом вопросе (на примере BitTorrent DHT)

person the8472    schedule 09.01.2020