Buscar

Topicos_Avançados_em_Tecnologia_06 (3)

Prévia do material em texto

Tópicos 
Avançados em 
Tecnologia da 
Informação
PROGRAMAÇÃO 
DISTRIBUÍDA
BELO HORIZONTE 2018
FI
CH
A
 T
ÉC
N
IC
A FUMEC VIRTUAL SETOR DE 
EDUCAÇÃO A DISTÂNCIA
Gestão Pedagógica
Coordenação
Gabrielle Nunes Paixão
Transposição Pedagógica
Viviane Vieira
Produção de 
Design Multimídia
Coordenação
Rodrigo Tito M. Valadares
Design Multimídia
Therus Santana
Infra-Estrututura e Suporte
Coordenação
Anderson Peixoto da Silva
AUTORIA 
Prof. Flávio Velloso Laper
APRESENTAÇÃO
B em vindo de volta!
Nesta etapa, iniciaremos o estudo da programação distribuída propriamente dita. Iremos 
nos concentrar nos programas que trocam informações e se coordenam através do envio 
de mensagens pela rede em uma primitiva denominada monitor. Mais especificamente, 
como esse será o tema das etapas seguintes, iremos inicialmente recordar alguns concei-
tos básicos de redes, examinar uma classe Java para manipular endereços IP e examinar 
algumas características básicas dos protocolos UDP e TCP, ambos da camada de trans-
porte da Internet.
OBJETIVOS DE APRENDIZAGEM
Ao final do módulo, espera-se que o aluno seja capaz de:
• Conceituar endereço, endereço IP, hostname e servidor DNS.
• Conhecer as características e os métodos fundamentais da classe InetAddress.
• Conhecer os principais protocolos da camada de transporte da Internet (UDP e TCP), 
sabendo enumerar suas características básicas e principais aplicações.
• Definir soquete e conhecer sua função no âmbito da programação distribuída.
PROGRAMAÇÃO DISTRIBUÍDA
Conceitos Básicos
Até agora, temos nos concentrado em sistemas paralelos. Nesta etapa, passaremos a 
tratar dos sistemas distribuídos propriamente ditos. Lembre-se que, tal como definimos 
anteriormente, em um sistema distribuído não dispomos de memória compartilhada, e 
toda comunicação e coordenação são feitas através de troca de mensagens na rede.
Iremos estudar quatro formas de implementar a comunicação distribuída via rede: utilizan-
do os protocolos UDP e TCP, através de invocação remota de métodos, e usando mensa-
geria, que permite realizar uma troca de mensagens assíncrona pela utilização de filas de 
mensagens. Entretanto, vamos iniciar recordando alguns conceitos básicos de redes que 
serão utilizados nas discussões posteriores.
ALGUNS CONCEITOS BÁSICOS
Para que um processo (ou thread) possa se comunicar com outro através de troca de 
mensagens, é necessário que exista uma forma de permitir que os extremos da comuni-
cação se identifiquem. Quando os processos estão em hosts diferentes, um identificador 
numérico único denominado endereço permite que as mensagens encontrem seu caminho 
até o destinatário. Ou seja: cada componente da rede recebe um número identificador 
único, e este número é utilizado para rotear mensagens até o componente desejado. 
Tem-se então:
Endereço: identificador único de um host em uma rede.
Em nossas discussões, iremos nos concentrar em protocolos da pilha de protocolos da 
Internet (ou em serviços que rodem utilizando esses protocolos). Nas redes baseadas nos 
protocolos da Internet, um endereço é denominado endereço IP, que é um número de 32 
bits geralmente escrito na forma 999.999.999.999, onde “999” representa o conteúdo 
de cada um dos octetos que compõem o endereço. Então:
Programação Distribuída 7
Endereço IP: identificador utilizado pelo protocolo IP. É um número de 32 bits escrito na 
forma 999.999.999.999.
Entretanto, seres humanos não lidam com facilidade com endereços numéricos. Para faci-
litar a manipilação e memorização de endereços por pessoas, é preferível utilizar strings 
pronunciáveis. Assim, é costume identificar hosts por nomes denominados hostnames:
Hostname: Identificador de um host na forma de uma string legível por humanos.
Mas a utilização de hostnames é apenas para nossa conveniência, embora existe um 
mapeamento entre hostnames e endereços. É necessário dispor de um serviço que faça a 
tradução entre um dado hostname e o endereço correspondente. Existem vários serviços 
desse tipo; no caso da Internet, esta função é executada pelos Servidores DNS:
Servidor DNS: Domain Name System: serviço que converte um hostname para um ende-
reço IP.
Esses conceitos serão suficientes para nossas discussões iniciais. Outros, mais específi-
cos, serão tratados à medida que surgir a necessidade.
A CLASSE InetAddress
Acabamos de ver que o endereço IP é um conceito básico, que será utilizado (direta 
ou indiretamente) em todos os nossos métodos de comunicação distribuída. Como ele 
é apenas um valor numérico de 32 bits, poderíamos representá-lo em nossos progra-
mas com uma simples variável inteira. Entretanto, dada sua importância, dispomos em 
Java de uma classe para armazenar e manipular endereços IP. Essa classe denomina-se 
InetAddress e seus principais métodos estão listados a seguir:
• public static InetAddress getByName(String name): retorna um objeto descrevendo 
o endereço IP do host de nome name.
• public static InetAddress getByAddress(byte[] addr): retorna um objeto descrevendo 
o endereço IP do host cujo número IP é descrito pelos (quatro) bytes de addr.
• public static InetAddress getLocalHost(): retorna um objeto descrevendo o endereço 
IP do host local.
• public String getHostAddress(): retorna uma string com endereço IP formatado 
como “999.999.999.999”.
• public String getHostName(): retorna o \emph{hostname} do endereço IP.
• public byte[] getAddress(): retorna o número IP em um vetor de quatro bytes.
Os três primeiros itens acima mostram como criar um novo objeto InetAddress a partir 
de um hostname, a partir de um endereço numérico na forma de um vetor de quatro 
bytes, cada um contendo um octeto do endereço, ou simplesmente retornando o ende-
reço da máquina hospedeira. Repare que objetos desse tipo não são criados da forma 
usual, através de construtores, mas utilizando os métodos acima. Os demais métodos 
permitem retornar informações úteis a respeito do endereço armazenado. Note que esta 
classe fornece alguns serviços sofisticados, que de outra forma deveriam ser realizados 
manualmente. Por exemplo, é possível criar um objeto através do hostname (utilizando o 
método getByName()) e depois recuperar o endereço IP correspondente com o método 
getHostAddress(). Ou seja: a classe acessa algum serviço que faça a tradução entre o 
hostname e o endereço associado, praticamente sem nenhum esforço de programação. 
Essa é a vantagem de utilizar uma classe específica no lugar de simplesmente armazenar 
o endereço como um mero inteiro.
Como esta é meramente uma classe auxiliar, exemplos específicos de utilização serão 
postergados para as discussões dos protocolos de comunicação. Obviamente, InetAddress 
tem diversos outros métodos; consultar a documentação oficial para maiores detalhes.
Programação Distribuída8
OS PROTOCOLOS UDP E TCP
Neste curso, os protocolos da Internet serão utilizados para mediar a comunicação entre 
os diversos nodos do sistema. Iremos trabalhar na camada de transporte. Há dois proto-
colos principais nessa camada para o envio e recepção de mensagens: UDP e TCP. Ambos 
são suportado pelo protocolo IP, que roda na camada de rede. Já vimos acima que o iden-
tificador da camada de rede é um número de 32 bits denominado endereço IP. Entretanto, 
como todo protocolo, UDP e TCP também precisam identificar os nodos componentes de 
suas redes. No caso da camada de transporte, esse identificador é um campo numérico 
de 16 bits denominado port (porta).
Você pode estar se perguntando por que precisamos de dois protocolos na camada de 
transporte, e se não há sobreposição entre eles. A resposta é que, embora ambos estejam 
no mesmo nível, eles têm características diferentes e prestam-se a aplicações distintas. 
As características principais desses protocolos estão listadas a seguir:
• UDP (User Datagram Protocol): é um protocolo simples e não confiável, que não 
utiliza conexões nem fornece garantia de entrega ou ordenação de mensagens (ou 
seja, não garante que as mensagens serão entreguesna ordem correta, e nem 
mesmo que chegarão a ser entregues). Sua grande vantagem é a eficiência. UDP 
trabalha enviando pacotes de tamanho conhecido denominado datagramas
• TCP (Transmission Control Protocol): protocolo confiável e orientado a conexão: 
um mecanismo de handshaking encarrega-se do estabelecimento da conexão para 
permitir uma comunicação confiável, onde todas as mensagens têm garantia de 
entrega e ordenação. É menos eficiente que UDP e trabalha com o conceito de 
fluxos de bytes (sem início e fim definidos).
Repare que UDP e TCP têm características praticamente complementares: um é mais 
eficiente, outro é mais confiável. TCP trabalha com conexões, UDP não utiliza esse 
conceito. UDP troca mensagens através do envio de pacotes com tamanho conhecido, 
que devem ser endereçados individualmente; TCP, uma vez estabelecida a conexão, troca 
mensagens através de fluxos de bytes, sem necessidade de endereçamento individual ou 
de especificação de tamanhos. A opção por um ou outro deve basear-se nessa caracte-
rística. Em geral, UDP pode ser utilizado sempre que a eficiência for um critério importan-
te, e a aplicação possa suportar eventuais perdas de pacotes de informação sem que a 
aplicação como um todo fique compromentida, tal como em um vídeo conferência. Se a 
confiabilidade e a segurança forem fatores cruciais, a opção deve ser pelo TCP.
Apesar das diferenças, há também alguns conceitos comuns bastante importantes. O 
primeiro é a utilização de um número de porta como identificador, tal como observado 
acima. Este número de porta trabalha junto com o endereço IP para levar uma mensagem 
até o destino desejado. O endereço IP, na camada de rede, encarrega-se de encaminhar 
a mensagem até o host do destinatário; uma vez lá, a porta encarrega-se de selecionar, 
dentre os serviços ativos naquele host aquele que deve receber a mensagem.
Esta última ideia é a base de outro conceito importantíssimo, comum aos dois protocolos: 
o conceito de socket (soquete). Um soquete representa um ponto de comunicação em um 
programa distribuído: é através deve que mensagens são enviadas ou recebidas através 
da rede. Uma das primeiras tarefas de uma aplicação distribuída é criar seu soquete, seu 
ponto de comunicação. Um soquete é caracterizado por um par IP/porta: como acaba-
mos de ver, essas são as duas informações necessárias para rotear uma mensagem até 
o destino pretendido. Java fornece classes específicas para a criação de soquetes que 
trabalhem com os protocolos UDP ou TCP. A utilização dessas classes é objeto das próxi-
mas etapas, quando aprenderemos a criar programas distribuídos que trabalhem com o 
paradigma cliente/servidor.
Programação Distribuída 9
Síntese
Nesta etapa, estudamos os conceitos básicos de programação distribuída e as carac-
terísticas dos protocolos que serão utilizados para em nossos aplicativos distribuídos 
iniciais, que serão construídos de acordo com o paradigma cliente/servidor. Os assuntos 
vistos aqui são fundamentais e indispensáveis para o entendimento das etapas seguintes, 
portanto certifique-se de tê-los assimilado bem. Na próxima etapa, começaremos com o 
estudo do protocolo UDP. 
Até lá!
10

Continue navegando