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

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

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

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


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


person Community    schedule 02.10.2010    source источник
comment
Это вообще имеет отношение к программированию?   -  person Krypton    schedule 04.05.2015
comment


Ответы (6)


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

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

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

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

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

Скачивание может начаться.

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

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

person Jeremy    schedule 07.03.2014
comment
Является ли узел начальной загрузки, например, dht.transmission.com, просто трекером? Насколько я понимаю, он должен отслеживать список пиров для каждого информационного хэша - именно это и делает трекер. - person Kar; 28.11.2014
comment
@ Кейт: Не совсем так. Типичный узел DHT хранит списки пиров для некоторых торрентов, которые находятся рядом с ним в сетевом пространстве DHT. Вместо этого трекер пытается сохранить списки пиров для каждого известного ему торрента. Более того, узлы начальной загрузки DHT специально не хранят списки пиров для любых торрентов. Вместо этого они только распространяют списки других узлов DHT, чтобы помочь вам подключиться к общей сети. Затем вы можете найти типичный узел DHT со списком партнеров, который вас интересует. - person Jeremy; 28.11.2014
comment
Некоторые магнитные ссылки включают трекеры или веб-семена - я немного запутался. Магнит используется для загрузки торрент-файла, как вы описываете. Из спецификации Magnet URI я вижу приемлемый источник и трекер как информацию, которая может быть закодирована в URI. Теперь трекер явно специфичен для Bittorrent и, скорее всего, будет использоваться в дополнение к трекерам, указанным в торрент-файле. Предназначен ли приемлемый источник для загрузки торрент-файла или (одного из) фактических файлов, которые будут загружены через торрент-файл? - person Frederick Nord; 27.06.2017
comment
@FrederickNord При поддержке торрент-клиентов параметр ws= указывает на исходный URL-адрес фактических данных BEP-19, а параметр xs= указывает на URL-адрес с самим .torrent файлом. Я думаю, что это немного несовместимо с другими вариантами использования схемы magnet:, но так оно и есть. Я забываю, используют ли какие-либо клиенты as= для чего-нибудь ... может быть, просто как запасной вариант для xs=, но не широко поддерживаемого, IIRC. - person Jeremy; 27.06.2017
comment
Есть ли способ реализовать такую ​​систему с доказательством с нулевым разглашением? - person Kebman; 24.10.2020

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

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

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

Peer Discovery

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

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

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

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

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

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

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

person Bruno Grieder    schedule 13.03.2014
comment
Я считаю, что это наиболее емкий ответ без особого технического жаргона. Спасибо. - person One-One; 31.05.2014

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

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

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

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

person yhager    schedule 15.07.2011

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


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

Этот код Python демонстрирует, как его можно вычислить. .

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

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, по-прежнему вращается вокруг трекера. Это по-прежнему основное средство связи среди роя. Схема магнитного URI не была разработана специально для использования BitTorrent. Он используется любыми протоколами P2P в качестве альтернативной формы общения. Клиенты Bittorrent адаптированы для приема магнитных ссылок в качестве еще одного способа идентификации торрентов, так что вам больше не нужно загружать файлы .torrent. Магнитный uri по-прежнему должен указывать tracker, чтобы найти его, чтобы клиент мог участвовать. Он может содержать информацию о других протоколах, но не имеет отношения к протоколу bittorrent. Протокол bittorrent в конечном итоге не будет работать без трекеров.

