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
Hostbaş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.