Як працюють посилання на магніт BitTorrent?


157

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

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

Також, що таке хеш? Це хеш масиву всіх хешів файлів разом? Можливо, це потрібний хеш фактичного файлу торрента (вилучення певної інформації)?


У VM я спробував зв’язок магніту з uTorrent (який був щойно встановлений), і йому вдалося знайти однолітків. Звідки взявся перший одноліток? Це було свіже і інших потоків не було.


3
Це навіть стосується програмування?
Криптон

Відповіді:


156

Посилання BitTorrent-магніту ідентифікує торрент, використовуючи 1 SHA-1 або усічене значення хеша SHA-256, відоме як "infohash". Це те саме значення, яке ровесники (клієнти) використовують для ідентифікації торрентів під час спілкування з трекерами чи іншими однолітками. Традиційний файл .torrent містить структуру даних з двома клавішами верхнього рівня: announceідентифікація трекера (ів), який використовуватимуться для завантаження, і info, містить імена файлів та хеші для торрента. "Інфохаш" - це хеш кодованих infoданих.

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

Перший раз, коли клієнт приєднується до мережі DHT, він генерує випадковий 160-бітний ідентифікатор з того самого простору, що і infohashes. Потім він завантажує з'єднання з мережею DHT, використовуючи або жорстко кодовані адреси клієнтів, контрольованих розробником клієнта, або клієнтів, що підтримують DHT, раніше зустрічалися в рої. Коли він хоче брати участь в рій для даного потоку, він шукає в мережі DHT для декількох інших клієнтів , чиї ідентифікатори як можна ближче 3 , як можна ближче до infohash. Він повідомляє цих клієнтів, що хотів би брати участь у рій, і просить їх інформацію про з'єднання будь-яких однолітків, які вони вже знають, які беруть участь у рої.

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

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

Завантаження може початися.

1 Як правило, infohash кодується шістнадцятковим, але натомість деякі старі клієнти використовували базу 32. v1 ( urn:btih:) використовує дайджест SHA-1 безпосередньо, тоді як v2 ( urn:bimh:) додає префікс мультихаша для ідентифікації алгоритму хешу та довжини дайджесту.
2 Існують дві основні мережі DHT: простіший "DHT" основної лінії та складніший протокол, який використовується Azureus.
3 Відстань вимірюється XOR.

Подальше читання


1
Чи просто вузол завантаження, наприклад, dht.transmission.comтрекер? Як я розумію, це те, що йому потрібно відслідковувати список однолітків на інформаційний хеш - саме це робить трекер.
Кар

3
@Kate Не зовсім. Типовий вузол DHT зберігає списки рівних для деяких торентів, які знаходяться "біля" його в "просторі" мережі DHT. Натомість трекер намагається зберігати списки однолітків для кожного торента, про який він знає. Більше того, вузли DHT для завантаження спеціально не зберігають списки рівних для жодних торентів. Натомість вони поширюють лише списки інших вузлів DHT, щоб допомогти вам підключитися до загальної мережі. Потім ви можете знайти типовий вузол DHT зі списком зацікавлених сторін, який вас цікавить.
Jeremy Banks

"Деякі посилання на магніт включають трекери або веб-насіння" - я трохи розгублений. Магніт використовується для завантаження торрент-файлу, як ви описуєте. Із специфікації Magnet URI я бачу "прийнятне джерело" та "трекер" як інформацію, яка може бути закодована в URI. Тепер трекер, очевидно, специфічний для Bittorrent, і він, швидше за все, буде використовуватися на додаток до трекерів, перелічених у файлі торентів. Чи "прийнятне джерело" призначене для завантаження файлу торрента або (одного з) фактичних файлів, які потрібно завантажити через файл Torrent?
Фредерік Норд

@FrederickNord Підтримуючи клієнтів торентів, ws=параметр вказує на веб-URL-адресу веб-сайту BEP-19 фактичних даних, а xs=параметр вказує на URL із самим .torrentфайлом. Я думаю, що це трохи невідповідно іншим magnet:способам використання схеми, але це так. Я забуваю, що будь-які клієнти використовують as=для чого-небудь ... можливо, просто як резервний xs=, але не широко підтримуваний, IIRC.
Джеремі Бенкс

