Ders 06 / 16
HTTP Önbellekleme
Tazelik ile doğrulama ayrı sorulardır ve doğrulayıcının bir çözünürlüğü vardır: kırk alışverişteki 12 bayat kopyanın 9'unu yakalar, 3'ünde damga değişimini kaçırır ve aracı taze der — açık rejimdeki beş yanlış kararın üçü buradan gelir.
İçindekiler
Önceki ders çerçevelemenin aracının hangi alanı okuyabildiğini belirlediğini ölçtü. Ama alanı okuyabilmek her zaman yetmez. Aracının verdiği beş karardan dördü tek bir alana bakar: yöntem yinelenebilirliği, im paylaşılabilirliği söyler. Beşincisi başkadır. Tazelik, tek bir alanın değerinden çıkmaz; elde tutulan kopya ile yeni gelen iletinin karşılaştırılmasından çıkar.
Karşılaştırma yeni bir sorun getirir. İki değeri kıyaslayan her düzeneğin bir çözünürlüğü vardır: ayırt edebildiğinden küçük bir fark, ona göre fark değildir. Bu dersin ölçtüğü şey budur — aracının sakladığı kopyanın bayat olduğunu ne kadar sık fark ettiği, ve fark edemediğinde ne dediği.
Tazelik ve Doğrulama: İki Ayrı Soru
Aracının önbelleğindeki bir kopya için iki ayrı soru vardır.
Tazelik sorusu: bu kopyayı sormadan verebilir miyim? Yanıtı sunucunun bildirdiği tazelik ömrüdür (freshness lifetime). Ömür içindeyse aracı kopyayı doğrudan verir; sunucuya hiç dönmez, hiç tur harcamaz.
Doğrulama sorusu: ömür dolduysa kopya hâlâ geçerli mi? Yanıtı doğrulayıcı (validator) verir: sunucunun gösterime iliştirdiği bir damga. Aracı elindeki damgayla sunucudakini karşılaştırır; aynıysa kopya geçerlidir.
İkisi karıştırılırsa ölçü kaybolur. Tazelik bir süre kararıdır ve tur harcamaz. Doğrulama bir kimlik kararıdır ve gerçeği verir. Önbelleğin bütün tasarımı bu ikisi arasındaki takasa dayanır: süre uzarsa tur azalır ve bayat kopya verme olasılığı büyür.
Bu iki sorudan önce bir üçüncüsü gelir ve önceki iki ders onu kurdu: bu yanıt
saklanabilir mi, saklandıysa paylaşılabilir mi? Aracı bir kopyayı ancak yöntem
güvenliyse saklar ve ancak kişiye özel im yoksa başkasına verir. Tazelik sorusu bu iki
kararın ardından gelir; saklanmayan bir kopyanın tazeliği diye bir soru yoktur. Ölçümde bu
sıra korunur: üç rejim de aynı saklanabilir ve paylasilabilir kararlarını verir,
aralarındaki tek fark tazeliktir.
Bu kursta ölçülen şey direktif listesi ya da önbelleğin kazandırdığı gövde değildir; bunlar Önbellekleme, Kuyruklar ve Eşzamansız İşleme kursunda kuruldu. Burada ölçülen tek şey doğrulayıcının çözünürlüğüdür — damganın hangi değişimleri gördüğü ve hangilerini görmediği.
Doğrulayıcının Çözünürlüğü
HTTP iki tür doğrulayıcı tanımlar ve ikisinin çözünürlüğü aynı değildir.
Zaman damgası doğrulayıcısı gösterimin son değişme anını taşır. Çözünürlüğü, damganın yazıldığı zaman birimidir: aynı saniye içinde iki kez değişen bir gösterim, iki değişimden sonra da aynı damgayı taşır. Aracı damgayı aynı görür ve kopyayı geçerli sayar.
Varlık etiketi doğrulayıcısı gösterimin içeriğinden türetilen bir dizgidir ve zaman birimine bağlı değildir. Etiketin güçlü ve zayıf iki biçimi vardır. Güçlü etiket bayt düzeyinde ayrımı taşır. Zayıf etiket, anlamca önemsiz sayılan değişimleri kasten göz ardı eder — yani çözünürlüğü bilerek düşürülmüş bir doğrulayıcıdır.
# ogretilen dokum , calistirilmamistir # sunucunun yanitta tasidigi dogrulayicilar HTTP/1.1 200 OK Last-Modified: Sun, 09 Aug 2026 11:04:07 GMT ETag: "olcum-7a" Cache-Control: max-age=60 Age: 12 # aracinin elindeki kopyayi sinamak icin kurdugu kosullu istek GET /olcum/kuzey HTTP/1.1 Host: istasyon.ornek If-None-Match: "olcum-7a" If-Modified-Since: Sun, 09 Aug 2026 11:04:07 GMT # damga ayni ise HTTP/1.1 304 Not Modified ETag: "olcum-7a"
Cache-Control tazelik ömrünü, Age kopyanın önbellekte geçirdiği süreyi bildirir; ikisi
tazelik sorusunu yanıtlar. If-None-Match ve If-Modified-Since koşullu isteği kurar,
304 ise damganın aynı kaldığını bildiren durum kodudur. Ölçümde bu alanların hepsi tek bir
bildirime indirgenir: iletide taşınan damga, aracının elindekinden farklı mı?
Age alanının ayrı bir işlevi vardır. Aracı sakladığı kopyanın yaşını bu alanla bildirir ki
zincirdeki bir sonraki aracı aynı hesabı yapabilsin. Birden çok aracı varsa yaş toplanarak
taşınır ve tazelik ömrü zincirin tamamı için tek bir bütçedir; her durak kendi payını
harcar.
Damganın kendisi de iletide yazandan başka bir şey değildir. Doğrulayıcıyı doğrulayan bir şey yoktur: damga değişmediyse aracı gösterimin değişmediğine inanır, çünkü elinde başka bir dayanak yoktur.
- HA55 — Aynı kırk alışveriş ve aynı kâhin kullanılır; kâhin, aracının elindeki kopyanın gerçekten bayat olup olmadığını bilir.
- HA56 — Aracı yolun üzerindedir ve geçen yanıtları görür; elindeki damgayla iletide gelen damgayı karşılaştırır. Karşılaştırma fazladan bir gidiş–dönüş istemez, çünkü ileti zaten aracının önünden geçmektedir.
- HA57 — Damganın bir çözünürlüğü vardır: değişim damganın ayırt edebileceğinden küçükse damga aynı kalır ve aracı değişimi göremez.
- HA58 — Üç rejim ölçülür.
yalnız sürerejiminde iletide tazelik ömrü bildirilir, doğrulayıcı bildirilmez.damgarejiminde doğrulayıcı bildirilir.her seferinde sorrejiminde ikisi de bildirilmez. - HA59 — Ölçüm penceresinde tazelik ömrü dolmaz;
yalnız sürerejiminde aracı her kopyayı taze sayar. - HA60 — Tazelik kararını alamayan aracı koşullu bir istek gönderir. Sunucu gerçeği bilir, bu yüzden tur sonrası yakalama tamdır.
- HA61 — Bayt sayımı ileti alanlarının sayımıdır; gövde sayılmaz.
Ölçüm
"""HTTP onbellekleme: tazelik , dogrulama ve dogrulayicinin cozunurlugu. Bolum 1 - dogrulayici bayat kopyalarin kacini yakaliyor. Bolum 2 - uc rejim: yalniz sure , damga , her seferinde sor. """ TOHUM = 20260809 GUVENLI = {"GET", "HEAD"} ETKISIZ = {"GET", "HEAD", "PUT", "DELETE"} YONTEMLER = ["GET", "GET", "GET", "HEAD", "POST", "PUT", "DELETE"] YOLLAR = ["/olcum/kuzey", "/olcum/yamac", "/ozet", "/kayit", "/oturum"] KARARLAR = ("saklanabilir", "paylasilabilir", "taze", "yinelenebilir", "yonlendirilebilir") def uretec(tohum): d = tohum % 2147483646 + 1 def r(n): nonlocal d d = (d * 48271) % 2147483647 return d % n return r def alisverisler(sayi=40): r, liste = uretec(TOHUM), [] for i in range(sayi): yontem, yol = YONTEMLER[r(7)], YOLLAR[r(5)] ozel = yol == "/oturum" or r(5) == 0 degisti = r(3) == 0 liste.append({"no": i + 1, "yontem": yontem, "yol": yol, "ozel": ozel, "degisti": degisti, "ozel_imi": ozel and r(4) != 0, "damga_atladi": degisti and r(6) == 0}) return liste def kahin(a): return {"saklanabilir": a["yontem"] in GUVENLI and not a["ozel"], "paylasilabilir": not a["ozel"], "taze": not a["degisti"], "yinelenebilir": a["yontem"] in ETKISIZ, "yonlendirilebilir": True} def ileti(a, gorunur): tam = {"yontem": a["yontem"], "yol": a["yol"], "konak": "istasyon.ornek", "ozel_imi": a["ozel_imi"], "dogrulayici": a["degisti"] and not a["damga_atladi"], "tazelik_omru": True} return {k: v for k, v in tam.items() if k in gorunur} def bayt(i): return sum(len(k) + len(str(v)) + 4 for k, v in i.items()) def araci(i): k = {} if "yontem" in i: k["yinelenebilir"] = i["yontem"] in ETKISIZ if "ozel_imi" in i: k["paylasilabilir"] = not i["ozel_imi"] if "yontem" in i: k["saklanabilir"] = i["yontem"] in GUVENLI and not i["ozel_imi"] if "dogrulayici" in i: k["taze"] = not i["dogrulayici"] elif "tazelik_omru" in i: k["taze"] = i["tazelik_omru"] if "konak" in i: k["yonlendirilebilir"] = True return k ORTAK = ("yontem", "yol", "konak", "ozel_imi") GORUNUR = {"yalnız süre": ORTAK + ("tazelik_omru",), "damga": ORTAK + ("dogrulayici",), "her seferinde sor": ORTAK} A = alisverisler() BAYAT = [a for a in A if a["degisti"]] KACAN = [a for a in BAYAT if a["damga_atladi"]] print(f"alışveriş {len(A)} | karar {len(A) * len(KARARLAR)} | " f"bayat kopya {len(BAYAT)} | damga değişimi kaçan {len(KACAN)}") print("kaçan alışverişler:", [(a["no"], a["yol"]) for a in KACAN]) print() print(f" {'rejim':18s}{'yakalanan':>10s}{'kaçan':>7s}{'çözünürlük':>12s}" f"{'sorulan tur':>13s}{'tur sonrası':>13s}") for ad in GORUNUR: yakalanan = sum(1 for a in BAYAT if araci(ileti(a, GORUNUR[ad])).get("taze") is False) sorulan = sum(1 for a in A if "taze" not in araci(ileti(a, GORUNUR[ad]))) print(f" {ad:18s}{yakalanan:>10d}{len(BAYAT) - yakalanan:>7d}" f"{yakalanan / len(BAYAT):>12.4f}{sorulan:>13d}" f"{len(BAYAT) if sorulan else yakalanan:>13d}") print() print(f" {'rejim':18s}{'karar':9s}{'doğru':>7s}{'yanlış':>8s}" f"{'alınamayan':>12s}{'fazladan tur':>14s}{'bayt':>7s}") for ad in GORUNUR: td = ty = te = d = y = e = t = b = 0 for a in A: gercek, verilen = kahin(a), araci(ileti(a, GORUNUR[ad])) eksik = False for karar in KARARLAR: if karar not in verilen: e += 1 eksik = True te += karar == "taze" elif verilen[karar] == gercek[karar]: d += 1 td += karar == "taze" else: y += 1 ty += karar == "taze" t += 1 if eksik else 0 b += bayt(ileti(a, GORUNUR[ad])) print(f" {ad:18s}{'tazelik':9s}{td:>7d}{ty:>8d}{te:>12d}") print(f" {ad:18s}{'bütün':9s}{d:>7d}{y:>8d}{e:>12d}{t:>14d}{b:>7d}")
alışveriş 40 | karar 200 | bayat kopya 12 | damga değişimi kaçan 3 kaçan alışverişler: [(24, '/ozet'), (25, '/oturum'), (37, '/olcum/yamac')] rejim yakalanan kaçan çözünürlük sorulan tur tur sonrası yalnız süre 0 12 0.0000 0 0 damga 9 3 0.7500 0 9 her seferinde sor 0 12 0.0000 40 12 rejim karar doğru yanlış alınamayan fazladan tur bayt yalnız süre tazelik 28 12 0 yalnız süre bütün 186 14 0 0 3533 damga tazelik 37 3 0 damga bütün 195 5 0 0 3524 her seferinde sor tazelik 0 0 40 her seferinde sor bütün 158 2 40 40 2733
Çözünürlük: Dörtte Üç
Üst tablonun orta satırı bu dersin sayısıdır. Kırk alışverişte aracının elindeki kopya 12 kez bayattır. Doğrulayıcı bunların 9’unda damganın değiştiğini görür ve kopyayı bayat sayar. 3’ünde damga değişmemiştir; aracı iki damgayı aynı görür ve kopyaya taze der. Çözünürlük 0,7500.
Üç kaçan alışverişin yolları farklı: /ozet, /oturum ve /olcum/yamac. Kaçırma bir yola
ya da bir yönteme bağlı değil — değişimin damganın ayırt edebileceğinden küçük olmasına
bağlı. Bu, çözünürlüğün tanımı gereği böyledir ve düzeltilebilir bir hata değildir; ancak
damgayı değiştirerek daraltılabilir bir aralıktır.
Bu üç kaçırmanın hiçbir belirtisi yoktur. Aracı kurala uygun çalışmış, damgaları doğru karşılaştırmış, kopyayı doğru gerekçeyle vermiştir. Kararın yanlış olduğunu yalnız kâhin bilir ve kâhin burada kurguyu bizim üretmemizden doğar. Gerçek bir dağıtımda o kâhin yoktur: bayat kopya, taze kopyayla aynı görünür.
Saklanan kopyayı düşüren bir yol daha vardır ve tur harcamaz. Aracı, sakladığı adrese
güvenli olmayan bir yöntemle giden bir istek gördüğünde o kopyanın artık geçerli
olmayacağını çıkarabilir: aynı yola PUT ya da DELETE geçtiğinde elindeki kopyayı düşürür.
Bu da iletiden alınan bir karardır ve damganın çözünürlüğüne bağlı değildir. Sınırı şudur:
aracı yalnız kendi önünden geçen isteği görür. Aynı gösterimi başka bir yoldan
değiştiren bir istek onun önünden geçmez ve kopya sessizce bayatlar — sonuç, damganın
kaçırdığı üç alışverişle aynıdır.
Üst tablonun ilk satırı, doğrulayıcının olmadığı durumu veriyor. Aracı yalnız tazelik ömrüne bakıyor, ömür de dolmuyor: 12 bayat kopyanın hiçbirini yakalamıyor. Çözünürlük 0,0000. Süre bir çözünürlük ölçüsü bile değildir, çünkü değişimi hiç sınamaz — yalnız bir bahis koyar.
Son satır tersini yapıyor. Aracı tazelik kararını hiç almıyor, her alışverişte soruyor: 40 tur. Karşılığında yakalama tam, 12/12. Ama bu on iki kopyanın yakalanması için kırk soru soruldu; yirmi sekizi zaten taze olan kopyalar için harcandı.
Üç Rejimin Karar Bedeli
Alt tablo aynı üç rejimi bütün karar kümesi üzerinden veriyor.
yalnız süre rejiminde tazelik kararı 28 doğru, 12 yanlış. Bütün küme
186/14/0. Yanlış sayısı en yüksek burada: aracı hiç sormadan, hiç eksik karar
bırakmadan on dört kez yanılıyor. Bayt 3533, üç rejimin en yükseği.
damga rejiminde tazelik 37 doğru, 3 yanlış; bütün küme 195/5/0 ve
0 tur. Ortak kurgunun açık rejimi tam olarak budur ve beş yanlış kararın üçü bu
satırdan geliyor. Kalan ikisi, sunucunun koymayı unuttuğu kişiye özel imden gelir ve
tazelikle ilgisi yoktur.
her seferinde sor rejiminde tazelik kararı hiç alınmıyor: 40 alınamayan. Bütün küme
158/2/40 ve 40 tur. Yanlış 5’ten 2’ye iniyor. Kalan iki yanlış yine
kişiye özel imden — sormak onu düzeltmiyor, çünkü sorulan soru tazelikle ilgili.
Üç satır kursun eksenini bir kez daha veriyor. Alınamayan karar bir tur borcudur: kırk tur, kırk kararın karşılığıdır. Alınan karar ise yanlış olabilir: damga rejimi kırk tazelik kararını sıfır turla alıyor ve üçünde yanılıyor. Süre rejimi de sıfır tur harcıyor ama on ikisinde yanılıyor — aynı bedelle üç kat yanlış.
Sıralama Neye Göre Yapılır
Üç rejim arasında tek bir “en iyi” yoktur; sıralama neyin pahalı olduğuna göre değişir.
Tur pahalıysa damga rejimi seçilir: sıfır tur, üç yanlış. Üç yanlış iki yüz kararlık
kümede 0,0150’lik bir paydır; bu kümede ölçülebilen en küçük fark 1/200 = 0,0050
olduğuna göre üç yanlış bandın içindedir ve savunulabilir bir sayıdır. Bayat kopya vermek
kabul edilemezse her seferinde sor seçilir ve kırk tur ödenir. yalnız süre rejimi ise
yalnız değişim beklenmeyen gösterimler için savunulabilir; ölçümde bayat oranı 12/40
olduğu için burada savunulamaz.
Damganın çözünürlüğünü yükseltmek dördüncü bir yoldur ve tabloya girmez, çünkü ölçüm damgayı veri olarak alır. Yine de yön bellidir: zaman damgası yerine varlık etiketi, zayıf etiket yerine güçlü etiket, çözünürlüğü büyüten değil daraltan seçimdir. Her daraltma kaçan üçü azaltır ve hiçbiri tur eklemez.
Son bir gözlem: her seferinde sor rejiminin baytı 2733, damga rejiminin 3524.
Sormak iletiyi küçültür, çünkü taşınmayan alan bayt tutmaz. Ama küçülen ileti, borçlanılan
kırk turun yanında hiçbir şeydir. Bayt ucuzdur, tur pahalıdır — kursun ölçü ekseni tam
olarak bunu söylüyordu.
Özet
- Tazelik ve doğrulama ayrı sorulardır: tazelik kopyanın sormadan verilip verilemeyeceğini, doğrulama kopyanın hâlâ geçerli olup olmadığını yanıtlar.
- Doğrulayıcının bir çözünürlüğü vardır; zaman damgası zaman birimiyle, varlık etiketi içerikle sınırlıdır ve zayıf etiket çözünürlüğü bilerek düşürür.
- Kırk alışverişteki 12 bayat kopyanın 9’u yakalanır, 3’ünde damga değişimi kaçar ve aracı taze der; çözünürlük 0,7500.
- Açık rejimin 5 yanlış kararının 3’ü bu üç kopyadan gelir; kalan ikisi kişiye özel imden gelir ve tazelikle ilgisi yoktur.
- Üç rejim:
yalnız süre186/14/0 ve 0 tur,damga195/5/0 ve 0 tur,her seferinde sor158/2/40 ve 40 tur. Sormak yanlışı düşürür, tur borcu doğurur.
Sonraki Adım
Bu konu boyunca aracı kararlarını hep aynı gerekçeyle aldı: iletide yazanı okuyabiliyordu. Yöntemi okudu ve yinelenebilirliğe karar verdi, imi okudu ve paylaşılabilirliğe, damgayı okudu ve tazeliğe. Yanıldığı yerlerde bile okuyabiliyordu; yanılma okumadan değil, okuduğunun eksik olmasından geldi.
Sonraki konu bu koşulu kaldırır. Ya ileti okunamıyorsa? İki uç, aralarında geçen iletiyi yalnız birbirlerinin anlayabileceği hâle getirirse aracının elinde ne kalır? Soru kursun üçüncü iddiasına bağlanır: karar veren yalnız iki uç değildir, ve iletiyi kapatmak aradaki kararları uçlara taşır. Sonraki ders bu kapatmanın nasıl kurulduğunu ve kime neyi ödettiğini ele alacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.