# Redes de computadores/HTTP
## Protocolo HTTP

O protocolo HTTP, Hypertext Transfer Protocol ou Protocolo de Transferência de Hipertexto, é um protocolo da camada de aplicação do TCP/IP cuja função é de proporcionar a transferência de hipertexto. Este protocolo é usado desde 1990, atualmente está na versão 1.1.

## Características do Protocolo HTTP

* É um protocolo de camada de aplicação da WEB
* É implementado em dois programas: Cliente e Servidor
* O HTTP é quem define a estrutura da mensagem que o cliente vai trocar com o servidor e utiliza TCP como seu protocolo de transporte
* Protocolo sem estado. O que significa que ele não mantém memória sobre suas ações. Ou seja se um cliente fizer uma requisição idêntica a uma anterior a qualquer momento, o HTTP não sabe informar sobre esse histórico.

## Passos para uma comunicação HTTP

* É estabelecida uma conexão TCP entre o programa cliente e o servidor.
* O cliente envia uma requisição HTTP para sua interface socket.
* O TCP leva essa mensagem para a interface socket do servidor.
* O servidor envia uma resposta HTTP para sua interface socket.
* O TCP leva essa resposta para a interface socket do cliente.

## Conexões Persistentes e Não Persistentes

A versão HTTP/1.0 utiliza conexões TCP não persistentes na comunicação cliente-servidor. Já a versão 1.1 deste protocolo utiliza conexões persistentes.

### Conexões Não Persistentes

Neste tipo de conexão, cada objeto requisitado pelo cliente ao servidor é transportado por uma conexão TCP, que se encerra imediatamente após a confirmação do recebimento do objeto. Desta forma, se um documento HTML, por exemplo, referenciar outros objetos, como arquivos JPEG, GIF, entre outros, novas conexões TCP deverão ser estabelecidas para transferência destes arquivos, além da conexão para obtenção do próprio arquivo HTML.
Os browsers podem ter interpretações diferentes, pois o HTTP define apenas o protocolo de comunicação entre o cliente e o servidor. Podem ser configuradas conexões paralelas reduzindo o tempo de resposta. Por padrão, os browsers utilizam entre 5 e 10 conexões paralelas.

### Conexões Persistentes

As conexões do tipo persistente são caracterizadas pelo fato da conexão TCP permanecer aberta após o envio da resposta, ou seja, a conexão persiste durante o recebimento de todos os objetos referenciados. A requisição e a resposta utilizam-se da mesma conexão, esta só será encerrada ou fechada quando não for usada por um tempo que pode ser configurável. Desta forma, apenas uma conexão TCP é necessária para o recebimento completo de uma página Web. Além disso, outras páginas Web que estejam no mesmo servidor podem ser completamente recebidas pelo cliente através desta mesma conexão TCP.
Existem duas versões de conexões persistentes: sem paralelismo e com paralelismo. Na primeira, uma nova requisição só é feita após a resposta da anterior, portanto, requer um RTT para cada objeto e pode permanecer ociosa aguardando outra requisição. Naquelas com paralelismo, o cliente emite requisições assim que encontra referências, ou seja, não aguarda respostas das requisições anteriores. Nesse caso, necessita apenas um RTT para todos os objetos e fica ociosa uma fração menor de tempo.

## Formato da Mensagem HTTP

Existem dois tipos de mensagem HTTP: requisição e resposta.

### Requisição

Uma mensagem de requisição é formada por uma linha de requisição, as linhas de cabeçalho e o corpo da mensagem.
A linha de requisição é formada pelo método, a URL e a versão http, todos separados por um espaço. O método é o tipo de ação que a mensagem requer. Exemplos de métodos que são muito usados em mensagens http são GET, POST e HEAD. A URL é o objeto sobre o qual a mensagem quer realizar a ação(método) requisitada. E a versão http se refere à versão requisitada pela mensagem.
As linhas de cabeçalho devem conter detalhes sobre a requisição para o servidor. Podemos encaixar o cabeçalho das mensagens de requisição em três tipos.
* Gerais: contêm informações referentes principalmente à própria mensagem, e são usadas para controlar seu processamento e prover o receptor com informações extras.
* Requisição: fornecem para o servidor mais informações sobre a natureza da requisição do cliente, e dão ao cliente mais controle sobre como a requisição é gerenciada. Podem também contar quais formatos ou códigos o cliente consegue processar.
* Entidade: descrevem a entidade contida no corpo da mensagem, se existir alguma.
Normalmente a mensagem de requisição não irá possuir cabeçalhos de entidade, pois dificilmente uma mensagem de requisição trará consigo um corpo de mensagem.
No corpo de mensagem, quando o mesmo existir numa mensagem de requisição, haverá uma entidade, que pode ser um arquivo de música, uma imagem, uma página html, etc.

