---
title: 'TLS El Sıkışması'
source: 'https://academia.sh/tr/kurslar/uygulama-protokolleri/tls-el-sikismasi'
course: 'Uygulama Katmanı Protokolleri'
language: tr
updated: '2026-08-17T18:07:03+00:00'
license: 'CC BY-SA 4.0'
---

# TLS El Sıkışması

El sıkışmanın gidiş–dönüş bütçesi, oturum sürdürmenin kazandırdığı tur ve taşıma zarfı kapandığında aracının kaybettiği 160 karar.

Zincir doğrulaması hiç tur istemedi, ama havada da yapılmadı. Sertifikanın istemcinin eline
geçmesi için önce bir alışverişin başlaması, sunucunun zinciri sunması ve iki tarafın ortak
sırra varması gerekiyordu. **TLS (Transport Layer Security)** el sıkışması bu üç işi tek bir
kurulum içinde yapar.

Bu dersin sorusu iki katlıdır. Birincisi bütçedir: kurulum kaç gidiş–dönüş tutar, bu bütçe
kim tarafından ödenir ve tekrar tekrar ödenmesi nasıl önlenir. İkincisi kursun asıl
konusudur: kurulum tamamlandığında ileti bir **taşıma zarfı (transport envelope)** içine
girer ve aracı artık iletide yazanı okuyamaz. Kurs boyunca sayılan karar tablosuna bunun ne
yaptığı burada ölçülüyor.

## El Sıkışmanın Taşıdıkları

El sıkışma, üzerinde anlaşılması gereken her şeyi az sayıda iletide toplar.

```text
tam kurulum
  istemci -> sunucu : selam, desteklenen takımlar, istemcinin anahtar payı
  sunucu  -> istemci: selam, seçilen takım, sunucunun anahtar payı,
                      sertifika zinciri, bitirme
  istemci -> sunucu : bitirme, ardından uygulama verisi

oturum sürdürme
  istemci -> sunucu : selam, önceki oturumun sürdürme kimliği
  sunucu  -> istemci: selam, bitirme
  istemci -> sunucu : bitirme, ardından uygulama verisi
```

Bu döküm çalıştırılmaz; adımların **ne taşıdığını** gösterir. Dört iş yan yana durur:
takımın seçilmesi, anahtar paylarının değişimi, sertifika zincirinin sunulması ve iki tarafın
kurulumu bitirdiğini birbirine doğrulaması.

Dört iş bağımsız değildir: takım seçilmeden anahtar payları yorumlanamaz, anahtar payları
değişmeden bitirme hesaplanamaz. Adımların sırası bu bağımlılıktan çıkar; turlar
birleştirilebilir ama yer değiştiremez.

Sıranın kendisi bir tasarım kararıdır. Sertifika zinciri, sunucunun **ilk** yanıtıyla gelir;
istemci onu doğrulamak için ayrıca bir istek yapmaz. Önceki dersteki ölçüm bunun karşılığıdır:
zincir doğrulaması sıfır gidiş–dönüşle yürüyordu, çünkü doğrulayacağı her şey zaten elindeydi.
Sürdürme adımlarında sertifika zinciri yoktur — istemci o zinciri bir kez doğrulamış, sonucu
oturumla birlikte saklamıştır.

## Takımın Seçilmesi ve Bitirme

Dört işten ilki bir pazarlıktır. İstemci desteklediği **şifre takımlarını (cipher suite)**
bildirir, sunucu bunlardan birini seçer. Takım, kurulumdan sonra hangi simetrik dönüşümün ve
hangi özet işlevinin kullanılacağını belirler; ilk dersteki iş bölümü burada somutlaşır.

Pazarlığın bir sorunu vardır ve bu, kursun her dersinde tekrarlanan sorunun aynısıdır: ilk
iki ileti henüz korunmayan bir kanalda gider. Yolun üzerindeki bir katman istemcinin
listesini okuyabilir. Belirtimin buna verdiği yanıt, kurulumun son adımındaki **bitirme**
iletisidir: bitirme, o ana kadar alınıp verilen el sıkışma iletilerinin **tamamının** özeti
üzerinde hesaplanır ve kurulumdan çıkan anahtarla üretilir. İki taraf da karşının bitirmesini
denetler; birinin gördüğü el sıkışma dökümü öbürününkinden farklıysa bitirme tutmaz ve
kurulum tamamlanmaz.

