İçeriğe geç
academia.sh

Ders 03 / 13

Ad Çözümleme

Ad çözümleme sınaması beklenen yanıtı verdiğinde sekiz adaydan yalnız birini eliyor; başarısız olduğunda yedisini eliyor ve bu asimetri, kursun en zayıf sınamasının neden yine de yapıldığını açıklıyor.

İçindekiler

Yönlendirme tablosu beklenen yanıtı verdiğinde — tam — geriye beş aday kalıyordu. Bunların dördü artık paketin yoluyla değil, ne istendiğiyle ilgili: hedefin adı çözülemiyor olabilir, servis dinlemiyor olabilir, güvenlik duvarı düşürüyor olabilir ya da büyük paket yolda kayboluyor olabilir. Bu ders dörtlünün ilkine bakar.

Ölçülecek sayı kursun en küçük sayılarından biridir ve dersin asıl sorusu bu küçüklüğün ne anlama geldiğidir: bir sınama beklenen yanıtı verdiğinde sekiz adaydan yalnız birini eliyorsa, o sınama neden yine de yapılır.

Çözücü Neyi Yapılandırır

Ad çözümleme, bir adın bir adrese dönüştürülmesidir ve bu iş tek bir yerde yapılmaz. Sorgu önce ad hizmeti sırasına çarpar: sistem, hangi kaynağın hangi sırayla deneneceğini bir yapılandırma dosyasından okur. Sıradaki ilk kaynak genellikle yerel bir konak dosyasıdır; ondan sonra yerel bir önbellek ya da saplama çözücü gelir; en sonda ağdaki çözücüye gönderilen sorgu vardır. Bir ad yerel dosyada bulunduğunda ağa hiç çıkılmaz ve ağdaki çözücünün verdiği yanıt hiç görülmez.

# örnek döküm — çalıştırılmamıştır
$ cat /etc/resolv.conf
nameserver 192.0.2.53
search ornek
options timeout:2 attempts:2

Yapılandırmanın üç alanı üç ayrı davranış belirler. Çözücü adresi sorgunun nereye gideceğini söyler; birden çok yazıldığında ilki denenir ve yalnız yanıt gelmediğinde sıradaki denenir. Arama alanı, nokta içermeyen bir ada eklenecek son eki verir; kısa adla yapılan sorgu ile tam adla yapılan sorgu bu yüzden farklı sonuçlar üretebilir. Zaman aşımı ve deneme sayısı ise arızanın ne kadar sürede görüneceğini belirler: iki saniyelik zaman aşımı ve iki deneme, sessiz bir çözücüde her sorguyu dört saniye bekletir ve uygulama katmanında bu, ad çözümleme arızası olarak değil yavaşlık olarak görünür.

# örnek döküm — çalıştırılmamıştır
$ getent ahosts kayit-deposu.ornek
198.51.100.42  STREAM kayit-deposu.ornek
198.51.100.42  DGRAM

Sorgu aracı seçimi de sonucu değiştirir. Doğrudan çözücüye soru soran araçlar ad hizmeti sırasını atlar ve yalnız ağdaki çözücüyü sınar; sistemin gerçekte kullandığı yolu sınamak için sıranın tamamından geçen bir araç gerekir. Bu ayrım tanıda somut bir sonuç üretir: bir sorgu aracıyla ad çözülüyor, uygulama çözemiyor olabilir ya da tersi.

Adların ağ üzerinde nasıl çözüldüğü, sorgu ile yanıtın hangi kayıt türlerini taşıdığı ve yetkili sunucu hiyerarşisinin nasıl işlediği Bilgisayar Ağları müfredatının konusudur; burada protokol kurulmaz, yalnız bu makinenin çözücü yapılandırması okunur.

  • AY19 — Kurgu sunucuda ad hizmeti sırası iki kaynaktan oluşur: yerel konak dosyası ve ağdaki tek bir çözücü. Konak dosyasında aranan ad bulunmadığı varsayılır.
  • AY20cozumleyici-sessiz adayı, çözücünün sorguya hiç yanıt vermemesidir. Yanlış yanıt veren çözücü ayrı bir adaydır ve temel listede yoktur; süpürmede eklenir. Çözücünin kendisine giden yolun sağlam olduğu, tek arıza varsayımının gereği olarak kabul edilir.

