Sobes.tech
Senior

Ako prebieha kešovanie súborov na úrovni protokolu?

sobes.tech AI

Odpoveď od AI

Klasické cachovanie na úrovni protokolu HTTP sa vykonáva pomocou hlavičiek a metód, ktoré umožňujú klientovi a serveru určiť, či je potrebné znovu načítať zdroj alebo ho použiť z lokálneho cache. Kľúčové mechanizmy:

  1. Hlavičky cache od servera:

    • Cache-Control: Určuje direktívy cacheovania, napríklad maximálnu dobu životnosti zdroja (max-age), povolenie cacheovania (public, private), zakázanie cacheovania (no-cache, no-store), požiadavka na revalidáciu (must-revalidate).
    • Expires: Zastaralé hlavička, ktorá udáva dátum a čas, po ktorom sa zdroj považuje za zastaraný. Môže byť prepísaná Cache-Control s max-age.
    • ETag: Entita-tag (Entity Tag) - jedinečný identifikátor verzie zdroja, generovaný serverom.
    • Last-Modified: Dátum a čas poslednej zmeny zdroja na serveri.
  2. Hlavičky podmienkových požiadaviek od klienta:

    • If-None-Match: Klient odosiela jeden alebo viac ETag tých verzií zdroja, ktoré má v cache. Ak žiadny z nich nezhoduje s aktuálnym ETag na serveri, server odošle celý zdroj s kódom 200 OK. Ak zhoduje, server vráti 304 Not Modified bez tela, a klient použije verziu z cache.
    • If-Modified-Since: Klient odosiela dátum poslednej zmeny zdroja, ktorý má v cache. Ak bol zdroj na serveri zmenený po tomto dátume, server odošle celý zdroj s kódom 200 OK. Inak vráti 304 Not Modified.

Algoritmus cacheovania:

  1. Klient odošle požiadavku na zdroj.
  2. Server odošle zdroj, pridávajúc hlavičky Cache-Control, Expires, ETag, Last-Modified.
  3. Klient uloží zdroj (telo odpovede) spolu s týmito hlavičkami do lokálneho cache.
  4. Pri ďalšej požiadavke na ten istý zdroj, klient kontroluje hlavičky vo svojom cache:
    • Ak je zdroj čerstvý podľa Cache-Control (max-age) alebo Expires, klient použije zdroj z cache bez požiadavky na server (cache hit).
    • Ak je zdroj zastaraný, klient odošle podmienkovú požiadavku s If-None-Match (so zachovaným ETag) a/alebo If-Modified-Since (so zachovaným Last-Modified).
  5. Server prijíma podmienkovú požiadavku:
    • Ak sa zdroj nezmenil (kontrola podľa ETag/Last-Modified ukázala zhoda), server odpovedá 304 Not Modified.
    • Ak sa zdroj zmenil, server odpovedá 200 OK s novou verziou zdroja a aktualizovanými cache hlavičkami.
  6. Klient prijíma odpoveď a koná podľa toho:
    • Pri 304 Not Modified používa zdroj z cache.
    • Pri 200 OK aktualizuje cache novou verziou zdroja a hlavičkami.
// Príklad hlavičiek odpovede od servera:
// 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

// Príklad podmienkovej požiadavky od klienta:
// 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

// Príklad odpovede servera pri zhode ETag/Last-Modified:
// HTTP/1.1 304 Not Modified
// Date: Mon, 15 Aug 2022 11:00:00 GMT
// Cache-Control: public, max-age=3600

Tabuľka hlavných cacheovacích hlavičiek:

Hlavička Odosielateľ Účel Príklady hodnôt
Cache-Control Server Všeobecné pravidlá cacheovania max-age=3600, no-cache, public
Expires Server Dátum vypršania platnosti zdroja (zastaralý) Mon, 15 Aug 2022 12:00:00 GMT
ETag Server Identifikátor verzie zdroja "abcdef123456"
Last-Modified Server Dátum poslednej zmeny zdroja Fri, 12 Aug 2022 10:00:00 GMT
If-None-Match Klient Podmienková požiadavka: použiť cache, ak sa ETag zhoduje "abcdef123456"
If-Modified-Since Klient Podmienková požiadavka: použiť cache, ak sa zdroj nezmenil po dátume Fri, 12 Aug 2022 10:00:00 GMT

Tieto mechanizmy výrazne znižujú záťaž serverov a zrýchľujú načítanie stránok pre používateľov, pretože prehliadače môžu vyhnúť úplnému opätovnému načítaniu zdrojov.