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

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

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

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


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

6 ответов

Магнитная ссылка BitTorrent идентифицирует торрент, используя 1 значение SHA-1 или усеченное значение SHA-256, известное как "информационный хэш". Это то же значение, которое одноранговые узлы (клиенты) используют для идентификации торрентов при общении с трекерами или другими одноранговыми узлами. Традиционный.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.

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

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

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

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

Peer Discovery

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам