С появлением онлайн-кинотеатров и стриминговых сервисов популярность торрент-клиентов пошла на спад, однако на момент публикации с помощью торрента файлы скачивают за день около четырех процентов всех пользователей Интернета (это более 100 миллионов человек). 

В данной статье я проведу небольшой обзор P2P (пиринговых) файлообменных протоколов, Napster, Gnutella и BitTorrent. В этой последовательности они появились, и каждый был вдохновлён предыдущим, взял от него лучшее и добавил своё. Каждый из этих протоколов в своё время был прорывом в обмене файлами. Первый открыл миру мощь P2P протоколов обмена данными, Gnutella стала протоколом первой действительно децентрализованной файлообменной сети, а BitTorrent на долгие годы закрепил за собой первенство пирингового обмена данными, и по настоящее время с некоторыми модификациями остаётся самым популярным P2P протоколом. Однако добавлю, что это далеко не единственные P2P протоколы обмена данными, и существуют не менее интересные eDonkey,Freenet, Direct Connect и подобные. Но обо всём по порядку.

P2P

Для начала необходимо пояснить, что является P2P файлообменным протоколом. Википедия подсказывает, что это протоколы для распространения и обмена информацией с помощью специальной программы для поиска других пользователей в сети, в которой все пользователи (пиры) являются равноправными участниками, в отличие от клиент-серверной модели обмена информацией. Для некоторых протоколов (гибридные P2P, например, Napster или BitTorrent) необходимо подключение к серверу, чтобы узнать информацию о файлах или о пользователях, у которых можно взять определённый файл. Сам же обмен данными производится между пользователями сети, в чём и заключается главная особенность P2P. Сегодня происходит расцвет криптовалют, наблюдается непрерывный рост как в стоимости криптовалют, так и в их количестве. Большая часть существующих криптовалют основывается на P2P протоколах подтверждения транзакций, который также были вдохновлены пиринговыми файлообменными сетями.

Napster

Структура Napster Источник: http://www2.imm.dtu.dk/courses/02220/2017/L6/P2P.pdf

Вот здесь хорошо описана история файлообмена. Я же детально остановлюсь на P2P протоколах, заслуживающих внимания. P2P сети были известны с начала 90-x(IRC, Hotline), но первым P2P протоколом, получившим широкую известность среди пользователей глобальной сети, был Napster. Тот самый,  который упоминается в “Ограблении по-итальянски” 2003 года, и сооснователем которого был Шон Паркер, сыгранный Джастином Тимберлейком в фильме Дэвида Финчера “Социальная сеть”. Можно представить, какой эффект произвело появление утилиты в 1999 году.  В основе Napster стояли центральные сервера (Index Server), у которых был список всех файлов и адреса клиентов (пиров), у которых их можно скачать. Пир подключался к серверу, посылал поисковый запрос, и получал в ответ адреса других пиров с запрашиваемым файлом. Затем через тот же сервер устанавливалось соединение между пирами и производился обмен файлами, поскольку напрямую соединение было установить проблематично из-за файрволов и NAT. Таким образом, у центральных серверов была информация обо всех пирах с IP, обо всех файлах и обо всех передачах между пирами. С точки зрения приватности, это очень удручающая ситуация. Однако на тот момент это был прорыв в области распространения аудио, хотя именно эта особенность и послужила причиной упадка Napster: поскольку существовал центральный сервер компании, правообладателям было легко подать на него в суд по причине пиратства и выиграть его. Тем не менее, Napster показал миру возможности P2P протоколов, и мы плавно подходим к более современным вариантам.

Gnutella

Особенность Napster в виде центрального сервера была устранена Джастином Франкелем и Томом Пеппером в начале 2000 года в их полностью децентрализованном протоколе P2P обмена данными Gnutella. Существует несколько спецификаций, обратимся к версии 0.6.

