.torrent

Эта статья входит в число готовых статей
Эта статья прошла проверку экспертом
Материал из «Знание.Вики»

В системе распространения файлов BitTorrent .torrent-файл или файл метаинформации — это компьютерный файл, содержащий метаданные о файлах и папках, подлежащих распространению, а также, как правило, список сетевых местоположений трекеров — компьютеров, помогающих участникам системы находят друг друга и образующих эффективные распределительные группы, называемые роями (swarm)[1].

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

С помощью торрент-файла можно скачивать небольшие части исходного файла с компьютеров, которые уже его скачали. Эти «пиры» (peers) позволяют загружать файл в дополнение к основному серверу или вместо него. Торрент-файлы обычно имеют расширение «.torrent». Сами торрент-файлы и метод их использования были созданы для снижения нагрузки на центральные серверы, поскольку вместо отправки файла по запросу с одного сервера можно использовать краудсорсинг для увеличения пропускной способности, необходимой для передачи файла, и сократить время, необходимое для скачивания больших файлов.

Многие бесплатные программы и операционные системы, такие как различные дистрибутивы Linux, можно скачать через протокол торрент, что удобно пользователям, которым нужны вышеупомянутые преимущества. Другие большие объёмы данных, такие как мультимедийные файлы, также часто загружают через торрент-клиент.

Принцип работы

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

Это приводит к неэффективному использованию ресурсов, когда многие пользователи хотят получить один и тот же набор файлов из одного источника: источник всегда должен быть в сети и должен обладать большой исходящей пропускной способностью. Протокол BitTorrent решает эту проблему путем децентрализации распространения данных, используя возможность пользователей объединяться в сеть одноранговую сеть «peer-to-peer» между собой.

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

Таким образом, нагрузка на сеть распределяется между загрузчиками, а не концентрируется на центральном распределительном узле или кластере. Пока все фрагменты доступны, пиры (как загружающие, так и раздающие) могут подключаться и отключаться; ни один пир не обязан иметь все фрагменты или даже оставаться подключенным к рою, чтобы распространение продолжалось среди других пиров.

Небольшой торрент-файл создается для представления файла или папки для совместного использования и действует как ключ к началу загрузки целевого контента. Тот, кто заинтересован в получении общего файла или папки, сначала получает соответствующий торрент-файл, загружая его напрямую или используя magnet-ссылку. Затем пользователь открывает этот файл в клиенте BitTorrent, который автоматизирует оставшуюся часть процесса. Чтобы узнать местонахождение пиров в Интернете, которые могут обмениваться фрагментами, клиент подключается к трекерам, указанным в торрент-файле, и/или достигает аналогичного результата с помощью распределенных хеш-таблиц. Затем клиент подключается напрямую к пирам, чтобы запрашивать фрагменты и иным образом участвует в рое. Клиент также может сообщать трекерам о прогрессе, чтобы помочь трекеру с рекомендациями коллег.

Когда у клиента есть все части, BitTorrent собирает их в пригодную для использования форму Такой клиент может продолжать делиться кусочками, повышая свой статус до уровня «сидера» (seed — «сеятель»), а не обычного пира.

Структура файла

Торрент-файл содержит список файлов и метаданные о целостности его всех фрагментов, а также может содержать длинный список трекеров. Торрент-файл представляет собой закодированный словарь со следующими ключами (ключи в любом закодированном словаре упорядочены лексикографически):

  • announce — URL трекера
  • info — сопоставляется со словарем, ключи которого зависят от того, один или несколько файлов являются общими:
    • files — список словарей, каждый из которых соответствует файлу. Каждый словарь имеет следующие ключи:
      • length —— размер файла в байтах.
      • path — — список строк, соответствующих именам подкаталогов, последняя из которых является фактическим именем файла.
    • length — размер файла в байтах (но только при совместном использовании одного файла)
    • name — предлагаемое имя, под которым должен быть сохранен файл или создана директория, если файлов несколько
    • piece length — длина части в байтах; обычно 262 144 байт (256 КБ).
    • pieces — список хэшей для каждой части. Так как SHA-1 возвращает 160-битный хеш, piece будет строкой, длина которой кратна 20 байтам. Если торрент содержит несколько файлов, фрагменты формируются путем объединения файлов в порядке их появления в словаре файлов (то есть все фрагменты в торренте имеют полную длину, за исключением последнего, который может быть короче).

Все строки должны быть в кодировке UTF-8, за исключением фрагментов, содержащих двоичные данные.

Торрент однозначно идентифицируется информационным хэшем, SHA-1, вычисляемым по содержимому информационного словаря в форме бенкода. Изменения в других частях торрента не влияют на хэш. Этот хэш используется для идентификации торрента среди пиров через DHT и для трекера. Он также используется в magnet-ссылках.

Расширения

Торрент-файл также может содержать дополнительные метаданные, определённые в расширенной спецификации BitTorrent. Они известны как «Предложения по улучшению BitTorrent» «BitTorrent Enhancement Proposals». Примеры таких предложений включают метаданные с указанием, кто и когда создал данный торрент.

Черновики расширений

Эти расширения находятся на рассмотрении для стандартизации. Большинство из них уже широко приняты в качестве стандартов де-факто.

Распределенные хеш-таблицы

BEP-0005 расширяет BitTorrent для поддержки распределённых хеш-таблиц[2].

