---
title: 'Katmanlı Tanı Yöntemi'
source: 'https://academia.sh/tr/kurslar/linux-ag-yonetimi/katmanli-tani-yontemi'
course: 'Linux Ağ Yönetimi ve Sorun Giderme'
language: tr
updated: '2026-08-17T18:10:00+00:00'
license: 'CC BY-SA 4.0'
---

# Katmanlı Tanı Yöntemi

Sekiz aday neden ve sekiz sınama üzerinde tanı sırasının ölçülmesi: katmanlı sıra 33, ters sıra 38, her adımda kâhine bakan açgözlü sıra 10 adım harcıyor; açgözlü sıra cevabı bilmeyi gerektirdiği için uygulanabilir bir yordam değil, ulaşılamaz bir alt sınırdır.

Önceki ders yerel servis envanterini çıkardı ve iki sınamanın eleme gücünü yan yana koydu:
dinleyen soket listesi yalnız **bir** aday nedeni eliyordu, uzaktan yapılan bir
bağlantı denemesi **yedi**. Elde artık sekiz ayrı sınama var ve hepsi çalıştırılabilir
durumda. Bu dersin sorusu hangi sınamanın yapılacağı değil, **hangi sırayla** yapılacağıdır.

Soru boş bir soru değildir. Bir arıza karşısında akla ilk geleni denemek, en tanıdık aracı
açmak ya da geçen seferki nedeni varsaymak birer sıradır ve her birinin bir bedeli vardır.
Bedelin birimi de bellidir: **kaç sınama yapıldığı**. Bu ders üç sırayı aynı sekiz arıza
üzerinde koşturur ve aralarındaki farkı sayar. Sayılardan biri şaşırtıcı derecede küçük
çıkacak; o sayının neden bir yönteme dönüştürülemediği dersin asıl konusudur.

## Aday Neden Kümesi

Tanı, bir kümeyi daraltma işidir. Başlangıçta elde bir belirti vardır — "sunucuya
bağlanılamıyor" — ve bu belirtiyi üretebilecek birden çok neden. Kursun ortak kurgusu bu
kümeyi **sekiz aday neden** olarak sabitler: arayüzün kapalı olması, adresin atanmamış
olması, varsayılan ağ geçidinin yanlış olması, rotanın eksik olması, çözücünün yanıt
vermemesi, servisin dinlememesi, güvenlik duvarının paketi düşürmesi ve büyük paketin yolda
kaybolması.

Sekiz sınama da bu kümenin üzerinde çalışır. Her sınama bir araca karşılık gelir, bir yanıt
döndürür ve o yanıt aday kümesini böler. **Kâhin**, gerçek arızadır: kurguyu biz seçtiğimiz
için hangi arızanın etkin olduğunu biliriz. Operatör bilmez; operatörün elinde yalnız
yanıtlar vardır.

Kurgunun varsayımları: bir istemci, bir sunucu ve tek bir hedef servis vardır ve aday neden
kümesi bu sekizle sınırlıdır (**SG1**); her arıza sağlam durumun tek bir alanını bozar, iki
arıza aynı anda bulunmaz (**SG2**); bir sınama kararlı tek bir yanıt döndürür ve aday sayısı
bire indiğinde durulur (**SG3**); açgözlü sıra her adımda gerçek arızayı bilerek en çok
eleyen sınamayı seçer (**SG4**); her sınamanın maliyeti eşittir ve bir adım sayılır (**SG5**).

Listenin nereden geldiği ayrı bir sorudur ve tanının en az konuşulan adımıdır. Aday neden
kümesi belirtiden türetilir: hangi bileşenler bu belirtiyi üretebilir, hangileri üretemez.
Kümeyi dar tutmak sınama sayısını düşürür ama gerçek nedeni dışarıda bırakma riskini
büyütür; geniş tutmak tersini yapar. Sekiz adaylı kurgu bir **kapalı dünya** varsayımıdır:
gerçek arızanın listede olduğu kabul edilir. Kapalı dünya bozulduğunda ölçünün kendisi
değil, ölçünün yorumu bozulur — bütün sınamalar biter, tek aday kalır ve o aday yanlıştır.
Bir tanı sırasının bitmesi, doğru bitirdiği anlamına gelmez.

Kümenin daralmasının bir başka kaynağı da sistem yönetimi kursunda ölçülen günlüklerdir.
Servis yeniden başlatıldıysa, bir birim arızalandıysa ya da bir yapılandırma değişikliği
kayda düştüyse bu, sınama yapılmadan önce bazı adayları öne çıkarır. Günlüklerin buradaki
rolü kanıt değil **öncüldür**: sıralamayı etkiler, adayı elemez. Eleme yalnız bir sınamanın
yanıtıyla olur.

