libtorrent

libtorrent
Разработчик(и)Арвид Норберг
Первоначальный выпускСентябрь 2005 г .; 19 лет назад (2005-09)
Стабильный релиз
2.0.11 [1]  / 28 января 2025 г. ; 4 дня назад (28 January 2025)
Репозиторийgithub.com/arvidn/libtorrent/
Написано вС++
Доступно вАнглийский
Тип Библиотека BitTorrent
ЛицензияBSD-3-пункт
Веб-сайтlibtorrent.org

libtorrent — это реализация протокола BitTorrent с открытым исходным кодом . Она написана на языке C++ и имеет основной интерфейс библиотеки на этом языке . Ее наиболее примечательными особенностями являются поддержка Mainline DHT , IPv6 , HTTP seed и обмена пиринговыми данными μTorrent . libtorrent использует Boost , в частности Boost.Asio , чтобы добиться независимости от платформы. Известно, что она работает на Windows и большинстве Unix-подобных операционных системах ( OS X , Linux и многих BSD ).

libtorrent поддерживается в актуальном состоянии с помощью расширений bittorrent, которые разработчики считают наиболее полезными, и активно оптимизируется для работы в более широком наборе сред. Многие из его функций можно отключить во время компиляции, чтобы не включать код, который не будет использоваться в конкретном случае использования . Он стремится стать наиболее подходящей реализацией libtorrent для встраиваемых устройств, а также для настольных компьютеров и seed-серверов. Некоторые детали его реализации описаны в разделе функций.

Первоначальным автором libtorrent является Арвид Норберг. Это первый клиент, поддерживающий протокол расширения вместе с μTorrent , который теперь является основой, на которой строятся многие другие расширения.

Функции

Реализованные BEP

BEP являются частью процесса предложения по улучшению BitTorrent. BEP — это проектный документ, предоставляющий информацию сообществу BitTorrent или описывающий новую функцию для протоколов BitTorrent. BEP должен предоставлять краткую техническую спецификацию функции и обоснование функции. Они были предназначены для того, чтобы стать основными механизмами для предложения новых функций, для сбора мнений сообщества по проблеме и для документирования проектных решений, которые вошли в BitTorrent. Автор BEP несет ответственность за достижение консенсуса в сообществе и документирование несогласных мнений.

Поскольку BEP поддерживаются в виде реструктурированных текстовых файлов в репозитории с версиями, история их изменений представляет собой историческую запись предложения функции [2]

Существует три вида BEP:

  1. Стандарт BEP описывает расширение одного из протоколов BitTorrent или изменение поведения одного из участников этих протоколов, где в настоящее время участниками являются клиенты, трекеры и веб-серверы.
  2. Информационный BEP описывает проблему дизайна BitTorrent или предоставляет общие рекомендации или информацию сообществу BitTorrent, но не предлагает расширения. Информационные BEP не обязательно представляют консенсус или рекомендацию сообщества BitTorrent, поэтому пользователи и разработчики могут игнорировать информационные BEP или следовать их советам.
  3. Процесс BEP описывает процесс, окружающий BitTorrent, или предлагает изменение (или событие в) процессе. Процесс BEP похож на стандарты BEP Track, но применяется к областям, отличным от протоколов BitTorrent. Это больше, чем рекомендации, и пользователи, как правило, не могут их игнорировать. Примерами служат графики выпуска, процедуры, руководства, изменения в процессе принятия решений и изменения в инструментах или среде, используемых при разработке BitTorrent.
№ БЭПЗаголовокПримечание
3Протокол BitTorrent
5протокол DHTторренты без трекеров , протокол Mainline Kademlia DHT
7 Расширение трекера IPv6
9Расширение для отправки файлов метаданных одноранговыми узламипротокол передачи метаданных, позволяет использовать магнитные ссылки
10Протокол расширения
11Обмен между коллегамиuTorrent-PEX
12Расширение метаданных Multitrackerтакже поддерживает интерпретацию μTorrent
14Локальное обнаружение одноранговых сетей
15 Протокол трекера UDP для BitTorrent
16Суперпосев
17HTTP-заполнениеХоффман-стиль
19WebSeed — HTTP/FTP-раздача (стиль GetRight)
21Только частичная загрузка семян
24Трекер возвращает внешний IP
27Частные торренты
29транспортный протокол uTorrentс 0.16.0 [3]
30Гашиш Мерклас 0,15 [4]
32Расширения BitTorrent DHT для IPv6с 1.2
33DHT соскобс 0,16 [4]
38изменяемые торрентыс 1.1 [4]
40канонический приоритет одноранговых узловс 1.0 [4]
43Узлы DHT только для чтенияс версии 1.0.3 [4]
44DHT положить/получитьс 1.0 [4]
47файлы pad и атрибуты файловс 0,15 [4]
51Индексация DHT infohashс 1.2
52Спецификация протокола BitTorrent v2с 2.0
53Выбор файла магнитной ссылкис 1.2
55Расширение дырокола

