Gnutella

From Hidden Wiki
Jump to navigation Jump to search

Template:Outdated Template:About Template:Filesharing sidebar

Gnutella (possibly by analogy with the GNU Project) is a large peer-to-peer network. It was the first decentralized peer-to-peer network of its kind, leading to other, later networks adopting the model.[1] It celebrated a decade of existence on March 14, 2010, and has a user base in the millions for peer-to-peer file sharing.

In June 2005, Gnutella's population was 1.81 million computers[2] increasing to over three million nodes by January 2006.[3] In late 2007, it was the most popular file-sharing network on the Internet with an estimated market share of more than 40%.[4]

History

The first client (also called Gnutella) from which the network got its name[5][6] was developed by Justin Frankel and Tom Pepper of Nullsoft in early 2000, soon after the company's acquisition by AOL. On March 14, the program was made available for download on Nullsoft's servers. The event was prematurely announced on Slashdot, and thousands downloaded the program that day.[7][8] The source code was to be released later, under the GNU General Public License (GPL); however, the original developers never got the chance to accomplish this purpose.[9]

The next day, AOL stopped the availability of the program over legal concerns and restrained Nullsoft from doing any further work on the project. This did not stop Gnutella; after a few days, the protocol had been reverse engineered, and compatible free and open source clones began to appear.Template:Citation needed This parallel development of different clients by different groups remains the modus operandi of Gnutella development today.

Among the first independent Gnutella pioneers were Gene Kan and Spencer Kimball, they launched the first portal aimed to assemble the open-source community to work on Gnutella,[10][11] and also developed "GNUbile", one of the first open-source (GNU-GPL) programs to implement the Gnutella protocol.[12][13][14]

The Gnutella network is a fully distributed alternative to such semi-centralized systems as FastTrack (KaZaA) and the original Napster. The initial popularity of the network was spurred on by Napster's threatened legal demise in early 2001. This growing surge in popularity revealed the limits of the initial protocol's scalability. In early 2001, variations on the protocol (first implemented in proprietary and closed source clients) allowed an improvement in scalability. Instead of treating every user as client and server, some users were now treated as ultrapeers, routing search requests and responses for users connected to them.

This allowed the network to grow in popularity. In late 2001, the Gnutella client LimeWire Basic became a free and open source. In February 2002, Morpheus, a commercial file sharing group, abandoned its FastTrack-based peer-to-peer software and released a new client based on the free and open source Gnutella client Gnucleus.

The word Gnutella today refers not to any one project or piece of software, but to the open protocol used by the various clients.

The name is a portmanteau of GNU and Nutella, the brand name of an Italian hazelnut flavored spread: supposedly, Frankel and Pepper ate a lot of Nutella working on the original project, and intended to license their finished program under the GNU General Public License. Gnutella is not associated with the GNU project[15] or GNU's own peer-to-peer network, GNUnet.

On October 26, 2010, the popular Gnutella client LimeWire was ordered shut down by Judge Kimba Wood of the United States District Court for the Southern District of New York when she signed a Consent Decree to which recording industry plaintiffs and LimeWire had agreed.[16] This event was the likely cause of a notable drop[17] in the size of the network, because, while negotiating the injunction, LimeWire staff had inserted remote-disabling code into the software. As the injunction came into force, users who had installed affected versions (newer than 5.5.10) were cut off from the P2P network. Since LimeWire was free software, nothing had prevented the creation of forks that omitted the disabling code, as long as LimeWire trademarks were not used. The shutdown did not affect, for example, FrostWire, a fork of LimeWire created in 2004 that carries neither the remote-disabling code nor adware.

On November 9, 2010, LimeWire was resurrected by a secret team of developers and named LimeWire Pirate Edition.[18] It was based on LimeWire 5.6 BETA. This version had its server dependencies removed and all the PRO features enabled for free.

Design

File:GnutellaQuery.JPG
The gnutella search and retrieval protocol

To envision how Gnutella originally worked, imagine a large circle of users (called nodes), each of whom has Gnutella client software. On initial startup, the client software must bootstrap and find at least one other node. Various methods have been used for this, including a pre-existing address list of possibly working nodes shipped with the software, using updated web caches of known nodes (called Gnutella Web Caches), UDP host caches and, rarely, even IRC. Once connected, the client requests a list of working addresses. The client tries to connect to the nodes it was shipped with, as well as nodes it receives from other clients until it reaches a certain quota. It connects to only that many nodes, locally caching the addresses it has not yet tried and discards the addresses it tried that were invalid.Template:Citation needed

