Probleme
Die erste Version von Gnutella (v0.4) hatte in den drei folgenden Bereichen wesentliche Probleme:
Download
Beim Versuch sich Dateien aus dem Gnutella Netzwerk herunterzuladen kam es oft zu Fehlern, so dass der Download nicht gestartet oder beendet werden konnte. Das lag einerseits an schlecht programmierten Clients, die die Vorgaben des Gnutella Netzwerks zum Verhalten eines Clients nicht oder nur teilweise implementierten.
Andererseits trugen die User wesentlich selbst dazu bei. Es gab eine wachsende Anzahl an Usern, die browserbasierte Suchdienste wie asiayeah.com und gnute.com verwendeten, um Dateien herunterzuladen und dadurch selber keine Dateien im Gnet anboten. Die Folge davon waren viele Download Anfragen, aber nur wenige Bereistellungen von Uploads. Eine Datei konnte man durch eine Suche im Gnet zwar finden, aber meistens nicht herunterladen oder man musste eine lange Wartezeit hinnehmen, da der anbietende Servent seine maximalen Uploads schon erreicht hatte.
Deshalb ging man dazu über, User zu Blockieren, die Webinterfaces benutzten.
Ein weiteres Problem war das Userverhalten. Viele benutzten zwar Clients, stellten aber trotzdem nichts zum Upload bereit oder waren nur kurz mit dem Gnet verbunden, so dass angefangene Uploads nicht beendet werden konnten.
Seitdem ist es bei den meistens Clients daher notwendig Uploads bereitzustellen, wenn man Dateien herunterladen möchte.
Um den Traffic im Gnet zu verringern und unnötige Query Hits zu vermeiden, die wahrscheinlich ein Download Request nach sich ziehen würden, wird bei neueren Clients nur noch ein Query Hit gesendet, wenn Ressourcen für ein Upload bereitgestellt werden. Ausserdem senden Servents ein Busysignal wenn kein Ressourcen verfügabr sind. Dadurch versucht der anfragende Servent es zu einem späteren Zeitpunkt noch einmal.
Das hatte auch gleichzeitig den Effekt, dass User länger online blieben um ihre Downloads zu vervollständigen und somit auch länger ihre Uploads dem Gnet zur Verfügung stellten.
Skalierbarkeit
Ein enormes Problem war die schlechte Skalierbarkeit von Gnutella. Im Mittel war das Gnet nur bei einer Anzahl von 400-800 Usern nutzbar. Bei einer größeren Anzahl von Useren trat das so genannte Modem-Bandwith-Barrier Problem auf. Dieses Problem entstand bei Usern mit Modem, deren nutzbare Bandbreite durch den Traffic des Gnet überschritten wurde, was zu Störungen im gesamten Gnet führte, da z.B. Query Hits nicht mehr weitergeleitet werden konnten.
Um zu verhindern, dass diese Störungen durch überlastet Modems auftreten musste das Netzwerk strukturiert werden. Servents mit schneller Verbindung sollen daher überwiegend Verbindungen mit anderen 'schnellen' Servents aufbauen und den Kern des Netzwerks bilden. Servents mit langsamer Verbindung sollen hingegen an den Netzwerkrand, wo sie nicht viel Traffic zu verwalten haben.
Um diese Strukturierung zu erreichen müssen User bei ihren Clients ihre Verbindungsgeschwindigkeit (T1, T3, ...) einstellen. Verbindungen zu überlasteten Servents werden beendet, was zur Folge hat, dass diese an den Netzwerkrand verschoben werden. Eine neuere Implementationsidee ist die Unterteilung der Servents in Ultrapeers und Leafs.
Ausserdem werden Implementationen wie Flow Control, Ping Pong Schema und das Query Routing Protocol verwendet.
Entwicklung
Die Entwicklung von Gnutella war lange Zeit nicht einheitlich und es gab auch keine Organisation, die daran etwas ändern konnte. Daher gab es viele Clients mit unterschiedlichen Implemenationen, was natürlich nicht zur Effektivität des Gnet beitrug.
Letztendlich wurde versucht mit dem Gnutella Developer Forum (GDF) eine Basis zur gemeinsame Entwicklung von Ideen bereitzustellen.