Принцип работы торрент-систем¶
Торрент — это файл, содержащий метаданные, необходимые для скачивания данных по протоколу 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
- А. Оглоблин, «Битторрент», журнал «Компьютерра»
