Introdução aos Cabeçalhos HTTP
Visão Geral dos Campos de Cabeçalho
O protocolo HTTP utiliza campos de cabeçalho para permitir a comunicação eficiente entre cliente e servidor. Cada cabeçalho possui uma função específica no processo de requisição e resposta.
Principais Cabeçalhos de Requisição
| Campo | Descrição |
|---|---|
| Except | Indica os tipos de conteúdo que o cliente consegue processar. Aceita valores como text/html, application/json, ou curingas como */* |
| Accept-Encoding | Especifica os algoritmos de compressão suportados (gzip, deflate, br) |
| Accept-Language | Declara o idioma preferido parra o conteúdo (pt-BR, en-US, etc) |
| Authorization | Contém credenciais para autenticação em recursos protegidos |
| Host | Especifica o domínio e porta do servidor-alvo |
| User-Agent | Identifica o cliente (navegador, aplicação) making the request |
| Referer | Indica a URL de origem da requisição |
Cabeçalhos de Resposta Importantes
| Campo | Descrição |
|---|---|
| Content-Type | Indica o tipo MIME do conteúdo retornado |
| Content-Length | Tamanho do corpo da resposta em bytes |
| Content-Encoding | Compressão aplicada ao corpo da resposta |
| Cache-Control | Diretivas de cache para entermediários e cliente |
| ETag | Identificador único para versão de um recurso |
| Last-Modified | Data da última modificação do recurso |
| Expires | Data/hora de expiração do recurso |
| Set-Cookie | Envia cookies para o cliente |
Cabeçalhos de Controle de Conexão
| Campo | Descrição |
|---|---|
| Connection | Controla se a conexão será mantida aberta após a transação |
| Keep-Alive | Parâmetros para conexão persistente (timeout, max requests) |
| Transfer-Encoding | Forma de codificação do corpo da mensagem |
| Upgrade | Solicita mudança de protocolo |
Exemplo Prático de Requisição HTTP
GET /api/usuarios/123 HTTP/1.1
Host: api.exemplo.com.br
User-Agent: MeuCliente/2.0
Accept: application/json
Accept-Encoding: gzip, deflate
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Cache-Control: no-cache
Cookie: sessao=abc123xyz
Exemplo de Resposta HTTP
HTTP/1.1 200 OK
Date: Mon, 15 Jan 2024 10:30:00 GMT
Server: Nginx/1.18.0
Content-Type: application/json; charset=utf-8
Content-Length: 512
Cache-Control: max-age=3600
ETag: "a1b2c3d4"
Last-Modified: Mon, 15 Jan 2024 09:00:00 GMT
Expires: Mon, 15 Jan 2024 11:30:00 GMT
Modo Keep-Alive em HTTP
Conceito Fundamental
O protocolo HTTP tradicionalmente segue o modelo requisição-resposta, onde cada interação abre uma nova conexão TCP. O modo Keep-Alive (ou conexão persistente) permite reutilizar a mesma conexão TCP para múltiplas requisições HTTP consecutivas.
Evolução nas Versões do HTTP
- HTTP/1.0: Keep-Alive desabilitado por padrão. Era necessário incluir o cabeçalho
Connection: Keep-Alivepara ativar. - HTTP/1.1: Keep-Alive ativado por padrão. Para desativar, utiliza-se
Connection: close. - HTTP/2 e HTTP/3: Suporte nativo a multiplexação e conexões persistentes.
Vantagens do Keep-Alive
- Redução da latência ao eliminar handshake TCP para cada requisição
- Menor consumo de recursos do servidor (menos sockets abertos)
- Melhor utilização de conexões em redes de alta latência
- Diminuição do overhead de CPU com criptografia TLS/SSL
Mecanismos de Keep-Alive
Keep-Alive HTTP vs TCP
Keep-Alive HTTP: Funciona no nível de aplicação, mantendo uma conexão HTTP ativa para múltiplas requisições. O servidor pode fechar a conexão após período de inatividade ou número máximo de requisições.
Keep-Alive TCP: Funciona no nível de rede, verificando se a conexão ainda está ativa através de pacotes de verificação (probes). Útil para detectar conexões quebradas.
Configuração em Servidores Comuns
# Nginx - Configuração de Keep-Alive
upstream backend {
server 192.168.1.10:8080;
keepalive 32; // Número de conexões persistentes
}
server {
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
# Apache - Configuração Keep-Alive
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Keep-Alive HTTP vs WebSocket
HTTP Keep-Alive
- Mantém conexão TCP aberta para reuse
- Servidor pode encerrar a qualquer momento
- Cliente sempre inicia a comunicação
- Modelo request-response
WebSocket
- Conexão bidirecional full-duplex
- Ambas as partes mantêm estado da conexão
- Qualquer lado pode enviar dados a qualquer momento
- Protocolo dedicado para comunicação em tempo real
Comparativo Técnico
// HTTP Keep-Alive - Pseudocódigo
class HTTPKeepAlive {
private TCPConnection conexao;
private int maxRequisicoes = 100;
private int timeout = 30;
public Resposta enviar(Requisicao req) {
if (conexao.expirada() || requisicoes >= maxRequisicoes) {
conexao.fechar();
conexao = new TCPConnection();
}
return conexao.enviar(req);
}
}
// WebSocket - Pseudocódigo
class WebSocketClient {
private TCPConnection conexao;
public void conectar(String url) {
conexao = new TCPConnection();
conexao.enviar("GET /ws HTTP/1.1\r\nUpgrade: websocket\r\n");
}
public void enviarMensagem(String dado) {
conexao.enviar(dado); // Bidirecional
}
}
Boas Práticas
- Configure timeout adequado conforme tipo de aplicação
- Limite o número de requisições por conexão para evitar abuse
- Monitore conexões ativas em produção
- Considere HTTP/2 para aplicações com muitas requisições simultâneas
- Implemente health checks com TCP keep-alive para detectar falhas