Что это означает, что ключи Kademlia используются для идентификации узлов, а также данных? - PullRequest
1 голос
/ 09 января 2020

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

Я совершенно запутался в этой 'обе' части.

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

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

  1. Клиент (.exe) загружается
  2. Создает компонент узла
  3. Недавно созданный узел присоединяется к сети (начальная загрузка)
  4. Отправляет find_node (fileha sh) для k-ближайших узлов
    • Допустим, ha sh генерируется двоичным файлом хэширования с именем file1.txt
  5. Полученные узлы каждый находит запрашиваемый файл sh в его другой га sh таблице
    • Скажем, карта ха sh со списком файлов (Файл Ха sh, местоположение файла)
  6. Шаг 4,5 повторяется до тех пор, пока узел не будет найден (пока все связанные узлы обновляют сегменты)

Выглядит ли этот поток в порядке?

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

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

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

1 Ответ

1 голос
/ 09 января 2020

Выглядит ли этот поток хорошо?

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

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

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

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

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

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

В документе описывается только базовая c функциональность для алгоритма маршрутизации и большинство базовых c значение ключа хранения. Это сферическая корова в вакууме. Реальные реализации обычно нуждаются в дополнительных функциях или обходят проблемы безопасности и надежности, с которыми сталкиваются в publi c inte rnet.

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

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

...