Baixe o app para aproveitar ainda mais
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 ()
Compartilhar