«БітТо́рент» (BitTorrent) — відкритий протокол обміну інформацією у мережах типу peer-to-peer. Автором проєкту є Брем Коен, який створив першу версію у квітні 2001 разом із першим клієнтом з тією ж назвою.

Принципи роботи протоколу

ред.
 
Анімація використання протоколу: кольорові точки під кожним комп'ютером в анімації відповідають різним частинам файлу, який роздається. Трекер (сервер) надає тільки одну копію файлу, і всі користувачі клонують його частини один від одного. Показано, наскільки швидше файл буде завантажено, якщо використовується протокол BitTorrent.

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

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

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

Трекер (англ. tracker) — спеціалізований сервер, який працює по протоколу HTTP. Трекер використовується для того, щоб клієнти могли знайти один одного. На трекері зберігаються IP-адреси клієнтів, вхідні порти клієнтів та хеш-суми, які унікальним чином ідентифікують об'єкти, що беруть участь у скачуваннях. За стандартом, імена файлів на трекері не зберігаються, та дізнатися їх за хеш-сумами не можна. Проте на практиці часто трекер, окрім своєї основної функції, виконує також функцію невеличкого вебсерверу. Такий сервер зберігає файли метаданих, що містять значення хеш-функції, та разом з ними опис файлів, які розповсюджуються, кількість розповсюджувачів, статистику завантажень тощо.

Перед початком завантаження файлу клієнт з'єднується з трекером, повідомляє йому свою IP-адресу та хеш-суму файла, що завантажується. У відповідь клієнт отримує адреси інших учасників мережі, які розповсюджують або закачують той самий файл. Далі клієнт періодично інформує трекер про хід процесу завантаження та отримує оновлений перелік адрес.

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

Для ефективної роботи мережі BitTorrent необхідно, щоб якомога більше клієнтів були здатні приймати вхідні з'єднання. Неправильна настройка NAT чи файрволу можуть цьому заважати.

Алгоритм обміну даними

ред.

Кожен клієнт має можливість тимчасово блокувати віддачу іншому клієнтові (англ. choke). Це робиться для ефективнішого використання каналу віддачі. Крім того, при виборі — кого розблокувати, перевага віддається пірам, які самі передали цьому клієнтові багато сегментів. Таким чином, піри з хорошими швидкостями віддачі заохочують один одного за принципом «ти — мені, я — тобі».

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

Обмін даними починається, коли обидві сторони в ньому зацікавлені, тобто, кожна зі сторін має сегменти, яких немає в іншої. Кількість переданих сегментів підраховується, і якщо одна із сторін виявляє, що передає в середньому більше, ніж приймає, вона блокує (англ. choke) на деякий час віддачу іншій стороні. Таким чином, в протокол закладено захист від лічерів.

Сегменти діляться на блоки розміром 16—4096 кілобайт, і кожен клієнт запитує саме ці блоки. Одночасно можуть запитуватися блоки з різних сегментів. Більш того, деякі клієнти підтримують скачування блоків одного сегмента у різних пірів. У цьому випадку описані вище алгоритми і механізми обміну застосовуються і до рівня блоків.

Режим End game

ред.

Коли скачування майже завершено, клієнт входить в особливий режим, так званий end game. У цьому режимі він запитує всі сегменти, що залишилися у всіх підключених пірів, що дозволяє уникнути уповільнення або повного «Зависання» майже завершеного закачування через кілька повільних клієнтів.

Специфікація протоколу не визначає, коли саме клієнт повинен увійти в режим «end game», однак існує набір загальноприйнятих практик. Деякі клієнти входять в цей режим, коли не залишилося незапитаних блоків, інші — поки кількість блоків, що залишилися, менше кількості тих що передаються і не більше 20. Існує думка, що краще підтримувати кількість очікуваних блоків низьким (1 або 2) для мінімізації надлишковості, і що при випадковому запиту менший шанс отримати дублікати одного і того ж блоку[1][2].

Сідерування

ред.

