HTTP/1.1, HTTP/2 e HTTP/3
Voltar para Learn
FAACCapítulo 5

Fundamentos e Arquitetura de APIs Corporativas

HTTP/1.1, HTTP/2 e HTTP/3

Semântica, mensagens, conexões, multiplexação e QUIC em arquiteturas de APIs

Edição aprofundada — material de estudo e consulta profissional

Evolução de mensagens HTTP para streams multiplexados e QUIC através de um API Gateway

Apresentação do capítulo

é frequentemente apresentado por meio de exemplos curtos de e , mas essa visão é insuficiente para quem opera corporativos. Em produção, é um protocolo com semântica própria, regras rigorosas de delimitação, mecanismos de negociação, , condições, intermediários e diferentes mapeamentos de transporte. Uma chamada que aparenta ser uma única requisição pode ser recebida em na borda, convertida para /2 até o e encaminhada em /1.1 ao . Cada salto possui sua própria conexão, estado, , compressão de campos e risco operacional.

As versões /1.1, /2 e não representam três diferentes. Elas compartilham métodos, códigos de status, campos e conceitos de representação definidos pela semântica , mas codificam e transportam esses elementos de formas diferentes. /1.1 utiliza uma sintaxe textual sobre um fluxo ; /2 introduz frames binários e multiplexados sobre uma conexão; leva a semântica para , que funciona sobre e integra 1.3 ao transporte.

Para um engenheiro de , a distinção entre semântica e versão de fio é central. Um erro 405 não é consequência de ou ; ele indica que o método não é permitido pelo recurso. Um sem resposta aponta para outra camada. Um 502 pode ter sido gerado pelo após falha na conexão com o . Já um comportamento intermitente em /2 pode envolver limites de , janela de fluxo, drenagem ou uma tradução inadequada para /1.1 no próximo salto.

Este capítulo constrói um modelo mental completo: primeiro estabelece a semântica comum, depois aprofunda o formato e as conexões de /1.1, em seguida explica a arquitetura de frames e do /2 e, por fim, apresenta e . O objetivo não é decorar listas, mas compreender quais propriedades permanecem estáveis, quais mudam entre versões e quais evidências devem ser coletadas em cada ponto de uma arquitetura corporativa.

Princípio central

A semântica pertence à operação; a versão e a conexão pertencem a cada salto. Um termina uma mensagem, aplica regras e cria uma nova mensagem para o próximo destino.

Objetivos de aprendizagem

  • Explicar a arquitetura semântica de e separar significado, representação e mapeamento de transporte.
  • Interpretar método, alvo da requisição, autoridade, campos, conteúdo, e códigos de status.
  • Distinguir segurança, e cacheabilidade dos principais métodos.
  • Projetar e revalidação usando -Control, Age, , Last-Modified e requisições condicionais.
  • Interpretar a sintaxe de /1.1, incluindo CRLF, -Length, Transfer-Encoding e mensagens sem conteúdo.
  • Compreender conexões persistentes, , , e .
  • Reconhecer riscos de parsing divergente, , splitting e campos -by- .
  • Explicar frames, , , controle de fluxo, e no /2.
  • Entender , h2, h2c, coalescing de conexões e limites de concorrência.
  • Explicar , integração com 1.3, Connection IDs, migração, perda e independentes.
  • Compreender frames , de controle, , e descoberta por /SVCB.
  • Comparar /1.1, /2 e em latência, observabilidade, segurança e operação.
  • Aplicar os conceitos a Axway , Azure Management e arquiteturas com múltiplos .
  • Diagnosticar falhas por meio de , cabeçalhos, , métricas de conexão e capturas de tráfego.

Estrutura do capítulo

Tabela 1 - Organização conceitual do capítulo.
BlocoConteúdoPergunta orientadora
ASemântica HTTPO que a mensagem significa independentemente da versão?
BHTTP/1.1Como mensagens textuais são delimitadas dentro de um fluxo TCP?
CHTTP/2Como frames e streams compartilham uma conexão com eficiência?
DHTTP/3 e QUICComo reduzir bloqueios e tornar conexão, segurança e mobilidade parte do transporte?
EGateways e operaçãoComo versões diferentes convivem e como localizar falhas em cada salto?

: protocolo de aplicação e arquitetura semântica

A 9110 define como um protocolo de aplicação para sistemas distribuídos e estabelece conceitos comuns a todas as versões. “ ” não significa que aplicações não possam manter sessão ou estado de negócio. Significa que o protocolo não exige que o servidor preserve, entre requisições independentes, o contexto necessário para interpretar a próxima mensagem. Estado pode ser representado em recursos, bancos de dados, , , ou sessões, mas cada requisição precisa transportar informações suficientes para ser processada de acordo com o contrato.

A unidade semântica principal é uma mensagem de requisição ou resposta. Uma requisição expressa um método aplicado a um alvo, acompanhada de campos e, opcionalmente, conteúdo. Uma resposta comunica o resultado por meio de um código de status, campos e possível conteúdo. não determina que o conteúdo seja nem que a seja . O protocolo pode transportar , imagens, , Protobuf, arquivos, eventos e outros formatos registrados ou acordados entre as partes.

A semântica também define propriedades que orientam intermediários. precisam saber quando uma resposta pode ser reutilizada; precisam diferenciar campos destinados ao próximo salto de metadados fim a fim; clientes precisam decidir quando uma operação pode ser repetida após falha; precisam preservar autoridade, método e conteúdo sem criar ambiguidades. Essas propriedades são mais importantes para interoperabilidade do que a aparência textual observada em um exemplo de /1.1.

Semântica HTTP comum mapeada de formas diferentes por HTTP/1.1, HTTP/2 e HTTP/3
Figura 1 - A semântica é compartilhada; cada versão define um mapeamento diferente para a rede.

Leitura para

Quando um recebe /2 e chama um em /1.1, ele não “encaminha frames”. Ele decodifica uma mensagem, executa políticas e gera outra mensagem compatível com o próximo protocolo.

Evolução: de mensagens mínimas a transporte multiplexado

/0.9 possuía uma forma extremamente simples: uma requisição seguida pelo caminho, e uma resposta composta pelo documento. Não havia códigos de status, campos, negociação de tipo ou conexão persistente. Essa simplicidade atendia aos primeiros documentos da Web, mas não oferecia mecanismos adequados para aplicações distribuídas complexas. /1.0 introduziu versões na linha inicial, códigos de status, campos e tipos de mídia, permitindo representar metadados e diferentes conteúdos.

/1.1 consolidou conexões persistentes por padrão, o campo Host, mais completo, requisições condicionais, transferências em e regras de . O protocolo passou a suportar vários sites no mesmo endereço e reduziu o custo de abrir uma conexão por objeto. Ainda assim, a dependência de um fluxo ordenado e o formato sequencial criaram limites para páginas e com muitas operações concorrentes.

/2 preservou a semântica e substituiu o formato textual de mensagem por frames binários associados a . Isso permitiu intercalar várias trocas na mesma conexão e comprimir campos repetitivos com . manteve o modelo de e frames, mas substituiu por . Assim, perda em um não precisa impedir a entrega de dados disponíveis de outros , e o criptográfico passa a integrar o estabelecimento do transporte.

Linha do tempo da evolução do HTTP/0.9 ao HTTP/3
Figura 2 - Evolução histórica do protocolo .

Compatibilidade semântica

Um método continua sendo em /1.1, /2 e . O que muda é como método, alvo, campos e conteúdo são representados e transportados.

Modelo de transação: requisição, resposta e mensagens autodescritivas

Uma transação começa quando um cliente envia uma requisição a um servidor de origem ou . A requisição contém informações de controle e metadados que permitem determinar o recurso, a operação e a forma esperada de resposta. O servidor produz uma ou mais respostas informativas e uma resposta final. Em /1.1, os elementos aparecem como linhas e campos; em /2 e , são convertidos em pseudo-campos e frames.

O conteúdo de uma mensagem é conceitualmente diferente de sua representação no fio. Campos como -Type e -Encoding descrevem a representação. O informa como localizar o conteúdo dentro da conexão. Em /1.1, -Length ou pode delimitar o corpo; em /2 e , o conteúdo é carregado em frames DATA e o final do indica o término. Confundir metadados da representação com produz bugs de interoperabilidade e vulnerabilidades.

são campos enviados após o conteúdo. Podem carregar metadados calculados ao final da transmissão, como integridade ou status de protocolos construídos sobre . Nem todos os intermediários preservam , e o contrato precisa considerar essa possibilidade. Em , transformar em buffering completo pode mudar latência, memória consumida e a capacidade de entregar ao cliente.

Anatomia conceitual de uma requisição e de uma resposta HTTP
Figura 3 - Anatomia conceitual de requisição e resposta.
POST /v1/payments HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json
Content-Length: 42
{"amount":100.00,"currency":"BRL"}

Identificadores, , autoridade e alvo da requisição

Uma identifica um recurso ou referência utilizada na interação. No uso comum de , a inclui esquema, autoridade, caminho e consulta. Em ` :// .example.com:443/v1/accounts/123? view=summary`, o esquema é , a autoridade contém host e porta, o caminho identifica uma hierarquia lógica e a query adiciona parâmetros. O fragmento, quando presente em uma , é processado pelo cliente e não é enviado na requisição .

