Este projeto foi desenvolvido para a disciplina CIC0124 - Redes de Computadores, do Departamento de Ciência da Computação da Universidade de Brasília. O objetivo deste documento é detalhar os protocolos de camada de aplicação implementados pelo Servidor Rendezvous, bem como os Clientes P2P, que juntos viabilizam uma aplicação de Chat P2P e o mecanismo de Peer Relay.
O servidor rendezvous atua como um ponto central de encontro para peers em uma rede P2P.
- Cada peer deve registrar-se no servidor para ficar visível.
- Peers podem descobrir outros participantes em uma determinada sala (namespace).
- Peers podem também remover seu registro (unregister).
- Todos os registros têm um tempo de vida (TTL) em segundos. Expirado esse tempo, o registro é descartado automaticamente.
A comunicação é feita sobre TCP. Cada conexão aceita apenas um comando (uma linha JSON) e é encerrada após a resposta.
- Cada mensagem (requisição ou resposta) é um objeto JSON válido, enviado em uma única linha terminada por
\n. - O servidor impõe um limite de 32 KB por linha.
- Se a linha for vazia ou apenas espaços, o servidor responde com um erro.
Registra (ou atualiza) um peer no servidor.
Campos obrigatórios:
type:"REGISTER"namespace: string (até 64 caracteres)name: string (até 64 caracteres)port: inteiro (1–65535)
Campos opcionais:
ttl: inteiro em segundos (1–86400). Se omitido, assume 7200 (2h).
Exemplo de requisição:
{ "type": "REGISTER", "namespace": "UnB", "name": "alice", "port": 4000, "ttl": 3600 }Resposta de sucesso:
{ "status": "OK" }Possíveis erros:
{ "status":"ERROR", "error":"line_too_long", "limit":32768 }
{ "status": "ERROR", "error": "bad_name" }
{ "status": "ERROR", "error": "bad_namespace" }
{ "status": "ERROR", "error": "bad_port" }
{ "status": "ERROR", "error": "bad_ttl" }Retorna a lista de peers registrados em um namespace.
Campos:
type:"DISCOVER"namespace: string (opcional).- Se omitido, retorna todos os peers de todos os namespaces.
namespaceinexistente, o servidor retorna uma lista vazia.
Exemplo de requisição:
{ "type": "DISCOVER", "namespace": "room1" }Resposta:
{
"status": "OK",
"peers": [
{
"ip": "203.0.113.45",
"port": 4000,
"name": "peerA",
"namespace": "room1",
"ttl": 60,
"expires_in": 42,
"observed_ip": "203.0.113.45",
"observed_port": 54321
}
]
}Requisição para namespace inexistente
{ "type": "DISCOVER", "namespace": "know-without-study" }Resposta:
{"status": "OK", "peers": []}Remove peers previamente registrados.
Campos obrigatórios:
type:"UNREGISTER"namespace: string
Campos opcionais:
name: stringport: inteiro
Exemplo de requisição:
{ "type": "UNREGISTER", "namespace": "room1", "name": "peerA", "port": 4000 }Resposta de sucesso:
{ "status": "OK" }Erros possíveis:
{ "status": "ERROR", "error": "bad_port (abc)" }- Linha vazia ou só espaços:
{ "status": "ERROR", "message": "Empty request line" }- Linha muito longa (> 32768 bytes):
{ "status": "ERROR", "error": "line_too_long", "limit": 32768 }- Timeout de inatividade:
{ "status": "ERROR", "message": "Timeout: no data received, closing connection" }- Comando desconhecido:
{ "status": "ERROR", "message": "Unknown command" }- O cliente se conecta ao servidor rendezvous (IP: pyp2p.mfcaetano.cc e TCP/8080 por padrão).
- Envia um REGISTER para se anunciar.
- Usa DISCOVER para consultar peers de um namespace.
- Pode UNREGISTER ao sair.
- Se o TTL expirar, o registro desaparece automaticamente.