Gnutella Protocol Development
Home :: Developer :: Press :: Research :: Servents
Source - Some parts of this section are taken from the latest draft. 1.1 Background Gnutella is a protocol for distributed search and digital distribution. Although the Gnutella protocol supports a traditional client/centralized server search paradigm, Gnutellas distinction is its peer-to-peer, decentralized model. In this model, every client is a server, and vice versa. These so-called Gnutella servents perform tasks normally associated with both clients and servers. They provide client-side interfaces through which users can issue queries and view search results, while at the same time they also accept queries from other servents, check for matches against their local data set, and respond with applicable results. Due to its distributed nature, a network of servents that implements the Gnutella protocol is highly fault-tolerant, as operation of the network will not be interrupted if a subset of servents goes offline. - Philippe Verdy This document is intended for readers with a fair knowledge of network programming, but do not require any previous Gnutella experience. Still, other implementations of this protocol will give useful information about implementation techniques that are not included in this document. A list of Gnutella programs can be found at http://www.gnutelliums.com 1.2 Terminology and Network Management Servent A program participating in the Gnutella network is called a servent, as a contraction of "SERVer" and "cliENT". The words "peer", "node" and "host" have similar meanings, but refer to a network participant rather than a program. When a servent has a clear client or server role the words "client" or "server" may be used. The word "client" is also sometimes used as a synonym for servent. Some other documents use the word "servant" instead of servent. Message Messages are the entity in which information is transmitted over the network. Sometimes the word "packet" is used with the same meaning. Some other documents use the word "descriptor". GUID Globally Unique IDentifier. This is a 16-byte long value made of random bytes, whose purpose it is to identify servents and messages. This identification is not a signature, just a way to identify network entities in a unique manner. Gnutella network The Gnutella network is made of interconnected hosts implementing the Gnutella protocol. Sometimes also called the GNet. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [34].
1.3 Characteristics Gnutella is a decentralized peer-to-peer system. It allows the participants to share resources from their system for others to see and get, and locate resources shared by others on the network. Resources can be anything: mappings to other resources, cryptographic keys, files of any type, meta-information on keyable resources, etc. However, the semantics for locating and handling resources other than plain files are not specified in this document. Each participant launches a Gnutella program, which will seek out other Gnutella nodes to which to connect. This set of connected nodes carries the Gnutella traffic, which is essentially made of queries, replies to those queries, and also other control messages to facilitate the discovery of other nodes. Users interact with the nodes by supplying them with the list of resources they wish to share on the network, can enter searches for other's resources, will hopefully get results from those searches, and can then select those resources amongst the results: if those resources are files, for instance, they can download them. But one can imagine other types of resources that, once fetched, will bring more than their content value. Resource data exchanges between nodes are negotiated using the standard HTTP protocol. The Gnutella network is only used to locate the nodes sharing those resources. 1.4 Extending the protocol This document is the definition of the current Gnutella protocol. Servents MAY extend the protocol or even change parts of it (for example by compressing or encrypting the messages), but servents MUST always stay compatible with servents that follow this specification. If a servent, for example, wants to compress the Gnutella messages, it MUST first make sure the remote host of a connection can decompress the stream (during handshake), and otherwise leave the messages uncompressed. Servents MAY choose not to accept a connection with a servent that does not support a feature, but MUST always make sure that the Gnutella network is not split into separate networks. Separate networks for special purposes are, of course, allowed but then it is no longer the Gnutella network, but another network. This protocol also allows for extensions inside many messages. Such extensions can pass through servents that do not know about the extension to reach servents that do.