/1.1 utiliza diferentes formas de -target conforme o método e o tipo de . A -form envia caminho e query; a absolute-form é típica em forward ; a -form é usada por CONNECT; e a asterisk-form aparece em `*`. O campo Host é obrigatório em /1.1 e informa a autoridade pretendida. Em /2 e , pseudo-campos como `:scheme`, `: `, `:path` e `:method` representam esses componentes.

devem tratar autoridade com atenção porque ela participa de roteamento, seleção de certificado, políticas e proteção contra ataques de Host . Um pode receber um endereço público e chamar um host interno diferente; isso não autoriza substituir indiscriminadamente o significado da autoridade original. Em algumas arquiteturas, o precisa conhecer o host externo por campos `Forwarded` ou equivalentes, mas esses campos só devem ser confiados quando inseridos por intermediários controlados.

Tabela 2 - Componentes comuns de uma URI HTTP.
ComponenteExemploUso técnico
SchemehttpsDefine esquema e expectativas de segurança.
Authorityapi.example.com:443Identifica host e porta lógica da origem.
Path/v1/accounts/123Seleciona recurso ou rota.
Queryview=summaryParâmetros não hierárquicos.
Fragment#sectionNão é enviado ao servidor.

Métodos: intenção, segurança e

O método expressa a intenção da requisição. solicita a transferência de uma representação; solicita os mesmos metadados sem conteúdo de resposta; pede que o recurso processe o conteúdo conforme sua semântica; substitui ou cria o estado no alvo; solicita a remoção da associação atual; descreve opções de comunicação; CONNECT estabelece um túnel; executa um diagnóstico de loopback e costuma ser desabilitado em ambientes corporativos.

Um método seguro é definido como essencialmente de leitura: o cliente não solicita alteração do estado do servidor. Isso não impede , métricas ou cobrança operacional, mas significa que o efeito pretendido não é uma mudança de negócio. significa que repetir a mesma intenção várias vezes deve produzir o mesmo efeito desejado que uma única execução. e são idempotentes na semântica, embora respostas e efeitos secundários observáveis possam variar.

A distinção é decisiva para . Um pode repetir uma requisição após falha de conexão com menor risco semântico. Repetir de pagamento pode duplicar a operação se o tiver processado o conteúdo antes de a resposta se perder. financeiras frequentemente introduzem uma chave de de aplicação, persistindo o resultado associado a uma chave única. Essa estratégia complementa, mas não altera, a semântica do método .

Comparação de segurança e idempotência dos principais métodos HTTP
Figura 4 - Propriedades semânticas dos principais métodos.

não é apenas uma decisão técnica

Antes de configurar no , classifique a operação, determine o ponto em que o pode ter produzido efeito e defina como duplicidades serão detectadas.

Códigos de status e autoria da resposta

O código de status descreve o resultado da tentativa de interpretar e satisfazer a requisição. Respostas 1xx são informativas; 2xx indicam sucesso; 3xx orientam redirecionamento ou uso de outra representação; 4xx indicam que a requisição não pode ser atendida nas condições apresentadas; 5xx informam falha do servidor ou . A classe é relevante, mas o código específico e os campos associados fornecem a semântica completa.

Em arquiteturas com , o código final pode ser criado por qualquer . Um 401 pode vir de uma política de autenticação do sem que o seja chamado. Um 429 pode representar rate limit da borda. Um 502 normalmente indica que um não obteve uma resposta válida do ; um 504 representa atuando como . devem registrar autoria, estágio da política e status do separadamente.

Reason phrases de /1.1 são informativas e não devem controlar lógica. /2 e transmitem o código em `:status` e não transportam reason phrase. Clientes devem tomar decisões com base no número e nos campos, não em textos como “OK” ou “Unauthorized”. Em , respostas de erro podem adicionar um formato de problema, correlação e detalhes, mas o corpo não substitui a semântica do status.

Tabela 3 - Códigos frequentes em APIs corporativas.
CódigoSignificado operacionalPonto de atenção em gateways
200Operação concluída com representação.Pode ser cacheada conforme campos e método.
201Recurso criado.Location pode identificar o novo recurso.
204Sucesso sem conteúdo.Não inventar corpo durante transformação.
304Representação armazenada continua válida.Não é resposta normal com corpo.
400Requisição inválida.Pode vir de parsing, validação ou contrato.
401Credenciais ausentes ou inválidas.WWW-Authenticate descreve o desafio.
403Entidade compreendida, mas não autorizada.Não confundir com falha de autenticação.
404Recurso não encontrado ou ocultado.Pode vir do roteamento do gateway.
409Conflito com estado atual.Útil em concorrência e idempotência.
413Conteúdo grande demais.Limite pode existir em cada intermediário.
429Limite excedido.Retry-After pode orientar nova tentativa.
502Resposta inválida do upstream.Investigar conexão e parsing entre gateway e backend.
503Serviço indisponível.Pool vazio, manutenção ou overload.
504Timeout de gateway.Descobrir qual hop expirou primeiro.

Campos : metadados, escopo e normalização

Campos são pares nome-valor extensíveis. Eles transportam informações sobre controle, representação, , autenticação, negociação e intermediários. Nomes são case-insensitive, embora valores possam ter regras específicas. Um campo pode permitir uma única ocorrência, múltiplas ocorrências ou uma lista combinável. Implementações não devem concatenar campos indiscriminadamente, especialmente `Set- `, cuja semântica exige tratamento específico.

A 9110 distingue campos fim a fim de informações relacionadas à conexão. /1.1 usa o campo Connection para declarar nomes de campos que se aplicam apenas ao próximo salto. Intermediários devem remover esses campos antes de encaminhar. /2 e proíbem diversos campos específicos de conexão, pois e frames substituem mecanismos como `Transfer-Encoding: `. Replicar cabeçalhos de /1.1 sem entender seu escopo pode gerar falhas de protocolo.

Normalização é necessária, mas perigosa. podem alterar capitalização, ordem, combinar linhas, remover espaços opcionais ou reconstruir mensagens. Aplicações não devem depender da ordem dos campos. Por outro lado, assinaturas e esquemas de autenticação podem definir canonicalização explícita. Uma política de que modifica valores assinados precisa ser executada antes da assinatura ou preservar exatamente os componentes cobertos.

Tabela 4 - Categorias de campos relevantes para APIs.
CategoriaExemplosFunção
Roteamento e alvoHost, ForwardedIdentificar autoridade e caminho por intermediários.
RepresentaçãoContent-Type, Content-Encoding, Content-LanguageDescrever o conteúdo transferido.
NegociaçãoAccept, Accept-Encoding, Accept-LanguageExpressar preferências do cliente.
CacheCache-Control, Age, ETag, VaryControlar armazenamento e reutilização.
AutenticaçãoAuthorization, WWW-AuthenticateApresentar credencial ou desafio.
CondiçãoIf-Match, If-None-Match, If-Modified-SinceExecutar operação conforme estado conhecido.
Observabilidadetraceparent, tracestate, correlaçãoPropagar contexto entre serviços.

Representações, tipos de mídia e negociação de conteúdo

Um recurso é uma abstração; a representação é uma sequência de bytes e metadados que descreve um estado desse recurso. O mesmo recurso pode ser representado como , , CSV ou imagem. ` -Type` informa o tipo de mídia da representação enviada, enquanto `Accept` expressa quais tipos o cliente considera aceitáveis. Enviar sem ` -Type: application/ ` obriga o receptor a inferir ou rejeitar o conteúdo.

pode ocorrer de forma proativa, usando campos Accept, Accept-Encoding e Accept- Language, ou de forma reativa, quando o servidor oferece alternativas. O campo informa quais dimensões da requisição influenciaram a seleção da resposta e é essencial para . Se uma resposta varia por `Accept-Encoding`, um não deve entregar bytes gzip a um cliente que não os aceita.

-Encoding descreve transformações aplicadas à representação, como gzip ou br. Ele não deve ser confundido com Transfer-Encoding, que em /1.1 participa do da mensagem. que descomprimem conteúdo para inspeção precisam decidir se recompactam, corrigir -Length, preservar quando semanticamente válido e considerar limites de expansão para evitar ataques de descompressão.

GET /reports/2026 HTTP/1.1
Host: api.example.com
Accept: application/json, application/xml;q=0.8
Accept-Encoding: br, gzip
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Vary: Accept, Accept-Encoding

: frescor, reutilização e invalidação

não é apenas uma otimização de navegador. CDNs, reverse e podem armazenar respostas e atender requisições sem chamar o . A 9111 define quando uma resposta pode ser armazenada, considerada fresca, reutilizada ou revalidada. -Control transporta diretivas como max-age, no- , no-store, private, public e must-revalidate. `no- ` não significa “não armazenar”; significa que a resposta precisa ser validada antes de reutilização, salvo regras específicas.

A idade de uma resposta considera tempo desde sua geração e permanência em . O campo Age informa idade estimada. compartilhados precisam respeitar autorização e diretivas de privacidade. Em bancárias, armazenar respostas personalizadas sem chave de adequada pode causar vazamento entre usuários. A chave normalmente inclui e dimensões indicadas por , mas podem adicionar regras específicas conforme identidade, tenant ou produto.

Invalidar é difícil porque cópias podem existir em múltiplos níveis. Estratégias incluem curto, versionamento de , purga explícita e revalidação. A escolha precisa equilibrar consistência, custo e disponibilidade. Um indisponível pode ser protegido por respostas armazenadas, mas servir informação antiga em operação financeira pode ser inaceitável. Política de é uma decisão de domínio, não apenas de desempenho.

