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.
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.
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)?
Este 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 (embora um controle de fluxo completo seja complexo e possa 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.
Roteiro para Vídeo de Apresentação
No inicio do vídeo deve mostrar todos os itens obrigatórios funcionando no programa.
Na segunda parte do vídeo deve ser explicado cada item como foi implementado no código (Comentando o código).
Itens Obrigatórios a Demonstrar e Explicar:
Ambiente e Setup:
Mostrar a execução do Servidor UDP.
Mostrar a execução do(s) Cliente(s) UDP.
Demonstrar como o cliente especifica/obtém o endereço IP e a porta do servidor.
Mostrar que a implementação utiliza a
API de Sockets diretamente, sem bibliotecas de abstração UDP.
Protocolo de Aplicação e Requisição:
Demonstrar o cliente requisitando arquivos ao servidor usando o protocolo de aplicação proposto (Ex: GET /nome_arquivo).
Mostrar o cliente requisitando com sucesso arquivos diferentes (pelo menos dois).
Transferência e Segmentação:
Demonstrar a transferência de um arquivo grande (ex: > 10
MB).
Explicar e demonstrar como o arquivo é dividido em segmentos (chunks) para transmissão via UDP.
Informar qual o tamanho do buffer/segmento de dados utilizado.
Explicar brevemente a influência do tamanho do segmento e sua relação com o MTU (Maximum Transmission Unit).
Mecanismos de Confiabilidade (Demonstrar e Explicar):
Ordenação: Mostrar como os números de sequência são usados para ordenar os segmentos no cliente e detectar perdas.
Integridade:
Demonstrar o uso de checksum ou hash (MD5/SHA) para verificar a integridade dos segmentos recebidos. Indicar qual método foi usado.
Mostrar o processo de montagem e conferência do arquivo completo no cliente após o recebimento.
Recuperação de Erros/Perdas:
Simular a perda de pacotes: Demonstrar um mecanismo (idealmente no cliente ou simulado) que cause a perda de segmentos durante a transmissão. (Nota: O requisito original mencionava o servidor descartando, o que é incomum. É mais didático simular a perda na rede ou no cliente para testar a recuperação).
Mostrar o cliente detectando a falta de segmentos (por timeout, NACKs, ou análise de sequência).
Demonstrar o cliente solicitando a retransmissão dos segmentos faltantes/corrompidos ao servidor.
Explicar o mecanismo usado para disparo da retransmissão (Ex: timer de timeout, ACKs/NACKs).
Tratamento de Erros do Servidor:
Demonstrar o cenário em que o cliente requisita um arquivo inexistente.
Mostrar o servidor enviando uma mensagem de erro definida no protocolo.
Mostrar o cliente recebendo e apresentando o erro de forma clara (Ex: “Erro: Arquivo não encontrado”).
Mencionar/Demonstrar outros erros tratados, se houver.
Cenários de Teste Específicos:
Demonstrar o servidor lidando com dois clientes simultâneos requisitando arquivos diferentes.
Mostrar o que acontece se o cliente tentar conectar antes do servidor ser iniciado (demonstrar o erro resultante).
Mostrar o que acontece se o servidor for interrompido durante uma transferência (demonstrar o comportamento do cliente - ex: timeout, erro).
O aluno deve:
colocar no Classroom um arquivo .ZIP com todo o código,
enviar como mensagem (Comentários particulares) o link do vídeo
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 deve ser anexado como link nos comentários da entrega dentro da atividade do classroom.
NÃO deve ser enviado o arquivo do video!