---
title: 'Bir İsteğin Uçtan Uca İzi'
source: 'https://academia.sh/tr/kurslar/internet-nasil-calisir/bir-istegin-uctan-uca-izi'
course: 'İnternet Nasıl Çalışır'
language: tr
updated: '2026-08-17T18:07:05+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

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.

```python
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:

```sh
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.
