You are on page 1of 24

Sistemas Distribuídos

Comunicação entre Processos

Joinvile Batista Junior

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

2

A : Comunicação entre Datagrama x Fluxo
1. Compare Datagrama com Circuito Virtual.

UFGD - SD 03 - Joinvile Batista Junior

3

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

4

Joinvile Batista Junior 6 . Comente aplicações que poderiam utilizar UDP. Comente a utilização da Comunicação Datagrama no UDP. Qual é a atratividade do UDP? UFGD .Joinvile Batista Junior 5 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 .B : UDP 1.SD 03 . 3. 2. Comente o modelo de falhas do UDP e o que pode ser feito para implementar uma comunicação confiável.SD 03 .

Joinvile Batista Junior 7 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 .Joinvile Batista Junior 8 .SD 03 .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 .

O TCP suporta comunicação confiável? Justifique. Explique o modelo de falhas do TCP. Comente exemplos de utilização do TCP. 3.Joinvile Batista Junior 9 C : TCP 1. 2.SD 03 .Joinvile Batista Junior 10 . UFGD .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 . Comente a utilização da Comunicação Stream (Fluxo) no TCP.SD 03 .

SD 03 .Joinvile Batista Junior 11 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 .Joinvile Batista Junior 12 .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 13 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 .Joinvile Batista Junior 14 .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.SD 03 .SD 03 . 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 .

Comente estratégias para solucionálos. 2.Joinvile Batista Junior 15 Comunicação Requisição-Resposta (Request-Replay) Client doOperation Server Request message (wait) Reply message getRequest select object execute method sendReply (continuation) • a maioria dos sistemas de RMI e RPC – é suportada por um protocolo semelhante UFGD .D : Protocolos Requisição Resposta com UDP e TCP 1.Joinvile Batista Junior 16 .SD 03 . Explique os problemas decorrentes do uso de UDP para implementar o protocolo Requisição-Resposta. Explique as vantagens do TCP para implementar o protocolo Requisição-Resposta. UFGD .SD 03 .

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.Joinvile Batista Junior 17 Uso de UDP para Protocolo Requisição-Resposta • Se as 3 primitivas do protocolo Requisição-Resposta forem implementadas em 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 . int clientPort) • envia uma resposta para o cliente (definido pelo seu endereço internet e porta) UFGD . InetAddress clientHost.Protocolo Request-Replay: baseado em 3 primitivas public byte[] doOperation (RemoteObjectRef ref.SD 03 .SD 03 .Joinvile Batista Junior 18 .

SD 03 .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 . 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 . não há necessidade de: • retransmitir mensagens.Joinvile Batista Junior 19 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.Joinvile Batista Junior 20 .

Joinvile Batista Junior 22 .SD 03 .SD 03 . Comente a API Java de Sockets com Streams.37. Explique a utilização de Sockets com Datagrama no UDP.Joinvile Batista Junior 21 Abstração de E/S : Sockets 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 socket any port agreed port socket message client server other ports Internet address = 138. 4. 2. Comente a API Java de Sockets com Datagrama.37.94. UFGD .88.E : Sockets 1. 3.249 UFGD .248 Internet address = 138. Explique a utilização de Sockets com Streams no TCP.

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.Socket • • • utilizado pela comunicação por datagrama UDP ou fluxo TCP – originário do UNIX BSD mas presentes no: Linux.br”) UFGD .Joinvile Batista Junior 23 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 .edu. Windows.getByName (“ufgd.Joinvile Batista Junior 24 .SD 03 .

buffer. SOCK_DGRAM. 0) bind(s. ServerAddress) sendto(s. from) ServerAddress and ClientAddress are socket addresses UFGD .Sockets com Conexão UDP/IP UFGD .Joinvile Batista Junior 26 . SOCK_DGRAM.Joinvile Batista Junior 25 Sockets com Datagramas Sending a message Receiving a message s = socket(AF_INET. "message". ClientAddress) bind(s. ServerAddress) amount = recvfrom(s.SD 03 .SD 03 . 0) s = socket(AF_INET.

ServerAddress). buffer.5). length) n = read(sNew. "message". ClientAddress). sNew = accept(s.0) bind(s. write(s.0) connect(s. SOCK_STREAM. ServerAddress) s = socket(AF_INET. listen(s.SD 03 .Joinvile Batista Junior 27 Sockets com Streams Requesting a connection Listening and accepting a connection s = socket(AF_INET. SOCK_STREAM.SD 03 .Joinvile Batista Junior 28 . amount) ServerAddress and ClientAddress are socket addresses UFGD .Sockets com Conexão TCP/IP UFGD .

SD 03 .API Java para Datagramas UDP • DatagramPacket – mensagem de envio e de recepção – construtor para envio • array de bytes da mensagem. endereço Internet do destino. tratará a exceção : InterruptedIO Exception – connect • usado para conectar para um destino específico UFGD .SD 03 . tamanho da mensagem. tamanho do buffer de array de bytes UFGD . número da porta do destino – construtor para recepção • array de bytes para receber a mensagem.Joinvile Batista Junior 29 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.Joinvile Batista Junior 30 .

println("IO: " + e.close().length().net.getMessage()). request.} }finally {if(aSocket != null) aSocket.*. aSocket.getAddress().getLength(). }catch (IOException e) {System.getData())). aSocket. request. while(true){ DatagramPacket request = new DatagramPacket(buffer.Joinvile Batista Junior 32 . aSocket.println("Reply: " + new String(reply. public class UDPServer{ public static void main(String args[]){ DatagramSocket aSocket = null.} } } UFGD . int serverPort = 6789.send(request).io. byte[] buffer = new byte[1000].SD 03 .println("Socket: " + e.Cliente UDP import java.out.send(reply). buffer.getMessage()).SD 03 . import java. }catch (SocketException e){System.} }finally {if(aSocket != null) aSocket.close().println("IO: " + e. byte[] buffer = new byte[1000].getData(). aSocket.out.getMessage()). request. InetAddress aHost = InetAddress. public class UDPClient{ public static void main(String args[]){ // args give message contents and server hostname DatagramSocket aSocket = null. serverPort).*.receive(request).net.getPort()). try{ aSocket = new DatagramSocket(6789). System.out. import java.out. DatagramPacket reply = new DatagramPacket(buffer.println("Socket: " + e. byte [] m = args[0].} } } UFGD . }catch (IOException e){System.*.length).receive(reply).*. aHost.getByName(args[1]). buffer. DatagramPacket request = new DatagramPacket(m. args[0].io.out. try { aSocket = new DatagramSocket().Joinvile Batista Junior 31 Servidor UDP import java. } }catch (SocketException e){System. DatagramPacket reply = new DatagramPacket(request.getMessage()).length).getBytes().

Joinvile Batista Junior 33 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 34 .SD 03 .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 .

} } } UFGD .getMessage()). } } catch(IOException e) {System.net. DataOutputStream out = new DataOutputStream( s.3 String data = in.io. // UTF is a string encoding see Sn 4.net. System. public class TCPClient { public static void main (String args[]) { // arguments supply message and hostname of destination Socket s = null.Joinvile Batista Junior 36 .*.getMessage()).accept(). DataInputStream in = new DataInputStream( s.*.} catch (IOException e) {System.out.} }finally {if(s!=null) try {s.getOutputStream()).close().writeUTF(args[0]).out. serverPort).out.println("close:"+e. ServerSocket listenSocket = new ServerSocket(serverPort).out.out.println("Listen :"+e.println("EOF:"+e.getMessage()). public class TCPServer { public static void main (String args[]) { try{ int serverPort = 7896. }catch (EOFException e){System.*.getMessage()). try{ int serverPort = 7896.out. out. import java.Cliente TCP import java. s = new Socket(args[1]. Connection c = new Connection(clientSocket). }catch (IOException e){System.getMessage()). while(true) { Socket clientSocket = listenSocket.*.println("Received: "+ data) . import java. }catch (UnknownHostException e){ System.Joinvile Batista Junior } 35 Servidor TCP import java.}} } UFGD .println("Sock:"+e.io.println("IO:"+e.readUTF().SD 03 .getInputStream()).SD 03 .

Socket clientSocket.getMessage()).start().println("IO:"+e. } catch(EOFException e) {System.SD 03 .println("EOF:"+e. this.getMessage()). Explique o esquema de representação de dados comuns em CORBA UFGD .}catch (IOException e){/*close failed*/}} } } UFGD .SD 03 .readUTF().out.close().out.println("Connection:"+e.} } finally{ try {clientSocket. } catch(IOException e) {System. in = new DataInputStream( clientSocket. out =new DataOutputStream( clientSocket.getInputStream()). } catch(IOException e) {System.writeUTF(data).getMessage()).Servidor TCP class Connection extends Thread { DataInputStream in.getOutputStream()).Joinvile Batista Junior 38 .} } public void run(){ try { // an echo server String data = in. DataOutputStream out.Joinvile Batista Junior 37 F : Dados Comuns em CORBA 1. public Connection (Socket aClientSocket) { try { clientSocket = aClientSocket.out. out.

e reconvertidos para o formato local.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. Serialização de Objetos em Java – textual: XML (Web Services). antes da transmissão. na recepção – dados são enviados no formato do remetente com a indicação do formato • receptor reconverte se necessário UFGD .Joinvile Batista Junior 40 . caracteres (ASCII ou Unicode) métodos para troca de dados entre dois computadores – dados são convertidos para uma formato externo.Joinvile Batista Junior 39 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).SD 03 . ponto flutuante.SD 03 . HMTL (protocolo HTTP) UFGD .

Joinvile Batista Junior 42 . Explique o esquema de serialização de dados em Java.SD 03 .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. enumerado.SD 03 .Joinvile Batista Junior 41 G : Serialização e Reflexão em Java 1. string. etc UFGD . struct. UFGD . Explique como o esquema de reflexão para serialização em Java. 2.

Joinvile Batista Junior 43 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 .Joinvile Batista Junior 44 .SD 03 .SD 03 .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 .

null).Class Obter método de um classe • Method método = classe.invoke (objeto.getMethod (“nome_método".SD 03 . null). – argumentos: nome do método.lang.reflect. null).forName (“nome_classe").getMethod (“nome_método". – argumentos: nome do método.Method Criar instância da classe (objeto) • Object objeto = classe. Invocar o método de um objeto • método. tipos dos argumentos do método – cria objeto da classe java.newInstance().Classe por nome – Novo objeto da Classe Obter classe através de seu nome • Class classe = Class. Obter método de um classe • Method método = classe.Joinvile Batista Junior 45 Classe do objeto Obter classe através de seu objeto • Class classe = objeto. argumentos do objeto – invoca método do objeto UFGD .reflect. – argumento: nome da classe – cria objeto da classe java.lang. – argumentos: objeto.getClass (). argumentos do método – invoca método do objeto UFGD . – argumentos: objeto do método. tipos dos argumentos do método – cria objeto da classe java.invoke (objeto. null).Method Invocar o método de um objeto • método.Joinvile Batista Junior 46 .lang.SD 03 .

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.Joinvile Batista Junior 47 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.SD 03 .SD 03 .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.Joinvile Batista Junior 48 . o construtor é utilizado para criar um objeto com as variáveis do objeto lido na forma serializada UFGD . 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. ObjectInputStream • método: Object readObject () UFGD .