User Datagram Protocol - intranet.ifs.ifsuldeminas.edu.br€¦ · • Pseudocabeçalho UDP •Tem...
Transcript of User Datagram Protocol - intranet.ifs.ifsuldeminas.edu.br€¦ · • Pseudocabeçalho UDP •Tem...
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.
User Datagram Protocol
• Solução:
• 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
• Encapsulamento UDP
• Colocação conceitual em camadas
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
Cliente
Cria Socket:
socketServidor =
DatagramSocket()
Lê mensagem de
socketServidor
Escreve resposta
em socketServidor
Cria Socket:
socketCliente =
DatagramSocket()
Cria endereço: host, porta de
origem. Envia mensagem
em socketCliente
Lê resposta de socketCliente
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.