Вопрос может быть устаревшим, но в любом случае.
Как уже упоминалось, самый простой способ сказать "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.)