Sıranın Kendisi Bir Arıza Kaynağıdır

Ad hizmeti sırası tanıda iki ayrı tuzak üretir ve ikisi de sık görülür.

Birincisi yerel girdinin üstünlüğüdür. Konak dosyasına yazılmış bir satır, ağdaki çözücünün ne söylediğinden bağımsız olarak kazanır. Bir taşıma sırasında geçici olarak eklenen bir satır yerinde unutulduğunda, sistem aylarca eski adrese bağlanır ve ağdaki kayıt düzeltilmiş olduğu için hiçbir sorgu aracı arızayı göstermez — sorgu aracı sırayı atlıyorsa doğru adresi döndürür, uygulama ise yanlış adrese gider. Ayrımı yapan tek okuma, sıradan geçen bir sorgudur.

İkincisi arama alanının sessiz genişlemesidir. Nokta içermeyen bir ad sorulduğunda sisteme tanımlı son ek eklenir ve sorgu farklı bir ada dönüşür. Aynı kısa ad iki makinede iki farklı tam ada açılabilir, çünkü arama alanları farklıdır. Bu yüzden bir sınama sonucunun başka bir makineye taşınması güvenilir değildir: sınanan ad, yazılan ad değildir. Yapılandırma dosyalarında tam adın yazılması bu belirsizliği kaynağında kapatır.

Üçüncü bir davranış arıza değildir ama arızayı gizler: sıradaki bir kaynak yanıt vermediğinde sorgu bir sonrakine düşer. Düşme sessizdir ve yalnız süre olarak görünür. Zaman aşımı iki saniye, deneme sayısı iki olan bir yapılandırmada sessiz bir çözücü her sorguya dört saniye ekler; uygulama günlüğünde bunun karşılığı bir hata değil, gecikmedir. Sistem Yönetimi kursundaki kalıp burada da geçerli: görünen belirti ile gerçek arıza farklı katmanlarda durur.

Sınamanın Ölçüsü: Bir Aday

"""Ad cozumleme sinamasi: ayni sekiz aday nedene karsi kac aday eleniyor
ve onceki derslerin sinama kumesine eklendiginde kac aday AYRILIYOR."""
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 = {
    "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},
}


def durum(ariza, tablo):
    d = dict(SAGLAM)
    d.update(tablo[ariza])
    return d


def s_rota(d):
    if not d["adres_var"]:
        return "tablo-bos"
    return "tam" if d["rota_var"] else "varsayilan-yok"


def s_gecit_yankisi(d):
    return "yanit" if d["arayuz_acik"] and d["adres_var"] else "yanit-yok"


def s_uzak_yanki(d):
    return "yanit" if (d["arayuz_acik"] and d["adres_var"]
                       and d["ag_gecidi_dogru"] and d["rota_var"]) else "yanit-yok"


def s_ad_cozumleme(d):
    return "cozuldu" if d["cozumleyici_yanit"] else "cozulemedi"


SINAMA = {"rota": s_rota, "gecit-yankisi": s_gecit_yankisi,
          "uzak-yanki": s_uzak_yanki, "ad-cozumleme": s_ad_cozumleme}


def obekle(sinamalar, tablo=ARIZA):
    o = {}
    for a in tablo:
        anahtar = tuple(SINAMA[s](durum(a, tablo)) for s in sinamalar)
        o.setdefault(anahtar, []).append(a)
    return o


print("ad cozumleme sinamasi: yanit basina aday")
for yanit, kume in obekle(["ad-cozumleme"]).items():
    print(f"  {yanit[0]:11s} kalan {len(kume):2d}  elenen {len(ARIZA) - len(kume):2d}"
          f"  {', '.join(kume)}")
print()
ONCEKI = ["gecit-yankisi", "uzak-yanki", "rota"]
print("onceki derslerin kumesine eklenince")
for kume in (ONCEKI, ONCEKI + ["ad-cozumleme"]):
    ayrilmayan = [sorted(v) for v in obekle(kume).values() if len(v) > 1]
    kapsanan = sum(len(o) for o in ayrilmayan)
    print(f"  {len(kume)} sinama  obek {len(ayrilmayan)}  ayrilmayan aday {kapsanan}")
    for o in ayrilmayan:
        print(f"      {', '.join(o)}")