Список прочих функций

  • Интерфейс плагина для реализации пользовательских расширений BitTorrent без необходимости изменения libtorrent
  • поддерживает протокол обмена пиринговыми данными μTorrent (PEX).
  • поддерживает локальное обнаружение одноранговых узлов (многоадресная рассылка для одноранговых узлов в одной локальной сети)
  • царапины от трекера
  • поддерживает расширение lt_trackers для обмена трекерами между одноранговыми узлами
  • поддерживает расширение no_peer_id=1, которое снизит нагрузку на трекеры.
  • поддерживает параметр трекера compact=1.
  • поддержка торрентов хэш-дерева Меркла. Это позволяет масштабировать размер торрент-файлов в соответствии с размером контента.
  • использует отдельный поток ввода-вывода на диске, чтобы диск никогда не блокировался при взаимодействии с сетью или клиентом.
  • поддерживает файлы размером более 2 гигабайт на системах, которые это поддерживают.
  • Поддержка быстрого возобновления, способ избавиться от дорогостоящей проверки частей в начале возобновленного торрента. Сохраняет состояние хранилища, состояние piece_picker, а также всех локальных пиров в отдельном файле быстрого возобновления.
  • имеет регулируемый дисковый кэш чтения и записи для повышения пропускной способности диска.
  • ставит торренты в очередь для проверки файлов, вместо того чтобы проверять их все параллельно.
  • не имеет никаких требований к порядку частей в торренте, который он возобновляет. Это означает, что он может возобновить торрент, загруженный любым клиентом.
  • поддерживает как разреженные файлы, так и компактное размещение файлов (когда части хранятся на диске объединенными)
  • режим начального заполнения, в котором файлы на диске считаются полными, а хэш каждой части проверяется при первом запросе.
  • регулирует длину очереди запросов в зависимости от скорости загрузки.
  • обслуживает несколько торрентов на одном порту и в одном потоке
  • поддерживает http-прокси и базовую аутентификацию прокси
  • поддерживает сжатые ответы трекера
  • может ограничивать использование полосы пропускания при загрузке и выгрузке, а также максимальное количество не заблокированных пиров
  • возможность ограничения количества подключений.
  • задержки имеют сообщения, если нет другого исходящего трафика к пиру, и не отправляет имеют сообщения пирам, у которых уже есть кусок. Это экономит полосу пропускания.
  • Выборочная загрузка. Возможность выбора частей торрента для загрузки.
  • IP-фильтр для запрета подключения и соединения с IP-адресов и диапазонов IP-адресов
  • Поддержка NAT-PMP и UPnP (автоматическое сопоставление портов на маршрутизаторах, которые его поддерживают)
  • может проксировать торрент-трафик через анонимную сеть I2P .

Кэширование диска

Весь дисковый ввод-вывод в libtorrent выполняется асинхронно с сетевым потоком потоком disk io. Когда блок считывается, поток disk io считывает все последующие блоки из этой части в кэш чтения, предполагая, что одноранговый узел, запрашивающий блок, также запросит больше блоков из той же части. Это уменьшает количество системных вызовов для чтения данных. Это также уменьшает задержку из-за поиска.

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

Используемые блоки кэша блокируются в физической памяти, чтобы избежать его выгрузки на диск. Разрешение выгрузки дискового кэша на диск означает, что его очистка станет крайне неэффективной, поскольку его придется считывать обратно в физическую память только для того, чтобы снова сбросить на диск.

В целях экономии памяти и системных вызовов файловые операции iovec используются для очистки нескольких блоков кэша за один вызов.

В системах с небольшим объемом памяти дисковый кэш можно полностью отключить или установить меньший лимит для экономии памяти.

Сетевые буферы