When the user wants to do a search, the client sends the request to each actively connected node. In version 0.4 of the protocol, the number of actively connected nodes for a client was quite small (around 5), so each node then forwarded the request to all its actively connected nodes, and they, in turn, forwarded the request, and so on, until the packet reached a predetermined number of hops from the sender (maximum 7).Template:Citation needed

Since version 0.6 (2002[19]), Gnutella is a composite network made of leaf nodes and ultra nodes (also called ultrapeers). The leaf nodes are connected to a small number of ultrapeers (typically 3) while each ultrapeer is connected to more than 32 other ultrapeers. With this higher outdegree, the maximum number of hops a query can travel was lowered to 4.

Leaves and ultrapeers use the Query Routing Protocol to exchange a Query Routing Table (QRT), a table of 64 Ki-slots and up to 2 Mi-slots consisting of hashed keywords. A leaf node sends its QRT to each of the ultrapeers it is connected to, and ultrapeers merge the QRT of all their leaves (downsized to 128 Ki-slots) plus their own QRT (if they share files) and exchange that with their own neighbors. Query routing is then done by hashing the words of the query and seeing whether all of them match in the QRT. Ultrapeers do that check before forwarding a query to a leaf node, and also before forwarding the query to a peer ultra node provided this is the last hope the query can travel.

If a search request turns up a result, the node that has the result contacts the searcher. In the classic Gnutella protocol, response messages were sent back along the route the query came through, as the query itself did not contain identifying information of the node. This scheme was later revised, so that search results now are delivered over User Datagram Protocol (UDP) directly to the node that initiated the search, usually an ultrapeer of the node. Thus, in the current protocol, the queries carry the IP address and port number of either node. This lowers the amount of traffic routed through the Gnutella network, making it significantly more scalable.Template:Citation needed

If the user decides to download the file, they negotiate the file transfer. If the node which has the requested file is not firewalled, the querying node can connect to it directly. However, if the node is firewalled, stopping the source node from receiving incoming connections, the client wanting to download a file sends it a so-called push request to the server for the remote client to initiate the connection instead (to push the file). At first, these push requests were routed along the original chain it used to send the query. This was rather unreliable because routes would often break and routed packets are always subject to flow control. Therefore, so-called push proxies were introduced. These are usually the ultrapeers of a leaf node and they are announced in search results. The client connects to one of these push proxies using an HTTP request and the proxy sends a push request to leaf on behalf of the client. Normally, it is also possible to send a push request over UDP to the push proxy which is more efficient than using TCP. Push proxies have two advantages: First, ultrapeer-leaf connections are more stable than routes which makes push requests much more reliable. Second, it reduces the amount of traffic routed through the Gnutella network.Template:Citation needed

Finally, when a user disconnects, the client software saves the list of nodes that it was actively connected to and those collected from pong packets for use the next time it attempts to connect so that it becomes independent from any kind of bootstrap services.Template:Citation needed

In practice, this method of searching on the Gnutella network was often unreliable. Each node is a regular computer user; as such, they are constantly connecting and disconnecting, so the network is never completely stable. Also, the bandwidth cost of searching on Gnutella grew exponentially to the number of connected users,[20] often saturating connections and rendering slower nodes useless. Therefore, search requests would often be dropped, and most queries reached only a very small part of the network. This observation identified the Gnutella network as an unscalable distributed system, and inspired the development of distributed hash tables, which are much more scalable but support only exact-match, rather than keyword, search.Template:Citation needed

To address the problems of bottlenecks, Gnutella developers implemented a tiered system of ultrapeers and leaves. Instead of all nodes being considered equal, nodes entering into the network were kept at the 'edge' of the network as a leaf, not responsible for any routing, and nodes which were capable of routing messages were promoted to ultrapeers, which would accept leaf connections and route searches and network maintenance messages. This allowed searches to propagate further through the network, and allowed for numerous alterations in the topology which have improved the efficiency and scalability greatly.Template:Citation needed

Additionally, gnutella adopted a number of other techniques to reduce traffic overhead and make searches more efficient. Most notable are Query Routing Protocol (QRP) and Dynamic Querying (DQ). With QRP a search reaches only those clients which are likely to have the files, so rare files searches grow vastly more efficient, and with DQ the search stops as soon as the program has acquired enough search results, which vastly reduces the amount of traffic caused by popular searches. Gnutella For Users has a vast amount of information about these and other improvements to Gnutella in user-friendly style.Template:Citation needed

