Você está na página 1de 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


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


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


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 9

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 10


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


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


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 15

Comunicação Requisição-Resposta (Request-Replay)


Client Server

Request
doOperation
message getRequest
select object
(wait) execute
Reply method
message sendReply
(continuation)

• a maioria dos sistemas de RMI e RPC


– é suportada por um protocolo semelhante

UFGD - SD 03 - Joinvile Batista Junior 16


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


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 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, 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 20


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 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

agreed port
socket any port socket

message
client server
other ports
Internet address = 138.37.94.248 Internet address = 138.37.88.249

UFGD - SD 03 - Joinvile Batista Junior 22


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 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 - Joinvile Batista Junior 24


Sockets com Conexão UDP/IP

UFGD - SD 03 - Joinvile Batista Junior 25

Sockets com Datagramas

Sending a message Receiving a message

s = socket(AF_INET, SOCK_DGRAM, 0) s = socket(AF_INET, SOCK_DGRAM, 0)

bind(s, ClientAddress) bind(s, ServerAddress)

sendto(s, "message", ServerAddress) amount = recvfrom(s, buffer, from)

ServerAddress and ClientAddress are socket addresses

UFGD - SD 03 - Joinvile Batista Junior 26


Sockets com Conexão TCP/IP

UFGD - SD 03 - Joinvile Batista Junior 27

Sockets com Streams

Requesting a connection Listening and accepting a connection

s = socket(AF_INET, SOCK_STREAM,0) s = socket(AF_INET, SOCK_STREAM,0)

bind(s, ServerAddress);
listen(s,5);
connect(s, ServerAddress)
sNew = accept(s, ClientAddress);
write(s, "message", length) n = read(sNew, buffer, amount)

ServerAddress and ClientAddress are socket addresses

UFGD - SD 03 - Joinvile Batista Junior 28


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 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, tratará a exceção : InterruptedIO Exception
– connect
• usado para conectar para um destino específico

UFGD - SD 03 - Joinvile Batista Junior 30


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 31

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 32


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 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


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 35

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 36


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 37

F : Dados Comuns em CORBA

1. Explique o esquema de representação de dados comuns em CORBA

UFGD - SD 03 - Joinvile Batista Junior 38


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 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), Serialização de Objetos em Java
– textual: XML (Web Services), HMTL (protocolo HTTP)
UFGD - SD 03 - Joinvile Batista Junior 40
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 41

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 42


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


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 45

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 46


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 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.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 ()
UFGD - SD 03 - Joinvile Batista Junior 48