Как понять протокол Kademlia(KAD)

недавно я прочитал документ протокола Kademlia, я попытался понять протокол, но у меня все еще есть некоторые вопросы: Почему узел должен найти другой узел, когда он знает его ID, но ip или порт? Почему у него есть ID, пока он не знает ip или порт, где он получил ID? Я думаю, что "расстояние" между двумя разными узлами не является расстоянием маршрутизации или реальным расстоянием, это только виртуальное расстояние, которое может использовать алгоритм для быстрого поиска узла, это так?

может мой английский не очень понятен, потому что английский не мой родной язык, но я постараюсь выразиться ясно, если вам нужно. Большое спасибо!

2 ответов


Как сказал ЧАО, распределенный характер сети означает, что узлы должны публиковать свои идентификаторы и свои контактные данные другим узлам, с которыми они разговаривают. Нет центрального места, где идентификаторы сопоставляются с контактной информацией, поэтому каждый узел должен сохранить это сопоставление для подмножества узлов в сети в своей собственной таблице маршрутизации.

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

использование побитового XOR в качестве меры условного расстояния между идентификаторами имеет то преимущество, что для данного целевого идентификатора никакие два идентификатора не могут иметь одинаковое расстояние до цели.

представьте себе простой пример, где идентификаторы находятся в диапазоне от 00 до 63. Если бы Кадемлия использовал, например, чистую математическую разницу в качестве меры расстояния, 15 и 35 были бы одинаковыми расстояниями до 25 - оба имели бы расстояние 10. Используя XOR, расстояние между 15 и 25 составляет 22, и между 25 и 35 это 58.

таким образом, группа из k ближайших идентификаторов к целевому идентификатору может быть вычислена однозначно.

константа k имеет несколько применений в Kademlia, но это в первую очередь фактор репликации. Другими словами, часть данных хранится на k ближайших узлов к ID данных.

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

из-за этого pure Kademlia не подходит для поиска только одного узла, поэтому я не уверен, что часть вашего вопроса слишком актуальна. Если вы хотите использовать Kademlia для поиска одного узла, вероятно, стоит изменить процесс поиска, чтобы завершить его раньше, как только какой-либо узел возвращает контактные данные целевого узла (так же, как поиск заканчивается раньше, если целевое значение найдено во время процесса).


поскольку сеть распределена, по определению, нет ни одной главной таблицы сопоставлений ID - >address. Узлы не должны (и обычно не знают) знать обо всех других узлах. Процесс "нахождения" узла в основном заключается в том, чтобы спросить известные узлы, "ближайшие" к цели, не столько о целевом узле напрямую, сколько о какие узлы ближе к цели. Результат этого запроса дает вам следующую группу узлов для запроса, и процесс повторяется -- и потому, что узел будет возвращать результаты, которые ближе, чем это, каждая итерация имеет тенденцию находить узлы ближе и ближе к цели, пока Вы, наконец, не достигнете узла, который может сказать: "о, узел X? Он вон там."

по крайней мере, это то, что я понимаю его.