User Datagram Protocol UDP: Protocolo utiliza para distinguir para qual usuário ou aplicativo deve ser encaminhado um datagrama destinado a uma máquina que esteja executando mais de um processo. Problemas: Os processos são criados e destruídos dinâmicamente e os transmissores raramente sabem o bastante para identificar um processo de uma outra máquina. Deseja-se substituir os processos (no caso de uma reinicialização da máquina) sem informar a todos os transmissores. Como permitir que um transmissor entre em contato com um servidor (de arquivos, por exemplo) sem saber qual processo na máquina de destino.
Solução: User Datagram Protocol Portas de protocolo: São pontos de destino abstratos, identificadas por um número inteiro positivo. Elas utilizam buffer, que modo que os dados que chegarem antes que um processo esteja pronto para aceitá-los não sejam perdidos. Os buffers são implementados como filas. Para comunicar-se com uma porta exterior, um transmissor precisa conhecer tanto o endereço IP como o número da porta na máquina de destino. Além da porta de destino, uma mensagem UDP deve ter também a informação sobre a porta de origem para onde as respostas deverão ser endereçadas.
User Datagram Protocol Assim como o IP, o UDP oferece um serviço não-confiável de transmissão sem conexão. Desta forma, fica a cargo do aplicativo resolver o problema da confiabilidade, como perda de mensagens, duplicação, retardo, transmissão defeituosa e perda de conectividade. Formato de mensagens UDP: O campo Comprimento contém o número de octetos na mensagem UDP O campo Soma de Verificação é opcional, pois evita overhead em redes de alta confiabilidade.
User Datagram Protocol Pseudocabeçalho UDP Tem como finalidade verificar se a mensagem UDP atingiu o seu destino correto. O destino correto consiste em uma máquina específica e uma porta específica dentro desta máquina. O pseudocabeçalho não é transmitido junto como a mensagem UDP, mas a soma de verificação o abrange. No destino final, o pseudocabeçalho é remontado a partir do datagrama IP
User Datagram Protocol Colocação conceitual em camadas Encapsulamento UDP
User Datagram Protocol Contradição entre organização em camadas e o cálculo da soma de verificação UDP. Multiplexação: O software UDP aceita mensagens de muitos programas aplicativos e os passa ao IP. Demultiplexação: E aceita mensagens UDP recebida de IP e as passa ao programa aplicativo apropriado. Quando o UDP recebe uma mensagem, verifica se o número da porta de destino confere com uma das portas atualmente em uso. Se não houver correspondência, a mensagem é descartada e uma mensagem de erro é enviada. Caso contrário, o UDP enfileira a mensagem na porta apropriada. Se não houver espaço na fila, a mensagem é descartada e uma mensagem de erro é gerada.
User Datagram Protocol
User Datagram Protocol Como deverão ser atribuídos números de porta de protocolo? 1. Uso de autoridade central que atribua números de portas de acordo com a necessidade e publique a lista. 2. Atribuição dinâmica: Sempre que um programa necessita de uma porta, o software de rede atribui uma. Para saber que número de porta a máquina de destino está usando, o emissor enviar uma mensagem perguntando: que porta o serviço X está usando? O TCP/IP usa uma abordagem híbrida. Algumas portas são atribuídas a priori e outras são deixadas a cargo dos aplicativos.
UDP: Programação Socket Interação Cliente/Servidor usando UDP: Servidor Cria Socket: socketservidor = DatagramSocket() Lê mensagem de socketservidor Cliente Cria Socket: socketcliente = DatagramSocket() Cria endereço: host, porta de origem. Envia mensagem em socketcliente Lê resposta de socketcliente Escreve resposta em socketservidor Fecha socketcliente
Programação Socket com UDP: Exemplo usando JAVA import java.io.*; import java.net.*; public class ClienteUDP { public static void main(string argv[]) throws Exception { int porta; byte[] dadosenviados; byte[] dadosrecebidos = new byte[1024]; String frase = null; String frasemodificada = null; //argv[1] contem o numero da porta do servidor no host porta = (new Integer(argv[1])).intValue(); //Cria Stream de entrada. Redireciona entrada do teclado BufferedReader entradadousuario = new BufferedReader(new InputStreamReader(System.in)); //Cria socket cliente DatagramSocket socketcliente = new DatagramSocket(); //Localiza o host especificado na linha de comando. //A classe InetAddress contem as informacoes de end. IP do host InetAddress enderecoip = InetAddress.getByName(argv[0]);
Programação Socket com UDP: Exemplo usando JAVA //Le frase do teclado frase = entradadousuario.readline(); dadosenviados = frase.getbytes(); //Cria datagrama de envio. Em JAVA, a classe DatagramPacket e' usada para //conter as informacoes do datagrama. Estas informacoes sao: array de //bytes (dadosenviados), comprimento do array, endereco IP do destino, //porta UDP do destino. DatagramPacket datagramaenviado = new DatagramPacket(dadosEnviados, dadosenviados.length, enderecoip, porta); //Envia datagrama para servidor socketcliente.send(datagramaenviado); //Espera resposta do servidor //Cria datagrama para receber mensagem do servidor DatagramPacket datagramarecebido = new DatagramPacket(dadosRecebidos, dadosrecebidos.length); //Recebe datagrama do servidor socketcliente.receive(datagramarecebido); //Imprime resultado frasemodificada = new String(datagramaRecebido.getData()); System.out.println(enderecoIP.getHostName() + " : " + frasemodificada); //Fecha socket socketcliente.close();}}
Programação Socket com UDP: Exemplo usando JAVA import java.io.*; import java.net.*; import java.util.*; public class ServidorUDP { public static void main(string argv[]) throws Exception { byte[] dadosenviados; byte[] dadosrecebidos = new byte[1024]; String frase, frasemodificada; InetAddress enderecoipdocliente; int portadocliente; //Cria socket UDP na porta 6789 DatagramSocket socketservidor = new DatagramSocket(6789); while(true) { //Cria datagrama para receber mensagem do cliente DatagramPacket datagramarecebido = new DatagramPacket(dadosRecebidos, dadosrecebidos.length); //Recebe datagrama socketservidor.receive(datagramarecebido);
Programação Socket com UDP: Exemplo usando JAVA //O servidor deve obter o endereco IP do cliente e a porta UDP de origem. //Isto se deve ao fato do protocolo UDP ser sem conexao, ou seja, cada pacote //enviado deve conter o endereco do destino. enderecoipdocliente = datagramarecebido.getaddress(); portadocliente = datagramarecebido.getport(); //Executa o processamento. Neste caso, converte a frase para letras maiusculas frase = new String(datagramaRecebido.getData()); System.out.println(enderecoIPDoCliente.getHostName() + " : " + frase); frasemodificada = frase.touppercase(); //Prepara resposta para ser enviada ao cliente //Converte String para byte[] dadosenviados = frasemodificada.getbytes(); //Cria datagrama para enviar a resposta ao cliente DatagramPacket datagrama = new DatagramPacket(dadosEnviados, dadosenviados.length, enderecoipdocliente, portadocliente); //Envia resposta para o cliente socketservidor.send(datagrama); } } } //Para assegurar que nenhuma parte da mensagem anterior continue presente, // preencha o buffer de dados recebidos com 0. Arrays.fill(dadosRecebidos, (byte)0);
Programação Socket com UDP Resumo dos métodos utilizados: Class DatagramSocket void close() : Fecha o socket UDP. void connect(inetaddress address, int port) : Conecta o socket a um endereço remoto. void disconnect() : Desconecta o socket. InetAddress getinetaddress() : Retorna o endereço ao qual este socket esta conectado. InetAddress getlocaladdress() : Obtém o endereço local, ao qual o socket esta associado. int getlocalport() : Retorna o número da porta a qual o socket esta associado. int getport() : Retorna a porta remota deste socket. void receive(datagrampacket p) : Recebe um datagrama. void send(datagrampacket p) : Envia um datagrama. voidsetsotimeout(int timeout) : Habilita/Desabilita SO_TIMEOUT, para o tempo timeout, em milisegundos. Este é o máximo tempo que o método receive irá esperar por datagrama.