При отриманні повного файлу клієнт переходить в спеціальний режим роботи, в якому він тільки віддає дані (стає сідом). Далі сід періодично інформує трекер про зміни в стані закачувань і оновлює списки IP-адрес.

Загальні особливості

ред.
  • Відсутність черг на скачування.
  • Файли закачуються невеликими фрагментами; чим менше доступний фрагмент, тим частіше він передаватиметься. Таким чином, присутність в мережі «сідера» з повним файлом для завантаження необов'язково — система розподіляє сегменти між «пірами», щоб в подальшому вони могли обмінюватися відсутніми сегментами.
  • Клієнти (піри) обмінюються сегментами безпосередньо між собою, за принципом «ти — мені, я — тобі».
  • Завантажені фрагменти стають негайно доступні іншим клієнтам.
  • Контролюється цілісність кожного фрагмента.
  • На фрагменти розбиваються не окремі файли, а вся роздача, тому у «лічера», який побажав завантажити лише деякі файли з роздачі, для підтримки цілісності фрагментів часто зберігатиметься також невеликий обсяг надлишкової (для нього) інформації.
  • Як об'єкт роздачі можуть виступати декілька файлів (наприклад, вміст каталогу).

Файл метаданих

ред.

Для кожного файлу, що розповсюджується, створюється файл метаданих з розширенням .torrent, який містить наступну інформацію: URL трекеру, загальну інформацію про файл (ім'я, розмір та ін.), контрольні суми сегментів файлу.

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

Робота без трекера

ред.

У нових версіях протоколу розроблено безтрекерні (англ. trackerless) механізми обміну інформацією. Таким чином працездатність всієї мережі не залежатиме від роботи трекера.

Починаючи з версії 4.2.0 офіційного BitTorrent-клієнта, в ньому реалізована функція безтрекерної роботи, яка базується на протоколі Kademlia. У таких системах трекер доступний децентралізовано, на клієнтах-учасниках мережі, у формі розподіленої хеш-таблиці (Distributed hash-table, DHT).

У цей час не всі BitTorrent-клієнти використовують сумісні протоколи. Між собою сумісні BitComet[en], µTorrent, KTorrent та офіційний клієнт BitTorrent. Azureus[en] також має режим безтрекерної роботи, але його реалізація відрізняється від офіційної, через що він не може працювати через DHT з наведеними вище клієнтами.

Термінологія

ред.
 
Лічер та його рій.
  • Анонс (англ. announce) — звернення клієнта до трекера за допомогою HTTP-GET-запиту. При кожному анонсі клієнт передає на трекер інформацію про об'єми завантаженого і відданого, a трекер передає клієнтові список адрес інших клієнтів. Звертання клієнта до трекера відбувається через певні проміжки часу, які визначаються налаштуваннями клієнта і трекера.
  • Вебсід — HTTP- або FTP-сервер, що використовується як джерело даних, нарівні зі звичайними сідами
  • Доступність (англ. availability, англ. distributed copies — розповсюджені копії) — кількість повних копій файлу, доступних клієнтові. Кожен сид додає 1,0 до цього числа; лічери збільшують доступність залежно від кількості завантаженого, якого немає в інших пірів. Наприклад, якщо на роздачі є один сід і два лічера, що викачали по 50 % файлу (викачані частини рівні між собою), то доступність дорівнюватиме 1,50.
  • Заглухлий (англ. choked — заглухлий, придушений) — клієнт, обмін даними з яким зупинився. Або його канал на вихід забитий повністю і він не може нічого передати (досяг max_uploads), або він є сідом і йому нічого не потрібно отримувати.
  • Зацікавлений (англ. interested) — учасник, що бажає отримати частини файлу, наявні в іншого учасника. Наприклад, якщо у клієнта А немає якихось частин, які є у клієнта Б, вважається, що клієнт А зацікавлений в обміні з клієнтом Б.
  • Надлишки — дані, які були послані піром або сідом, та одержувач їхх не потребує. До надлишків також відносяться помилки хешу.
  • Індекс (англ. index) — це список .torrent-файлів (зазвичай включає описи та іншу інформацію), керовані вебсайтом ( індексатором) і доступні для пошуку. Сайт, що індексує часто помилково називають трекером.
  • Ліч, іноді лічер (англ. leech — п'явка) — пір, який не має всіх сегментів, тобто той, що продовжує скачування. Термін часто вживається і в негативному сенсі, який він має в інших файлообмінних мережах: користувач, який віддає значно менше, ніж викачує.
  • Отруєний торент — ситуація, коли частина пірів роздає пошкоджені, або навмисно сфальсифіковані сегменти.
  • Пір (англ. peer — співучасник) — клієнт, що бере участь в роздачі.
  • Пошкребти (англ. scrape — шкребти, дряпати) — процес, аналогічний анонсу, але клієнт запитує тільки статистику торента, інформацію про підключених клієнтів і можливості з ними зв'язатися для обміну.
  • Той, що нехтує (англ. snubbed) — клієнт, що є підключеним до одержувача, але не надсилав йому дані вже більше 60 секунд.
  • Роздача (англ. seeding) — процес поширення файлу за протоколом BitTorrent.
  • Рейтинг (англ. share ratio) — відношення відданого до завантаженого.
  • Рій (англ. swarm) — сукупність всіх пірів, що беруть участь в роздачі.
  • Сегмент (англ. part — частина) — всі файли для передачі діляться на невеликі частини — сегменти, які, передаються мережею в довільному порядку для оптимізації обміну.
  • Сід, іноді сідер (англ. seeder — сіяч) — пір, що має всі сегменти файлу, що поширюється тобто, або початковий розповсюджувач файлу, або той хто вже викачав весь файл і залишився на роздачі.
  • Супер-сідерування — спеціальний режим роздачі в деяких BitTorrent-клієнтів, намагається мінімізувати кількість даних, яке віддасть той, хто роздає до появи першого завантажившого. Суперсід пропонує кожному піру завантажити тільки один сегмент файлу, якого ще немає в інших пірів. Потім сід не віддає цьому піру наступні сегменти, поки не отримає від інших пірів підтвердження, що вони теж отримали цей сегмент. Таким чином, суперсід намагається уникнути повторної віддачі одних і тих же сегментів, і намагається віддавати сегменти тільки тим пірам, які активно передають їх іншим.
  • Хеш (англ. hash) — SHA1 окремих сегментів оригінальних файлів, перерахованих в словнику «info» .torrent-файлу. Кожна частина після отримання спочатку перевіряється на збіг хешу. Якщо перевірка не вдалася, дані відкидаються і запитуються ще раз. Також в протоколі використовується хеш самого словника «info»(«інфохеш»), що виступає в ролі ідентифікатора конкретної роздачі при звертанні до трекера, до інших точок мережі, і при складанні magnet-посилань (він містять Base32-подання інфохешу).
  • Passkey — аутентифікатор користувача на не анонімних трекерах. Міститься в torrent-файлах. Таким чином, якщо хтось отримає доступ до torrent-файлу (наприклад, користувач по необережності розшарив його), він зможе працювати з трекером від імені цього користувача. Трекер може змінити passkey по запиту користувача, але при цьому необхідно буде перезавантажити всі старі torrent-файли (або вручну відредагувати їх), щоб мати можливість і далі роздавати викачані файли.
  • URL анонсу (англ. announce URL) — адреса трекера, до якого клієнт робить анонс. У багатьох клієнтів називається «Tracker URL». Може включати «passkey» — унікальний код, призначається трекером для облікового запису користувача, допомагає ідентифікувати його на трекері(додається до URL анонсу в самому *.torrent-файлі при завантаженні).

Примітки

ред.
  1. BitTorrent Specification: End Game. Архів оригіналу за 14 грудня 2006. Процитовано 16 лютого 2012.
  2. [[https://web.archive.org/web/20120217170319/http://hal.inria.fr/inria-00000156/en Архівовано 17 лютого 2012 у Wayback Machine.] HAL — INRIA :: [inria-00000156, version 3] Understanding BitTorrent: An Experimental Perspective]

Посилання

ред.