распространение контента с помощью BitTorrent

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

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

Думаю, вы уже догадались, к чему я клоню: методика обмена файлами peer-to-peer позволяет любому желающему публиковать и получать доступ к таким документам, как видео, CD, ISO, музыка.
Это происходит за счет того, что в процессе участвует множество компьютеров, на которых одновременно запущена программа файлового обмена. Существует множество различных протоколов peer-to-peer, каждый из которых обладает своими достоинствами и недостатками. Некоторые из них известны, некоторые неизвестны, а некоторые вообще вышли из употребления и забыты.
В данной статье будет показано, как с помощью системы BitTorrent можно легко и непринужденно сделать контент доступным он-лайн.

как работает BitTorrent

BitTorrent состоит из трех отдельных компонентов: клиента, веб-сервера и трэкера. Клиент — это пользователь/машина, скачивающая контент. Веб- сервер предоставляет ссылки на файл, называемый torrent. Torrent — это специально обученный файл, содержащий информацию об опубликованном файле и размещении трэкера. Третий компоненет — это сервис, ждущий подключения клиента. Он подключен к указанному пользователем сокету, который может быть на той же машине, что и веб-сервер, или на другой. Трэкер не только распределяет доступ к контенту между разными клиентами, но и протоколирует всю активность.
Трэкер может одновременно управлять множеством файлов от различных torrent- или веб-серверов.
Не подумайте, что для того чтобы «расшарить» файл, вам необходимо закачивать его на какой-либо сервер. Нет! Совместный доступ к файлам на основе peer-to-peer подразумевает, что клиент скачивает файлы не с сервера, а у других таких же клиентов.
Предположим, что вы хотите предоставить доступ к ISO-образу и вы — единственный человек, имеющий его. Другие могут получить его, только если вы запустите клиента, который, будет первоисточником. Если еще один клиент хочет скачать к себе ваш контент, трэкер направляет его на первого клиента и начинается загрузка. Теперь представьте, что появился третий клиент, который также хочет заполучить этот контент. Трэкер координирует предыдущих клиентов чтобы они предоставляли уже скачанный контент ему. Чем больше клиентов подключается — тем быстрее можно загрузить файл.

success story: распространение ISO

Компания, в которой я работаю - Software Research Associates (SRA), - поддержала создание общественного проекта - CD, названного pg_live. Это дистрибутив, основанный на Knoppix и PostgreSQL. Он содержит репликацию, множество языков программирования и документацию, содержащую HOWTO, FAQ, руководства и книги.
Было решено выпускать обновления к данному CD. Мы решили, что простейший способ распространять обновления - предоставить доступ к ISO с помощью BitTorrent.

некоторые оговорки

Для начала я хотел бы описать условия, в которых решалась задача.
Я использовал реализацию BitTorrent из Debian, которая содержит как man’ы, так и врапперы для утилит на Python. Текущая версия образа pg_live занимает от 300 до 400 мегабайт. Мой тестовый сервер хостил веб-серверы и трэкеры.
Установка BitTorrent на Debian-машине не должна вызвать какие-либо трудности:

# apt-get update
# apt-get install bittorent

Не беспокойтесь о пропущенных зависимостях, так как процедура установки разрешает их автоматически, включая язык программирования Python.
шаги

Первый шаг для предоставления общего доступа к файлу — это создание torrent’а. Утилита для этого написана на Python и называется
bymaketorrent.py. Враппер для Debian — btmakemetafile.

$ btmakemetafile myfile tracker_announce_address [option...]

где myfile — имя файла, к которому предоставляется общий доступ, и tracker_announce_address — расположение сервиса трэкера. Единственный опциональный ключ — --piece_size_pow2. Большее значение указывает на то, что вы можете передавать более одного файла за раз, но при этом вы должны ограничить максимальное число подключений как только исчерпается лимит пропускной способности. Меньшее значение разрешит больше подключений, но файл будет передаваться медленнее.
Так как платформа была тестовой, я решил использовать URL localhost’a. Трэкер может слушать любой сокет. По умолчанию номер порта — 80, но документация BitTorrent рекомендует использовать порт 6969. Я выбрал порт 8099. Вы можете использовать как доменое имя, так и IP-адрес в URL, указывающий на трэкер-сервер. Помните, вы должны быть root’ом чтобы иметь возможность назначать сервис на порты с номерами меньше 1024. Я набрал команду из директории, содержащей ISO:

$ btmakemetafile pg_live.1.3.3-SRA.iso http://localhost:8099/announce

В результате я получил файл pg_live.1.3.3-SRA.iso.torrent.

Утилита btmakemetafile создает хэш, используемый для верификации целостности данных, когда клиент скачивает их. Чем больше файл — тем дольше генерируется torrent. Размер torrent’a зависит от размера файла, к которому предоставляется общий доступ. Например, для 11-мегабайтного файла размер torrent-a будет примерно 1.1 Kb. В нашем случае, 380-мегабайтный ISO увеличит размер torrent’а до 31 Kb.
Обратите внимание, что я добавил к URL путь /announce. Данное значение должно всегда присутствовать в URL трэкера. Реальная директория не обязательно должна существовать на вашем веб-сервере.

установка torrent на сервер

Вам потребуется внести небольшие изменения в конфигурацию сервера для того чтобы обучить его понимать .torrent как новый MIME-тип. В противном случае браузер может принять torrent за обычный текстовый файл. Если вы используете Apache httpd, добавьте следующее в файл httpd.conf (не забудьте перезапустить сервер!):

AddType application/x-bittorrent .torrent.

