Resumo

  • O cabeçalho transmite apenas 1 a 4 bytes menos significativos do Packet Number, sob header protection.
  • A reconstrução usa o maior número processado com sucesso no mesmo packet-number space e a próxima expectativa.
  • Repetição de bits baixos, salto, wrap ou falha de autenticação não provam perda, replay, ataque ou impacto no aplicativo.

Uma captura passiva pode transformar um fragmento em uma história completa. O mesmo valor aparente de 16 bits surge duas vezes e vira “replay”; um salto numérico vira “milhões de pacotes perdidos”. RFC 9000 e RFC 9001 exigem separar os bytes protegidos no fio, o valor truncado depois da remoção de header protection e o número completo reconstruído. Um Packet Number QUIC é um inteiro de 0 a 2^62-1, mas o campo em um long header ou short header contém somente 1 a 4 bytes dos bits menos significativos. A própria largura do campo também é protegida.

O número não é global para a conexão. Existem três packet-number spaces: Initial, Handshake e application data; este inclui 0-RTT e 1-RTT. Todos começam em zero. Cada endpoint mantém números distintos para envio e recebimento. Logo, o mesmo inteiro pode identificar pacotes diferentes. Retry e Version Negotiation não carregam Packet Number e não são reconhecidos por ACK comum.

A escolha do emissor depende do histórico. Antes de receber um reconhecimento em determinado espaço, ele usa o número completo. Depois, escolhe bits suficientes para cobrir mais que o dobro da diferença entre o pacote enviado e Largest Acknowledged. Os exemplos de RFC 9000 mostram o algoritmo, inclusive com números contíguos não reconhecidos; não são limites de produção nem garantem a decodificação de todo pacote atrasado.

O receptor primeiro remove header protection. Só então conhece o valor truncado claro e o comprimento. O procedimento de reconstrução usa o maior Packet Number processado com sucesso naquele espaço, o valor truncado e o tamanho do campo. A próxima expectativa é o maior número recebido mais um. Na janela de codificação, escolhe-se o candidato mais próximo dessa expectativa. Sem a memória do endpoint, os bytes da captura não bastam.

Um pacote que chega depois de muitos números maiores pode cair perto de um candidato incorreto. Por isso, uma falha de deprotection ou de autenticação não é sozinha prova de erro do peer ou de ataque. O número reconstruído participa do nonce AEAD; durante a remoção de packet protection, o cabeçalho até Packet Number é autenticado como associated data. Adivinhar um número fora desse processo não é decodificá-lo com autenticação.

Largest Acknowledged tem outra natureza: é um inteiro completo de tamanho variável. ACK ranges identificam pacotes recebidos e processados no packet-number space do pacote que carrega o ACK. Podem sustentar um fato autenticado no endpoint, mas não reconstroem lacunas de uma captura nem valem para outro espaço. A eliminação de duplicatas ocorre depois da remoção da proteção e da recuperação autenticada do número. Dois campos com os mesmos bits baixos ainda não formam um duplicado comprovado.

O ledger de evidências deve manter separados identidade e direção, tipo e espaço, bytes protegidos e completude da captura, contexto de chave, sucesso de deprotection, comprimento e valor truncado, maior número processado, próxima expectativa e janela, número completo e autenticação, além dos valores e intervalos ACK. Perda, retransmissão, reordenação, replay, injeção, ataque, caminho e entrega ao aplicativo exigem evidência adicional. Uma lacuna pode vir da posição de captura, amostragem, truncamento, estado de descriptografia ou tráfego real.

A separação também evita misturar este tema com o spin bit de TR-038, key phase de TR-042, a semântica ACK-aplicativo de TR-045, a coalescência de TR-049 e a sondagem PTO de TR-051.