✅✅✅
О протоколах для децентрализованных сетей.
Децентрализованная файлообменная сеть 3-го поколения Gnutella
⬇️⬇️⬇️
Эта сеть прямой потомок
Napster. Отличается принципиальным отсутствием центрального сервера.
Gnutella — одна из первых пиринговых сетей, создана в 2000 г. Она функционирует до сих пор, хотя из-за серьезных недостатков алгоритма пользователи в настоящее время предпочитают сеть Gnutella2.
America-on-Line началa создавать сеть Gnutella с корыстными целями. Собрали лучших сетевых программистов из подразделения Nullsoft, которые и придумали эту сеть. 14 марта 2000 г. появилась программа размером 104 килобайта, которая давала возможность пользователю искать и обмениваться всеми видами файлов с другими владельцами Gnutella без всяких серверов. Но так получилось, что AOL объединилась со звукозаписывающей компанией и поняла, что напокастила сама себе. Сеть попытались закрыть, но все то, что децентрализованно, увы, сложно уничтожить.
Первая версия программы давала возможность пользователю искать и обмениваться всеми видами файлов с другими владельцами Gnutella без участия каких-либо серверов.
🌴🌴🌴
Принцип работы:
Пользователь загружает программу. При первом запуске программы (Узел — A), пользователь сообщает клиенту IP-адрес одного из функционирующих узлов (узел B). Это один из самых «скользких» моментов в реализации данной сети: без адреса хотя бы одного из работающих в данный момент узла пользователь не сможет подключиться. Хотя, существует целый ряд централизованных серверов, предоставляющих подобную информацию (
connect1.gnutellanet.com:6346,
gnutella.hostscache.com и др.), но такая схема уже приводит к централизованности. Программа посылает запрос узлу B на предмет подтверждения активности.
Узел В подтверждает свою активность.
Узел А посылает узлу В так называемый Ping-запрос. В этом запросе указывается, помимо прочей информации, TTL (Time To Live) — число, означающее, сколько переходов от узла к узлу данный запрос может совершить. Обычно TTL равняется 7. Другие узлы, получив Ping-запрос, посылают Pong-ответ, в котором содержится IP-адрес отправителя, номер порта и минимальная информация о файлах в фонде обмена.
Кроме того, узлы, получившие Ping-запрос, уменьшают TTL данного запроса на единицу, и если TTL больше 0, а также если данный запрос они не получали ранее (защита от зацикливания), рассылают его своим соседям.
Каждый узел, получивший Ping-запрос, отсылает Pong-ответ, тем же путем, которым этот запрос получил.
Когда Pong-ответы доходят до своего источника (то есть нашего узла А), программа составляет список доступных узлов. Как правило, этот список насчитывает от 2 до 10 тысяч узлов и от 500 тысяч до миллиона файлов в обменном фонде.
Пользователь вводит запрос (например, название mp3-файла). Программа рассылает запрос на поиск файла всем узлам в списке, а далее просто ждет входящих сообщений.
Каждый узел, получивший запрос на поиск, ищет в своем фонде указанный файл. Если файл не найден, то узел просто не отвечает.
Если файл найден, узел отсылает инициатору запроса ответ с информацией о файле и о себе (IP-адрес).
Получив ряд ответов, программа выбирает один из узлов, устанавливает с ним стандартное HTTP-соединение и загружает файл. При этом все сообщения (от Ping-запроса до скачивания файла) посылаются по HTTP, что затрудняет их отслеживание и блокировку.
Важно понимать, что Gnutella — это прежде всего протокол взаимодействия узлов (такой же как HTTP например), а сеть формируется когда один пользователь Gnutella соединяется с другим пользователем, после этого они могут начать обмен информацией.
Недостатки протокола Gnutella инициировали разработку принципиально новых алгоритмов поиска маршрутов и ресурсов и привели к созданию группы протоколов
DHT (Distributed Hash Tables) — в частности, протокола Kademlia, который сейчас широко используется в наиболее крупных сетях.