В системе распространения файлов BitTorrent файл torrent или файл метаинформации представляет собой компьютерный файл , содержащий метаданные о файлах и папках, которые подлежат распространению, а также, как правило, список сетевых расположений трекеров — компьютеров, помогающих участникам системы находить друг друга и формировать эффективные группы распространения, называемые роями . [1] Файлы torrent обычно имеют расширение .torrent
.
Файл torrent действует как таблица содержания (индекс), которая позволяет компьютерам находить информацию с помощью клиента torrent. С помощью файла torrent можно загружать небольшие части исходного файла с компьютеров, которые уже загрузили его. Эти «пиры» позволяют загружать файл в дополнение к основному серверу или вместо него . Файл torrent не содержит контент для распространения; он содержит только информацию об этих файлах, такую как их имена, структура папок , размеры и криптографические хеш-значения для проверки целостности файла.
Система торрентов была создана для снижения нагрузки на центральные серверы, так как вместо того, чтобы отдельные клиенты забирали файлы с сервера, торренты могут краудсорсингом обеспечить пропускную способность, необходимую для передачи файлов, и сократить время, необходимое для загрузки больших файлов. Многие бесплатные/бесплатные программы и операционные системы, такие как различные дистрибутивы Linux , предлагают возможность загрузки торрентов для пользователей, ищущих вышеупомянутые преимущества. Другие большие загрузки, такие как медиафайлы, также часто передаются через торренты.
Обычно доступ в Интернет асимметричен, поддерживает более высокую скорость загрузки, чем скорость отдачи, ограничивает полосу пропускания каждой загрузки и иногда устанавливает ограничения полосы пропускания и периоды, когда системы недоступны. Это создает неэффективность, когда много людей хотят получить один и тот же набор файлов из одного источника; источник должен всегда быть в сети и иметь огромную исходящую полосу пропускания. Протокол торрента решает эту проблему путем децентрализации распределения, используя способность людей к сети " peer-to-peer " между собой.
Каждый файл, который должен быть распространен, делится на небольшие информационные фрагменты , называемые фрагментами . Загружаемые пиры достигают высокой скорости загрузки, запрашивая несколько фрагментов с разных компьютеров одновременно в рое. После получения эти фрагменты обычно немедленно становятся доступными для загрузки другими в рое. Таким образом, нагрузка на сеть распределяется между загрузчиками, а не концентрируется на центральном распределительном узле или кластере. Пока все фрагменты доступны, пиры (загрузчики и выгрузчики) могут приходить и уходить; ни одному пиру не нужно иметь все фрагменты или даже оставаться подключенным к рою, чтобы распространение продолжалось среди других пиров.
Небольшой файл torrent создается для представления файла или папки для общего доступа. Файл torrent выступает в качестве ключа для инициирования загрузки фактического контента. Кто-то, заинтересованный в получении общего файла или папки, сначала получает соответствующий файл torrent, либо напрямую загружая его, либо используя magnet-ссылку . Затем пользователь открывает этот файл в клиенте torrent, который автоматизирует остальную часть процесса. Чтобы узнать интернет-местоположения пиров, которые могут делиться частями, клиент подключается к трекерам, указанным в файле torrent, и/или достигает аналогичного результата с помощью распределенных хэш-таблиц . Затем клиент подключается напрямую к пирам, чтобы запрашивать части и иным образом участвовать в рое. Клиент также может сообщать о ходе работы трекерам, чтобы помочь трекеру с его рекомендациями по пиру.
Когда у клиента есть все части, торрент-клиент собирает их в пригодную для использования форму. Они также могут продолжать делиться частями, повышая свой статус до статуса сида, а не обычного пира.
Торрент-файл содержит список файлов и метаданные целостности всех фрагментов, а также опционально большой список трекеров.
Торрент-файл представляет собой закодированный словарь со следующими ключами (ключи в любом закодированном словаре упорядочены лексикографически ):
Все строки должны быть в кодировке UTF-8 , за исключением частей , которые содержат двоичные данные.
Торрент однозначно идентифицируется infohash , хешем SHA-1 , рассчитанным по содержимому словаря info в форме bencode . Изменения в других частях торрента не влияют на хеш. Этот хеш используется для идентификации торрента для других пиров через DHT и для трекера. Он также используется в magnet-ссылках .
Протокол BitTorrent v2 (BEP-0052) вводит новое определение торрент-файла. [2] Основная структура такова:
Новый формат использует SHA-256 как в piece-hashing, так и в infohash , заменяя сломанный SHA-1 hash. Magnet-ссылка "btmh" будет содержать полный 32-байтовый хеш, в то время как связь с трекерами и на DHT использует 20-байтовую усеченную версию, чтобы вписаться в старую структуру сообщения. [2] Можно создать torrent-файл только с обновленными новыми полями для torrent "v2" или как со старыми, так и с новыми полями для "гибридного" формата. Однако, поскольку torrent будет иметь разные infohash в сетях v1 и v2, будут сформированы два роя, требующие специальной обработки со стороны клиента для объединения двух. [3]
Основной особенностью нового формата является применение деревьев Меркла , что позволяет индивидуально проверять и повторно загружать блоки размером 16 КБ. Теперь каждый файл всегда занимает весь размер фрагмента и имеет независимый хэш корня Меркла, так что можно найти дубликаты файлов в несвязанных торрент-файлах любой длины фрагмента. Размер файла не уменьшается (при условии, что размер фрагмента остается прежним; структура дерева v2 допускает более крупные фрагменты с меньшим количеством негативных последствий), но словарь информации , необходимый для магнитных ссылок, уменьшается (только в торрентах только v2). [3]
Файл торрента также может содержать дополнительные метаданные, определенные в расширениях спецификации BitTorrent. [4] Они известны как «Предложения по улучшению BitTorrent». Примерами таких предложений являются метаданные для указания того, кто создал торрент и когда.
Эти расширения были развернуты в одной или нескольких реализациях, а также доказали свою полезность посредством последовательного и повсеместного использования. Хотя они могут потребовать незначительных изменений, они в основном считаются завершенными, ожидающими только благословения Брэма Коэна , чтобы быть повышенными до статуса Final/Active Process.
BEP-0005 [5] расширяет BitTorrent для поддержки распределенных хэш-таблиц , в частности Mainline DHT .
Словарь торрента без трекера не имеет ключа анонса . Вместо этого торрент без трекера имеет ключ узлов :
{ # ... 'узлы' : [[ "<хост>" , <порт> ], [ "<хост>" , <порт> ], ... ], # ... }
Например,
'узлы' : [[ "127.0.0.1" , 6881 ], [ "your.router.node" , 4804 ]] ,
В спецификации рекомендуется, чтобы узлы «были установлены на K ближайших узлов в таблице маршрутизации клиента, генерирующего торрент. В качестве альтернативы ключ может быть установлен на известный хороший узел, например, на узел, которым управляет человек, генерирующий торрент».
BEP-0012 [6] расширяет BitTorrent для поддержки нескольких трекеров.
Новый ключ, announce-list , помещается в самый верхний словарь (т.е. вместе с announce и info ).
{ # ... 'announce-list' : [[ '<tracker1-url>' ][ '<tracker2-url>' ]], # ... }
BEP-0019 [7] — одно из двух расширений, позволяющих использовать HTTP-сиды в BitTorrent.
В BEP-0019 новый ключ url-list
, помещается в самый верхний список. Клиент использует ссылки для сборки обычных HTTP URL-адресов — поддержка на стороне сервера не требуется. Эта функция очень часто используется проектами с открытым исходным кодом , предлагающими загрузку программного обеспечения. Веб-сиды позволяют клиенту интеллектуально выбирать и одновременно использовать зеркальные сайты , P2P или HTTP(S). Это снижает нагрузку на серверы проекта и максимизирует скорость загрузки. MirrorBrain автоматически генерирует торренты с веб-сидами.
BEP-0027 [8] расширяет BitTorrent для поддержки частных торрентов.
Новый ключ, private , помещается в словарь info . Значение этого ключа равно 1, если торрент является частным:
{ # ... 'информация' : { # ... 'личное' : 1 , # ... }, # ... }
Частные торренты должны использоваться с частным трекером . Такой трекер ограничивает доступ к отслеживаемым им торрентам, проверяя IP-адрес пира, отказываясь предоставлять список пиров, если IP-адрес неизвестен. Сам пир обычно регистрируется на трекере через закрытое онлайн-сообщество; частный трекер обычно также хранит статистику передачи данных для использования в сообществе.
Децентрализованные методы, такие как DHT, PeX, LSD , отключены для сохранения централизованного управления. Частный торрент можно вручную отредактировать, чтобы удалить флаг приватности, но это изменит инфо-хэш (детерминированно), образуя отдельный «рой» пиров. С другой стороны, изменение списка трекеров не изменит хэш. Флаг не обеспечивает настоящей конфиденциальности, а действует как джентльменское соглашение .
Эти расширения находятся на рассмотрении для стандартизации. Большинство из них уже широко приняты как фактические стандарты.
BEP-0017 [9] расширяет BitTorrent для поддержки HTTP-семян, которые позже стали чаще называть «веб-семенами», чтобы включить HTTPS .
В BEP-0017 новый ключ httpsseeds помещается в самый верхний список (т. е. вместе с announce и info ). Значение этого ключа — список веб-адресов, с которых можно получить данные торрента. Требуется специальная поддержка сервера. Он остается в статусе Draft.
{ # ... 'httpseeds' : [ 'http://www.site1.com/source1.php' , 'http://www.site2.com/source2.php' ], # ... }
BEP-0030 [10] расширяет BitTorrent для поддержки деревьев Меркла (первоначально реализованных в Tribler ). Цель состоит в том, чтобы уменьшить размер файла торрент-файлов, что снижает нагрузку на тех, кто обслуживает торрент-файлы.
Файл торрента, использующий деревья Меркла, не имеет ключа pieces в списке информации . Вместо этого такой файл торрента имеет ключ root_hash в списке информации . Значение этого ключа является корневым хешем хеша Меркла:
{ # ... 'info' : { # ... 'root hash' : <двоичный хэш SHA1> , # ... }, # ... }
BitTorrent v2 использует другой тип дерева Меркла. [3]
Декодированный торрент-файл (с длиной фрагмента 256 КиБ = 262 144 байт) для файла debian-503-amd64-CD-1.iso (размер которого составляет 678 301 696 байт) может выглядеть следующим образом:
{ 'announce' : 'http://bttracker.debian.org:6969/announce' , 'info' : { 'length' : 678301696 , 'name' : 'debian-503-amd64-CD-1.iso' , 'piece length' : 262144 , 'pieces' : <двоичные хэши SHA1> } }
Примечание: здесь количество частей будет равно 51 КБ ( ).
Декодированный торрент-файл (с «длиной фрагмента» 256 КиБ = 262144 Б) для двух файлов, 111.txt и 222.txt , может выглядеть следующим образом:
{ 'announce' : 'http://tracker.example.com/announce' , 'info' : { 'files' : [ { 'length' : 111 , 'path' : [ '111.txt' ]}, { 'length' : 222 , 'path' : [ '222.txt' ]} ], 'name' : 'directoryName' , 'piece length' : 262144 , 'pieces' : <двоичные хэши SHA1> } }