BitTorrent v2

Понеділок, 7 вересня 2020 р. Від arvid

Щойно вийшов libtorrent-2.0 із кількома основними новими можливостями. Один з них - підтримка BitTorrent v2.

Більшість робіт зі специфікації BEP 52 було виконано 8472. Підтримку libtorrent для bittorrent v2 в основному реалізував Стівен Сілоті. BiglyBT також має реалізацію BitTorrent v2, яка буде випущена найближчим часом.

BitTorrent v2 стартував, намагаючись перейти від SHA-1 як хеш-функції для фрагментів, незабаром після того, як Google оголосив про зіткнення. Враховуючи, що нова хеш-функція не буде зворотно сумісною, було запропоновано також кілька інших змін, поки ми все одно приймали хіт сумісності. У цій публікації описано нові функції протоколу BitTorrent v2.

SHA-256

Хеш-функцію для поштучних даних було змінено на SHA-256. Одним із наслідків цього є те, що хеші складають 32 байти замість 20 байт. У BitTorrent v2 інформаційний словник також обчислюється SHA-256, що створює загрозу сумісності з DHT і трекерами, які мають протоколи, які очікують 20 байтних хешів. Для цього DHT- і трекер оголошує та шукає торренти v2, використовуючи інформаційний хеш SHA-256, усічений до 20 байт.

Це було одне з початкових обґрунтувань для створення протоколу v2 для початку. Це означає, що по суті торрент v2 буде ідентифікований іншим хешем, ніж торрент v1, який завжди створюватиме окремий рой, навіть під час спільного використання одних і тих самих файлів. Детальніше про це пізніше, при зворотній сумісності.

хеш-дерева

У BitTorrent v1 шматки хешуються, а отримані хеші включаються у файл/метадані .torrent (в інформаційному словнику). У більшості випадків хеш фрагмента становить основну частину файлу .torrent. Щоб розмір файлу .torrent не відповідав розумним для великих файлів, розмір фрагмента можна збільшити, тобто кожен хеш представляє більшу частину файлу. Наслідком великих розмірів фрагментів є те, що якщо хеш не вдається, потрібно повторно завантажити більшу частину файлу, поки фрагмент не пройде перевірку хешу.

Стара ідея вдосконалення обох цих показників полягає у використанні хеш-дерев merkle для представлення хешів фрагментів (спочатку реалізованих у tribler). Це робить файли .torrent невеликими, оскільки все, що вам потрібно - це хеш кореня дерева. BitTorrent v2 використовує хешові дерева merkle для фрагментів (але інший протокол, який реалізував той триблер). Це має наступні переваги:

  • Метадані торренту (зокрема, частина інформаційного словника файлу .torrent) стають набагато меншими. Це позбавляє затримки запуску при додаванні магнітного посилання, оскільки потрібно завантажити менше байт, перш ніж почнеться завантаження самого торрента.
  • Завантажені дані можна перевірити на рівні блоку. Це означає, що якщо одноранговий сервер надсилає пошкоджені дані, їх можна негайно виявити, і лише 16 кіБ потрібно повторно завантажити. Ровесник, який надіслав пошкоджені дані, також може бути визначений з певністю. Це є значним покращенням евристики, необхідної для ідентифікації поганого партнера у версії 1, яку іноді називають інтелектуальною забороною.

Листя хеш-дерев завжди складають 16 кіБ (розмір блоку), незалежно від розміру шматка. Поняття розміру шматка все ще існує і досі використовується в одноранговому протоколі, як і сьогодні. напр. у повідомлення HAVE та REQUEST. Однак замість хеш-фрагментів насправді є хешем вмісту шматка, це корінь хеш-дерева шматка. тобто піддерево повного дерева меркле.

У версії 2 файл .torrent все одно повинен містити ці хеш-фрагменти (насправді хеші в дереві merkle, що представляють рівень фрагмента). Це допомагає розподіляти та зберігати хеші, щоб їх не потрібно було перераховувати під час перезапуску клієнта, який засіває. Вони також зберігаються у стані відновлення. Розмір файлу .torrent не менший для торрента v2, оскільки він все ще містить фрагменти фрагментів, але є інформаційний словник, який є частиною, необхідною для початку завантаження магнітних посилань.

файлу torrent

Приклад дерева для файлу з 4 блоками та розміром шматка 32 кіБ (2 блоки на шматок)

хеш-дерева на файл

BitTorrent v2 не тільки використовує хеш-дерево, але й формує хеш-дерево для кожного файлу в торренті. Це має кілька переваг:

  • Ідентичні файли завжди матимуть однаковий хеш і їх буде легше переміщувати з одного торрента в інший (при створенні торрент-файлів) без необхідності повторного хешування. Ідентичні файли також можна легше ідентифікувати в різних роях, оскільки їх кореневий хеш залежить лише від вмісту файлу.
  • Усі файли будуть вирівняні по частинах, що означає, що після кожного файлу є неявні файли pad

