Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Gnutella2, часто называемый G2, — это одноранговый протокол, разработанный преимущественно Майклом Стоуксом и выпущенный в 2002 году. Хотя G2 и вдохновлен протоколом Gnutella, он мало чем схож с ним в плане архитектуры, за исключением процедуры установления соединения и механики загрузки. G2 использует расширяемый бинарный формат пакетов и совершенно новый алгоритм поиска. Более того, G2 имеет связанную (но существенно отличающуюся) топологию сети и усовершенствованную систему метаданных, которая эффективно снижает количество ложных файлов, таких как вирусы, в сети.
Gnutella2, often referred to as G2, is a peer to peer protocol developed mainly by Michael Stokes and released in 2002. While inspired by the gnutella protocol, G2 shares little of its design with the exception of its connection handshake and download mechanics. G2 adopts an extensible binary packet format and an entirely new search algorithm. Furthermore, G2 has a related (but significantly different) network topology and an improved metadata system, which helps effectively to reduce fake files, such as viruses, on the network.
История
В ноябре 2002 года Майкл Стоукс представил протокол Gnutella2 на Форуме разработчиков Gnutella. В то время как одни полагали, что заявленные цели Gnutella2 – это, прежде всего, полный отказ от протокола gnutella 0.6 и начало с чистого листа, чтобы некоторые менее отлаженные аспекты gnutella были реализованы более элегантно и в целом оказались более впечатляющими и привлекательными, другие разработчики, особенно из LimeWire и BearShare, сочли это "дешевой рекламной уловкой" и не придали значения техническим достоинствам. Некоторые до сих пор отказываются называть сеть "Gnutella2", предпочитая ей название "Протокол Майка" ("MP"). Протокол Gnutella2 по-прежнему использует старую строку рукопожатия "GNUTELLA CONNECT/0.6" для установления соединений.
In November 2002, Michael Stokes announced the Gnutella2 protocol to the Gnutella Developers Forum. While some thought the goals stated for Gnutella2 are primarily to make a clean break with the gnutella 0.6 protocol and start over, so that some of gnutella's less clean parts would be done more elegantly and, in general, be impressive and desirable; other developers, primarily those of LimeWire and BearShare, thought it to be a "cheap publicity stunt" and discounted technical merits. Some still refuse to refer to the network as "Gnutella2", and instead, refer to it as "Mike's Protocol" ("MP"). The Gnutella2 protocol still uses the old "GNUTELLA CONNECT/0.6" handshake string for its connections
Проект спецификаций был опубликован 26 марта 2003 года, за которым вскоре последовали более детальные спецификации. G2 не поддерживается многими "старыми" клиентами сети gnutella, однако многие клиенты Gnutella2 по-прежнему подключаются к gnutella. Многие сторонники Gnutella2 утверждают, что это связано с политическими мотивами, в то время как сторонники gnutella считают, что радикальные изменения не оправдывают затраты на масштабную переработку.
The draft specifications were released on March 26, 2003, and more detailed specifications soon followed. G2 is not supported by many of the "old" gnutella network clients, however, many Gnutella2 clients still also connect to gnutella. Many Gnutella2 proponents claim that this is because of political reasons, while gnutella supporters claim that the drastic changes don't have enough merit to outweigh the cost of deep rewrites.
Дизайн
Gnutella2 делит узлы на две группы: Листья и Хабы. Большинство Листьев поддерживают два соединения с Хабами, в то время как Хабы принимают сотни соединений от Листьев и в среднем 7 соединений с другими Хабами. Когда инициируется поиск, узел получает список Хабов, если это необходимо, и связывается с Хабами из этого списка, отмечая, какие из них были проверены, пока список не будет исчерпан или не будет достигнут заданный лимит поиска. Это позволяет пользователю легко находить популярные файлы, не перегружая сеть, и, теоретически, сохраняет возможность найти единственный файл, расположенный в любой точке сети. Хабы индексируют файлы, которыми обладают Листья, с помощью таблицы маршрутизации запросов, которая заполнена однобитовыми записями хешей ключевых слов, которые Листья загружают на Хаб. Хаб затем объединяет эти хеш-таблицы со всеми, которые прислали его Листья, чтобы создать версию для отправки соседним Хабам. Это позволяет Хабам значительно снизить потребление полосы пропускания, просто не перенаправляя запросы Листьям и соседним Хабам, если соответствующие записи не найдены в таблицах маршрутизации. Gnutella2 в значительной степени использует UDP вместо TCP для поиска. Накладные расходы на установку TCP-соединения сделали бы невозможной систему поиска с произвольным обходом, требующую установления контакта с большим количеством узлов для передачи небольших объемов данных. Однако UDP не лишено недостатков. Поскольку UDP не является соединением, нет стандартного способа уведомить отправителя о получении сообщения, и, следовательно, потеря пакета останется незамеченной. Поэтому UDP-пакеты в Gnutella2 имеют флаг для включения режима надежности. При получении UDP-пакета с включенным флагом надежности клиент отправляет подтверждающий пакет отправителю, чтобы сообщить о доставке пакета в пункт назначения. Если подтверждающий пакет не получен, надежный пакет будет повторно отправлен для обеспечения доставки. Пакеты с низким приоритетом, не имеющие этого флага, не требуют подтверждения, что снижает надежность, но также уменьшает накладные расходы, поскольку не требуется отправлять и ждать подтверждения.
Gnutella2 divides nodes into two groups: Leaves and Hubs. Most Leaves maintain two connections to Hubs, while Hubs accept hundreds of Leaf connections, and an average of 7 connections to other Hubs. When a search is initiated, the node obtains a list of Hubs, if needed, and contacts the Hubs in the list, noting which have been searched, until the list is exhausted or a predefined search limit has been reached. This allows a user to find a popular file easily without loading the network, while, theoretically, maintaining the ability for a user to find a single file located anywhere on the network. Hubs index what files a Leaf has by means of a Query Routing Table, which is filled with single bit entries of hashes of keywords, which the Leaf uploads to the Hub, and which the Hub then combines with all the hash tables its Leaves have sent, it in order to create a version to send to their neighboring Hubs. This allows for Hubs to reduce bandwidth greatly by simply not forwarding queries to Leaves and neighboring Hubs, if the entries which match the search are not found in the routing tables. Gnutella2 relies extensively on UDP, rather than TCP, for searches. The overhead of setting up a TCP connection would make a random walk search system, requiring the contacting of large numbers of nodes with small volumes of data, unworkable. However, UDP is not without its own drawbacks. Because UDP is connectionless, there is no standard method to inform the sending client that a message was received, and so if the packet is lost, there is no way to know. Because of this, UDP packets in Gnutella2 have a flag to enable a reliability setting. When an UDP packet with enabled reliability flag is received, the client will respond with an acknowledge packet to inform the sending client that their packet arrived at its destination. If the acknowledge packet is not sent, the reliable packet will be retransmitted in an attempt to ensure delivery. Low importance packets, which do not have the flag enabled, do not require an acknowledge packet, reducing reliability, but also reducing overhead, as no acknowledge packet needs to be sent and waited upon.
Особенности протокола
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 в результаты поиска.
Gnutella2 has an extensible binary packet format, comparable to an XML document tree, which was conceived as an answer for some of gnutella's less elegant parts. The packet format was designed so that future network improvements and individual vendor features could be added without worry of causing bugs in other clients on the network. For the purpose file identification and secure integrity check of files it employs SHA 1 hashes. To allow for a file to be reliably downloaded in parallel from multiple sources, as well as to allow for the reliable uploading of parts while the file is still being downloaded (swarming), Tiger tree hashes are used. To create a more robust and complete system for searching, Gnutella2 also has a metadata system for more complete labeling, rating, and quality information to be given in the search results than would simply be gathered by the file names. Nodes can even share this information after they have deleted the file, allowing users to mark viruses and worms on the network, without requiring them to keep a copy. Gnutella2 also utilizes compression in its network connections to reduce the bandwidth used by the network. Further extensions include the "A" string in /Q2/I and the introduction of /QH2/H/ALT, /QH2/H/PART/MT, /QH2/HN, /QH2/BH and /QH2/G1 in the query hits.
Отличия от гнутеллы
В целом, две сети довольно похожи, основные различия между ними заключаются в формате пакетов и методе поиска.
Overall, the two networks are fairly similar, with the primary differences being in the packet format and the search methodology.
Протокол
Формат пакетов Gnutella критиковался за то, что изначально не был спроектирован с возможностью расширения, и с годами в него было внесено множество дополнений, что привело к перегруженности и неэффективности структуры пакетов. Gnutella2 учла этот опыт и, помимо включения многих функций, добавленных в стандарт Gnutella, была спроектирована с расчетом на будущую расширяемость с самого начала.
Gnutella's packet format has been criticized because it was not originally designed with extensibility in mind, and has had many additions over the years, leaving the packet structure cluttered and inefficient. Gnutella2 learned from this, and aside from having many of the added features of gnutella standard in Gnutella2, designed in future extensibility from the start.
Алгоритм поиска
В то время как Gnutella использует метод поиска путем рассылки запросов, Gnutella2 использует систему случайного обхода, где ищущий узел собирает список Hub’ов и связывается с ними напрямую, по одному. Однако, поскольку Hub’ы организуются в так называемые "кластеры Hub’ов", где каждый Hub дублирует информацию, хранящуюся у его соседей, узлу-листу возвращается информация всего кластера Hub’ов (обычно 7 Hub’ов). Это имеет ряд преимуществ по сравнению с системой рассылки запросов в Gnutella. Это более эффективно, поскольку продолжение поиска не приводит к экспоненциальному росту сетевого трафика, запросы не проходят через так много узлов, и повышается детализация поиска, позволяя клиенту прекратить поиск, как только будет достигнут заранее заданный порог результатов, что эффективнее, чем в Gnutella. Однако система обхода также увеличивает сложность сети и требования к её обслуживанию и управлению, а также требует мер защиты для предотвращения использования сети злоумышленниками для организации DDoS-атак.
While gnutella uses a query flooding method of searching, Gnutella2 uses a random walk system, where a searching node gathers a list of Hubs and contacts them directly, one at a time. However, as Hub organize themselves in, so called, "Hub clusters", where each Hub mirrors the information stored by its neighbors, the Leaf is returned the information of the entire Hub cluster (usually 7 Hubs). This has several advantages over the gnutella's query flooding system. It is more efficient, as continuing a search does not increase the network traffic exponentially, queries are not routed through as many nodes, and it increases the granularity of a search, allowing a client to stop, once a pre defined threshold of results has been obtained, more effectively than in gnutella. However, the walk system also increases the complexity of the network and the network maintenance and management required, as well as requiring safeguards to prevent a malicious attacker from using the network for denial of service attacks.
Терминология
Существует также разница в терминологии: более мощные узлы, используемые для сжатия сети, в Gnutella называются Ultrapeers, а в Gnutella2 – Hubs, при этом их применение в топологии несколько различается. В Gnutella Ultrapeers обычно поддерживают примерно столько же соединений с листьями, сколько и с другими узлами, в то время как Hubs в Gnutella2 поддерживают значительно больше соединений с листьями и меньше соединений между Hubs. Это связано с тем, что методы поиска в разных сетях требуют различных оптимальных топологий.
There is also a difference in terminology: while the more capable nodes, which are used to condense the network, are referred to as Ultrapeers in gnutella, they are called Hubs in Gnutella2, and they are also used slightly differently in topology. In gnutella, the Ultrapeers generally maintain as many leaves as peer connections, while Gnutella2 Hubs maintain far more leaves, and fewer peer (Hub to Hub) connections. The reason for this is that the search methods of the various networks have different optimum topologies.