Hello World для существующей DHT - PullRequest
4 голосов
/ 25 мая 2011

Я знаком с теорией работы распределенной хэш-таблицы (DHT).Можно ли написать программу, которая хранит данные в существующем DHT (например, Kademlia или Mainline DHT)?Существует ли простая программа типа «Hello World», которая показала бы самый простой способ сделать это?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Лучшим миром приветствия для DHT будет отправка 'ping' в DHT Битторрента на узел начальной загрузки. Шаги:

  1. Bencode a KRPC PING сообщение.
  2. Отправка через UDP на узел начальной загрузки .
  3. Подождите ответа.

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

2 голосов
/ 19 января 2014

Вопрос может быть устаревшим, но в любом случае.

Как уже упоминалось, самый простой способ сказать "Hello" существующему DHT - это отправить сообщение ping на один из узлов DHT. Давайте рассмотрим основную DHT (MDHT) на базе Kademlia.

Есть сервер начальной загрузки по адресу router.bittorrent.com на порту 6881. Вы можете думать об этом сервере как об общем узле DHT, который постоянно подключен к сети. Кроме того, вы можете использовать другой узел, например локально запущенный торрент-клиент, который использует DHT.

Я написал небольшой пример на Python:

import bencode
import random
import socket


# Generate a 160-bit (20-byte) random node ID.
my_id = ''.join([chr(random.randint(0, 255)) for _ in range(20)])

# Create ping query and bencode it.
# "'y': 'q'" is for "query".
# "'t': '0f'" is a transaction ID which will be echoed in the response.
# "'q': 'ping'" is a query type.
# "'a': {'id': my_id}" is arguments. In this case there is only one argument -
# our node ID.
ping_query = {'y': 'q',
              't': '0f',
              'q': 'ping',
              'a': {'id': my_id}}
ping_query_bencoded = bencode.bencode(ping_query)

# Send a datagram to a server and recieve a response.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(ping_query_bencoded,
         (socket.gethostbyname('router.bittorrent.com'), 6881))
r = s.recvfrom(1024)

ping_response = bencode.bdecode(r[0])

print(ping_response)

Я использовал bencode модуль для кодирования и кодирования сообщений.

Более подробную информацию о протоколе DHT Mainline можно найти в этом документе . (Обратите внимание, что протокол немного отличается от оригинального протокола Kademlia.)

...