Fluxo de revalidação condicional de cache com ETag
Figura 5 - Revalidação condicional com .

Requisições condicionais e controle de concorrência

Requisições condicionais permitem executar uma operação somente se o estado do recurso satisfizer uma condição. `If-None-Match` é usado para revalidar ou garantir criação apenas quando não existe representação atual. `If-Match` exige que a entidade atual corresponda a uma e é útil para evitar lost updates. Campos baseados em data, como If-Modified-Since e If-Unmodified-Since, possuem granularidade e confiabilidade menores que validators opacos.

é um identificador da representação selecionada. Uma forte indica equivalência byte a byte adequada a operações como ranges; uma fraca indica equivalência semântica suficiente para determinados usos de . Ela não precisa ser criptográfico nem revelar versão interna. que transformam conteúdo podem invalidar a do , porque a representação entregue ao cliente deixou de ser a mesma.

No controle otimista, o cliente lê uma representação com , altera localmente e envia ou com If-Match. Se outro ator modificou o recurso, o servidor responde 412 Precondition Failed. Isso evita sobrescrever silenciosamente uma atualização concorrente. A política deve ser implementada no componente que controla o estado de negócio; um pode validar presença e formato, mas não conhece sozinho a versão atual do recurso.

GET /accounts/123
<- ETag: "v17"
PATCH /accounts/123
If-Match: "v17"
Content-Type: application/merge-patch+json
{"nickname":"Reserva"}
<- 204 No Content   ou   412 Precondition Failed

/1.1: sintaxe textual e fluxo de bytes

/1.1 representa mensagens como uma linha inicial, sequência de campos, linha vazia e conteúdo opcional. Linhas são delimitadas por CRLF. Uma requisição começa com método, -target e versão; uma resposta começa com versão e status. Embora ferramentas exibam mensagens de forma legível, a implementação precisa tratar octetos, limites, espaços e caracteres proibidos conforme a especificação. Tolerância excessiva a mensagens inválidas é uma fonte recorrente de inconsistência entre intermediários.

O receptor precisa determinar onde termina cada mensagem em uma conexão persistente. entrega um fluxo sem fronteiras de mensagem: um `recv()` pode retornar parte de uma linha, várias linhas ou dados de mensagens consecutivas. O parser acumula bytes, reconhece a seção de campos e aplica regras de . A conexão não pode simplesmente usar “fim do pacote” como limite, pois pacotes e segmentos são detalhes inferiores que podem ser divididos ou combinados.

Em , limites de tamanho para linha inicial, campos e conteúdo existem em clientes, WAFs, e servidores. Um campo aceito pela borda pode ser rejeitado pelo ; um permitido pelo pode exceder o . Configurações precisam ser coordenadas. Erros 400, 413, 414 e 431 ajudam a diferenciar requisição malformada, conteúdo grande, longa e campos excessivos.

HTTP-message = start-line CRLF
               *( field-line CRLF )
               CRLF
               [ message-body ]

em /1.1: -Length, e ausência de corpo

-Length informa o tamanho do conteúdo em octetos. Quando válido, o receptor lê exatamente essa quantidade após a linha vazia. `Transfer-Encoding: ` codifica o conteúdo em blocos, cada um precedido pelo tamanho hexadecimal, e termina com zero e opcionais. permite transmitir sem conhecer o tamanho total antecipadamente, mas é mecanismo -by- e não aparece em /2 ou .

Nem toda resposta possui corpo. Respostas a não incluem conteúdo, embora os campos descrevam o que uma teria retornado. Códigos 1xx, 204 e 304 possuem regras específicas sem conteúdo. Respostas bem-sucedidas a CONNECT mudam a conexão para modo túnel. Em outros casos, o encerramento da conexão pode delimitar a resposta, mas isso impede reutilização e é menos robusto.

Múltiplos -Length com valores diferentes, combinação indevida de -Length e Transfer- Encoding ou sintaxe inválida precisam ser tratados como erro. Se um e um escolhem regras diferentes, eles podem discordar sobre onde termina a requisição. O resultado pode variar de corrupção de conexão a . A estratégia segura é parsing estrito e normalização consistente antes de encaminhar.

Formas de delimitar o conteúdo de mensagens no HTTP/1.1
Figura 6 - Duas formas comuns de delimitar conteúdo em /1.1.
Tabela 5 - Determinação de comprimento em HTTP/1.1.
SituaçãoComo o comprimento é determinadoObservação
Resposta a HEADSem conteúdoCampos podem descrever uma GET equivalente.
1xx, 204, 304Sem conteúdoFraming não deve inventar body.
CONNECT 2xxTúnel após cabeçalhosBytes seguintes não são mensagens HTTP comuns.
Transfer-Encoding final chunkedChunks até tamanho zeroTrailers podem seguir o chunk zero.
Content-Length válidoNúmero exato de octetosValores conflitantes são erro.
Resposta sem framing explícitoAté fechar conexãoNão reutilizável e suscetível a truncamento.

Conexões persistentes, reuso, e

/1.1 utiliza conexões persistentes por padrão. Após uma resposta, cliente e servidor podem reutilizar o / para novas requisições, reduzindo e latência. Reuso só é seguro quando a mensagem anterior foi completamente delimitada e consumida. Se um cliente abandona um corpo sem ler, a conexão pode ficar desalinhada para a próxima transação.

mantêm pools de conexões para . O pool separa a conexão do cliente da conexão : centenas de clientes podem compartilhar um conjunto de conexões persistentes, conforme concorrência e capacidade. Parâmetros relevantes incluem máximo por destino, tempo ocioso, tempo de vida, connect , read e validação antes do reuso. Um pode encerrar conexões ociosas antes do , causando resets ao reutilizar aparentemente válidos.

devem formar um orçamento coerente. O cliente precisa esperar mais que a borda; a borda, mais que o ; o , tempo suficiente para o , mas menor que o limite total do consumidor. Se todos usam o mesmo valor, componentes podem expirar simultaneamente e produzir tempestades de . precisam distinguir tempo de conexão, envio, espera pelo primeiro byte e leitura do conteúdo.

Tabela 6 - Timeouts e limites de conexão.
ParâmetroO que limitaSintoma quando inadequado
Connect timeoutEstabelecimento TCP/TLS ao upstreamFalha rápida ou espera excessiva antes de enviar.
Read/response timeoutEspera por resposta ou dados504 mesmo quando backend conclui depois.
Idle timeoutTempo sem tráfego em conexão reutilizávelRST ao reutilizar conexão encerrada por outro salto.
Max lifetimeVida total da conexãoAjuda a renovar DNS e distribuir conexões.
Pool sizeConexões simultâneas por destinoFila local, latência ou excesso de sockets.
Request timeout totalOrçamento da operaçãoPrecisa incluir políticas e todos os saltos.

e no /1.1

permite enviar várias requisições em uma conexão sem aguardar cada resposta. Entretanto, as respostas precisam ser emitidas na mesma ordem. Se a primeira requisição demora, respostas prontas das seguintes ficam retidas. Esse bloqueio é conhecido como -of-line no nível de /1.1. A complexidade de , servidores intermediários e implementações inconsistentes limitou a adoção prática do .

Clientes frequentemente contornaram o problema abrindo múltiplas conexões paralelas por origem. Isso aumenta , uso de portas, filas de congestionamento e pressão em balanceadores. Para , múltiplas conexões podem distribuir carga de forma diferente de uma conexão /2 com muitos . Métricas baseadas apenas em “conexões ativas” deixam de representar corretamente a concorrência quando versões coexistem.

/2 foi projetado para multiplexar requisições independentes sem impor ordenação global de respostas. Ainda assim, todos os frames viajam sobre um fluxo , portanto uma perda de segmento pode atrasar a entrega de bytes posteriores de todos os . move o isolamento de para o transporte .

Bloqueio head-of-line em respostas de pipelining HTTP/1.1
Figura 7 - -of-line no /1.1.

Intermediários, campos -by- e transformação

é um participante que recebe uma mensagem e encaminha outra. Ele pode selecionar o próximo destino, aplicar autenticação, transformar conteúdo, armazenar ou registrar telemetria. Um atua como com políticas orientadas à . A mensagem de saída não precisa ser byte a byte igual à entrada, mas precisa preservar a semântica definida e cumprir requisitos de segurança.

Campos -by- pertencem a uma única conexão e não devem ser encaminhados automaticamente. Em /1.1, Connection declara opções aplicáveis ao salto; TE possui uso restrito; Transfer-Encoding e Upgrade descrevem a conexão atual. /2 e removem ou substituem esses conceitos. Um traduz , e não deve enviar `Transfer-Encoding: ` em um /2.

Transformações podem alterar -Length, -Encoding, , assinatura, cacheabilidade e . Uma policy que converte em precisa definir novo -Type e recalcular comprimento. Se o faz buffering para validar , a primeira resposta pode ficar mais lenta e o consumo de memória crescer com . A arquitetura deve documentar quais transformações são permitidas e em qual salto.

Regra operacional

Capture a mensagem lógica antes e depois de cada policy relevante. Comparar apenas pacotes da borda com do ignora as transformações introduzidas no caminho.

Parsing divergente e segurança de mensagens /1.1

ocorre quando dois participantes interpretam limites de mensagem de forma diferente. Um atacante envia uma sequência ambígua; o primeiro considera uma parte como corpo, enquanto o segundo interpreta bytes restantes como nova requisição. Isso pode contornar controles, envenenar , misturar respostas entre usuários ou alcançar rotas não previstas. Variações clássicas exploram conflitos entre -Length e Transfer-Encoding, mas o problema geral é desacordo de parsing.

splitting explora inserção de delimitadores de linha em valores que acabam incorporados a cabeçalhos, criando campos ou respostas adicionais. Implementações precisam rejeitar CR e LF não permitidos. Normalização inconsistente de espaços, nomes e caracteres também pode criar divergências. O princípio é aceitar somente sintaxe válida, rejeitar ambiguidades e evitar encaminhar mensagens parcialmente interpretadas.

/2 e possuem binário, mas podem participar de ataques quando um converte mensagens para /1.1 de forma insegura. Uma requisição H2 pode conter metadados que, ao serem serializados, criam ambiguidades no H1. Portanto, segurança exige validação no ponto de tradução, não apenas na borda. Atualizações recentes das especificações também refinam requisitos de Upgrade e dados antecipados; operadores devem acompanhar erratas e que atualizam o comportamento.

Request smuggling causado por interpretações divergentes do framing
Figura 8 - Exemplo conceitual de por divergente.

Defesa em profundidade

Use parsers conformes, remova combinações ambíguas, normalize uma única vez, mantenha front- end e back-end atualizados e teste explicitamente traduções H2/H3 para H1.

/2: camada de binário

/2 é uma expressão otimizada da semântica . Depois de estabelecida a conexão, os participantes trocam frames binários com cabeçalho fixo que informa comprimento, tipo, e ID. Frames carregam blocos de campos comprimidos; DATA transporta conteúdo; SETTINGS negocia parâmetros; WINDOW_UPDATE controla fluxo; RST_STREAM encerra um ; inicia encerramento coordenado da conexão.

Uma mensagem é mapeada para uma sequência de frames em um . O possui identificador e ciclo de vida independente. Requisição e resposta de uma operação usam o mesmo . Frames de distintos podem ser intercalados, permitindo concorrência sem abrir uma conexão para cada chamada. O receptor reconstrói cada mensagem usando ID e como END_HEADERS e END_STREAM.

O protocolo começa com um connection preface e troca de SETTINGS. Parâmetros incluem tamanho da tabela de campos, número máximo de simultâneos, tamanho inicial da janela e tamanho máximo de frame. SETTINGS precisa ser confirmado. Configurações são direcionais: o que um anuncia limita o comportamento do peer ao enviar para ele.

Frames de diferentes streams intercalados em uma conexão HTTP/2
Figura 9 - Frames de vários compartilhando uma conexão /2.
Tabela 7 - Frames importantes do HTTP/2.
FrameEscopoFinalidade
DATAStreamConteúdo da mensagem e possível END STREAM.
HEADERSStreamBloco inicial ou trailers comprimidos.
SETTINGSConexãoParâmetros e capacidades direcionais.
WINDOW UPDATEConexão ou streamAumentar crédito de controle de fluxo.
RST STREAMStreamAbortar operação específica.
PINGConexãoMedir vivacidade/RTT sem semântica HTTP.
GOAWAYConexãoParar novos streams e drenar os existentes.
PRIORITY UPDATEStreamSinalizar prioridade pelo modelo extensível atual.

, estados e encerramento

podem estar idle, open, half-closed, reserved ou closed, conforme frames enviados e recebidos. END_STREAM fecha a direção do remetente, permitindo que a outra direção continue. RST_STREAM encerra imediatamente o e informa um código de erro. Erros de não precisam derrubar a conexão inteira; erros de conexão exigem e encerramento.

contém o maior ID que pode ter sido processado e um código de erro. O peer não deve criar novos na conexão e pode repetir operações de acima do limite, considerando . Em e draining, devem emitir e permitir conclusão de aceitos. Encerrar abruptamente transforma uma manutenção planejada em falhas indistinguíveis de rede.

O número de concorrentes é limitado por SETTINGS_MAX_CONCURRENT_STREAMS e por recursos locais. Um cliente pode manter uma conexão, mas ficar bloqueado aguardando crédito para abrir novo . Métricas devem mostrar ativos, pendentes e rejeitados, não apenas conexões. Um único cliente com /2 pode gerar alta concorrência por uma conexão.

Tabela 8 - Eventos de ciclo de vida em HTTP/2.
EventoEfeitoDecisão operacional
END STREAM em requisiçãoCliente terminou conteúdo.Gateway pode iniciar processamento completo ou streaming.
END STREAM em respostaServidor terminou mensagem.Stream pode fechar se ambas direções terminaram.
RST STREAMCancela stream específico.Registrar iniciador e código; efeito de negócio pode já existir.
GOAWAY NO ERRORDrenagem coordenada.Abrir nova conexão para novos streams.
GOAWAY com erroFalha da conexão.Avaliar retries por stream e idempotência.
Limite de streamsNovas operações aguardam.Aumentar conexões ou ajustar concorrência com cautela.

, controle de fluxo e pressão de memória

permite intercalar frames, mas não elimina a necessidade de . /2 aplica controle de fluxo a DATA no nível de conexão e de . O receptor anuncia crédito; à medida que consome bytes, envia WINDOW_UPDATE. Se a aplicação não lê um , sua janela pode zerar. Se a janela da conexão zera, todos os ficam impedidos de enviar DATA, mesmo que alguns consumidores estejam rápidos.

Controle de fluxo não é o mesmo que congestion control . O primeiro protege do receptor e da aplicação; o segundo adapta envio à capacidade da rede. Ambos atuam simultaneamente. Aumentar janelas pode melhorar throughput em caminhos de alto bandwidth-delay product, mas aumenta memória potencial. precisam limitar , frames, campos e conteúdo para evitar que poucos clientes monopolizem recursos.

O /2 original possuía um mecanismo de dependência e peso para prioridades que se mostrou difícil de implementar de forma interoperável. A especificação atual remove o modelo antigo do núcleo e permite um esquema extensível. Operadores não devem presumir que prioridade do cliente será honrada fim a fim, principalmente quando existem que reordenam ou convertem protocolos.

Multiplexação HTTP/2 e bloqueio residual causado por perda TCP
Figura 10 - /2 e bloqueio residual causado pelo .

Sintoma clássico

Conexão saudável, ping /2 respondendo e alguns parados podem indicar janela de fluxo esgotada ou aplicação que deixou de consumir conteúdo.

: compressão de campos com estado por conexão

repetem campos como método, esquema, host, tipo de conteúdo e autenticação. Enviá-los integralmente em cada requisição aumenta overhead. comprime blocos de campos usando uma tabela estática de entradas comuns, uma tabela dinâmica construída durante a conexão, representações literais e codificação Huffman. Uma entrada repetida pode ser referenciada por índice em vez de retransmitir nome e valor.

A tabela dinâmica é direcional e sincronizada pela ordem dos blocos na conexão. O encoder decide quais valores inserir; o decoder mantém a mesma sequência. Alterar tamanho de tabela ou receber índice inválido pode gerar erro de compressão e encerrar a conexão. Intermediários terminam : o decodifica campos do cliente e cria sua própria codificação na conexão com o .

Campos sensíveis, como Authorization ou , não devem ser indexados quando isso aumenta risco ou retenção. inclui representação “never indexed”. Compressão também interage com ataques de canal lateral quando segredos e dados controlados compartilham contexto. Limites de tamanho de lista de campos continuam necessários, porque uma representação compacta pode expandir para muitos metadados.

Blocos de campos, tabelas estática e dinâmica e representação compacta do HPACK
Figura 11 - Componentes conceituais do .

Negociação: , , h2 e h2c

Na Web segura, /2 é normalmente negociado durante por . O cliente anuncia protocolos, por exemplo `h2` e ` /1.1`; o servidor seleciona um e informa no . Isso evita enviar uma requisição no formato errado. O certificado e o nome ainda precisam ser válidos para a origem. Depois de selecionado h2, o cliente envia o preface e frames /2.

/2 também pode operar sem usando o identificador h2c, com conhecimento prévio ou Upgrade de /1.1, mas esse modo é menos comum em tráfego público. Em redes internas, alguns componentes usam h2c para , enquanto termina em ou . Essa decisão reduz criptografia em um salto e precisa ser avaliada conforme confiança, compliance e observabilidade.

permite que uma conexão /2 seja reutilizada para múltiplas origens quando requisitos de resolução, certificado e autoridade são atendidos. Isso melhora eficiência, mas pode surpreender balanceamento baseado em conexão. e CDNs precisam impedir que autoridade não autorizada seja atendida na conexão. Origem lógica continua determinada pela semântica, não apenas pelo endereço conectado.

Negociação de HTTP/2 ou HTTP/1.1 por ALPN durante o handshake TLS
Figura 12 - Negociação do protocolo de aplicação com .

: semântica sobre

mapeia a semântica para . é um transporte orientado a conexão encapsulado em , com , controle de fluxo, detecção de perda, congestion control, segurança e migração de caminho. 1.3 é integrado ao ; não existe modo sem proteção criptográfica conforme a especificação. A aplicação vê confiáveis e ordenados individualmente, não datagramas crus.

Assim como /2, usa frames e DATA, mas os frames viajam em . Cada requisição usa um bidirecional iniciado pelo cliente. unidirecionais transportam controle e . Funções que já oferece, como ID e controle de fluxo, não são duplicadas pela camada . Por isso, alguns frames e mecanismos do /2 desaparecem ou mudam.

Usar não significa que seja não confiável. implementa confirmação, retransmissão e ordenação por . A diferença é que essas funções estão em espaço de usuário, integradas à criptografia e capazes de evoluir sem depender da implementação do sistema operacional. Firewalls e middleboxes que bloqueiam podem impedir , exigindo fallback para /2 ou /1.1.

Comparação das pilhas HTTP/1.1, HTTP/2 e HTTP/3
Figura 13 - Pilhas simplificadas de /1.1, /2 e .

Modelo mental

não é “ /2 sobre ”. Ele reutiliza ideias de e frames, mas delega ao propriedades que no /2 dependem de e separados.

, 1.3 e 0-

O negocia parâmetros de transporte e executa 1.3. Em uma conexão nova, o cliente pode enviar um pacote Initial contendo dados do ClientHello; o servidor responde e as chaves evoluem por níveis de criptografia. Em condições normais, dados de aplicação podem ser enviados com baixa quantidade de round trips. O protege quase todo o conteúdo de controle, reduzindo a visibilidade passiva disponível a middleboxes.

Em conexões retomadas, 0- pode permitir que o cliente envie dados de aplicação antes de confirmar completamente o novo . Esses dados não possuem a mesma proteção contra que dados 1- . Servidores devem aceitar 0- apenas para operações seguras contra repetição ou aplicar mecanismos de anti- e . Um financeiro não deve ser considerado seguro apenas porque usa .

aplica proteção contra amplificação antes de validar o endereço do cliente: o servidor limita bytes enviados em relação aos recebidos. podem ajudar a validar origem e controlar abuso, ao custo de round trip adicional. na borda precisam dimensionar estado de , limites e proteção DoS sem tratar todo como tráfego sem sessão.

Tabela 9 - Etapas relevantes do estabelecimento QUIC.
FaseProteção / propriedadeRisco operacional
InitialChaves deriváveis para permitir roteamento e início do handshake.Não confundir com ausência de integridade; conteúdo não é segredo forte contra observador.
HandshakeTLS autentica e negocia chaves finais.Perda ou bloqueio de UDP aparece como falha antes de HTTP.
1-RTTDados normais protegidos.Streams e controle de fluxo ativos.
0-RTTDados antecipados em retomada.Possível replay; restringir operações.
RetryValidação adicional de endereço.Aumenta latência, reduz amplificação e estado abusivo.

e eliminação do -of-line entre

Cada oferece entrega confiável e ordenada dentro do próprio . Pacotes podem carregar frames de vários . Se um pacote com dados do B se perde, o receptor pode continuar entregando dados completos dos A e C. Apenas o ponto faltante de B impede avanço ordenado daquele . Isso elimina o bloqueio transversal causado pelo fluxo único em /2.

A melhoria não elimina todo bloqueio. Um continua ordenado; perder bytes iniciais impede entregar bytes posteriores do mesmo . Controle de fluxo da conexão também pode bloquear todos os se o receptor não concede crédito. Dependências de podem suspender a decodificação de um bloco de campos. Portanto, métricas e precisam distinguir perda de pacote, bloqueado por dados, bloqueado por campos e janela de conexão.

numera dados e confirma pacotes, mas retransmite informação em novos pacotes, não “o mesmo pacote”. Packet numbers nunca são reutilizados no mesmo espaço. Detecção de perda e congestion control foram especificados em documentos associados. A implementação em espaço de usuário permite evolução, mas também exige observabilidade específica da biblioteca ou que termina .

Isolamento de perda entre streams de uma conexão QUIC
Figura 14 - Isolamento de perda entre .

Connection IDs, rebinding e migração de caminho

identifica uma conexão pelo conjunto de endereços e portas. Se um dispositivo móvel muda de Wi- Fi para rede celular, a tupla muda e a conexão normalmente se perde. utiliza Connection IDs escolhidos pelos , permitindo associar pacotes de um novo caminho à conexão existente. O novo caminho é validado com desafios antes de ser usado plenamente.

Connection IDs também permitem que balanceadores encaminhem pacotes sem depender exclusivamente da tupla. O desenho precisa considerar privacidade e evitar que um identificador estável permita rastreamento entre redes; podem fornecer múltiplos IDs e aposentá-los. e -aware precisam coordenar roteamento, chaves de /reset e afinidade.

Migração não é garantia de continuidade em qualquer ambiente. Políticas podem desabilitá-la; firewalls podem bloquear o novo caminho; o servidor pode exigir validação; mudanças de e alteram desempenho. devem registrar migração e path validation para diferenciar troca legítima de rede de instabilidade ou ataque.

Migração de caminho QUIC com Connection IDs e validação do novo endereço
Figura 15 - Validação e migração de caminho em .

Frames e de controle no

Uma conexão possui um de controle por . Nele são enviados SETTINGS, e outros frames de controle. Fechar prematuramente o de controle é erro de conexão. Requisições usam bidirecionais do cliente; cada uma carrega , DATA e conforme permitido. Frames de uma mensagem não podem aparecer em qualquer ordem arbitrária.

Como fornece controle de fluxo e reset de , utiliza mecanismos de transporte para parte do ciclo de vida. Erros possuem códigos e . Um cancelamento pode envolver reset do envio e pedido para interromper a direção oposta. Observabilidade deve associar , requisição e correlação de aplicação, pois um único pode carregar muitas operações.

remove recursos de /2 que dependiam do fluxo , mas preserva o conceito de drenagem. limita novos de requisição aceitos. Em , a borda deve anunciar encerramento, manter a conexão enquanto operações permitidas terminam e direcionar novas chamadas a outra conexão. Fechar state abruptamente causa perda de todas as operações ativas.

Tabela 10 - Estrutura básica de uma conexão HTTP/3.
Elemento HTTP/3TransporteUso
Request streamQUIC bidirecional iniciado pelo clienteUma requisição e sua resposta.
Control streamQUIC unidirecional por endpointSETTINGS, GOAWAY e controle HTTP.
QPACK encoder streamQUIC unidirecionalAtualizações da tabela dinâmica.
QPACK decoder streamQUIC unidirecionalConfirmações e cancelamentos.
HEADERSFrame HTTP/3Campos iniciais ou trailers.
DATAFrame HTTP/3Conteúdo da mensagem.

: compressão de campos adequada a

depende da ordem única da conexão para sincronizar a tabela dinâmica. Em , podem ser entregues independentemente; uma atualização de tabela perdida não deve bloquear desnecessariamente todos os . usa unidirecionais de encoder e decoder para transmitir instruções e confirmações, permitindo que blocos de campos em façam referências controladas.

Um bloco pode depender de entradas ainda não recebidas e ficar bloqueado até que as instruções cheguem. O decoder anuncia limites para número de bloqueados, e o encoder escolhe entre melhor compressão e risco de bloqueio. Representações literais e tabela estática permitem evitar dependências. Assim como no , valores sensíveis podem ser marcados para não indexação.

terminam e criam novo contexto na conexão seguinte. Uma falha de é erro de conexão e pode afetar muitas requisições. Monitorar apenas status não revela essa classe de falha, porque a mensagem pode não chegar a ser reconstruída. do terminador precisam expor códigos de erro de decompression e bloqueados.

Fluxos de encoder, decoder, requisições e tabela dinâmica no QPACK
Figura 16 - Fluxos conceituais do .

Descoberta de , , /SVCB e fallback

Um cliente precisa saber que a origem oferece e em qual . A 9114 define anúncio por Alternative Services: uma resposta /1.1 ou /2 pode incluir ` : h3=":443"`. O cliente armazena a alternativa por tempo limitado e tenta . também pode fornecer registros /SVCB com parâmetros de protocolo e . Suporte varia entre clientes e infraestrutura.

A origem lógica permanece a mesma, ainda que o serviço alternativo esteja em outro host ou porta. O cliente precisa validar a autoridade e certificado conforme as regras. não é redirecionamento de aplicação e não altera a exibida. Se a tentativa falha, clientes normalmente continuam ou retornam a /2/1.1, mas detalhes de temporização e de falha dependem da implementação.

Em , confirme se o cliente recebeu anúncio, se tentou , se h3 foi negociado e se ocorreu fallback. Uma captura apenas do tráfego pode mostrar a chamada funcionando e esconder tentativas malsucedidas. Bloquear /443 pode aumentar latência inicial mesmo quando fallback mantém disponibilidade. Registros /SVCB incorretos podem direcionar clientes modernos a diferente do usado por clientes legados.

Descoberta, tentativa QUIC e fallback para HTTP/2 ou HTTP/1.1
Figura 17 - Descoberta, tentativa e fallback de .
HTTP/1.1 200 OK
Alt-Svc: h3=":443"; ma=86400
# O cliente pode tentar uma conexão QUIC para a mesma origem na porta 443.

Comparação arquitetural entre /1.1, /2 e

Escolher uma versão não é apenas buscar “a mais nova”. /1.1 possui ampla compatibilidade e observabilidade simples, mas exige mais conexões para concorrência e sofre bloqueio sequencial. /2 reduz overhead e permite muitos em uma conexão, sendo essencial para , porém concentra operações em um e exige métricas de e fluxo. melhora comportamento sob perda e mobilidade, mas depende de , termina criptografia no componente que precisa interpretar e muda práticas de rede.

