http://www.gnucleus.com/research/transfer.html Traducido por Jose Fuentes Protocolo Gnutella : Transferencia Las transferencias de archivos sobre Gnutella se llevan a cabo sobre una conexión directa entre dos nodos. La sintaxis del codigo es similar a HTTP, pero en realidad no se adecúa a ese estandar, sino que tiene algunas pequeñas diferencias. Use los ejemplos de esta página como una guía. Gnutella tiene además un mecanismo de transferencia llamado 'push', que permite compartir archivos a los nodos que están detras de firewalls. Si uno no se puede conectar a un nodo para obtener un archivo, entonces se puede solicitar a ese nodo que haga un 'push' del archivo y se conecte a nosotros. El push no funciona si ambos nodos están detrás de un firewall. Petición de archivo Al conectarse al host del cual se quiere descargar el archivo, se envía un header de petición de archivo. La primer línea es la sentencia GET, y el número entre las barras es el índice de el archivo, leído del paquete query hit. A continuación va el nombre del archivo. La siguiente línea describe qué tipo de cliente está solicitando el archivo. La sentencia Range le dice al host en qué posición del archivo empezar a enviar en caso que el cliente esté retomando la descarga del archivo. Un nuevo download empezara siempre en la posición cero. Cada línea termina con \r\n o en ASCII un par 0x0D 0x0A GET /get/2975/How Towels Work.txt HTTP/1.0\r\n User-Agent: LimeWire 1.8\r\n Range: bytes=0-\r\n \r\n Respuesta del Servidor Luego que el servidor recibe la petición de archivo contesta con un mensaje HTTP 200 OK al cliente, a menos que esté ocupado o el archivo no exista. En ese caso use las especificaciones HTTP para enviar el código de error HTTP correspondiente. Para facilitar las cosas envía los archivos usando Content-type como application/binary. A continuación va el tamaño total del archivo en bytes. Despues de enviar el ultimo \r\n se procede a enviar el archivo. HTTP 200 OK\r\n Server: Gnucleus 1.4.5.2\r\n Content-type:application/binary\r\n Content-length: 2894894\r\n \r\n Retomando (la transferencia) Si un cliente envía una petición GET con un byte range diferente de cero significa que el cliente está retomando la transferencia. En ese caso la respuesta se modifica un poco. En lugar de la sentencia Content-length se usan las sentencias Accept-Ranges y Content-range. Accept-Ranges: siempres es "bytes". Content-range: va seguida de "byte=" y la posicion desde la cual se retoma la transferencia. Luego del guión va la posición del último byte en el archivo, y después de la barra el total de bytes en el archivo. HTTP 200 OK\r\n Server: Gnucleus 1.5.0.0\r\n Content-type:application/binary\r\n Accept-Ranges: bytes\r\n Content-range: bytes=565768-1947689/1947690\r\n \r\n Pushing En lugar de conectarse a un host para enviar una petición GET uno envía un paquete push sobre la red gnutella. El motivo para hacer esto es porque el host del cual se quiere descargar el archivo tiene una dirección IP inalcanzable tal como 192.168.0.67. El paquete push le dice al host que se conecte a nosotros (teniendo nosotros una IP alcanzable). Al conectarse el host a nosotros, nos envía una petición GIV. La petición GIV tiene tres partes, el índice del archivo, el GUID de el servidor y el nombre del archivo. Hay que tener en cuenta que la petición GIV termina con \n\n y no con \r\n. GIV 446:72814A49E69D0F43FF288B3E6AAAB400/Paint Drying.mpg\n\n Después del GIV, el cliente y el servidor actúan normalmente como en el caso anterior y se envían entre si los correspondientes headers para iniciar la transferencia del archivo. GET /get/446/Paint Drying.mpg HTTP/1.0\r\n User-Agent: Bearshare 2.3.0\r\n Range: bytes=0-\r\n \r\n HTTP 200 OK\r\n Server: Gnucleus 1.3.3.1\r\n Content-type:application/binary\r\n Content-length: 56763485\r\n \r\n