Projeto de Implementação do protocolo Gnutella

Revisão do Documento 0.1

Status: em produção

Introdução

Esse projeto visa a implementação de um servent da rede Gnutella, de acordo com a especificação do protocolo Gnutella versão 0.4, revisão 1.6 .

O servent é divido em duas partes, uma servidor e outra cliente. Porém, as duas partes são vistas apenas como uma pelo usuário.

Figura 1 - DFD nível 0

Figura 2 - DFD nível 1

Funções

Mensagem

Função que envia mensagem.

A mensagem pode ser enviada para um usuário ou via um socket padrão, depende

do tipo passado.

Entrada: tipo da mensagem e o corpo da mensagem

Saída: status do envio da mensagem.

status função mensagem(tipo, msg)

verifique o tipo

caso for USUARIO:

mostre uma mensagem na tela com msg

caso for PING:

caso for PONG:

caso for CONEXAO:

escreva no canal de comunicação a msg

fim

retorne status

fim

Conexão

É feita através de uma consulta na lista de servents.

Consulta-se o primeiro host declarado na estrutura e tenta fazer a conexão, caso não tenha sucesso, segue para o próximo host. Se todas tentativas falharem, uma mensagem é enviada para o usuário.

Entrada: lista_servents

Saída: status da conexão

função conexao(arquivo lista_servents)

laço: enquanto possuir host na lista_servents faça:

pegue primeiro host no arquivo

conectar(host, porta)

se falha: volta ao inicio do laço de repetição

se fim de arquivo:

mensagem('USUARIO', “A conexão falhou, tente outros servents.”)

fim

fim

status funcao conectar(host, porta)

conectar no host e na porta

se 'GNUTELLA_OK':

mensagem(CONEXAO, host, 'GNUTELLA_VERSAO');

retorne 'CONEXAO_SUCEDIDA'

se não: retorne 'FALHA_CONEXAO'

fim

Ping

É enviado uma mensagem do tipo ping para um servent e espera-se que ele responda com pong.

Entrada: host

função ping (host)

mensagem(host, PING)

fim

Pong

Resposta via mensagem com o descritor pong.

O host é o servent que enviou o ping, mas não o servent originou o ping, mas sim o servent que transmitiu por último o ping.

Entrada: porta do servent, host, número de arquivos no servent e tamanho total desses arquivos.

função pong(porta, host, numero_arquivos, total_tam_arquivos)

mensagem(PONG, porta, host, numero_arquivos, total_tam_arquivos)

fim

Figura 3 - Percursso de um PING / PONG

Query

Função de busca de arquivos.

Entrada: Velocidade

QueryHits

Encapsuladora

Função que encapsula o payload no descritor.

....

Servidor (c/ thread)

Função que abre um canal de comunicação para outros clientes GNUTELLA.

Cliente (c/ thread)

Estrutura de dados

Constantes

Contém a definição de todos as constantes do protocolo, declarados de forma estática em um função do programa separada ou na função principal.

string	GNUTELLA	“GNUTELLA CONNECT/0.4\n\n”

string	GNUTELLA_	OK	“GNUTELA OK\n\n”

inteiro	CONEXAO	0xa0

inteiro	CONEXAO_SUCEDIDA	0xa1

inteiro	FALHA_CONEXAO	0xa2

inteiro	USUARIO	0xa3

inteiro	PING	0x00

inteiro	PONG	0x01

inteiro	QUERY	0x80

inteiro	QUERYHITS	0x81

inteiro	BYE	0x02

Descritores

Array de bytes:

Descritor ID	Payload	TTL	Hops	Tamanho do Payload

Descritor ID: 16 bytes / string com a identificação do descrito

Payload: PING / PONG / QUERY / QUERYHITS / BYE

Lista de servents

Arquivo texto (servents.ini) com hosts que já estão conectados a rede, lista obtida através de sites na internet.

Estrutura do arquivo:

<nome do host>:<porta>

gnet.ath.cx:6346

gnet2.ath.cx:6346

gnet3.ath.cx:6346

gnet4.ath.cx:6346

gnet5.ath.cx:6346

gnotella.fileflash.com:6346

gnutellahosts.com:6346

Buscas

Diretório de arquivos

Diagrama de estados

Bibliografia

http://rfc-gnutella.sourceforge.net/

http://www.gnutelliums.com/

hosts: http://gnutella.da.ru/

2005-10-27T17:14:47