Задача – передать файлы через интернет напрямую от компьютера A к B без посредников. Сразу оговорюсь, чтобы такое было возможно, нужно чтобы хотя бы одна из сторон была видна напрямую по IP (т.е. иметь реальный IP или A и B в пределах одной подсети).
BitTorrent протокол позволяет скачивать/раздавать файлы между многими равноправными клиентами прямой передачей кусочков от одного к другому. Если кто-то скачал фрагмент он тут-же может его раздавать другому. Сила этого механизма в том, что данные не хранятся на сервере, однако третья сторона все-же имеется. Вот шаги которые нужны чтобы отдать файл от A к B:
- A создает файл (торрент) в котором хранится список раздаваемых файлов и их хэш сумма, а также адрес tracker-а
- Tracker – это сервер помогающий находить клиентам друг друга, он получает от A торрент и запоминает его
- A передает торрент к B
- B стартует торрент, программа обращается к tracker, тот по торренту выдает адрес A
- A и B связываются и B качает файл
Как только B инициирует скачивание, tracker запоминает адрес B и потом, когда появится третий клиент C, то он уже от tracker получит связь с A и B, качать C будет сразу с двух мест, A и B соответственно тоже это дело подхватят в другом направлении. Таким образом все кому надо связываются и происходит процесс передачи фрагментов в разные стороны. Роль tracker лишь в том, чтобы A и B могли найти друг друга. Как оказалось это звено можно исключить. Вот все шаги на примере самого популярного клиента uTorrent:
- A и B ставят себе uTorrent (300 kb)
- A выполняет команду “File/Create New Torrent”, указав файл или папку которую будем передавать, поле с tracker-ами оставляем пустым
- A стартует торрент (Add torrent), он его раздает (стартовать можно на предыдущем шаге, если поставить соответствующую галочку)
- A пересылает торрент к B
- B стартует торрент (Add torrent)
- Если B видит A по IP, то в закладке Peers для этого торрента выполняем “Add peer” и указываем IP_A:port_A, порт берем из настроек utorrent на A
- Если A видит B по IP, то аналогично можно поступить с его стороны (IP_B:port_B), но достаточно это сделать хотя бы с одной стороны
- Процесс передачи пошел…
Плюсы:
- Передача идет кусочками и устойчива к сбоям и разрывам.
- Можно передавать и принимать одновременно много файлов.
- Если задействовано более двух сторон, то если торренты обнаружатся у нескольких клиентов, то закачка будет идти параллельно со всех клиентов (в таком случае надо добавлять через “Add peer” всех кого видит данный клиент напрямую).
- uTorrent (как и другие аналогичные программы) может легко регулировать скорость отдачи/скачивания, индивидуально для торрентов и глобально.
- uTorrent чрезвычайно надежная программа и риск взлома компьютера может даже ниже чем при использовании ftp.
Минусы:
- Требуется добавлять peers вручную, причем когда добавляется peer, то на той стороне должен быть уже запущен данный торрент.
Минус можно частично обойти двумя способами. Первый, наверное более удобный – можно активировать встроенный в uTorrent tracker (Advanced –> bt.enable_tracker). Этот tracker доступен по адресу http://ip:port/announce. Нужно указывать этот tracker при создании торрентов, он конечно должен быть виден всем участникам передачи файлов. Второй способ – протокол DHT (распределенная хэш таблица). Этот протокол встроен в uTorrent и другие клиенты и позволяет искать peers по хэшу перескакивая по узлам DHT сети без участия tracker-а. Т.е. если B уже имеет связь с A, то она подцепится другим торрентом и так далее. Получается, что при запуске второго и последующих торрентов можно не добавлять peers (это я точно не проверял, но вроде должно работать).