Sobes.tech
Senior

Como ocorre o cache de ficheiros ao nível do protocolo?

sobes.tech IA

Resposta da IA

O armazenamento em cache ao nível do protocolo HTTP é realizado através de cabeçalhos e métodos que permitem ao cliente e ao servidor determinar se é necessário recarregar um recurso ou usá-lo a partir do cache local. Mecanismos-chave:

  1. Cabeçalhos de cache do servidor:

    • Cache-Control: Define diretivas de cache, como a vida útil máxima do recurso (max-age), permissões de cache (public, private), proibição de cache (no-cache, no-store), e a necessidade de revalidação (must-revalidate).
    • Expires: Cabeçalho obsoleto que indica a data e hora após a qual o recurso é considerado expirado. É substituído por Cache-Control e max-age.
    • ETag: Etiqueta de entidade (Entity Tag), um identificador único da versão do recurso gerado pelo servidor.
    • Last-Modified: Data e hora da última modificação do recurso no servidor.
  2. Cabeçalhos de requisição condicional do cliente:

    • If-None-Match: O cliente envia um ou vários ETag das versões do recurso que possui em cache. Se nenhum corresponder ao ETag atual no servidor, este devolve todo o recurso com o código 200 OK. Se corresponder, devolve 304 Not Modified sem corpo, e o cliente usa a versão em cache.
    • If-Modified-Since: O cliente envia a data da última modificação do recurso em cache. Se o recurso no servidor foi alterado após essa data, o servidor devolve todo com 200 OK. Caso contrário, devolve 304 Not Modified.

Algoritmo de cache:

  1. O cliente envia uma requisição de recurso.
  2. O servidor responde com o recurso, adicionando os cabeçalhos Cache-Control, Expires, ETag, Last-Modified.
  3. O cliente guarda o recurso (corpo da resposta) junto com esses cabeçalhos no cache local.
  4. Em requisições subsequentes do mesmo recurso, o cliente verifica os cabeçalhos no seu cache:
    • Se o recurso estiver fresco de acordo com Cache-Control (max-age) ou Expires, o cliente usa o recurso do cache sem solicitar ao servidor (cache hit).
    • Se o recurso estiver expirado, o cliente envia uma requisição condicional usando If-None-Match (com o ETag guardado) e/ou If-Modified-Since (com a Last-Modified guardada).
  5. O servidor recebe a requisição condicional:
    • Se o recurso não mudou (a verificação com ETag/Last-Modified mostrou correspondência), responde com 304 Not Modified.
    • Se o recurso mudou, responde com 200 OK com a nova versão do recurso e cabeçalhos de cache atualizados.
  6. O cliente processa a resposta:
    • Para 304 Not Modified, usa o recurso do cache.
    • Para 200 OK, atualiza o cache com a nova versão e os cabeçalhos.
// Exemplo de cabeçalhos de resposta do servidor:
// Cache-Control: public, max-age=3600
// Expires: Seg, 15 Aug 2022 12:00:00 GMT
// ETag: "abcdef123456"
// Last-Modified: Sex, 12 Aug 2022 10:00:00 GMT

// Exemplo de requisição condicional do cliente:
// GET /path/to/resource HTTP/1.1
// Host: example.com
// If-None-Match: "abcdef123456"
// If-Modified-Since: Sex, 12 Aug 2022 10:00:00 GMT

// Exemplo de resposta do servidor em caso de correspondência de ETag/Last-Modified:
// HTTP/1.1 304 Not Modified
// Date: Seg, 15 Aug 2022 11:00:00 GMT
// Cache-Control: public, max-age=3600

Tabela de cabeçalhos principais de cache:

Cabeçalho Emissor Propósito Exemplos de valores
Cache-Control Servidor Regras gerais de cache max-age=3600, no-cache, public
Expires Servidor Data de expiração do recurso (obsoleta) Seg, 15 Aug 2022 12:00:00 GMT
ETag Servidor Identificador da versão do recurso "abcdef123456"
Last-Modified Servidor Data da última modificação do recurso Sex, 12 Aug 2022 10:00:00 GMT
If-None-Match Cliente Requisição condicional: usar cache se ETag corresponder "abcdef123456"
If-Modified-Since Cliente Requisição condicional: usar cache se o recurso não mudou após a data Sex, 12 Aug 2022 10:00:00 GMT

Estes mecanismos permitem reduzir significativamente a carga nos servidores e acelerar o carregamento de páginas para os usuários, pois os navegadores podem evitar recarregar completamente os recursos.