Загрузите torrent на ваш веб-сервер. Вы можете сделать ссылку, указывающую на torrent, на любой из ваших веб-страниц точно также как и ссылку на обычную веб-страницу.


Torrent Example

This is theHREF="./pg_live1.3.3-SRA.iso.torrent">torrent.



установка трэкера

Функция трэкера аналогична функции посредника в финансовых операциях. Он ничего не добавляет к продукту, но позволяет продавцу и покупателю найти друг друга и провести сделку. Враппер Debian для программы на python bttrack.py называется bttrack. Он устанавливает трэкер на порт 8090 и записывает всю активность в файл mydownloadlogfile.txt:

$ bttrack --dfile mydownloadlogfile.txt --port 8090

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

проводим посевную кампанию

Итак, последней стадией «посева» файла в сеть является запуск самого клиента. Как я уже упоминал раньше, вам необходимо запустить клиента, если вы хотите предоставить общий доступ к файлу, которого больше ни у кого на данный момент нет. Существуют две утилиты, позволяющие открыть общий доступ к файлам: btdownloadheadless.py (одиночный) и btlaunchmany.py (множественный). Я остановлюсь на первом варианте.
Командная строка в Debian будет выглядеть так:

$ btdownloadheadless [ option ... ] torrent

Параметр torrent может быть URL или путем к файлу. Нижеследующая команда загружает torrent-файл непосредственно с веб-сервера. --url указывает на существующий torrent, а --saveas — путь к существующему файлу, к которому я хочу дать доступ:

$ btdownloadheadless --url http://localhost/pg_live.1.3.3-SRA.iso.torrent --saveas ./pg_live.1.3.3-SRA.iso

Теперь клиент подключается к трэкеру, информируя его о том, что он готов предоставить доступ к pg_live.1.3.3-SRA.iso.

Ниже приведен еще один способ. В данном случае файл находится на машине клиента:

$ btdownloadheadless --saveas ./pg_live.1.3.3-SRA.iso pg_live.1.3.3-SRA.iso.torrent

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

saving: pg_live.1.3.3-SRAA.iso (382.6 MB)
percent done: 100
time left: Download Succeeded!
download to: /home/robert/tmp/pg_live.1.3.3-SRAA.iso
upload rate: 0.00 kB/s
upload total: 0.0 MiB

оптимизация BitTorrent

BitTorrent обладает потрясающей гибкостью. Вы можете контролировать потребление upload- и download-пропускной способности, номера портов, количество подключающихся клиентов, и частоту обновления сведений о torrent’ах, доступных трэкеру. Вы даже можете настроить систему таким образом, чтобы она пускала клиентов, находящихся за файрволлами.
Теперь рассмотрим различные полезные хитрости BitTorrent.

статистика от трэкера

Получить статистику с моего трэкера очень просто. Достаточно направить браузер на порт трэкера http://localhost:8099 и получить в результате HTML-страницу вроде этой:

BitTorrent download info

* tracker version: 3.4.2
* server time: 2005-03-29 13:50 UTC

info hash complete downloading downloaded
4e98ea442573f5b8868537e970fd3ce6321e9e81 1 0 0
0 files 1/1 0/0 0/0

* info hash: SHA1 hash of the "info" section of the metainfo (*.torrent)
* complete: number of connected clients with the complete file
(total: unique IPs/total connections)
* downloading: number of connected clients still downloading
(total: unique IPs/total connections)
* downloaded: reported complete downloads (total: current/all)
* transferred: torrent size * total downloaded
(does not include partial transfers)

использование трэкеров других пользователей

Разумеется, вы можете использвать трэкеры других пользователей. Вы можете предоставить общий доступ к файлу даже если у вас нет своего веб- сервера или трэкера. Предположим, что я хочу использовать трэкер postgresql.org: все, что мне нужно — это скачать один из их последних torrent- ов и прочитать несколько первых строк, для того чтобы определить URL:

$ wget http://bt.postgresql.org/postgresql-8.0.1.zip.torrent
$ cat bt.postgresql.org:6969 | less

В данном случае URL оказался http//bt.postgresql.org:6969/announce. Я могу заново анонсировать трэкер для моего существующего torrent’а с помощью утилиты btreannounce. Основной формат выглядит так:

btreannounce url torrent [ torrent ... ].

Трэкер можно выбрать для torrent’а так:

$ btreannounce http://bt.postgresql.org:6969/announce \pg_live.1.3.3-SRAA.iso.torrent

Теперь трэкер postgresql.org будет обслуживать все соединения с pg_live ISO.
Правилом хорошего тона будет сначала получить разрешение на использование чужого трэкера. Вы можете заблокировать ваш трэкер для использования посторонними, указав ему работать с только с файлами, копии которых лежат в определенных директориях. Например, если я положу копию torrent- файла pg_live в директорию, доступную трэкеру, я ограничу его работой только с pg_live. Для этой цели есть ключи --show_names и --allowed_dir:

$ bttrack --port 8099 --show_names 1 --allowed_dir ~/mytorrents --dfile downloadinfo.txt

заключение

В данной статье я показал лишь самую малую часть из того, что умеет BitTorrent. Попробуйте поработать с ним сами, поменять разные настройки и вы удивитесь, сколько всего сможете сделать. Я советую почитать man-страницы для утилит apt-get, wget, cat, btmakemetafile, bttrack, bittorrent- downloader, и btreannounce.
Have fun.



Роберт Бернье, перевод Дмитрия Герусса.
обсуждение статьи


Сетевые решения. Статья была опубликована в номере 09 за 2005 год в рубрике технологии

©1999-2024 Сетевые решения