Структура Gnutella Источник: https://es.slideshare.net/uschmidt/peertopeer-systems/16-KaZaA_Created_in_March_2001
  • Сеть состоит из обычных пользователей (лист, англ. leaf) и ультрапиров (англ. ultrapeer), к которым подключены листья и другие ультрапиры. Причём из-за децентрализации каждый пользователь может объявить себя ультрапиром, если удовлетворяет требованиям по пропускной способности, конфигурации системы и отсутсвию файрвола. Однако этот статус должны подтвердить уже существующие ультрапиры.

  • Новый пользователь получает доступ к сети, подключившись к ультрапиру, который уже там находится. Адрес последнего пользователь может получить простыми ping сообщениями (о них далее), обратившись прописанному в программе списку, либо обновив его специальными запросами Gnutella Web Cashing посредством HTTP к волонтёрам, запустившим GWebCashes на своей машине.

  • Затем взаимодействие осуществляется с помощью Протокола маршрутизации запросов (англ. Query Routing Protocol, QRP). Пользователи обмениваются таблицей маршрутизации запросов (QRT). В них имена имеющихся у пользователей файлов для обмена обрезаются, чтобы исключить грамматические особенности слов и хэшируются SHA-1. Далее в таблицу(огромный массив) заносится булевая переменная, что данный файл с данным хэшом есть у пользователя, и таблица отправляется ближайшему ультрапиру, который агрегирует таблицы своих листьев и обменивается ей между ультрапирами.

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

  • Для обмена файлами создаётся прямое соединение между пользователями и происходит обмен посредством HTTP. Если кто-то расположен за файрволом или NAT, то соединение происходит посредством push proxy, где ультрапиры выступают в качестве прокси-сервера.

Нужно сказать, что протокол дорабатывается по настоящее время, и существует более продвинутая версия Gnutella2, которая сохранила идею децентрализации сети и разбиение на обычных и ультра пользователей, но имеет более проработанные алгоритмы их коммуникации, а также алгоритмы поддержания и управления сетью, защищающие от DDoS-атак. Тем не менее оригинальная Gnutella сохраняет лидирующие позиции по количеству пользователей, исчисляемом в миллионах.

BitTorrent

Мы подобрались к протоколу, о котором слышали, наверное, все пользователи Интернета и использовала большая их часть. BitTorrent был создан в 2001 году Брэмом Коэном на основе концепции Gnutella. Изначально он создавался для ускорения централизованных HTTP раздач, поскольку в концепции клиент-сервер при подключении многих клиентов к серверу, тот вынужден ограничивать исходящий трафик, значительно замедляя загрузку. Рассмотрим процесс передачи данных:

  • BitTorrent сеть состоит из веб-сервера, который хранит метаинформацию о файлах, BitTorrent tracker (далее просто трекер, он содержит информацию о пользователях, раздающих определенные файлы), оригинального дистрибьютора файла (пользователя или пира сети), и других пиров, запустивших торрент-клиент (программа, использующая протокол).Пиры взаимодействуют между собой по протоколу TCP, в дальнейшем заменённый на разработанный uTP. Примечательно, что пиры одновременно раздают и загружают имеющиеся файлы, что позволяет построить более эффективные обменные взаимодействия между пользователями, поскольку не произойдёт такого, что все пиры, имеющие файл, скачиваю что-либо и не имеют возможности раздавать.

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

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