Bu, kursta ilk kez rastlanan bir şeydir. Aracının bütün kararları bir **bildirime**
dayanıyordu ve bildirimi doğrulayan hiçbir şey yoktu. Bitirme, pazarlığın bildirimini
doğrulayan bir adımdır: bildirim sonradan denetlenebilir hâle getirilmiştir. Aradaki fark,
kim tarafından denetlendiğidir — denetimi aracı değil, **uçlar** yapar.

Bitirmenin denetlemediği bir şey kalır: listenin **içeriği**. Bitirme, iki tarafın aynı
listeyi gördüğünü doğrular; listede zayıf bir takımın bulunmasını engellemez. Zayıf takımları
listede tutmak bu yüzden bir **yapılandırma kusurudur**: seçim gerçekten yapılmış, pazarlık
gerçekten doğrulanmış olur ve yine de kurulum kötü bir takıma oturur. *Daraltma:* listenin
kendisi daraltılırsa — yalnız kabul edilebilir takımlar bildirilirse — pazarlığın varabileceği
sonuç kümesi de daralır ve doğrulama işe yarar hâle gelir. Bu bir belirtidir ve burada
yazılan neyin yanlış olduğudur.

## Bütçe Bağlantı Başına Ödenir

Kurulumun turu alışverişe değil **bağlantıya** yazılır. Kırk alışveriş tek bir bağlantıda
yapılıyorsa kurulum bir kez ödenir; kırk ayrı bağlantıda yapılıyorsa kırk kez.

Aşağıdaki ölçüm tam kurulumu iki gidiş–dönüş, oturum sürdürmeyi bir gidiş–dönüş olarak
**modelliyor**. Bu iki sayı ders içinde seçilmiş model değerleridir; belirtim ailesinin
farklı sürümlerinde farklı çıkarlar ve ders bir sürüm iddiası taşımaz. Ölçülen şey sayıların
kendisi değil, **bağlantı sayısıyla nasıl büyüdükleridir.**

```python
ALISVERIS = 40
TAM_TUR = 2          # ders içinde modellenen tam kurulum bütçesi
SURDURME_TUR = 1     # ders içinde modellenen oturum sürdürme bütçesi

print(f"{'bağlantı':>9s} {'sürdürmesiz kurulum':>20s} {'sürdürmeli kurulum':>19s} "
      f"{'kazanılan tur':>14s} {'toplam tur':>11s} {'alışveriş başına':>17s}")
for baglanti in (40, 8, 4, 1):
    sursuz = baglanti * TAM_TUR
    surdurmeli = TAM_TUR + (baglanti - 1) * SURDURME_TUR
    toplam = surdurmeli + ALISVERIS
    print(f"{baglanti:9d} {sursuz:20d} {surdurmeli:19d} {sursuz - surdurmeli:14d} "
          f"{toplam:11d} {toplam / ALISVERIS:17.3f}")
```

```
 bağlantı  sürdürmesiz kurulum  sürdürmeli kurulum  kazanılan tur  toplam tur  alışveriş başına
       40                   80                  41             39          81             2.025
        8                   16                   9              7          49             1.225
        4                    8                   5              3          45             1.125
        1                    2                   2              0          42             1.050
```

Kırk ayrı bağlantı kurulan rejimde kurulum, sürdürme olmadan **80 tur** tutar; kırk
alışverişin kendisi 40 tur tuttuğuna göre bağlantı kurmak, iş yapmaktan **iki kat** pahalıdır.
**Oturum sürdürme (session resumption)** bu satırda 39 turu geri verir ve toplamı 81'e
indirir; alışveriş başına 2,025 tur düşer.

İki gözlem tabloyu okumaya yeter. Birincisi, sürdürmenin kazandırdığı tur **bağlantı sayısına
bağlıdır**: tek kalıcı bağlantıda kazanç sıfırdır, çünkü sürdürülecek bir şey yoktur.
İkincisi, sürdürme kurulumu ortadan kaldırmaz — yalnız **ucuzlatır**. Kırk bağlantılık
satırda bile alışveriş başına 1,000 turun üzerinde kalınır; sıfıra inen tek yol bağlantıyı
kalıcı tutmaktır.

