Кэширование

Cache – это промежуточное звено в цепи клиент-сервер, которое обеспечивает быстрый доступ к информации за счет временного хранения результатов работы сервера на стороне клиента.

Cache в браузере встроен во все современные браузеры, не требует настройки и используется автоматически. Кэширование выполняется только для пользователя браузера. Проверка актуальности информации происходит один раз за сессию.
Cache прокси серверы работают по таким же принципам, как и кэширование в браузере, но обладает рядом особенностей. Во-первых cache – разделяемый, доступен любому клиенту, у которого браузер настроен на работу с прокси сервером. Во-вторых необходимость настройки, как самого прокси сервера и браузера, так и брэндмауэра за которым они расположены.
Reverse proxy, скрытые от пользователя, могут предоставлять клиента сервисы кэширующих прокси. Таким образом запрос пользователя к серверу, содержащему оригинальный контент, может вообще не дойти до сервера, а вернуться после соединения с прокси, то есть возвратится из кэша.

Преимущества:
Уменьшения задержек — Запросы выполняются быстрее, так как необходимый контент ближе к клиенту(расположен на локальном компьютере).
Уменьшения траффика — Экономится сетевой траффик клиента, за счет многократного использования уже загруженного контента.
Уменьшение нагрузки на сервер — Сервер не генерирует ответ.

Основные правила работы
1. Если заголовок ответа говорит не сохранять результат, то он не будет сохранен
2. Если используется защищенный протокол(HTTPS), то результат не будет кэширован
3. Кэш признается актуальным(то есть не требующим обновления), если
3.1. Заголовок Expire или другой аналогичный заголовок контроля(Cache-Control: max-age) актуальны
3.2. Если оригинал был модифицирован достаточно давно
4. Если кэш является актуальным, тогда он доставляется без проверки оригинала.
5. Если кэш устарел, то оригинальный сервер будет опрошен для проверки копии

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

Преимущества — Кэширование позволяет пользователям получать доступ к сайту гораздо быстрее.

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

Существуют сетевые конфигурации в которых настройки полностью задаются администратором. В таких случаях вы не сможете получить к ним доступ. Так же настройки по умолчанию будут применятся в случае неправильной конфигурации кэширования сайта.

Кэширование с использованием HTTP заголовков


Expires Ответ

Expires(response header) – является основным заголовком для управления кэшированием. Данный заголовок содержит дату, при наступлении которой cache проверяет информацию на актуальность. Expires предполагает несколько основных вариантов использования. Первый — установка длительного периода(максимум — один год) актуальности для статичных файлов. Второй — использование заголовка с информацией, обновляющейся периодически. Установка даты и времени на момент следующего обновления позволит клиенту автоматически получать актуальную информацию.
У заголовка Expires есть ограничения, связанные с особенностью записи даты и времени в стандарте протокола HTTP. Так необходимо указывать время по Гринвичу(GMT), а не местное время клиента. Заголовок не дает информации о изменении данных на сервере в период указанного времени. Следует так же отметить, что при использовании данного заголовка информация в cache обновляться не будет. В случае, если сервер передает дату, которая уже наступила, cache проверит наличие новой версии информации. Заголовок Expires поддерживается большинством cache.

Cache-Control Запрос-Ответ

Cache-Control – заголовок, введенный в HTTP 1.1 с целью решения проблем Expires и расширения его функциональности. Данный заголовок используется для явного управления схемой кэширования: при помощи конкретных указаний, приведенных ниже. Указания, содержащиеся в заголовке, принимают все cache, расположенные в цепи клиент-сервер, следовательно, невозможно явно указать, кому они предназначены.Заголовок может передаваться как в запросе, так и в ответе. В случае возникновения спорных ситуаций, будут использоваться наиболее строгие ограничения.

Cache-Control может быть использован для достижения следующих целей:

Ограничение доступа cache
По умолчанию, ответ сервера будет сохранен в cache. Существует возможность установить ограничения на сохранение в cache переданной информации при помощи следующий указаний:
• public – информация будет сохранена;
• private – информация будет сохранена только на стороне пользователя, proxy-серверы игнорируют такие ответы;
• no-cache – информация, сохраненная в cache, может быть использована только при успешной проверке на актуальность.

Ограничение на сохранение информации в cache
• no-store – cache не должен сохранять ответ сервера. Данное указание может использоваться как самим сервером, так и клиентом для запрета сохранения информации, относящейся к ответу на текущий запрос.

Ограничение «времени жизни» информации в cache
• max-age=[seconds] — определяет период времени, в течение которого информация, сохраненная в cache, будет считаться актуальной. В случае, когда max-age=0, cache принудительно обновляет информацию.
• s-maxage – то же самое, но для proxy-серверов. Стоит отметить, что указание max-age отменяет действие заголовка Expires.

Контроль обновления cache
• must-revalidate — указание, запрещающее cache использовать информацию, если она неактуальна. Данное указание требует от cache выполнить проверку актуальности информации. Must-revalidate имеет наибольший приоритет, отменяя действия всех остальных заголовков.
• proxy-revalidate – то же самое, но для proxy-серверов.

Pragma
Заголовок Pragma существует для обратной совместимости с протоколом HTTP версии 1.0 и служит для передачи специальных указаний. Pragma имеет одно значение no-cache, которое не отменяет сохранение информации в cache. Для явного запрета сохранения информации необходимо совместное использование заголовков Cache-Control и Pragma со значением no-cache.

Проверка актуальности информации


Validators — эта схемы проверки информации, хранимой в cache, на актуальность. Для идентификации информации сервер создает validator и включает его в ответ. В дальнейшем, к каждому последующему запросу клиент прикрепляет полученный validator, тем самым позволяя серверу установить актуальность информации, сохраненной в cache.

Схемы проверки:
• Last-Modified и If-Modified-Since
• Etag и If-None-Match

Last-Modified и If-Modified-Since
Заголовок ответа сервера Last-Modified
Pаголовок содержит дату и время последнего изменения информации на сервере. Информация, содержащаяся в cache, является актуальной, если она не изменялась с даты, содержащейся в заголовке Last-Modified. Last-Modified вычисляется разными образами для разных типов информации. К примеру, для файлов целесообразно указывать дату последнего изменения. Стоит отметить, что способ вычисления значения для данного заголовка зависит от реализации сервера.

Заголовок запроса If-Modified-Since
Заголовок If-Modified-Since информирует сервер о актуальности информации, хранимой в cache. Значением заголовка являются дата и время последнего изменения информации, сохраненной в cache.

Etag и If-None-Match
Etag – еще одна схема проверки, позволяющая сравнить оригинальную информацию, находящуюся на сервере, с информации, хранимой в cache. Представляет собой более надежную схему, нежели Last-Modified, особенно в тех случаях, когда не достаточно проверки с точностью до секунды. Алгоритм генерации идентификатора, используемый в ETag, позволяет создавать уникальную подпись и избегать коллизий.

Заголовок ответа сервера ETag
Сервер автоматически создает идентификатор для актуальной информации и прикрепляет его к ответу. Генерация ETag контролируется сервером, следовательно cache получает гарантию, что для идентичных ETag информация будет одинаковой.

Запрос клиента If-None-Match
Запрос содержит ETag-идентификатор сохраненной в cache информации. Сервер, сравнив два ETag-индентификатора(первый — полученный от клиента, другой — от информации, хранящийся на сервере), может сделать вывод о актуальности информации, находящейся в cache.
Совместное использование ETag и Last-Modified Большинство серверов совместно используют как ETag, так и Last-Modified заголовки. Такой подход необходим для обеспечения совместимости протокола HTTP версий 1.1 и 1.0. Кэш считается актуальным тогда, когда все используемые схемы проверки подтверждают это.

Ответ сервера «304 Not Modified»
По окончанию проверки, если содержимое признанно актуальным, сервер должен возвращает ответ со статусом 304 Not Modified. В ответе с таким статусом нет содержимого, чем достигается экономия пропускной способности сети.

Использование meta-тегов для кэширования
Meta-теги, на которые реагируют только браузеры, просты в использовании и легко доступны. Стоит отметить, что proxy-серверы не конфигурируются мета тегами.

http-equiv
Браузер преобразовывает значение каждого параметра http-equiv в формат заголовка ответа HTTP и обрабатывает их. При обработке данных meta-тегов браузер эмулирует передачу заголовков непосредственно от сервера. Чаще всего используется значения: еxpires, cache-control, pragma. Результаты обработки данных meta-тегов имеют более низкий приоритет перед заголовками, генерируемыми сервером.

Links


//www.mnot.net/cache_docs/
//www.w3schools.com/tags/tag_meta.asp
//www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
//www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

17 комментариев

комментарий был удален
комментарий был удален
комментарий был удален
Спасибо, капитан!
Курск
  • аватар tau
  • 0
Вова, как ты скрыл непотребные комментарии?
Это все могут делать в своих постах/блогах?
никто ничего не может
  • аватар vit
  • 0
никуму ничегго не нужно
  • аватар tau
  • 0
Все. Пора закрывать курск.ми и курск2.ру
  • аватар vit
  • +1
курскми оставим
чтобы Andromed, не заметив, что никто уже не пишет и не читает курск.ме, со временем превратил его в энциклопедию собственных умозаключений?
Совершенно верно,я превращу его в форму современного искусства, где я останусь один, как совершенная монада!
Целкам, хоть даже на левое ухо, обиженным, снобствующим очкодёрам, скучающим бздунам, агрессивным бездарям и ранимым гениям — тут не место. Здесь склеп и могильный холод бесстрастности и верности единственному концепту — всё живо пока жив,хоть кто то один!
картинка из курска
браво, маэстро!
  • аватар ololo
  • 0
комментарии удалены через базу
  • аватар tau
  • 0
от появления «руки бога» ресурс только выиграет
Я подарю тебе сердечки
картинка из курска
whatch out! всегда найдётся прохожий и на ваши записные книжки
Курск

Чтобы оставлять комментарии, нужно или зарегистрироваться.