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:
-
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 porCache-Controlemax-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.
-
Cabeçalhos de requisição condicional do cliente:
If-None-Match: O cliente envia um ou váriosETagdas versões do recurso que possui em cache. Se nenhum corresponder aoETagatual 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:
- O cliente envia uma requisição de recurso.
- O servidor responde com o recurso, adicionando os cabeçalhos
Cache-Control,Expires,ETag,Last-Modified. - O cliente guarda o recurso (corpo da resposta) junto com esses cabeçalhos no cache local.
- 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) ouExpires, 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 oETagguardado) e/ouIf-Modified-Since(com aLast-Modifiedguardada).
- Se o recurso estiver fresco de acordo com
- O servidor recebe a requisição condicional:
- Se o recurso não mudou (a verificação com
ETag/Last-Modifiedmostrou 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.
- Se o recurso não mudou (a verificação com
- 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.