One of the benefits of having Gnutella so decentralized is to make it very difficult to shut the network down and to make it a network in which the users are the only ones who can decide which content will be available. Unlike Napster, where the entire network relied on the central server, Gnutella cannot be shut down by shutting down any one node and it is impossible for any company to control the contents of the network, which is also due to the many free and open source Gnutella clients which share the network.Template:Citation needed

Protocol features and extensions

Gnutella did once operate on a purely query flooding-based protocol. The outdated Gnutella version 0.4 network protocol employs five different packet types, namely[21]

  • ping: discover hosts on network
  • pong: reply to ping
  • query: search for a file
  • query hit: reply to query
  • push: download request for firewalled servants

These are mainly concerned with searching the Gnutella network. File transfers are handled using HTTP.[22]

The development of the Gnutella protocol is currently led by the Gnutella Developers Forum (The GDF). Many protocol extensions have been and are being developed by the software vendors and free Gnutella developers of the GDF. These extensions include intelligent query routing, SHA-1 checksums, query hit transmission via UDP, querying via UDP, dynamic queries via TCP, file transfers via UDP, XML metadata, source exchange (also termed the download mesh) and parallel downloading in slices (swarming).[22]

There are efforts to finalize these protocol extensions in the Gnutella 0.6 specification at the Gnutella protocol development website. The Gnutella 0.4 standard, although still being the latest protocol specification since all extensions only exist as proposals so far, is outdated. In fact, it is hard or impossible to connect today with the 0.4 handshakes and according to developers in the GDF, version 0.6 is what new developers should pursue using the work-in-progress specifications.Template:Citation needed

The Gnutella protocol remains under development and in spite of attempts to make a clean break with the complexity inherited from the old Gnutella 0.4 and to design a clean new message architecture, it is still one of the most successful file-sharing protocols to date.Template:Citation needed

Software

The following tables compare general and technical information for a number of applications supporting the Gnutella network. The tables do not attempt to give a complete list of Gnutella clients. The tables are limited to clients that can participate in the current Gnutella network.

General specifications

Name Platform License Project Status : active ?
(otherwise discontinued)
Latest release Heritage
scope=row style="background:Template:Rh2/bgcolor"| Acquisition macOS Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"|Template:Latest stable release/Acquisition scope=row style="background:Template:Rh2/bgcolor"| LimeWire
scope=row style="background:Template:Rh2/bgcolor" | BearFlix Windows Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"| 5.2.6.0 scope=row style="background:Template:Rh2/bgcolor"| BearShare
scope=row style="background:Template:Rh2/bgcolor" | BearShare Windows Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/BearShare scope=row style="background:Template:Rh2/bgcolor"| Original work
scope=row style="background:Template:Rh2/bgcolor" | Cabos Java Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/Cabos scope=row style="background:Template:Rh2/bgcolor"| LimeWire
scope=row style="background:Template:Rh2/bgcolor" | CitrixWire Windows Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"| 2014[23] scope=row style="background:Template:Rh2/bgcolor"| Addax
CocoGnut RISC_OS Template:Proprietary Template:Yes 1.21 (2005-06-21) Original work
scope=row style="background:Template:Rh2/bgcolor" | FilesWire (P2P) Java Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"| Beta 1.1 (2007) scope=row style="background:Template:Rh2/bgcolor"| Original work
scope=row style="background:Template:Rh2/bgcolor" | giFT (Gnutella plug-in) Cross-platform Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| 0.0.11 (2006-08-06) scope=row style="background:Template:Rh2/bgcolor"| Original work
scope=row style="background:Template:Rh2/bgcolor" | Gnucleus-GnucDNA Windows Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/Gnucleus scope=row style="background:Template:Rh2/bgcolor"| Original work
gtk-gnutella Cross-platform Template:Free Template:Yes Template:Latest stable release/gtk-gnutella Original work
scope=row style="background:Template:Rh2/bgcolor" | KCeasy Windows Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/KCeasy scope=row style="background:Template:Rh2/bgcolor"| giFT
scope=row style="background:Template:Rh2/bgcolor" | Kiwi Alpha Windows Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/Gnucleus scope=row style="background:Template:Rh2/bgcolor"| GnucDNA
scope=row style="background:Template:Rh2/bgcolor" | LimeWire Java Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/LimeWire scope=row style="background:Template:Rh2/bgcolor"| Original work
scope=row style="background:Template:Rh2/bgcolor" | Morpheus Windows Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/Morpheus scope=row style="background:Template:Rh2/bgcolor"| GnucDNA
scope=row style="background:Template:Rh2/bgcolor" | Phex Java Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/Phex scope=row style="background:Template:Rh2/bgcolor"| Original work
scope=row style="background:Template:Rh2/bgcolor" | Poisoned macOS Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| Template:Latest stable release/Poisoned scope=row style="background:Template:Rh2/bgcolor"| giFT
Shareaza Windows Template:Free Template:Yes Template:Latest stable release/Shareaza Original work
scope=row style="background:Template:Rh2/bgcolor" | Symella Symbian Template:Free Template:No scope=row style="background:Template:Rh2/bgcolor"| scope=row style="background:Template:Rh2/bgcolor"| Original work
WireShare (aka LimeWire Pirate Edition) Java Template:Free Template:Yes 5.6.4.3a (2015-08-01) LimeWire
scope=row style="background:Template:Rh2/bgcolor"| Zultrax Windows Template:Proprietary Template:No scope=row style="background:Template:Rh2/bgcolor"| 4.33 (April 2009) scope=row style="background:Template:Rh2/bgcolor"| Original work

