Buscar

SD 03 - Comunicação entre Processos

Prévia do material em texto

Sistemas Distribuídos
Comunicação entre Processos
Joinvile Batista Junior
UFGD - SD 03 - Joinvile Batista Junior 2
Comunicação entre Processos
 A : Comunicação entre Datagrama x Fluxo
 B : UDP – Comunicação Datagrama, Modelo de Falhas, Uso
 C : TCP – Comunicação Stream (Fluxo), Modelo de Falhas, Uso
 D : Protocolos Requisição Resposta com UDP e TCP
 E : Sockets – com Datagramas e Streams – API Java
 F : Dados Comuns em CORBA
 G : Serialização e Reflexão em Java
UFGD - SD 03 - Joinvile Batista Junior 3
A : Comunicação entre Datagrama x Fluxo
1. Compare Datagrama com Circuito Virtual.
UFGD - SD 03 - Joinvile Batista Junior 4
Datagrama x Fluxo
• Datagrama
– modelo de sistema postal
• rota de cada pacote independe dos demais
• endereçamento individual
– exemplo : protocolo de rede IP
• Circuito Virtual
– modelo do sistema telefônico
• estabelecimento prévio de rota
• caminho dedicado para comunicação
• após o término : conexão é desfeita
– exemplo : protocolo de rede X.25
UFGD - SD 03 - Joinvile Batista Junior 5
B : UDP
1. Comente a utilização da Comunicação Datagrama no UDP.
2. Comente o modelo de falhas do UDP e o que pode ser feito para 
implementar uma comunicação confiável.
3. Comente aplicações que poderiam utilizar UDP. Qual é a atratividade 
do UDP?
UFGD - SD 03 - Joinvile Batista Junior 6
Comunicação Datagrama UDP
• UDP – User Datagram Protocol
– transmite datagrama sem acknowledgement do processo receptor
• Características
– Tamanho de Mensagem
• processo receptor precisa especificar um array de bytes de um 
dado tamanho para receber a mensagem
– se a mensagem for maior é truncada
• tamanho máximo usual : 8 Kbytes
– aplicação deve controlar a quebra para o envio de 
mensagens maiores
– Recepção de qualquer origem
• receive não especifica a origem do datagrama recebido
• responde ao enviador
UFGD - SD 03 - Joinvile Batista Junior 7
Comunicação Datagrama UDP
• Características
– Bloqueio
• sockets normalmente utilizam
– send sem bloqueio
– receive com bloqueio
» receive sem bloqueio é uma opção de implementação
• receive fica bloqueado até a recepção do datagrama
– ou até time-out da recepção
– se processo que invoca receive tem outro trabalho
» deve invocar um thread para executá-lo em paralelo
– Timeout (estouro de temporização)
• pode ser definidos para evitar que um processo fique 
indefinidamente esperando por um datagrama
UFGD - SD 03 - Joinvile Batista Junior 8
Modelo de Falhas do UDP
• falhas do UDP
– falhas por omissão
• mensagens podem ser descartadas devido a erros de 
ckecksum
• ou por falta de espaço disponível no buffer de origem ou de 
destino
– falhas por ordenamento
• aplicativos que utilizam datagramas UDP podem implementar 
comunicação confiável
– falhas de omissão podem ser compensadas por confirmações
– falhas de ordenação podem ser corrigidas por envio de número 
da sequência do pacote da mensagem
UFGD - SD 03 - Joinvile Batista Junior 9
Uso de UDP
• Para algumas aplicações
– é aceitável a ocorrência de falhas ocasionais
– por exemplo
• DNS (Domain Naming Service)
• VOIP
• Atratividade do UDP
– sem o overhead (sobrecarga) associado à garantia de entrega de 
mensagens
• por exemplo: a transmissão de mensagens perdidas no TCP
UFGD - SD 03 - Joinvile Batista Junior 10
C : TCP
1. Comente a utilização da Comunicação Stream (Fluxo) no TCP.
2. Explique o modelo de falhas do TCP. O TCP suporta comunicação 
confiável? Justifique.
3. Comente exemplos de utilização do TCP.
UFGD - SD 03 - Joinvile Batista Junior 11
Comunicação Stream TCP
• TCP – Transfer Control Protocol
– abstração originada no UNIX BSD
• leitura e escrita de stream de bytes com acknowledment
• Características
– Tamanho de Mensagem
• aplicação pode utilizar conjuntos de dados bastante grandes
• mecanismo de implementação do TCP decide quantos pacotes 
para enviar a mensagem
– Modelo para Tratar Falhas
• o enviador mantém um registro de cada mensagem enviada
– o receptor confirma cada mensagem enviada
• se o enviador não recebe a confirmação antes do timeout
– retransmite a mensagem
• checksum para detectar e rejeitar pacotes corrompidos
• número de sequência
– detectar e rejeitar pacotes duplicados
– ordenar pacotes fora de ordem
UFGD - SD 03 - Joinvile Batista Junior 12
Comunicação Stream TCP
• Características
– Fluxo de Controle
• o protocolo TCP tenta casar a taxa de escrita e leitura da 
mensagem
• se o escritor é muito mais rápido que o leitor
– o escritor é bloqueado
» até que o leitor tenha consumido dados suficientes
– Destino das Mensagens
• o par de processos estabelece uma conexão
– através de um connect do cliente e um accept do servidor
» antes de começar a enviar o stream de bytes
• uma vez que a conexão é estabelecida
– os processo simplesmente escrevem e leem no stream
» sem necessidade de usar o endereço Internet e a porta
UFGD - SD 03 - Joinvile Batista Junior 13
Modelo de Falhas do TCP
• garantia de mensagens entregues mesmo quando alguns pacotes 
são perdidos
– integridade: checksum e número de sequência
– validade: timeout
• mas se a perda de pacotes ultrapassar um limite ou a rede for 
rompida (ou seriamente congestionada)
– sem confirmação: conexão será desfeita
• processos que estão utilizando a conexão recebem 
mensagem de erro, mas não conseguem
– distinguir entre falha de rede ou do processo do outro 
lado da conexão
– identificar se as mensagens enviadas foram recebidas
• portanto: não fornece comunicação confiável
– pois não garante a entrega se mensagem diante de todas as 
dificuldades possíveis
UFGD - SD 03 - Joinvile Batista Junior 14
Uso do TCP
• Muitos serviços utilizados frequentemente
– executam sobre conexões TCP com portas reservadas
• Exemplos
– HTTP : protocolo de transferência de hipertexto
• usado para comunicação entre web browsers e web servers
– FTP : protocolo de transferência de arquivos
• permite navegar em diretórios remotos
• e transferir arquivos de um computador a outro
– Telnet : sessão de terminal para um computador remoto
– SMTP : protocolo simples de transferência de mail
UFGD - SD 03 - Joinvile Batista Junior 15
D : Protocolos Requisição Resposta com UDP e TCP
1. Explique os problemas decorrentes do uso de UDP para implementar o 
protocolo Requisição-Resposta. Comente estratégias para solucioná-
los.
2. Explique as vantagens do TCP para implementar o protocolo 
Requisição-Resposta.
UFGD - SD 03 - Joinvile Batista Junior 16
Comunicação Requisição-Resposta (Request-Replay)
Request
ServerClient
doOperation
(wait)
(continuation)
Reply
message
getRequest
execute
method
message
select object
sendReply
• a maioria dos sistemas de RMI e RPC
– é suportada por um protocolo semelhante
UFGD - SD 03 - Joinvile Batista Junior 17
Protocolo Request-Replay: baseado em 3 primitivas
public byte[] doOperation (RemoteObjectRef ref, int methodId, byte[] 
arguments)
• cliente envia uma solicitação para um objeto remoto e recebe uma
resposta (array de bytes)
• os argumentos especificam
– o objeto remoto: especifica endereço IP e porta do servidor
– o método a ser invocado
– e os argumentos do método a ser invocado
public byte[] getRequest ()
• obtém uma solicitação do cliente via porta do servidor
public void sendReply (byte[] reply, InetAddress clientHost, int
clientPort)
• envia uma resposta para o cliente (definido pelo seu endereço
internet e porta)
UFGD - SD 03 - Joinvile Batista Junior 18
Uso de UDP para Protocolo Requisição-Resposta
• Se as 3 primitivas do protocolo Requisição-Resposta forem 
implementadasem datagramas UDP
– sofrerão as mesmas falhas de comunicação
• falhas por omissão de mensagens
• sem garantia de entrega na ordem de emissão das 
mensagens
– além disso falhas do processos podem levar ao colapso: cliente 
permanece aguardando resposta
UFGD - SD 03 - Joinvile Batista Junior 19
Uso de UDP : Estratégias para Solucionar Falhas
• vincular timeout e repetição de mensagens até receber resposta ou 
assumir que atraso é devido à falta de resposta do servidor
• servidor deve então filtrar solicitações duplicadas
• se servidor já tiver enviado resposta ao receber solicitação 
duplicada
– precisará executar a operação novamente
• a menos que tenha armazenado a resposta
– poderá executar novamente se for uma operação idempotente
• pode ser executada repetidamente com o mesmo efeito da 
primeira execução
– idempotente: inserir um elemento em um conjunto
– não idempotente: inserir elemento em uma sequência
• histórico: para servidores que exigem retransmissão de resposta 
sem executar novamente as operações
– somente última mensagem enviada para cada cliente
• tamanho depende do número de clientes
UFGD - SD 03 - Joinvile Batista Junior 20
Uso de TCP para Protocolo Requisição-Resposta
• o tamanho limitado de datagramas não é adequado para RMI
– pois os argumentos ou resultados dos métodos podem ter 
qualquer tamanho
• evitar a implementação de quebra de mensagens é um motivo para 
escolher TCP
• a serialização em Java permite que argumentos e resultados sejam 
enviados por meio de um fluxo contínuo entre cliente e servidor
– permitindo que conjuntos de objetos de qualquer tamanho sejam 
transmitidos de maneira confiável
– se TCP for utilizado, não há necessidade de:
• retransmitir mensagens, filtrar duplicações, utilizar históricos
• as vezes o aplicativo não exige todos os recursos oferecidos pelo 
TCP: um protocolo mais eficiente (UDP) pode ser utilizado
– ex: NFS da Sun transmite mensagens de tamanho fixo e suas 
operações são projetadas para serem idempotentes
UFGD - SD 03 - Joinvile Batista Junior 21
E : Sockets
1. Explique a utilização de Sockets com Datagrama no UDP.
2. Explique a utilização de Sockets com Streams no TCP.
3. Comente a API Java de Sockets com Datagrama.
4. Comente a API Java de Sockets com Streams.
UFGD - SD 03 - Joinvile Batista Junior 22
Abstração de E/S : Sockets
message
agreed port
any port socketsocket
Internet address = 138.37.88.249Internet address = 138.37.94.248
other ports
client server
Sockets
• endereço da máquina destino e número da porta
• transparência de localização através do uso de um servidor 
de nomes
UFGD - SD 03 - Joinvile Batista Junior 23
Socket
• utilizado pela comunicação por datagrama UDP ou fluxo TCP
– originário do UNIX BSD mas presentes no: Linux, Windows, 
Macintosh OS
• abstração de E/S: terminais de um canal de comunicação (sockets)
– transmitir mensagem de um socket para outro
– um processo pode receber mensagens de vários processos na 
mesma porta
• mas não pode compartilhar a porta com outros processos 
para envio
– com exceção dos processos multicast
• Java: classe InetAddress para representar endereços IP
– InetAddress ip = InetAdress.getByName (“ufgd.edu.br”)
UFGD - SD 03 - Joinvile Batista Junior 24
Socket
• Criação
– socket : cria socket
– close : destrói socket
• Cliente
– connect : conecta com servidor
• Servidor
– bind : atribui endereço a socket
– list : espera pedidos de conexão
– accept : estabelece conexão e cria novo socket
• E/S orientada a Fluxo
– read : le stream de bytes
– write : escreve stream de bytes
• E/S orientada a Mensagem (Datagrama)
– send : envia mensagem
– receive : recebe mensagem
UFGD - SD 03 - Joinvile Batista Junior 25
Sockets com Conexão UDP/IP
UFGD - SD 03 - Joinvile Batista Junior 26
Sockets com Datagramas
ServerAddress and ClientAddress are socket addresses
Sending a message Receiving a message
bind(s, ClientAddress)
sendto(s, "message", ServerAddress)
bind(s, ServerAddress)
amount = recvfrom(s, buffer, from)
s = socket(AF_INET, SOCK_DGRAM, 0)s = socket(AF_INET, SOCK_DGRAM, 0)
UFGD - SD 03 - Joinvile Batista Junior 27
Sockets com Conexão TCP/IP
UFGD - SD 03 - Joinvile Batista Junior 28
Sockets com Streams
Requesting a connection Listening and accepting a connection
bind(s, ServerAddress);
listen(s,5);
sNew = accept(s, ClientAddress);
n = read(sNew, buffer, amount)
s = socket(AF_INET, SOCK_STREAM,0)
connect(s, ServerAddress)
write(s, "message", length)
s = socket(AF_INET, SOCK_STREAM,0)
ServerAddress and ClientAddress are socket addresses
UFGD - SD 03 - Joinvile Batista Junior 29
API Java para Datagramas UDP
• DatagramPacket
– mensagem de envio e de recepção
– construtor para envio
• array de bytes da mensagem, tamanho da mensagem, 
endereço Internet do destino, número da porta do destino
– construtor para recepção
• array de bytes para receber a mensagem, tamanho do buffer 
de array de bytes
UFGD - SD 03 - Joinvile Batista Junior 30
API Java para Datagramas UDP
• DatagramSocket
– sockets para enviar e receber datagramas UDP
– construtores
• (número da porta) : específico para um dada porta
• () : sistema escolhe porta local livre
– send (DatagramPacket com mensagem para envio)
– receive (DatagramPacket para receber mensagem)
– setSoTimeout
• método receive ficará bloqueado somente até o tempo 
especificado
• então, tratará a exceção : InterruptedIO Exception
– connect
• usado para conectar para um destino específico
UFGD - SD 03 - Joinvile Batista Junior 31
Cliente UDP
import java.net.*;
import java.io.*;
public class UDPClient{
public static void main(String args[]){ 
// args give message contents and server hostname
DatagramSocket aSocket = null;
try {
aSocket = new DatagramSocket(); 
byte [] m = args[0].getBytes();
InetAddress aHost = InetAddress.getByName(args[1]);
int serverPort = 6789;
DatagramPacket request
= new DatagramPacket(m, args[0].length(), aHost, serverPort);
aSocket.send(request);
byte[] buffer = new byte[1000];
DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
aSocket.receive(reply);
System.out.println("Reply: " + new String(reply.getData()));
}catch (SocketException e){System.out.println("Socket: " + e.getMessage());
}catch (IOException e){System.out.println("IO: " + e.getMessage());}
}finally {if(aSocket != null) aSocket.close();}
} 
}
UFGD - SD 03 - Joinvile Batista Junior 32
Servidor UDP
import java.net.*;
import java.io.*;
public class UDPServer{
public static void main(String args[]){ 
DatagramSocket aSocket = null;
try{
aSocket = new DatagramSocket(6789);
byte[] buffer = new byte[1000];
while(true){
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
aSocket.receive(request); 
DatagramPacket reply = new DatagramPacket(request.getData(), 
request.getLength(), request.getAddress(), request.getPort());
aSocket.send(reply);
}
}catch (SocketException e){System.out.println("Socket: " + e.getMessage());
}catch (IOException e) {System.out.println("IO: " + e.getMessage());}
}finally {if(aSocket != null) aSocket.close();}
}
}
UFGD - SD 03 - Joinvile Batista Junior 33
API Java para Streams TCP
• ServerSocket
– usada pelo servidor para ouvir requisições de conexão de 
clientes em um dada porta
– accept
• permanece bloqueado enquanto a fila estiver vazia
• para um dado requisito de conexão do cliente
– cria uma Thread para tratar conexão com cliente
» Thread cria um Socket para comunicação com 
cliente
UFGD - SD 03 - Joinvile Batista Junior 34
API Java para Streams TCP
• Socket
– utilizado pelo par de processo em conexão
– construtor• cliente cria Socket com DNS e porta do servidor
• construtor também conecta com servidor
– ou ativa UnknownHostException ou IOException
– envio e recepção de stream de dados
• getInputStream
– readUTF : le bytes em String
• getOutputStream
– writeUTF : escreve String em bytes
UFGD - SD 03 - Joinvile Batista Junior 35
Cliente TCP
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main (String args[]) {
// arguments supply message and hostname of destination
Socket s = null;
try{
int serverPort = 7896;
s = new Socket(args[1], serverPort); 
DataInputStream in = new DataInputStream( s.getInputStream());
DataOutputStream out =
new DataOutputStream( s.getOutputStream());
out.writeUTF(args[0]); // UTF is a string encoding see Sn 4.3
String data = in.readUTF();
System.out.println("Received: "+ data) ; 
}catch (UnknownHostException e){
System.out.println("Sock:"+e.getMessage()); 
}catch (EOFException e){System.out.println("EOF:"+e.getMessage());
}catch (IOException e){System.out.println("IO:"+e.getMessage());}
}finally {if(s!=null) try {s.close();}
catch (IOException e) {System.out.println("close:"+e.getMessage());}}
}
}
UFGD - SD 03 - Joinvile Batista Junior 36
Servidor TCP
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main (String args[]) {
try{
int serverPort = 7896; 
ServerSocket listenSocket = new ServerSocket(serverPort);
while(true) {
Socket clientSocket = listenSocket.accept();
Connection c = new Connection(clientSocket);
}
} catch(IOException e) {System.out.println("Listen :"+e.getMessage());}
}
}
UFGD - SD 03 - Joinvile Batista Junior 37
Servidor TCP
class Connection extends Thread {
DataInputStream in;
DataOutputStream out;
Socket clientSocket;
public Connection (Socket aClientSocket) {
try {
clientSocket = aClientSocket;
in = new DataInputStream( clientSocket.getInputStream());
out =new DataOutputStream( clientSocket.getOutputStream());
this.start();
} catch(IOException e) {System.out.println("Connection:"+e.getMessage());}
}
public void run(){
try { // an echo server
String data = in.readUTF();
out.writeUTF(data);
} catch(EOFException e) {System.out.println("EOF:"+e.getMessage());
} catch(IOException e) {System.out.println("IO:"+e.getMessage());}
} finally{ try {clientSocket.close();}catch (IOException e){/*close failed*/}}
}
}
UFGD - SD 03 - Joinvile Batista Junior 38
F : Dados Comuns em CORBA
1. Explique o esquema de representação de dados comuns em CORBA
UFGD - SD 03 - Joinvile Batista Junior 39
Necessidade de Conversão para Envio de Dados
• dados de programas x mensagens
– programas: estruturas de dados
– mensagens: sequências de bytes
• independente da forma de comunicação usada
– estruturas de dados devem ser convertidas em sequências de 
bytes antes da transmissão
– e reconstruídas na chegada
• representação de dados difere nas linguagens e SOs
– números inteiros, ponto flutuante, caracteres (ASCII ou Unicode)
• métodos para troca de dados entre dois computadores
– dados são convertidos para uma formato externo, antes da 
transmissão, e reconvertidos para o formato local, na recepção
– dados são enviados no formato do remetente com a indicação 
do formato
• receptor reconverte se necessário
UFGD - SD 03 - Joinvile Batista Junior 40
Representação de mensagens para envio
• Representação externa de dados
– acordo padrão para representação de estrutura de dados e de valores 
primitivos
• Montagem de um conjunto de dados em um formato adequado para 
transmissão
– Empacotamento (marshalling)
• linearização dos dados
• transformação para formato externo
– Desempacotamento (unmarshalling)
• transformação para o formato local
• fragmentação dos dados ao seu formato original
• Abordagens alternativas para representação externa de dados e 
empacotamento
– binária: CORBA (várias linguagens), Serialização de Objetos em Java
– textual: XML (Web Services), HMTL (protocolo HTTP)
UFGD - SD 03 - Joinvile Batista Junior 41
Representação de Dados Comuns em CORBA
• CDR (Common Data Representation) CORBA
– representação externa para tipos estruturados e primitivos
– passados como argumentos e resultados métodos remotos
– pode ser utilizado por uma variedade de linguagens
• compilador de interface CORBA gera automaticamente as 
operações de empacotamento e de desempacotamento
– apropriadas para os argumentos e resultados dos 
métodos remotos
– tipos de dados descritos no IDL (Interface Definition Language)
• 15 tipos primitivos
• tipos compostos: array, string, struct, enumerado, etc
UFGD - SD 03 - Joinvile Batista Junior 42
G : Serialização e Reflexão em Java
1. Explique o esquema de serialização de dados em Java.
2. Explique como o esquema de reflexão para serialização em Java.
UFGD - SD 03 - Joinvile Batista Junior 43
Serialização de Objetos em Java
• Serialização de objetos em Java
– utilizada somente na linguagem Java
– linearização (flattening) e representação de dados externos
• de um simples objeto ou de um grafo de objetos
– que podem ser transmitidos em uma mensagem
– ou podem ser armazenados em arquivos
• ponteiros do grafo de objetos são convertidos em 
sequências de valores inteiros para transmissão (e 
reconvertidos na recepção)
– dado que os endereços dos ponteiros ocupam distintos 
espaços de endereçamento em cada um dos 
computadores 
– deserialização : processo inverso
UFGD - SD 03 - Joinvile Batista Junior 44
Reflexão em Java
• Java suporta reflexão
– capacidade de obter as propriedades de uma classe: nomes e 
tipos de suas variáveis e métodos
– criação de classe a partir de seu nome
– criação de um construtor com argumentos com determinados 
tipos de dados 
UFGD - SD 03 - Joinvile Batista Junior 45
Classe por nome – Novo objeto da Classe
Obter classe através de seu nome
• Class classe = Class.forName (“nome_classe");
– argumento: nome da classe
– cria objeto da classe java.lang.Class
Obter método de um classe
• Method método = classe.getMethod (“nome_método", null);
– argumentos: nome do método, tipos dos argumentos do método
– cria objeto da classe java.lang.reflect.Method
Criar instância da classe (objeto)
• Object objeto = classe.newInstance();
Invocar o método de um objeto
• método.invoke (objeto, null);
– argumentos: objeto, argumentos do método
– invoca método do objeto
UFGD - SD 03 - Joinvile Batista Junior 46
Classe do objeto
Obter classe através de seu objeto
• Class classe = objeto.getClass ();
Obter método de um classe
• Method método = classe.getMethod (“nome_método", null);
– argumentos: nome do método, tipos dos argumentos do método
– cria objeto da classe java.lang.reflect.Method
Invocar o método de um objeto
• método.invoke (objeto, null);
– argumentos: objeto do método, argumentos do objeto
– invoca método do objeto
UFGD - SD 03 - Joinvile Batista Junior 47
Uso de Reflexão para Serialização em Java
• Reflexão torna possível a serialização (e deserialização) genérica
– não há necessidade de gerar funções de empacotamento 
específicas para tipo de objeto
• como é necessário em CORBA
• Reflexão é utilizada
– na serialização para descobrir
• nome da classe do objeto
• nomes, tipos e valores das variáveis de um objeto (instância 
da classe)
– na deserialização para criar um classe
• e para um construtor com os argumentos correspondentes à
classe serializada
• então, o construtor é utilizado para criar um objeto com as 
variáveis do objeto lido na forma serializada
UFGD - SD 03 - Joinvile Batista Junior 48
Serialização de Objetos em Java
• classe cujos objetos precisam ser serializados
– deve implementar a interface Serializable• public class Classe implements Serializable
• API Java para serializar um grafo de objetos em um arquivo
– cria fluxo de saída de arquivo
• fluxo_saída_arquivo = new FileOutputStream (nome_arquivo
+ extensão_arquivo)
– cria fluxo de saída de objeto
• fluxo_saída_objeto = new ObjectOutputStream (raiz_grafo)
– serializa grafo de objetos em arquivo
• fluxo_saída_objeto.writeObject
– tratar exceções associadas às operações de fluxo de saída
• API Java para deserializar um arquivo em um grafo de objetos
– utilização de fluxo de entrada
• classes: FileInputStream, ObjectInputStream
• método: Object readObject ()

Continue navegando