На процессорах с небольшим кэшем L2 копирование памяти может быть дорогостоящей операцией. Важно свести копирование к минимуму на таких машинах. Это в основном касается встроенных систем.

Чтобы минимизировать количество копий полученных данных, буфер приема для данных полезной нагрузки принимается непосредственно в выровненный по странице дисковый буфер. Если соединение зашифровано, буфер расшифровывается на месте. Затем буфер перемещается в дисковый кэш без копирования. После получения всех блоков для фрагмента или необходимости очистки кэша все блоки передаются непосредственно в writev() для их очистки в одном системном вызове. Это означает одну копию в пользовательскую память и одну копию обратно в память ядра.

При сидировании и загрузке в целом ненужное копирование избегается путем кэширования блоков в выровненных буферах, которые копируются один раз в буфер отправки однорангового узла. Буфер отправки однорангового узла не гарантируется выровненным, хотя большую часть времени это так. Затем буфер отправки шифруется с помощью специфичного для однорангового узла ключа и привязывается к iovec для отправки. Это означает, что существует одна копия в пользовательском пространстве, чтобы разрешить невыровненные запросы однорангового узла и специфичное для однорангового узла шифрование.

Сборщик деталей

Средство выбора частей является центральным компонентом в реализации bittorrent. Средство выбора частей в libtorrent оптимизировано для быстрого поиска самых редких частей. Он хранит список всех доступных частей, отсортированных по редкости, а части с одинаковой редкостью перетасованы. Режим «Самый редкий первый» является доминирующим режимом средства выбора частей. Другие режимы также поддерживаются и используются пирами в определенных ситуациях.

Селектор частей позволяет объединить доступность части с приоритетом. Вместе они определяют порядок сортировки списка частей. Части с приоритетом 0 никогда не будут выбраны, что используется для функции выборочной загрузки.

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

Сборщик деталей также можно настроить на последовательную загрузку деталей.

Merkle хэш-дерево торрентов

Это BEP30 протокола BitTorrent. Merkle hash tree torrents — это расширение, которое позволяет torrent-файлу содержать только корневой хэш хэш-дерева, образующего хэши частей. [5] Главное преимущество этой функции заключается в том, что независимо от того, сколько частей находится в торренте, файл .torrent всегда будет иметь одинаковый размер. Он будет только расти с количеством файлов (поскольку он все еще должен содержать имена файлов).

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

Другая проблема с большими размерами фрагментов заключается в том, что клиенту сложнее определить вредоносный или неисправный узел в случае сбоя фрагмента, и чем больше фрагменты, тем больше времени потребуется на его повторную загрузку и тем больше попыток его успешной загрузки.

Размер куска в обычных торрентах — это компромисс между размером самого файла .torrent и размером куска. Часто для файлов размером 4 ГБ размер куска составляет 2 или 4 МБ, просто чтобы не сделать файл .torrent слишком большим.

Merkle torrents решает эти проблемы, устраняя компромисс между размером .torrent и размером фрагмента. С merkle torrents размер фрагмента может быть минимальным размером блока (16 КБ), что позволяет пирам немедленно проверять каждый блок данных, полученных от пиров. Это обеспечивает минимальное время обработки и полностью устраняет проблему идентификации вредоносных пиров.

Приложения

Некоторые известные приложения, использующие libtorrent:

Смотрите также

Ссылки

  1. ^ https://github.com/arvidn/libtorrent/releases/tag/v2.0.11. {{cite web}}: Отсутствует или пусто |title=( помощь )
  2. ^ "bep_0001.rst_post". www.bittorrent.org . Архивировано из оригинала 2020-02-12 . Получено 2020-02-19 .
  3. ^ "Архив Google Code - Долгосрочное хранилище для хостинга проектов Google Code". code.google.com . Архивировано из оригинала 2021-04-18 . Получено 2022-02-05 .
  4. ^ abcdefg "arvidn/libtorrent". 4 февраля 2022 г. Архивировано из оригинала 5 февраля 2022 г. Получено 5 февраля 2022 г. – через GitHub.
  5. ^ "Архивная копия" (PDF) . Архивировано из оригинала (PDF) 2014-12-18 . Получено 2010-12-06 .{{cite web}}: CS1 maint: archived copy as title (link)
  • Официальный сайт
Retrieved from "https://en.wikipedia.org/w/index.php?title=Libtorrent&oldid=1264931533"