Template:Legend2

Gnutella features

Client Hash search ChatTemplate:Efn-lr Buddy list Handles large files (> 4 GiB) Unicode-compatible query routing UPnP port mappingTemplate:Efn-lr NAT traversal NAT port mapping RUDTemplate:Efn-lr TCP push proxy UDP push proxy Ultrapeer GWebCacheTemplate:Efn-lr UDP host cache Template:Abbr TLS Other
scope=row style="background:Template:Rh2/bgcolor" colspan=2 | BearShare Template:Yes Template:Yes Template:Yes Template:No Template:No Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:No Template:Yes Template:Yes Template:No Template:Yes Template:No -
scope=row style="background:Template:Rh2/bgcolor" colspan=2 | giFT (core & plug-ins) Template:Yes Template:N/a Template:N/a Template:No Template:No Template:No Template:No Template:No Template:No Template:Yes Template:Efn Template:No Template:No Template:Efn Template:Yes Template:No Template:No Template:No -
scope=row style="background:Template:Rh2/bgcolor" colspan=2 | GnucDNA Template:Efn Template:Yes Template:N/a Template:N/a Template:No Template:No Template:No Template:No Template:No Template:No Template:Yes Template:No Template:No Template:Efn Template:Yes Template:No Template:No Template:No -
gtk-gnutella Template:Yes Template:Efn Template:No Template:No Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Efn Template:Yes Template:Yes Template:Yes Template:No (Dropped) Template:Yes Template:Yes Template:Yes IPv6, DHT, GUESS, G2
scope=row style="background:Template:Rh2/bgcolor" colspan=2 | LimeWireTemplate:Efn Template:Yes Template:Efn Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Efn Template:Yes Template:Efn Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes DHT
WireShareTemplate:Efn Template:Yes Template:Efn Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Efn Template:Yes Template:Efn Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes DHT
scope=row style="background:Template:Rh2/bgcolor" colspan=2 | Phex Template:Yes Template:Yes Template:No Template:Yes Template:Yes Template:No Template:YesTemplate:Efn Template:No Template:No Template:Yes Template:No Template:Yes Template:Yes Template:Yes Template:Yes Template:Yes I2P
Shareaza Template:Yes Template:Yes Template:No Template:Yes Template:No Template:Yes Template:Yes Template:Yes Template:No Template:Yes Template:Yes Template:Yes Template:Yes Template:YesTemplate:Efn Template:Yes Template:No G2, BT, eD2k, IRC

Notes

Template:Notelist-lr Template:Notelist

  • Morpheus differs significantly and may have completely independent code from the GnucDNA engine. Morpheus can function as a modern ultrapeer whereas other GnucDNA clients cannot.
  • Gnucleus and Kiwi Alpha use the GnucDNA engine.
  • BearFlix, a functionally limited version of the BearShare 5.2 series, can search only for images or videos and shared videos are limited to a relatively short length.
  • giFTcurs, Apollon, FilePipe, giFToxic, giFTui, giFTwin32, KCeasy, Poisoned, and Xfactor are GUI front-ends for the giFT engine.
  • etomi uses outdated Shareaza networking code.
  • MP3 Rocket, 360Share, LemonWire, MP3Torpedo, and DexterWire are variants of LimeWire.
  • FrostWire (up to version 4.21.8) is nearly identical to LimeWire 4.18 but versions greater than 5.00 no longer use gnutella.
  • Acquisition and Cabos are custom front-ends overlaying the LimeWire engine.
  • LimeWire Pirate Edition (5.6.2) is a resurrected version of the unreleased LimeWire 5.6.1 alpha, thus has similar features minus automatic updates (with nags) and centralized remote controls to disable core functions like searches and downloads were removed.