Це вирішує давнє бажання легше ідентифікувати дублікати файлів або знайти безліч джерел для файлів у роях.

структура каталогів

Як згадувалося раніше, більшість часу хеш-фрагменти займають більшість місця в інформаційному словнику. Виняток становлять торренти з великою кількістю невеликих файлів; тоді найбільше місця займає список файлів. У торрентах v1 списки файлів виражаються як єдиний список файлів із повними шляхами. У торренті з глибокою структурою каталогів (або просто каталоги з довгими іменами) ці імена каталогів дублюватимуться кілька разів, посилюючи проблему.

Потоки v2 вирішують це питання, використовуючи більш ефективне кодування для структури каталогів, з меншим кількістю дублювань. Замість плоского списку структура каталогів зберігається у вигляді дерева (за допомогою кодованих словників). Це призводить до того, що імена каталогів згадуються лише один раз. Наприклад:

Порівняно з деревом файлів v2 (сюди також входять хеші кореня дерева merkle):

розмір шматка

У торрентах v1 розмір шматка не обмежується специфікацією. Немає особливого сенсу мати шматок, менший за розмір блоку 16 кіБ, але це не заборонено. Переважна більшість створених торентів використовує потужність із двох частин, але є кілька випадаючих, які не є, але все ж діляться на 16 кіБ. Торренти v2 посилюють вимоги до розмірів штук, вимагаючи, щоб вони були:

  • потужність двох
  • більше або дорівнює 16 кіБ

Основною причиною цього є те, що шматки хешу поміщаються в хеш-дерева. Оскільки хеш шматка v2 насправді є коренем дерева хеша merkle шматка, він повинен представляти потужність двох блоків.

кодування

Файл .torrent - це деревоподібна структура, кодована за допомогою кодування. У кодуванні є кілька випадків одиничних значень з декількома можливими кодуваннями. Ціле число може бути закодовано з початковими нулями чи ні, 0 може бути закодовано як від’ємне 0. Ці кодування завжди були незаконними, але синтаксичні аналізатори в минулому були м’якими і приймали їх. Мабуть, найпоширеніший приклад - це те, як ключі у словниках потрібно сортувати лексикографічно. Однак деякі творці торрентів не змогли їх відсортувати, тому клієнти прийняли їх.

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

libtorrent тепер застосовує ці обмеження, відмовляючись завантажувати будь-який торрент v2, що містить:

  • ціле число з будь-якими початковими нулями (крім самого 0). напр. “I0004e”
  • 0, закодований як -0. тобто. “I-0e”
  • словник, де записи відсортовано неправильно. напр. “D1: B3: foo1: A3: голий” ("A" слід відсортувати перед "B")

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

магнітні ланки

Протокол Magnet Link розширений для підтримки торрентів v2. Подобається урна: btih: префікс для інформаційних хешів v1 SHA-1, є новий префікс, урна: btmh: для повних хешів інформації v2 SHA0256. Наприклад, магнітна ланка таким чином виглядає так:

Інформаційний хеш з префіксом btmh - це інформаційний хеш v2 у форматі багатохешів, кодований у шістнадцятковій формі. На практиці це означає, що він матиме двобайтовий префікс 0x12 0x20. Можна включити обидва v1 (btih) та v2 (btmh) інформаційний хеш у магнітному посиланні для зворотної сумісності.

зворотна сумісність

Усі нові функції в BitTorrent v2, які не є зворотно сумісними, ретельно отримали нові імена, щоб дозволити їм співіснувати з аналогами v1. Отже, можна створювати гібридні торренти. Тобто, торренти, які можуть одночасно брати участь у рої v1 і v2, обслуговуючи ті самі файли.

Гібридний торрент має два інформаційні хеші, один хеш SHA-1 v1 і один (можливо, усічений) SHA-256. Це утворює два рої, або окремий рій. libtorrent позначає однолітки як підтримку v2 чи ні. Ця інформація також передається за допомогою нового прапора обміну (PEX).

Гібридний файл .torrent включає як шматки, так і хеші коренів дерева для кожного файлу.

тестування

Для всіх, хто зацікавлений у тестуванні реалізації BitTorrent v2 (або клієнта, що використовує libtorrent-2.0), ви можете знайти тестові торренти тут:

Гібридний торрент (зворотно сумісний)

Посилання на реалізацію торрент-розробника в python.

Опубліковано в протоколі | Без коментарів