Dúvida sobre tamanho de pacote UDP com a classe Datagram Socket
6 respostas
I
isaiasfrederick
E aí galera? Aqui na faculdade meu professor de Redes deu como trabalho implementar um protocolo confiável na camada de aplicação de um chat, semelhante ao MSN: possuímos o IP do servidor e obtemos a lista de usuários online, ao clicar no contato o servidor retorna o IP do usuário e fazemos a conexão com o outro cliente) logo usamos pacotes de datagramas na implementação. Assim, vamos utilizar os primeiros caracteres das strings enviadas para implementar o protocolo. Só que surgiu uma dúvida:
Um objeto da classe DatagramPacket implementa fielmente o tamanho e as unidades enviadas de pacotes na rede? Ou seja, UM objeto DatagramSocket enviado no programa é realmente enviado um ÚNICO pacote ou é apenas uma abstração?
Afinal, caso se um DatagramPacket corresponda a mais de um pacote “real” vou ter que implementar meu protocolo nesses “pacotes reais”, o que torna meu trabalho infinitamente mais difícil levando em consideração que sou um iniciante em Java (não em programação) e obviamente compreender bem a API faz-se ainda mais necessário pra mim.
Qualquer ajuda/sugestão (até mesmo além da minha dúvida) é sempre bem vinda. Grato desde já.
Pela pequena experiência que tive, você define o tamanho do pacote que será enviado e o cliente vai tratar esses dados.
Acredito que o melhor seria você usar um tamanho fixo para os pacotes enviados ou colocar identificadores pra poder tratar.
Por exemplo: O primeiro byte do pacote ser o tipo de dado e ter um valor inteiro. Dependendo do valor, o cliente identifica e sabe o tamanho do pacote.
V
ViniGodoy
O tamanho do pacote UDP é fixo.
Aqui tem um chat de exemplo, usando UDP. As classes já implementam algum tipo de segurança, embora o que o seu professor queira seja um pouco mais complicado do que o que tem aqui:
Eu sugeriria que você estudasse o funcionamento do TCP a fundo. Pegue o livro do Tanembaum, e entenda como o TCP funciona em cada camada. Como ele garante confiabilidade através de retransmissão, confirmação. Entenda o que é o protocolo de janela deslizante, como ele faz a divisão de pacotes em datagramas, pois você precisará implementar tudo isso no braço.
Já vou adiantando. Para fazer bem bonitinho, como o messenger, não é uma tarefa fácil.
Você terá que estudar bastante e dificilmente encontrará algo similar na internet.
M
mike_x
Viny, a pequena experiência que tive com sockets UDP foi com C# e não tive tanto tempo pra estudar, apesar de ter que implementar retransmissão e confirmação de entrega na aplicação.
Quanto ao tamanho, quando não preencho o tamanho completo do pacote, o protocolo completa esse pacote com bytes aleatórios e/ou bytes “vazios”?
Já ouvi falar muito bem do livro do Tanembaum, mas na época meu professor de redes recomendou o livro do Kurose por ser mais didático e na época era apenas pra estudar pra matéria da faculdade.
Quanto a encontrar algo na internet, foi realmente difícil encontrar algo falando sobre fazer isso em C# e quando procurei, não encontrei nenhum profissional que já tivesse feito isso. Eles sempre diziam que era muito específico. Espero que seja mais fácil em Java.
V
ViniGodoy
Na verdade, o UDP tem um campo para o tamanho da mensagem, e é nele que ele se baseia. O que eu quis dizer, é que esse tamanho é limitado em 16k (relendo aqui eu me expressei mesmo muito mal).
Eu nunca implementei exatamente esse software, mas como já trabalhei por muitos anos com redes (6 anos na Siemens, 4 anos na VISA) tenho uma noção bastante clara do que deve ser feito para realizar esse trabalho.
V
ViniGodoy
Sim. No caso do UDP, não existe divisão em multiplos pacotes. Cada pacote enviado corresponde a um pacote de rede.
Agora cuidado. O UDP não dá garantia nem de ordem, nem de integridade, e nem que esse pacote chegará.
A garantia de integridade é feita por um checksum de 16 bits. Se ele estiver implementado no seu roteador, ele “engolirá” pacotes errados, sem nenhum tipo de aviso. Se ele não estiver implementado (pq é opcional), vai chegar um pacote inválido.
V
ViniGodoy
Ah, um detalhe útil. Quando for fazer programas envolvendo protocolos, procure usar o wireshark: http://www.wireshark.org/
Ele permite que vc veja os dados trafegando pelo canal.