Http Caching

16 Ocak 2016 4 dk okuma süresi 159 okunma

Öncelikle her browser http caching mekanizması kullanır. Http caching, browser'ın (tarayıcı) sayfanın tamamının veya öğelerinin (css, javascrip, resim vb.) bir kopyasını hafızada tutmasıdır. Bunun için bazı kurallara ihtiyacı vardır. Örneğin istek https'den geliyorsa cache mekanizması işlem yapmaz.

Öncelikle browser'ın sayfa isteğini nasıl işlediğini bilmek gerekir. Kısaca özetlemek gerekirse; browser'a url'yi yazıp enter'a basınca ilk olarak dns sunucuya gider ve url'nin gerçek adresini (sunucu ip adresi) bulur. Hemen ardından gerçek adresin bulunduğu sunucuya bir istek gönderir (http request) ve bu istekte şöyle der. Arkadaş elimde şöyle bir url var (http://kadir.xyz/blog) ve bu sendeymiş, bana bunun içeriğinin bir kopyasını ver (bu isteklerin hepsi tcp/ip protokolü üzerinden yürür). Sunucu bakar kendisinde böyle bir sayfa var mı yok mu diye ve eğer varsa geriye tamam bende bu sayfa var (HTTP 200 OK - http response), bu da kopyası diyerek geriye bir cevap döner ve ilgili dosyaları (web sayfası, css, javascript, resim vb.) ufak paketler halinde göndermeye başlar. Sonrasında browser aldığı bu dosyaları render etmeye başlar ve sayfa açılır. Bundan sonra cache'in için herhangi bir kısıtlama yoksa browser bazı dosyaları veya komple sayfayı cache'ler.

Browser her url isteğinde öncelikle local cache'e (istemci taraflı önbellekleme) bakar. Eğer istek yapılan url local cache'te yoksa sunucuya yeni bir istek yapar. Eğer varsa sunucuya yeni bir istek yapmaz ve local cache'den çalışır. Bu da hem hız hem de bandwidth (veri trafiği/bant genişliği) için çok önemlidir çünkü sunucu maliyetlerinizi düşürür. Http Cache için browser tarafında bazı parametreler vardır. Bu parametreler sayesinde hangi dosyanın veya dosyaların sunucudan tekrar alınacağını belirtir. Bu parametreler ilgili dosyaların header'ında (başlık bilgisi) belirtilir. Sunucu'dan alınan her dosyanın header'ı vardır.

Cache-Control

Bu caching için en önemli parametredir. Public, private şeklinde kendi içerisinde özelliği vardır ve bunlarında max-age özelliği vardır.

Public; kaynakların (dosyaların, resim, css, javascript vb.) sadece son kullanıcı browser'ı veya ara sunucular (CDN vb.) tarafından da authentication olsa bile cachelenebileceğini belirtir.

Cache-Control:public

Private; kaynakların sadece son kullanıcıya özel olduğunu belirtir ve son kullanıcı browser'ı cacheleme yapabilir, örneğin html sayfa kullanıcı özel bilgileri ile cachelenebilir fakat CDN cacheleyemez. Yani siz istediğiniz kadar CDN'e koyun her seferinde sayfa sunucudan talep edilir ve indirilir.

Cache-Control:private

No-Cache; herhangi bir cacheleme yapılmayacağını belirtir.

Max-age; kaynakların ne kadar süre ile cache'te tutulacağını belirtir.

Cache-Control:public, max-age: 1200

Expires

Bu parametre max-age kullanılmamışsa ilgili kaynağın (dosyanın) ne zaman cache'ten düşeceğini belirtir. Eğer hem max-age hem de expires varsa, browser öncelikli olarak max-age'e bakarak hareket eder.

Cache-Control:public
Expires: Mon, 09 Jan 2015 17:45:00 GMT

Last Modified (Son Değişiklik Tarihi)

Sunucu gönderilen dosyanın son değişiklik tarihini cevap olarak döner. Örneğin logo.png dosyasını sunucu'dan aldınız, sunucu size Last-Modified tarihini logo.png dosyasının header'ında döner. Böylece browser logo.png dosyasının en son ne zaman oluşturulduğunu biliyor olur. Bundan sonra browser logo.png dosyasına tekrar ihtiyaç duyarsa sunucu'da özel bir kontrol yapabilir. Browser logo.png için yeni bir istek yaptığında sunucuya header ile beraber gönderir ve sunucu gelen header bilgisine bakarak logo.png'nin en son ne zaman değişiklik yapıldığına bakar, eğer browser'dan gelen istekteki tarih ile kendisindeki tarih aynı ise cevap olarak "HTTP 304 (not modified)" cevabı yani logo.png'de herhangi bir değişiklik yok döner. Böylece sunucu dosyayı tekrar göndermez ve browser var olan cache'ten dosyayı kullanmaya devam eder.

Last-Modified: Mon, 09 Jan 2015 17:45:00 GMT

ETag

ETag, ilgili kaynak için özel yaratılmış bir kod içerir ve doğrulama için kullanılır. Bu kod sayesinde kesin eşleşme sağlanır. Bir nevi checksum'dır (checksum, verinin düzgün olduğunun kontrolü için kullanılan en basit yöntemdir). Yani aslında sadece Last-Modified kullanmak çok iyi değildir, çünkü sunucu saati farklı olabilir, bu nedenle daha özel bir doğrulama gerekmektedir. Sunucu ilgili kaynağın etag'ına bakar ve HTTP 200 mü yoksa HTTP 304 mü döneceğine karar verir.

Cache-Control:public, max-age=1200
ETag: "41f0cgf99ed5aae4edffdd6496d7131f"

Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
İnternet üzerindeki birçok bilgi malesef çöp. Çöpten kasıt faydasız anlamında değilde aynı içeriğin 3-5 kelimesinin değiştirilerek tekrar yayınlanmasıdır. Aramalarda üst sıralarda çıkmak için mutlaka kaliteli içeriğe sahip olmak gerekir. Bu yazı size nasıl kaliteli içerik yazmanız gerektiğini gösterir.

Fonksiyonel programlama nedir, fonksiyonel programlamaya kısa bir giriş

Günümüz şartlarında motivasyon ve üretkenlik çok önemlidir. Gün içerisinde birçok kez motivasyonunuzu kaybedebilirsiniz fakat bunu geri kazanmanın ve konsantre olmanın birçok yolu var.