Sürdürmenin turdan başka kazandırdığı bir şey daha vardır ve bu, önceki derse bağlanır:
sürdürülen oturumda sertifika zinciri yeniden sunulmaz, dolayısıyla zincir doğrulaması da
yeniden yapılmaz. Bir kez alınmış bir karar, oturum yaşadığı sürece yeniden alınmaz. Bunun
bedeli de aynı yerdedir: zincir hakkındaki bilgi **eskir** ve oturum bu eskimeyi görmez.

## Zarf Kapanınca

Kurulum bittiğinde uygulama iletisi zarfın içine girer. Aracı iletinin geldiğini görür,
uzunluğunu görür, hangi konağa gittiğini görür — ama yöntemi, yolu, kişiye özel imini ve
doğrulayıcıyı **göremez.**

Kurs boyunca sayılan karar tablosu şimdi iki rejimde ölçülüyor. `açık` rejiminde aracı beş
alanın hepsini okur; `zarf` rejiminde yalnız konak adını. Kâhin — kurguyu biz ürettiğimiz
için bilinen gerçek — değişmiyor. Kırk alışveriş ve alışveriş başına beş karar, 200 kararlık
bir kümedir; bu kümede ölçülebilen en küçük fark 1/200 = 0,0050'dir.

Bu dersin iki ölçümünün varsayımları:

- **GT13** — Bütçe tablosunda tam kurulum iki, oturum sürdürme bir gidiş–dönüş olarak
  **ders içinde modellenir**; iki değer de seçilmiş model değerleridir ve bir belirtim sürümü
  iddiası taşımaz.
- **GT14** — Kurulumun turu bağlantıya, alışverişin turu alışverişe yazılır: kırk alışveriş
  kırk tur tutar ve sürdürmeli rejimde ilk bağlantı tam kurulumu, kalanlar sürdürmeyi öder.
- **GT15** — Karar tablosunda kursun kırk alışverişi aynı tohumdan yeniden üretilir;
  alışveriş başına beş karar sayılır ve kâhin rejim değişince değişmez.
- **GT16** — İki rejim karşılaştırılır: `açık` rejiminde aracı yöntemi, yolu, konak adını,
  kişiye özel imi ve doğrulayıcıyı okur; `zarf` rejiminde yalnız konak adını. Konak adı
  kurulumun ilk iletisinde, henüz ortak sır yokken bildirildiği için zarfın dışındadır.
- **GT17** — Aracı yolun üzerindedir ve yalnız zarfın dışında kalana bakar; alamadığı her
  karar bir **tur borcudur** — o alışverişte sunucuya bir tur daha atılır.
- **GT18** — Bayt sütunu aracının okuyabildiği alanların sayımıdır, gerçek iletinin uzunluğu
  değil; ölçüm bir ağ ölçümü değildir.

```python
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")
GORUNUR = {"açık": ("yontem", "yol", "konak", "ozel_imi", "dogrulayici"),
           "zarf": ("konak",)}


def uretec(tohum: int):
    d = tohum % 2147483646 + 1

    def r(n: int) -> int:
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def alisverisler(sayi: int = 40) -> list[dict]:
    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: dict) -> dict:
    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: dict, gorunur: tuple) -> dict:
    tam = {"yontem": a["yontem"], "yol": a["yol"], "konak": "istasyon.ornek",
           "ozel_imi": a["ozel_imi"],
           "dogrulayici": a["degisti"] and not a["damga_atladi"]}
    return {k: v for k, v in tam.items() if k in gorunur}


def araci(i: dict) -> dict:
    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"]
    if "konak" in i:
        k["yonlendirilebilir"] = True
    return k


def bayt(i: dict) -> int:
    return sum(len(k) + len(str(v)) + 4 for k, v in i.items())


def olc(ad: str) -> tuple:
    dogru = yanlis = alinamayan = tur = toplam = 0
    for a in alisverisler():
        gercek, verilen = kahin(a), araci(ileti(a, GORUNUR[ad]))
        eksik = False
        for karar in KARARLAR:
            if karar not in verilen:
                alinamayan += 1
                eksik = True
            elif verilen[karar] == gercek[karar]:
                dogru += 1
            else:
                yanlis += 1
        tur += 1 if eksik else 0
        toplam += bayt(ileti(a, GORUNUR[ad]))
    return dogru, yanlis, alinamayan, tur, toplam


print(f"{'rejim':<8s} {'doğru':>6s} {'yanlış':>7s} {'alınamayan':>11s} "
      f"{'fazladan tur':>13s} {'bayt':>6s}")
for ad in ("açık", "zarf"):
    print(("{:<8s} {:6d} {:7d} {:11d} {:13d} {:6d}").format(ad, *olc(ad)))

print()
print(f"{'karar':<20s} {'açık':>8s} {'zarf':>8s}")
for karar in KARARLAR:
    alinan = [sum(karar in araci(ileti(a, GORUNUR[ad])) for a in alisverisler())
              for ad in ("açık", "zarf")]
    print(f"{karar:<20s} {alinan[0]:8d} {alinan[1]:8d}")
```

