Você está na página 1de 4

Disciplina: Sistemas Distribuídos

Professor: Marcus Tulio Amaris Gonzalez


Aluno: Jonathan José Cardoso de Sales Matrícula: 201804940058

Atividade sobre Sockets

4.1 É concebivelmente útil que uma porta tenha vários receptores?

Sim, é concebivelmente útil que uma porta tenha vários receptores em certos contextos de
sistemas distribuídos. Para justificar essa resposta, primeiro devemos ressaltar que no modelo
de comunicação baseado em sockets, uma porta é associada a um processo ou serviço em um
sistema distribuído. Dessa forma, em algumas situações pode ser desejável ter vários
receptores para uma mesma porta. Essa abordagem é conhecida como "porta compartilhada",
isto é, múltiplos processos ou serviços esperando conexões na mesma porta. Quando uma
conexão chega, a decisão de qual receptor (processo ou serviço) será associado a essa
conexão pode ser feita com base em informações contidas nos dados de solicitação ou através
de um processo de roteamento interno.

A vantagem de ter vários receptores em uma mesma porta é a flexibilidade e a escalabilidade


que isso proporciona. O que permite que diferentes serviços compartilhem a mesma
infraestrutura de rede e porta, simplificando a configuração e o gerenciamento do sistema
distribuído. Além disso, pode ajudar a otimizar o uso dos recursos disponíveis. No entanto, é
importante observar que a implementação de uma porta compartilhada requer um mecanismo
adequado para a seleção e roteamento correto dos receptores. Isso pode exigir protocolos de
comunicação mais complexos e uma lógica adicional para garantir que cada conexão seja
corretamente direcionada ao receptor apropriado.

4.2. Um servidor cria uma porta que utiliza para receber pedidos dos clientes. Discuta
os problemas de projeto relativos ao relacionamento entre o nome dessa porta e os
nomes usados pelo cliente.

Quando um servidor cria uma porta para receber pedidos dos clientes, existem alguns
problemas de projeto relacionados ao relacionamento entre o nome dessa porta e os nomes
usados pelos clientes, são eles:

Conflito de portas: Pode ocorrer um conflito se o nome da porta escolhido pelo servidor já
estiver sendo usado por outro serviço ou processo no sistema. Isso pode levar a uma
indisponibilidade do serviço ou à sobreposição de funcionalidades. É importante escolher um
nome de porta exclusivo e garantir que não haja conflitos com outros serviços em execução
no sistema.

Descoberta de porta: Os clientes precisam conhecer o número da porta em que o servidor


está ouvindo para enviar pedidos corretamente. A maneira como os clientes descobrem essa
informação pode ser um desafio. Se a porta for fixa e conhecida antecipadamente, não haverá
problema. No entanto, se a porta for atribuída dinamicamente ou se o servidor estiver em um
endereço IP diferente, os clientes precisarão descobrir essa informação de alguma forma, seja
por meio de configuração manual ou usando um serviço de descoberta, como um servidor de
nomes.

Mudança de porta: Caso o servidor decida mudar a porta em que está ouvindo, é necessário
garantir que todos os clientes sejam informados dessa mudança para que possam enviar seus
pedidos para a nova porta. Isso pode ser um desafio em sistemas distribuídos com muitos
clientes, especialmente se não houver um mecanismo automatizado de atualização de
configurações.

Segurança: O uso de uma porta conhecida pode facilitar ataques devido à previsibilidade.
Um invasor pode tentar acessar diretamente a porta conhecida do servidor para explorar
possíveis vulnerabilidades. Nesses casos, é importante implementar medidas de segurança
adicionais, como autenticação e criptografia, para proteger a comunicação entre o cliente e o
servidor.

Para mitigar esses problemas, algumas abordagens comuns incluem o uso de portas
conhecidas para serviços padrão, como HTTP (porta 80), que facilitam a descoberta e são
amplamente suportadas pelos clientes. Além disso, o uso de protocolos de descoberta, como o
DNS, pode ajudar na resolução do nome da porta do servidor. Também é possível
implementar mecanismos de configuração automática, como a obtenção dinâmica de
endereços IP e portas através de protocolos como DHCP.

Perguntas do Professor

● O exercício 1 e 2 apresenta o método serverSocket.accept(), porquê o exercício 3


não?

O exercício 3 não inclui o método serverSocket.accept() porque ele tem como objetivo
demonstrar o uso específico do protocolo UDP, que é um protocolo de comunicação sem
conexão. Ao contrário do TCP, que usa o método accept() para aguardar a conexão de um
cliente, o UDP não requer o estabelecimento prévio de uma conexão. Portanto, no exercício
3, é apresentado como o servidor recebe e processa datagramas UDP sem a necessidade do
método accept().

● O exercício 3 está orientado principalmente a operações idempotentes, porquê


desta afirmação?

A afirmação de que o exercício 3 está orientado principalmente a operações idempotentes é


feita porque o protocolo UDP é um protocolo não confiável e sem estado. Isso significa que
não há garantia de entrega dos datagramas ou controle de ordem. Uma operação idempotente
é aquela em que múltiplas execuções produzem o mesmo resultado do que uma única
execução, isto é, mesmo que se realize a mesma operação várias vezes o resultado final não
será afetado.

