Открыть сервисСервис

Принцип работы торрент-систем

Торрент — это файл, содержащий метаданные, необходимые для скачивания данных по протоколу BitTorrent, децентрализованной одноранговой (P2P) сети обмена файлами. В отличие от классической клиент-серверной модели, где один сервер раздаёт файл множеству получателей, в BitTorrent каждый участник сети (пир) одновременно скачивает недостающие фрагменты файла и раздаёт уже скачанные другим. Фактически чем больше людей участвует в раздаче, тем выше суммарная скорость раздачи.

Основные термины

  • Торрент-файл — небольшой файл с расширением .torrent, содержащий информацию о раздаваемых данных: имя файла, размер, список «шагов» (piece) и их хеши, а также адрес трекера.
  • Магнет-ссылка (magnet-URI) — компактный URI вида magnet:?xt=urn:btih:..., содержащий только хеш торрента. Позволяет начать скачивание без загрузки самого .torrent-файла.
  • Трекер — сервер, отслеживающий, какие пиры участвуют в раздаче конкретного торрента, и помогающий им найти друг друга. Трекер не хранит сами файлы.
  • Пир (peer) — участник сети, одновременно скачивающий и раздающий данные.
  • Сид (seed) — пир, у которого уже есть полная копия файла и который только раздаёт.
  • Клиент — программа для работы с торрентами (µTorrent, qBittorrent, Transmission, rTorrent, Deluge и др.).

Как начинается скачивание

Пользователь открывает торрент-файл или магнет-ссылку в торрент-клиенте. Клиент извлекает из неё хеш торрента — криптографический отпечаток (обычно SHA-1), уникальный для конкретного набора файлов. Далее клиент обращается к трекеру с запросом: «мне нужен этот торрент, вот мой адрес, какие ещё пиры участвуют?». Трекер возвращает список IP-адресов и портов активных пиров. Этот процесс называется «анонсом» (announce) и периодически повторяется, чтобы поддерживать актуальность списка.

При работе через DHT (распределённую хеш-таблицу) трекер не обязателен: пиры обнаруживают друг друга напрямую через децентрализованную одноранговую сеть, где каждый участник хранит фрагменты таблицы соответствия «хеш торрента → адреса пиров».

Разбиение файла на части

Передача данных организована по принципу «раздели и властвуй». Весь раздаваемый файл (или набор файлов) делится на равные по размеру куски — как правило, от 256 КБ до 16 МБ, чаще всего 1–4 МБ. Для каждого куска в торрент-файле хранится его SHA-1 хеш. Перед началом работы клиент скачивает у трекера или у пиров так называемый .torrent-метаданный файл (или получает его через magnet-ссылку), из которого становится известно количество кусков и их хеши.

Обмен данными

После соединения с несколькими пирами клиент начинает запрашивать куски. Протокол BitTorrent работает поверх TCP (традиционно) или uTP. Обмен состоит из простых сообщений:

  • handshake — взаимная идентификация пиров по хешу торрента;
  • bitfield — сообщение о том, какие куски уже есть у пира;
  • request — запрос конкретного куска;
  • piece — передача данных куска.

Клиент выбирает, какой кусок запрашивать у какого пира, по нескольким алгоритмам. Наиболее распространена стратегия «rarest first» (сначала самый редкий кусок): чем реже кусок встречается в сети, тем выше приоритет его скачивания. Это гарантирует, что редкие фрагменты не потеряются и останутся доступны для новых участников.

Каждый полученный кусок проверяется по SHA-1 хешу. Если хеш не совпал, кусок отбрасывается и запрашивается заново. Это исключает порчу данных при передаче.

Раздача и стимулы

BitTorrent построен на принципе взаимности: клиент по умолчанию раздаёт ровно столько данных, сколько скачал у конкретного пира. Если пир не раздаёт, его «скорость отдачи» (upload rate) для этого же пира снижается. Такая система «tit-for-tat» (око за око) стимулирует участников раздавать данные, а не только качать.

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

DHT и децентрализация

Современные торрент-клиенты поддерживают DHT (Distributed Hash Table) на основе протокола Kademlia. В этой системе трекер не нужен: каждый клиент становится узлом распределённой таблицы и хранит часть информации о том, кто раздаёт тот или иной торрент. Поиск пиров по хешу торрента выполняется итеративно — запрос «гуляет» по узлам сети, пока не найдёт адреса нужных участников.

Дополнительно применяются протоколы PEX (Peer Exchange), позволяющий пирам обмениваться списками известных адресов напрямую, и Local Peer Discovery — обнаружение пиров в локальной сети.

Проблема «свежести» и устаревания

Торрент живёт, пока есть хотя бы один сид. Если все сиды ушли, а оставшиеся пиры не имеют полной копии файла, раздача «умирает» — скачать файл целиком становится невозможно. Поэтому в популярных торрент-трекерах отдельно отслеживается наличие сидов («сидовость» торрента).

Правовой аспект

Протокол BitTorrent нейтрален по содержанию: он одинаково используется для распространения свободного ПО (дистрибутивы Linux, например, официально раздаются через торрент), открытых фильмов и игр, а также для пиратского контента. В ряде юрисдикций, включая Россию, ответственность несёт пользователь за содержание скачиваемых и раздаваемых материалов, а не провайдер сети.

История

Протокол BitTorrent разработан Брамом Коэном (Bram Cohen) и представлен в 2001 году. Первый клиент был написан на Python. К середине 2000-х годов BitTorrent стал одним из основных протоколов обмена данными в интернете, по разным оценкам обеспечивая от 30 до 70 % всего мирового трафика. В 2017 году появился BitTorrent v2 с переходом на SHA-256 и улучшенную структуру данных, однако переход на новую версию идёт медленно.

Источники

  • BEP 3: The BitTorrent Protocol Specification
  • BEP 5: DHT Protocol
  • BEP 9: Metainfo magnet URI scheme
  • Bram Cohen, «Incentives Build Robustness in BitTorrent», 2003
  • А. Оглоблин, «Битторрент», журнал «Компьютерра»
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru