---
title: 'HTTP Önbellekleme'
source: 'https://academia.sh/tr/kurslar/uygulama-protokolleri/http-onbellekleme'
course: 'Uygulama Katmanı Protokolleri'
language: tr
updated: '2026-08-17T18:06:59+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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.

```text
# 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

```python
"""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.
