P2P. Файлообменные сети: принципы работы, используемые протоколы, безопасность

Гуркин Ю.Н. (МФТИ), Семенов Ю.А. (ИТЭФ/МФТИ)


Впервые термин «peer-to-peer» была использована в 1984 году компанией IBM в разработке сетевой архитектуры для построения динамической маршрутизации через компьютерные сети с произвольной топологией – Advanced Peer to Peer Networking [1]..


Рис. 1. P2P сеть состоит из равноправных узлов. Каждый узел может взаимодейтсвовать с каждым

В основе технологии лежит принцип децентрализации, то есть все узлы в сети P2P – равноправны (рис 1). Этот принцип, обеспечил такие преимущества технологии P2P перед клиент-серверным подходом, как отказоустойчивость к потере связи с узлами сети, увеличение скорости копирования за счет копирования сразу из нескольких источников (рис. 2), возможность разделения ресурсов без привязки к конкретным IP-адресам, огромная мощность сети в целом и др.

Так, по некоторым данным, [5] в настоящее время в сети Internet более половины всего трафика приходится на трафик файлообменных P2P сетей, а размеры самых крупных из них перевалили отметку в миллион одновременно работающих узлов, разделяющих петабайты (1015 байт) информации. Общее количество зарегистрированных участников файлообменных сетей P2P во всем мире составляет порядка ста миллионов.

Хотя в первую очередь P2P-сети используются сейчас для разделения файлов, существует еще много других областей, [2] где данная технология также успешно применяется. Это телевидение и аудио трансляции, параллельное программирование, распределенное кэширование ресурсов для разгрузки серверов, рассылка уведомлений и статей, поддержка системы доменных имен, индексирование распределенных ресурсов и их поиск, резервное копирование и создание устойчивых распределенных хранилищ данных, обмен сообщениями, создание систем-серверов устойчивых к атакам типа «отказ в обслуживании», распространение программных модулей. Имеется огромное количество клиентских программ для работы с P2P-сетями, как коммерческих, так и с открытым кодом. Постоянно идет работа по усовершенствованию протоколов и увеличению функциональности систем, и судя по всему, недалек тот момент когда клиентское программное обеспечение для P2P будет интегрировано с операционными системами. Так, уже сейчас крупные компании проявляют интерес, или вплотную занимаются Р2Р, например, компания Sun разрабатывает протокол, поддерживающий доступ к основным P2P-сетям для карманных компьютеров и смартфонов, компания Microsoft создала реализацию протоколов P2P Scribe и Pastry.


Рис. 2.

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


В данной статье мы сделаем обзор наиболее распространенных из существующих P2P-систем, так называемых файлообменных сетей, рассмотрим принципы их работы, и протоколы. В конце статьи опишем основную отрицательную сторону P2P подхода, связанную с безопасностью


Определения

P2P-технология – технология построения сети распределенных равноправных узлов по принципу децентрализации. Идея P2P является альтернативой принципа – клиент-сервер.

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

P2P сеть – множество узлов (компьютеров, смартфонов и пр.), объединенных в единую систему и взаимодействующих посредством P2P протокола.

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

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

В модели стека сетевых протоколов TCP/IP протоколы P2P относятся к прикладному уровню, таким образом, P2P сеть является наложенной сетью (overlay), функционирующей поверх сети Интернет и использующей существующие транспортные протоколы TCP или UDP.

Клиентская программа P2P, или просто «клиент» – программа, которая реализует функциональность узла, сама является реализацией заложенного в основу сети P2P протокола. Клиент может запрашивать сервер или выделенные узлы, получать ответ с информацией о запрошенных файлах, узлах на которых они находятся, и далее уже работать напрямую с указанными узлами. В последних реализациях клиентов, заложена также возможность обмена служебной информацией, построения запросов и поиска ресурсов клиентом во всей сети без участия серверов.

ID узла – уникальный идентификатор узла, вычисляется с помощью хеш-функции [6] из IP – адреса и дополнительной информации (имени компьютера, MAC-адреса сетевой карты и пр.). Присваивается при регистрации в сети P2P и используется для идентификации узла.

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

