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:
-
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-Controlsmax-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.
-
Hlavičky podmienkových požiadaviek od klienta:
If-None-Match: Klient odosiela jeden alebo viacETagtých verzií zdroja, ktoré má v cache. Ak žiadny z nich nezhoduje s aktuálnymETagna 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:
- Klient odošle požiadavku na zdroj.
- Server odošle zdroj, pridávajúc hlavičky
Cache-Control,Expires,ETag,Last-Modified. - Klient uloží zdroj (telo odpovede) spolu s týmito hlavičkami do lokálneho cache.
- 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) aleboExpires, 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ýmETag) a/aleboIf-Modified-Since(so zachovanýmLast-Modified).
- Ak je zdroj čerstvý podľa
- Server prijíma podmienkovú požiadavku:
- Ak sa zdroj nezmenil (kontrola podľa
ETag/Last-Modifieduká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.
- Ak sa zdroj nezmenil (kontrola podľa
- 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.