Свежий номер №19 (444) / Peer-2-peer на весь мир? Дата публикации: 21.05.2002
Андрей Драница,
Andrey.Dranitsa@mstu.edu.ru
Gnutella - отличный пример того, как работает чистая P2P-сеть.
- Пользователь загружает программу.
- При первом запуске программы (назовем наш узел - A), пользователь сообщает клиенту IP-адрес одного из функционирующих узлов (условно узел B). Данная процедура может и не повторяться в будущем, но при первом запуске она обязательна. Это один из самых «скользких» моментов в реализации данной сети: без адреса хотя бы одного из работающих в данный момент узла пользователь не сможет подключиться. В принципе, существует целый ряд централизованных серверов, предоставляющих подобную информацию (connect1.gnutellanet.com:6346, gnutella. hostscache.com и др.), но такая схема уже приводит к некой централизованности, а значит, и уязвимости 1.
- Программа посылает запрос узлу B на предмет подтверждения активности.
- Узел В подтверждает свою активность, если нет - см. шаг 2.
- Узел А посылает узлу В так называемый Ping-запрос. Помимо прочей информации, в нем указывается TTL (Time To Live) - число, означающее, сколько переходов от узла к узлу может совершить запрос. Обычно TTL равняется 7.
- Другие узлы, получив Ping-запрос, посылают Pong-ответ, в котором содержится IP-адрес отправителя, номер порта и минимальная информация о файлах в фонде обмена.
- Кроме того, узлы, получившие Ping-запрос, уменьшают его TTL на единицу, и если TTL больше нуля, а также если они не получали запрос ранее (защита от зацикливания), рассылают его своим соседям.
- Каждый узел, получивший Ping-запрос, отсылает Pong-ответ тем же путем, которым запрос получен.
- Когда Pong-ответы доходят до своего источника (то есть узла А), программа составляет список всех доступных в этот момент узлов. Как правило, он насчитывает от 2 до 10 тысяч узлов и от 500 тысяч до миллиона файлов в обменном фонде.
- Пользователь вводит запрос (например, название mp3-файла). Программа рассылает запрос на поиск файла всем узлам в списке и ждет входящих сообщений.
- Каждый узел, получивший запрос на поиск, ищет в своем фонде указанный файл. Если файл не найден, то узел не отвечает.
- Если файл найден, узел отсылает инициатору запроса ответ с информацией о файле и о себе (IP-адрес).
- Получив ряд ответов, программа выбирает один из узлов, устанавливает с ним HTTP-соединение и загружает файл. При этом все сообщения (от Ping-запроса до скачивания файла) посылаются по HTTP, что затрудняет их отслеживание и блокировку.
Некоторые клиенты Gnutella работают в соответствии с приведенным алгоритмом, а некоторые нет. Связано это с тем, что Gnutella - прежде всего протокол взаимодействия узлов (такой же, как HTTP, например), и в нем не определены некоторые из аспектов этого взаимодействия. К тому же первые версии Gnutella-совместимых программ создавались при отсутствии спецификаций - на основании обратного инжиниринга первой версии. Именно по этой причине некоторые программы несовместимы между собой, хотя их базовые возможности совпадают практически всегда.
1 (обратно к тексту) - Безусловно, закрыв доступ к серверам, кэширующим адреса активных клиентов, можно парализовать часть пользователей, но большинство современных программ оснащены средствами, позволяющими сохранить списки узлов, полученных на этапе 9, и в дальнейшем использовать их для повторного входа в сеть. При этом могут применяться весьма изощренные механизмы, например, ранжирование узлов по времени отклика, объему файлов в их фонде или времени активности.
|