Protokol katmanlarının kendisi, el sıkışma ve yönlendirme protokolleri Bilgisayar Ağları
müfredatının konusudur ve burada kurulmaz. Bu kurs tek bir makinenin yapılandırmasına ve
tanısına bakar. Ad alanı ile konteyner ağı da buraya girmez; onlar Çekirdek Arayüzleri ve
İzolasyon kursuna bırakılmıştır.

## Katmanlı Sıra ve İki Rakibi

**Katmanlı tanı**, sınamaları bağımlılık sırasına göre dizer: önce arayüz, sonra adres ve
rota, sonra yerel ağa erişim, sonra uzak erişim, sonra ad çözümleme, en sonda servisin
kendisi. Gerekçe sezgiseldir — alttaki bozuksa üsttekinin sonucu zaten anlamsızdır.

**Ters sıra** aynı listeyi tersten okur: önce servise bağlanmayı dener, sonra aşağı iner. Bu
da savunulabilir bir sıradır; çoğu arıza servis tarafındadır diye düşünen bir operatör
doğrudan oradan başlar.

**Açgözlü sıra** ise her adımda geriye en az aday bırakacak sınamayı seçer. Üç sıranın
kullandığı sınamalar aynıdır; aşağıdaki döküm bunların hangi komutlara karşılık geldiğini
gösterir ve **çalıştırılmamıştır**. Ölçüm ardından gelen blokta yapılır ve üç sırayı da aynı
sekiz arıza üzerinde koşturur.

```text
# ornek dokum , calistirilmis degildir
$ ip -brief link show                    # arayuz acik mi
$ ip -brief addr show                    # adres atanmis mi
$ ip route show                          # varsayilan gecit ve rota
$ ping -c 3 <ag-gecidi>                  # yerel aga yanki
$ getent hosts <sunucu-adi>              # ad cozumleme
$ ss -ltn                                # dinleyen bag noktalari
$ nc -z -w 3 <hedef> <bag-noktasi>       # baglanti denemesi
```