### Resposta

Uma mensagem de resposta é formada por uma linha de estado, as linhas de cabeçalho e o corpo da mensagem.
Na linha de estado, teremos a versão http, o código da resposta, e uma mensagem associada ao código. A versão http se refere à versão da mensagem de resposta. O código da resposta e a mensagem associada a ele trarão a informação sobre os resultados do processamento da requisição do cliente. O código de resposta é um número de três dígitos que indica o resultado formal que o servidor está comunicando ao cliente. Já a mensagem associada é opcional, e é um texto descritivo que pode ser mostrado para o usuário humano do cliente http, que poderá então saber o que o servidor respondeu.
Exemplos de Códigos de estado:
* 200 OK: Requisição bem sucedida.
* 301 Moved Permanently: o objeto requisitado foi movido, e a resposta retornará uma nova URL, com a localização do objeto.
* 400 Bad Request: o servidor não entendeu a requisição do cliente.
* 404 HTTP Not Found: O servidor não encontrou o objeto requisitado.
* 505 HTTP Version Not Supported: o servidor não suporta a versão http requisitada.
As linhas de cabeçalho devem trazer informações extras sobre a mensagem de resposta. Podemos encaixar o cabeçalho das mensagens de resposta em três tipos.
* Gerais: assim como nas mensagens de requisição, deverão conter informações referentes principalmente à própria mensagem, não tazendo informações sobre o corpo da mensagem.
* Resposta: provêem informação complementar visando ampliar as informações da linha de estado. O servidor poderá também retornar informações extras no corpo da mensagem, principalmente se ocorrerem erros.
* Entidade: descrevem a entidade contida no corpo da mensagem, se existir alguma. São mais frequentes nas mensagems de resposta.
No corpo de mensagem, quando o mesmo existir numa mensagem de requisição, haverá uma entidade, que pode ser um arquivo de música, uma imagem, uma página html, etc.

## Cache WEB ou Servidores Proxy

Nos últimos anos o número de usuários da Internet aumentou de maneira significativa e esse número cresce a cada ano. Com isso, sem nenhum mecanismo de controle de banda ou constante aumento dessa banda, o tempo de resposta em uma requisição de um cliente a um servidor pode demorar muito.
Para amenizar o impacto desses usuários na rede um mecanismo barato que tem sido largamente implementado é o cache web. A ideia do cache web ou servidor proxy é muito simples: o cliente web se conecta ao cache web para obter determinado conteúdo. Se o cache web não tiver o conteúdo solicitado armazenado, ele faz requisição ao servidor web de destino. O conteúdo é então repassado primeiro ao cache web, que o armazena e só então é repassado ao cliente web de destino. Pode-se dizer então que o proxy é tanto um servidor quanto um cliente.
Nesse processo tem-se um notável ganho de desempenho quando uma mesma página é requisitada várias vezes por clientes web, pois o conteúdo solicitado está armazenado numa maquina local. Outro benefício é que tanto o servidor web quanto a rede externa também são desafogados, já que a requisição do cliente não chegará até eles. De uma forma mais global, os servidores proxy também melhoram o desempenho da Internet como um todo.

## Cookies
### Principais objetivos

Os cookies são pequenos arquivos gravados nos computadores clientes, com determinadas informações sobre sessões do navegador. A principal função desses arquivos é a da persistência das sessões HTTP. Outras funções do cookie é a restrição de acesso a determinados serviços e a identificação de usuários.

### Funcionamento dos Cookies

A comunicação do cookie acontece basicamente em três etapas:
* O Navegador solicita uma página
* O Servidor responde com a página + o cookie
* O Navegador pede outra página já utilizando o cookie

### Parâmetros dos Cookies

Todo arquivo de cookie, tem alguns paramêtros básicos. Dentre eles:
* Nome
* Valor
* Tempo de Vida
* Domínio

### Utilização dos Cookies

Como exemplo de serviços que utilizam os cookies em larga escala, temos:
* Comércio Eletrônico
* Google Accounts
* Redes Sociais
* Bancos On-Line
* Blogs
* Fóruns