# Gnutella

'Gnutella' es un proyecto de software distribuido para crear un protocolo de red de distribución de archivos entre pares, sin un servidor central.

## Historia

El primer cliente para esta red fue desarrollado por Justin Frankel y Tom Pepper de Nullsoft, actuNullsoft. El código fuente fue liberado poco más tarde, bajo los términos de la licencia GPL. El evento fue anunciado de inmediato en Slashdot, y el programa fue descargado masivamente ese día.
Al día siguiente, AOL detuvo la disponibilidad del programa debido a problemas legales y prohibió a la división Nullsoft continuar trabajando en el proyecto. Esto no fue el fin de Gnutella; unos días más tarde el protocolo había sido descifrado por ingeniería inversa y varios clones de código abierto comenzaron a emerger. Este desarrollo paralelo de distintos clientes por distintos grupos continúa siendo hoy la manera en que se realiza el desarrollo de Gnutella hoy en día.
La red Gnutella sería una alternativa descentralizada, a sistemas semi-centralizados como Napster. La popularidad inicial de la red fue estimulada aún más tras la caída de Napster en el año 2001 por causas legales. Este crecimiento de popularidad reveló rápidamente los límites de la escalabilidad inicial del protocolo.
A principios del 2001, algunas variaciones del protocolo (liberadas al principio como clientes de código cerrado) mejoraron en alguna medida la escabilidad del protocolo. En vez de tratar cada usuario como cliente y servidor, algunos usuarios pasaron a ser tratados como "ultrapares", enrutando peticiones de búsquedas y respuestas para los usuarios conectados a ellos.
El nombre 'Gnutella' es un juego de palabras entre GNU y Nutella (un dulce de avellana). Supuestamente, Frankel y Pepper comían mucha Nutella mientras trabajaban en el proyecto original y utilizarían la licencia GPL de GNU para el programa terminado. Gnutella no está directamente asociada con el Proyecto GNU;[2] véase GNUnet para encontrar el equivalente propio de GNU.

## Funcionamiento

Al contrario que otras redes de intercambio de ficheros, como eDonkey2000, Gnutella es una red P2P pura. Esto es, todos los nodos tienen la misma función, peso e importancia dentro de la red. El funcionamiento de la red pasa por tres fases:
* Entrada. En esta fase un nuevo nodo se conecta a otro que ya esté dentro de la red. Cómo se encuentra un nodo ya conectado está fuera del protocolo, pero normalmente los clientes Gnutella se distribuyen con una lista de nodos que se espera estén siempre conectados y se escoge alguno al azar. Un nodo cualquiera puede estar conectado a varios nodos, y recibir conexiones de nuevos nodos formando una malla aleatoria no estructurada.
* Búsquedas. Cuando un nodo desea buscar un fichero, le envía un mensaje a todos los nodos a los que está conectado. Estos buscan localmente si lo ofrecen, y a la vez reenvían la búsqueda a todos los nodos a los que ellos están conectados. Esta estrategia de difusión se llama inundación de la red, y existen mecanismos para evitar reenvíos infinitos y bucles. Cuando una petición llega a un nodo que ofrece el fichero, se contesta directamente al nodo que inició la búsqueda.
* Descargas. La descarga se realiza directamente desde los nodos que contestaron a la búsqueda del fichero. Los ficheros pueden partirse en varios trozos servidos por diferentes nodos, y los clientes suelen incluir un sistema de comprobación final de la integridad del fichero.
La inundación producida por la fase de búsqueda es la debilidad más importante de este protocolo. Si hay muchas búsquedas a la vez, la red se llena de mensajes de búsqueda que los nodos se envían entre ellos. Además, este algoritmo de búsqueda no garantiza que el fichero sea finalmente encontrado incluso aunque algún nodo de la red lo tenga. Aun así, el hecho de que no exista un servidor central de búsqueda, como en el caso de eDonkey2000, hacen que este protocolo sea más robusto en caso de caídas de nodos.

## Programas con soporte del protocolo

* Cabos (Windows, Mac OS X)
* Gnucleus (Windows)
* FrostWire (Multiplataforma, escrito en Java)
* LimeWire (Multiplataforma, escrito en Java)
* Mutella (GNU/Linux, Unix)
* Shareaza (Windows)
* gtk-gnutella (GNU/Linux, Unix, Windows, Mac OS X)
* MLDonkey (GNU/Linux, Windows, Mac OS X)
* Acquisition (Mac OS X)
* iMesh (Windows)
* Phex (Multiplataforma, escrito en Java)
* BearShare
* Ares Galaxy (Windows)