```python
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}

ARIZA = {                                    # SG2: her ariza TEK alani bozar
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}
ADAYLAR = tuple(ARIZA)


def durum(ariza=None):
    d = dict(SAGLAM)
    if ariza:
        d.update(ARIZA[ariza])
    return d


def yol(d):                        # arayuz + adres + gecit + rota birlikte
    return (d["arayuz_acik"] and d["adres_var"]
            and d["ag_gecidi_dogru"] and d["rota_var"])


SINAMA = {
    "arayuz": lambda d: ("acik-adresli" if d["arayuz_acik"] and d["adres_var"]
                         else "acik-adressiz" if d["arayuz_acik"] else "kapali"),
    "rota": lambda d: ("tablo-bos" if not d["adres_var"]
                       else "tam" if d["rota_var"] else "varsayilan-yok"),
    "gecit-yankisi": lambda d: ("yanit" if d["arayuz_acik"] and d["adres_var"]
                                else "yanit-yok"),
    "uzak-yanki": lambda d: "yanit" if yol(d) else "yanit-yok",
    "ad-cozumleme": lambda d: "cozuldu" if d["cozumleyici_yanit"] else "cozulemedi",
    "dinleyen": lambda d: "dinliyor" if d["servis_dinliyor"] else "dinlemiyor",
    "baglanti": lambda d: ("ulasilamaz" if not yol(d)
                           else "zaman-asimi" if not d["guvenlik_duvari_gecirir"]
                           else "reddedildi" if not d["servis_dinliyor"]
                           else "kuruldu"),
    "buyuk-paket": lambda d: ("geciyor" if yol(d) and d["yol_bozulmadan"]
                              else "gecmiyor"),
}


def ele(adaylar, s, yanit):
    return tuple(a for a in adaylar if SINAMA[s](durum(a)) == yanit)


def eledigi(adaylar, s, gercek):
    kalan = ele(adaylar, s, SINAMA[s](durum(gercek)))
    return len(adaylar) - len(kalan), len(kalan)


def maliyet(sira, gercek, adaylar=ADAYLAR):     # SG3: aday teke inince durulur
    kalan, adim = tuple(adaylar), 0
    for s in sira:
        if len(kalan) <= 1:
            break
        adim += 1
        kalan = ele(kalan, s, SINAMA[s](durum(gercek)))
    return adim


def acgozlu(gercek, adaylar=ADAYLAR):           # SG4: her adimda kahine bakar
    kalan, secilen = tuple(adaylar), []
    while len(kalan) > 1 and len(secilen) < len(SINAMA):
        en, en_s = None, None
        for s in SINAMA:
            if s not in secilen:
                k = len(ele(kalan, s, SINAMA[s](durum(gercek))))
                if en is None or k < en:
                    en, en_s = k, s
        secilen.append(en_s)
        kalan = ele(kalan, en_s, SINAMA[en_s](durum(gercek)))
    return secilen


KATMANLI = ["arayuz", "rota", "gecit-yankisi", "uzak-yanki",
            "ad-cozumleme", "dinleyen", "baglanti", "buyuk-paket"]
TERS = list(reversed(KATMANLI))
KAHIN = "guvenlik-duvari-dusuruyor"

print("aday ariza:", len(ADAYLAR), "| sinama:", len(SINAMA), "| kahin:", KAHIN)
print("sinama          yanit           elenen  kalan")
for s in KATMANLI:
    e, k = eledigi(ADAYLAR, s, KAHIN)
    print(f"  {s:14s}{SINAMA[s](durum(KAHIN)):16s}{e:6d} {k:6d}")
print()
print("ariza                       katmanli  ters  acgozlu  acgozlu sira")
for a in ADAYLAR:
    g = acgozlu(a)
    print(f"  {a:26s}{maliyet(KATMANLI, a):6d}{maliyet(TERS, a):6d}"
          f"{len(g):8d}  {', '.join(g)}")
print("toplam adim: katmanli", sum(maliyet(KATMANLI, a) for a in ADAYLAR),
      "| ters", sum(maliyet(TERS, a) for a in ADAYLAR),
      "| acgozlu", sum(len(acgozlu(a)) for a in ADAYLAR))
print()
print("aday kumesi supurmesi -- kume buyurken baglanti denemesinin eledigi")
kume = [KAHIN]
for a in ADAYLAR:
    if a not in kume:
        kume.append(a)
        e, k = eledigi(tuple(kume), "baglanti", KAHIN)
        print(f"  aday {len(kume)}  eklenen {a:26s} elenen {e}  kalan {k}")
print("bir aday cikarildiginda katmanli toplam (8 adayda 33)")
for cikan in ADAYLAR:
    alt = tuple(x for x in ADAYLAR if x != cikan)
    print(f"  cikan {cikan:26s} {sum(maliyet(KATMANLI, a, alt) for a in alt):3d}")
```

```
aday ariza: 8 | sinama: 8 | kahin: guvenlik-duvari-dusuruyor
sinama          yanit           elenen  kalan
  arayuz        acik-adresli         2      6
  rota          tam                  3      5
  gecit-yankisi yanit                2      6
  uzak-yanki    yanit                4      4
  ad-cozumleme  cozuldu              1      7
  dinleyen      dinliyor             1      7
  baglanti      zaman-asimi          7      1
  buyuk-paket   geciyor              5      3

ariza                       katmanli  ters  acgozlu  acgozlu sira
  arayuz-kapali                  1     8       1  arayuz
  adres-yok                      1     8       1  arayuz
  ag-gecidi-yanlis               4     7       2  uzak-yanki, rota
  rota-eksik                     2     7       1  rota
  cozumleyici-sessiz             5     2       1  ad-cozumleme
  servis-dinlemiyor              6     2       1  dinleyen
  guvenlik-duvari-dusuruyor      7     2       1  baglanti
  buyuk-paket-dusuyor            7     2       2  baglanti, ad-cozumleme
toplam adim: katmanli 33 | ters 38 | acgozlu 10

aday kumesi supurmesi -- kume buyurken baglanti denemesinin eledigi
  aday 2  eklenen arayuz-kapali              elenen 1  kalan 1
  aday 3  eklenen adres-yok                  elenen 2  kalan 1
  aday 4  eklenen ag-gecidi-yanlis           elenen 3  kalan 1
  aday 5  eklenen rota-eksik                 elenen 4  kalan 1
  aday 6  eklenen cozumleyici-sessiz         elenen 5  kalan 1
  aday 7  eklenen servis-dinlemiyor          elenen 6  kalan 1
  aday 8  eklenen buyuk-paket-dusuyor        elenen 7  kalan 1
bir aday cikarildiginda katmanli toplam (8 adayda 33)
  cikan arayuz-kapali               32
  cikan adres-yok                   32
  cikan ag-gecidi-yanlis            29
  cikan rota-eksik                  31
  cikan cozumleyici-sessiz          28
  cikan servis-dinlemiyor           27
  cikan guvenlik-duvari-dusuruyor   25
  cikan buyuk-paket-dusuyor         25
```