print()
print("aday kumesi supurmesi (ad cozumleme sinamasi)")
EK = dict(ARIZA, **{"cozumleyici-yanlis-kayit": {"cozumleyici_yanit": False}})
EKSIK = {k: v for k, v in ARIZA.items() if k != "cozumleyici-sessiz"}
for ad, tablo in (("temel               8", ARIZA),
                  ("+yanlis-kayit       9", EK),
                  ("-cozumleyici-sessiz 7", EKSIK)):
    o = obekle(["ad-cozumleme"], tablo)
    satir = "  ".join(f"{y[0]}: elenen {len(tablo) - len(k):2d} kalan {len(k):2d}"
                      for y, k in sorted(o.items()))
    print(f"  {ad:21s} ayri yanit {len(o)}   {satir}")
ad cozumleme sinamasi: yanit basina aday
  cozuldu     kalan  7  elenen  1  arayuz-kapali, adres-yok, ag-gecidi-yanlis, rota-eksik, servis-dinlemiyor, guvenlik-duvari-dusuruyor, buyuk-paket-dusuyor
  cozulemedi  kalan  1  elenen  7  cozumleyici-sessiz

onceki derslerin kumesine eklenince
  3 sinama  obek 2  ayrilmayan aday 6
      adres-yok, arayuz-kapali
      buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, servis-dinlemiyor
  4 sinama  obek 2  ayrilmayan aday 5
      adres-yok, arayuz-kapali
      buyuk-paket-dusuyor, guvenlik-duvari-dusuruyor, servis-dinlemiyor

aday kumesi supurmesi (ad cozumleme sinamasi)
  temel               8 ayri yanit 2   cozuldu: elenen  1 kalan  7  cozulemedi: elenen  7 kalan  1
  +yanlis-kayit       9 ayri yanit 2   cozuldu: elenen  2 kalan  7  cozulemedi: elenen  7 kalan  2
  -cozumleyici-sessiz 7 ayri yanit 1   cozuldu: elenen  0 kalan  7

Üç sayı yan yana. Kâhin: bu turda gerçek arıza cozumleyici-sessiz değil; kurgu sunucuda başka bir alan bozuk ve çözücü çalışıyor. Sınama: ad sorgusu yapılıyor ve yanıtı cozuldu. Elenen aday: bir; geriye yedi aday kalıyor. Bu, kursun ölçtüğü sekiz sınama içindeki en düşük değerlerden biridir; yalnız dinleyen soket listesi aynı sayıyı verir.

Zayıf Sınamanın Değeri

Ad çözümleme sınaması iki yanıt üretir ve iki yanıt arasındaki uçurum kursun en büyüğüdür: cozuldu bir aday eler, cozulemedi yedi aday eler. Aynı komut, aynı süre, aynı çaba; taşıdığı bilgi yedi katı fark ediyor. Sınamanın değeri sınamada değil, hangi yanıtı verdiğindedir.

Bu asimetrinin pratik okuması iki maddedir. Birincisi: ad çözümleme başarısız olduğunda tanı biter. Yedi aday elenir, tek aday kalır ve düzeltilecek şey bellidir. İkincisi: ad çözümleme başarılı olduğunda hiçbir şey öğrenilmemiş gibi durur, oysa öğrenilen bir şey vardır — bir karıştırıcı ortadan kalkmıştır. Ad üzerinden yapılan her sınama iki soruyu birden sorar: ad çözülüyor mu ve hedef erişilebilir mi. Çözümleme ayrı olarak doğrulanmadan yapılan bir bağlantı denemesinin başarısızlığı bu iki sorunun hangisine ait olduğunu göstermez. Ad çözümleme sınaması, sonraki bütün sınamaların anlamını sabitler.