Протоколами обеспечивается равномерное распределение ключей ресурсов вместе с идентификаторами узлов, опубликовавшими данный ресурс, по всем узлам (или по некоторым выделенным узлам и/или серверам), зарегистрированным в сети. Задача поиска (lookup) ресурса сводится к нахождению ID узла, на котором хранится ключ ресурса [4].


Рис. 3. Распределение ключей ресурсов по узлам сети. Поиск ресурса

На рис. 3 приведен пример чистой P2P сети, созданной по протоколу DHT Kademlia. На рисунке к сети, способной поддерживать максимум 16 узлов и 16 ресурсов, подсоединились 7 узлов (красные кружки) разделяющих 12 ресурсов (номера в белых прямоугольниках). Узлам присвоены соответствующие ID, ресурсам присвоены ключи. Ключи вместе с адресами опубликовавших их узлов (адреса на рисунке не показаны) равномерно распределены между узлами сети. На рисунке изображено, какие ключи хранятся и на каких узлах.

Узел с ID 0 хочет найти ресурс, соответствующий ключу 14, для этого посылает запрос на поиск. Запрос проходит определенный маршрут (подробнее о маршрутизации см. [3]) и достигает узла, на котором находится ключ 14. Далее узел ID 14 пересылает узлу ID 0, адреса всех узлов, обладающих ресурсом, соответствующим ключу 14.

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

Рассмотрим наиболее популярную область применения P2P - файлообменные сети.

Лидируют по количеству узлов среди файлообменных сетей такие сети как Bittorrent, eDonkey2000, Gnutella2+Gnutella.


BitTorrent

Для инициализации узла в сети Bittorrent [12] клиентская программа обращается к серверу (tracker), предоставляющему информацию о файлах доступных для копирования, а также статистическую и маршрутную информацию об узлах сети. Сервер и после инициализации помогает узлам взаимодействовать друг с другом, хотя в последних версиях клиентских программ, наличие сервера является необходимым только на стадии инициализации.

Если узел хочет опубликовать файл, то программа разделяет файл на части и создает файл метаданных (torrent file) с информацией о частях файла, местонахождении, и, опционально, местонахождении сервера, который будет поддерживать распространение этого файла. Первый узел, опубликовавший файл, называется распространителем (seedеr). Узел желающий скопировать файл, при копировании сам становится распространителем, по принципу «сколько копирую я, столько разрешаю скопировать у меня». Узлы, скопировавшие весь файл становятся распространителями для этого файла, и, вместе с неполностью скопировавшими узлами дают возможность другим узлам получать части файла из нескольких источников, что ускоряет копирование. (см рис.2 ).

В данной сети используются протоколы: Bittorrent, BitTorrent Azureus DHT. Они основаны на модифицированном протоколе Kademlia, и используются для децентрализованного поиска ресурса по ID и присваивания ресурсам комментариев и рейтинга.

BitTorrent Mainline DHT является также модификацией протокола Kademlia. Эта сеть используется для обеспечения работы с файлами метаданных, не привязанными к серверам.


Наиболее распространенные клиентские программы: Azureus, BitTorrent_client, µTorrent, BitSpirit, BitComet, BitTornado, MLDonkey


Gnutella, Gnutella2

Сеть Gnutella [13], одна из первых пиринговых сетей, создана в 2000 году. Сеть функционирует до сих пор, хотя из-за серьезных недостатков алгоритма пользователи сейчас предпочитают сеть Gnutella2 (G2, [14]).


Подключившийся клиент получает от узла, с которым ему удалось соединиться, список из 5 активных узлов, отсылает им запрос на поиск ресурса по ключевому слову. Узлы ищут у себя соответствующие запросу ресурсы и, если не находят, пересылают запрос своим активным узлам вверх по дереву, пока не найдется ресурс или не будет превышено максимальное число шагов. Такой поиск называется размножением запросов (query flooding). С помощью протокола также отслеживается, чтобы топология создаваемой сети узлов имела структуру графа типа дерева.


Понятно, что подобная реализация ведет к экспоненциальному росту числа запросов и, соответственно, на верхних уровнях может привести к отказу в обслуживании, что и наблюдалось на практике неоднократно. Разработчиками были проведены работы по улучшению алгоритма, введены правила, в соответствии с которыми запросы могут пересылать вверх (forwarding) по дереву только определенные узлы – так называемые выделенные узлы (ultrapeers), остальные узлы (leaves) могут лишь запрашивать выделенные узлы. Введена также система кеширующих узлов.

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