Ganhos dependem do perfil. Em rede estável e baixa latência, uma pequena pode mostrar diferença modesta. Em conexões móveis com perda, pode reduzir impacto entre e preservar conexão durante mudança de caminho. Em uma arquitetura corporativa com muitos intermediários, o benefício fim a fim pode ser reduzido se a borda recebe H3, mas o restante usa H1.1 com pools saturados.

Protocolos também afetam capacidade. Dez mil requisições podem usar milhares de conexões H1, centenas de conexões H2 ou H3, dependendo de concorrência e limites. Balanceamento por conexões fica menos representativo em . Um único cliente pode concentrar em uma instância. Algoritmos, limites e observabilidade precisam evoluir com o protocolo.

Tabela 11 - Comparação resumida das versões.
AspectoHTTP/1.1HTTP/2HTTP/3
TransporteTCP; TLS separado em HTTPSTCP; normalmente TLS + ALPNQUIC sobre UDP; TLS 1.3 integrado
FormatoLinhas e campos textuaisFrames bináriosFrames sobre streams QUIC
ConcorrênciaSequencial/pipeline; várias conexõesStreams multiplexadosStreams multiplexados isolados por perda
Compressão de camposNão padronizada no protocoloHPACKQPACK
HOLNo HTTP e no TCPElimina HOL HTTP; mantém TCP HOLPerda bloqueia somente stream afetado
Migração de redeConexão geralmente quebraConexão geralmente quebraConnection IDs e path validation
Observabilidade passivaMais simples após TLS terminationFrames após TLS terminationMais controle criptografado; exige terminador QUIC
CompatibilidadeMáximaAmpla em browsers/proxies modernosDepende de UDP e suporte da borda

e tradução de protocolo por salto

Em uma cadeia corporativa, cada componente pode negociar sua própria versão. Um cliente usa com uma ; a usa /2 com o ; o usa /1.1 com o . A semântica precisa ser preservada, mas , compressão, e conexão são reconstruídos. Não existe H3 “atravessando” um que termina .

Tradução muda comportamento. Muitas requisições multiplexadas de uma conexão H2 podem exigir várias conexões H1 ao ou ser serializadas conforme pool. podem ser perdidos se o próximo protocolo ou produto não os preserva. Um reset de pode virar cancelamento de , enquanto o já processou a operação. de um lado não tem correspondência direta em uma conexão independente do outro lado.

Políticas devem ser semânticas. por conexão é inadequado quando uma conexão contém centenas de . Limites de precisam considerar tamanho descomprimido. deve usar autoridade e corretos. Observabilidade precisa registrar versão inbound, versão outbound, reutilização, ID quando disponível, tentativa de e status criado pelo .

Versões HTTP negociadas independentemente em cada salto da arquitetura
Figura 18 - Versões independentes em cada salto da arquitetura.

Pergunta de arquitetura

Qual é a versão negociada em cada conexão real: cliente-borda, borda- , -mesh e mesh- ? A resposta “a usa /2” normalmente é incompleta.

Aplicação em Axway

O Axway utiliza serviços para receber tráfego e configurações de remote hosts para conexões de saída. Em um desenho real, listener, interface, , política, roteamento e configurações do destino participam de saltos distintos. A investigação deve separar a versão e os campos recebidos pelo listener do que é produzido na conexão com o remote host. A documentação e a versão instalada precisam ser consultadas, pois capacidades e padrões podem variar por release.

Ao encaminhar para um , conexão persistente e influenciam latência, distribuição e consumo de . Configurações legadas podem usar comportamentos conservadores de , e equipes devem validar explicitamente a versão outbound desejada. Transformações e filtros podem alterar conteúdo, campos e . Transaction Access e de políticas devem registrar status final, tempo de conexão, tempo de resposta e erro de roteamento.

Um cenário frequente é o cliente observar /2 na borda, mas o registrar /1.0 ou /1.1. Isso não é necessariamente erro; pode ser decisão ou default do salto outbound. O risco surge quando a aplicação depende de , ou concorrência que não sobrevive à tradução. Testes devem cobrir o protocolo efetivo, não apenas o público.

Tabela 12 - Evidências para investigar HTTP no Axway API Gateway.
Ponto de verificaçãoEvidênciaPergunta
HTTP service/listenerConfiguração da porta, TLS e protocoloO que o cliente negocia com o gateway?
Policy flowTrace de filtros e transformaçõesQuais campos e conteúdo foram alterados?
Routing / remote hostDestino, versão, pool e timeoutComo o gateway cria a conexão upstream?
Access logstatus, bytes, tempos, correlaçãoQuem produziu a resposta e quanto demorou?
Backend logprotocolo e autoridade observadosO que realmente chegou ao serviço?

Aplicação em Azure Management

No Azure Management, o recebe chamadas, aplica policies e encaminha a . Suporte a /2 inbound, outbound e depende do tipo e da geração do , tier e configuração. A policy `forward- ` possui atributo de versão para cenários suportados. Como a plataforma evolui, a documentação oficial deve ser tratada como fonte de verdade para a instância utilizada.

A versão inbound não implica versão outbound. A documentação atual descreve comportamentos em que determinadas gerações aceitam /2 e podem fazer no encaminhamento, enquanto outras permitem configurar /2 para o . Isso afeta , e . Testes devem registrar `context`/ , diagnóstico do e métricas da instância para confirmar o caminho efetivo.

Policies como rewrite- , set- , set- , , e rate-limit operam sobre a mensagem lógica e podem mudar características observadas. precisa considerar . Set- geralmente implica acesso ao conteúdo e pode exigir buffering. deve respeitar identidade e . Ao combinar Application , Front Door, e , cada serviço termina sua própria conexão e pode possuir diferente.

Tabela 13 - Pontos de atenção no Azure API Management.
Elemento APIMImpacto HTTPValidação
Protocolos do gatewayCapacidades inbound e TLSVerificar configuração e tier.
forward-requestVersão e timeout do salto ao backendConfirmar suporte do gateway utilizado.
Policy de retryPode repetir chamada após falhaClassificar método e idempotência.
set-header / rewrite-uriAltera mensagem encaminhadaComparar trace com log do backend.
Cache policiesPode responder sem upstreamValidar chave, TTL e privacidade.
Diagnóstico e telemetryDistingue policy, gateway e backendPropagar correlation/trace context.

Observabilidade: o que medir em cada versão

Métricas comuns incluem taxa de requisições, status, latência, bytes e erros. Para /1.1, acrescente conexões abertas, novas conexões por segundo, reuso, pool wait e resets. Para /2, meça ativos por conexão, limite de concorrência, RST_STREAM, , janela de fluxo e erros de compressão. Para , inclua tentativas , sucesso/fallback, , perda, , migração, bloqueados e erros .

Latência deve ser decomposta. , conexão, / , tempo de policy, espera no pool, tempo até primeiro byte do e transferência do conteúdo respondem a perguntas diferentes. Uma métrica “total” alta não identifica causa. Distributed começa quando existe mensagem ; falhas anteriores podem exigir de rede e terminadores. O deve criar ou propagar identificadores de correlação de forma confiável.

Capturas de tráfego continuam úteis, mas criptografia limita conteúdo. Em sobre , o terminador pode fornecer key em laboratório controlado. criptografa mais elementos de controle, portanto qlog e métricas da biblioteca são valiosos. Em produção bancária, coleta precisa respeitar dados sensíveis: não registrar , , PAN, ou cabeçalhos completos sem mascaramento e base legal.

Tabela 14 - Observabilidade específica por versão.
MétricaHTTP/1.1HTTP/2HTTP/3
Unidade de concorrênciaConexão / requisiçãoStreamStream QUIC
Encerramento coordenadoConnection: close / FINGOAWAY + streamsGOAWAY + fechamento QUIC
CancelamentoFechar conexão pode afetar outras chamadasRST STREAMReset/stop-sending por stream
Compressão de camposN/A no núcleoErros HPACKErros e bloqueios QPACK
Sinal de fallbackNova conexão em outra versãoALPN http/1.1Falha QUIC seguida de H2/H1
Perda relevanteTCP retransmissionTCP retransmission afeta streamsPerda por path/stream e recovery QUIC

Método de ponta a ponta

O primeiro passo é determinar se houve uma resposta válida. Erros de , , , ou podem ocorrer antes de qualquer status. Ferramentas às vezes convertem falhas em mensagens genéricas, mas o não pode ter produzido 504 se a chamada nem chegou a ele. Identifique o último componente que possui evidência da tentativa e o primeiro que não possui.

Quando existe status, determine autoria. Compare status público, status , erro interno e policy executada. Um 503 do pode ser preservado; outro 503 pode ser criado pelo porque nenhum saudável estava disponível. como Server não são prova suficiente, pois podem ser removidos ou falsificados. Use correlação e timestamps entre controlados.

Em seguida, registre versão e conexão em cada salto. Confirme , protocolo outbound, reuso, reset, , e . Compare método, autoridade, path, campos relevantes e comprimento antes e depois do . Para falhas intermitentes, procure padrões por conexão, instância, , tamanho de , versão, rede e momento de .

