BitTorrent v2 | Що таке BitTorrent v2?

BitTorrent v2

blog.libtorrent.org
хв
7 вересня 2020 р

libtorrent-2.0 щойно випущено з кількома основними новими функціями. Одним із них є підтримка BitTorrent v2 .

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

Що таке 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. Це означає, що в основному торрент версії 2 ідентифікуватиметься іншим хешем, ніж торрент версії 1, що завжди створюватиме окремий рій, навіть якщо ділитися тими самими файлами. Детальніше про це пізніше, у розділі зворотна сумісність.

хеш-дерева

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

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

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

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

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

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

пофайлові хеш-дерева

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

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

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

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

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

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

'files': [ 
    { 'attr': 'x', 'length': 12323346, 'path': [ 'F' ] }, 
    { 'attr': 'p', 'length': 62958, 'path': [ '.pad', '62958' ] }, 
    { 'attr': 'x', 'length': 2567, 'path': [ 'це дуже довга назва каталогу, яка часто дублюється в v1 torrents', 'A' ] }, 
    { 'attr': 'p', 'length': 62969, 'path': [ '.pad', '62969' ] }, { 'attr': 
    'x', 'length': 14515845, 'path': [ 'це дуже довга назва каталогу, яка часто дублюється в торрентах v1', 'B' ] }, { 'attr': 'p' 
    ,'length': 33147, 'path': [ '.pad', '33147' 
    ] }, { 'attr': 'x', 'length': 912052, 'path': [ 'це дуже довга назва каталогу що зрештою дублюється багато разів у торрентах v1', 'C' ] },
    { 'attr': 'p', 'length': 5452, 'path': [ '.pad', '5452' ] }, { 'attr' 
    : 'x', 'length': 1330332, 'path': [ 'це дуже довга назва каталогу, яка часто дублюється в торрентах v1', 'D' ] }, { ' 
    attr': 'p', 'length': 45924, 'path': [ ' .pad', '45924' ] }, 
    { 'attr': 'x', 'length': 2529209, 'path': [ 'це дуже довга назва каталогу, яка часто дублюється в торрентах v1 ', 'E' ] } 
    ],

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

'дерево файлів': { 
    'F': { '': { 'attr': 'x', 'length': 12323346, 'pieces root': 'd1dca3b4a65568b6d62ef2f62d21fcdb676099797c8aa3e092aa0adcb9a9f6a5' } }, 'це дуже довгий директор y ім'я, яке 
    закінчується багато разів дублюється в торрентах v1': { 
      'A': { '': { 'attr': 'x', 'length': 2567, 'pieces root': 'f6e5b48ebc00d7c6351aafdec9a0fa40ab9c8effe8ac6cfb565df070d9532f70' } }, 'B 
      ' : { '': { 'attr': 'x', 'length': 14515845, 'pieces root': '271d61e521401cfb332110aa472dae5f0d49209036eb394e5cf8a108f2d3fb03' } }, 'C': { '': { 'attr': 'x ', ' 
      довжина ':912052, 'pieces root': 'd66919d15e1d90ead86302c9a1ee9ef73b446be261d65b8d8d78c589ae04cdc0' } },
      'D': { '': { 'attr': 'x', 'length': 1330332, 'pieces root': '202e6b10310d5aae83261d8ee4459939715186cd9f43336f37ca5571ab4b9628' } }, 'E': { '': { 'attr': ' х 
      ' , 'length': 2529209, 'pieces root': '9cc7c9c9319a80c807eeefb885dff5f49fe7bf5fba6a6fc3ffee5d5898eb5fdb' } } } 
      } 
    ,

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

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

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

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

кодування

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

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

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

  • ціле число з будь-якими початковими нулями (крім самого 0). наприклад, "i0004e"
  • 0, закодований як -0. тобто «i-0e»
  • словник, у якому записи відсортовано неправильно. наприклад, «d1:B3:foo1:A3:голий» («A» має бути відсортовано перед «B»)

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

магнітні посилання

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

   magnet:?xt=urn:btmh:<tagged-info-hash>&dn=<name>&tr=<tracker-url>

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

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

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

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

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

тестування

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

Просмотры:

Коментарі

Популярні публікації