46

Відкриття однолітків та виявлення ресурсів (файли у вашому випадку) - це дві різні речі.

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

Перше, що має відбутися - це виявлення однолітків.

Відкриття однолітків

Більшість мереж 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 секунд).

Отож, схоже, у клієнта вбудований вузол завантаження для початку. Звичайно, як тільки він потрапив у мережу, він більше не потребує цього вузла завантаження.


9

Я нарешті знайшов специфікацію. Вперше google не допоміг . . клацає геть).

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


О, я думаю, я мав рацію, що збираюся DHT знайти клієнтів. "Якщо трекер не вказаний, клієнт ДОЛЖЕН би використовувати DHT (BEP 0005 [3]) для отримання однолітків."
Джефф Меркадо

8

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


Хеш, перелічений у магніті, є інформаційним хешем торрента, закодованим у base32. Інформаційний хеш - це шаш-хеш блокованого інформаційного блоку торента.

Цей код 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, все ще обертається навколо трекера. Він все ще є основним засобом комунікації серед рою. Схема магнітоури не була розроблена спеціально для використання бітторентами. Він використовується будь-якими протоколами P2P як альтернативна форма спілкування. Клієнти Bittorrent адаптувались приймати посилання на магніти як інший спосіб ідентифікації торрентів, таким чином вам більше не потрібно завантажувати .torrent файли. У магнітному урі все ще потрібно вказати trакер, щоб знайти його, щоб клієнт міг брати участь. Він може містити інформацію про інші протоколи, але не має відношення до протоколу bittorrent. Протокол bittorrent в кінцевому рахунку не буде працювати без трекерів.


2
Це не допомагає. Але ви кажете, що хеширує весь торрент-файл, пропускаючи блок infokey? Моє запитання стосувалося того, як він знаходить однолітків.

1
@ acidzombie24 Ви, мабуть, думаєте про розподілені трекери, які використовують DHT для пошуку однолітків. Це не має нічого спільного з магнітними посиланнями. ( en.wikipedia.org/wiki/… )
Олександр Саген

2
@ Джеф М: Але що "пересилає" список однолітків назад. Посилання - це лише посилання, не пов'язане з цим трекером. Я намагався з'ясувати, ЩО посилає назад однолітків.

1
+1. Також посилання на магніт, про яку йдеться, не вказує tr (acker). Тільки sha1, який залишив мене розгубленим. Особливо, коли я використовую свіжу установку без запущених торрентів (і не підключений до будь-яких однолітків) і маю магнітне посилання знайти однолітків. Його магія, я поняття не маю, як це працює. Має бути якийсь домашній сервер, на який він може попросити однолітків. Але чи це означає, що я надсилаю запити одноліткам, які шукають хеш, і клієнт передає повідомлення багатьом колегам, поки один не відповість на мій дзвінок?

1
Я не впевнений, як відповісти на це. Усі магнітні уриси, які я бачив, завжди визначають трекер. Ваш клієнт може спробувати список публічних трекерів, про які він знає, і, можливо, у нього є. Які трекери використовує пов'язаний список торрентів як використовуваний? Як воно відображається? Чи існує якесь співвідношення між трекером, до якого він підключається, та джерелом магнітного посилання? Можливо, це торрент, який використовує DHT? Чи те ж саме працює для приватного торрента? Знову ж таки, я не знаю, як точно працює DHT. Я побачу, чи зможу знайти більше інформації.
Джефф Меркадо

3

список однолітків, ймовірно, заповнений з торрента, який оновлює клієнта (наприклад, є торрент для utorrent, який його оновлює). доки всі користуються одним клієнтом, це повинно бути добре, оскільки у вас немає іншого вибору, як поділитися оновленням.


Це дуже логічне місце для пошуку хешу та інших однолітків. +1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.