Árvore inicial para classificar falhas antes e depois de uma resposta HTTP
Figura 19 - Árvore inicial para classificar falhas .
Tabela 15 - Matriz de sintomas e evidências.
SintomaHipóteses prioritáriasEvidência
Sem resposta / connection errorDNS, firewall, TCP/UDP, TLS/QUIC, portadig/nslookup, connect trace, handshake, logs da borda.
400 somente via gatewayParsing, normalização, limite, transformaçãoRaw request em laboratório, trace de policy, log do backend.
413/431Limite de conteúdo ou campos em algum saltoConfigurações e tamanho real descomprimido.
502Falha/invalidade do upstream, reset, protocoloErro interno do gateway, captura e log do backend.
503 intermitentePool, health, stream/conexão limit, deployMétricas por instância e conexão.
504Timeout do salto gateway-backend ou cadeiaBreakdown de latência e orçamento de timeouts.
H2 funciona, H1 falhaFraming, trailers, concorrência ou HostComparação da mensagem após tradução.
H3 lento antes de funcionarTentativa QUIC falha e fallbackUDP/443, Alt-Svc/HTTPS RR e logs QUIC.
RST em reusoIdle timeout desalinhadoIdade da conexão e encerramento no outro salto.
Duplicidade após timeoutRetry de operação não idempotenteLogs de tentativas e chave de idempotência.

Estudo de caso 1: duplicado após 504

Um cliente envia para criar uma transferência. O encaminha ao , que confirma a transação no banco, mas demora para gerar a resposta. O do expira e retorna 504. O cliente interpreta como falha e repete a chamada. Como não é idempotente por definição e não existe chave de deduplicação, o cria uma segunda transferência.

O problema não é resolvido apenas aumentando . A arquitetura deve definir semântica de : cliente envia chave única; preserva; registra chave e resultado atomicamente. Em repetição, retorna o resultado anterior. O pode usar somente para falhas claramente anteriores ao envio ou em operações classificadas. precisam mostrar ID, idempotency key, tentativa e resultado do .

Aprendizado

significa ausência de confirmação para o observador, não prova de ausência de efeito no sistema remoto.

Estudo de caso 2: /2 público e saturação no /1.1

Uma borda recebe milhares de /2 em poucas conexões e encaminha ao . O chama um /1.1 com pool de 100 conexões. Durante pico, entram rapidamente, mas aguardam conexão . Métricas de inbound parecem estáveis porque existem poucas conexões H2; a fila e a latência crescem no pool outbound.

A solução exige medir concorrência por e pool wait, aplicar limites de admissão, ajustar capacidade do e considerar /2 outbound quando suportado. Aumentar pool sem avaliar recursos pode deslocar overload para o serviço. Rate limit por conexão seria ineficaz, pois uma conexão H2 concentra muitos . O objetivo é alinhar concorrência lógica à capacidade real do .

Aprendizado

Em protocolos multiplexados, conexão deixa de ser uma boa aproximação para número de operações simultâneas.

Estudo de caso 3: anunciado, mas bloqueado

Uma passa a anunciar ` : h3`. Clientes modernos tentam em /443, mas uma rede corporativa bloqueia . Após um atraso, o cliente faz fallback para /2 e a funciona. Usuários relatam lentidão apenas no primeiro acesso; testes que forçam /2 não reproduzem. da mostram requisições normais, porque a tentativa falha antes da mensagem chegar.

A investigação precisa observar , , pacotes e temporização do fallback. A correção pode envolver permitir , remover anúncio para redes específicas quando possível ou aceitar o fallback com monitoramento. Não se deve concluir que causou erro de aplicação. O problema está na descoberta e estabelecimento do transporte, anterior à transação observada pelo .

Aprendizado

Disponibilidade por fallback pode esconder uma falha de caminho e adicionar latência invisível nos de aplicação.

Estudo de caso 4: tradução H2 para H1 cria inseguro

Um aceita /2 e converte pseudo-campos e DATA para /1.1. Uma combinação malformada passa pela validação H2, mas gera no H1 dois sinais de comprimento incompatíveis. O interpreta a mensagem de forma diferente e bytes controlados passam a compor a próxima requisição na conexão persistente. A vulnerabilidade só aparece quando o caminho inclui a tradução específica.

A mitigação exige validar a mensagem lógica antes de serializar H1, emitir exatamente um mecanismo de , rejeitar campos proibidos, atualizar intermediários e testar variações de smuggling. Desabilitar reuso pode reduzir impacto, mas não substitui correção. baseado apenas no texto de entrada H2 pode não enxergar a mensagem produzida ao .

Aprendizado

O ponto de maior risco é frequentemente a fronteira entre dois parsers ou versões, não um parser isolado.

Laboratórios práticos de leitura e diagnóstico

Laboratório 1 - Comparar /1.1 e /2 com cURL

Use um de laboratório que suporte ambas as versões. Execute chamadas forçando /1.1 e /2 e ative saída detalhada. Observe resolução, conexão, , , linha de requisição exibida, reutilização e tempo. Repita várias chamadas no mesmo processo para verificar reuso. Não utilize produtivos nem reais.

curl -v --http1.1 https://SEU-ENDPOINT-DE-LAB/status
curl -v --http2   https://SEU-ENDPOINT-DE-LAB/status
# Registrar também tempos:
curl -sS -o /dev/null -w "connect=%{time_connect} tls=%{time_appconnect} ttfb=%
{time_starttransfer} total=%{time_total}\n" https://SEU-ENDPOINT-DE-LAB/status

Laboratório 2 - Inspecionar com OpenSSL

Conecte-se a um servidor de laboratório e anuncie h2 e /1.1. Confirme o protocolo selecionado. Depois force apenas /1.1 e compare. O objetivo é perceber que ocorre no antes das mensagens . Em ambientes com , execute de pontos de rede diferentes para identificar terminações distintas.

openssl s_client -connect SEU-ENDPOINT-DE-LAB:443 -servername SEU-ENDPOINT-DE-LAB -alpn
"h2,http/1.1"
# Procure por: ALPN protocol: h2

Laboratório 3 - e revalidação

Crie um serviço de laboratório que retorne e -Control. Faça uma , armazene a e envie If-None-Match. Confirme 304 sem conteúdo. Modifique o recurso e repita. Adicione um de controlado e observe Age e . Documente como autenticação altera a possibilidade de .

curl -i https://SEU-ENDPOINT-DE-LAB/resource
curl -i -H "If-None-Match: \"ETAG-RECEBIDA\"" https://SEU-ENDPOINT-DE-LAB/resource

Laboratório 4 - /1.1 em ambiente isolado

Em um servidor local criado para estudo, envie mensagens com -Length correto e válido. Observe como o servidor lê o corpo. Depois teste entradas inválidas apenas em laboratório autorizado e confirme que são rejeitadas, sem tentar explorar sistemas de terceiros. O objetivo é entender parsing e validação, não executar ataque.

printf "POST /echo HTTP/1.1\r\nHost: localhost\r\nContent-Length: 5\r\n\r\nhello" | nc
127.0.0.1 8080

Laboratório 5 - Observar e fallback

Use uma ferramenta e de laboratório com suporte conhecido a . Registre tentativa , protocolo final e fallback quando é bloqueado em um ambiente de teste. Compare tempo até primeiro byte. Não altere firewalls corporativos sem autorização. Em clientes que suportam qlog, gere um local e visualize e .

curl -v --http3 https://SEU-ENDPOINT-DE-LAB/status
curl -v --http3-only https://SEU-ENDPOINT-DE-LAB/status
# A disponibilidade das opções depende da compilação do cURL e da biblioteca QUIC.

Laboratório 6 - Mapear versões por salto no

Publique uma de laboratório que retorne protocolo, Host e cabeçalhos de correlação observados pelo . Chame o público em diferentes versões e compare do listener, de policy e saída do . Desenhe cada conexão independente e anote , , versão, pool, e transformação. Este mapa é mais útil que declarar uma única “versão da ”.

  1. Registrar protocolo cliente-borda.
  2. Registrar protocolo borda- .
  3. Registrar protocolo - .
  4. Comparar Host/: e campos Forwarded.
  5. Executar chamada com conteúdo grande e observar buffering.
  6. Executar controlado e observar draining/ ou resets.

Checklist de arquitetura para corporativas

Tabela 16 - Checklist de projeto e revisão.
TemaPerguntas de revisão
SemânticaMétodos e status seguem suas propriedades? Retries respeitam idempotência?
URI/autoridadeHost e autoridade original são validados e preservados quando necessário?
CamposQuais são removidos, criados, assinados ou confiados em cada salto?
ConteúdoHá transformação, compressão, buffering, streaming ou limite descomprimido?
CacheQuais respostas podem ser armazenadas? A chave considera identidade e Vary?
HTTP/1.1Framing é estrito? Pools e idle timeouts estão coordenados?
HTTP/2Quais limites de streams, campos e janelas são configurados? GOAWAY é tratado?
HTTP/3UDP é permitido? Há fallback? Como qlog e métricas QUIC são coletados?
GatewayVersões inbound/outbound foram confirmadas por evidência?
ObservabilidadeStatus público, status upstream e erro interno são separados?
SegurançaTraduções de protocolo foram testadas contra ambiguidades e smuggling?
CapacidadeConcorrência é medida por requisições/streams, não apenas conexões?

Resumo do capítulo

oferece uma semântica estável para interação entre clientes, servidores e intermediários. Métodos expressam intenção; status comunicam resultado; campos descrevem controle e representação; e condições permitem reutilização e concorrência. Esses conceitos são independentes de , ou da versão de transporte.

/1.1 codifica mensagens textuais em um fluxo e exige regras rigorosas de . Conexões persistentes economizam , mas , e parsing divergente criam riscos. /2 introduz frames, , , controle de fluxo e , reduzindo overhead e -of-line no nível , embora perda ainda afete todos os .

