Dúvida sobre tamanho de pacote UDP com a classe Datagram Socket

6 respostas
I

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á. :slight_smile:

6 Respostas

M

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

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

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

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

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

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.

Criado 19 de abril de 2011
Ultima resposta 19 de abr. de 2011
Respostas 6
Participantes 3