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