utiliza sobre , integra 1.3, isola perda por , suporta Connection IDs e usa . Descoberta pode ocorrer por e registros /SVCB, com fallback para versões anteriores. Em , cada salto negocia sua própria versão; o profissional precisa observar a mensagem lógica e a conexão de cada segmento.

confiável começa por classificar se a falha ocorreu antes ou depois de existir resposta , identificar quem criou o status e mapear versões, , pools, e transformações. A arquitetura deve proteger semântica, e segurança durante traduções entre protocolos.

Exercícios de fixação

  1. Explique a diferença entre semântica e mapeamento de uma versão específica.
  2. Por que não significa que uma aplicação não possa manter sessão?
  3. Diferencie recurso, representação, conteúdo e .
  1. Quais componentes de uma participam de uma requisição e qual não é enviado?
  2. Diferencie método seguro de método idempotente e dê exemplos.
  3. Por que repetir após pode produzir duplicidade mesmo quando o cliente recebeu 504?
  4. Quem pode criar um 502 em uma cadeia com múltiplos ?
  5. Por que reason phrase não deve ser usada em lógica de cliente?
  6. Diferencie -Type, -Encoding e Transfer-Encoding.
  7. Explique por que é necessário em negociação de conteúdo com .
  8. O que significa ` -Control: no- `?
  9. Como e If-Match ajudam a evitar lost update?
  10. Por que não preserva limites de mensagem ?
  11. Quais riscos existem quando -Length e Transfer-Encoding são interpretados de forma diferente?
  12. Por que uma conexão persistente só pode ser reutilizada após consumir completamente a mensagem anterior?
  13. Descreva -of-line no /1.
  14. Como /2 mapeia uma requisição para frames e ?
  15. Diferencie controle de fluxo /2 de congestion control .
  16. Qual é o papel de SETTINGS_MAX_CONCURRENT_STREAMS?
  17. Como ajuda em e draining?
  18. Como reduz overhead e por que cria estado por conexão?
  19. Qual é o papel do na negociação de /2?
  20. Por que /2 continua sujeito a -of-line do ?
  21. Por que afirmar que é “ não confiável” está errado?
  22. Como permite migração de caminho?
  23. Qual é o risco de 0- para operações com efeito?
  24. Como difere conceitualmente de ?
  25. Como pode anunciar sem alterar a origem lógica?
  26. Por que uma pode usar publicamente e /1.1 no ?
  27. Quais métricas adicionais são necessárias em /2 e ?
  28. Proponha um orçamento de para cliente, borda, e .
  29. Desenhe uma estratégia de segura para e de pagamento.
  30. Explique como uma tradução H2 para H1 pode criar risco de .
  31. Descreva as evidências necessárias para provar qual versão foi usada em cada salto.

Questões para discussão arquitetural

  • Em uma organização com milhares de , quais critérios justificam habilitar /2 ou na borda e no ?
  • Como balanceadores devem distribuir carga quando poucas conexões carregam muitos ?
  • Quais campos devem ser removidos ou reconstruídos em uma cadeia com , , e service mesh?
  • Como garantir de operações financeiras quando e podem ocorrer em vários componentes?
  • Qual nível de observabilidade é aceitável em ambiente regulado sem expor dados sensíveis?
  • Quando buffering no é necessário e quando destrói benefícios de ?
  • Como testar segurança de parsing e tradução de protocolo em uma esteira automatizada?

Glossário

Tabela 17 - Glossário do capítulo.
TermoDefinição
ALPNExtensão TLS usada para negociar o protocolo de aplicação, como h2 ou http/1.1.
Alt-SvcMecanismo para anunciar serviço HTTP alternativo, inclusive endpoint HTTP/3.
AuthorityComponente que identifica host e porta lógica da origem.
Cache compartilhadoCache que pode reutilizar respostas para mais de um usuário ou cliente.
Connection coalescingReuso controlado de uma conexão HTTP/2 para mais de uma origem.
Connection IDIdentificador QUIC que permite associar pacotes à conexão além da tupla IP/porta.
ContentSequência de dados da mensagem após decodificações de framing apropriadas.
Content negotiationSeleção de representação conforme preferências e capacidades.
Control streamStream HTTP/3 unidirecional que transporta controle da conexão.
End-to-end fieldCampo cujo significado se aplica aos endpoints finais, mesmo através de intermediários.
ETagValidator opaco associado a uma representação.
Flow controlMecanismo que impede o emissor de exceder buffers anunciados pelo receptor.
FramingRegras para determinar limites e conteúdo de mensagens no transporte.
GOAWAYSinal de que uma conexão não aceitará novos streams/requisições além de determinado limite.
HEADERS frameFrame que transporta bloco comprimido de campos em HTTP/2 ou HTTP/3.
Head-of-line blockingAtraso em operações independentes causado por um item anterior ausente ou lento.
HPACKCompressão de campos utilizada pelo HTTP/2.
HTTP/3Mapeamento da semântica HTTP para QUIC.
IdempotênciaPropriedade pela qual repetir a mesma intenção produz o mesmo efeito pretendido.
IntermediárioParticipante HTTP que recebe e encaminha mensagens, como proxy ou gateway.
MultiplexaçãoCompartilhamento de uma conexão por múltiplas trocas independentes.
OriginOrigem lógica responsável pelo recurso identificado pela URI.
Pseudo-headerCampo especial de HTTP/2/3 iniciado por dois-pontos, como :method.
QPACKCompressão de campos usada pelo HTTP/3.
QUICTransporte seguro e multiplexado sobre UDP utilizado pelo HTTP/3.
RepresentationDados e metadados que representam o estado de um recurso.
Request smugglingAtaque baseado em divergência sobre limites de requisição entre intermediários.
Safe methodMétodo cuja intenção é essencialmente de leitura.
StreamCanal lógico e ordenado dentro de uma conexão multiplexada.
TrailerCampo enviado após o conteúdo da mensagem.
ValidatorMetadado usado para testar se representação armazenada continua válida.
VaryCampo que informa dimensões da requisição usadas para selecionar uma resposta.

Referências oficiais e leituras recomendadas

As referências abaixo priorizam especificações e documentações oficiais. devem ser consultadas com suas erratas e eventuais documentos que as atualizam. Documentação de produtos deve ser validada para a versão, tier e utilizados no ambiente.

  1. 9110 - Semantics - ://www. -editor.org/ /rfc9110.
  2. 9111 - - ://www. -editor.org/ /rfc9111.
  3. 9112 - /1.1 - ://www. -editor.org/ /rfc9112.
  4. 9113 - /2 - ://www. -editor.org/ /rfc9113.
  5. 9114 - - ://www. -editor.org/ /rfc9114.
  6. 7541 - : Compression for /2 - ://www. -editor.org/ /rfc7541.
  7. 9204 - : Field Compression for - ://www. -editor.org/ /rfc9204.
  8. 9000 - : A -Based Multiplexed and Secure Transport - ://www. -editor.org/ /rfc9000.
  9. 9001 - Using to Secure - ://www. -editor.org/ /rfc9001.
  10. 9002 - Loss Detection and Congestion Control - ://www. -editor.org/ /rfc9002.
  11. 7838 - Alternative Services - ://www. -editor.org/ /rfc7838.
  12. 9460 - Service Binding and Resource Records - ://www. -editor.org/ /rfc9460.
  13. 9651 - Structured Field Values for - ://www. -editor.org/ /rfc9651.
  14. 7301 - Application-Layer Protocol Negotiation - ://www. -editor.org/ /rfc7301.
  15. 9308 - Applicability of the Transport Protocol - ://www. -editor.org/ /rfc9308.
  16. 9312 - Manageability of the Transport Protocol - ://www. -editor.org/ /rfc9312.
  17. Field Name Registry - ://www. .org/assignments/ -fields/ -fields.xhtml
  18. Registry - ://www. .org/assignments/ -status-codes/ -status-codes.xhtml
  19. Axway - Configure services - ://docs.axway.com/bundle/axway-open-docs/page/docs/apim_policydev/apigw_gw_instances/general_services/index.
  20. Axway - Configure remote host settings - ://docs.axway.com/bundle/axway-open-docs/page/docs/apim_policydev/apigw_gw_instances/general_remote_hosts/index.
  21. Microsoft - in Azure Management - ://learn.microsoft.com/en-us/azure/ -management/ -management- -overview
  22. Microsoft - forward- policy - ://learn.microsoft.com/en-us/azure/ -management/forward- -policy
  23. Microsoft - Manage protocols and ciphers in Management - ://learn.microsoft.com/en-us/azure/ -management/ -management-howto-manage-protocols-ciphers

Ordem sugerida de leitura

  1. Ler as seções introdutórias e terminologia da 9110 antes de estudar versões específicas.
  2. Estudar a 9112 com foco em message , conexão e segurança de parsing.
  3. Ler a visão geral, frames, , e erros da 9113; consultar em paralelo.
  4. Estudar nas seções de conexão, , e migration da 9000, seguido da integração na 9001.
  5. Ler a 9114 e , relacionando o que foi delegado ao .
  6. Consultar e /SVCB para compreender descoberta e fallback.
  7. Por fim, mapear as capacidades e limitações da versão de Axway e Azure utilizada no trabalho.

Encerramento

Dominar é dominar a fronteira entre intenção de negócio e transporte. O próximo capítulo aprofundará e , explicando como identidade, confidencialidade e integridade protegem cada uma dessas conexões.