İkinci tablo bu katkıyı sayıya çeviriyor. Önceki iki dersin sınama kümesi — yerel yankı, uzak yankı ve tablo okuması — sekiz adayı iki öbekte ayrılamaz bırakıyordu ve bu öbeklerde toplam altı aday vardı. Ad çözümleme eklendiğinde öbek sayısı ikide kalıyor, ayrılamayan aday sayısı beşe iniyor. Yani sınamanın katkısı tam olarak bir adaydır ve o bir aday, kendisinden başka hiçbir sınamanın ayıramadığı adaydır. Dört sınamanın hiçbiri cozumleyici-sessiz adayını dokunmadan ayıramaz, çünkü çözücü sessizken paketler yolda sorunsuz akmaya devam eder.

Bu, sınamaları eleme gücüne göre sıralamanın neden yeterli olmadığını gösteriyor. Bir sınamanın tek başına kaç aday elediği ile bir kümeye eklendiğinde kaç aday ayırdığı ayrı ölçülerdir ve ikisi aynı yönde hareket etmez. Güçlü bir sınama, kendisinden önce yapılan sınamaların zaten ayırdığı adayları elediğinde hiçbir katkı üretmez; zayıf bir sınama, başka hiçbir aracın göremediği tek alana baktığında yeri doldurulamaz olur. Ad çözümleme ikinci türdendir. Tanı sırası kurulurken sorulacak soru “bu sınama kaç aday eler” değil, “bu sınama başkasının göremediği kaç adayı ayırır” olmalıdır.

Adın Çözülmesi Erişilebilirlik Değildir

Çözümleme başarılı olduğunda dönen şey bir adrestir ve adresin doğru olduğu bilgisi değildir. Kayıt eski olabilir, hedef başka bir adrese taşınmış olabilir, yanıt bir önbellekten geliyor olabilir. Önbellek burada ikili bir rol oynar. Olumlu yanıt, kayda yazılmış yaşam süresi boyunca saklanır ve o süre dolana kadar değişiklik görülmez; olumsuz yanıt da saklanabilir ve düzeltilmiş bir kayıt beklenenden geç görünür. İki durumda da sınamanın gördüğü şey ağın şimdiki durumu değil, geçmişte bir anın durumudur.

Bir ad birden çok adrese de çözülebilir ve dönen liste birden çok adres ailesi taşıyabilir. Bu durumda hangi adrese bağlanılacağını seçen, çözücü değil bağlantıyı kuran taraftır ve seçim sırası sistemin yapılandırmasına bağlıdır. Ortaya çıkan arıza kalıbı tanıda yanıltıcıdır: ad doğru çözülür, listedeki ilk adrese giden yol bozuktur, ikinci adrese giden yol çalışır ve sonuç denemeden denemeye değişir. Aynı komut arka arkaya iki kez çalıştırıldığında iki farklı sonuç veriyorsa, ilk bakılacak yer çözümlemenin döndürdüğü listedir; tek satırlık bir yanıt gösteren araç bu listeyi gizler.

  • AY21 — Ortak tanımda önbellek yoktur; çözücü ya yanıt verir ya vermez. Yaşam süresi ve olumsuz önbellek modelin dışındadır ve buradaki uyarı ölçümün değil, okumanın parçasıdır.
  • AY22 — Ad çözümleme sınaması, sonucu adresle yapılan sınamalardan bağımsız kabul edilir; çözücüye giden yolun kendisinin bozulduğu birleşik durum tek arıza varsayımı gereği dışarıdadır.

Buradan çıkan çalışma alışkanlığı tek cümledir: önce adresle, sonra adla sınanır. Adresle yapılan bir deneme başarılı, adla yapılan aynı deneme başarısızsa arıza çözümlemededir ve başka hiçbir sınamaya gerek yoktur. İkisi de başarısızsa çözümleme aday olmaktan çıkar ve sorun aşağıdaki katmanlardadır. Sıra tersine çevrildiğinde — önce adla denenip başarısızlık görüldüğünde — elde edilen yanıt iki adayı birden kapsar ve ayrım için ikinci bir sınama gerekir. Aynı iki komut, farklı sırayla, farklı sayıda aday eliyor.

Aday Kümesi Süpürmesi

