Table of Contents
Trabalho com UDP - Trabalho 1
Implementação de Transferência de Arquivos Confiável sobre UDP com Sockets
O Protocolo UDP
Este projeto foca na implementação de uma aplicação que opera sobre o protocolo UDP, utilizando programação com sockets. O principal objetivo é o desenvolvimento de um Servidor UDP simplificado, para consolidar o conhecimento sobre o funcionamento básico e a programação com UDP, contrastando-o com os serviços que o TCP disponibiliza para a camada de aplicação.
Objetivo do Projeto
Desenvolver uma aplicação cliente-servidor para transferência de arquivos utilizando o protocolo UDP. O foco principal é a implementação de mecanismos básicos de controle e confiabilidade diretamente sobre UDP, simulando funcionalidades que o TCP oferece nativamente.
Requisitos Gerais
- Linguagem de Programação: livre (ex: Python, Java, C/C++, etc.).
- Restrição de Bibliotecas: não é permitido o uso de bibliotecas de alto nível que abstraiam a manipulação direta do protocolo UDP. A implementação deve utilizar a API de sockets do sistema operacional (ou da linguagem escolhida) para criar, enviar e receber datagramas UDP.
- (Opcional/Sugestão) Recomenda-se iniciar com um exemplo simples “Hello World” cliente/servidor UDP para familiarização com a API de sockets antes de abordar a transferência de arquivos.
listen/accept). Comece entendendo a API básica:- Python: UDP Sockets in Python
- Java: DatagramSocket in Java
- C/C++: UDP Server-Client in C
Requisitos do Servidor UDP
- Inicialização: o servidor deve ser executado antes do cliente.
- Porta: deve operar em uma porta UDP especificada, com número maior que 1024 (portas abaixo de 1024 geralmente exigem privilégios de administrador).
- Recepção e Protocolo:
- Aguardar conexões/mensagens de clientes.
- Interpretar as requisições recebidas. É necessário definir e implementar um protocolo de aplicação simples sobre UDP para que o cliente requisite arquivos (exemplo de formato de requisição:
GET /nome_do_arquivo.ext).
- Processamento da Requisição:
- Verificar se o arquivo solicitado existe.
- Se o arquivo não existir: enviar uma mensagem de erro claramente definida pelo protocolo para o cliente.
- Transmissão do Arquivo (se existir):
- O arquivo a ser transmitido deve ser relativamente grande (ex: > 1 MB) para justificar a segmentação.
- Segmentação: dividir o arquivo em múltiplos segmentos/pedaços para envio em datagramas UDP.
- Cabeçalho customizado: cada segmento enviado deve conter informações de controle definidas pelo protocolo (ver “Considerações Obrigatórias para o Design do Protocolo” abaixo).
- Retransmissão: implementar lógica para reenviar segmentos específicos caso o cliente solicite (devido a perdas ou erros).
Requisitos do Cliente UDP
- Inicialização: o cliente deve ser executado após o servidor estar ativo.
- Conexão: permitir que o usuário especifique o endereço IP e a porta do servidor UDP ao qual deseja se conectar.
- Requisição: enviar uma requisição ao servidor, utilizando o protocolo de aplicação definido, para solicitar um arquivo específico (exemplo de entrada do usuário:
@IP_Servidor:Porta_Servidor/nome_do_arquivo.ext). - Simulação de Perda: implementar uma opção (ex: via entrada do usuário ou configuração) que permita ao cliente descartar intencionalmente alguns segmentos recebidos do servidor. Isso é crucial para testar o mecanismo de recuperação de dados. A interface deve informar quais segmentos (ex: por número de sequência) estão sendo descartados.
- Recepção e Montagem:
- Receber os segmentos do arquivo enviados pelo servidor.
- Armazenar e ordenar os segmentos recebidos corretamente.
- Verificar a integridade de cada segmento (ex: usando checksum ou resumos criptográficos como MD5 e SHA).
- Verificação e Finalização:
- Após receber todos os segmentos esperados (ou um sinal de fim de transmissão do servidor), verificar a integridade e completude do arquivo.
- Se o arquivo estiver OK: salvar o arquivo reconstruído localmente e informar o sucesso ao usuário. Opcionalmente, apresentar/abrir o arquivo.
- Se o arquivo estiver com erro ou incompleto:
- Identificar quais segmentos estão faltando ou corrompidos.
- Solicitar a retransmissão desses segmentos específicos ao servidor, utilizando o protocolo definido.
- Repetir o processo de recepção e verificação até que o arquivo esteja completo e correto.
- Interpretação de Erros: interpretar e exibir mensagens de erro recebidas do servidor (ex: “Arquivo não encontrado”).
Considerações Obrigatórias para o Design do Protocolo
O aluno deve projetar e justificar as escolhas para os seguintes aspectos do protocolo de aplicação sobre UDP:
- Segmentação e Tamanho do Buffer:
- Como o arquivo será dividido? Qual o tamanho máximo de dados por datagrama UDP (payload)?
- Esse tamanho deve ser fixo ou variável? Como ele se relaciona com o MTU (Maximum Transmission Unit) da rede? (Pesquisar sobre MTU e fragmentação IP.)
- Os buffers de envio (servidor) e recepção (cliente) precisam ter tamanhos relacionados?
- Detecção de Erros:
- Como a integridade dos dados em cada segmento será verificada?
- É necessário implementar um checksum? Qual algoritmo usar? (Ex: CRC32, soma simples.)
- Ordenação e Detecção de Perda:
- Como o cliente saberá a ordem correta dos segmentos? É necessário um número de sequência?
- Como o cliente detectará que um segmento foi perdido (e não apenas atrasado)?
- Controle de Fluxo/Janela (opcional, avançado):
- Considerar como evitar que o servidor envie dados mais rápido do que o cliente consegue processar (um controle de fluxo completo é complexo e pode estar fora do escopo inicial).
- Mensagens de Controle:
- Definir claramente os formatos das mensagens de: requisição de arquivo, envio de segmento de dados (incluindo cabeçalhos com número de sequência, checksum, etc.), confirmação de recebimento (se houver), solicitação de retransmissão e mensagens de erro.
Vídeo de Apresentação
Parte 1: Demonstração Prática da Aplicação
- Inicialização: Mostrar a execução do Servidor e a inicialização do Cliente informando IP e Porta.
- Transferência Padrão: Requisitar um arquivo grande (> 10 MB) existente e demonstrar a transferência ocorrendo do início ao fim com sucesso.
- Simulação de Perda: Ativar no cliente a opção de descartar pacotes específicos (ex: descartar o bloco `3` e o bloco `7`). Mostrar o cliente descartando, o servidor acusando o *timeout* no seu terminal e retransmitindo o bloco até a recepção completa do arquivo.
- Dois clientes simultâneos: Ativar dois cliente baixando dois arquivos diferentes simultaneamente (com tamanho suficiente para ver os dois em paralelo).
- Tratamento de Arquivo Inexistente: Solicitar um arquivo que não existe e mostrar a mensagem de erro formatada no cliente.
- Segurança (Path Traversal): Solicitar um arquivo não autorizados fora da pasta padrão.
Parte 2: Explicação do Código e Defesa Oral Exiba o código-fonte na tela (sem comentários) e explique a lógica implementada. Durante a explicação, você deve responder oralmente às seguintes perguntas conceituais:
- API de Sockets: Mostre no código onde o socket UDP é criado e identifique a constante/parâmetro que garante que ele seja UDP (`SOCK_DGRAM`) e não TCP.
- Tamanho do Buffer e MTU: Qual o tamanho do payload escolhido para cada datagrama e por que ele deve ficar abaixo do limite do MTU (1500 bytes)?
- Mecanismo de Timeout: Mostre a linha exata no código onde o servidor aguarda o `ACK` do cliente e como o estouro do temporizador (*timeout*) é tratado para disparar a retransmissão.
- Verificação de Integridade: Apresente como o *checksum/hash* (MD5, CRC32, etc.) é gerado no servidor, enviado no cabeçalho e recalculado no cliente.
- Segurança (Path Traversal): Indique a linha de código no servidor responsável por sanitizar o nome do arquivo para impedir acessos não autorizados fora da pasta padrão.
Distribuição de Pontos (Total: 10,00)
| Seção | Valor |
|---|---|
| Inicialização & API de Sockets | 1,00 |
| Transferência Padrão & Tamanho do Buffer e MTU | 2,00 |
| Simulação de Perda & Mecanismo de Timeout (Ordenação, Integridade, Recuperação) | 3,00 |
| Dois clientes simultâneos | 2,00 |
| Tratamento de Arquivo Inexistente | 1,00 |
| Segurança (Path Traversal) | 1,00 |
| Total | 10,00 |
- O vídeo não deve ser enviado como arquivo.
- Enviar apenas o link do YouTube como mensagem (comentário particular) na atividade do Classroom.
- O vídeo deve ter no máximo 10 minutos.
- Enviar no Classroom um arquivo .ZIP com todo o código.
- REGRA CRÍTICA DO CÓDIGO NO VÍDEO: Durante a gravação da tela, o código-fonte exibido NÃO PODE CONTER COMENTÁRIOS. A ausência de comentários serve para garantir que a explicação seja autêntica e sem leitura de roteiros.
Dicas de Design do Protocolo
[Num_Sequencia (4 bytes)] + [Checksum (2 bytes)] + [Dados do Arquivo (N bytes)]
../../etc/passwd).
