bittorrent DHT подробная спецификация

В своем новом проекте выходного дня я решил написать клиент BitTorrent с нуля, без каких-либо готовых к использованию библиотек. После двух дней поиска документации я уже сдаюсь: smile :. Я знаю, что существуют BEP, но их далеко не достаточно для понимания всей спецификации. Прочитав намного больше, я думаю, что протоколы отслеживания и одноранговых узлов кажутся старыми и легкими для понимания / реализации (да, я знаю, чтобы написать хороший код с балансом, выбором одноранговых узлов, оптимизацией, это непросто, как я только что сказал, но все, чего я хочу, - это делать основы, чтобы учиться, а не конкурировать с десятками хороших клиентов.)

Итак, я решил начать с DHT, который кажется более сложной частью, а также менее документированной. Когда вы перестанете искать bittorrent DHT или mainline DHT и начнете искать kademlia DHT, у вас будет намного больше информации, но не так очевидно, как все это собрать.

Вот что я понимаю до сих пор (и есть пробелы, которые я надеюсь заполнить):

  1. Я начинаю с пустого дерева DHT
  2. использовать find_nodes на моем узле начальной загрузки
  3. добавить полученные узлы в свое собственное дерево, чтобы затем я мог выбрать те, которые ближе к моему собственному идентификатору
  4. начать выдавать find_nodes выбранным и добавить их ответы в мое дерево
  5. вернитесь к 3, пока я не перестану получать неизвестные / новые узлы
  6. если я получаю announce_peer с info_hash, я должен сохранить его информацию в локальной БД (info_hash и ip / порт отправителя)
  7. если узел использует get_peers с info_hash, который у меня есть в моей БД, я отправляю информацию, в противном случае я должен отправить список ближайших узлов, которые у меня есть в моем собственном дереве (ближайший к этому info_hash)
  8. когда я использую get_peers на других узлах, я получаю одноранговые узлы или узлы, в последнем случае я думаю, что узлы ближе к info_hash, а не к моему собственному nodeId, поэтому должен ли я добавить эти узлы в свое дерево или начать новое дерево на основе их?
  9. когда я хочу объявить, что меня интересует info_hash, следует ли мне использовать announce_peer везде или только для узлов с nodeId ближе к цели info_hash? Насколько это ближе?

На данный момент у меня есть много узлов, идентификаторы которых ближе к моему собственному идентификатору, и информация об info_hash'es меня не особо интересует.

Боюсь, у меня возникнет гигантский глупый вопрос: зачем я это сделал?

Я имею в виду: моя эгоистичная причина проделать всю эту работу - найти пиров для интересующего меня info_hash. Я понимаю, что информация одного info_hash, вероятно, будет сохранена на узле, идентификатор которого ближе к этому info_hash. Так что мои шансы найти его информацию будут больше, если я создам дерево узлов ближе к info_hash, а не ближе к моему собственному идентификатору (на этом этапе, если вы знаете тему, вы уже заметили, насколько я потерялся).

Стоит ли создавать кратные деревья? Одно для меня (чтобы я мог сохранять информацию о info_hashes ближе к моему nodeID, который мне присылают люди), а другое дерево ближе к каждому из моих целевых info_hashes, чтобы я мог получить их информацию?

Должен ли я создать единое дерево ближе к моему идентификатору узла и надеяться на лучшее при запросе этого дерева на предмет необходимых мне info_hashes?

Стоит ли мне сдаваться, если я вообще неправильно понял идею DHT?

Приветствуется любая реальная документация, схемы, все, что угодно!


person Gustavo Vargas    schedule 22.05.2017    source источник
comment
Это видео хорошо объясняет основы млDHT. Это может помочь понять, как работает BitTorrent DHT.   -  person Encombe    schedule 26.05.2017


Ответы (1)


Итак, я решил начать с DHT, который кажется более сложной частью, а также менее документированной.

Обязательно к прочтению оригинальную статью kademlia "Kademlia: одноранговая информационная система, основанная на метрике XOR" Питера Маймункова и Дэвида Мазьера. На него довольно рано ссылаются в BEP-5.

если я получаю announce_peer с info_hash, я должен сохранить его информацию в локальной БД (info_hash и ip / порт отправителя)

Вы принимаете объявления, только если они содержат жетон, ранее выданный через get_peers.

когда я использую get_peers на других узлах, я получаю одноранговые узлы или узлы, в последнем случае я думаю, что узлы ближе к info_hash, а не к моему собственному nodeId, поэтому следует ли мне добавлять эти узлы в свое дерево или начинать новое дерево на основе их?

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

когда я хочу объявить, что меня интересует info_hash, следует ли мне использовать анонс_peer везде или только для узлов с nodeId ближе к целевому info_hash? Насколько это ближе?

Вы выполняете get_peers поиск, и когда он завершается, вы объявляете ???? ближайшему набору узлов, который вернул маркер записи, и проверяете ответы, чтобы убедиться, что вы действительно получили. В случае bittorrent ???? = 8.

Моя эгоистичная причина проделать всю эту работу - найти пиров для интересующего меня info_hash. Я понимаю, что информация одного info_hash, скорее всего, будет сохранена на узле, идентификатор которого ближе к этому info_hash. Так что мои шансы найти его информацию будут больше, если я создам дерево узлов ближе к info_hash, а не ближе к моему собственному идентификатору (на этом этапе, если вы знаете тему, вы уже заметили, насколько я потерялся).

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

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

Обратите внимание, что всю информацию, содержащуюся в этом ответе, можно найти в статье BEP или Kademlia.

person the8472    schedule 26.05.2017
comment
Теперь, когда я провожу несколько ночей, изучая это, я понимаю, что вы правы, и вся информация была там, но в очень сжатой форме, когда вы не знаете, что ищете (то же самое верно и для любой другой информации, я полагаю :)). Идея о том, что вы работаете над сбором данных, чтобы помочь другим, а не себе, была главной причиной моих сомнений. Теперь я понимаю! С прошлой ночи я могу помочь другим перенаправить себя и найти свой info_hash в простом коде nodejs, который работает нормально! Был хороший проект ... Теперь на связи со сверстниками ... Спасибо! - person Gustavo Vargas; 27.05.2017