User Tools

Site Tools


cursos:icsr30:trab2

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.
Diferente do TCP, o UDP não possui conexão (listen/accept). Comece entendendo a API básica:
O aluno deve usar Socket UDP e não pode usar bibliotecas que mascarem o trabalho.

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”).
Para agilizar a verificação de integridade, utilize somas de verificação (checksums) ou resumos criptográficos como MD5 e SHA.

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

O vídeo deve ser dividido estritamente em duas partes:

Parte 1: Demonstração Prática da Aplicação

  1. Inicialização: Mostrar a execução do Servidor e a inicialização do Cliente informando IP e Porta.
  2. Transferência Padrão: Requisitar um arquivo grande (> 10 MB) existente e demonstrar a transferência ocorrendo do início ao fim com sucesso.
  3. 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.
  4. Dois clientes simultâneos: Ativar dois cliente baixando dois arquivos diferentes simultaneamente (com tamanho suficiente para ver os dois em paralelo).
  5. Tratamento de Arquivo Inexistente: Solicitar um arquivo que não existe e mostrar a mensagem de erro formatada no cliente.
  6. 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:

  1. 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.
  2. 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)?
  3. 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.
  4. Verificação de Integridade: Apresente como o *checksum/hash* (MD5, CRC32, etc.) é gerado no servidor, enviado no cabeçalho e recalculado no cliente.
  5. 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
Lembre-se: o vídeo deve ser uma demonstração prática, complementada por explicações claras sobre o funcionamento e as decisões de projeto.
  • 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.
ALERTA DE IA: Qualquer vestigio que mostre que o código foi gerado por IA o trabalho receberá nota zero.

Dicas de Design do Protocolo

Stop-and-Wait A forma mais simples de garantir confiabilidade é o protocolo Stop-and-Wait: o servidor envia o Bloco 1 e para. Ele só envia o Bloco 2 quando receber um “ACK 1” do cliente. Se um cronômetro (timeout) estourar, o servidor reenvia o Bloco 1.
Estrutura do Pacote Como o UDP não tem cabeçalhos de controle de fluxo, você deve criar o seu. Exemplo de payload UDP: [Num_Sequencia (4 bytes)] + [Checksum (2 bytes)] + [Dados do Arquivo (N bytes)]
ALERTA DE SEGURANÇA (parte da nota “Design do Protocolo e Segurança” — vale 1,00) Assim como em sistemas reais, o seu servidor não deve permitir que o cliente acesse arquivos fora da pasta designada. O código deve sanitizar o nome do arquivo para impedir ataques de Path Traversal (ex: requisições do tipo ../../etc/passwd).

Referências

cursos/icsr30/trab2.txt · Last modified: 2026/09/25 17:50 by fonseca