İçeriğe geç
academia.sh

Ders 12 / 12

Bir İsteğin Uçtan Uca İzi

Ad çözümlemeden yanıtın çizilmesine kadar tüm zincirin birleştirilmesi, aşamalar arasında devredilen bilgi ve her halkanın kopmasındaki belirtiler.

İçindekiler

Kurs boyunca tek bir örnek izlendi: ornek.test adresine yapılan bir istek. Her ders bu yolculuğun bir parçasını açtı — paketlerin nasıl taşındığı, adreslerin ne anlama geldiği, adın nasıl çözümlendiği, sunucunun nerede durduğu, alışverişin nasıl biçimlendiği ve kanalın nasıl güvenceye alındığı.

Bu ders halkaları birleştirir. Amaç yeni bir kavram eklemek değil, aralarındaki bilgi akışını görünür kılmaktır.

Zincirin Tamamı

Adres satırına https://ornek.test/ yazılıp istek gönderildiğinde şu adımlar yürütülür.

1. Adresin çözümlenmesi. Yazılan metin bölümlerine ayrılır: şema https, konak ornek.test, yol /. Şema, bağlantı noktasının 443 olacağını belirler. Bir sonrakine devredilen: çözümlenecek ad.

2. Ad çözümleme. Sağlayıcı, çözümleyiciye sorar. Yanıt önbellekte varsa oradan gelir; yoksa kökten yetkili sunucuya inen zincir yürütülür ve dönen adres yaşam süresi boyunca saklanır. Bir sonrakine devredilen: hedef IP adresi.

3. Bağlantı kurma. Hedef adres ve bağlantı noktasına bir bağlantı açılır. Paketler, yol boyunca birbirinden bağımsız işletilen otonom sistemlerden geçer; yolu hiçbir uç belirlemez. Bir sonrakine devredilen: veri taşıyabilen bir bayt akışı.

4. Güvenlik el sıkışması. Sunucu sertifikasını sunar. İstemci imza zincirini güven çıpalarından birine ulaştırmayı dener ve sertifikadaki adın ornek.test ile eşleştiğini sınar. İki taraf oturum anahtarını üretir. Bir sonrakine devredilen: şifreli ve kimliği doğrulanmış kanal.

5. İsteğin gönderilmesi. İstek satırı, başlıklar ve boş satır yazılır. Host başlığı konak adını taşır — adres bu noktada bir sayıya indirgenmiş olduğu için, sunucunun hangi siteyi sunacağını yalnızca bu başlık söyler. Bir sonrakine devredilen: yöntem, yol ve başlıklar.

6. Sunucunun işlemesi. Sunucu Host başlığına bakarak siteyi seçer, yola bakarak kaynağı bulur ve bir durum kodu ile gövde üretir. Bir sonrakine devredilen: durum kodu, başlıklar, gövde.

7. Yanıtın yorumlanması. İstemci durum kodunu okur; yönlendirme ise 1. adıma yeni bir hedefle döner. Content-Type gövdenin ne olduğunu, Content-Length nerede bittiğini söyler. Bir sonrakine devredilen: belge.

8. Ayrıştırma ve alt kaynaklar. Belge bir öğe ağacına çevrilir. Başvurulan her kaynak için 1–7 adımları yinelenir; aynı konağa yapılan istekler var olan bağlantıyı kullanır.

9. Yerleşim ve çizim. Öğelerin konumu hesaplanır ve sayfa çizilir.

Zincirin yapısına ilişkin iki gözlem önemlidir. Birincisi, her aşama bir sonrakine yalnızca tek bir şey devreder ve öncesini unutur: adres çözümlendikten sonra ad, bağlantı kurulduktan sonra adres, el sıkışma bittikten sonra sertifika ilgisizleşir. İkincisi, ad 5. adımda geri döner — çünkü adres artık ayırt edici değildir. Barındırma Modelleri dersinde kurulan sanal barındırmanın zorunlu kıldığı budur.

Zinciri Çalıştırmak

Bu adımların tamamı yerel olarak kurulabilir. Aşağıdaki sunucu, TLS ile sarılmış ve Host başlığına göre site seçen bir sunucudur; kursta ayrı ayrı kurulan parçaları bir araya getirir.

import ssl
from http.server import BaseHTTPRequestHandler, HTTPServer

SITELER: dict[str, bytes] = {
    "ornek.test": b"<!doctype html>\n<html lang=\"tr\"><body><h1>Ornek Sayfa</h1></body></html>\n",
}