```
rejim     doğru  yanlış  alınamayan  fazladan tur   bayt
açık        195       5           0             0   3524
zarf         40       0         160            40    920

karar                    açık     zarf
saklanabilir               40        0
paylasilabilir             40        0
taze                       40        0
yinelenebilir              40        0
yonlendirilebilir          40       40
```

## Yüz Altmış Kararın Gittiği Yer

Açık rejimde aracı 200 kararın 200'ünü alıyordu ve sunucuya hiç dönmüyordu; 195'i doğru,
5'i yanlıştı. Zarf rejiminde **160 karar alınamıyor.** Bu kararlar yok olmadı; aracı onları
alamadığı için **uçlara taşındılar.** Karar veren yalnız iki uç değildi; şimdi öyle oldu.

İkinci tablo bu 160'ın nereden toplandığını tek tek gösteriyor. Beş karardan dördü —
`saklanabilir`, `paylasilabilir`, `taze`, `yinelenebilir` — açık rejimde kırk alışverişin
kırkında da alınıyor, zarf rejiminde hiçbirinde alınmıyor: dört karar çarpı kırk alışveriş,
160. Ayakta kalan tek karar `yonlendirilebilir`, çünkü tek dayanağı olan konak adı zarfın
dışındadır. Kaybın dağılımı düzgün değil, **keskindir**: bir alanı gizlemek o alana bağlı
kararı azaltmaz, sıfırlar.

Fazladan tur sütunu bunun bedelini gösteriyor: 40 alışverişin **kırkında da** aracının
alamadığı en az bir karar vardır, yani kırkında da sunucuya bir tur daha atılır. Aracının
kaybettiği görünürlük, doğrudan bir tur borcuna dönüşüyor.

Bayt sütunu ise ilk bakışta ters görünür: 3524'ten 920'ye iner. Aracı için ileti küçüldü,
çünkü aracının **okuyabildiği** alanlar küçüldü. Gerçek ileti küçülmedi; yalnız aracının
tarafındaki payı küçüldü. Bu, kursun ikinci iddiasının tersten okunuşudur — orada alan
eklemek karar kazandırmıyordu, burada alan gizlemek bayt kazandırıyor ama karar kaybettiriyor.

Asıl satır ise yanlış sütunudur: **zarf rejiminde 0.** Kalan 40 kararın hiçbiri yanlış
değildir. Bunun nedeni ince değil, doğrudandır: kalan tek karar `yonlendirilebilir` ve o
karar yalnız konak adına bakar; konak adı zarfın dışında kaldığı için de her zaman doğrudur.
Açık rejimdeki 5 yanlış karar, aracının **bildirime inandığı** yerlerden geliyordu — sunucunun
koymayı unuttuğu bir im ve doğrulayıcının kaçırdığı bir değişim. Aracı okuyamadığı bir alana
inanamaz.

Buradan çıkan cümle kursun üçüncü iddiasıdır ve bir kusur tarifi değildir: **az karar, ama
yanlışsız.** Zarf rejimi, aracının 200 karardan 40'ını almasına izin verir; karşılığında
aracının yanılma yüzeyini sıfıra indirir. Hangisinin tercih edileceği bir ölçüm sorusu değil,
bir tasarım kararıdır.

## Kalan Yüzey ve Daraltmaları

Zarf bir kayıt biçimidir: uygulama iletisi parçalara ayrılır, her parça uzunluğuyla birlikte
sarılır ve öyle taşınır. Bu, aracının gördüğü şeyin sınırını çizer. Aracı kayıtların
sınırlarını ve uzunluklarını görür — çünkü kayıt sınırını görmeden iletiyi ileri
taşıyamaz — ama kaydın içindekini görmez. Karar tablosundaki 160'ın sıfırlanması bu ayrımın
sonucudur: aracının elinde kalan şey iletinin **kabıdır**, içeriği değil.

