Введение

Gnutella2, часто называемый G2, — это одноранговый протокол, разработанный преимущественно Майклом Стоуксом и выпущенный в 2002 году. Хотя G2 и вдохновлен протоколом Gnutella, он мало чем схож с ним в плане архитектуры, за исключением процедуры установления соединения и механики загрузки. G2 использует расширяемый бинарный формат пакетов и совершенно новый алгоритм поиска. Более того, G2 имеет связанную (но существенно отличающуюся) топологию сети и усовершенствованную систему метаданных, которая эффективно снижает количество ложных файлов, таких как вирусы, в сети.

История

В ноябре 2002 года Майкл Стоукс представил протокол Gnutella2 на Форуме разработчиков Gnutella. В то время как одни полагали, что заявленные цели Gnutella2 – это, прежде всего, полный отказ от протокола gnutella 0.6 и начало с чистого листа, чтобы некоторые менее отлаженные аспекты gnutella были реализованы более элегантно и в целом оказались более впечатляющими и привлекательными, другие разработчики, особенно из LimeWire и BearShare, сочли это "дешевой рекламной уловкой" и не придали значения техническим достоинствам. Некоторые до сих пор отказываются называть сеть "Gnutella2", предпочитая ей название "Протокол Майка" ("MP"). Протокол Gnutella2 по-прежнему использует старую строку рукопожатия "GNUTELLA CONNECT/0.6" для установления соединений.

Проект спецификаций был опубликован 26 марта 2003 года, за которым вскоре последовали более детальные спецификации. G2 не поддерживается многими "старыми" клиентами сети gnutella, однако многие клиенты Gnutella2 по-прежнему подключаются к gnutella. Многие сторонники Gnutella2 утверждают, что это связано с политическими мотивами, в то время как сторонники gnutella считают, что радикальные изменения не оправдывают затраты на масштабную переработку.

Дизайн

Gnutella2 делит узлы на две группы: Листья и Хабы. Большинство Листьев поддерживают два соединения с Хабами, в то время как Хабы принимают сотни соединений от Листьев и в среднем 7 соединений с другими Хабами. Когда инициируется поиск, узел получает список Хабов, если это необходимо, и связывается с Хабами из этого списка, отмечая, какие из них были проверены, пока список не будет исчерпан или не будет достигнут заданный лимит поиска. Это позволяет пользователю легко находить популярные файлы, не перегружая сеть, и, теоретически, сохраняет возможность найти единственный файл, расположенный в любой точке сети. Хабы индексируют файлы, которыми обладают Листья, с помощью таблицы маршрутизации запросов, которая заполнена однобитовыми записями хешей ключевых слов, которые Листья загружают на Хаб. Хаб затем объединяет эти хеш-таблицы со всеми, которые прислали его Листья, чтобы создать версию для отправки соседним Хабам. Это позволяет Хабам значительно снизить потребление полосы пропускания, просто не перенаправляя запросы Листьям и соседним Хабам, если соответствующие записи не найдены в таблицах маршрутизации. Gnutella2 в значительной степени использует UDP вместо TCP для поиска. Накладные расходы на установку TCP-соединения сделали бы невозможной систему поиска с произвольным обходом, требующую установления контакта с большим количеством узлов для передачи небольших объемов данных. Однако UDP не лишено недостатков. Поскольку UDP не является соединением, нет стандартного способа уведомить отправителя о получении сообщения, и, следовательно, потеря пакета останется незамеченной. Поэтому UDP-пакеты в Gnutella2 имеют флаг для включения режима надежности. При получении UDP-пакета с включенным флагом надежности клиент отправляет подтверждающий пакет отправителю, чтобы сообщить о доставке пакета в пункт назначения. Если подтверждающий пакет не получен, надежный пакет будет повторно отправлен для обеспечения доставки. Пакеты с низким приоритетом, не имеющие этого флага, не требуют подтверждения, что снижает надежность, но также уменьшает накладные расходы, поскольку не требуется отправлять и ждать подтверждения.

Особенности протокола

Gnutella2 имеет расширяемый двоичный формат пакетов, сопоставимый с деревом XML-документов, разработанный как решение некоторых не самых изящных аспектов Gnutella. Формат пакетов был спроектирован таким образом, чтобы будущие улучшения сети и индивидуальные функции разработчиков могли быть добавлены без риска возникновения ошибок в других клиентах сети. Для идентификации файлов и обеспечения их целостности используются SHA-1 хеши. Для надежной параллельной загрузки файла из нескольких источников, а также для надежной загрузки его частей в процессе скачивания (swarm), применяются хеши Tiger tree. Для создания более надежной и полной системы поиска Gnutella2 также использует систему метаданных, позволяющую более полно описывать, оценивать и указывать качество информации в результатах поиска, чем это возможно только по именам файлов. Узлы могут обмениваться этой информацией даже после удаления файла, позволяя пользователям отмечать вирусы и черви в сети, не храня при этом копию файла. Gnutella2 также использует сжатие в сетевых соединениях для снижения потребляемой пропускной способности. Дальнейшие расширения включают строку "A" в /Q2/I и внедрение /QH2/H/ALT, /QH2/H/PART/MT, /QH2/HN, /QH2/BH и /QH2/G1 в результаты поиска.

Отличия от гнутеллы

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

Протокол

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

Алгоритм поиска

В то время как Gnutella использует метод поиска путем рассылки запросов, Gnutella2 использует систему случайного обхода, где ищущий узел собирает список Hub’ов и связывается с ними напрямую, по одному. Однако, поскольку Hub’ы организуются в так называемые "кластеры Hub’ов", где каждый Hub дублирует информацию, хранящуюся у его соседей, узлу-листу возвращается информация всего кластера Hub’ов (обычно 7 Hub’ов). Это имеет ряд преимуществ по сравнению с системой рассылки запросов в Gnutella. Это более эффективно, поскольку продолжение поиска не приводит к экспоненциальному росту сетевого трафика, запросы не проходят через так много узлов, и повышается детализация поиска, позволяя клиенту прекратить поиск, как только будет достигнут заранее заданный порог результатов, что эффективнее, чем в Gnutella. Однако система обхода также увеличивает сложность сети и требования к её обслуживанию и управлению, а также требует мер защиты для предотвращения использования сети злоумышленниками для организации DDoS-атак.

Терминология

Существует также разница в терминологии: более мощные узлы, используемые для сжатия сети, в Gnutella называются Ultrapeers, а в Gnutella2 – Hubs, при этом их применение в топологии несколько различается. В Gnutella Ultrapeers обычно поддерживают примерно столько же соединений с листьями, сколько и с другими узлами, в то время как Hubs в Gnutella2 поддерживают значительно больше соединений с листьями и меньше соединений между Hubs. Это связано с тем, что методы поиска в разных сетях требуют различных оптимальных топологий.