Недостатки протокола Gnutella инициировали разработки принципиально новых алгоритмов поиска маршрутов и ресурсов, и привели к созданию группы протоколов DHT (distributed hash tables) [7], в частности протокола Kademlia [3], который сейчас широко используется в наиболее крупных сетях.


Запросы в сети Gnutella пересылаются по tcp или udp, копирование файлов происходит посредством протокола http.

В последнее время появились расширения для клиентских программ, позволяющие копировать файлы по udp, делать xml-запросы метаинформации о файлах.

В 2003 году появился принципиально новый протокол Gnutella2 и первые клиенты его поддерживающие, которые были обратно совместимы с клиентами Gnutella. В соответствии с данным протоколом, некоторые узлы становятся концентраторами, остальные являются обычными узлами (leaves). Каждый обычный узел имеет соединение с одним-двумя концентраторами. У концентратора есть связь с сотнями обычных узлов и десятки соединений с другими концентраторами. Каждый узел периодически пересылает концентратору список идентификаторов ключевых слов, по которым могут быть найдены публикуемые данным узлом ресурсы. Идентификаторы сохраняются в общей таблице на концентраторе. Когда узел хочет найти ресурс – он посылает запрос по ключевому слову своему концентратору, который либо находит ресурс в своей таблице и возвращает ID-узла, обладающего ресурсом, либо возвращает список других концентраторов, которые узел вновь запрашивает по очереди, случайным образом. Такой поиск называется поиском с помощью метода блужданий (random walk).

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

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

Наиболее распространенные клиентские программы для Gnutella и Gnutella2: Shareaza, Kiwi, Alpha, Morpheus, Gnucleus, Adagio Pocket G2 (Windows Pocket PC), FileScope, iMesh, MLDonkey.

EDonkey2000

Сеть EDonkey2000 [10] появилась в 2000 году. Информация о наличии файлов публикуется клиентом на многочисленных серверах в виде ed2k ссылок, использующих уникальный ID ресурса. Серверное ПО доступно для установки любым пользователем. Сервер обеспечивает поиск узлов и информации. Сейчас в сети имеется от 100 до 200 серверов, обслуживающих одновременно около миллиона пользователей, использующих порядка миллиарда различных файлов. Общее количество зарегистрированных пользователей составляет порядка 10 миллионов.

Когда клиент копирует желаемый ресурс, он копирует его одновременно из нескольких источников при помощи MFTP (Multisource File Transfer Protocol).


В настоящее время информацию о доступных файлах можно получать не только с серверов eDonkey. С 2004 года в состав сети EDonkey2000 интегрирована сеть Overnet - полностью децентрализованная сеть, позволяющая осуществлять взаимодействие между узлами без привязки к серверам, для чего используется DHT протокол Kademlia.

Самой распространенной клиентской программой с закрытым кодом (Pro версия - платная) для этой сети является eDonkey, однако существует и клиент с открытым программным кодом - eMule, который, в добавление к сети eDonkey2000, реализует и использует еще одну сеть P2P – сеть Kad Network (Kademlia). Как видно из названия, сеть Kad Network также использует протокол Kademlia.

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

Такая интеграция возможностей разных сетей и дополнительная верификация способствовали развитию EDonkey2000, в которую начали переходить пользователи из других сетей, например из FastTreсk сети, базирующейся на протоколе FastTreсk, а наиболее популярным клиентом является Kazaa [16]).

Рассмотрим еще одну сеть - Direct Connect (DC) [15], поскольку в России это очень популярные файлообменные сети.

Дело в том, что провайдеры сетевых услуг, например, провайдеры Московских домашних сетей, а также администраторы компаний, до недавнего времени старались блокировать на своих файерволах порты, через которые общаются клиенты сетей Bittorrent, eDonkey2000, Gnutella, Fasttreck, а в тех случаях когда файервол не помогал – боролись административными методами. Преградой также являлась большая стоимость трафика и/или ограниченность полосы каналов.

Поэтому пользователям осталась только возможность использовать локальные пиринговые сети. Наиболее удобной для этого оказалась сеть Direct Connect.

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

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

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

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

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