Üçüncü tablo aday listesini yine iki yönde sarsıyor ve bu derste sonuçlardan biri kursun en keskinidir.

  • AY23 — Eklenen aday cozumleyici-yanlis-kayit, çözücünün yanıt verdiği ama yanlış adres döndürdüğü durumdur. Modelde bu, çözümlemenin beklenen sonucu vermemesi olarak temsil edilir ve cozumleyici-sessiz ile aynı yanıtı üretir.
  • AY24 — Çıkarılan aday cozumleyici-sessiz, sınamanın olumsuz yanıtını tek başına dolduran adaydır.

Aday eklendiğinde cozuldu yanıtının elediği aday birden ikiye çıkıyor; sınama iki katı iş görüyor ve bunu kendi tanımında hiçbir şey değişmeden yapıyor. cozulemedi yanıtı ise yine yedi aday eliyor ama artık geriye bir değil iki aday bırakıyor: sessiz çözücü ile yanlış yanıt veren çözücü bu sınamayla ayrılamaz. Ayrımı yapan şey yanıtın içeriğine bakmaktır, varlığına değil.

Aday çıkarıldığında sonuç daha sert. Yedi adaylık listede sınamanın verebileceği yanıt sayısı bire düşüyor ve elenen aday sıfır oluyor. Sınama hâlâ çalışıyor, hâlâ bir yanıt üretiyor, hâlâ zaman harcıyor — ve hiçbir aday elemiyor. Bu, kursun kuralının en açık gösterimidir: bir sınamanın ürettiği çıktı ile taşıdığı bilgi ayrı şeylerdir. Aday listesinde karşılığı bulunmayan bir sınama, çıktısı ne kadar zengin olursa olsun ölçülmemiş değil, değersizdir. Bunun tanıdaki karşılığı, alışkanlıkla yapılan sınamaların düzenli olarak gözden geçirilmesidir: bir sınama listeye hangi adayı ayırmak için girdiyse, o aday listeden düştüğünde sınama da düşmelidir.

Özet

  • Ad çözümleme tek bir yerde yapılmaz: sorgu ad hizmeti sırasından geçer, yerel konak dosyası ve önbellek ağa çıkmadan yanıt üretebilir; doğrudan çözücüye soran araçlar bu sırayı atlar ve sistemin gerçekte kullandığı yolu sınamaz.
  • Ad çözümleme sınaması iki yanıt verir ve aralarındaki fark kursun en büyüğüdür: cozuldu yalnız bir aday eler ve geriye yedi aday bırakır, cozulemedi yedi aday eler ve tanıyı bitirir.
  • Sınamanın beklenen yanıttaki katkısı bir karıştırıcı değişkeni kaldırmaktır: önceki üç sınamanın ayıramadığı altı adaydan tam birini ayırır ve ayrılamayan aday sayısını altıdan beşe indirir. O adayı başka hiçbir sınama ayıramaz.
  • Adın çözülmesi hedefin erişilebilir olması demek değildir; önbellek ve yaşam süresi nedeniyle dönen yanıt geçmişte bir anın durumu olabilir. Çalışma kuralı önce adresle, sonra adla sınamaktır.
  • Süpürme iki sonuç veriyor: yanlış yanıt veren çözücü eklendiğinde cozuldu yanıtı iki aday elemeye başlıyor; cozumleyici-sessiz çıkarıldığında sınamanın yanıt sayısı bire ve elediği aday sıfıra düşüyor. Aday listesinde karşılığı olmayan sınama değersizdir.

Sonraki Adım

Ad çözümleme de doğrulandığında geriye üç aday kalıyor: servis dinlemiyor olabilir, güvenlik duvarı paketi düşürüyor olabilir ya da büyük paket yolda kayboluyor olabilir. Üçü de sunucunun kendi üzerinde bakılabilecek bir yer bırakıyor gibi görünür — dinleyen soketlernın listesi. Bir sonraki ders bu listeyi çıkarır ve iki sayıyı yan yana koyar: yerel envanter sekiz adaydan bir tanesini eler, dışarıdan yapılan tek bir bağlantı denemesi yedi tanesini. Aynı arıza, aynı an, iki sınama arasında yedi katı fark. O dersin sorusu bu farkın nereden geldiğidir: dinleyen listesi tek bir alanı görürken bağlantı denemesi dört ayrı sonucu birbirinden ayırır.

İ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