person Jeff Mercado    schedule 02.10.2010
comment
Это не помогает. Но вы говорите, что он хеширует весь торрент-файл, минуя блок инфоключей? Мой вопрос был о том, как он находит сверстников. - person ; 02.10.2010
comment
Все это координируется трекером. Трекер знает обо всех торрентах, которые он содержит, и о клиентах, которые загружают / скачивают их. Когда кто-то подключается с помощью магнитной ссылки, информационный хэш используется для определения того, какой торрент пытается найти пользователь, и отправляет обратно список пиров. - person Jeff Mercado; 02.10.2010
comment
@ acidzombie24 Вы, наверное, думаете о распределенных трекерах, которые используют DHT для поиска пиров. Это не имеет ничего общего с магнитными ссылками. (en.wikipedia.org/wiki/) - person Alexander Sagen; 02.10.2010
comment
Я не знаю, как работает DHT технически, но могу только предполагать. Все клиенты отслеживают пиров, к которым они подключились. Когда новый клиент входит в рой, он получает всю необходимую информацию от других пиров, к которым он первоначально подключается. Для первоначального обнаружения роя все равно потребуется трекер. Но как только он подключается к рою, он запоминает одноранговых узлов, с которыми он подключался в последний раз, и может устанавливать соединения напрямую с ними в следующий раз, когда он захочет продолжить. После этого трекер больше не нужен для поиска пиров. - person Jeff Mercado; 02.10.2010
comment
@ Джефф М: Но что «отправляет» список пиров обратно. Ссылка - это просто ссылка, с которой не связан трекер. Я пытался выяснить, ЧТО отправляет обратно сверстники. - person ; 02.10.2010
comment
@Alexander Sagen: Мой вопрос о том, как работают магнитные ссылки. Все, что я упомянул, было с SHA1 @Jeff M: Вы думаете, что когда кто-то использует магнитную ссылку, торрент-программа подключается к случайным узлам, о которых она знает? хорошо, но я все еще хотел бы получить ответ (от кого-то) о том, как это работает - person ; 02.10.2010
comment
Я переместил свой комментарий в свой ответ. Я не понимал, что вы спрашивали о том, как вся схема URI-магнита работает с BitTorrent. Надеюсь, теперь все станет яснее. Таким образом, магнитные ссылки не заменяют роль трекера, а заменяют роль файлов .torrent. - person Jeff Mercado; 02.10.2010
comment
+1. Также в рассматриваемой магнитной ссылке не указано tr (acker). Только th sha1 сбил меня с толку. Особенно, когда я использую новую установку без запущенных торрентов (и не связан ни с какими одноранговыми узлами), а магнитная ссылка находит одноранговых узлов. Это волшебство, я понятия не имею, как это работает. Должен быть какой-то домашний сервер, который он может запрашивать у пиров. Но означает ли это, что я отправляю запросы одноранговым узлам, ищущим хеш, и клиент передает сообщение многим узлам, пока один из них не ответит на мой вызов? - person ; 02.10.2010
comment
Я не знаю, как на это ответить. Все магнитные поля, которые я видел, всегда указывают трекер. Возможно, ваш клиент пробует список известных ему общедоступных трекеров, и у одного из них он есть. Какие трекеры используются в соответствующем списке торрентов? Как это отображается? Есть ли какая-либо связь между трекером, к которому он подключается, и источником магнитной ссылки? Может это торрент, использующий DHT? То же самое работает для частного торрента? Опять же, я не знаю, как именно работает DHT. Я посмотрю, смогу ли я найти дополнительную информацию. - person Jeff Mercado; 02.10.2010
comment
@ Джефф М: Я провел небольшое исследование и наконец кое-что нашел. Выкладываю ответ сейчас. - person ; 02.10.2010
comment
Трекер больше не нужен; Трекер стал лишь одним из трех возможных способов поиска сверстников, другие - DHT и PEX. - person Never Sleep Again; 05.09.2017

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

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

person Community    schedule 02.10.2010
comment
Ах, думаю, я был прав, когда собирался в DHT искать клиентов. Если трекер не указан, клиент ДОЛЖЕН использовать DHT (BEP 0005 [3]) для получения одноранговых узлов. - person Jeff Mercado; 02.10.2010

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

person Moe    schedule 27.10.2010
comment
Это очень логичное место для поиска хэша и других пиров. +1 - person ; 27.10.2010