This article needs additional citations for verification. (November 2008) |
Разработчик(и) | Арвид Норберг |
---|---|
Первоначальный выпуск | Сентябрь 2005 г (2005-09) |
Стабильный релиз | 2.0.11 [1] / 28 января 2025 г. (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 , который теперь является основой, на которой строятся многие другие расширения.
This section may be confusing or unclear to readers. (March 2018) |
BEP являются частью процесса предложения по улучшению BitTorrent. BEP — это проектный документ, предоставляющий информацию сообществу BitTorrent или описывающий новую функцию для протоколов BitTorrent. BEP должен предоставлять краткую техническую спецификацию функции и обоснование функции. Они были предназначены для того, чтобы стать основными механизмами для предложения новых функций, для сбора мнений сообщества по проблеме и для документирования проектных решений, которые вошли в BitTorrent. Автор BEP несет ответственность за достижение консенсуса в сообществе и документирование несогласных мнений.
Поскольку BEP поддерживаются в виде реструктурированных текстовых файлов в репозитории с версиями, история их изменений представляет собой историческую запись предложения функции [2]
Существует три вида BEP:
№ БЭП | Заголовок | Примечание |
---|---|---|
3 | Протокол BitTorrent | |
5 | протокол DHT | торренты без трекеров , протокол Mainline Kademlia DHT |
7 | Расширение трекера IPv6 | |
9 | Расширение для отправки файлов метаданных одноранговыми узлами | протокол передачи метаданных, позволяет использовать магнитные ссылки |
10 | Протокол расширения | |
11 | Обмен между коллегами | uTorrent-PEX |
12 | Расширение метаданных Multitracker | также поддерживает интерпретацию μTorrent |
14 | Локальное обнаружение одноранговых сетей | |
15 | Протокол трекера UDP для BitTorrent | |
16 | Суперпосев | |
17 | HTTP-заполнение | Хоффман-стиль |
19 | WebSeed — HTTP/FTP-раздача (стиль GetRight) | |
21 | Только частичная загрузка семян | |
24 | Трекер возвращает внешний IP | |
27 | Частные торренты | |
29 | транспортный протокол uTorrent | с 0.16.0 [3] |
30 | Гашиш Меркла | с 0,15 [4] |
32 | Расширения BitTorrent DHT для IPv6 | с 1.2 |
33 | DHT соскоб | с 0,16 [4] |
38 | изменяемые торренты | с 1.1 [4] |
40 | канонический приоритет одноранговых узлов | с 1.0 [4] |
43 | Узлы DHT только для чтения | с версии 1.0.3 [4] |
44 | DHT положить/получить | с 1.0 [4] |
47 | файлы pad и атрибуты файлов | с 0,15 [4] |
51 | Индексация DHT infohash | с 1.2 |
52 | Спецификация протокола BitTorrent v2 | с 2.0 |
53 | Выбор файла магнитной ссылки | с 1.2 |
55 | Расширение дырокола |
Весь дисковый ввод-вывод в libtorrent выполняется асинхронно с сетевым потоком потоком disk io. Когда блок считывается, поток disk io считывает все последующие блоки из этой части в кэш чтения, предполагая, что одноранговый узел, запрашивающий блок, также запросит больше блоков из той же части. Это уменьшает количество системных вызовов для чтения данных. Это также уменьшает задержку из-за поиска.
Аналогично, для запросов на запись блоки кэшируются и сбрасываются на диск после завершения одного полного фрагмента или фрагмента, который является наименее недавно обновленным, когда требуется больше места в кэше. Кэш динамически распределяет пространство между кэшем записи и чтения. Кэш записи имеет строгий приоритет над кэшем чтения.
Используемые блоки кэша блокируются в физической памяти, чтобы избежать его выгрузки на диск. Разрешение выгрузки дискового кэша на диск означает, что его очистка станет крайне неэффективной, поскольку его придется считывать обратно в физическую память только для того, чтобы снова сбросить на диск.
В целях экономии памяти и системных вызовов файловые операции iovec используются для очистки нескольких блоков кэша за один вызов.
В системах с небольшим объемом памяти дисковый кэш можно полностью отключить или установить меньший лимит для экономии памяти.
На процессорах с небольшим кэшем L2 копирование памяти может быть дорогостоящей операцией. Важно свести копирование к минимуму на таких машинах. Это в основном касается встроенных систем.
Чтобы минимизировать количество копий полученных данных, буфер приема для данных полезной нагрузки принимается непосредственно в выровненный по странице дисковый буфер. Если соединение зашифровано, буфер расшифровывается на месте. Затем буфер перемещается в дисковый кэш без копирования. После получения всех блоков для фрагмента или необходимости очистки кэша все блоки передаются непосредственно в writev() для их очистки в одном системном вызове. Это означает одну копию в пользовательскую память и одну копию обратно в память ядра.
При сидировании и загрузке в целом ненужное копирование избегается путем кэширования блоков в выровненных буферах, которые копируются один раз в буфер отправки однорангового узла. Буфер отправки однорангового узла не гарантируется выровненным, хотя большую часть времени это так. Затем буфер отправки шифруется с помощью специфичного для однорангового узла ключа и привязывается к iovec для отправки. Это означает, что существует одна копия в пользовательском пространстве, чтобы разрешить невыровненные запросы однорангового узла и специфичное для однорангового узла шифрование.
Средство выбора частей является центральным компонентом в реализации bittorrent. Средство выбора частей в libtorrent оптимизировано для быстрого поиска самых редких частей. Он хранит список всех доступных частей, отсортированных по редкости, а части с одинаковой редкостью перетасованы. Режим «Самый редкий первый» является доминирующим режимом средства выбора частей. Другие режимы также поддерживаются и используются пирами в определенных ситуациях.
Селектор частей позволяет объединить доступность части с приоритетом. Вместе они определяют порядок сортировки списка частей. Части с приоритетом 0 никогда не будут выбраны, что используется для функции выборочной загрузки.
Чтобы иметь как можно меньше частично завершенных частей, пиры имеют склонность выбирать блоки из тех же частей, что и другие пиры в той же категории скорости. Категория скорости — это грубая категоризация пиров на основе их скорости загрузки. Это заставляет медленных пиров выбирать блоки из той же части, а быстрых пиров — из той же части, и, следовательно, снижает вероятность того, что медленные пиры заблокируют завершение частей.
Сборщик деталей также можно настроить на последовательную загрузку деталей.
Это BEP30 протокола BitTorrent. Merkle hash tree torrents — это расширение, которое позволяет torrent-файлу содержать только корневой хэш хэш-дерева, образующего хэши частей. [5] Главное преимущество этой функции заключается в том, что независимо от того, сколько частей находится в торренте, файл .torrent всегда будет иметь одинаковый размер. Он будет только расти с количеством файлов (поскольку он все еще должен содержать имена файлов).
При использовании обычных торрентов клиенты должны запрашивать несколько блоков для фрагментов, как правило, у разных пиров, прежде чем данные можно будет проверить по хешу фрагмента. Чем больше фрагменты, тем больше времени потребуется для загрузки полного фрагмента и его проверки. До того, как фрагмент будет проверен, он не может быть передан рою, что означает, что чем больше размеры фрагментов, тем медленнее происходит обработка данных, когда они загружаются пирами. Поскольку в среднем данные должны находиться в ожидании в буферах клиента, прежде чем они будут проверены и смогут быть загружены снова.
Другая проблема с большими размерами фрагментов заключается в том, что клиенту сложнее определить вредоносный или неисправный узел в случае сбоя фрагмента, и чем больше фрагменты, тем больше времени потребуется на его повторную загрузку и тем больше попыток его успешной загрузки.
Размер куска в обычных торрентах — это компромисс между размером самого файла .torrent и размером куска. Часто для файлов размером 4 ГБ размер куска составляет 2 или 4 МБ, просто чтобы не сделать файл .torrent слишком большим.
Merkle torrents решает эти проблемы, устраняя компромисс между размером .torrent и размером фрагмента. С merkle torrents размер фрагмента может быть минимальным размером блока (16 КБ), что позволяет пирам немедленно проверять каждый блок данных, полученных от пиров. Это обеспечивает минимальное время обработки и полностью устраняет проблему идентификации вредоносных пиров.
Некоторые известные приложения, использующие libtorrent:
{{cite web}}
: Отсутствует или пусто |title=
( помощь ){{cite web}}
: CS1 maint: archived copy as title (link)