Resumo

  • Age é a estimativa, em segundos, desde que o servidor de origem gerou ou validou com sucesso uma resposta. Não é a idade da URL, do documento, da representação nem do fato exibido.
  • O cache combina o Age herdado, Date, horários locais de requisição e resposta, atraso e residência; quando reutiliza sem validar, substitui o campo por um único current_age.
  • Frescor depende de outra conta: a idade corrente é comparada a uma vida útil vinda de diretivas, Expires ou heurística permitida. O número não comprova validação nem concede sozinho o direito de reutilizar.

Conteúdo antigo, resposta com poucos segundos

Considere um manual escrito quatro anos atrás e nunca alterado. Hoje, o cache consultou a origem e confirmou que sua cópia continua válida. Se a servir dois minutos depois, Age: 120 é uma descrição correta da resposta, embora seja uma descrição absurda da idade do manual.

A ambiguidade nasce da palavra. Fora do protocolo, atribuímos idade ao objeto. No HTTP, o campo pertence à resposta. O recurso pode ser antigo, os bytes podem atravessar várias validações e a entrada local pode ter sido armazenada em outro momento. Age não tenta reunir essas histórias.

Seu trabalho é permitir uma decisão de reuso ao longo de caches independentes. O segundo cache precisa respeitar o tempo já acumulado no primeiro. Recomeçar em zero criaria juventude a cada salto; depender apenas de Date exporia a conta à diferença entre relógios.

O HTTP/1.0 não passava a idade adiante

A especificação HTTP/1.0 de 1996 tratava de cache, datas e expiração. Mesmo assim, sua gramática de cabeçalhos de resposta não definia Age, e não havia um algoritmo comum para representar o tempo já gasto em outros armazenamentos.

Se o cache A guardasse a resposta por oitenta segundos e a enviasse ao cache B, B poderia usar horário de recebimento e políticas próprias, mas não herdaria um contador padronizado. Subtrair o Date remoto de um relógio local tampouco era suficiente quando as máquinas discordavam.

O HTTP/1.1 introduziu Age em 1997. O emissor carregava uma estimativa; o receptor a corrigia e depois a aumentava. A especificação inicial deixou uma fronteira essencial: se uma resposta armazenada fosse validada pela origem, a idade passaria a usar a validação, não obrigatoriamente a geração original. O campo nasceu para o reuso, não para datar publicações.

Duas observações corrigiam fraquezas diferentes

Ao receber a resposta, o cache pode estimar sua idade aparente pela diferença entre a chegada e Date:

apparent_age = max(0, response_time - date_value)

O máximo com zero impede que um relógio de origem adiantado produza idade negativa. A medida ainda depende da proximidade entre dois relógios.

Outra via usa o valor que chegou e o intervalo local da requisição:

response_delay = response_time - request_time

corrected_age_value = age_value + response_delay

Essa conta não subtrai diretamente relógios remotos, mas depende de todos os caches anteriores inserirem Age corretamente. Um intermediário antigo pode omitir parte do tempo.

Quando essa compatibilidade precisa ser considerada, a forma conservadora escolhe o maior resultado:

corrected_initial_age = max(apparent_age, corrected_age_value)

A regra atual admite usar diretamente o valor corrigido quando caches obsoletos não são uma preocupação. O protocolo não declara qual relógio manda; oferece ao código local uma forma determinística de combinar evidências imperfeitas.

Cada nó conhecia a própria espera

Depois do recebimento, a resposta permanece armazenada. Só o cache local sabe quanto tempo se passou até a próxima solicitação:

resident_time = now - response_time

current_age = corrected_initial_age + resident_time

Ao responder sem validação, ele gera Age e substitui o valor anterior pela idade corrente. Não acrescenta outro membro nem entrega uma lista de intermediários. O próximo cache herda o total e inclui o que observou em trânsito e residência.

O inteiro retém duração e perde topologia. Dois caches com espera longa e dez com espera breve podem produzir o mesmo valor. Não se obtêm dali contagem de saltos, nomes, recibos, custódia ou autenticação. O dado serve para continuar a conta, não para reconstruir a rota.

Essa limitação torna a coordenação barata. Nenhum cache precisa consultar todos os operadores anteriores. Mas a investigação local precisa guardar os elementos que foram comprimidos no resultado.

Frescor tinha sua própria origem

Age: 120 não significa “restam 120 segundos”. A idade informa tempo transcorrido; a vida de frescor define por quanto tempo a resposta pode ser usada sem validação. A decisão é:

response_is_fresh = (freshness_lifetime > current_age)

O limite pode vir de s-maxage, max-age, da diferença entre Expires e Date ou de uma heurística autorizada. Cento e vinte segundos são fresh diante de trezentos e stale diante de sessenta.

Stale não é sinônimo de falso, inseguro ou editorialmente velho. Significa que a comparação comum deixou de permitir reuso sem consulta. A validação pode renovar a base. Diretivas ou condições de desconexão podem autorizar serviço stale. Da mesma forma, uma resposta jovem pode não ser armazenável ou pode corresponder à variante errada.

Seleção, idade, vida de frescor e política de reuso precisam permanecer separadas. Transformar o campo em qualquer uma das outras camadas amplia seu poder além da especificação.

Validar os mesmos bytes mudava o ponto temporal

Uma representação pode ficar um dia no cache, receber uma confirmação condicional da origem e continuar com exatamente o mesmo corpo. A idade da resposta passa a se apoiar na validação bem-sucedida. A história do documento não foi apagada; a permissão operacional recebeu uma evidência recente.

Por isso, uma queda de Age não prova alteração de conteúdo. Um aumento também não prova indisponibilidade da origem. O campo não carrega o ETag usado, o status da validação ou os metadados atualizados. A transação precisa de seu próprio registro.

A presença de Age permite uma inferência mais estreita: a resposta não é de primeira mão, pois um cache a emitiu a partir de estado armazenado. O campo sozinho não informa se esse cache validou com a origem durante esta requisição ou se usou uma validação anterior. A ausência não prova contato direto. Caches antigos podem não implementar o campo; software incorreto ou coleta incompleta também o apagam.

Um valor saturado não é uma crônica de 68 anos

O campo usa inteiro não negativo em segundos. Se o valor for inválido, o cache deve ignorá-lo. Se ele ou uma operação exceder a capacidade, a convenção trata o resultado como 2147483648, ou como o maior inteiro positivo conveniente.

O número representa infinito prático e protege contra estouro que volte como valor pequeno ou negativo. Ele não afirma que alguém mediu precisamente 2.147.483.648 segundos de armazenamento.

A decisão auditável guarda a fórmula inteira

Para explicar um incidente, registre a chave e a variante selecionadas, Date, Age, diretivas, validadores, horários locais de pedido, resposta e decisão, todos os termos calculados e a fonte da vida de frescor. Anote se houve validação e se a saída foi reuso fresh, validado, stale permitido ou falha.

Guardar apenas o último inteiro mistura residência anterior, trânsito, espera local e correção de relógio. O gráfico exibe um sintoma, mas não atribui a decisão.

O HTTP evitou uma autoridade cronológica central. A origem fornece metadados e confirmações; cada cache escolhe, mede, calcula e responde pelo reuso; o próximo verifica e continua. O campo coordena o mínimo necessário, sem governar o objeto nem atestar seu conteúdo.

Fontes