Назад к вопросам
Senior
91
questionbank
Как происходит кэширование файлов на уровне протокола?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Кэширование на уровне протокола HTTP выполняется с помощью заголовков и методов, которые позволяют клиенту и серверу определять, нужно ли повторно загружать ресурс или использовать его из локального кэша. Ключевые механизмы:
-
Заголовки кэширования от сервера:
Cache-Control: Определяет директивы кэширования, например, максимальный срок жизни ресурса (max-age), разрешение на кэширование (public,private), запрет кэширования (no-cache,no-store), требование перепроверки (must-revalidate).Expires: Устаревший заголовок, указывающий дату и время, после которого ресурс считается устаревшим. ПереопределяетсяCache-Controlсmax-age.ETag: Сущность-тэг (Entity Tag) - уникальный идентификатор версии ресурса, генерируемый сервером.Last-Modified: Дата и время последнего изменения ресурса на сервере.
-
Заголовки условных запросов от клиента:
If-None-Match: Клиент отправляет один или несколькоETagтех версий ресурса, которые у него есть в кэше. Если ни один из них не совпадает с текущимETagна сервере, сервер отправляет весь ресурс с кодом 200 OK. Если совпадает, сервер возвращает 304 Not Modified без тела ответа, и клиент использует версию из кэша.If-Modified-Since: Клиент отправляет дату последнего изменения ресурса, имеющегося в кэше. Если ресурс на сервере был изменен после этой даты, сервер отправляет весь ресурс с кодом 200 OK. В противном случае возвращается 304 Not Modified.
Алгоритм кэширования:
- Клиент отправляет запрос на ресурс.
- Сервер отправляет ресурс, добавляя заголовки
Cache-Control,Expires,ETag,Last-Modified. - Клиент сохраняет ресурс (тело ответа) вместе с этими заголовками в локальном кэше.
- При последующем запросе того же ресурса, клиент проверяет заголовки в своем кэше:
- Если ресурс свежий согласно
Cache-Control(max-age) илиExpires, клиент использует ресурс из кэша без запроса к серверу (кэш попадание - Hit). - Если ресурс устарел, клиент отправляет условный запрос, используя
If-None-Match(с сохраненнымETag) и/илиIf-Modified-Since(с сохраненнымLast-Modified).
- Если ресурс свежий согласно
- Сервер получает условный запрос:
- Если ресурс не менялся (проверка по
ETag/Last-Modifiedпоказала совпадение), сервер отвечает 304 Not Modified. - Если ресурс менялся, сервер отвечает 200 OK с новой версией ресурса и обновленными заголовками кэширования.
- Если ресурс не менялся (проверка по
- Клиент принимает ответ и действует соответственно:
- При 304 Not Modified использует ресурс из кэша.
- При 200 OK обновляет кэш новой версией ресурса и заголовками.
// Пример заголовков ответа от сервера:
// Cache-Control: public, max-age=3600
// Expires: Mon, 15 Aug 2022 12:00:00 GMT
// ETag: "abcdef123456"
// Last-Modified: Fri, 12 Aug 2022 10:00:00 GMT
// Пример условного запроса от клиента:
// GET /path/to/resource HTTP/1.1
// Host: example.com
// If-None-Match: "abcdef123456"
// If-Modified-Since: Fri, 12 Aug 2022 10:00:00 GMT
// Пример ответа сервера при совпадении ETag/Last-Modified:
// HTTP/1.1 304 Not Modified
// Date: Mon, 15 Aug 2022 11:00:00 GMT
// Cache-Control: public, max-age=3600
Таблица основных заголовков кэширования:
| Заголовок | Отправитель | Назначение | Примеры значений |
|---|---|---|---|
Cache-Control |
Сервер | Общие правила кэширования | max-age=3600, no-cache, public |
Expires |
Сервер | Дата устаревания ресурса (устаревший) | Mon, 15 Aug 2022 12:00:00 GMT |
ETag |
Сервер | Идентификатор версии ресурса | "abcdef123456" |
Last-Modified |
Сервер | Дата последнего изменения ресурса | Fri, 12 Aug 2022 10:00:00 GMT |
If-None-Match |
Клиент | Условный запрос: использовать кэш, если ETag совпадет | "abcdef123456" |
If-Modified-Since |
Клиент | Условный запрос: использовать кэш, если ресурс не менялся после даты | Fri, 12 Aug 2022 10:00:00 GMT |
Данные механизмы позволяют значительно снизить нагрузку на серверы и ускорить загрузку страниц для пользователей, так как браузеры могут избегать полной повторной загрузки ресурсов.