Zarf her şeyi kapatmaz. Aracının hâlâ gördükleri ve her birinin daraltması:

- **Konak adı.** Kurulumun ilk iletisinde, henüz ortak sır yokken bildirilir; ölçümde
  `yonlendirilebilir` kararının tek dayanağı budur. *Daraltma:* adın da kurulumun korunan
  bölümüne alındığı düzenekler vardır; o durumda tablonun son satırı da alınamayana geçer ve
  aracı yönlendirme kararını da kaybeder.
- **Sertifika zinciri.** Tam kurulumda zincir açıkta sunulur ve konunun adını taşır.
  *Daraltma:* sürdürülen oturumlarda zincir hiç sunulmaz; bağlantı sayısı azaldıkça bu yüzey
  de küçülür.
- **İleti uzunluğu ve zamanlama.** Zarf gövdeyi kapatır, uzunluğunu ve varış anını kapatmaz.
  *Daraltma:* dolgu ve birleştirme, uzunluğu bir bandın içine iter.

Bir aracının 160 kararı geri kazanmasının tek bir yolu vardır ve bu bir açık değil, bir
yerleştirme kararıdır: aracı zarfı **kendisi sonlandırır**. O zaman iki ayrı kurulum olur —
istemciyle aracı arasında bir tane, aracıyla sunucu arasında bir tane — ve aracı ortada açık
rejime döner, tablonun ilk satırındaki 200 kararı yeniden alır. Bedeli tablodan okunmaz ama
tanımdan okunur: uçlar artık birbiriyle değil, ikisi de aracıyla kurulum yapmaktadır ve
istemcinin doğruladığı zincir sunucunun değil aracının zinciridir. *Daraltma:* böyle bir
aracının çıpası istemciye ayrıca yerleştirilmek zorundadır; yerleştirilmediği sürece zincir
doğrulaması düşer ve karar kaybı olduğu yerde kalır.

Bir de sık karşılaşılan **yapılandırma kusuru** vardır: kurulumu yapıp sertifika zincirini
doğrulamadan geçmek. Kazanç yereldir ve önceki dersin ölçümünde sayıldı — hiçbir tur
kazandırmaz. Ödenen şey, zarfın koruduğu bağın **kiminle** kurulduğunun bilinmemesidir. Bu
dersin söylediği neyin yanlış olduğudur; bunun nasıl yapılacağı yazılmaz.

## Özet

- El sıkışma takım seçimini, anahtar paylarının değişimini, sertifika zincirinin sunulmasını
  ve karşılıklı bitirmeyi tek bir kurulumda toplar; zincir ilk yanıtla geldiği için
  doğrulaması ayrı tur istemez.
- Takım pazarlığı henüz korunmayan bir kanalda yapılır; bitirme iletisi el sıkışmanın
  tamamının özeti üzerinde durduğu için pazarlığı uçlar denetler, aracı değil.
- Kurulumun bütçesi alışverişe değil bağlantıya yazılır: 40 bağlantıda sürdürmesiz 80 tur,
  sürdürmeli 41 tur; tek kalıcı bağlantıda 2 tur.
- Oturum sürdürme 40 bağlantılık rejimde 39 tur kazandırır ve zincir doğrulamasını
  yinelemez; tek bağlantıda kazancı sıfırdır.
- Zarf kapandığında 200 kararın 160'ı aracıdan uçlara taşınır, 40 alışverişin kırkında da bir
  tur borcu doğar ve aracının okuduğu bayt 3524'ten 920'ye iner.
- Kalan 40 kararın **hiçbiri yanlış değildir**; açık rejimdeki 5 yanlış karar aracının
  bildirime inandığı yerlerden geliyordu ve aracı okuyamadığı alana inanamaz.

## Sonraki Adım

Zincir doğrulaması yerel yürüdü, el sıkışma bütçesini bağlantı başına ödedi ve zarf
kapandığında 160 karar uçlara taşındı. Bu tablonun içinde bir tek şey ölçülmeden kaldı:
istemcinin doğruladığı zincir, doğrulandığı **anda** geçerliydi. Sertifikanın bir başlangıcı
ve bir bitişi vardır, ikisinin arasında iptal edilebilir ve iptal belgenin içine yazılamaz.
Sonraki ders sertifikanın yaşam döngüsünü ve iptalin tur bütçesine ne eklediğini sayacak:
zincir sormadan doğrulanıyordu, iptal sorulmadan bilinemez.