Серьезной проблемой является распространение червей и подделка ID ресурсов для их фальсификации и распространения фальшивых ресурсов в сети.

Так, например, в клиенте Kazaa, используется хеш-функция UUHash которая позволяет быстро находить ID для больших файлов даже на слабых компьютерах, но и, при этом, оставляет возможность для подделки файлов и записи испорченного файла, имеющего тот же ID. Эта возможность была использована в борьбе с сетью Американской Ассоциацией Звукозаписывающих Компаний (RIAA), которая наводнила сеть поддельными и испорченными файлами.

Для решения проблемы клиентам нужно пользоваться надежными хешами (деревьями хешей, если файл копируется по частям) такими как SHA-1, Whirlpool, Tiger и только для малоответсвенных задач контрольными суммами CRC. Для уменьшения объемов пересылаемых данных и облегчения их шифрования можно использовать компрессию. Для защиты от вирусов нужно иметь возможность хранить идентифицирующую метаинформацию о червях, как это, например, сделано в Gnutella2.

Другой проблемой служит возможность подделки ID серверов и узлов. При отсутствии механизма проверки подлинности, пересылаемых служебных сообщений, например, с помощью сертификатов, существует возможность фальсификации сервера, или узла (многих узлов). Так как узлы обмениваются информацией, подделка некоторых узлов или серверов приведет к компрометации всей или части сети. Закрытое программное обеспечение клиентов и серверов, не является решением проблемы, так как есть возможность для реинжиниринга протоколов и программ (reverse engineering).

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

Часть клиентов только копируют чужие файлы, но не предлагают ничего для копирования другим (leechers).

Например, в московских домашних сетях на нескольких активистов, делающих доступными более 100 GB приходится около сотни выкладывающих менее 1 GB. Для борьбы с этим фактором используются разные методы. В eMule применен метод кредитов. Скопировал файл, кредит уменьшился, позволил скопировать свой файл, кредит увеличился, xMule – кредитная система с поощрением распространения редких файлов, eDonkey используется стимулирование размножения источников, в Bittorrent реализована схема “сколько блоков файла получил, столько отдал” и т.д..

Статья направлена в журнал "Телекоммуникационные сети и системы".


Ссылки

  1. IBM. http://www.javvin.com/protocol/rfc2353.pdf : APPN/HPR in IP Networks (APPN Implementers' Workshop Closed Pages Document).
  2. Liben-Nowell, Balakrishnan, Karger. Analysis of the evolution of peer-to-peer systems. Communications of the Acm February 2003/Vol. 46, No. 2
  3. Petar Maymounkov and David Mazi`eres. Kademlia: A Peer-to-peer Information System Based on the XOR Metric. http://kademlia.scs.cs.nyu.edu
  4. Hari Balakrishnan, M. FransKaashoek , David Karger, Robert Morris, and Ion Stoica. Looking up DATA in P2P systems. In Proc. Aacm SIGCOMM’01, San Diego, CA, Aug. 2001.
  5. Karger D., Lehman E., Leighton F., Levine M., Lewin D., Panigrahy R. Consistent hashing and random trees: Distributed caching protocols for relieving hot spots on the World Wide Web. In Proc. 29th Annual ACM Symposium on Theory of Computing (El Paso, TX, May 1997), pp. 654–663
  6. Hildrum K., Kubiatowicz J., Rao S., and Zhao B. Distributed Object Location in a Dynamic Network. In Proceedings of 14th ACM Symp. on Parallel Algorithms and Architectures (SPAA), August 2002.
  7. Marling Engle: Vulnerabilities of P2P Systems and a Critical look at Their Solutions, http://www.cs.kent.edu/~mengle/ Department of Computer Science, Kent State University, Date: April 2006
  8. Overnet: http://www.overnet.com;
  9. eDonkey2000: http://www.edonkey.com;
  10. Kademlia: http://www.emule-project.net;
  11. Bittorrent: www.bittorrent.com;
  12. Gnutella: www.gnutella.com;
  13. Gnutella2: www.gnutella2.com;
  14. Direct Connect: dcplusplus.sourceforge.net
  15. http://www.kazaa.com/us/index.htm