Dito isso, devido à natureza não confiável do UDP, os datagramas podem ser perdidos ou
entregues fora de ordem. Portanto, se uma operação não for idempotente e for repetida devido
à perda ou entrega fora de ordem dos datagramas, o resultado final pode ser diferente do
esperado. Portanto, é interessante que as operações feitas utilizando o protocolo UDP, sejam
orientados principalmente a operações idempotentes.
● Qual é a diferença de usar protocolo UDP/IP e TCP/IP na comunicação remota
de processos.

A principal diferença entre o protocolo UDP/IP (User Datagram Protocol/Internet Protocol) e


o protocolo TCP/IP (Transmission Control Protocol/Internet Protocol) na comunicação
remota de processos está na forma como eles lidam com a entrega de dados.

O UDP/IP é um protocolo de transporte sem conexão, o que significa que não é estabelecida
uma conexão prévia entre o emissor e o receptor antes do envio dos dados. Ele oferece uma
comunicação mais simples, em que os dados são enviados em datagramas independentes. No
entanto, o UDP/IP não garante a entrega dos datagramas nem a ordenação correta, o que pode
resultar em perda de dados ou duplicação.

Por outro lado, o TCP/IP é um protocolo de transporte orientado a conexão. Antes de enviar
os dados, uma conexão é estabelecida entre o emissor e o receptor. O TCP/IP garante a
entrega confiável dos dados, controlando a ordem de envio e recebimento dos pacotes. Ele
também lida com a retransmissão de pacotes perdidos e o controle de fluxo, ajustando a taxa
de transmissão para evitar sobrecarga da rede.

Basicamente o UDP/IP é mais adequado quando a velocidade e a baixa latência são


prioritárias, mas a perda ocasional de dados é tolerável. O TCP/IP é mais apropriado quando
a confiabilidade e a garantia de entrega dos dados são essenciais.

● Descreva a comunicação inter processos em forma de Fluxos de dados (streams),


mencione algumas características e vantagens ao usar o protocolo UDP ao invés
do TCP/IP.

A comunicação entre processos em forma de fluxos de dados é uma maneira comum de


trocar informações em sistemas distribuídos. Nesse tipo de comunicação, os dados são
transmitidos de forma sequencial por meio de uma conexão estabelecida entre os processos.

Características e vantagens do UDP em relação ao TCP:

Conexão sem estado: O UDP é um protocolo sem conexão, o que significa que não é
necessário estabelecer uma conexão antes de enviar os dados. Cada pacote UDP é tratado de
forma independente, o que resulta em uma comunicação mais leve e com menor sobrecarga,
pois não há mecanismos de controle de conexão.

Baixa latência: O UDP é mais adequado para aplicações que requerem baixa latência, ou
seja, um menor tempo de atraso na transmissão dos dados. Como não há mecanismos de
controle de fluxo e retransmissão de pacotes, os dados são transmitidos o mais rápido
possível, sendo ideal para aplicações em tempo real, como streaming de áudio e vídeo.

Menor sobrecarga de cabeçalho: O UDP possui um cabeçalho menor em comparação com


o TCP, o que resulta em uma menor sobrecarga de dados. Isso é especialmente vantajoso em
redes com largura de banda limitada ou em situações em que a eficiência na utilização da
rede é crucial.

Suporte a multicast e broadcast: O UDP suporta facilmente operações de multicast (envio


de dados para um grupo específico de destinatários) e broadcast (envio de dados para todos
os destinatários na rede). Esses recursos são úteis em aplicações que exigem distribuição de
dados para vários receptores simultaneamente.
Flexibilidade de implementação: Como o UDP não possui os mecanismos de controle de
conexão do TCP, ele oferece maior flexibilidade na implementação de lógica de comunicação
personalizada. Isso pode ser útil em casos em que é necessário um controle mais granular
sobre o processo de comunicação.

No entanto, vale ressaltar que a escolha entre UDP e TCP depende das necessidades
específicas da aplicação. O UDP é adequado para aplicações que valorizam a baixa latência,
eficiência e flexibilidade, mas podem tolerar alguma perda de dados, enquanto o TCP é mais
apropriado para aplicações que exigem uma entrega confiável e uma comunicação livre de
erros.

● Consulte a documentação de Java sobre as classes DatagramSocket e


DatagramPacket e mencione o objetivo da utilização de cada uma delas?

A classe DatagramSocket é responsável por representar um socket que permite enviar e


receber datagramas UDP. Ela oferece os recursos necessários para criar, estabelecer conexão,
enviar e receber datagramas. Um DatagramSocket pode ser associado a uma porta local
específica e pode se comunicar com outros sockets que estão escutando em uma porta
específica em um host remoto.

Já a classe DatagramPacket é utilizada para representar um pacote de dados que será


enviado ou recebido por meio de um DatagramSocket. Ela encapsula os dados a serem
transmitidos ou os dados recebidos, juntamente com informações sobre o endereço IP e o
número da porta do host remoto. Essa classe é usada para empacotar os dados antes do envio
e armazenar os dados recebidos após o recebimento.

Em resumo, a classe DatagramSocket é utilizada para criar e gerenciar um socket de


comunicação UDP, enquanto a classe DatagramPacket é usada para encapsular os dados a
serem enviados ou recebidos por meio desse socket.

Você também pode gostar