Как работают магнитные ссылки BitTorrent?

Впервые я использовал ссылку magnet. Любопытно, как это работает, я просмотрел спецификации и не нашел ответов. Вики говорит, что xt означает "точная тема", за которым следует формат (btih в этом случае) с хэшем SHA1. Я видел упоминание base32, зная его 5 бит на символ и 32 символа, я обнаружил, что он содержит ровно 160 бит, что является точно размером SHA1.

Там нет места для IP-адреса или чего-то еще, это просто SHA1. Итак, как клиент BitTorrent находит фактический файл? Я включил URL Snooper, чтобы узнать, посещает ли он страницу (используя TCP) или выполняет поиск или что-то подобное, но ничего не произошло. Я понятия не имею, как клиент находит сверстников. Как это работает?

Кроме того, что такое хэш? Является ли он хешем массива всех хэшей файлов? Может быть, это хэш реального файла торрента (снятие определенной информации)?


В VM я попробовал магнитную ссылку с uTorrent (которая была недавно установлена), и ему удалось найти одноранговых узлов. Откуда появился первый сверстник? Это было свежо, и других торрентов не было.

Ответ 1

Магнитная ссылка BitTorrent идентифицирует торрент с использованием 1 SHA-1 или усеченного хеш-значения SHA-256, известного как "infohash". Это то же значение, которое одноранговые узлы (клиенты) используют для идентификации торрентов при общении с трекерами или другими одноранговыми узлами. Традиционный файл .torrent содержит структуру данных с двумя ключами верхнего уровня: announce, идентифицирующую трекер (ы), который будет использоваться для загрузки, и info, содержащий имена файлов и хэши для торрента. "Infohash" - это хэш кодированных данных info.

Некоторые магнитные ссылки включают трекеры или веб-семена, но они часто этого не делают. Ваш клиент может ничего не знать о торренте, кроме его infohash. Первое, что ему нужно, это найти других пиров, которые скачивают торрент. Для этого используется отдельная одноранговая сеть 2, работающая с "распределенной хэш-таблицей" (DHT). DHT - это большой распределенный индекс, который отображает торренты (определяемые информационными хэшами) в списки пиров (идентифицируемых по IP-адресу и портам), которые участвуют в наборе данных для этого торрента (загрузка/загрузка данных или метаданных).

Когда клиент впервые подключается к сети DHT, он генерирует случайный 160-битный идентификатор из того же пространства, что и информационные мешки. Затем он загружает свое соединение с сетью DHT, используя либо жестко закодированные адреса клиентов, контролируемых разработчиком клиента, либо клиенты, поддерживающие DHT, ранее встречавшиеся в торрент-рое. Когда он хочет участвовать в рое для данного торрента, он ищет в сети DHT несколько других клиентов, чьи идентификаторы как можно ближе 3 к информационному хешу. Он уведомляет этих клиентов о своем желании принять участие в рое и запрашивает информацию о подключении любых знакомых им знакомых, которые участвуют в рое.

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

Наконец, мы можем запросить у этих пиров метаданные torrent info, содержащие имена файлов и список хэшей. После того, как мы загрузили эту информацию и убедились, что она исправлена с использованием известного infohash, мы находимся практически в том же положении, что и клиент, который начал с обычного файла .torrent и получил список пиров из включенного трекера.

Загрузка может начаться.

1 Информационный хэш обычно закодирован в шестнадцатеричном формате, но некоторые старые клиенты вместо этого использовали базу 32. v1 (urn:btih:) напрямую использует дайджест SHA-1, а v2 (urn:bimh:) добавляет префикс multihash для определения алгоритма хеширования и длины дайджеста.
2 Существует две основные сети DHT: более простая "магистральная" DHT и более сложный протокол, используемый Azureus.
3 Расстояние измеряется XOR.

Дальнейшее чтение

Ответ 2

Обнаружение сверстников и обнаружение ресурсов (файлы в вашем случае) - это две разные вещи.

Я больше знаком с JXTA, но все одноранговые сети работают на одних и тех же основных принципах.

Первое, что должно произойти, - это обнаружение сверстников.

Одноранговое обнаружение

Большинство сетей p2p являются "посеянными" сетями: при первом запуске одноранговый узел будет подключаться к известному (жестко запрограммированному) адресу, чтобы получить список работающих одноранговых узлов. Это может быть прямой посев, например, подключение к dht.transmissionbt.com, как указано в другом сообщении или косвенном посеве, как это обычно делается с JXTA, когда одноранговый узел подключается к адресу, который предоставляет только обычный текстовый список других сетевых адресов одноранговых сетей.

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

