İçeriğe geç
academia.sh

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üre rejiminde iletide tazelik ömrü bildirilir, doğrulayıcı bildirilmez. damga rejiminde doğrulayıcı bildirilir. her seferinde sor rejiminde ikisi de bildirilmez.
  • HA59 — Ölçüm penceresinde tazelik ömrü dolmaz; yalnız süre rejiminde 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üre 186/14/0 ve 0 tur, damga 195/5/0 ve 0 tur, her seferinde sor 158/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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat