Поиск страниц, которые не были изменены за определенный промежуток времени, — наиболее полезный способ использования кэширования, так как в этом случае не нужно связываться с сервером. К сожалению, он не всегда работает. Сервер должен использовать заголовок Expires осторожно, так как то, когда на страницу будут внесены изменения, может быть неизвестно. Таким образом, копии, сохраненные в кэше, могут быть свежими, но клиент этого не знает.
В этом случае используется вторая стратегия. Она заключается в запрашивании с сервера информации о действительности сохраненной копии страницы. Этот запрос обозначается как conditional GET (GET с условием). Он показан на рис. 7.17 как шаг 3. Если сервер знает, что сохраненная в кэше копия все еще действительна, он может от-
править короткий ответ, подтверждая это (шаг 4а). В ином случае он должен отослать полный ответ (шаг 4б).
Есть еще несколько полей заголовков, которые используются для того, чтобы сервер мог проверить, действительна ли копия на момент запроса. Клиент знает, когда на страницу были внесены изменения в последний раз благодаря заголовку Last-Modified. Он может выслать это время серверу, используя заголовок If-Modified-Since, чтобы запросить страницу только в том случае, если она была изменена после последнего кэширования. В ином случае сервер может вернуть вместе со страницей заголовок ETag. Он высылает тег, являющийся кратким именем контента страницы, похожим на контрольную сумму, только лучше. (Это может быть криптографический хэш, который мы опишем в главе 8.) Клиент может выяснить, действительна ли сохраненная копии, выслав на сервер заголовок If-None-Match, перечисляющий теги сохраненной копии. Если любой тег совпадает с контентом, который сервер должен переслать в ответ, может быть использована соответствующая копия, сохраненная в кэше. Этот метод может быть использован, когда определять, свежая ли страница, неудобно или бессмысленно. Например, сервер может вернуть различный контент для одного и того же URL, в зависимости от того, какие языки и типы MIME являются предпочтительными. В этом случае только дата модификации не поможет серверу определить, свежая ли копия страницы хранится в кэше. Наконец, обратите внимание на то, что обе эти стратегии кэширования сводятся на нет директивами заголовка Cache-Control. Они могут использоваться, чтобы ограничить кэширование (например, не кэшировать) при отсутствии необходимости. В качестве примера можно привести динамические страницы, которые изменяются при каждом получении. Страницы, на которых требуется авторизация, также не кэшируются.
Можно еще много чего рассказать о кэшировании, но мы несколько ограничены в объеме, так что отметим лишь два важных момента. Во-первых, кэширование может использоваться не только в браузере. Обычно HTTP-запросы могут передаваться через несколько кэшей. Использование кэширования, не относящееся к браузеру, называется прокси-кэшированием( proxy caching). Каждый новый уровень кэширования может помочь сократить количество запросов, передающихся вверх по цепочке. Запускать прокси-кэширование, чтобы извлечь пользу из кэширования страниц, запрашиваемых разными пользователями, — обычная практика провайдеров и организаций. Мы обсудим прокси-кэширование, рассмотрев его более подробно, в разделе 7.5 в конце главы. Во-вторых, кэширование серьезно повышает производительность, но не настолько, как многие надеются. Причина в том, что существуют как популярные веб-ресурсы, так и непопулярные, и многие из них очень длинные (например, видео). «Длинный хвост» редко посещаемых веб-ресурсов занимает место в кэше, а количество запросов, обрабатываемых кэш-памятью, не сильно растет с увеличением ее размера. Веб-кэш с высокой вероятностью не сможет обработать больше половины запросов (Breslau и др., 1999).
Пример использования HTTP
Поскольку HTTP является текстовым протоколом, взаимодействие с сервером посредством терминала (который в данном случае выступает как противоположность браузеру) можно организовать достаточно просто. Необходимо лишь установить TCP-соединение с портом 80 сервера. Читателю предоставляется возможность поэкспериментировать со следующим сценарием. Он будет работать с большинством
оболочек UNIX и в командном окне Windows (когда запущена программа telnet). Итак,
Читать дальше
Конец ознакомительного отрывка
Купить книгу