вторник, 17 января 2012 г.

Запуск DHT

> посути то eMule также работает
Что не удивительно, даже алгоритм DHT у обоих Kademlia. Конечно реализации в деталях тотально разные (напрочь разные протоколы и выбор ряда технических параметров Kademlia + у осла куча своих собственных кастомных оптимизаций логики) но общая идея их работы достаточно похожа на то что описано в доке от создателей этого алгоритма.

http://www.opennet.ru/openforum/vsluhforumID3/82411.html#35

Если оно кому надо - могу рассказать как Transmission стартует и какие есть варианты там и как их поюзать

Эта "магия" живет в libtransmission (и не зависит от платформы и морды, соответственно) - файл tr-dht.c (прослойка между трансмиссией и либой DHT). При старте трансмиссии, если DHT разрешен, дергается функция tr_dhtInit. Из оной дергается функция с говорящим названием dht_bootstrap.

1) После при инициализации dht трансмиссия первым делом смотрит (из tr_dhtInit) есть ли файлик dht.dat в конфигурационной дире. Это бинарный файлик в формате bencoded (как и .torrent файлы). В нем записаны:
* ID вашей ноды. ID создается рандомным при первом запуске. Просто рандомные 20 байтов (по размеру ключей в таблице, а он такой благодаря SHA1). Ваш ID в таблице. Фанаты приваси могут захотеть иногда подтирать это. Прихранивается потому что у вас в bucket-ах коллекционируются ноды с похожими на ваш ID. При шатдауне наколлекционированное сохраняется в dht.dat. Логично что если не сохранять ID, при следующем старте ID сохраненных узлов будут уже совсем не похожи (что не фатально, но затянет "выход на крейсерский режим").
* Список известных DHT нод, ipv4 и ipv6. Если вы раньше уже юзали трансмиссию и она где-то нашла ноды - взлет будет произведен именно с них, прихраненных при завершении трансмиссии в прошлый раз. В общем случае это наиболее эффективный и довольно надежный способ и даже через годик обычно хоть кто-то живым в таком списке все-таки оказывается.

2) Дергается функция dht_bootstrap. Если у вас уже был файлик dht.dat с живыми узлами то первым делом эти узлы и опробуются на живость. Обычно этого достаточно и DHT взлетает. Однако если не повезло, узлов не было (первый старт клиента или все померли) - опробуются и иные варианты:
- Делается попытка прочесть в конфигурационной дире файл dht.bootstrap. Это текстовый файл с списком узлов в формате ADDRESS PORT (адрес и порт разделены пробелом, в адресе допустимо указание DNS имени). По умолчанию его нет, однако авторы конкретной сборки/пакета и прочие кто раздает клиент юзерам или развертывает какой-то совсем приватный dht в своем уютном интранетике под внутренние задачи - в своем праве положить это туда. Ну или после ядерной войны вы и сосед можете записать туда адреса друг друга, став первыми 2 узлами всей сети :)
- Если и это не прокатило (например файлика нет), трансмиссия в цикле пытается изредка достукаться до стартового узла по адресу dht.transmissionbt.com 6881 (стартовый узел авторов трансмиссии). Это на случай когда взлететь иначе ну совсем не вышло.

Кстати говоря, bootstrap - асинхронный, логика DHT при этом живет своей жизнью, а указанные действия делает вспомогательный тред. Поэтому DHT может взлететь в процессе всех этих действий из-за иных факторов.

Например если какой-то узел сделает входящее соединение к вам, угадав или узнав IP и порт - dht взлетит с него, добавив его себе в buckets своими силами в рамках общей логики работы DHT работающей всегда. А в TCPшном протоколе торрента клиент поддерживающий DHT указывает этот факт, поэтому есть логика добавляющая таких клиентов в bucket'ы DHT. Так что если вы качаете что-то, найдя единомышленников через обычный трекер или броадкастом в местной LAN (LPD) - DHT с удовольствием взлетит с этих клиентов (с тех которые DHT умеют). Эта логика живет в peer-msgs.c (где делается вызов dhtAddNode для торрент-клиентов приславших характерное сообщение PORT, намекающее что они умеют dht).

Итого: я их дожал - dht у вас должен взлетать практически всегда без ваших усилий. Ну и теперь вы знаете как после ядерной войны запускать "с толкача" (dht.bootstrap в руки) и нафига нужны некоторые файлы в конфигурационной дире :)

Комментариев нет:

Отправить комментарий