class Isleyici(BaseHTTPRequestHandler):
    protocol_version = "HTTP/1.1"

    def log_message(self, bicem: str, *arg: object) -> None:
        print(f"[sunucu] {self.command} {self.path} Host={self.headers.get('Host')}", flush=True)

    def do_GET(self) -> None:
        ad = self.headers.get("Host", "").split(":")[0]
        govde = SITELER.get(ad)
        self.log_request(200 if govde else 404)
        if govde is None:
            govde = b"<h1>Bilinmeyen konak</h1>\n"
            self.send_response_only(404)
        else:
            self.send_response_only(200)
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.send_header("Content-Length", str(len(govde)))
        self.end_headers()
        self.wfile.write(govde)


baglam = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
baglam.load_cert_chain("sertifika.pem", "anahtar.pem")
sunucu = HTTPServer(("127.0.0.1", 8443), Isleyici)
sunucu.socket = baglam.wrap_socket(sunucu.socket, server_side=True)
sunucu.serve_forever()

Sertifika, HTTPS’in Rolü dersindeki komutla üretilen dosyadır. İstek şu komutla yapılır; --resolve ad çözümlemenin yerine geçer, --cacert sertifikayı güven çıpası yapar:

curl -sv --cacert sertifika.pem --resolve ornek.test:8443:127.0.0.1 \
  -A "ornek-istemci" https://ornek.test:8443/

İstemci tarafındaki iz:

