Cabeçalhos HTTP e Conexões Persistentes

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-Alive para 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

  1. Redução da latência ao eliminar handshake TCP para cada requisição
  2. Menor consumo de recursos do servidor (menos sockets abertos)
  3. Melhor utilização de conexões em redes de alta latência
  4. 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

Tags: HTTP keep-alive protocolo-http cabecalhos-http TCP

Publicado em 6-26 21:19