## Kâhin, Sınama, Elenen Aday

Üç sayı yan yana durur. **Kâhin:** gerçek arıza `guvenlik-duvari-dusuruyor`, yani güvenlik
duvarı paketi sessizce düşürüyor. **Sınama:** bağlantı denemesi `zaman-asimi` yanıtını
veriyor. **Elenen aday:** bu tek yanıt sekiz adaydan **7'sini** eliyor ve geriye **1** aday
bırakıyor, yani arıza tek sınamayla çözülüyor.

Aynı kâhin altında ad çözümleme sınaması `cozuldu`, dinleyen listesi `dinliyor` yanıtını
verir; her ikisi de yalnız **1'er** aday eler ve geriye **7** aday bırakır. Ortaya çıkan
oran kursun ilk okumasıdır: aynı çabayla yapılan iki sınamadan biri ötekinin **yedi katı**
iş görüyor. Bir sınamanın değeri verdiği yanıtta değil, o yanıtın kaç adayı düşürdüğündedir.
Yanıtı doğru olan bir sınama, hiçbir adayı elemiyorsa **ölçülmemiş** sayılır.

Toplam adım tablosu ikinci okumadır. Sekiz arızanın hepsi tek tek gerçek arıza yapıldığında
katmanlı sıra toplam **33** adım, ters sıra **38** adım, açgözlü sıra **10** adım harcıyor.
Katmanlı sıra optimalin **3,3 katı** kadar sınama yapıyor. Ters sıranın kaybı ise dağılımda:
servis tarafındaki dört arızayı 2 adımda bitiriyor, ama arayüz tarafındaki iki arızada 8
adımın tamamını harcıyor.

## Açgözlü Sıra Neden Bir Yordam Değil

On sayısı okuyucuyu yanlış bir sonuca çekebilir: "en çok eleyen sınamayı seç" kuralı
uygulanabilir bir yöntem gibi görünür. Değildir. Kuralın işleyebilmesi için her adımda,
**henüz bilinmeyen** gerçek arıza altında her sınamanın hangi yanıtı vereceğini hesaplamak
gerekir. Blokta bunu yapan satır `SINAMA[s](durum(gercek))` çağrısıdır ve `gercek`, tam da
tanının bulmaya çalıştığı şeydir.

Başka bir deyişle açgözlü sıra **kâhini girdi olarak alır**. Cevabı bilen biri en kısa yolu
seçebilir; cevabı bilmeyen biri o seçimi yapamaz. Bu yüzden 10 sayısı bir hedef değil,
**ulaşılamaz bir alt sınırdır**. Ölçüde bir işi vardır — katmanlı sıranın ne kadar fazla iş
yaptığını gösteren bir ölçek verir — ama uygulanabilir bir sıra olarak hiçbir yerde
sunulmaz.

Bu ayrım tanı yazınında sık karıştırılır. "Deneyimli operatör doğrudan doğru yere bakar"
cümlesi, açgözlü sıranın insan biçimidir ve aynı kusuru taşır: deneyim geçmiş arızaların
dağılımını bilmektir, o anki arızayı değil. Geçmiş dağılım bugünkü arızaya uyduğunda kısa
yol çalışır, uymadığında operatör ters sıranın en kötü durumunu yaşar — arayüz kapalıyken
sekiz sınamanın hepsini yapmak gibi.

## Katmanlı Sıranın Savunması

Katmanlı yöntemin savunması hız değildir; 33 adım 10 adımdan üç kat pahalıdır ve bu fark
gerçektir. Savunma şudur: **katmanlı sıra kâhin olmadan çalışır.** Sıra, arızadan önce
sabitlenmiştir ve hangi arıza etkin olursa olsun aynı sırada yürür. Girdisi yalnız
sınamaların yanıtlarıdır.

İkinci savunma, sıranın verdiği ara bilginin **birikimli** olmasıdır. Arayüz sınaması
`acik-adresli` yanıtını verdiğinde yalnız iki aday elenmez; sonraki sınamaların yorumlanma
biçimi de sabitlenir. Ters sırada bu birikim yoktur: servise bağlanılamadığı görüldüğünde
elde kalan dört aday hâlâ ayrılmamıştır ve aşağı inen her sınama baştan yorumlanır.

