Выглядит ли этот поток хорошо?
Это выглядит примерно правильно, но ваша формулировка не очень точная.
У каждого узла есть таблица маршрутизации, по которой он организует соседей, о которых он знает, и другую таблицу, в которой он организует данные, которые его просят хранить другие. Узлы имеют квазислучайный идентификатор, который определяет их положение в пространстве ключей маршрутизации. Хеши ключей для хранимых данных не точно совпадают с каким-либо конкретным идентификатором узла, поэтому данные хранятся на узлах, идентификатор которых наиболее близок к га 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)