Resumo

  • Na conta do RFC 1185, a metade crítica do espaço de números de sequência TCP passava em cerca de 17 segundos a 1 Gbit/s. Um duplicado atrasado podia voltar com um número que parecia atual outra vez.
  • O PAWS do RFC 1323 comparava o carimbo recebido com TS.Recent para barrar duplicados antigos numa conexão aberta. Depois de mais de 24 dias parada, a implementação tinha de invalidar essa lembrança para aceitar tráfego novo.

O TCP numera bytes usando um contador circular. Acabam os números, recomeça a contagem. Numa linha lenta, um pacote de uma volta anterior costuma desaparecer da rede antes de o número reaparecer. Numa linha muito rápida, a contagem pode alcançar o pacote atrasado. O porteiro confere o crachá e deixa passar alguém que esteve ali ontem.

O RFC 1185, de outubro de 1990, colocou números nessa preocupação. Sua tabela calculou aproximadamente 17 segundos para percorrer a metade relevante do espaço de sequências a 1 Gbit/s. A comparação usava dois minutos para a vida máxima de um segmento TCP. O número voltava depressa; um segmento antigo ainda podia estar pelo caminho. A tabela era uma previsão de projeto, bastante para mostrar que a identificação precisava de outra pista.

O RFC 1323, de maio de 1992, adotou o carimbo de tempo do TCP. A opção atendia a duas tarefas: medir o tempo de ida e volta e executar PAWS, a proteção contra sequências que deram a volta. Numa conexão estabelecida, o receptor guardava uma marca recente em TS.Recent. Quando chegava um segmento com TSval inferior à referência ainda válida, respondia com um reconhecimento e descartava o segmento. Depois desse teste, continuavam as verificações normais da janela TCP. O impostor acertava o número, mas a data o denunciava.

Cada emissor fazia avançar seu próprio relógio; os dois lados não precisavam ter horas iguais. Era necessário que os valores do emissor não retrocedessem, e a comparação usava aritmética modular de 32 bits. O mesmo TS.Recent participava da medição do tempo de ida e volta, economizando estado. PAWS examinava dados e reconhecimentos recebidos na conversa aberta, procurando duplicados velhos daquela própria conexão.

A memória do porteiro também envelhecia. O RFC 1323 admitia relógios de uma marca por segundo até uma por milissegundo. No ritmo mais rápido, a metade sinalizada do contador de 32 bits dava a volta em cerca de 24,8 dias. Imagine uma conexão aberta e quieta durante esse intervalo. O relógio do outro lado segue trabalhando. Quando a comunicação recomeça, uma marca realmente nova pode parecer menor que o antigo TS.Recent. Um porteiro que jamais revisa a ficha rejeita todos os visitantes e congela a conexão.

O RFC exigiu que a ficha fosse descartada. Passados mais de 24 dias de inatividade, a implementação de PAWS deve invalidar TS.Recent. Ao receber uma marca aparentemente inferior, o receptor confere primeiro se a lembrança ainda vale. Se já envelheceu, o segmento pode passar pela checagem PAWS e fornecer uma nova referência. A janela de sequências ainda decide se o pacote pertence à conexão. Jogar fora uma lista vencida não é retirar a fechadura.

Os autores cogitaram mensagens periódicas para renovar a referência. Preferiram a invalidação porque a especificação de TCP não exigia esses sinais de manutenção. O receptor tampouco conhece a velocidade do relógio remoto e precisa considerar o caso mais rápido. Os 24 dias medem o silêncio, não a idade permitida da conexão. Uma troca ativa renova sua marca; uma troca adormecida precisa conseguir acordar.

A revisão posterior, RFC 7323, preservou a explicação e a regra. Entre 1990 e 1992, o TCP encontrou dois tipos de velhice: a sequência retornava cedo demais nos caminhos velozes, e a marca destinada a salvá-la podia envelhecer durante a pausa. PAWS ensinou o porteiro a desconfiar do pacote atrasado e a rasgar o próprio caderno na hora certa.