Назад к вопросам
Senior
91
questionbank

Как происходит кэширование файлов на уровне протокола?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

  1. Заголовки кэширования от сервера:

    • Cache-Control: Определяет директивы кэширования, например, максимальный срок жизни ресурса (max-age), разрешение на кэширование (public, private), запрет кэширования (no-cache, no-store), требование перепроверки (must-revalidate).
    • Expires: Устаревший заголовок, указывающий дату и время, после которого ресурс считается устаревшим. Переопределяется Cache-Control с max-age.
    • ETag: Сущность-тэг (Entity Tag) - уникальный идентификатор версии ресурса, генерируемый сервером.
    • Last-Modified: Дата и время последнего изменения ресурса на сервере.
  2. Заголовки условных запросов от клиента:

    • If-None-Match: Клиент отправляет один или несколько ETag тех версий ресурса, которые у него есть в кэше. Если ни один из них не совпадает с текущим ETag на сервере, сервер отправляет весь ресурс с кодом 200 OK. Если совпадает, сервер возвращает 304 Not Modified без тела ответа, и клиент использует версию из кэша.
    • If-Modified-Since: Клиент отправляет дату последнего изменения ресурса, имеющегося в кэше. Если ресурс на сервере был изменен после этой даты, сервер отправляет весь ресурс с кодом 200 OK. В противном случае возвращается 304 Not Modified.

Алгоритм кэширования:

  1. Клиент отправляет запрос на ресурс.
  2. Сервер отправляет ресурс, добавляя заголовки Cache-Control, Expires, ETag, Last-Modified.
  3. Клиент сохраняет ресурс (тело ответа) вместе с этими заголовками в локальном кэше.
  4. При последующем запросе того же ресурса, клиент проверяет заголовки в своем кэше:
    • Если ресурс свежий согласно Cache-Control (max-age) или Expires, клиент использует ресурс из кэша без запроса к серверу (кэш попадание - Hit).
    • Если ресурс устарел, клиент отправляет условный запрос, используя If-None-Match (с сохраненным ETag) и/или If-Modified-Since (с сохраненным Last-Modified).
  5. Сервер получает условный запрос:
    • Если ресурс не менялся (проверка по ETag/Last-Modified показала совпадение), сервер отвечает 304 Not Modified.
    • Если ресурс менялся, сервер отвечает 200 OK с новой версией ресурса и обновленными заголовками кэширования.
  6. Клиент принимает ответ и действует соответственно:
    • При 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

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