Метаинформационный файл .torrent состоит из ссылки на трекер раздающих пользователей и словаря, хранящего данные о файлах на раздаче, а именно их размера, имени и хэш-суммах всех частей файла. Здесь стоит упомянуть, что по протоколу файлы делятся на небольшие части (около 5MB), которые передаются по отдельности, и не обязательно от одного дистрибьютора. Оригинальный протокол использует SHA-1, что стало камнем преткновения и предпосылкой для дальнейшей модификации протокола.

  • Все сообщения между пирами начинаются со специального идентификатора, который принимает следующие значения:

    • 0 – choke

    • 1 – unchoke

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

    • 2– interested

    • 3 – not interested

      Эти сообщения передаются раздающей стороне с уведомлением о желании или нежелании принимать запрашиваемую информацию

    • 4 – have

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

    • 5 – bitfield

      Посылается первым сообщением в соединении и уведомляет, что в сообщении содержится булевая строка с 1 в позиции части файла, которую уже получила запрашиваемая сторона.

    • 6 – request

      Сообщение request содержит индекс запрашиваемой части файла, и его длину.

    • 7 – piece

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

    • 8 – cancel

      Такое сообщение используется в конце раздачи, когда остаются всего несколько частей (“endgame mode”). В этом режиме принимающая сторона запрашивает все оставшиеся части у всех возможных пиров, поскольку последние части обычно загружаются с единственного пира и это занимает много времени. В таком случае при загрузке каждой части принимающая сторона посылает cancel-сообщение с информацией об этой части, уведомляя о том, что данная часть уже получена.

  • Пир, получивший .torrent-файл и желающий загрузить соответствующие данные находит в метаинформации ссылку на трекер, и запрашивают у него информацию о раздающих (сидах, англ. seed).

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

    После получения части, пир сравнивает её хэш-сумму с имеющейся в метафайле и подтверждает получение, либо запрашивает часть ещё раз.

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

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

Однако анонимность протокола всё ещё осталась под вопросом, как и надёжность хэш-функции SHA-1. Поэтому в 2005 году появилась модификация протокола, BitTorrent protocol encryption. Она использует шифр RC4(выбор пал из-за скорости шифрования) для шифрования заголовков сообщений и передаваемых частей. А в новой версии протокола (BitTorrent v2) также изменили хэш-функцию на SHA-256 для более надежного хэширования файлов, хотя она также на сегодняшний день считается уязвимой. Протокол BitTorrent всё ещё находится в разработке, а вторую версию пока поддерживают очень немногие клиенты, как и в случае с Gnutella.

Законодательные вопросы

Использование протоколов P2P, в частности BitTorrent, для обмена файлами, защищёнными авторским правом, породило множество юридических и законодательных вопросов. Всё зависит от государств и юрисдикций, в которых находятся пользователи. Потенциально, использование протоколов может повлечь юридическую ответственность как для первоначального дистрибьютора файла, так и для скачавших его пользователей в качестве соучастников. 

Так, например, в Финляндии системным администраторам и владельцам торрент-сайта(трекера) были присуждены огромные штрафы в сотни тысяч евро за нарушение авторского права. 

А один из старейших трекеров The Pirate Bay, расположенный в Швеции, в 2006 г. был подвергнут обыскам, и четыре сооснователя были приговорены к тюремному заключению и штрафам (двое в итоге действительно сидели в тюрьме). Однако уже через 72 часа после обысков и ареста сайт снова начал функционировать, сопровождаемый негативной реакцией прессы и общественности на действия правительства.

В 2005 году автор протокола BitTorrent Брэм Коэн, тогда уже CEO BitTorrent, Inc, которая занималась развитием протокола и разработкой новых приложений P2P сетей до покупки криптовалютным стартапом TRON, заключил соглашение с Американской ассоциацией кинокомпаний об удалении ссылок на авторский контент с официального сайта BitTorrent. 

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

В России с недавнего времени начались попытки блокировать функциональность протокола вкупе с протоколами VPN по требованиям Роскомнадзора.

Заключение

Спасибо за внимание! Мы обсудили несколько значимых P2P протоколов обмена данных в хронологическом порядке, и их юридическое положение в разных странах. Надеюсь, вам понравился обзор. Ещё раз скажу, что данный обзор не претендует на полноту, я лишь прошелся по заметным вехам в истории данных протоколов. Данная статья ожидает своего продолжения, а я рекомендую посмотреть eDonkey, Freenet, и другие протоколы.

Литература

https://www.cse.iitd.ernet.in/~srsarangi/courses/2020/col_819_2020/docs/napster-gnutella.pdf

https://en.wikibooks.org/wiki/The_World_of_Peer-to-Peer_(P2P)/Networks_and_Protocols/BitTorrent

http://bittorrent.org/beps/bep_0003.html

https://en.wikipedia.org/wiki/BitTorrent