* Added ornek.test:8443:127.0.0.1 to DNS cache
* Hostname ornek.test was found in DNS cache
*   Trying 127.0.0.1:8443...
* Connected to ornek.test (127.0.0.1) port 8443
*  CAfile: sertifika.pem
*  CApath: none
* Server certificate:
*  subject: CN=ornek.test
*  subjectAltName: host "ornek.test" matched cert's "ornek.test"
*  issuer: CN=ornek.test
*  SSL certificate verify ok.
* using HTTP/1.x
> GET / HTTP/1.1
> Host: ornek.test:8443
> User-Agent: ornek-istemci
> Accept: */*
> 
* Request completely sent off
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 73
< 
* Connection #0 to host ornek.test left intact
<!doctype html>
<html lang="tr"><body><h1>Ornek Sayfa</h1></body></html>

Bu çıktıdan üç satır türü çıkarılmıştır: sertifikanın geçerlilik tarihleri, iki tarafın anlaştığı şifreleme takımı ve el sıkışmanın ara adımlarını gösteren satırlar. Tarihler sertifikanın ne zaman üretildiğine, şifreleme takımı ise tarafların yeteneklerine bağlıdır; ikisi de makineden makineye değişir. Yukarıdaki satırlar bu kurulumda değişmeyenlerdir.

Sunucunun kaydı ise tek satırdır:

[sunucu] GET / Host=ornek.test:8443

İzin okunuşu şöyledir: ad bir adrese çevrildi (1–2), bağlantı kuruldu (3), sertifika doğrulandı ve ad eşleşmesi sınandı (4), istek gönderildi (5), sunucu Host başlığına bakarak yanıtladı (6), yanıt yorumlandı (7). Alt kaynak bulunmadığı için 8. adım tek bir belgede kaldı.

Arızaların Belirtileri

Zinciri adımlara ayırmanın pratik değeri, bir sorunun hangi adımda olduğunu belirtiden çıkarabilmektir. Her adımın kendine özgü bir başarısızlık biçimi vardır.

Belirti Kusurlu aşama Nedeni
Ad çözümlenemiyor 2 Kayıt yok, yetkili sunucu yanıtsız veya olumsuz yanıt önbellekte
Ad eski bir adresi gösteriyor 2 Önbellekteki kaydın yaşam süresi dolmadı
Bağlantı reddedildi 3 Adres doğru, o bağlantı noktasında dinleyen süreç yok
Bağlantı zaman aşımına uğradı 3 Paketler hedefe varmıyor veya yanıt dönmüyor
Sertifika doğrulanamadı 4 İmza zinciri güven çıpasına ulaşmıyor
Sertifikadaki ad eşleşmiyor 4 Sertifika başka bir ad için düzenlenmiş
Beklenmeyen site geldi 6 Host başlığına karşılık gelen site tanımlı değil
4xx durum kodu 6 İstek kusurlu: yol, yöntem veya yetki
5xx durum kodu 6 İstek geçerli, sunucu yerine getiremedi
Sayfa geliyor ama biçimsiz 8 Alt kaynak isteklerinden biri başarısız

Bu tablonun kullanımı sırayı izlemektir: bir belirti gözlendiğinde, ondan önceki tüm aşamaların başarılı olduğu bilinir. Sertifika hatası alınıyorsa ad çözümlenmiş ve bağlantı kurulmuş demektir; 5xx alınıyorsa güvenli kanal ve istek dahil her şey çalışmıştır. Bu daraltma yöntemi Linux Ağ Yönetimi ve Sorun Giderme kursundaki katmanlı tanı yöntemiyle aynı akıl yürütmedir.

Bu ayrımın en sık karıştırılan iki noktası şunlardır. Bağlantının reddedilmesi ile zaman aşımı farklı şeylerdir: reddedilme, hedefin ulaşılabildiğini ve açıkça yanıt verdiğini gösterir; zaman aşımında hedeften hiçbir şey dönmemiştir. Ad çözümleme sorunları ile sunucu sorunları farklı katmanlardadır: adın çözümlenmesi sunucunun çalıştığını göstermez, yalnızca kaydın var olduğunu gösterir.

Zincirin Değişmeyenleri

Kurs boyunca kurulan yapıda tekrar eden üç ilke vardır ve bunlar sonraki kursların da zeminidir.

Dolaylılık. Ad adresi, adres konumu, sertifika anahtarı gösterir. Her katman, altındaki katmanın değişmesine izin verirken üstündeki için sabit kalır.

Katmanların birbirini bilmemesi. Ağ, taşıdığı paketin içeriğini bilmez; HTTP, altında şifreleme olup olmadığını bilmez; TLS, taşıdığı verinin HTTP olduğunu bilmez. Bu ayrım, bir katmanın diğerlerine dokunmadan değiştirilmesini sağlar.

Zor güvencelerin uçlara bırakılması. Ağ Nedir dersinde kurulan bu ilke zincir boyunca tekrarlanır: sıra düzeltme, önbellek tutarlılığı, kimlik doğrulama ve durum yönetimi hep uçlarda yapılır. Ara düğümler sade tutulur.

Özet

  • Bir istek dokuz aşamada yürütülür ve her aşama bir sonrakine yalnızca tek bir şey devrederek öncesini unutur.
  • Konak adı, adres çözümlendikten sonra Host başlığıyla geri döner; sanal barındırma bunu zorunlu kılar.
  • Zincirin tamamı yerel olarak kurulabilir ve tek bir izde gözlenebilir.
  • İzdeki sertifika tarihleri ve şifreleme takımı gibi alanlar kuruluma bağlıdır; yapısal satırlar değişmez.
  • Her aşamanın kendine özgü bir arıza belirtisi vardır; belirti gözlendiğinde ondan önceki aşamaların başarılı olduğu bilinir.
  • Dolaylılık, katmanların birbirini bilmemesi ve güvencelerin uçlara bırakılması, zincir boyunca tekrarlanan üç tasarım ilkesidir.

Kurs Kapanışı

Bu kurs, adres satırına yazılan bir adın ekrandaki bir sayfaya dönüşmesini uçtan uca kurdu. Ağların paket anahtarlama üzerine neden kurulduğu, adreslerin neden hiyerarşik olduğu, adların neden ayrı bir katman gerektirdiği, alan adı sisteminin önbelleklemeyle nasıl ölçeklendiği, HTTP’nin neden durumsuz tasarlandığı ve TLS’in hangi üç sözü verdiği — hepsi tek bir örnek isteğin parçaları olarak ele alındı.

Kurs boyunca kasıtlı olarak açık bırakılan bir soru vardır. Paketlerin sırasının düzeltilmesi, kaybolanların yeniden istenmesi ve gönderim hızının ağın taşıyabileceğine uyarlanması hep “uçlarda yapılır” denerek geçildi; bunu yapan protokolün kendisi tanımlanmadı. Aynı biçimde, bağlantının kurulmasından söz edildi ancak bağlantının ne olduğu, hangi katmanda durduğu ve hangi durumlarda bağlantısız çalışmanın tercih edildiği söylenmedi.

Ağ Modelleri ve Protokoller kursu bu boşluğu doldurur. Katmanlı modelleri tanımlar ve bu kursta sezgisel olarak kullanılan ayrımları — hangi işin hangi katmana ait olduğunu — sistemli bir çerçeveye oturtur. Adreslemeyi bu kursta anılan önek hesabının ötesine taşıyarak alt ağ tasarımını kurar. Güvenilir ve güvenilmez taşıma arasındaki seçimi, uygulamanın gereksinimi üzerinden gerekçelendirir. Bu kursta “sonraki kursun konusudur” denerek bırakılan her nokta orada karşılanı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