Какая технология знакома каждому, кто имел дело с компьютерами?

Или, даже, давайте пройдусь по грани и спрошу так: какая технология знакома каждому, кто играл в компьютерные игры?

Безусловно, BitTorrent.

Лично я, конечно, понятия не имею, почему тут были упомянуты компьютерные игры, ведь сам использую BitTorrent только для скачивания образа Ubuntu…

Но если говорить серьёзно, то давайте разберёмся с историей протокола BitTorrent, его начинкой, и проведём распаковку библиотеки torrent для Go.

История

Первая версия протокола была опубликована Брэмом Коэном второго июля 2001 года.
Спроектирован же протокол был двумя месяцами ранее, в апреле.

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

При этом пир – это участник раздачи; сид – это пир, который скачал весь файл; а лич – тот, кто ещё не скачал все кусочки. Вуаля, вы разобрались в терминологии BitTorrent. Давайте разберёмся теперь и с тем, как протокол устроен внутри.

Устройство протокола

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

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

Кстати, именно благодаря этому механизму и работает учёт отданного и скаченного на некоторых торрент-трекерах. Если они видят, что у вас низкий рейт отданного, то они попросту не будут делиться с вами адресами пиров, пока вы не восполните свой рейт. Хотя, тут стоит сделать оговорку, что этот механизм легко обмануть, поэтому в своё время люди ставили специальные патчи на торрент-клиенты, чтобы они подделывали статистику отданного. Но вернёмся к протоколу.

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

В этом случае поможет технология распределённой хеш-таблицы или distributed hash table, или просто DHT.

Это технология, когда не нужен централизованный трекер. Вместо этого торрент-клиент обращается к известному DHT узлу.

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

Единственный ли это способ найти раздающего? Вы удивитесь, но нет!

Конечно же, пиры со временем научились и сами обмениваться адресами других участников. Это расширение BitTorrent протокола получило название PEX или peer exchange.

А ещё есть расширение LPD – Local Peer Discovery, который позволяет находить участников раздачи в локальной сети и скачивать ещё быстрее. Короче, целая куча расширений, чтобы скачать образ убунты ☺️.

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

Минусы протокола

Казалось бы, мы получили протокол лишённый недостатков. Но не тут то было!

Основная проблема с торрентами заключается в том, что ваш IP адрес виден другим участникам роя.

Причём в случае с DHT проблема становится ещё острее, особенно если вы находитесь в стране, которая без суда может выписать вам штраф за использование торрентов. Попробуйте открыть сайт https://iknowwhatyoudownload.com.

Вы удивитесь, обнаружив там то, что вы совсем недавно скачивали. Или то что скачивали с вашего текущего IP адреса, если у вас он серый.

А уж как провайдер удивится, что там вовсе не только ubuntu!

Библиотека torrent

Героем этого выпуска стала даже не отдельная библиотека, а целый набор различных BitTorrent утилит, написанных на Go! В репозитории можно найти и торрент-клиент для скачивания, и утилиту для создания торрент файла, и даже утилиту для монтирования торрент файла, как отдельной файловой системы.

Там же реализация DHT протокола, Peer Exchange и других расширений BitTorrent. Не удивительно, что у библиотеки более четырёх с половиной тысяч звёздочек, и более трёх тысяч коммитов. Наверное, если я скажу, что коммит был час назад, то это будет актуально, когда бы вы не послушали/почитали этот выпуск.

И на этой торжественной ноте можно и завершить выпуск. Спасибо, что читали или слушали, и удачи вам!