Бестрекерный торрент-словарь не имеет ключа announce. Вместо этого бестрекерный торрент имеет ключ узлов nodes:

{
  # ...
  'nodes': [["<host>", <port>], ["<host>", <port>], ...],
  # ...
}

Например,

  'nodes': [["127.0.0.1", 6881], ["your.router.node", 4804]],

Спецификация в данном случае рекомендует, чтобы узлы «были установлены на расстоянии K ближайших узлов в таблице маршрутизации клиента, генерирующего торрент. В качестве альтернативы, ключ может быть установлен на заведомо исправный узел, такой как узел, которым управляет пользователей, сгенерироваший торрент».

Множественные трекеры

BEP-0012 расширяет BitTorrent для поддержки нескольких трекеров[3].

Новый ключ, annone-list, помещается в самый верхний словарь, рядом с announce и info.

{
  # ...
  'announce-list': [['<tracker1-url>']['<tracker2-url>']],
  # ...
}
HTTP-сиды

BEP-0017 расширяет BitTorrent для поддержки начальных значений HTTP, которые позже чаще назывались «веб-сидами», включая HTTPS[4].

Новый ключ httpseeds помещается в самый верхний список рядом с announce и info. Значение этого ключа представляет собой список веб-адресов, с которых можно получить торрент-данные.

{
  # ...
  'httpseeds': ['http://www.site1.com/source1.php', 'http://www.site2.com/source2.php'],
  # ...
}

Эта функция очень часто используется в проектах с открытым исходным кодом, предлагающих загрузку программного обеспечения. Веб-источники позволяют клиенту сделать выбор и использовать зеркальные сайты, P2P или HTTP(S). Это снижает нагрузку на серверы проекта и максимально увеличивает скорость загрузки. Например, MirrorBrain, один из серверов разработчиков Linux, автоматически генерирует торренты с веб-сидами.

Приватные торренты

BEP-0027 расширяет BitTorrent для поддержки приватных раздач[5].

Новый ключ, закрытый, помещается в информационный словарь. Значение этого ключа равно 1, если раздача приватная.

{
  # ...
  'info': {
    # ...
    'private': 1,
    # ...
  },
  # ...
}

Приватные торренты можно запустить только на приватном трекере. Такой трекер ограничивает доступ к отслеживаемым торрентам, сверяя IP-адрес пира и отказываясь предоставлять список пиров, если IP-адрес неизвестен. Сам пир обычно регистрируется в трекере через закрытое онлайн-сообщество. Приватный трекер, как правило, хранит статистику передачи данных для использования в сообществе.

Децентрализованные методы, такие как DHT, PeX, LSD, в этом случае отключаются для сохранения централизованного контроля. Приватный торрент-файл можно отредактировать вручную, чтобы удалить частный флаг, но это изменит информационный хеш, и приведёт к формированию новго «роя» пиров. С другой стороны, изменение списка трекеров не меняет хэш. Таким образом, данный флаг не предлагает истинной конфиденциальности, а действует как джентльменское соглашение.

Деревья Меркла

BEP-0030 расширяет возможности BitTorrent для поддержки деревьев Меркла. Смысл в том, чтобы уменьшить размер торрент-файлов, что снижает нагрузку на их обслуживание[6].

Торрент-файл, использующий деревья Меркла, не имеет ключа частей в информационном списке. Вместо этого у такого торрент-файла есть ключ root_hash. Значение этого ключа является корневым хэшем для хэша Меркла.

{
  # ...
  'info': {
    # ...
    'root hash': <binary SHA1 hash>,
    # ...
  },
  # ...
}

Примеры

Один файл

Дезакодированный торрент-файл (длина фрагмента 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': <binary SHA1 hashes>
     }
 }

Примечание: размер частей здесь будет равен 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': <binary SHA1 hashes>
     }
 }

.micro.torrent

Микро-торрент — торрент от одного файла, в котором размер сегмента совпадает с размером файла или 16 384 байта, если размер файла меньше. В отличие от обычного торрента, микро-торрент создаётся из magnet-ссылки, в которой есть SHA1-хеш файла, имя и размер[7]. Микро-торрент позволяет скачивать торрент-клиентом небольшие файлы, размером до 2МБ, с веб-сервера без создания стандартного торрент-файла.

Примечания

  1. BEP-0003: The BitTorrent Protocol Specification. Bittorrent.org. Дата обращения: 22 октября 2009. Архивировано 26 июля 2019 года.
  2. BEP-0005: DHT Protocol. Bittorrent.org. Дата обращения: 25 декабря 2022. Архивировано 13 февраля 2010 года.
  3. BEP-0012: Multitracker Metadata Extension. Bittorrent.org. Дата обращения: 25 декабря 2022. Архивировано 27 декабря 2012 года.
  4. BEP-0017: HTTP Seeding. Bittorrent.org. Дата обращения: 25 декабря 2022. Архивировано 13 декабря 2013 года.
  5. BEP-0027: Private Torrents. Bittorrent.org. Дата обращения: 25 декабря 2022. Архивировано 24 марта 2013 года.
  6. BEP-0030: Merkle hash torrent extension. Bittorrent.org. Дата обращения: 25 декабря 2022. Архивировано 14 сентября 2009 года.
  7. magnet-converter/magnet-converter.htm at master · ivan386/magnet-converter