Как работает DHT? - PullRequest
       50

Как работает DHT?

4 голосов
/ 08 октября 2011

Я взял основную идею о DHT из вики:

Данные хранилища:

В сети DHT каждый узел отвечает за определенный диапазон key-space.Чтобы сохранить файл в DHT, сначала hash the file's name to get the file's key;во-вторых, send a message put(key, file-content) to any node of the DHT, сообщение будет передано на узел, который отвечает за key, и этот узел будет хранить пару (key, file-content).

Получить данные:

При получении файла из DHT, сначала, хэшируйте имя файла, чтобы получить key;второй отправить сообщение get(key) на любой узел, ретранслировать сообщение до ...

Вопросы:

  1. Чтобы сохранить файл, мы можем хэшироватьимя файла, чтобы получить его key, но вики говорит:

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

Хэш-содержимое файла?Как мне узнать содержимое файла ?Если я уже знаю содержимое файла, то ПОЧЕМУ я буду искать его в DHT?

Согласно вики, каждый участвующий узел сэкономит место для хранения файлов.Значит ли это, что, если я участвую в DHT, мне нужно spare 10G disk space, чтобы сохранить те файлы, за которые я key falls into the specific key-space отвечаю?

Если действительно я должен сэкономитьместа на диске для хранения этих файлов, тогда как мне хранить эти (key, file-content) на диске?Я имею в виду, должен ли файл быть вписан в B-tree или что-то на моем диске?

Когда происходит запрос, как отвечает мой компьютер?Я предполагаю, во-первых, проверить queried key, если в моем key-space, а затем найти corresponding file на моем диске.верно?

1 Ответ

1 голос
/ 25 ноября 2014

DHT - это просто алгоритм. В своей основе он обеспечивает распределенные операции PUT и GET со значением ключа. Подобно обычной карте или ассоциативному массиву, найденному во многих языках программирования.

Из-за реальных ограничений, таких как ненадежные узлы, частота отказов и т. Д. В реальных реализациях DHT, не предусмотрена операция произвольной длины PUT(<uint8[]>, <uint8[]>).

Пример:

Например, реализация kademlia для bittorrent предоставляет следующие интерфейсы:

  • PUT(uint8[20], uint16)
  • GET(uint8[20]) -> List<Pair<IP, uint16>>, где список представляет собой только случайное подмножество фактических данных

Как вы можете видеть, на самом деле это специализированный асимметричный интерфейс по сравнению с более общими ассоциативными массивами. IP-адрес всегда получается из исходного адреса отправителя PUT, то есть не может быть задан явно. И GET возвращает список вместо одного значения, поэтому он реализует MultiMap или Map<List>, если вы хотите увидеть его таким образом.

В случае bittorrent в качестве дескриптора контента используется хеш, в котором одноранговые узлы, имеющие контент, объявляют себя в DHT. Если кому-то нужны файлы, они ищут пары IP / порт на DHT, затем связываются с партнерами по отдельному протоколу, а затем загружают данные.

Но возможны и другие варианты использования DHT, то есть они могут хранить подписанные, структурированные данные, текстовые фрагменты в виде твитов или что-либо еще. Это всегда зависит от потребностей ваших приложений.

Это просто базовый строительный блок.

...