Presentación

Gazu es un nuevo sistema de P2P que intenta solventar los problemas de los actuales sistemas de P2P. Para ello utiliza las cuentas de Gmail como medio de transmisión de los archivos. Está desarrollado en Pitón por lo que se puede usar tanto en Windows como en Linux.

¿Por qué un nuevo software P2P?

La razón de ser de este nuevo software es solucionar los problemas de los actuales sistemas de P2P.

Uno de los principales problemas de los actuales sistemas P2P son los usuarios que no comparten, estos son como un virus en un PC. No incrementan la velocidad de descarga global, sino que la decrecen. También hay otro tipo de usuarios, lo que tienen una conexión telefónica (muy frecuentes en España) y no comparten porque tienen una conexión muy lenta.

Pero el peor problema son los fakes, estos colapsan los servidores con datos inútiles y decrece la reputación del protocolo. Emula y Kazaa están plagados de fakes, Bittorrent tiene solo unos pocos.

Por ultimo, existe el problema de que las líneas de Internet de los usuarios, son asimétricas, es decir, la velocidad de subida es distinta de la de bajada. Normalmente es menor la de subida que la de bajada, por lo que los archivos si se comparten no van rápido.

Estos tres problemas son eliminados con este software. En el siguiente párrafo voy a explicar como resuelvo esto.

La idea

El principal problema en el P2P es que no todo el mundo tiene conexiones muy buenas y normalmente no comparten archivos y no están siempre en línea. Pero, que pasaría si usamos la conexión de Gmail y el almacenamiento de Gmail como servidores.

La idea básica de este nuevo tipo de P2P es que una persona(persona_1), que quiere compartir un archivo, ponga este archivo en su cuenta de Gmail como una fichero adjunto y lo reenvíe a otra persona (persona_2) usando el servidor de Gmail. Cuando el receptor reciba el email en su cuenta puede descargarse el archivo tan rápido como su conexión pueda.

Si otra persona quiere el mismo archivo, entonces una de las personas que lo tienen (persona_1 o persona_2), solo tienen que reenviar el mensaje original usando el API de Gmail. Este envío es rápido porque no es necesario volver a subir el archivo para que sea reenviado. De esta manera el fichero puede ser repartido por un montón de cuentas en menos de 10 minutos y la velocidad de descarga individual depende de la conexión de cada usuario.

De esta manera he resuelto el problema de las semillas inestables, desconectadas y lentas. Ahora voy a explicar como resuelvo el problema de la gente que no comparte.

Con este tipo de P2P, la gente que tenga una conexión de 28.8 kbps puede enviar un email de 200Mb en solo unos pocos segundos, sin dañar su velocidad de bajada. Por lo que todos los usuarios comparten, y comparten tan rápido como Gmail envía los emails (Muy rápido).

En otros protocolos como Kazaa o Emule las semillas solo tienen que hacer clic en un botón para compartir un fake, esto ayuda la propagación de los fakes. Este problema es resuelto porque si una persona quiere compartir un fichero de 200Mb tiene que subirlo al servidor y esto es muy lento si se trata de un archivo enorme(Como una película). Los fakes pueden existir, pero no es muy normal porque el usuario tiene que gastar mucho tiempo en subir el archivo.

Este protocolo esta libre de fakes, malos servidores y usuarios que no comparten.

Las búsquedas de los archivos se pueden realizar mediante peticiones a servidores (como emule) o mediante “gfiles” similares a los torrents.

Problemas y soluciones

Mucha gente habrá pensado que la cuota máxima de almacenamiento por email de Gmail son 10Mb y no se puede enviar un email enorme. Esto es parcialmente verdad, porque no puedes enviar un archivo de 100Mb en un email, pero si que puedes enviar 10 emails con 10Mb de archivos adjuntos, bajártelos y rejuntar el archivo original.

El pedido de un archivo se puede hacer de dos maneras:

· Enviar un email a la cuenta de la semilla con la información del archivo pedido. Requiere solo el email de la semilla.
· Conectar a un puerto de la semilla que Gazu ha abierto. Requiere la IP de la semilla. Esta manera se descarta porque la IP puede ser dinámica.

Otro problema es como conocer el email de la semilla. La mejor solución que se me ha ocurrido es publicar un archivo gfile en el que están los emails de todas las semillas o pedirlos emails de las semillas a un servidor. Pero, ¿ qué pasa si la semilla borra el archivo de su cuenta y hay mas gente que tiene el archivo?¿Nadie puede bajarse el archivo de las otras semillas? En principio, con este planteamiento no. He pensado un algoritmo para resolver este problema:

1. La semilla pone la información (un email o un archivo con la información) del archivo compartido en un sitio web.
2. La persona que quiere bajarse el archivo manda un email a la semilla.
3. La semilla añade el email del descargador a la lista de emails que tienen ese archivo.
4. El bajador recibe el archivo.
5. Si la semilla borra el archivo y otra persona pide el archivo, la semilla le envía un email con la lista de los descargadores que se han bajado ese archivo.
6. Si la nueva semilla también ha borrado el fichero, entonces este envía un email al descargador con la lista de los emails que se han bajado ese fichero de él.
7. El algoritmo termina cuando el descargador encuentra una cuenta que tiene el archivo o se termina la lista de emails.

Publicando la información

La manera de publicar la información de un fichero a través de un fichero muy similar a un torrent. Este puede tener información referente al email de la semilla, tamaño del archivo, calidad del video, calidad del sonido, website, MD5, contraseña... También puede tener la lista de emails de la semilla. Los servidores serian los encargados de modificar este archivo para añadir nuevas semillas.


Implementación

La manera de guardar los ficheros en Gmail puede ser la siguiente. Primeramente hay un email-cabecera que tiene en su cuerpo toda la información de todos los archivos que el usuario ha descargado, la lista del resto de emails que contienen cada archivo y la lista de las direcciones de las cuentas a las que ha sido enviado el fichero. El asunto de este tipo de emails puede ser “GAZU”. La lista de emails es actualizada cuando una semilla envía el archivo a otro usuario, entonces ese usuario es añadido a la lista de semillas en el email-cabecera.

Los ficheros son guardados como archivos adjuntos en los emails. El asunto de estos emails debe ser un numero único para identificar el fichero, una buena opción sería MD5. Para saber el orden de descarga de los archivos, nos servimos de una característica de Gmail. En Gmail los emails se organizan por conversaciones, estas tienen un orden. Para saber el orden solo tenemos que descargar los archivos en el orden de la conversación. Para añadir un email a una conversación basta con enviarlo con el mismo asunto que el de la conversación. Un efecto colateral de esta implementación es que si reenviamos un email de la conversación a otra cuenta, este nuevo email se añade a la conversación. Para evitar esto, lo tenemos que enviar con otro asunto. Pero como no podemos cambiar el MD5 del email he añadido un nuevo campo al asunto. Este es la dirección de email de la cuenta en la que se alojara el archivo.

Cuando un usuario pide un fichero hay dos posibilidades:

· Si la semilla tiene el archivo pedido, busca los emails correspondientes al MD5 que la semilla ha recibido y envía el email-cabecera y el resto de emails. Después es recomendable añadir el usuario al email-cabecera para crear un árbol de emails mas grande.
· Si la semilla no tiene el archivo pedido, busca en el email-cabecera la lista de cuentas que tienen el archivo y envía dicha lista. El asunto debe ser “GAZU_TREE-HEADER_<MD5>”. Es muy importante que la primera semilla NUNCA borre el fichero-cabecera. Si lo borra entonces el árbol de emails se rompe por completo. Si otro usuario borra este archivo es menos importante que la semilla original, porque si otro usuario rompe el árbol hay otros usuarios en otras ramas, pero si la semilla original rompe la raíz del árbol no hay mas semillas.


Cuando el usuario descarga la información del fichero este es abierto con el cliente de Gazu. El cliente envía un email al usuario con el asunto “GAZU_SEARCH_<MD5>”. Entonces, este espera una respuesta de la semilla, y cuando ésta llega, el usuario comprueba el asunto del email-cabecera. En este punto hay dos caminos posibles:

· Si el asunto es “GAZU_FOUND_<MD5>” entonces todo correcto, la semilla tiene el archivo. Ahora se envía otro email a la semilla para confirmar la descarga. El asunto del segundo email debe ser “GAZU_SEND_<MD5>”. Se descarga el archivo y se rejunta. Finalmente, se comprueba el MD5 del archivo.
· Si el asunto es “GAZU_NOT_FOUND_<MD5>” la semilla no tiene el archivo en su cuenta. Entonces, el cliente de Gazu envía una petición a otra semilla. Y empieza otra vez hasta que recibe un email con la cabecera “GAZU_FOUND_<MD5>”.

El cliente manejará todos los emails de la cuenta mediante el API de Gmail. Es el responsable de las siguientes funciones:

· Separar los archivos mayores de 10Mb en ficheros separados.
· Crear email-cabecera.
· Subir los archivos.
· Enviar los archivos a otros usuarios.
· Enviar email-cabecera para buscar otras semillas.
· Pedir ficheros.
· Descargar ficheros.
· Rejuntar archivos y comprobar MD5.
· Cuando el cliente es abierto, tiene que comprobar las nuevas peticiones y enviar los archivos o las cabeceras.
· Tener un servicio de mensajería.

El cliente puede ser implementado bajo Windows y Linux, no hay restricciones al respecto.

He decidido usar Gmail porque tiene una capacidad de almacenamiento enorme y una API muy útil. El API de Gmail es esencial para este tipo de P2P. Sin este API, el programa no podría reenviar emails sin subirlos de nuevo.