В своем новом проекте выходного дня я решил написать клиент BitTorrent с нуля, без каких-либо готовых к использованию библиотек. После двух дней поиска документации я уже сдаюсь: smile :. Я знаю, что существуют BEP, но их далеко не достаточно для понимания всей спецификации. Прочитав намного больше, я думаю, что протоколы отслеживания и одноранговых узлов кажутся старыми и легкими для понимания / реализации (да, я знаю, чтобы написать хороший код с балансом, выбором одноранговых узлов, оптимизацией, это непросто, как я только что сказал, но все, чего я хочу, - это делать основы, чтобы учиться, а не конкурировать с десятками хороших клиентов.)
Итак, я решил начать с DHT, который кажется более сложной частью, а также менее документированной. Когда вы перестанете искать bittorrent DHT или mainline DHT и начнете искать kademlia DHT, у вас будет намного больше информации, но не так очевидно, как все это собрать.
Вот что я понимаю до сих пор (и есть пробелы, которые я надеюсь заполнить):
- Я начинаю с пустого дерева DHT
- использовать
find_nodes
на моем узле начальной загрузки - добавить полученные узлы в свое собственное дерево, чтобы затем я мог выбрать те, которые ближе к моему собственному идентификатору
- начать выдавать
find_nodes
выбранным и добавить их ответы в мое дерево - вернитесь к 3, пока я не перестану получать неизвестные / новые узлы
- если я получаю
announce_peer
сinfo_hash
, я должен сохранить его информацию в локальной БД (info_hash и ip / порт отправителя) - если узел использует
get_peers
сinfo_hash
, который у меня есть в моей БД, я отправляю информацию, в противном случае я должен отправить список ближайших узлов, которые у меня есть в моем собственном дереве (ближайший к этому info_hash) - когда я использую
get_peers
на других узлах, я получаю одноранговые узлы или узлы, в последнем случае я думаю, что узлы ближе кinfo_hash
, а не к моему собственномуnodeId
, поэтому должен ли я добавить эти узлы в свое дерево или начать новое дерево на основе их? - когда я хочу объявить, что меня интересует
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?
Приветствуется любая реальная документация, схемы, все, что угодно!