Gnutella2

Template:Main The Gnutella2 protocol (often referred to as G2), despite its name, is not a successor protocol of gnutella nor related to the original GNUtella project,[24] but rather is a totally different protocol that forked from the original project and piggybacked in the gnutella name. A sore point with many gnutella developers is that the Gnutella2 name conveys an upgrade or superiority, which led to a Gnutella2 flame war. Other criticism included the use of the gnutella network to bootstrap G2 peers and poor documentation of the G2 protocol. Additionally, the search retries of the Shareaza client, which was one of the initial G2 clients, could unnecessarily burden the gnutella network.[25]

The fork took place in 2002 and both protocols have undergone significant iterations since that time. G2 has advantages and disadvantages compared to gnutella. An advantage often cited is Gnutella2's hybrid search is more efficient than the original gnutella query flooding, which was replaced by more efficient search methods, starting with Query Routing in 2002, proposed in 2001 by Limewire developers.[26][27][28] An advantage for gnutella is its user population numbers in the millions,[3] whereas the G2 network is approximately an order of magnitude smaller.[29] It is difficult to compare the protocols in their current form; the individual client choice will probably have as much an effect to an end user on either network.

See also

Template:Wikibooks

References

Template:Refimprove

1 }}
     | references-column-width 
     | references-column-count references-column-count-{{#if:1|{{{1}}}}} }}
   | {{#if: 
     | references-column-width }} }}" style="{{#if: 
   | {{#iferror: {{#ifexpr: 1 > 1 }}
     | Template:Column-width
     | Template:Column-count }}
   | {{#if: 
     | Template:Column-width }} }} list-style-type: {{#switch: 
   | upper-alpha
   | upper-roman
   | lower-alpha
   | lower-greek
   | lower-roman = {{{group}}}
   | #default = decimal}};">
  1. Template:Cite news
  2. Slyck News - eDonkey2000 Nearly Double the Size of FastTrack, Thomas Mennecke for Slyck.com, June 2, 2005.
  3. 3.0 3.1 On the Long-term Evolution of the Two-Tier Gnutella Overlay. Rasti, Stutzbach, Rejaie, 2006. See Figure 2a.
  4. Ars Technica Study: BitTorrent sees big growth, LimeWire still #1 P2P app Eric Bangeman, April 21, 2008.
  5. Template:Cite news
  6. Template:Cite news
  7. Gnutella announcement March 14, 2000 on Slashdot
  8. AOL and Gnutella Template:Webarchive March 15, 2000 by CNN
  9. https://www.gnu.org/philosophy/gnutella.html
  10. Template:Cite news
  11. Template:Cite news
  12. Template:Cite web
  13. Template:Cite web
  14. ftp://ftp.cs.umn.edu/pub/netbsd/NetBSD-current/pkgsrc/net/gnubile/README.html
  15. Regarding Gnutella (www.gnu.org)
  16. Template:Cite news
  17. Template:Cite web
  18. Template:Cite web
  19. Template:Cite web
  20. Why Gnutella Can't Scale. No, Really. February 2001.
  21. Dye, Mark. McDonald, Rick. Rufi, Antoon W., 'Network Fundamentals', Cisco Networking Academy, Cisco Press, Ch 3. p91
  22. 22.0 22.1 Dye, Mark. McDonald, Rick. Rufi, Antoon W., 'Network Fundamentals', Cisco Networking Academy, Cisco Press, Ch 3. p90
  23. Template:Cite web
  24. Gnutella vs. Gnutella2, Part 2 Thomas Mennecke for Slyck.com, February 25, 2003.
  25. Gnutella vs. Gnutella2, Part 1 Thomas Mennecke for Slyck.com, February 25, 2003
  26. A comparison of Peer-to-Peer search methods Template:Webarchive Dimitrios Tsoumakos, 2003
  27. Query Routing for the Gnutella Network proposal Christopher Rohrs, 2001-12-18
  28. Query Routing for the Gnutella Network 1.0 Christopher Rohrs, 2002-05-16
  29. G2 Network Statistics Population ~200,000 January 2010.
  • Dye, Mark. McDonald, Rick. Rufi, Antoon W., 'Network Fundamentals', Cisco Networking Academy, Cisco Press, Ch 3. p91
  • Dye, Mark. McDonald, Rick. Rufi, Antoon W., 'Network Fundamentals', Cisco Networking Academy, Cisco Press, Ch 3. p90

External links

Template:Gnutella Template:File sharing protocols