Buscar

Prática http - protocolos udp e tcp

Prévia do material em texto

UNIVERSIDADE FEDERAL DO CEARÁ
CAMPUS DE QUIXADÁ
CURSO DE GRADUAÇÃO EM ENGENHARIA DE COMPUTAÇÃO
CURSO DE GRADUAÇÃO EM SISTEMAS DE INFORMAÇÃO
Pedro Henrique Magalhães Botelho - 471047
Henrique Vieira Cavalcante - 494229
Relatório da prática de laboratório HTTP
Quixadá
2021
1 INTRODUÇÃO
Um pouco sobre cliente-servidor
O modelo cliente-servidor é uma das maneiras de comunicação entre dois dispositivos. O
servidor é o que provê determinado serviço enquanto o cliente é o que consome o que foi
provisionado pelo servidor. O cliente não compartilha nenhum de seus recursos com o
servidor, mas ele requisita alguma função ao servidor, sendo ele, o cliente, responsável por
iniciar a comunicação com o servidor, enquanto o mesmo aguarda requisições de entrada,
após o servidor receber a requisição de um cliente, ele passa a responder com os dados e
informações que foram requeridos. Podemos pensar, por exemplo, que o nosso navegador
web é um cliente pois ele solicita uma página web de um domínio qualquer de algum
servidor, e caso não ocorra erros, o provedor responde com a página web.
Programação com sockets
Socket é uma interface entre a camada de aplicação e a camada de transporte, ela é
responsável por representar um ponto de conexão para cada dispositivo que está
conectado com outro.
Quando dois dispositivos necessitam manter uma comunicação, cada um deles utiliza um
socket. No modelo cliente-servidor também é aplicada a utilização de sockets, o servidor
utiliza um socket e aguarda uma solicitação de conexão, enquanto o cliente executa o seu
socket para que possa se comunicar com o provedor de serviços, quando não ocorre
nenhum erro o servidor cria um novo socket em uma porta específica do seu lado e com
isso acaba sendo criado um canal de comunicação entre o servidor e cliente.
Um dos principais diferenciais do servidor é que ele consegue manipular todas as conexões
que estão sendo feitas com ele. Para cada nova conexão um socket novo é gerado, ou seja,
a cada novo cliente conectado há um socket exclusivo do cliente requisitando informações e
outro do cliente respondendo as requisições.
Abaixo segue um exemplo da criação de uma conexão a partir de sockets de um protocolo
TCP.
Protocolo TCP
O protocolo TCP é, de certa forma, o mais utilizado na camada de transporte para serviços
na web. O TCP é voltado para a conexão e busca a garantia e a integridade dos dados e
informações que são enviadas de um ponto a outro.
O TCP é orientado a conexão para que possa manter a garantia da confiabilidade dos
pacotes é necessário um aperto de mãos em três vias (three-way-handshake), que também
é conhecido como SYN, SYN-ACK, ACK.
O termo SYN, SYN-ACK, ACK é basicamente uma maneira simples de representar como o
“handshake” funciona. A conexão inicia com um dos hosts da rede enviando pacotes de
sincronização (SYNcronize) para o outro host da rede, o host que recebeu o pacote
responde com uma confirmação da sincronização para o que solicitou
(SYNcronize-ACKnowledge). O host que havia iniciado a comunicação envia um pacote
confirmando que quer estabelecer a conexão (ACK). Após o processo de “handshake” o
servidor cria um novo socket para realizar a comunicação com o cliente, com a conexão
estabelecida, agora o servidor e cliente podem efetuar a troca de pacotes.
Além disso, esse protocolo utiliza alguns mecanismos para garantir a confiabilidade dos
pacotes, para que sejam entregues na ordem correta e sem perda de dados. Para que
possa garantir essa segurança, logo abaixo estão dispostos alguns características:
● Re-transmissão: o TCP, ao enviar um pacote, inicializa um temporizador
(mecanismo de timeout) para receber a confirmação do recebimento. Se,
após o timeout, a confirmação não for recebida, o pacote é re-transmitido.
● Controle de fluxo: o TCP implementa o controle de fluxo para que o receptor
não receba mais pacotes do que a sua capacidade permite, evitando, assim,
a perda de pacotes por parte do receptor (ex.: um transmissor rápido
enviando pacotes para um receptor lento).
● Controle de congestionamento: o transmissor não pode enviar mais pacotes
do que a rede pode suportar, evitando, assim, a perda de pacotes durante a
transmissão.
Outra característica importante, é que o TCP possui um modelo full-duplex, ou seja, ambos
os lados da rede podem enviar e receber pacotes a qualquer momento durante a conexão.
Por possuir tantos mecanismos de segurança, integridade e ordenação dos dados, esse
protocolo tende a ter um cabeçalho maior para mostrar todas essas configurações, veja
abaixo por exemplo.
Protocolo UDP
User datagram protocol (UDP) é um tipo de protocolo da camada de transporte bem
simples, ela permite que uma aplicação envie e/ou receba dados, entretanto sem nenhuma
garantia da integridade deles.
Não é um protocolo orientado a conexão, ou seja não existe uma troca de informações
entre o cliente e o servidor antes de começarem a trocar pacotes, diferentemente do TCP
antes de estabelecer uma conexão é necessário que o cliente e servidor estabeleçam uma
troca inicial de informações antes de começarem a enviar pacotes.
Outro ponto a se considerar é que o UDP não necessita que o cliente esteja em uma
conexão de fato com o servidor, os dados são simplesmente enviados ou seja o servidor
não possui acesso ao socket do cliente e sim apenas o acesso do endereço da máquina,
porta e os dados que foram recebidos.
O UDP é feito primordialmente para transmitir pacotes que toleram a perda de dados, como
aplicativos de streaming de áudio e vídeo bem como outras aplicações de tempo real, onde
esses dados são menos sensíveis a perdas. Caso esses pacotes cheguem corrompidos
eles serão simplesmente descartados e não haverá uma solicitação para o reenvio deles.
Além disso, por ter poucos mecanismos de controle e verificação, esse protocolo tende a
ser mais rápido que o TCP, pois necessita de poucos recursos para o envio dos dados. Por
conta disso o seu cabeçalho é menor apenas com as informações dos pacotes, endereço
da máquina que enviou e a porta.
Wireshark
Para a atividade prática foi utilizado o software wireshark que é um observador e analisador
de protocolos de rede que permite ao seu usuário capturar, navegar e analisar os pacotes
através do tráfego de uma rede de computadores em tempo de execução utilizando a
interface de rede do computador.
Possui uma interface bem simples e de fácil manipulação, veja um exemplo abaixo,
podemos ver uma lista de conexões e pacotes que foram transmitidos.
2 DESENVOLVIMENTO
Em ambas as práticas iremos enviar uma mensagem com o nosso cliente via
console ( terminal ) e o servidor deve receber a mensagem e alterá-la para caixa alta
e no final retorna para o cliente.
2.1 Interações cliente/servidor usando o TCP
Prática realizada em vídeo: https://www.youtube.com/watch?v=DUbsoHLoKCc&t=189s
Para a prática foi utilizado os códigos abaixo e uma máquina virtual, utilizei uma
máquina virtual ubuntu para rodar o código do servidor e a minha máquina principal
para utilizar o cliente.
Código do cliente: O código do cliente será rodado na minha máquina principal,
nele eu coloquei o ip referente a máquina virtual onde será rodado o nosso servidor,
o cliente é responsável por capturar a mensagem que será enviada via terminal e
enviar ao servidor.
Primeiro é criado uma stream de entrada de dados via terminal e criado um socket
para o nosso cliente, depois cria-se uma instância para armazenar o stream de
saída para ler os dados que o servidor irá passar para o cliente e então é enviado a
mensagem que enviamos para o servidor. O cliente por fim, recebe a mensagem e
mostra no console o conteúdo da informação enviado pelo servidor.
Código do servidor: Abaixo está o código do servidor, ele será rodado em uma
máquina virtual ubuntu para fazermos uma simulação em “máquinas diferentes”. O
servidor é responsável por receber a mensagem enviada pelo cliente e retornar a
mesma mensagem ao cliente em caixa alta.
O servidor recebe o socket que se conectou e cria uma stream de entradapara o
cliente para ler a mensagem que o cliente enviou, e também uma stream de saída
para escrever em bytes a mensagem modificada para o cliente.
https://www.youtube.com/watch?v=DUbsoHLoKCc&t=189s
Rodando o servidor na máquina virtual: Como dito antes, iremos rodar o servidor
na nossa máquina virtual. O servidor TCP escutará na porta 6787 as conexões com
os sockets.
Rodando o cliente: Com o servidor rodando basta rodarmos o cliente na nossa
máquina e analisar essa comunicação entre cliente e servidor, veja que foi enviado
uma mensagem “hello server”, a mensagem saiu do cliente e foi direto ao servidor
rodando na máquina virtual, o servidor por sua vez captou a mensagem e retornou a
mensagem em caixa alta.
Wireshark
Podemos ver nessa prática o handshaking sendo realizado nas três primeiras linhas
da tabela no wireshark, justamente a parte do SYN, SYN-ACK, ACK. As outras
linhas correspondem a conexão estabelecida e o envio de informações enviadas de
ambas as partes ( cliente e servidor ).
2.2 Interações cliente/servidor usando o UDP
Prática realizada em vídeo: https://www.youtube.com/watch?v=gRQDvxvNk9M
Da mesma maneira que a prática de TCP na prática com UDP foi utilizado os
códigos abaixo e uma máquina virtual, utilizei uma máquina virtual ubuntu para rodar
o código do servidor e a minha máquina principal para utilizar o cliente.
A aplicação é a mesma, será enviado uma mensagem via cliente, e este enviará
para o servidor, o servidor por sua vez pegará a mensagem e retornará a mesma
mensagem em caixa alta para o cliente.
Código do cliente: O código do cliente será rodado na minha máquina principal,
nele eu coloquei o ip referente a máquina virtual onde será rodado o nosso servidor,
https://www.youtube.com/watch?v=gRQDvxvNk9M
o cliente é responsável por capturar a mensagem que será enviada via terminal e
enviar ao servidor.
O
cliente cria streams de entrada para receber uma mensagem pelo terminal, e cria um
socket que será o nosso cliente UDP. Além disso também é criado um pacote de
envio UDP, dentro dele contém o endereço, porta, conteúdo da mensagem em bytes
que será enviado pelo terminal e o tamanho da mensagem. Quando enviado, o
servidor retornará com a mensagem alterada e o cliente mostra a mensagem no
console.
Código do servidor: Abaixo está o código do servidor, ele será rodado em uma
máquina virtual ubuntu para fazermos uma simulação em “máquinas diferentes”. O
servidor é responsável por receber a mensagem enviada pelo cliente e retornar a
mesma mensagem ao cliente em caixa alta.
O servidor por sua vez recebe um pacote contendo os dados da mensagem, a
mensagem é alocada para uma variável de string chamada “sentence” e por final o
servidor criará uma mensagem contendo a string “resultado: “ concatenada com a
mensagem da variável “sentence” modificada em caixa alta. Após todo esse
processo será criado um datagrama para envio de pacotes, onde as informações
que serão passadas para essa função é a mensagem modificada, endereço da
máquina do cliente e a porta. A partir daí o cliente recebe a mensagem alterada.
Rodando o servidor na máquina virtual: Como dito antes, iremos rodar o servidor
UDP na nossa máquina virtual
Rodando o cliente: Com o servidor rodando basta rodarmos o cliente e analisar
essa comunicação entre cliente e servidor, veja que foi enviado uma mensagem “oi”,
a mensagem saiu do cliente e foi direto ao servidor rodando na máquina virtual, o
servidor por sua vez captou a mensagem “resultado: OI”.
Wireshark
Veja que como é um protocolo UDP não existe uma troca de pacotes de
apresentação (handshaking). Ou seja, a primeira linha se refere ao envio da
mensagem “oi” e a segunda linha da tabela se refere ao retorno do servidor que
capturou o “oi” e converteu para caixa alta, passando “OI” para o cliente.

Continue navegando