Как работают магнитные ссылки BitTorrent? - PullRequest
150 голосов
/ 02 октября 2010

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

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

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


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

Ответы [ 6 ]

145 голосов
/ 07 марта 2014

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

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

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

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

ДалееЧтение

41 голосов
/ 13 марта 2014

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

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

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

Peer Discovery

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

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

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

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

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

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

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

25 голосов
/ 15 июля 2011

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

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

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

9 голосов
/ 02 октября 2010

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

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

8 голосов
/ 02 октября 2010

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

3 голосов
/ 27 октября 2010

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

...