Кратко

  • Age оценивает число секунд с момента создания или успешной проверки ответа сервером-источником; это не возраст URL, документа, представления или содержащихся в нём сведений.
  • Кеш объединяет входящий Age, Date, местные моменты запроса и ответа, задержку и время хранения, а при повторном использовании без проверки заменяет поле единственным current_age.
  • Свежесть определяется отдельно: текущий возраст сравнивается со сроком из директив, Expires или разрешённой эвристики. Число не доказывает проверку и само не разрешает повторное использование.

Старое содержание могло получить малый возраст ответа

Представим инструкцию, опубликованную четыре года назад и с тех пор не менявшуюся. Сегодня кеш запросил источник и получил подтверждение, что сохранённое представление остаётся действительным. Через две минуты Age: 120 правильно описывает ответ, но ничего не говорит о возрасте инструкции.

В обычной речи возраст принадлежит предмету. В HTTP поле относится к ответу. Ресурс может быть старше сервера, одни и те же байты могут пройти много проверок, а локальная запись — заменяться или обновляться. Одно целое число не является историей этих объектов.

Задача была практической: продолжить решение о повторном использовании через независимо управляемые кеши. Если каждый начинает отсчёт заново, ответ молодеет при каждом переходе. Если все полагаются только на Date, разница часов превращается в ошибку возраста.

HTTP/1.0 не передавал накопленное время

Спецификация HTTP/1.0 1996 года описывала кеширование, даты и истечение, но в определённом наборе заголовков ответа не было Age и не существовало общей формулы накопленного возраста. Реализация могла применять Date, Expires и местное время приёма, но не знала стандартизованного времени хранения выше по цепочке.

Если кеш A держал ответ восемьдесят секунд и передал его B, новый отсчёт в B терял этот интервал. Простое вычитание удалённой Date из местных часов тоже давало отрицательное или завышенное значение при рассинхронизации.

HTTP/1.1 ввёл Age в 1997 году. Отправляющий кеш передавал оценку, а принимающий исправлял и увеличивал её. Уже ранняя формулировка отделяла повторную проверку от создания: после успешного подтверждения возраст опирался на момент проверки, а не обязательно на первоначальный ответ. Это не дата публикации.

Две несовершенные оценки дополняли друг друга

При получении кеш может вычислить кажущийся возраст по Date:

apparent_age = max(0, response_time - date_value)

Нулевая граница не позволяет часам источника, идущим вперёд, создать отрицательный возраст. Но сравниваются всё равно две машины.

Вторая оценка берёт унаследованный Age и добавляет местный интервал запроса:

response_delay = response_time - request_time

corrected_age_value = age_value + response_delay

Здесь не требуется прямо вычитать удалённые часы, зато все предыдущие кеши должны правильно вставлять поле. Старый посредник способен занизить время.

Консервативная совместимая формула выбирает большее:

corrected_initial_age = max(apparent_age, corrected_age_value)

Современная спецификация разрешает использовать исправленное значение напрямую, если очень старых кешей на пути не ожидается. Протокол не назначает всемирные часы истиной: локальная программа получает воспроизводимое правило для видимых свидетельств.

Время хранения добавлялось там, где оно прошло

После получения ответ лежит в кеше. Только этот узел знает, сколько времени прошло до следующего запроса:

resident_time = now - response_time

current_age = corrected_initial_age + resident_time

Если сохранённый ответ используется без проверки, кеш создаёт Age заново и заменяет прежнее значение. Он не добавляет вторую цифру и не передаёт список посредников. Следующий узел получает сумму, учитывает свой сетевой интервал и позже собственное хранение.

Так сохраняется длительность, но не маршрут. Два долгих хранения и десять коротких могут дать одно число. Из него нельзя восстановить количество и имена кешей, порядок, квитанции или цепочку владения. Поле продолжает расчёт, а не удостоверяет происхождение.

Минимальность облегчает взаимодействие: получателю не нужны журналы всех участников. Для расследования каждый оператор обязан сохранить данные, которые исчезли при сведении к одному числу.

Свежесть была отдельным сравнением

Age: 120 не означает, что осталось 120 секунд. Возраст показывает прошедшее время, а freshness lifetime задаёт разрешённый срок повторного использования без проверки:

response_is_fresh = (freshness_lifetime > current_age)

Срок может следовать из s-maxage, max-age, разницы между Expires и Date или допустимой эвристики. Возраст 120 остаётся fresh при сроке 300 и становится stale при сроке 60.

Stale не означает ложное, опасное или старое по смыслу содержание. Не выполнено обычное условие свежести. Проверка может обновить основание, а директивы или отключённый режим — разрешить stale-ответ. Молодой ответ, напротив, может быть запрещён к хранению или принадлежать другой разновидности.

Выбор записи, расчёт возраста, срок свежести и разрешение на использование — разные решения. Одно поле не должно захватывать их полномочия.

Проверка меняла точку отсчёта, но не прошлое

После суток хранения кеш может отправить условный запрос. Если источник подтверждает представление, те же байты остаются, а возраст ответа относится к успешной проверке. Малое значение не доказывает изменение содержимого; большое значение само по себе не доказывает недоступности источника.

В Age нет ETag, статуса проверки и обновлённых метаданных. Для них нужна отдельная запись. Наличие поля позволяет сделать лишь более узкий вывод: ответ не является ответом из первых рук — кеш сформировал его из сохранённого состояния. Само поле не показывает, проверял ли кеш состояние у источника во время текущего запроса или опирался на более раннюю проверку. Отсутствие не доказывает контакт: старый кеш или неполная запись могли опустить поле.

Насыщение не было точным измерением 68 лет

Значение — неотрицательное целое число секунд. Неверный формат следует игнорировать. Если число или расчёт выходит за диапазон, историческая договорённость использует 2147483648 либо наибольшее удобное положительное число.

Это практическая бесконечность, предотвращающая превращение переполнения в отрицательный или малый возраст. Она не удостоверяет точное хранение в течение 2 147 483 648 секунд.

Объяснимое решение хранит всю формулу

Для аудита нужны ключ и вариант, входящие Date, Age, директивы и валидаторы, местные времена запроса, ответа и решения, все промежуточные значения и источник срока свежести. Следует записать проверку и исход: fresh, подтверждённый, разрешённый stale или ошибка.

Один итог смешивает унаследованное хранение, передачу, местное ожидание и поправку часов. HTTP не создавал вместо этого центральный хронометр. Источник даёт метаданные, каждый кеш выбирает, измеряет, вычисляет и отвечает за использование, а следующий продолжает. Поле координирует минимум и не владеет объектом.

Источники