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

157

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

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

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


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

Barmar
источник
3
Это вообще относится к программированию?
Криптон

Ответы:

156

Магнитная ссылка 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, ваш клиент сможет запросить информацию о подключении еще одного однорангового узла в рое торрента, пока у вас не появятся все необходимые одноранговые узлы.

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

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

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

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

Джереми Бэнкс
источник
1
Является ли узел начальной загрузки, например dht.transmission.com, просто трекером? Насколько я понимаю, он должен отслеживать список пиров на каждый информационный хеш - именно это и делает трекер.
Кар
3
@ Кейт Не совсем. Типичный узел DHT хранит списки пиров для некоторых торрентов, которые «находятся рядом» с ним в «пространстве» сети DHT. Вместо этого трекер пытается сохранить списки пиров для каждого известного ему торрента. Более того, узлы начальной загрузки DHT специально не хранят списки пиров для каких-либо торрентов. Вместо этого они только распространяют списки других узлов DHT, чтобы помочь вам подключиться к общей сети. Затем вы можете найти типичный узел DHT со списком пиров, который вас интересует.
Джереми Бэнкс
«Некоторые магнитные ссылки включают трекеры или веб-семена», - я немного запутался. Магнит используется для загрузки торрент-файла, как вы описываете. В спецификации URI магнита я вижу «приемлемый источник» и «трекер» как информацию, которая может быть закодирована в URI. Теперь трекер, очевидно, специфичен для Bittorrent и, скорее всего, будет использоваться в дополнение к трекерам, перечисленным в торрент-файле. Является ли «приемлемый источник» предназначенным для загрузки торрент-файла или (одного из) фактических файлов для загрузки через торрент- файл?
Фредерик Норд,
@FrederickNord При поддержке торрент-клиентов ws=параметр указывает на URL-адрес начальных веб-страниц BEP-19 фактических данных, а xs=параметр указывает на URL-адрес самого .torrentфайла. Я думаю, что это немного несовместимо с другими вариантами использования magnet:схемы, но это так. Я забываю, используют ли какие-либо клиенты as=для чего-либо ... возможно, просто как запасной вариант для xs=, но не широко поддерживаемой, IIRC.
Джереми Бэнкс
46

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

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

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

Peer Discovery

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

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

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

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

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

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

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

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

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

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

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

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

yhager
источник
9

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

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


источник
Ах, думаю, я был прав, когда отправился в DHT, чтобы найти клиентов. «Если трекер не указан, клиент ДОЛЖЕН использовать DHT (BEP 0005 [3]) для получения пиров».
Джефф Меркадо
8

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


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

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

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

Джефф Меркадо
источник
2
Это не помогает. Но вы говорите, что он хэширует весь торрент-файл, пропуская блок infokey? Мой вопрос был о том, как он находит сверстников.
1
@ acidzombie24 Вы, вероятно, думаете о распределенных трекерах, которые используют DHT для определения местоположения пиров. Это не имеет ничего общего с магнитными ссылками. ( en.wikipedia.org/wiki/… )
Александр Саген,
2
@ Джефф М: Но что «отправляет» список пиров обратно. Ссылка - это просто ссылка, с которой нет трекера. Я пытался выяснить, ЧТО отправляет обратно сверстников.
1
+1. Также рассматриваемая ссылка на магнит не указывает tr (acker). Только тот ша1 который меня смутил. Особенно, когда я использую свежую установку без запущенных торрентов (и не подключенных к каким-либо одноранговым узлам), а магнитная ссылка находит одноранговые узлы. Это волшебство, я понятия не имею, как это работает. Должен быть какой-то домашний сервер, который он может запросить у пиров. Но значит ли это, что я отправляю запросы партнерам в поисках хэша, и клиент передает сообщение многим партнерам, пока один не ответит на мой вызов?
1
Я не уверен, как на это ответить. Все магниты, которые я видел, всегда указывают на трекер. Возможно, ваш клиент пробует список общедоступных трекеров, о которых он знает, и у одного из них он есть. Какие трекеры использует связанный торрент-лист как используемый? Как это отображается? Есть ли какая-либо связь между трекером, к которому он подключен, и источником магнитной связи? Может быть, это торрент, который использует DHT? То же самое работает для частного торрента? Опять же, я не знаю, как именно работает DHT. Я посмотрю, смогу ли я найти больше информации.
Джефф Меркадо
3

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

Моу
источник
Это очень логичное место для поиска хеша и других пиров. +1