Обнаружение ресурсов

Как только несколько сверстников были обнаружены соединительным партнером, последний отправляет несколько запросов на открытие ресурсов для них. Магнитные ссылки идентифицируют эти ресурсы и построены таким образом, что они являются "сигнатурой" для ресурса и гарантируют, что они однозначно идентифицируют запрошенный контент среди всех сверстников. Затем соединительный одноранговый узел отправит запрос обнаружения для ссылки на магнит/ресурс вокруг него. DHT построен таким образом, что он помогает определить, какие из сверстников следует сначала задать для ресурса (подробнее см. В Kademlia в Википедии). Если запрошенный одноранговый узел не удерживает запрошенный ресурс, он обычно "передает" запрос дополнительным одноранговым узлам, полученным из собственного DHT.

Количество "перелетов", которые может быть передан, обычно ограничено; 4 - это обычное число с сетями типа JXTA.

Когда партнер имеет ресурс, он отвечает на все детали. Затем соединительный одноранговый узел может подключиться к одноранговому узлу, содержащему ресурс (напрямую или через реле - я не буду вдаваться в подробности здесь) и начать его извлечение.

Ресурсы/Сервисы в сетях P2P не напрямую привязаны к сетевым адресам: они распределены, и это красота этих высоко масштабируемых сетей.

Ответ 3

Мне тоже был любопытно тот же вопрос. Читая код для передачи, я нашел следующее в libtrnasmission/tr-dht.c:

3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );

Он пробует это 6 раз, ожидая 40 (!) секунд между попытками. Я думаю, вы можете протестировать его, удалив конфигурационные файлы (~/.config/transmission в unix) и заблокировав всю связь до dht.transmissionbt.com, и посмотрим, что произойдет (подождите не менее 240 секунд).

Итак, у клиента есть встроенный bootstrap node. Конечно, как только он попал в сеть, он больше не нуждается в этом bootstrap node.

Ответ 4

Наконец-то я нашел спецификацию. Впервые Google не помог. (wiki, связанный с bittorrent.com, который является основным сайтом. Я нажал ссылку разработчиков, заметьте вкладку bittorrent.org справа, тогда она была легко оттуда. Его трудно найти ссылки, когда вы не знаете, что они помечены, и многие клики).

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

Ответ 5

Когда я начал отвечать на ваш вопрос, я не понимал, что вы спрашиваете, как работает магнитная схема. Просто подумал, что вы хотите знать, как были созданы части, относящиеся к протоколу bittorrent.


Хеш, указанный в магните uri, является хэш-информацией торрента, закодированной в base32. Хэш информации - это хэш файл sha1 из bencoded информационного блока торрента.

Этот код python показывает, как его можно вычислить.

Я написал (очень наивную) реализацию С#, чтобы проверить это, так как у меня не было bencoder под рукой, и оно соответствует ожидаемому от клиента.

static string CalculateInfoHash(string path)
{
    // assumes info block is last entry in dictionary
    var infokey = "e4:info";
    var offset = File.ReadAllText(path).IndexOf(infokey) + infokey.Length;
    byte[] fileHash = File.ReadAllBytes(path).Skip(offset).ToArray();
    byte[] bytes;
    using (SHA1 sha1 = SHA1.Create())
        bytes = sha1.ComputeHash(fileHash, 0, fileHash.Length - 1); // need to remove last 'e' to compensate for bencoding
    return String.Join("", bytes.Select(b => b.ToString("X2")));
}

Как я понимаю, этот хеш не содержит никакой информации о том, как найти трекер, клиенту нужно найти это с помощью других средств (предоставленный URL-адрес анонса). Это то, что отличает один торрент от другого на трекере.

Все, что связано с протоколом bittorrent, все еще вращается вокруг трекера. Он по-прежнему является основным средством общения среди рой. Схема магнитных ури не была разработана специально для использования биторентом. Он используется любыми протоколами P2P как альтернативная форма общения. Клиенты Bittorrent адаптированы для приема магнитных ссылок как еще один способ определения торрентов, так что вам больше не нужно скачивать файлы .torrent. Магнит uri все еще должен указать tr acker, чтобы найти его, чтобы клиент мог участвовать. Он может содержать информацию о других протоколах, но не имеет отношения к протоколу bittorrent. Протокол bittorrent в конечном итоге не будет работать без трекеров.

Ответ 6

список сверстников, вероятно, заселен из потока, который обновляет клиент (например, есть торрент для utorrent, который его обновляет). если все используют один и тот же клиент, это должно быть хорошо, потому что у вас нет выбора, кроме как поделиться обновлением.