Baixe o app para aproveitar ainda mais
Prévia do material em texto
FACULDADE SANTA MARIA - FSM Pedro César Vieira Barbosa PROTOCOLO HTTP/1.1 RECIFE 2008. PEDRO CÉSAR VIEIRA BARBOSA PROTOCOLO HTTP/1.1 Trabalho da disciplina de Redes de computadores e protocolos de comunicação seguros apresentado ao professor Rafael Amorim para obtenção de nota. Recife 2008 PROTOCOLO HTTP/1.1 1. Introdução Esse trabalho tem como foco o estudo do protocolo HTTP que foi escolhido justamente por ser o protocolo que se encontra como base de praticamente toda comunicação via internet, principalmente estando às vésperas da convergência dos sistemas de informação para o modelo Cloud Computing, onde todas aplicações estão deixando de ser executadas nos desktops para rodarem em servidores centralizados e acessados pro clientes em qualquer parte do mundo através da internet, e na maioria das vezes as aplicações rodarão em interfaces sobre o protocolo HTTP. O protocolo HTTP - acrônimo para Hiper Text Transfer Protocol - é um protocolo que trabalha na camada de aplicação para distribuir de forma colaborativa sistemas de informações. Teve seu início em 1990 com sua versão 0.9 como um protocolo simples para transferência de “dados brutos” através da internet, esses dados eram transportados dados de forma “bruta” tanto devido à pouca complexidade dos sistemas da época em relação aos tempos atuais como também devido à baixíssima velocidade de conexão da internet à época. Porém, sua versão 1.0 definida pela RFC 1945, permitiu ao protocolo transportar mensagens do tipo MIME (Multipurpose Internet Mail Extensions), que contêm meta-informações sobre os dados transferidos e também sobre as requisições e respostas sobre e conexão. No entanto a versão 1.0 do protocolo, apesar de trazer muitas inovações, ainda não era hábil o suficiente para trabalhar com a hieraquia da rede, que envolve proxies, cache, a necessidade da persistência das conexões, virtual hosts, aplicações que conversam entre si usando esse protocolo, estando em pontos geograficamente distantes, algumas aplicações até mesmo tendo esse protocolo como pré-requisito para funcionar. Devido a essa carência foi implementada a vesão 1.1 do protocolo HTTP, trazendo em seu bojo as funções necessárias para assegurar que essas exigências mais rigorosas fossem atendidas de forma confiável. HTTP é usado hoje em dia como um protocolo genérico para comunicação entre sistemas de informações diversos, inclusive dando apoio a outros protocolos como por exemplo: SMTP, NNTP, FTP, Gopher entre outros. 2. Operação do protocolo HTTP/1.1 O protocolo HTTP é, basicamente, um protocolo de requisições e respostas, o cliente envia uma requisição ao servidor, enviando nessa requisição o método a ser utilizado na comunicação, a URI e a versão do protocolo seguida por uma mensagem do tipo MIME contendo entre outras coisas informações sobre o cliente. O servidor recebe essa requisição e responde com outra mensagem contendo a sua versão do protocolo, e contendo também uma mensagem que pode ser de sucesso – que dará continuidade à comunicação, ou de erro, informando o motivo pelo qual a comunicação não poder ser estabelecida, seguida de uma mensagem do tipo MIME contendo informações sobre o servidor. A maioria das comunicações HTTP é iniciada por um cliente e consiste de uma requisição para acessar algum serviço que se encontra configurado em algum servidor, essa é uma conexão HTTP simples, o grau de complexidade da conexão vai aumentando dependendo da quantidade de intermediários que aparecem entre o cliente e o servidor, esse intermediários são geralmente de três tipos: � Proxy: Servidor que, na sua forma mais básica, tem a função de encaminhar mensagens de rede do cliente para o servidor. � Gateway: Intermediário que tem a função de interligar redes traduzindo endereços e encaminhando os pacotes para o destino correto, um proxy também pode ser interpretado como um gateway, pois também tem a função de redirecionar pacotes, porém o proxy trabalha em uma camada diferente do gateway. � Tunnel: Utilizado quando os dados precisam passar por um intermediário – um firewall - sem que esse intermediário conheça o conteúdo da informação. O principal objetivo da versão 1.1 é suportar a larga diversidade de aplicações que rodam diretamente da web disponíveis atualmente, fornecendo a essas aplicações a confiabilidade necessária para seu funcionamento. Normalmente o protocolo HTTP funciona em conexões TCP/IP usando a porta 80, mas é preciso deixar claro que isso é apenas uma convenção, pois outras portas podem ser utilizadas sem perda de funcionalidades, isso significa também que nada obsta que o protocolo HTTP possa ser utilizado sobre outras conexões que não TCP/IP seja na internet ou em outras redes. HTTP somente exige como pré-requisito a confiabilidade, portanto qualquer protocolo que garanta isso pode ser usado com HTTP. 2.1 Versionamento A versão do protocolo HTTP é sempre definida por um número no formato “INTEIRO.FRAÇÃO” a política de versionamento do protocolo é necessária para que tanto que o cliente ao informar a versão do seu protocolo ao servidor, garanta o sucesso da comunicação fazendo com que o servidor responda em um formato que sua versão consiga entender. O número principal da versão somente é alterado quando são adicionadas implementações que alteram sua forma de se comunicar, o número menor é alterado quando as implementações adicionam características que são consideradas como incrementos mas que não alteram a forma de o protocolo trabalhar internamente. O número de versão sempre é informado na primeira linha da comunicação, no seguinte formato: HTTP-Version = “HTTP” “/” “INTEIRO” “.” “FRAÇÃO” É importante frisar que os números “INTEIRO” e “FRAÇÃO” são tratado como independentes e ambos podem ser incrementados em até dois dígitos, portanto, ao contrário de como estamos acostumados a interpretar em nosso sistema decimal, HTTP 2.4 é menor que HTTP 2.13 que por sua vez é menor que HTTP 12.5 e é importante saber também que zeros à esquerda podem ser ignorados pelo destinatário da mensagem mas não por quem as envia (remetente). Por isso gateways e proxies precisam ter o cuidado adicional ao encaminhar as mensagens entre protocolos diferentes, no caso de um dos pontos estar usando uma versão maior do protocolo, ele deve fazer o downgrade na versão dessa mensagem - convertendo a mensagem para uma versão anterior - ou retornar uma mensagem de erro. 2.2 - URL HTTP Existe um esquema utilizado para encontrar recursos de rede com o protocolo HTTP, essa seção define a sintaxe que deve ser utilizada no endereçamento de URLs http: “http:” “//” host [“:” porta] [caminho absotulo no host [“?” consulta] ] Como padrão, se a porta não for informada, é assumida a porta 80 e se o caminho absoluto no host não for informado o caminho padrão no host será o “/” (raiz) e no caso de um proxy receber um endereço que não esteja completamente qualificado – no padrão FQDN – ele pode completar o nome do host com seu domínio, no entanto se o endereço do host vier completamente qualificado o proxy não deve alterar esse endereço. É importante salientar também que o nome do host é interpretado de forma CASE SENSITIVE, já o caminho absoluto no host não. 2.3 – Formato de data e hora O protocolo HTTP permite três formatos de data/hora, Vejamos os exemplos, assumindo a data do dia seis de novembro do ano de 1994 às 08:49:37 hs. Sun, 06 Nov 1994 08:49:37 GMT Sunday, 06-Nov-94 08:49:37 GMT Sun Nov 6 08:49:37 1994 O primeiro formato é preferido por apresentar o mesmo tamanho independente da data e hora apresentada, o segundo é bastante usado ainda mas está baseado em um modelo obsoleto por usar na data a representaçãodo ano com apenas dois dígitos. Clientes e servidores que utilizam HTTP/1.1 devem aceitar os três formatos para manter a compatibilidade com o HTTP/1.0, no entanto devem gerar apenas no primeiro formato para representar as datas em seus cabeçalhos. Esses pré-requisitos relacionados ao formato de data/hora são apenas para o funcionamento interno do protocolo e não deve interferir na forma como essas informações podem ser apresentadas na tela, ou em logs por exemplo. É importante saber o HTTP interpreta as informações de data e hora de forma CASE- SENSITIVE, ou seja, o mesmo caractere no formato maiúsculo e no formato minúsculo são considerados caracteres diferentes. 2.4 Cabeçalho da mensagem HTTP O cabeçalho HTTP (HEADER) da mensagem inclui os campos: general-header, request-header, response-header e entity-header. Cada campo deve ser expresso pelo seu nome (não diferenciando maiúsculas de minúsculas) seguido do separador dois pontos ( : ) e o valor do campo. A ordem em que esses campos são enviados não faz diferença para o sucesso da comunicação, porém é boa prática enviar o general-header primeiro, seguido pelo request-header ou response-header e por último o entity-header. 2.5 - Corpo da mensagem O corpo da mensagem é o container onde são levados os dados de requisição ou de resposta, ou seja, os dados que são o objeto da comunicação sem os quais a existência de todos os outros não se justificaria. Geralmente é o recurso que foi solicitado ao servidor pelo cliente ou, na impossibilidade de prosseguir, uma mensagem de erro. 2.6 – Métodos O protocolo HTTP possui oito métodos, que indicam a forma ação a ser executada no recurso específicado, em outras palavras o método diz o que fazer com a URL solicitada pelo cliente. São eles: 2.6.1. - OPTIONS: Solicita ao servidor a lista dos recursos aceitos por ele. 2.6.2. - GET: É o método mais comum, é utilizado na simples solicitação de um recurso qualquer no servidor seguido de um retorno do servidor. 2.6.3. - HEAD: É o mesmo que o GET só que o sem que o recurso seja retornado. Geralmente utilizado para obtenção de meta-informações por meio do cabeçalho da resposta. 2.6.4. - POST: Envia dados para serem processados pelo recurso, os dados seguem imbutidos no corpo do comando e formatados como uma query string além de conter cabeçalhos adicionais especificando seu tamanho e seu formato. Por isso esse método é reconhecido como mais seguro para transferência de informações, ao contrário do método GET no qual as informções são passadas na URL do recurso. 2.6.5. - PUT: Envia um recurso, como por exemplo um arquivo. 2.6.6. - DELETE: deleta um recurso, geralmente um arquivo. 2.6.7. - TRACE: Permite ao cliente saber como sua requisição está sendo tratada no servidor, podendo usar essa informação para fazer um diagnóstico. 2.6.8. - CONNECT: Método utilizado para se conectar a um proxy e criar um túnel para que as informações trafeguem em um canal seguro. A lista dos métodos que podem ser utilizados em um determinado recurso pode ser especificada em um campo do cabeçalho, ao receber a solicitação do cliente informando o método a ser utilizado no recurso, o servidor irá retornar um código informando se o método solicitado é ou não permitido para esse recurso. Essa verificação deve ser feita a cada conexão, devido ao fato de que a lista de métodos permitidos em um recurso pode ser alterada dinamicamente. Alguns códigos de retorno que impedem a execução de determinados métodos são: 2.6.9. - Código 405: Método não permitido. O servidor conhece o método mas não permite sua utilização no recurso. 2.6.10. - Código 501: Método não implementado ou desconhecido. É importante observar que os métodos GET e HEAD devem ser implementados e permitidos por todos os servidores, todos os outros são opcionais. 2.7 – Códigos de retorno A primeira linha de uma mensagem de resposta é a linha de status, contém a versão do protocolo seguida de um código numérico de retorno associado a uma frase, como no exemplo a seguir: Status-Line = Versão_HTTP SP Código_de_Status SP Frase_Explicativa CRLF O primeiro dígito do código de status define a classe da resposta. Existem 5 classes, são elas: 2.7.1. - 1xx: Informacional, apenas informa que a requisição foi recebida e que será dado início ao processo. 2.7.2. - 2xx: Mensagem de sucesso. A requisição foi recebida, entendida e aceita. O o processo foi iniciado e conluido com sucesso. 2.7.3. - 3xx: Redirecionamento. Outra ação deve ser tomada para que a requisição seja atendida com sucesso. 2.7.4. - 4xx: Erro no cliente. A requisição contém algum erro, como por exemplo erro de sintaxe. 2.7.5. - 5xx: Erro no servidor. O servidor falhou em atender uma requisição aparentemente válida. 2.8 – Conexões 2.8.1. - Conexões persistentes: antes da implementação da versão 1.1 do protocolo HTTP, era necessária uma conexão para cada solicitação de recurso, como um arquivo html, um arquivo GIF, um arquivo CGI e assim sucessivamente, isso exigia um grande consumo de processamento e de banda, pois a cada requisição de recurso deveria ser aberta uma nova conexão que seria encerrada ao final dessa requisição. E normalmente para se obter o resultado esperado mais simples como, por exemplo, o carregamento de uma página web, dezenas ou centenas de requisições são necessárias. Causando um enorme desperdício de recursos de cpu e memória. A conexão persistente implementada com a chegada da versão 1.1 do protocolo HTTP permite que todas essas solicitações simples sejam feitas na mesma conexão. A conexão persistente trouxe consigo as seguintes vantagens: 2.8.1.1. - Pelo fato de abrir e fechar menos conexões, foi ganho tempo de processamento e memória em roteadores e demais equipamentos de rede. Permitindo maior velocidade e uso de hardware mais simples. 2.8.1.2. - O congestionamento na rede é diminuído devido ao menor números de pacotes trafegando, pois já não há tantos pacotes TCP de abertura e encerramento de conexão. 2.8.1.3. - O tempo entre as requisições é diminuído drasticamente, visto que não há mais um grande número de negociações handshaking, devido ao fato de não precisar mais ficar abrindo novas conexões a cada requisição. 3 – Estudo de caso Foi feito um estudo de caso baseado nos conhecimentos adquiridos sobre o protocolo HTTP para fixar o aprendizado, através da verificação prática do que se estudou na teoria. Para que esse estudo de caso tivesse uma conotação real e consequentemente uma melhor utilidade para o aprendizado, o mesmo foi feito em um ambiente real capturando dados em um servidor proxy de uma empresa em operação normal do dia-a-dia. O hardware utilizado foi um Servidor Dell T105, com processador dual core e 3 GB de Memória RAM, foram capturados dados de um determinado cliente da rede por um período de 30 minutos, o suficiente para analisar o funcionamento do protocolo HTTP/1.1. O software utilizado foi o Wireshark (ex ethereal). O Wireshark atua como um Sniffing na rede, sendo um analisador de pacotes de rede para o Unix e o Windows. Permite a interatividade com o browser dos dados analisados, checagem em nível detalhado do pacote, inclusive de dados gravados em disco. A ferramenta destacou-se pelo filtro apurado de protocolos e a possibilidade de visualizar o fluxo reconstruído de uma sessão TCP. Inicialmente é interessante mostrar algumas telas do analisador de protocolo na sequência das negociações do protocolo, no entanto para não fugir do foco do trabalho, não serão mostradas as negociações iniciais da conexão como o as feitas pelo protcolo ARP que precedem a atividade do procolo HTTP. Serão apresentadas apenas as etapas referentes ao protocolo HTTP que é o foco do nosso estudo. O wireshark é por sua natureza uma ferramenta que traz a possibilidade de a interface de rede trabalhar em modo promíscuo, ou seja,capturando todos os pacotes da rede que passar por ela, e não somente os pacotes de rede destinados a ela, como é o modo normal de trabalho de uma interface de rede. Porém, isso é uma faca de dois gumes, pois a quantidade de dados que ele captura é imensa e pode dificultar a análise do tráfego devido ao monte de “lixo” que pode vir nessa captura, então para isso existem os filtros do wireshark, onde devemos informar o tipo de tráfego que queremos analisar, ou especificar os dispositivos de rede que queremos monitorar, enfim, existem uma gama muito grande de possibilidades de utilização dos filtros, nesse estudo foi utilizado o seguinte filtro: (ip.addr eq 192.168.0.1 and ip.addr eq 192.168.0.108) and http Nesse filtro estamos filtrando os pacotes que estejam relacionados ao endereço IP 192.168.0.1 (o ip do proxy) e também os pacotes relacionados ao endereço IP 192.168.0.108 (cliente) e ainda aplicamos um outro filtro no resultado desse primeiro filtro, no traáfego de dados entre esses dois endereços IP filtramos somente os pacotes relacionados ao protocolo HTTP. Segue abaixo uma tela do wireshark onde o servidor informa informa sua versão do protocolo HTTP (indicado na imagem pelo número 1 em vermelho) e na linha seguinte o código de retorno 200 (indicado na imagem pelo número 2 em vermelho), que como vimos no item 2.7.2 significa que a requisição foi recebida, entendida e aceita. Na figura seguinte pode-se visualizar o cliente solicitando ao servidor a URI: http://www.meebo.com/mcmd/events utilizando o método POST. Veja abaixo uma explicação mais detalhada de como encontrar essas informações baseadas na imagem. 3.1. No painel superior vemos a linha em laranja, que é o pacote que está selecionado para ser analisado, então nesse painel vemos que o endereço IP do cliente (192.168.0.108) está na coluna SOURCE – do inglês: fonte, ORIGEM – e o IP do servidor (192.168.0.1) está na coluna Destination – do inglês: destino – dessa forma, por essa linha do painel superior já identificamos quem é quem nessa relação, além de já visualizarmos nas colunas seguintes o protocolo e na coluna info vemos o método e o recurso solicitado. 3.2. No painel de leitura, localizado logo abaixo, vemos as informações de forma mais detalhada, temos na sequencia (os números dos tópicos abaixo indicam os mesmos na tela): 3.2.1. - A data da transação; 3.2.2. - O tamanho do pacote; 3.2.3. - O método; 3.2.4. - O recurso requisitado; 3.2.5. - A versão do protocolo. Segue abaixo outra imagem onde o cliente solicita uma página do site de relacionamento orkut e com sua URL completa, que nesse caso será ofuscada em parte para preservar a identidade e privacidade do cliente que serviu de estudo. Basicamente toda a análise do tráfego segue a mesma linha mudando apenas o recurso solicitado dentre os mais comuns estão os arquivos HTML e imagens nos mais diversos formatos (JPG, GIF, etc). Essa limitação se dá devido ao filtro aplicado restringindo apenas ao protocolo HTTP e ao uso do cliente ser praticamente restrito a esses dois sites (Orkut e Meebo). 4 – Conclusão Na era da informação o ativo mais importante da humanidade é a informação, vivemos em uma era em que ao contrário da era anterior, onde quem tinha capital tinha poder, na nossa era atual (a era da informação) quem tem informação tem poder. A prova disso é que fortunas são perdidas, praticamente da noite para o dia, simplesmente por falta de informação ou por uma informação errada. Essa mudança de fase, além de mudar o principal ativo da humanidade, mudou também a forma como esse ativo é transmitido entre as pessoas, a informação hoje em dia desconhece distâncias, virtualmente nada é longe, com a chegada da internet tudo está a um clique de distância, a informação tornou-se imaterial e por isso mesmo, teve seu custo reduzido, pois não precisa mais de um suporte material para ser distribuída. No entanto, no lugar do suporte material para a transmissão dessa informação temos um novo suporte, que são os protocolos, e é preciso fazer um estudo minucioso sobre esses novos meios de transmissão de algo tão valioso para nossa sociedade. Concluo esse trabalho com a grande satisfação de entender um pouco mais sobre esse protocolo que considero muito importante por ser a base onde todas as aplicações tendem a trabalhar, principalmente com a tendência atual da larga utilização da computação em nuvem (Cloud Computing). Apesar de se pensar muito nos protocolos específicos de segurança, é preciso entender a base de tudo, o “chão” onde as aplicações seguras devem “pisar”, de nada adianta sermos fortes se não estivermos pisando em um chão seguro, além do mais, quem estuda segurança sabe que: “uma corrente é tão forte quanto seu elo mais fraco”, e portanto a falta de um melhor entendimento do protocolo HTTP, pode dificultar ou prejudicar a implementação de outros protocolos e/ou aplicações seguros que possivelmente serão implementados paralelamente ou sobre o HTTP. 5 – REFERENCIAS PAZERA, E. Focus On SDL: 1 ed. Muska & Lipman/Premier-Trade, 2002. 336 p. RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1. (http://www.w3.org/Protocols/rfc2616/rfc2616.html), 1999, data de última consulta 18 de Dezembro de 2008.
Compartilhar