RFC: 2068
Оригинал: Hypertext Transfer Protocol - HTTP/1.1
Другие версии: RFC 2616
Категория: Предложенный стандарт
Дата публикации:
Авторы: , , , ,
Перевод: Алексей Симонов

13.2.3. Вычисление возраста

Чтобы знать, нов ли кэшируемый элемент, кэш должен знать, превышает ли его возраст свое время существования свежести. Мы обсуждаем, как вычислить последнего в разделе 13.2.4; этот раздел описывает, как вычислить возраст элемента кэша или ответа.

В этом обсуждении мы используем термин "теперь", чтобы означать "текущее значение часов в хосте, выполняющем вычисление." Хосты, которые используют HTTP, но особенно хосты, выполняющие серверы происхождения и кэши, должны использовать NTP [28] или некоторый подобный протокол, чтобы синхронизировать их часы к глобально точному стандарту времени.

Также отметьте, что HTTP/1.1 требует, чтобы серверы происхождения отправили заголовок Date с каждым ответом, давая время, в которое был сгенерирован ответ. Мы используем термин "date_value", чтобы обозначить значение заголовка Date, в форме, соответствующей арифметическим операциям.

HTTP/1.1 использует заголовок ответа Age, чтобы помочь передавать информацию о возрасте между кэшами. Значение заголовка Age — оценка отправителя количества времени, так как ответ был сгенерирован в сервере происхождения. В случае кэшируемого ответа, который был повторно утвержден с сервером происхождения, значение Age основано на времени придания вновь юридической силы, не оригинального ответа.

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

Мы используем термин "age_value", чтобы обозначить значение заголовка Age, в форме, соответствующей арифметическим операциям.

Возраст ответа может быть вычислен двумя полностью независимыми способами:

  1. теперь минус date_value, если локальные часы разумно хорошо синхронизированы на часы сервера происхождения. Если результат — негатив, результат заменен нулем.
  2. age_value, если все кэши вдоль пути ответа реализуют HTTP/1.1.

Учитывая, что у нас есть два независимых способа вычислить возраст ответа, когда он получен, мы можем объединить их как

corrected_received_age = max(now - date_value, age_value)

и пока мы или почти синхронизировали часы или все-HTTP/1.1 пути, каждый получает надежный (консервативный) результат.

Обратите внимание, что это исправление применен в каждом HTTP/1.1 кэш вдоль пути, так, чтобы, если есть HTTP/1.0 кэш в пути, правильный полученный возраст вычислен, пока часы кэша получения находятся почти в синхронизации. Мы не должны от начала до конца синхронизировать синхронизацию (хотя он хорош, чтобы иметь), и нет никакого явного шага синхронизации часов.

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

Поскольку запрос, который закончился возвращенным значением Age, должно быть, был инициализирован до той генерации значения Age, мы можем исправить для задержек, наложенных сетью, делая запись времени, в которое был инициализирован запрос. Затем, когда значение Age получено, оно ДОЛЖНО быть интерпретировано относительно времени, запрос был инициализирован, не время, когда ответ был получен. Этот алгоритм заканчивается консервативным поведением независимо от того, сколько задержки испытано. Так, мы вычисляем:

corrected_initial_age = corrected_received_age + (now - request_time)

где "request_time" — время (согласно локальным часам), когда запрос, который выявлял этот ответ, отправили.

Резюме алгоритма вычисления возраста, когда кэш получает ответ:

/*
 * age_value
 *      is the value of Age: header received by the cache with
 *              this response.
 * date_value
 *      is the value of the origin server's Date: header
 * request_time
 *      is the (local) time when the cache made the request
 *              that resulted in this cached response
 * response_time
 *      is the (local) time when the cache received the
 *              response
 * now
 *      is the current (local) time
 */
apparent_age = max(0, response_time - date_value);
corrected_received_age = max(apparent_age, age_value);
response_delay = response_time - request_time;
corrected_initial_age = corrected_received_age + response_delay;
resident_time = now - response_time;
current_age   = corrected_initial_age + resident_time;

Когда кэш отправляет ответ, он должен добавить к corrected_initial_age количество времени, что ответ был жителем локально. Он должен тогда передать этот полный возраст, используя заголовок Age, к следующему кэшу получателя.

Обратите внимание: То, что клиент не может надежно сказать, что ответ на собственном опыте — но присутствие заголовка Age указывает, что ответ определенно не непосредственно. Кроме того, если Date в ответе является более ранним чем локальное время запроса клиента, ответ вероятно не непосредственно (в отсутствии серьезной расфазировки тактовых сигналов).

2007 - 2017 © Русские переводы RFC, IETF, ISOC.