Üçüncü savunma yanlış tanıya karşı korumadır. Ters sıra çalışırken servis tarafında bir
düzeltme yapma isteği doğar — servisi yeniden başlatmak, kuralı gevşetmek — ve alt katman
bozukken yapılan bu düzeltmeler sistemin durumunu değiştirir. Katmanlı sıra, düzeltmeye
geçmeden önce altın sağlam olduğunu kanıtlar.

Dördüncü nokta pratik bir uyarıdır: en pahalı arızalar tabloda en aşağıdadır.
`guvenlik-duvari-dusuruyor` ve `buyuk-paket-dusuyor` katmanlı sırada **7'şer** adım tutar.
Bir kısayol arayan operatör için doğru hamle sırayı bozmak değil, **bağlantı denemesini
sıraya erken sokmaktır**: dört ayrı yanıt döndürdüğü için tek başına en güçlü bölücüdür ve
sıranın mantığını bozmadan yukarı taşınabilir.

## Aday Kümesi Süpürmesi

Kurguda rastgelelik yoktur; bütün sayılar tam sayımdır. Sonuçların kurguya ne kadar bağlı
olduğu bu yüzden ikinci bir tohumla değil, **aday kümesini değiştirerek** sınanır.

Küme büyürken bağlantı denemesinin elediği aday sayısı 1'den 7'ye çıkar, kalan hep 1'dir.
Buradan çıkan sonuç önemlidir: **eleme sayısı aracın tek başına bir özelliği değildir**,
aday kümesinin de ölçüsüdür. "Bu araç yedi adayı eler" cümlesi ancak sekiz adaylı bir küme
tanımlanmışsa anlamlıdır. Aday listesini yazmadan araç karşılaştırmak, paydası olmayan bir
kesir yazmaktır.

Bir aday çıkarıldığında katmanlı toplam 33'ten 25 ile 32 arasına iner. Düşüş nerede
olduğuna bağlıdır: sıranın başındaki `arayuz-kapali` çıkarıldığında toplam yalnız 1 adım
azalır (32), sonundaki `guvenlik-duvari-dusuruyor` ya da `buyuk-paket-dusuyor`
çıkarıldığında 8 adım azalır (25). Katmanlı sıranın maliyetini belirleyen şey aday sayısı
değil, adayların **sıranın neresinde** durduğudur. Aynı sonucun tersi de doğrudur: listeye
eklenen yeni bir derin aday, toplamı sekiz adıma kadar büyütebilir.

## Özet

- Tanı bir kümeyi daraltma işidir; bir sınamanın sayısı verdiği yanıt değil, **elediği aday
  neden** sayısıdır ve kaç adayı elediği yazılmayan sınama ölçülmemiş sayılır.
- Güvenlik duvarının düşürdüğü senaryoda bağlantı denemesi **7** aday eler ve tek başına
  çözer; ad çözümleme ile dinleyen listesi yalnız **1'er** aday eler.
- Sekiz arızanın toplam adım maliyeti: katmanlı sıra **33**, ters sıra **38**, kâhin
  destekli açgözlü sıra **10**.
- Açgözlü sıra **bir yordam değildir**: her adımda en çok eleyen sınamayı seçmek gerçek
  arızayı bilmeyi gerektirir, bu yüzden 10 ulaşılamaz bir alt sınırdır.
- Katmanlı yöntemin savunması hızı değil, **kâhin olmadan da çalışmasıdır**; sırası arızadan
  önce sabitlenmiştir ve yalnız sınama yanıtlarını girdi alır.
- Eleme sayısı aday kümesine bağlıdır: küme 2'den 8'e büyürken bağlantı denemesinin elediği
  aday 1'den 7'ye çıkar.

## Sonraki Adım

Katmanlı sıranın ilk dört adımı erişilebilirlik sınamalarıdır ve tabloda en zayıf
görünenler de oradadır: ağ geçidine yankı yalnız 2 aday eliyor, uzak adrese yankı 4. Bu
sınamaların gerçek sorunu zayıflıkları değil, **yanlış okunmalarıdır**: yanıt gelmemesi tek
bir nedene değil, birden çok nedene uyar ve yanıt gelmesi de erişimin sağlam olduğunu
söylemez. Sonraki ders yankı ve yol izleme araçlarının döndürdüğü sessizliği açar ve "yanıt
yok" durumunun kaç ayrı aday nedene karşılık geldiğini sayar.
