Bölüm 0: Tek Bir İsteğin Peşinde
Adres çubuğuna bir şey yazıp Enter’a bastığında ne oluyor?
Bu soruyu herkes cevaplayabilir: “sayfa geliyor.” Biraz daha ileri gidenler DNS’ten, TCP’den, belki TLS’ten söz eder. Ama sorunun peşine gerçekten düşenler azdır, çünkü cevap tek bir yerde durmuyor. Adres çözümlemede, taşıma katmanında, bir anahtarın MAC tablosunda, bir yönlendiricinin TCAM’inde, bir cam liften geçen ışığın kırılma açısında ve iki operatör arasındaki ticari anlaşmada aynı anda duruyor.
Bu kitap o cevabı baştan sona takip ediyor: tek bir isteğin peşinden altmış üç durak boyunca gidiyoruz.
Kitabın tek sorusu ve üç omurgası
Kitap boyunca izlediğimiz nesne değişmiyor: adres çubuğuna yazdığın tek bir HTTP isteği. Her bölümde “istek şu anda nerede?” sorusunun bir cevabı var. Bölümleri birbirinden bağımsız konu başlıkları olarak değil, aynı yolculuğun durakları olarak sıraladım.
Bunun altında üç soru yatıyor. Üçünü şimdi soruyorum, üçünü kitabın farklı yerlerinde tek tek kapatacağız, ve son sözde üçünü birlikte mühürleyeceğiz.
1. Bir isim nasıl adrese dönüşüyor ve bunu sana kim söylüyor?
2. Kaybolabilen bir yolun üstünde kaybolmayan bir aktarım nasıl kuruluyor?
3. Kimsenin yolun tamamını bilmediği bir ağda paket yolunu nasıl buluyor?
Yolun haritası
| Bölüm | Başlık | Ne öğreneceksin? |
|---|---|---|
| 1 | Adres Çubuğundan İsteğe | URL ayrıştırma, şema ve yetkili alan, tarayıcı önbellekleri, isteğin doğuşu |
| 2 | Paket Anahtarlamalı Yol | paket anahtarlama, devre anahtarlama, gecikmenin dört bileşeni, kuyruk ve kayıp, darboğaz ve throughput formülü |
| 3 | İsimden Adrese | kök sunucular, üst düzey alan, yetkili sunucu, DNS mesaj başlığı ve bayrakları, RCODE, kayıt türleri, ters çözümleme, bölge ve seri numarası |
| 4 | Önbellek, Tazelik ve Güven | yaşam süresi ve isabet oranı hesabı, önbellek katmanları, DNSSEC imzası, DoH ve DoT, merkezileşme tartışması |
| 5 | Port Numarası ve Soket | port numarası, soket four-tuple'ı, dinleme, iyi bilinen portlar, geçici port havuzu ve tükenmesi, çoklama çözme |
| 6 | Bağlantısız Taşıma: UDP | UDP başlığı, bağlantısız gönderim, checksum ve sözde başlık, mesaj sınırı, ne zaman tercih edilir |
| 7 | Üç Adımlı El Sıkışma | SYN, SYN-ACK, ACK, başlangıç sıra numarası, yarı açık bağlantı, RTT bedeli |
| 8 | Simetrik Şifreleme | tehdit modeli, dinleme ve sahtecilik, simetrik şifreleme, AES, blok kipleri, anahtar dağıtımı sorunu |
| 9 | Açık Anahtarlı Kriptografi | açık anahtar fikri, Diffie-Hellman anahtar uzlaşması, RSA, özet fonksiyonu, sayısal imza |
| 10 | TLS El Sıkışması | ClientHello, anahtar değişimi, oturum anahtarı, 1-RTT, 0-RTT ödünleşimi |
| 11 | Sertifika Zinciri | sertifika zinciri, kök deposu, iptal listesi ve OCSP, OCSP stapling, Certificate Transparency, ad doğrulama |
| 12 | HTTP Mesajının Anatomisi | istek satırı, metotlar, başlıklar, içerik pazarlığı, bayt aralığı istekleri, gövde, durum kodları, koşullu istek |
| 13 | Durum, Çerez ve Oturum | durumsuz protokolde durum, çerez ve öznitelikleri, SameSite ile CSRF, çerez adı önekleri, oturum, web önbelleği, vekil sunucu, koşullu istek |
| 14 | HTTP/2'den HTTP/3'e | kalıcı bağlantı, çoklama, baş engelleme, QUIC, HTTP/3, bağlantı göçü |
| 15 | İçerik Dağıtım Ağları | içerik dağıtım ağı, kenar sunucu, anycast, coğrafi yönlendirme, önbellek isabeti |
| 16 | Diğer Uygulama Protokolleri | e-posta zinciri, SMTP ve IMAP, MIME, SPF ve DKIM ile DMARC, video akışı ve DASH, eşler arası dağıtım |
| 17 | Katmanlı Mimari | katmanlı mimari, OSI yedilisi ve iki eksik kat, hizmet ile protokol ayrımı, SDU ve PDU, MAC ile LLC, TCP/IP dörtlüsü, kum saati, katmanlamanın faturası |
| 18 | Kapsülleme ve Başlıklar | kapsülleme, IPv4 başlığının bütün alanları, IHL ve DSCP, DF ile yol MTU keşfi, Ethernet çerçevesi, MTU, parçalama, yük ve başlık oranı |
| 19 | Paket Yakalama ve Çözümleme | yakalama arayüzü, karışık mod, yakalama ve gösterim filtreleri, akış takibi, kayıt biçimi |
| 20 | Ağ Arayüz Kartı | ağ kartı, çerçeve sınırlandırma ve bit doldurma, halka tampon, DMA, kesme birleştirme, boşaltma motorları |
| 21 | Fiziksel Adresleme | MAC adresi, OUI blok boyutları, çerçeve yapısı, Ethernet II ile 802.3 ayrımı, çoklu yayın eşlemesi, EUI-64, adres rastgeleleştirme |
| 22 | Hata Sezme ve CRC | eşlik biti, Hamming uzaklığı, internet sağlaması, döngüsel artıklık denetimi, sezme ile düzeltme farkı, ileri hata düzeltme |
| 23 | Adres Çözümleme: ARP | ARP isteği, broadcast domain, ARP tablosu, bedava ARP, zehirleme |
| 24 | Anahtarlama ve Ortam Erişimi | MAC öğrenme tablosu, flooding (taşkın), collision domain, broadcast domain, çoklu erişimin üç ailesi, ALOHA'dan CSMA/CD'ye, dilim süresi ve 64 bayt, döngü |
| 25 | Ağ Topolojileri | yıldız, veri yolu, halka, örgü topolojileri, structured cabling (yapısal kablolama), yatay ve dikey dağıtım |
| 26 | Sanal Yerel Ağlar | VLAN, 802.1Q etiketi, erişim ve trunk portu, yerel VLAN, VLAN atlama |
| 27 | Kablosuz Erişim: 802.11 | 802.11 çerçevesi, CSMA/CA, gizli terminal, ilişkilendirme, kanal, WPA3 |
| 28 | Radyo Kanalı ve Kapasite | modülasyon derinliği, kanal genişliği, MIMO ve MU-MIMO, OFDMA, Wi-Fi kuşakları, dolaşım |
| 29 | Kablosuz Ağ Güvenliği | WEP ve WPA2 mirası, dört adımlı el sıkışma ve anahtarın yeniden kurulması, WPA3 ve SAE, geçiş kipi açığı, 802.1X ile EAP, izleme kipi |
| 30 | Hücresel Ağlar | hücre kavramı, frekans tekrar kullanımı ve küme boyu, sektörleme, baz istasyonu, çekirdek ağ, SIM ile kimlik, aktarma, taşıyıcı toplama |
| 31 | Spektrum ve Kuşaklar | spektrum tahsisi, kanal ve alt kanal, FDD ile TDD çift yönlülüğü, FR1 ve FR2 ve FR3, mmWave ödünleşimi, kuşak takvimi |
| 32 | Hareketlilik ve Aktarma | hücreler arası aktarma, sert ve yumuşak aktarma, X2 ile Xn hazırlığı, koşullu aktarma, mobil IP fikri, bağlantı göçü |
| 33 | Adres Kiralama: DHCP | DHCP dörtlüsü, kira süresi, default gateway, ev yönlendiricisinin dört işi |
| 34 | Adresin Anatomisi | IPv4 adresi, ağ ve makine parçası, maske ve bitsel VE, CIDR, alt ağ formülleri, önek merdiveni, VLSM tasarımı, ayrılmış bloklar |
| 35 | Adres Tükenmesi ve IPv6 | IPv6 başlığı, adres türleri ve kapsam, adres gösterimi, SLAAC ve DAD, komşu keşfi, çift yığın, NAT64 ile 464XLAT |
| 36 | Yönlendirici Mimarisi | en uzun önek eşleşmesi, yönlendirme tablosunun okunması, yönetimsel uzaklık ve metrik, özyinelemeli arama, RIB ve FIB, anahtarlama dokusu, kuyruğun yeri |
| 37 | Kuyruk Yönetimi | tampon boyutu, etkin kuyruk yönetimi, paket zamanlama, öncelik ve WFQ, hizmet kalitesi, ağ tarafsızlığı |
| 38 | Cihaz Yapılandırma | komut satırı kipleri, arayüz yapılandırma, statik yol, çalışan ve başlangıç yapılandırması |
| 39 | Yönlendirme Protokolleri | uzaklık vektörü, link state (bağlantı durumu), RIP, OSPF, yakınsama, sayarak sonsuza gitme |
| 40 | Kontrol Düzlemi ve SDN | veri düzlemi ve kontrol düzlemi ayrımı, yazılım tanımlı ağ, denetleyici, akış kuralları ve on iki eşleşme alanı, trafik mühendisliği |
| 41 | Ağ İzleme ve Yönetimi | SNMP ve sayaçlar, sürümler ve topluluk dizesi sorunu, akış kaydı, NetFlow ve IPFIX, akış telemetrisi, eşik ve alarm |
| 42 | Alanlar Arası Yönlendirme | otonom sistem, BGP oturumu, yol vektörü, politika, eşleme ve geçiş, rota kaçırma |
| 43 | Adres Çevirisi | NAT tablosu, alan alan çeviri, port çevirisi, NAT davranış türleri, STUN ve delik açma, ALG, CGNAT, end-to-end argument'ın bedeli |
| 44 | Ara Kutular | ara kutu kavramı, yük dengeleyici, ters vekil, TLS sonlandırma, ağ işlev sanallaştırma, end-to-end argument'ın aşınması |
| 45 | Tünelleme ve IPsec | tünelleme fikri, IPsec kipleri, VPN türleri, WireGuard, bölünmüş tünel, MTU bedeli |
| 46 | Güvenlik Duvarları | paket süzme, durum takipli güvenlik duvarı, saldırı tespit ve önleme, hizmet reddi, dağıtık saldırı ve azaltma |
| 47 | Operatör ve Metro Ağları | metro ethernet, E-Line ve E-LAN servisleri, MPLS etiketi, segment yönlendirme, hizmet seviyesi, taşıyıcı sınıfı |
| 48 | Bitten Sinyale | hat kodlama, Manchester, 4B/5B, bant genişliği, gürültü, Nyquist ve Shannon sınırı |
| 49 | Çoklama Teknikleri | frekans bölmeli çoklama, zaman bölmeli çoklama, dalga boyu çoklama, istatistiksel çoklama, kanal ayırma |
| 50 | İletim Ortamları | twisted pair ve koaksiyel, ekranlama aileleri, kategori ve sınıf, mesafe ve segment sınırları, yangın sınıfı, konnektör aileleri |
| 51 | Kablo Sonlandırma | UTP kategorileri, büküm ve diyafoni, T568A ve T568B, sonlandırma, fiber kırımı ve kaynaştırma, konnektör cilası, kanal testi |
| 52 | Fiber Optik İletim | Snell yasası ve kritik açı, sayısal açıklık, katman çapları, tek modlu ve çok modlu sınıflar, Rayleigh saçılması ve zayıflama penceresi, dispersiyon, kayıp bütçesi |
| 53 | Bakır Erişim Ağı: DSL | abone hattı, boş bandı kullanmak, şerit şerit taşıma, santral uzaklığı ve hız, modemin gösterdiği sayılar, bakırı kısaltmak, toptan erişim |
| 54 | Pasif Optik Ağlar | FTTx aileleri, pasif optik ağ, OLT ve ONT, ayırıcı, zaman bölmeli erişim, GPON ve XGS-PON |
| 55 | Kablo Erişim Ağları | melez fiber koaksiyel ağ, kablo modem, downstream ve upstream asimetrisi, paylaşılan segment, mini dilim ve MAP çerçevesi |
| 56 | Denizaltı Kabloları | denizaltı kabloları, tekrarlayıcı, arıza sebepleri ve onarım süresi, kara istasyonu, internet değişim noktası, eşleme anlaşmaları |
| 57 | Veri Merkezi Ağları | yaprak-omurga topolojisi, doğu-batı trafiği, aşırı abonelik oranı, çok yollu dengeleme, kayıpsız taşıma |
| 58 | Kapsülleme Çözme | ters kapsülleme, çerçeve kontrolü, sağlama, soket kuyruğu, kabul kuyruğu, olay döngüsü, sıfır kopya, alış tarafı ölçekleme |
| 59 | Güvenilir Aktarım | sıra numarası, birikimli ACK, zaman aşımı kestirimi, hızlı yeniden gönderim, seçici onay, Nagle ile gecikmeli onay, kayan pencere, flow control |
| 60 | Tıkanıklık Denetimi | tıkanıklık penceresi, yavaş başlangıç, toplamsal artış çarpımsal azalış, bant genişliği-gecikme çarpımı, kayıp oranı ile hız ilişkisi, CUBIC ve BBR, açık bildirim |
| 61 | Trafik Çözümleme | yeniden gönderim tespiti, pencere grafiği, akış grafiği, tcpdump ve BPF, oturum anahtarıyla çözme |
| 62 | Gecikme Bütçesi | ilk bayta kadar geçen süre, gecikme bütçesi, Wireshark ile izleme, traceroute okuma |
| 63 | Son Söz | üç omurga sorunun birlikte mühürlenmesi, katmanlı tasarımın bedeli, buradan sonrası |
Bölümlerin içinde yer yer katlanabilir paneller göreceksin. Tasarım gerekçesini, tarihsel kararı ve ödünleşimi onların içine koydum; kapalıyken de bölümün tamamı anlaşılıyor.
Parmağın tuşun üstünde duruyor. Bastığın anda o metin kimin eline geçiyor?
Bölüm 1: Adres Çubuğundan İsteğe
Adres çubuğuna bir şeyler yazdın, Enter’a bastın, sayfa geldi. Aradaki süre belki üçte bir saniyeydi ve o sürede olan şey bu kitabın tamamı.
Yazdığın metin ise hâlâ senin makinende; henüz hiçbir yere gitmedi. Tarayıcı o metinden bir isteği nasıl çıkarıyor?
Yazdığın şey bir adres değil, bir tarif
Adres çubuğuna yazılan metne genellikle adres deniyor ama bu ad yanıltıyor. Yazdığın şey bir konum bildirmiyor, bir tarif veriyor, ve tarifin parçaları standartla tanımlı:
https://aglar.emircandemir.com/bolum/yol?dil=tr#kuyruk
└─┬─┘ └──────────┬─────────┘└───┬────┘└──┬──┘└──┬──┘
şema yetkili alan yol sorgu parçaBu biçimi tanımlayan belge RFC 3986 ve adı da tam olarak bunu söylüyor: tekbiçimli kaynak tanımlayıcısı.
Şemayı bir sunucu adı olarak okuma; o bir yöntem adı ve harfle başlamak zorunda, sonrasında harf, rakam ve birkaç işaret gelebiliyor. Yetkili alan makineyi gösteriyor ve yanında isteğe bağlı bir port taşıyabiliyor. Yol makinenin içindeki kaynağı gösteriyor, sorgu ise sunucuya ilettiğin ayrıntıyı.
Portu yazmadığın zaman boş kalmıyor; şemanın varsayılanı devreye giriyor.
| şema | varsayılan port | ne için |
|---|---|---|
http | 80 | şifresiz web |
https | 443 | şifreli web |
ws / wss | 80 / 443 | çift yönlü web bağlantısı |
ftp | 21 | eski dosya aktarımı |
ssh | 22 | şifreli uzak oturum |
https://example.com ile https://example.com:443 bu yüzden aynı adres. Tarayıcı ikincisini yazsan bile adres çubuğunda birincisini gösterir, çünkü normalleştirme varsayılan portu siliyor.
Parçaların hepsi aynı kurallara da tabi değil. Şema ile makine adını büyük-küçük harf duyarsız yazabiliyorsun; HTTPS://Example.COM ile https://example.com aynı yere gidiyor. Standart ikisinin de küçük harfe normalleştirilmesini öneriyor. Tarayıcı bunu senin adına yapıyor, üstelik daha adres çubuğunu terk etmeden. Yol için aynı şey geçerli olmuyor: /Belgeler ile /belgeler iki ayrı kaynağı gösterebiliyor, çoğu sunucuda gösteriyor da. Sebebi tarihsel: makine adları en baştan harf duyarsız yazılmış bir sistemin kuralına tabi kalıyor. Yol ise sunucunun dosya sistemine bakıyor ve dosya sistemleri her zaman aynı davranmıyor.
Bunun pratik bedelini bağlantıların hiçbir uyarı vermeden sessizce kırılmasında göreceksin. Bir belgeyi /Rapor.pdf diye yayımlayıp bağlantıyı /rapor.pdf diye paylaştığını düşün. Windows üstünde çalışan bir sunucuda hiçbir sorun çıkmıyor, çünkü orada dosya adı harf duyarsız. Linux üstünde çalışan bir sunucuda ise dosya bulunamıyor. Türkçe tuzağı derinleştiriyor. Büyük harfe çevirme kuralları dile bağlı. Türkçede i harfinin büyüğü noktalı İ, ı harfinin büyüğü noktasız I olur. Bu kuralı İngilizceye göre uygulayan bir kütüphane ilan kelimesini ILAN yapıyor. Sonra yanlış dosyaya bakıyor. Çoğu kütüphanenin varsayılanı İngilizce kuralı olduğu için bu hata sık görülüyor.
Yetkili alanın isteğe bağlı kullanıcı bilgisi taşıyabilmesi klasik bir tuzak doğuruyor. Standart, makine adından önce @ işaretiyle ayrılmış bir bölüm tanıyor: https://a@b.com adresinde makine b.com, a ise yalnızca kullanıcı bilgisi. Gözün soldan sağa okuduğu ilk ad, gidilen yer olmuyor. Uzun bir kullanıcı bilgisi yazıp adresi tanıdık gösteren eski bir kandırma yöntemi bu; tarayıcılar bugün o bölümü ya gizliyor ya da uyarı veriyor.
Sondaki parça tanımlayıcıyı ise sunucu hiç görmüyor. Tarayıcıda kalıyor ve belgenin neresine kaydırılacağını belirliyor. Bir bağlantıyı paylaştığında kare işaretinden sonrası karşı tarafın kayıtlarında görünmez.
Yazamadığın karakterler de var. Standart bunları iki kümeye ayırıyor: harfler, rakamlar ve - . _ ~ her yerde olduğu gibi yazılabiliyor; / ? # & = gibi yapı taşıyan karakterler ise veri olarak kullanılacaksa kodlanmak zorunda. Kodlama yüzde işareti ve iki onaltılık basamak: boşluk %20 oluyor, ç harfi ise iki bayta açılıp %C3%A7 hâline geliyor.
Hangi karakterin kodlanmadan geçebileceği tahmine bırakılmamış:
| küme | karakterler | kural |
|---|---|---|
| ayrılmamış | A-Z a-z 0-9 - . _ ~ | her zaman olduğu gibi yazılır |
| genel ayırıcı | : / ? # [ ] @ | adresin bölümlerini ayırır |
| alt ayırıcı | ! $ & ' ( ) * + , ; = | bir bölümün içini ayırır |
| geri kalan her şey | boşluk, <, ", ASCII dışı | kodlanmadan yazılamaz |
Listedeki asıl haber ikinci ve üçüncü satırda. O karakterler yasak değil; yapısal. Yol ayırıcısı olarak kullanılan / olduğu gibi yazılır, ama bir dosya adının içinde geçmesi gerekiyorsa %2F diye kodlanmak zorundadır. Aynı karakter, aynı adreste iki farklı anlam taşıyor ve ayrımı yalnızca kodlama yapıyor.
Ayrımın sinsi bir sonucu var ve adı çift kodlama. Zaten kodlanmış bir adresi ikinci kez kodlarsan yüzde işaretinin kendisi de kodlanıyor ve ortaya %2520 gibi bir dizi çıkıyor. Sunucu bunu boşluk yerine metin olarak okuyor. Bir bağlantının neden “bulunamadı” dediğini çözemediğinde ilk bakacağın yerlerden biri burasıdır.
Şemanın bir yöntem adı olduğunu görmenin en hızlı yolu, ağa hiç çıkmayan şemalara bakmak. file: yerel diskteki bir dosyayı açıyor, data: içeriğin kendisini adresin içinde taşıyor, mailto: ise tarayıcıyı bırakıp posta programını çağırıyor. Üçünde de ortada ne sunucu var ne paket. Tarayıcı ilk parçaya bakıp hangi mekanizmayı çalıştıracağına karar veriyor; geri kalan parçaların anlamı bile o karara bağlı.
Adresin ne kadar uzayabileceği de sık sorulan bir soru ve cevabı şaşırtıyor: standart hiçbir üst sınır koymuyor, sınırı uygulamalar koyuyor. Tarayıcılar ve sunucular kendi tamponlarına göre bir yerde kesiyor, araya giren vekiller daha erken kesebiliyor, ve kesen taraf çoğu zaman hata da vermiyor. Bu yüzden uzun veri adres satırında değil, isteğin gövdesinde taşınır.
Yukarıda saydığım parçaların çoğunu da aslında yazmıyorsun. example.com yazdığında ortada ne şema var ne yol; tarayıcı önce güvenli şemayı deniyor, sonra kök yolu ve şemanın varsayılan portunu ekliyor. Hiçbiri adres çubuğunda görünmüyor.
Zarfın üstünde şehir, sokak ve kapı numarası ayrı ayrı yazar; postacı hepsini birden okumaz, sırayla kullanır ve adres de böyle katmanlı. Benzetme şurada bitiyor: zarfı tek bir postacı okur, bu adresi ise üç ayrı sistem okur — şemayı tarayıcı, makine adını resolver (ad çözümleyici), yolu karşıdaki sunucu.
Türkçe bir alan adı ağa nasıl çıkıyor?
Alan adı sistemi doğduğunda yalnızca harf, rakam ve tire tanıyordu. Bu kısıt hâlâ yerinde, çünkü dünyadaki milyonlarca sunucu o varsayımla yazıldı.
Çözüm, adı ağa çıkmadan önce çevirmek oldu. ASCII dışı harf taşıyan bu adların ortak adı uluslararası alan adı. Tarayıcı böyle bir adı belirli bir kodlamayla indiriyor ve sonuç her zaman xn-- önekiyle başlıyor:
türkçe.com -> xn--trke-2oa7j.com
ağ.com -> xn--a-eja.com
İstanbul.com -> xn--istanbul-o0e.comNumaranın kendisi de zarif: kodlama önce ASCII harfleri sırasıyla yazıyor, sonra tireden sonra kalan harflerin hangi konumda ve hangi karakter olduğunu sıkıştırılmış biçimde ekliyor: türkçe kelimesinden geriye trke kalıyor ve gerisi 2oa7j içinde saklı duruyor, yani dönüşüm kayıpsız ve geri çevrilebilir.
Üçüncü satır ayrıca dikkat çekici. Noktalı büyük İ, sıradan bir i gibi görünüyor ama farklı bir karakter ve kodlama bu farkı korumak zorunda.
Bu ayrım bir güvenlik sorunu doğuruyor. Bazı alfabelerde Latin harflerine tıpatıp benzeyen karakterler var; kötü niyetli biri tanıdık bir markanın adını bu harflerle kaydedip ayırt edilemeyen bir adres üretebilir. Tarayıcılar buna karşı kural koyuyor: ad tek bir alfabeye ait değilse Türkçesi yerine xn-- hâli gösteriliyor. Çirkin görünmesi de kasıtlı.
Tarayıcı önce kendi cebine bakıyor
Enter’a bastığın anda tarayıcının ilk işi ağa çıkmak değil. Önce bu yolculuğu hiç yapmadan kurtulup kurtulamayacağına bakıyor. Sırayla dört cep yokluyor.
En hızlısı bellekteki kopya: sayfayı biraz önce açtıysan resimler ve stil dosyaları hâlâ işlemin belleğinde durabilir. Sonra diskteki kopya geliyor ve tarayıcı orada nesnenin yanına ne kadar taze sayılacağını da yazmış oluyor.
Süre dolmuşsa ağa çıkıyor ama tam bir istek göndermiyor. Bunun yerine elindeki kopyanın tarihini bildirip “bundan sonra değişti mi” diye soruyor; bu biçimin adı koşullu istek. Değişmediyse sunucu gövdeyi hiç göndermiyor, kısa bir yanıtla yetiniyor. Tazeliğin nasıl hesaplandığını 4. bölümde yaşam süresiyle birlikte açacağız.
Üçüncü cep bir liste. Tarayıcı, daha önce yalnızca güvenli bağlantı kabul ettiğini bildirmiş siteleri saklıyor; o listedeki bir adrese http yazsan bile istek hiç gönderilmeden https hâline çevriliyor. Ağda tek bir şifresiz istek görünmüyor.
Dördüncüsü tahmin. Tarayıcı sen yazarken nereye gitmek istediğini kestirmeye çalışıyor ve yeterince eminse adı çözüp bağlantıyı kurmaya başlıyor. Tahmin yanlışsa gitmek istemediğin bir sunucu senin geldiğini görmüş oluyor.
Sayfa tek dosya değil
Tek bir adres yazdın ama karşılığında tek bir dosya gelmiyor. Bir web sayfası nesnelerin toplamı: gelen ilk şey taban HTML dosyası, içinde resimlere, stil dosyalarına, yazı tiplerine ve betiklere göndermeler var, ve her birinin kendi adresi.
Tarayıcı belgeyi baştan sona beklemiyor. Parça parça alıyor, elindekini hemen ayrıştırıyor ve ilk resmin adresini gördüğü anda onu istemeye başlıyor. Sayfanın üst kısmının alttan önce görünmesinin sebebi bu.
Ayrıştırma her zaman kesintisiz de ilerlemiyor. Bir betik etiketi geldiğinde tarayıcı durur. Betik indirilip çalışana kadar belgenin geri kalanı beklemede kalır. Sebep, betiğin belgeyi değiştirebilme ihtimali. Sayfa başına düşen betik sayısının neden bu kadar konuşulduğunu bu kural açıklıyor.
Göndermelerin çoğu tam adres taşımıyor ve tarayıcı bunları belgenin kendi adresine göre tamamlıyor. Kural iki satırla yazılabiliyor:
belge /a/b/ içindeyken c.png -> /a/b/c.png
belge /a/b içindeyken c.png -> /a/c.pngAradaki fark tek bir karakter. Sondaki eğik çizgi, tarayıcının b parçasını dizin mi dosya mı saydığını değiştiriyor. Bir sayfayı taşırken o çizgiyi kaybetmek, belgedeki bütün göreli bağlantıları tek seferde kırabiliyor.
Sayı da hızla büyüyor: sıradan bir haber sayfası kolayca yüzden fazla nesne isteyebiliyor ve hepsi aynı makinede durmak zorunda değil. Bedeli gecikmeye yazılıyor, çünkü her yeni bağlantı en az bir gidiş-dönüş süresi istiyor.
İstek nasıl bir şeye dönüşüyor
Tarayıcı ceplerini yokladı ve ağa çıkmaya karar verdi. Elindeki şey şaşırtıcı derecede sade — birkaç satır okunabilir metin:
GET /bolum/yol?dil=tr HTTP/1.1
Host: aglar.emircandemir.com
Accept: text/html
Accept-Language: tr
If-Modified-Since: Wed, 20 Aug 2026 09:14:22 GMTİlk satır ne istediğini, hangi yolu istediğini ve hangi sürümü konuştuğunu söylüyor, altında da başlıklar duruyor. Parça tanımlayıcının burada olmadığına dikkat et: #kuyruk ağa hiç çıkmadı.
İkinci satır ilk bakışta gereksiz görünüyor. Tarayıcı zaten o makineye bağlandıysa, adını tekrar yazmasının anlamı ne?
Anlamı, bir makinenin tek bir siteye ev sahipliği yapmak zorunda olmamasında. Aynı sunucu yüzlerce alan adına birden hizmet verebiliyor ve gelen bağlantı hepsi için aynı görünüyor; sunucu hangi siteyi istediğini ancak bu satırdan öğreniyor. Paylaşımlı barındırmanın ucuz olmasının sebebi tam olarak burada.
Aynı sorun şifreli bağlantılarda bir kez daha çıkıyor: sunucunun hangi sertifikayı sunacağına karar verebilmesi için siteyi bilmesi gerekiyor, ama sertifika gelmeden istek de şifrelenemiyor. Bu düğümü kilidi kurarken çözeceğiz.
Metin bir sokete yazılıyor. Soket, işletim sisteminin uygulamaya verdiği bir tutamak; uygulama oraya yazıyor, gerisini çekirdek hallediyor. Bu tutamağın çekirdek tarafını başka bir kitapta ele almıştım.
Ama soketi açmak için karşı tarafın adresi gerekiyor ve o adres bu metinde yok. Elindeki şey bir isim; ağın taşıdığı şey bir sayı.
Özet
Peki, ne öğrendik?
- Adres çubuğuna yazdığın metin parçalara ayrılmış bir tarif. Parçalar aynı kurallara tabi değil ve parça tanımlayıcı sunucuya hiç gitmiyor.
- Yapı taşıyan karakterler veri olacaksa kodlanıyor: boşluk
%20,çharfi%C3%A7. Aynı adresi iki kez kodlamak%2520üretiyor.- Türkçe harf taşıyan alan adı ağa
xn--önekiyle çıkıyor ve dönüşüm kayıpsız; karma alfabede bu hâlin gösterilmesi bir güvenlik kuralı.- Tarayıcı ağa çıkmadan önce dört cebini yokluyor: bellek, disk, güvenli bağlantı listesi ve tahmin. Yolculuğun en hızlısı, hiç yapılmayanıdır.
- İstek birkaç satır okunabilir metinden ibaret ve
Hostsatırı olmadan tek bir makine tek bir siteye hizmet etmek zorunda kalırdı.
Tarayıcı hazır, metin hazır, soket açılmayı bekliyor. Elinde bir isim var ama ağ isimden anlamıyor; peki neden anlamıyor?
Bölüm 2: Paket Anahtarlamalı Yol
Tarayıcı isteği yazdı, soketi açmaya hazırlandı, sonra durdu. Ağ isimden anlamıyor ve bunun sebebi kabalık değil. Sebep ölçek: yolu bilen tek bir merkez yok.
Merkez yoksa yol neye benziyor? Veri o yolda bütün hâlde mi gidiyor, parça parça mı?
Ortada baştan sona uzanan bir yol yok
Ağ sözcüğü kafada bir tel canlandırıyor: bir ucunda sen, bir ucunda sunucu. Böyle bir tel yok. Onun yerine kutular var, her kutunun birkaç kablosu ve kabloların ucunda başka kutular.

Bir paket geldiğinde kutu tek bir karar veriyor: bunu hangi kablodan çıkarmalı? Kutu paketin nereden geldiğini umursamıyor, kaç durak sonra varacağını bilmiyor. Elindeki tek bilgi paketin üstünde yazan hedef ve kendi belleğindeki bir tablo. Tabloya bakıyor, kablo seçiyor, paketi itiyor.
Karar paket başına veriliyor, sohbet başına değil. Aynı sohbetin iki paketi, tablo arada değişmişse farklı kablolardan gidebiliyor. Görünür sonucu şu: paketler gönderildikleri sırayla varmak zorunda değil. Ağ hiçbir yerde sıralama sözü vermiyor ve bu eksiği kapatma işini uçlara bırakıyor.
Ortaya iki ayrı iş çıkıyor ve bunları karıştırmamak gerekiyor. Gelen tek bir paketi doğru kabloya itmek yerel bir iştir, hızlıdır, mikrosaniyeler içinde biter; buna iletme diyoruz. O tabloyu doldurmak ise küresel bir iştir, yavaştır, kutuların birbiriyle konuşmasıyla yürür; buna da yönlendirme. İkisini ayrı ayrı açacağız. Kutuların adını da burada verelim. Bunlara yönlendirici deniyor; kitabın geri kalanında o adla anacağım.

Yol kimsenin sahibi olmadığı için sabit de değil. Bir kablo koptuğunda tablolar değişiyor ve aynı sohbetin paketleri başka duraklardan geçmeye başlıyor. Sen bunu fark etmiyorsun.
Mesaj neden parçalara bölünüyor?
Tarayıcının ürettiği istek birkaç satır metindi ama yola tek bir bütün olarak çıkmıyor. Küçük parçalara bölünüyor ve her parça kendi başına yolculuk ediyor. Bunlara paket diyoruz.
Bir paket iki kısımdan oluşuyor. Önde ağın kendisi için yazılmış bilgi var — nereye gittiği, nereden geldiği, ne kadar uzun olduğu — ve buna başlık (header) deniyor. Arkadaki asıl içeriğe ise yük (payload) deniyor. Yoldaki kutular yalnızca başlığa bakıyor; yükün ne olduğunu hiçbiri bilmiyor.
Bölmenin üç sebebi var. Birincisi paylaşım: bir kablo aynı anda tek bir şey taşıyabiliyor, dolayısıyla büyük bir dosya bölünmeden gönderilseydi o dosya bitene kadar aynı kabloyu kullanan herkes beklerdi. İkincisi hata: bölünmemiş bir mesajda tek bir bozuk bayt her şeyi baştan göndermek demek, paketlerde ise yalnızca bozulan parça yeniden gönderiliyor. Üçüncüsü daha az göze çarpıyor — bölünmüş bir mesaj aynı anda birden fazla kabloda birden bulunabiliyor; baştaki paket ikinci kabloya geçmişken sondaki hâlâ birincide ilerliyor.
Bunun bir de maliyeti var ve adı sakla-ve-ilet. Bir kutu, paketin tamamı kendisine ulaşmadan onu bir sonraki kabloya itmeye başlamıyor; başlıktaki hata denetimini ancak sonu görünce yapabiliyor. Yani her durakta paketin tamamı bir kez daha kabloya itiliyor.
Öteki tasarım: yolu baştan ayırtmak
Ağ kurmanın tek yolu bu değildi. Konuşmaya başlamadan önce baştan sona bir yol ayırtan, çok daha eski bir tasarım var; adı devre anahtarlama. Bağlantı istediğinde ağ bir hazırlık turu yapıyor, yol üstündeki her durakta sana bir pay ayırıyor ve ancak sonra “konuşabilirsin” diyor. Ayrılan pay konuşma bitene kadar senin kalıyor.

Payı ayırmanın iki klasik yolu var. Frekans bölmede taşıyıcı bant dar dilimlere ayrılıyor ve her konuşma kendi diliminde kesintisiz akıyor, ama o dilimin izin verdiği hızı hiç aşamıyor. Zaman bölmede ise saat eşit aralıklara ayrılıyor ve her konuşmaya düzenli dönen bir slot düşüyor; bu kez bandın tamamı kullanılıyor, ama yalnızca kendi slotu boyunca.
Bunu bir otoyolla düşünmek işi kolaylaştırıyor. Devre anahtarlama, otoyolda sana özel bir şerit ayırmaya benziyor: o şerit senindir, kimse giremez, trafiğe takılmazsın, ama kullanmadığın sürece boş durur. Paket anahtarlama şerit ayırmıyor; herkes bütün şeritleri paylaşıyor. Haritalaması şöyle: şerit hattın kapasitesi, ayrılmış şerit devre, giriş rampasındaki bekleme kuyruk gecikmesi, yolun en dar kesiti ise darboğaz. Benzetme şurada bitiyor: otoyolda sıkışan araç bekler ve eninde sonunda geçer, ağda ise kuyruk dolduğunda gelen paket beklemeye alınmaz, silinir.
Ayrılmış payın bedeli o boşlukta saklı. Bir web isteği sürekli akan bir şey değil; kısa bir patlama yapıyor, sonra uzun süre susuyor. Böyle bir trafiğe en yüksek hızına göre pay ayırırsan zamanın çoğunda boş kapasite tutmuş olursun.
Paket anahtarlama tam buradan kazanıyor. Kullanıcılar aynı anda konuşmadığı için aynı hat çok daha fazla kullanıcıya yetiyor; ağ ayrılmış pay yerine anlık talebe göre dağıtım yapıyor ve bu dağıtım biçiminin adı istatistiksel çoklama. Bedeli de aynı yerden geliyor: ayrılmış pay olmadığı için garanti de yok.
DerinleşmeDevre anahtarlama neden telefon şebekesinde bu kadar uzun yaşadı?
Devre anahtarlamanın veri ağlarında yenilmesi, onun kötü bir fikir olduğu anlamına gelmiyor. Yanlış trafiğe uygulandığında kötü. Doğru trafiğe uygulandığında yıllarca en iyi çözüm olarak kaldı ve bunun dört ayrı sebebi var.
Birincisi sesin biçimi. Bir telefon konuşması patlamalı değil, süreklidir. Hat açıldığı andan kapandığı ana kadar iki taraf da neredeyse sabit hızda veri üretir. İstatistiksel çoklamanın sömürdüğü boşluk burada yoktur, dolayısıyla paylaşımdan kazanılacak da fazla bir şey yoktur.
İkincisi sesin gecikmeye duyarlılığı. Bir sayfa yarım saniye geç gelirse rahatsız olursun ama sayfa yine de doğrudur. Ses yarım saniye geç gelirse konuşma bozulur, karşılıklı sözler üst üste biner. Ayrılmış pay, kuyruk gecikmesini tanım gereği sıfırlar.
Üçüncüsü dönemin donanımı. Paket anahtarlama her paket için başlık okumayı, tablo aramayı ve karar vermeyi gerektirir. Devre anahtarlamada bu iş yalnızca bir kez, bağlantı kurulurken yapılır; sonrasında santral yalnızca sabit bir bağlantıyı ayakta tutar. Elektromekanik santrallerin yapabileceği iş tam olarak buydu.
Dördüncüsü para. Ayrılmış pay ile dakika başına faturalandırma aynı şeyin iki yüzüdür. Şebeke ne sattığını tam olarak biliyordu, çünkü sattığı şey ölçülebilir bir kaynaktı.
Peki neden bitti? Çünkü ses, taşınan trafiğin içinde küçük bir paya düştü. Aynı ülkede iki ayrı şebekeyi ayakta tutmanın maliyeti, sesi veri ağının üstüne taşımanın maliyetini geçti. Bugün cep telefonundan konuştuğunda sesin de paketlere bölünüyor. Bakır telefon şebekeleri ülke ülke kapatılıyor, üstelik ilan edilen kapanış tarihleri bir kereden fazla ertelendi; eski şebekeye bağlı asansör telefonlarını ve alarm sistemlerini taşımak sanılandan zor çıktı.
Ayrılmış kaynak, talep düzenli ve öngörülebilirken ucuzdur. Talep dalgalıysa paylaşım kazanır.
Bir paketin başına gelen dört gecikme
Paket bir duraktan geçerken dört ayrı gecikme topluyor ve bunları ayırmak, ağ hakkında konuşabilmenin ön şartı.
İşleme gecikmesi, kutunun başlığı okuyup hata denetimi yaptığı ve kabloyu seçtiği süre; bugünün donanımında mikrosaniyenin altında. Kuyruk gecikmesi, çıkış kablosu meşgulse beklenen süre — dördü içinde senin paketine değil, başkalarının trafiğine bağlı olan tek bileşen. Kalan ikisi ise doğrudan formülle yazılabiliyor ve ikisi de tek bir bölme işlemi:
iletim gecikmesi = paket uzunluğu (bit) / hat hızı (bit/s)
yayılım gecikmesi = mesafe (m) / ortamdaki hız (m/s)Sayı koyalım. Yerel ağlarda alışılmış en büyük paket 1.500 bayt, yani 12.000 bit. Saniyede bir gigabit taşıyan bir hatta bu paketi itmek 12 mikrosaniye sürüyor. Sinyalin bakırdaki ya da camdaki hızı ise ışığın boşluktaki hızının kabaca üçte ikisi, saniyede iki yüz bin kilometre civarında; hız ortamın elektriksel özelliklerine ve frekansa göre biraz oynuyor. Bin kilometrelik bir fiber hattı geçmek bu hızla yaklaşık 5 milisaniye tutuyor.
Dördünü yan yana koyunca hangisinin önemli olduğu tek bakışta görünüyor:
| gecikme | neye bağlı | tipik mertebe | hattı hızlandırınca |
|---|---|---|---|
| işleme | kutunun donanımı | mikrosaniyenin altı | değişmez |
| iletim | paket boyu / hat hızı | 1 Gbit/s’te 12 µs | küçülür |
| yayılım | mesafe / ortamdaki hız | 1.000 km’de 5 ms | değişmez |
| kuyruk | başkalarının trafiği | 0’dan onlarca ms’ye | dolaylı olarak küçülür |
Aradaki fark dört yüz katın üstünde. Hattını hızlandırmak iletim gecikmesini küçültüyor, yayılım gecikmesine hiç dokunmuyor. İki katı hızlı bir hat alabilirsin ama okyanusu yarı boyuna indiremezsin.
Tablonun son satırı da bu bölümün geri kalanının konusu: dört kalemden üçü hesaplanabilir, dördüncüsü tahmin edilemez.
Dört kalemin birbirine göre büyüklüğünü görmek istersen:
- İşleme gecikmesi. Kutu başlığı okuyor, bitlerde hata var mı diye bakıyor ve çıkış kablosunu seçiyor. Bugünün donanımında mikrosaniyenin altında kalıyor.
- Kuyruk gecikmesi. Seçilen kablo meşgulse paket sırasını bekliyor. Dördü içinde senin paketine değil, o anda aynı kabloyu kullanan başkalarının trafiğine bağlı olan tek bileşen.
- İletim gecikmesi. Paketin bitleri kabloya itiliyor. Süre tek bir bölme işlemi: paket uzunluğu bölü hat hızı. Daha hızlı bir hat bu bileşeni doğrudan küçültüyor.
- Yayılım gecikmesi. Bitler kabloya girdi, şimdi fiziksel olarak yol alıyorlar. Süre mesafe bölü ortamdaki yayılım hızı. Hattı hızlandırmak buna hiç dokunmuyor.
- Aradaki büyüklük farkı. Bin kilometrelik bir fiber hatta 1.500 baytlık paket için iletim 12 mikrosaniye, yayılım 5 milisaniye sürüyor. Hat hızı bu farkı kapatmıyor.
Kuyruk neden birden büyüyor?
Dört gecikmenin üçü baştan hesaplanabiliyor; dördüncüsü öyle değil ve tuhaf davranıyor.
Kuyruğun davranışı tek bir orana bağlı: kabloya gelen bit hızının, kablonun çıkarabildiği bit hızına oranı; bu orana trafik yoğunluğu deniyor ve kuyruk hakkında söylenebilecek neredeyse her şey bu tek sayıdan çıkıyor.
trafik yoğunluğu = (ortalama paket varış hızı × paket uzunluğu) / hat hızıOran birin altındaysa kuyruk zaman zaman doluyor ama boşalabiliyor; biri geçtiyse gelen iş çıkan işten fazla demektir ve kuyruk sürekli büyür. Beklenen şey, oran arttıkça gecikmenin de aynı ölçüde artması. Öyle olmuyor: oran bire yaklaştıkça ortalama bekleme dikleşerek tırmanıyor. Yüzde altmışta rahat çalışan bir hat, yüzde doksan beşte tanınmaz hâle gelebiliyor. Hatları asla tam dolulukta çalıştırmama alışkanlığı buradan geliyor.
Asıl şaşırtıcı olan şu: kuyruklar oran daha bire çok uzakken de oluşuyor. Sebep, trafiğin düzgün gelmemesi. Paketler saat gibi eşit aralıklarla değil, öbekler hâlinde geliyor. Aynı mikrosaniyede on paket geldiyse dokuzu bekliyor. Kuyruğu büyüten şey ortalama yük değil, yükün dalgalanması.
Dalgalanma öngörülebilirliği de bozuyor. Aynı yolu izleyen iki paketten biri boş bir kablo bulup hemen geçerken öteki dolu bir kuyruğa takılabiliyor; gecikmenin paketten pakete böyle oynamasına gecikme oynaması (jitter) deniyor. Dosya indirirken fark etmezsin. Sesli görüşmede ise en çok şikâyet edilen şey gecikmenin büyüklüğü değildir, bu oynamadır.
Bekleme alanının kendisi de sonsuz değil. Kutunun her kablo için ayırdığı bellek belli bir boyutta ve dolduğunda gelen paket bekletilmiyor. Siliniyor. Kutu kimseye haber vermiyor, sayacını bir artırıp yoluna devam ediyor. Silinen paketin akıbetini de ağ değil uçlar belirliyor.
Burada bir basitleştirme yapıyorum ve açıkça söylüyorum: tıkanıklığı “kuyruk dolar, paket silinir” diye geçiyorum. Ağın buna nasıl tepki verdiği ayrı bir konu; tıkanıklık denetimini kurarken bu borcu ödeyeceğiz.
Hız en dar yerde ölçülür
Günlük dilde tek bir hız var: hattının hızı. Ağda ise iki ayrı büyüklük var. Bir kablonun taşıyabileceği en yüksek hıza bant genişliği diyoruz ve o kablonun kendi özelliği. Baştan sona gerçekten elde ettiğin hıza ise throughput diyoruz ve o bütün yolun özelliği.
İlişki bir zincire benziyor. Yolun üstünde onlarca kablo var ve baştan sona akan hız bunların en yavaşını aşamıyor; o halkaya darboğaz hattı deniyor. Otoyol yeniden işe yarıyor: en dar kesit akışı belirliyor, öteki kesitleri genişletmek hiçbir şeyi değiştirmiyor.
Bu cümle bir formüle sığıyor. Sunucunun çıkış hattı Rs, senin erişim hattın Rc olsun:
throughput = min(Rs, Rc)Aradaki bütün omurga bu hesaba girmiyor — çünkü omurga hatları uçlardan kat kat geniş. Yolun ortasında paylaşılan bir darboğaz varsa formül bir terim daha alıyor. R kapasiteli o kesiti N bağlantı paylaşıyorsa:
throughput = min(Rs, Rc, R/N)Aktarımın ne kadar süreceği de buradan çıkıyor: F boyundaki bir dosya için süre F / throughput.
Sayıya dökelim. 32 Mbit’lik bir dosya, sunucu hattı 2 Mbit/s, senin hattın 1 Mbit/s. Throughput min(2, 1) = 1 Mbit/s, süre 32 saniye. Şimdi kendi hattını ikiye katla: throughput min(2, 2) = 2 Mbit/s olur ve süre 16 saniyeye iner — kazanç gerçek. Bir kez daha katla: min(2, 4) = 2 çıkar, süre 16 saniyede kalır. İkinci katlamanın hiçbir etkisi yok, çünkü darboğaz artık sende değil.
Bu, evindeki hattı yükseltip hiçbir şeyin hızlanmadığını görmenin tam açıklaması. Darboğaz sunucunun çıkış hattında ya da yolun ortasındaki paylaşılan bir kesitte duruyor olabilir; üstelik o kesiti yalnız da kullanmıyorsun, aynı anda oradan geçen her bağlantı payı bölüyor. Formüldeki N tam olarak bu.
Bunun tersi de doğru: bant genişliği bol olan bir yol, gecikmesi büyükse yine de yavaş hissettirir. Bant genişliği aktarımın ne kadar sürede biteceğini, gecikme ise ne kadar sürede başlayacağını belirliyor. Küçük dosyalarda baskın olan ikincisidir.
Bunu manzarayla birleştirdiğinde tablo tamamlanıyor: bir sayfa nesnelerin toplamıydı ve tarayıcı önbelleklerinden karşılanamayan her nesne kendi isteğini doğuruyordu. O isteklerin çoğu küçük. Küçük nesnelerde geçen sürenin büyük kısmı veri taşımak değil, gidip gelmek.
Özet
Peki, ne öğrendik?
- Yol, iki ucu olan bir tel değil; bağımsız kararlar veren kutuların ağı. Karar paket başına verildiği için sıra bile garanti değil.
- Mesaj paketlere bölünüyor, çünkü kablo paylaşılıyor. Bedeli sakla-ve-ilet: her durakta paketin tamamı bir kez daha kabloya itiliyor.
- Devre anahtarlama garanti veriyor, karşılığında boş kapasite tutuyor. Paket anahtarlamanın kazancı istatistiksel çoklama, bedeli garantisizlik.
- Dört gecikme üst üste biniyor: işleme, kuyruk, iletim ve yayılım. İletim
L/R, yayılımd/s; hattı hızlandırmak yalnızca ilkini küçültüyor.- Kuyruğu büyüten şey ortalama yük değil, yükün dalgalanması ve bellek dolduğunda paket bekletilmiyor, siliniyor.
- Baştan sona hız en dar kesitte belirleniyor. Küçük nesnelerde asıl bedel taşınan bayt değil, yapılan gidiş dönüş sayısı.
Yolun neye benzediğini artık biliyorsun: paylaşılan, garantisiz, her durağında yerel karar verilen bir yol. Ama o kutuların baktığı bir şey vardı, paketin üstündeki hedef. Yol paketlerle çalışıyorsa, paketin üstüne hangi adresi yazacaksın?
Bölüm 3: İsimden Adrese
Her kutu paketin üstündeki hedefe bakıyordu. O hedefin ne olduğunu ise atladım: bir isim değil, bir sayı.
Adres çubuğuna yazdığın metinde sayı yok. Aradaki dönüşüm kitabın omurga sorularından birini de cevaplıyor — bir isim nasıl adrese dönüşüyor ve bunu sana kim söylüyor?
Bu listeyi tek bir yerde tutamazsın
Akla ilk gelen çözüm bir tablo: solda ad, sağda sayı duruyor ve herkes aynı tabloya bakıyor. İş biter.
Birkaç yüz makine için gerçekten işe yarardı. Milyarlarca kayıt için yaramıyor ve sebepleri tek tek sayılabilir. Tek bir kopya varsa o kopyanın çöktüğü an ağın tamamı isimden anlamaz hâle gelir. Tek bir makine, saniyede milyonlarca soruyu da karşılayamaz. Üstelik o makine dünyanın bir yerinde durmak zorunda ve ötekilere uzak kalır.
Asıl sorun ise teknik değil. Kayıtların sahibi tek bir kurum değil; milyonlarca ayrı kuruluş kendi adlarından sorumlu. Merkezî bir tablo, her küçük değişiklik için herkesin aynı masaya başvurması demek olurdu. Böyle bir masa kurulmadı.
Bunun yerine veritabanı bölündü, ve bölünme adın kendi yapısını izledi. Noktalar süs değil; her nokta bir sorumluluk sınırı. ornek.com.tr adını sağdan sola okuyunca üç ayrı sahip görürsün: en sağda ülke alanı, onun içinde ticari alan, onun içinde de kurumun kendi adı.
Adın kendisi de serbest biçimli bir metin değil. Noktalar arasındaki her parçaya etiket deniyor ve standart iki üst sınır koyuyor: tek bir etiket 63 karakteri, adın tamamı ise 255 karakteri aşamıyor. Sınırlar keyfî değil, kaydın telde kapladığı yerle ilgili. Büyük-küçük harf ayrımı da burada yok; adı nasıl yazarsan yaz aynı yere gidiyor.
Adres çubuğundaki metni katmanlı bir zarf adresine benzetmiştik. Benzetme burada bir kat daha işe yarıyor: postacı zarfı kabaca sağdan sola okur, alan adı da öyle. Fark şu — zarfta bütün adımları tek kurum yürütür, burada her adımın sahibi ayrıdır.
Adın sağ ucunda görünmeyen bir nokta daha var: tam yazılmış bir alan adı kökün kendisiyle biter. Adres çubuğuna yazdığın adın sonuna nokta koyup denersen aynı sayfa gelir.
Zincirin en tepesinde kök duruyor. Tek bir işi var: hangi üst düzey alanın nerede sorulacağını bilmek. Bir alt basamakta üst düzey alan sunucuları var; com, org, net ve ülke uzantıları buradan yönetiliyor. En altta ise yetkili sunucu var ve bir adın gerçek karşılığını yalnızca o biliyor.
Sistem okumak için tasarlandı, yazmak için değil: kayıt değişikliği seyrek, sorgu ise sürekli, ve neredeyse her internet işlemi işe bu soruyla başlıyor.
Soruyu senin makinen sormuyor
Makinende bu zinciri yürüten bir program yok. Onun yerine çok küçük bir parça var ve bildiği tek şey, sorulacak yerin adresi.
O adresi de genellikle sen yazmıyorsun. Ağa bağlandığın anda yapılandırma bilgisiyle birlikte geliyor; elle değiştirmek mümkün ama çoğu kişi hiç dokunmuyor. İşte o adresteki makineye resolver diyoruz.
Bu adres genellikle bağlandığın ağı işleten kurumu gösteriyor; herkesin kullanabildiği açık resolver’lar da var. Hangisini kullandığın performansı da, gördüğün cevapları da değiştirebiliyor.
Resolver’ın ilginç yanı, anlattığım hiyerarşinin parçası olmaması. Üç basamağın hiçbirine ait değildir; zincirin dışında durur ve zinciri senin adına yürür.
Sorunun kendisi küçük bir paket ve varsayılan hâlde 53 numaralı kapıya, bağlantısız taşımayla gidiyor: tek paket gidiyor, tek paket dönüyor, el sıkışma yok. Neden el sıkışmadığını ve bunun neyi kazandırıp neyi feda ettiğini 6. bölümde açacağız.
Cevap sığmazsa ne oluyor? Standart, bağlantısız taşımadaki mesajı 512 bayta sınırlıyor. Sığmayan cevap “kesildi” işaretiyle dönüyor ve resolver aynı soruyu bu kez bağlantı kurarak yeniden soruyor. Bir uzantıyla bu sınır pazarlıkla büyütülebiliyor; imzalı cevaplar 512 bayta sığmadığı için o uzantı olmadan imzalama pratikte çalışmıyor.
Sorunun ve cevabın ortak iskeleti
Soru ile cevap aynı biçimi paylaşıyor. İkisinin de başında 12 baytlık sabit bir başlık var ve o başlığın ardından dört bölme geliyor. Başlığın tamamı şu:
| bit | alan | boy | ne yapıyor |
|---|---|---|---|
| 0 | Kimlik | 16 bit | cevabı hangi soruya ait olduğunu eşleştirir |
| 16 | Bayraklar | 16 bit | aşağıda tek tek açılıyor |
| 32 | QDCOUNT | 16 bit | soru bölmesindeki kayıt sayısı |
| 48 | ANCOUNT | 16 bit | cevap bölmesindeki kayıt sayısı |
| 64 | NSCOUNT | 16 bit | yetki bölmesindeki kayıt sayısı |
| 80 | ARCOUNT | 16 bit | ek bölmedeki kayıt sayısı |
Dört sayaç, dört bölmenin uzunluğunu veriyor. Bölmelerin adları da işlerini söylüyor: soru sorulanı tekrar eder, cevap karşılığı taşır, yetki bu cevaba kimin kefil olduğunu, ek ise işine yarayabilecek fazladan kayıtları.
Bayrak alanının içi de sabit ve her biti bir soruyu cevaplıyor:
| bit | ad | ne demek |
|---|---|---|
| QR | soru mu cevap mı | 0 soru, 1 cevap |
| Opcode | işlem türü | 0 sıradan sorgu, 5 dinamik güncelleme |
| AA | yetkili cevap | cevabı veren, alanın sahibi mi |
| TC | kesildi | mesaj sığmadı, aynı soruyu bağlantı kurarak sor |
| RD | özyineleme isteniyor | “sen benim adıma yürü” |
| RA | özyineleme var | “yürüyebilirim” |
| RCODE | sonuç kodu | işin nasıl bittiği |
Son satır arıza ararken en çok baktığın yer. Dört bitin taşıdığı değerler kısa bir liste:
| kod | ad | ne demek |
|---|---|---|
| 0 | NOERROR | sorun yok; cevap bölmesi boş olsa bile ad vardır |
| 2 | SERVFAIL | sunucu cevaplayamadı — çoğu zaman imza doğrulaması çöktü |
| 3 | NXDOMAIN | böyle bir ad yok, ve bu kesin bir cevap |
| 5 | REFUSED | sunucu cevaplayabilir ama sana cevaplamak istemiyor |
İki kodu birbirinden ayırmak arızanın yerini de ayırıyor. NXDOMAIN “ad yanlış yazılmış” demek; SERVFAIL ise “ad doğru olabilir ama ben sana söyleyemiyorum” demek. Birincisinde yazım hatası ararsın, ikincisinde resolver’ı ya da imzayı.
Kendi makinende hepsini bir arada görebilirsin:
$ dig ornek.com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24601
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1İkinci satır tam olarak yukarıdaki tablodur: qr cevap olduğunu, rd özyineleme istendiğini, ra resolver’ın bunu yapabildiğini söylüyor. aa yok — demek ki cevap yetkili sunucudan değil, önbellekten geldi.
Sormanın iki biçimi var. Özyinelemeli sorguda soruyu sorup bekliyorsun; karşı taraf gerekirse başkalarına sorar ama sana dönerken elinde hazır cevap olur. Yinelemeli sorguda ise cevap değil yön veriliyor: bende yok, şuraya sor.
Pratikte ikisi arka arkaya kullanılıyor. Senin makinen resolver’a özyinelemeli soruyor; resolver ise hiyerarşiye yinelemeli soruyor. Bölünme keyfî değil: bütün dünyanın yükünü kök sunucuların üstlenmesi ölçek olarak mümkün olmazdı.
Bu düzenin bir bedeli var ve şimdiden söylemek gerek. Resolver’ı kim işletiyorsa, senin baktığın her adı da o görüyor.
Zincir nasıl yürüyor?
Resolver’ın elinde hiçbir bilgi olmadığını varsayalım. Soru geldi ve baştan başlaması gerekiyor.
İlk durak kök. Resolver köke www.ornek.com adresini soruyor ama cevap almıyor; kökün verdiği şey, com alanına bakan sunucunun adı. Sonra o sunucuya aynı soru gidiyor ve bu kez ornek.com alanının yetkili sunucusunun adı dönüyor. Üçüncü soruda ise zincir bitiyor: yetkili sunucu adın gerçek karşılığını veriyor.
Her adımda dönen şeyin bir ad olduğuna dikkat et. Ama resolver bir sonraki sunucuya bağlanmak için sayıya ihtiyaç duyuyor ve elinde yalnızca ad var. Aynı çıkmaz bir kat aşağıda tekrar doğuyor. Çözüm, sunucu adını veren kaydın yanına o sunucunun adresini de iliştirmektir; böylece zincir kendi kendini kilitlemez.
Bu iliştirilen adres kaydının adı tutkal kaydı (glue record) ve gerçekten de zinciri yapıştıran şey o. Ne zaman gerekli olduğunu bir örnek net gösteriyor. ornek.com alanının yetkili sunucusu ns1.ornek.com ise, ornek.com adresini öğrenmek için ns1.ornek.com adresini bilmen gerekiyor — ama o adresi de yalnızca ornek.com sunucusu biliyor. Kısır döngü. com sunucusu bu yüzden NS kaydının yanına ns1.ornek.com için bir de A kaydı koyuyor ve döngü kırılıyor. Yetkili sunucu alanın dışında olsaydı — mesela ns1.baskadns.net — tutkala hiç gerek kalmazdı, çünkü o adı bağımsız olarak çözebilirdin.
Aynı sorunun bir kat yukarısı da var: resolver köke soru sorabilmek için kökün adresini bilmek zorunda ve bunu DNS’e sorarak öğrenemez. Cevap yazılımın içinde gömülü duruyor; dosyanın adı kök ipuçları (root hints) ve içinde on üç kök sunucunun adı ile adresi yazılı. Resolver açılışta bu listedeki bir sunucuya bağlanıp güncel listeyi ister; işlemin adı hazırlık sorgusu (priming). Bütün hiyerarşinin altında, ağdan öğrenilmeyen tek bir sabit dosya duruyor.
Sekiz mesajın tamamını sırayla izlemek istersen:
RD biti açık: "özyineleme istiyorum". Bu, "zinciri sen yürü, bana hazır cevabı getir" demek. Makinendeki parça bundan sonrasını hiç görmeyecek.- Makinen tek bir soru soruyor ve bekliyor. Sorunun içinde
RDbiti açık: "özyineleme istiyorum". Bu, "zinciri sen yürü, bana hazır cevabı getir" demek. Makinendeki parça bundan sonrasını hiç görmeyecek. - Kök adresi vermiyor, kapıyı gösteriyor. Çözümleyici köke sorduğunda cevap bölmesi boş dönüyor. Yetki bölmesinde
comalanınınNSkayıtları, ek bölmede o sunucuların adresleri — yani tutkal kayıtları var. - Üst düzey alan da yalnızca yön veriyor.
comsunucusuornek.comalanının yetkili sunucularını bildiriyor. Kayıtlar yine yetki ve ek bölmelerinde; cevap bölmesi hâlâ boş. İki adımdır kimse adresi söylemedi. - Yetkili sunucu cevabı veriyor. Üçüncü durakta
AAbiti açık geliyor: bu cevap önbellekten değil, kaydın sahibinden. Zincir burada bitiyor çünkü aşağıya devredilmiş bir yetki kalmadı. - Cevap sana dönüyor — ve bir süreliğine saklanıyor. Çözümleyici cevabı sana iletirken kendi belleğine de yazıyor. Bir sonraki soran üç turu değil bir turu ödeyecek;
TTLalanı bunun ne kadar süreceğini söylüyor.
Zincirin her adımı başarılı olmak zorunda da değil. Sorulan sunucu adı hiç tanımıyorsa “böyle bir ad yok” diye kesin bir cevap dönüyor ve arama orada bitiyor. Sunucu hiç cevap vermezse durum başka: resolver bir süre bekliyor, sonra aynı alanın öteki sunucusunu deniyor. Alan adı kaydettirirken birden fazla yetkili sunucu istenmesinin sebebi bu.
Zincirin bir de bedeli var ve bu bedel gecikme bileşenleri cinsinden ödeniyor. Her soru ayrı bir gidiş dönüş demek: kök, üst düzey alan ve yetkili için üç tur, üstüne senin makinenle resolver arasındaki tur. Sayfa daha ilk baytını almadan bunların hepsi bitmiş olmak zorunda. Uzaktaki bir resolver seçmenin açılışı fark edilir biçimde geciktirmesinin sebebi de bu.
Gerçekte bu zincir çok daha kısa yürüyor, çünkü resolver öğrendiklerini bir süre elinde tutuyor. Bunu şimdilik böyle bırakıyorum: zincirin neden kısaldığını ve elindeki cevabın ne kadar taze sayıldığını bir sonraki durakta ölçeceğiz.
Cevap tek çeşit değil
Zincir boyunca dönen her satır aynı kalıptadır. Dört alan var: adın kendisi, karşılığı olan değer, kaydın türü ve ne kadar süre geçerli sayılacağı. Bu satırlara kaynak kaydı diyoruz.
Satırlar gerçekte şöyle görünüyor:
ornek.com. 300 IN A 203.0.113.9
ornek.com. 3600 IN NS ns1.ornek.com.
ornek.com. 3600 IN MX 10 posta.ornek.com.
www.ornek.com. 300 IN CNAME ornek.com.Soldan sağa: ad, yaşam süresi, sınıf, tür, değer. Adın sonundaki nokta yukarıda anlattığım gizli kök; burada gizlenmiyor. Sınıf alanı bugün pratikte hep IN çıkıyor — sistem başka ağ aileleri için de tasarlanmıştı ama internetten başkası kalmadı. Posta satırındaki baştaki sayı ise öncelik: birden fazla sunucu varsa küçük olan önce deneniyor.
Kendi makinende görmek istersen dig ornek.com ANY ya da Windows’ta nslookup -type=A ornek.com aynı satırları döküyor.
Türü bilmek işe yarıyor, çünkü aynı ada farklı türlerde farklı cevaplar durabiliyor. Tür alanı 16 bit ve yüzlerce değer tanımlı; gündelik hayatta karşına çıkanlar bir sayfaya sığıyor:
| tür | no | ne söylüyor |
|---|---|---|
A | 1 | adın IPv4 karşılığı |
AAAA | 28 | adın IPv6 karşılığı |
NS | 2 | bu alanın yetkili sunucusu — zincirin halkalarını bu tür kuruyor |
CNAME | 5 | bu ad aslında şu addır (kanonik ad) |
SOA | 6 | alanın künyesi: sahibi, seri numarası, zamanlayıcıları |
PTR | 12 | adresten ada, yani ters yön |
MX | 15 | bu alana gelen postanın teslim edileceği makine ve önceliği |
TXT | 16 | serbest metin; posta doğrulama kayıtları burada durur |
SRV | 33 | bir hizmetin hangi makinede ve hangi portta olduğu |
CAA | 257 | bu alana kimin sertifika verebileceği |
HTTPS | 65 | bağlantı daha kurulmadan hizmet parametreleri |
Son üçü genç ve üçü de kitabın başka bölümlerine bağlanıyor.
SRV kaydı DNS’in tek başına yapamadığı bir şeyi yapıyor: port numarasını da söylüyor. A kaydı sana yalnızca makineyi verir, portu uygulamanın bilmesi gerekir — 5. bölümde iyi bilinen port numaralarının niçin ezberlendiğini göreceğiz. SRV bu ezberi kaldırıyor ve adı _hizmet._protokol.alan biçiminde yazıyor: _sip._tcp.ornek.com.
CAA kaydı bir yasak listesi. Her sertifika makamı teknik olarak her ad için sertifika üretebiliyor; CAA alan sahibine “benim adıma yalnızca şu makam sertifika verebilir” deme imkânı veriyor. Makamlar sertifikayı basmadan önce bu kaydı sorgulamak zorunda.
HTTPS kaydı ise tarayıcıya bağlantıyı kurmadan önce yol gösteriyor: hangi protokol sürümleri destekleniyor, hangi port, ve varsa şifreli istemci merhabası için gereken açık anahtar. HTTP/3’e geçişin bir gidiş-dönüşü nasıl kısalttığını konuşurken bu kayda geri döneceğiz.
Adres kaydının iki ayrı türü olması da tesadüf değil: internette iki ayrı adres ailesi kullanılıyor ve çoğu makine ikisini birden istiyor. Farkı ve neden hâlâ ikisinin birden yaşadığını 35. bölümde açacağız.
Ters yön ayrı bir ağaçta yürüyor
Elinde bir adres var ve hangi ada ait olduğunu öğrenmek istiyorsun. DNS bu soruyu doğrudan cevaplayamaz, çünkü ağaç adlara göre bölünmüş — adresleri arayacak bir dizin yok.
Çözüm zarif: adres bir ada çevriliyor. IPv4 adresinin dört sayısı ters sırada dizilip in-addr.arpa alanının altına asılıyor.
203.0.113.9 → 9.113.0.203.in-addr.arpa. PTR sunucu.ornek.com.Ters sıralamanın sebebi hiyerarşi. Alan adlarında en genel parça sağdadır (com), adreslerde ise soldadır (203). Sırayı çevirince adresin de en genel parçası sağa geçiyor ve DNS’in olağan yetki devri mekanizması hiç değiştirilmeden çalışıyor: bir kuruluşa 203.0.113.0/24 bloğu tahsis edildiğinde ona 113.0.203.in-addr.arpa alanının yetkisi devrediliyor.
IPv6’da aynı numara dörtlük bit gruplarıyla yapılıyor ve ağaç ip6.arpa altında duruyor; adres 32 basamağa açıldığı için ters kayıt adı da 32 etiketten oluşuyor.
Kritik ayrıntı şu: iki yön birbirini doğrulamak zorunda değil. A kaydı bir adı bir adrese bağlarken PTR kaydı adresi bambaşka bir ada bağlayabilir, çünkü ikisinin sahibi farklıdır — ileri yön alan adının sahibine, ters yön adres bloğunun sahibine aittir. Posta sunucuları bu yüzden ikisinin uyuşmasını ayrıca kontrol eder; uyuşmayan bir gönderici spam sayılır.
Aynı ada birden çok adres kaydı da konabiliyor. Cevapta birden fazla sayı döndüğünde istemciler farklı makinelere dağılıyor ve yük paylaşılıyor. Tek bir ad, tek bir makine demek değil.
DerinleşmeBir yetkili sunucu kayıtları nereden alıyor, ve ikinci sunucu onları nasıl öğreniyor?
Yetkiyi taşıyan birim ada değil, bölgeye (zone) ait. Bölge, ağacın bir sunucunun gerçekten elinde tuttuğu parçasıdır ve yetki devredilen her yerde kesilir. ornek.com bölgesi www ve posta kayıtlarını içerir; ama ar-ge.ornek.com ayrı bir ekibe devredilmişse orada biter. Alan ağacın tamamını, bölge yalnızca bir sunucunun sorumlu olduğu kesiti anlatıyor — ikisi eşanlamlı değil.
Her bölgenin en başında tek bir SOA kaydı durur ve o kayıt bölgenin künyesidir:
ornek.com. 3600 IN SOA ns1.ornek.com. yonetici.ornek.com. (
2026082201 ; seri numarası
7200 ; yenileme (refresh)
900 ; yeniden deneme (retry)
1209600 ; süre bitimi (expire)
3600 ) ; asgari — negatif önbellek süresiİkinci alan sorumlunun e-posta adresi ve @ işareti noktaya çevrilmiştir, çünkü DNS adlarında @ yeri yok. Geri kalan beş sayı bir kopyalama düzeneğini işletiyor.
Bir bölgenin birincil sunucusu kayıtların yazıldığı yerdir; ikincil sunucular kopyayı ondan çeker. İkincil sunucu her refresh süresinde birincile yalnızca SOA kaydını sorar ve tek bir şeye bakar: seri numarası büyüdü mü? Büyümediyse hiçbir şey yapmaz. Büyüdüyse bölgeyi çeker — tamamını çekmenin adı AXFR, yalnızca değişenleri çekmenin adı IXFR. Bekleyecek hâli yoksa birincil NOTIFY mesajıyla ikincilleri dürter ve kopyalama saniyeler içinde başlar.
retry, başarısız bir denemeden sonra ne kadar bekleneceğini söylüyor. expire ise en ilginci: ikincil sunucu birincile bu süre boyunca hiç ulaşamazsa cevap vermeyi bırakıyor. Sebep sağlık değil dürüstlük — iki hafta önceki kayıtlarla cevap vermek, cevap vermemekten daha zararlı.
Son sayı bir kez yeniden tanımlandı. Başlangıçta bölgedeki kayıtların varsayılan yaşam süresiydi; RFC 2308 onu negatif önbellek süresine çevirdi. Yani “bu ad yok” cevabının ne kadar hatırlanacağını bu sayı belirliyor. Var olmayan bir adı sorup sorup aynı cevabı almak da yük, ve o yükün de bir zamanlayıcısı olması gerekiyordu.
Bir uyarı da düşeyim. AXFR bir bölgenin tamamını döker; yani yanlış yapılandırılmış bir sunucu, kurumun bütün iç makine adlarını isteyen herkese verir. Sızma testlerinin ilk adımlarından biri tam olarak budur, ve doğru yapılandırma transferi yalnızca bilinen ikincil sunuculara açmaktır.
Dönen cevabın kendisi de tek bir satırdan ibaret değil. Paket üç bölmeye ayrılıyor: sorulan şeyin cevabı, o cevaba kimin yetkili olduğu, ve işine yarayabilecek ek kayıtlar. Sunucu adresinin ada iliştirilmesi işte bu üçüncü bölmede oluyor. Resolver böylece bir sonraki adımı ayrı bir soru sormadan öğreniyor.
Peki bir ad bu sisteme nasıl giriyor? Kaydettirdiğinde kayıt kuruluşuna yetkili sunucularının adlarını ve adreslerini veriyorsun. Kuruluş da bu bilgileri üst düzey alan sunucusuna yazıyor. Zincirin sana çıkan halkası tam olarak o an kuruluyor.
Bu yüzden yeni kaydedilen bir ad bir süre çalışmayabiliyor; kimi resolver’lar adı bilir, kimileri bilmez. Sebebini 4. bölümde açacağız.
DerinleşmeKök sunucu neden on üç tane ve bu neden on üç makine demek değil?
Kök sunucuların sayısı bir tasarım hedefi değil, bir aritmetik sonucuydu. Standart, bir DNS cevabının tek bir UDP mesajına sığmasını istiyordu ve o mesaj için 512 baytlık bir üst sınır tanımlıyordu. Kök sunucuların listesi de her cevaba sığabilmeliydi. Adları ve adresleri o sınıra sığdırdığında elde kalan sayı on üç oluyordu.
Yani on üç, “yeterli görülen makine sayısı” değil; bir paketin taşıyabildiği kadarıydı.
Bugün de on üç ad var ve bunları on iki ayrı kuruluş işletiyor. Ama her adın arkasında tek bir makine yok. Aynı adres dünyanın çok sayıda noktasından ilan ediliyor ve ağ, soruyu soran kişiye en yakın kopyaya yönlendiriyor. Bu yönteme anycast deniyor ve nasıl çalıştığını 42. bölümde göreceğiz.
Sonuç şu: on üç ad, dünyaya yayılmış çok sayıda makineye karşılık geliyor ve kopya sayısı harften harfe büyük ölçüde değişiyor. Bir kökün çökmesi de artık tek bir makinenin çökmesi demek değil.
Bu, kökü tek bir liste olmaktan da çıkarıyor. Listenin içeriği hâlâ tek ve küçük; taşındığı yer ise dünyaya yayılmış. Kopyalar arasında tutarlılık, listeyi merkezî bir yerden imzalayıp dağıtmakla sağlanıyor — yani “aynı” olmaları gereken şey makineler değil, taşıdıkları içerik.
Böylece omurga sorularından ilkini kapatabiliriz.
Omurga sorusu 1 — Bir isim nasıl adrese dönüşüyor ve bunu sana kim söylüyor?
Ad, sağdan sola okunan bir yol olarak çözülüyor: kök hangi üst düzey alana bakılacağını, üst düzey alan hangi yetkili sunucuya gidileceğini, yetkili sunucu ise gerçek karşılığı söylüyor. Sana söyleyen ise bunların hiçbiri değil; resolver. Zinciri o yürüyor, cevabı o getiriyor, ve senin ondan başka konuştuğun kimse yok.
Özet
Peki, ne öğrendik?
- Ad-adres listesi tek bir yerde tutulamıyor ve sebep yalnızca ölçek değil: kayıtların sahibi milyonlarca ayrı kuruluş.
- Bölünme adın kendi yapısını izliyor. Her nokta bir sorumluluk sınırı; kök, üst düzey alan ve yetkili sunucu bu sınırların üstüne oturuyor.
- Zinciri senin makinen yürümüyor, resolver yürüyor ve resolver hiyerarşinin parçası değil, müşterisi.
- Sormanın iki biçimi var: özyinelemeli sorgu cevabı getiriyor, yinelemeli sorgu bir sonraki adresi veriyor.
- Cevap tek çeşit değil. Adres, sunucu, posta ve takma ad kayıtlarının yanında
SRVportu,CAAsertifika iznini,HTTPSise bağlantı parametrelerini taşıyor.- Mesajın başlığı 12 bayt ve dört bölme sayacı taşıyor. Bayraklardaki
AAcevabın sahibinden mi geldiğini,RCODEise işin nasıl bittiğini söylüyor —NXDOMAINileSERVFAILarasındaki fark arızanın yerini de ayırıyor.- Ters yön ayrı bir ağaçta yürüyor: adres ters çevrilip
in-addr.arpaaltına asılıyor, ve iki yönün uyuşması zorunlu değil çünkü sahipleri farklı.
Elinde artık bir sayı var ve soket açılabilir. Ama o sayıyı sana bir yabancı söyledi ve sen sorgulamadan kabul ettin. Sana bir sayı söylediler; peki söyleyenin doğruyu söylediğini nereden biliyorsun?
Bölüm 4: Önbellek, Tazelik ve Güven
Sorgu bir sayı getirdi ve iki şeyi hiç sınamadık: söyleyenin doğru söylediğini, ve cevabın ne kadar taze olduğunu.
İkisi de aynı yerde, resolver’ın sana gösterdiği yüzün arkasında duruyor. Peki orada ne var?
Cevap büyük ihtimalle hiyerarşiden gelmedi
Zinciri kökten yetkili sunucuya kadar yürütürken resolver’ın elinde hiçbir şey olmadığını varsaymıştık. O varsayım anlatmak için gerekliydi. Ölçmek için değil.
Gerçek hayatta zincir nadiren baştan yürür.
Sebep basit: her isim sunucusu öğrendiği eşlemeyi bir süre saklıyor. Aynı ad tekrar sorulduğunda kimseye danışmadan, elindeki kopyayla cevap veriyor. Bu depoya önbellek diyoruz ve zincirin kısalmasının tek sebebi o.
Kısalma tek bir yerde de olmuyor. Cevap sana ulaşana kadar birkaç ayrı depodan geçme ihtimali var ve her biri ötekinden habersiz çalışıyor.
| Nerede | Ne saklıyor | Kim yönetiyor |
|---|---|---|
| Tarayıcı | son baktığın adların karşılığı | tarayıcı |
| İşletim sistemi | uygulamaların paylaştığı ortak depo | makinen |
| Resolver | binlerce kullanıcının sorduğu adlar | ağını işleten kurum |
| Yetkili sunucu | kaydın kendisi | alanın sahibi |
En üstteki depo tarayıcının kendi ad deposu: 1. bölümde yokladığı ceplerin yanında duran ayrı bir bölme. Orada cevap varsa istek makineden hiç çıkmıyor. Yoksa bir alt basamağa düşüyor. Ancak hepsi boş çıktığında hiyerarşiye soru gidiyor.
Kazancın nerede olduğunu gecikme bileşenleriyle ölçmek gerekiyor. Kısalan şey iletim süresi değil, yapılan gidiş dönüş sayısı. Depodan gelen bir cevap sıfır tur harcıyor. Zincirin tamamı ise dört tur.
Saklanan şey yalnızca başarılı cevaplar da değil. Bir ad yoksa, o yokluk da bir süre saklanıyor ve buna olumsuz önbellekleme deniyor. Yeni kaydedilen bir adın neden hemen çalışmadığını sormuş ve sebebini buraya bırakmıştım: adı sen kaydetmeden önce birinin sorduğu ve “yok” cevabı aldığı bir resolver, o yokluğu hâlâ elinde tutuyor olabilir.
Katmanların birbirinden habersiz olması da başlı başına bir sorun kaynağı. Bir kaydı değiştirdiğinde makinendeki depo tazelenmiş, tarayıcınınki eskide kalmış olabiliyor. Aynı adres iki farklı programda iki farklı yere gidiyor ve hangi katmanın yanıldığını dışarıdan görmek kolay olmuyor.
Depoların büyüklüğü de aynı değil. Tarayıcınınki yalnızca sana hizmet ediyor, resolver’ınki binlerce kişiye; bu hem kazancı hem riski büyütüyor. O depoya giren tek bir yanlış kayıt, aynı resolver’ı kullanan herkesi birden yanıltıyor.
Bunun görünmeyen bir sonucu daha var. Üst düzey alan sunucularının adresleri neredeyse her resolver’da saklı duruyor, dolayısıyla kök çoğu sorguda hiç devreye girmiyor. Kökün yükünü hafifleten şey ek donanım değil, bu depolama.
Tazeliğin ölçüsü kaydın içinde
Bir kaydın ne kadar süre saklanabileceğini kimse tahmin etmiyor. Süre kaydın kendi alanlarından biri olarak yazılı geliyor ve adı yaşam süresi.
Bu süreyi senin resolver’ın da yazmıyor; alanın sahibi yazıyor. Kaydı yayımlarken “bu değeri şu kadar süre saklayabilirsin” demiş oluyor. Süre dolduğunda kayıt depodan düşüyor. Bir sonraki soru zinciri yeniden başlatıyor.
Buradaki seçim gerçek bir ödünleşim. Süreyi uzun tutarsan sorgu sayısı düşer, cevaplar hızlanır, sunucuların yükü azalır. Kısa tutarsan bir değişiklik dünyaya çabuk yayılır ama her şey daha sık sorulur.
Ödünleşimin ne kadar sert olduğu sayılabilir ve sonuç sezgiye ters çıkıyor. Mantık basit: her yaşam süresi penceresinde yetkili sunucuya tek bir soru gidiyor, o pencerede gelen diğer bütün sorular depodan karşılanıyor. Yani isabet oranını belirleyen şey sürenin kendisi değil, süre boyunca kaç soru geldiği.
Çok sorulan bir adı düşün: saniyede on soru, süre beş dakika. Pencerede üç bin soru birikiyor ve yalnızca biri dışarı çıkıyor — isabet oranı on binde 9.997. Şimdi süreyi otuz saniyeye indir: oran hâlâ %99,67, kullanıcı hiçbir şey hissetmiyor. Ama yetkili sunucuya giden soru sayısı on katına çıktı. Aynı değişiklik, iki tarafta iki ayrı hikâye.
Şimdi az sorulan bir adı düşün: on yedi dakikada bir soru. Beş dakikalık pencere, ikinci soru gelmeden doluyor ve neredeyse her soru ıskalıyor. Yaşam süresini uzatmak bu ada hiçbir şey kazandırmıyor.
Buradan iki pratik sonuç çıkıyor. Büyük siteler kısa süreleri neredeyse bedelsiz kullanabiliyor ve hızlı taşınma esnekliğini bedavaya alıyorlar. Küçük siteler ise süreyi uzatarak bir şey kazanmıyor, yalnızca kendi değişikliklerini yavaşlatıyor.
Bedelin nerede ortaya çıktığını bir taşınmada görürsün. Sunucunu başka bir makineye taşıdığında kaydı güncellersin, ama eski değer hâlâ binlerce depoda duruyordur. Yeni adres herkese ancak eski kayıtların süresi dolduğunda ulaşır. O zamana kadar bazı ziyaretçiler yeni makineye, bazıları eskisine gider.
Deneyimli yöneticiler bu yüzden taşımadan önce süreyi kısaltır, taşımayı yapar, sonra tekrar uzatır. Ama kısaltma da anında etkili olmuyor: eski uzun süreyle saklanmış kayıtlar kendi süreleri dolana kadar yerinde kalıyor.
Sürenin nasıl işlediği de sezgiye ters. Kaydı ilk alan resolver geri saymaya başlıyor ve sana cevabı verirken kalan süreyi bildiriyor. Yani elindeki kayıt, yayımlandığı andaki tam süreyi değil ondan geriye kalanı taşıyor.
Bunu kendin ölçebilirsin: aynı adı kısa aralıkla iki kez sor ve dönen süreye bak.
$ dig +noall +answer example.com A # ilk sorgu
example.com. 132 IN A ...
$ sleep 7 && dig +noall +answer example.com A
example.com. 125 IN A ...Aradaki fark tam olarak beklediğin kadar. Kayıt yeni sorulmuyor; resolver’ın deposunda duran aynı kayıt, üstündeki sayaç azalmış hâlde veriliyor. Sayaç sıfıra indiğinde kayıt düşüyor ve bir sonraki soru zinciri yeniden başlatıyor.
Tarayıcılar ise bu sayıya her zaman uymuyor. Kendi depolarında adları çoğu kez kaydın söylediğinden farklı bir süre tutuyorlar; bazen daha uzun, bazen bağlantı kapanana kadar. Sebep performans: her sekmede yeniden sormak pahalı. Sonuç ise şu — kaydın yaşam süresini kısaltmak, tarayıcı tarafında beklediğin etkiyi yaratmayabiliyor.
Yokluk cevapları için de ayrı bir süre yazılıyor ve bu süre genellikle çok daha kısa tutuluyor. Sebebi asimetrik bir maliyet: var olan bir kaydı bayat tutmak yalnızca eski adrese göndermekle sonuçlanıyor, olmayan bir kaydı bayat tutmak ise yeni kurulan her şeyi görünmez kılıyor. Sistem, iki hatadan daha ucuz olanı seçmiş.
Süreyi kimin belirlediği bir sorumluluk sorusu da doğuruyor. Kaydı yayımlayan taraf uzun bir süre yazarsa, kendi değişikliğinin gecikmesine kendisi razı olmuş oluyor. Ama aynı kaydı kullanan başka kimseye bu tercih sorulmuyor.
Buradan çıkan sonuç, sistemin kendi hakkında verdiği sözü de belirliyor. Ad-adres çevirisi kesin tazelik vaat etmiyor. Elinden gelenin en iyisini yapıyor ve elindeki cevabın bayat olma ihtimalini hep taşıyor.
Bu cevaba neden güveniyorsun?
Şimdi ertelediğim ikinci soruya gelelim. Resolver sana bir sayı söyledi. Peki doğru söylediğini nereden biliyorsun?
Kısa cevap rahatsız edici olacak: varsayılan hâlde bilmiyorsun. Sorgu ve cevap, kendi başlarına ne imzalı ne de gizli. Cevabın gerçekten yetkili sunucudan geldiğini kanıtlayan hiçbir şey yok. Sen ilk gelen cevaba inanıyorsun.
Bunun iki klasik sömürüsü var. Birincisinde araya giren taraf sorguyu görüp sahte bir cevap yetiştiriyor. İkincisi daha sinsi ve adı zehirleme saldırısı: sahte cevap resolver’ın deposuna yerleşirse aynı yalan, süresi dolana kadar o resolver’ı kullanan herkese servis ediliyor. Tek bir başarılı saldırı, binlerce kişiyi yanlış makineye gönderiyor.
Sahteciliğin nasıl yürüdüğünü bilmek, çözümün neden imza olduğunu da açıklıyor. Saldıran taraf gerçek cevabı beklemiyor; kendi cevabını daha önce yetiştirmeye çalışıyor. Ama uydurduğu cevabın kabul edilmesi için sorgunun kimlik numarasını ve hangi porttan sorulduğunu da doğru bilmesi gerekiyor.
Bu yöntemin en bilinen biçimi 2008’de yayımlandı ve bulanın adıyla Kaminsky saldırısı diye anılıyor. Numarası kısaydı: saldırgan var olan bir adı değil, o alanın altında var olmayan rastgele adları soruyor. Her soru yeni bir tahmin hakkı veriyor ve sahte cevaba alanın yetkili sunucusunu değiştiren bir kayıt iliştiriliyor. Tek bir tutturma, alanın tamamını ele geçiriyor.
Savunma bu iki sayıyı tahmin edilemez kılmak üzerine kuruldu. Kimlik numarası 16 bit, yani 65.536 olasılık — tek başına yetersiz. Kaynak portunun da rastgele seçilmesi olasılığı milyarlara çıkardı; kuralı RFC 5452 yazıyor. Üstüne iki ucuz hile daha eklendi: sorulan adın harflerini rastgele büyük-küçük yazıp cevapta aynen geri beklemek, ve soruyu üst basamaklara sorarken adın yalnızca gereken kadarını göstermek. Üçü birden tahmini pratikte imkânsız kılıyor — ama yalanı matematiksel olarak imkânsız kılmıyor. Bunu ancak imza yapıyor.
Çözüm olarak kayıtları imzalamak öneriliyor. İmza zinciri kökten aşağı iniyor ve doğrulayan bir resolver, cevabın gerçekten o alanın sahibinden geldiğini matematiksel olarak sınayabiliyor. Adı DNSSEC ve tek bir şey yapıyor: kaynağı ve bütünlüğü doğruluyor. Gizlemiyor.
Yayılımına baktığında garip bir dengesizlik göreceksin. Kullanıcıların yaklaşık %36’sı imzayı doğrulayan bir resolver’ın arkasında. Buna karşılık imzalanmış bölge oranı yıllardır %8 civarında takılı. Uçtan uca gerçekten doğrulanan sorgu oranı ise Temmuz 2026 ölçümünde %0,62.
İmza da ayrı kayıt türleriyle taşınıyor ve adlarını bilmek işe yarıyor. DNSKEY alanın açık anahtarını yayımlıyor, RRSIG bir kayıt kümesinin imzasını taşıyor, DS ise üst basamakta duruyor ve bir alt alanın anahtarının özetini gösteriyor. Zincir böyle kuruluyor: kökün anahtarına güveniyorsun, kök com alanının DS kaydını imzalıyor, com da bir alt alanınkini. Güven aşağı doğru akıyor.
Zincirin en tepesinde doğrulanacak bir şey değil, baştan bilinen bir şey duruyor: kökün açık anahtarı. Adı güven çıpası ve doğrulayan her resolver’ın içine gömülü geliyor. Bu anahtar 2010’da yayımlandı ve ilk kez 2018’de değiştirildi; değişim, dünyadaki bütün doğrulayıcıların aynı anda yeni anahtarı tanımasını gerektirdiği için yıllarca hazırlandı.
İmzalamanın neden bu kadar geride kaldığı da anlaşılır bir hikâye. İmza, düzenli olarak yenilenmesi gereken anahtarlara dayanıyor ve yenileme kaçırılırsa imza geçersiz oluyor. Geçersiz imzanın cezası da ağır: doğrulayan bir resolver o cevabı kabul etmiyor ve alan, yanlış adrese gitmek yerine tamamen erişilemez hâle geliyor. Yani imzalamanın hatası, hiç imzalamamanın hatasından daha görünür sonuç veriyor. Bu asimetri, isteksizliğin büyük kısmını tek başına açıklıyor.
Aradaki uçurum tek bir cümleyle özetlenebilir: doğrulayacak taraf hazır, imzalayacak taraf değil. Alan sahibi imzalamadığı sürece doğrulayıcı resolver’ın sınayacağı bir şey olmuyor.
Sorguyu kim görüyor?
İmza bir sorunu çözüyor, ötekini hiç ele almıyor. Cevabın doğru olduğunu kanıtlasan bile soruyu sorduğun herkesin gözü önünde soruyorsun.
Sorgu düz metin gittiği sürece yolun üstündeki taraflar hangi adlara baktığını görebiliyor. Sayfanın içeriğini görmeleri de gerekmiyor. Ad tek başına yeterli oluyor; ne yaptığın hakkında hatırı sayılır bilgi taşıyor.
Buna karşı birkaç taşıma önerildi ve hepsine birden şifreli DNS diyoruz.
| ad | kısaltma | belirtim | kapı | ağdan bakan ne görür |
|---|---|---|---|---|
| DNS over TLS | DoT | RFC 7858 | 853 | sorgu yaptığını görür, ne sorduğunu görmez |
| DNS over HTTPS | DoH | RFC 8484 | 443 | sıradan bir web isteğinden ayırt edemez |
| DNS over QUIC | DoQ | RFC 9250 | 853 | DoT ile aynı, ama el sıkışma bir tur kısa |
Fark son sütunda. İlkinin kendi kapısı olduğu için trafiği tanınabiliyor; bir ağ yöneticisi 853’ü kapatarak şifreli sorguyu engelleyebiliyor. İkincisi ise web trafiğinin içine karışıyor, o yüzden engellenmesi çok daha zor — ama aynı sebeple kurumsal ağlarda tepki çeken de o oluyor.
Şifreleme neyin görünmediğini değiştiriyor, neyin göründüğünü tamamen kapatmıyor. Resolver’ın kendisi her şeyi görmeye devam ediyor; şifre onunla senin aranda. Adı çözdükten sonra o makineye bağlanıyorsun ve bağlantının hedef adresi paketin üstünde açıkça yazıyor. Aynı adreste tek bir site duruyorsa, adı gizlemek gittiğin yeri gizlemiyor. Üstelik şifreli bağlantıyı kurarken sunucuya hangi siteyi istediğini de söylüyorsun; o adım 10. bölümün konusu.
Şifrelemenin ikinci sonucu ise ölçekle ilgili ve teknik olmaktan çok yapısal. Tarayıcılar şifreli sorgu için genellikle kendi seçtikleri birkaç büyük sağlayıcıyı varsayılan yapıyor. Böylece sorgu, ağını işleten kurumun gözünden çıkıp dünya çapında birkaç şirketin gözüne giriyor. Kimin göreceği değişiyor, kaç kişinin göreceği azalıyor, ama görenin elindeki resim büyüyor. Şifreleme bir tehdit modelini kapatıyor, hepsini birden değil. Tehdit modeli, “kime karşı korunuyorum” sorusunun cevabı; hangisini kapattığı söylenmeden hiçbir şifreleme kararı değerlendirilemez.
Kendi durumunu görmek de zor değil. Tarayıcıların ayarlarında şifreli sorgunun açık olup olmadığı yazılı duruyor ve çoğu tarayıcı bugün bunu varsayılan olarak açıyor. Ağın buna izin vermediği durumlar da var: bazı kurumsal ağlar şifreli sorguyu kapatıp bütün soruları kendi resolver’ına yönlendiriyor.
Yayılım burada da mütevazı. Ölçümlerde ilk yöntem %6,33, ikincisi %5,75 paya sahip; ikincisi bir yılda yaklaşık üçe katlandıktan sonra tırmanışı duraksadı. Yani sorguların büyük çoğunluğu hâlâ açık gidiyor.
Özet
Peki, ne öğrendik?
- Gelen cevap çoğu zaman hiyerarşiden gelmiyor; tarayıcıdan resolver’a uzanan bir depo dizisinin ilk dolu olanından geliyor.
- Tazeliği kaydın içindeki yaşam süresi belirliyor ve o süreyi resolver değil, alanın sahibi yazıyor.
- Süre seçimi gerçek bir ödünleşim: uzun süre yükü azaltıyor, kısa süre değişikliği hızlandırıyor, ve taşıma sırasında bedeli okur değil yönetici ödüyor.
- Cevap varsayılan hâlde imzasız. İmzalama kaynağı doğruluyor ama gizlemiyor, ve imzalayan taraf doğrulayan taraftan çok geride.
- Şifreli taşıma gözlemciyi değiştiriyor, yok etmiyor; resolver hâlâ her şeyi görüyor ve merkezileşme ayrı bir tartışma başlatıyor.
Elinde artık bir sayı var ve o sayının nereden geldiğini de biliyorsun. Ama sayı yalnızca makineyi gösteriyor. Bir makinede aynı anda onlarca program çalışıyor ve hepsi ağ kullanabiliyor. Adres elinde; şimdi o makinenin hangi kapısını çalacaksın?
Bölüm 5: Port Numarası ve Soket
Adres elinde. Ama tek başına adres, karşındaki makinede kiminle konuşacağını söylemiyor.
Bir konuşmanın hangi programa ait olduğuna ne karar veriyor?
Adres binayı gösteriyor, daireyi değil
Zincirin sonunda aldığın şey bir makinenin adresiydi. O adres posta kutusuna değil, binaya kadar götürüyor.
Bir sunucu makinesinde aynı anda web sunucusu, posta sunucusu, veritabanı ve yönetim arayüzü çalışıyor olabilir. Dördü de aynı adresin arkasında. Gelen bir parçanın hangisine ait olduğunu adres söylemiyor.
Bu yüzden kimliğe ikinci bir parça eklendi: port numarası. Süreci belirleyen şey adres ile port numarasının ikisi birden.
Sokak adresi binayı buluyor, daire numarası ise binanın içinde kimi arayacağını söylüyor. Postacı binaya kadar geliyor, sonrasını numara belirliyor. Haritalaması şöyle: bina makinenin adresi, daire numarası port, dairede oturan kişi ise o portu dinleyen süreç.

Benzetmenin nerede bittiğini söylemek gerekiyor. Apartmanda daireler sabittir ve boş daire de bir dairedir. Ağda ise dinleyen bir süreç yoksa o numara hiç yoktur; oraya gelen bir parça beklemeye alınmaz, geri çevrilir.
Numaranın kaç basamak olabileceği de başlıktaki alanın genişliğine bağlı. Taşıma katmanı parçasının başında kaynak ve hedef için birer alan var ve her biri 16 bit. Yani numara sıfırdan başlıyor ve 65.535’te bitiyor: toplam 65.536 ayrı kapı.
Numaralar rastgele değil
Bir sunucuya bağlanırken numarayı sen uydurmuyorsun. Tarayıcı https gördüğünde 443’e, http gördüğünde 80’e bağlanıyor. Posta sunucuları 25’i, isim sunucuları 53’ü dinliyor.
Bu numaralar üç aralığa bölünmüş durumda ve ayrım standartla tanımlı:
| Aralık | Adı | Kim kullanıyor |
|---|---|---|
| 0-1.023 | iyi bilinen | yaygın hizmetler; çoğu sistemde yönetici yetkisi ister |
| 1.024-49.151 | kayıtlı | belirli bir uygulama için kayıt ettirilmiş numaralar |
| 49.152-65.535 | dinamik | kimseye ait değil; kaynak portlar buradan seçilir |
Birinci aralıktaki numaraların çoğunu tanımasan da işin bir yerinde karşına çıkıyorlar. Ezberlenecek liste değil ama okunacak listedir; hangi hizmetin hangi kapıda oturduğunu bilmek, bir güvenlik duvarı kuralına ya da bir bağlantı hatasına bakarken tek başına yön verir.
| numara | hizmet | ne yapar |
|---|---|---|
| 20 / 21 | FTP | eski dosya aktarımı; veri ile denetim ayrı kapılarda |
| 22 | SSH | şifreli uzak kabuk, dosya kopyalama ve tünel |
| 23 | Telnet | şifresiz uzak kabuk; bugün yalnızca eski cihazlarda |
| 25 | SMTP | posta sunucuları arası teslim |
| 53 | DNS | ad çözme; hem UDP hem TCP |
| 67 / 68 | DHCP | adres kiralama; sunucu 67, istemci 68 |
| 80 | HTTP | şifresiz web |
| 110 / 143 | POP3 / IMAP | posta kutusunu okuma |
| 123 | NTP | saat eşitleme |
| 161 / 162 | SNMP | cihaz izleme ve tuzak bildirimi |
| 389 / 636 | LDAP / LDAPS | dizin sorgulama |
| 443 | HTTPS | şifreli web; QUIC de aynı numarayı UDP’de kullanır |
| 445 | SMB | Windows dosya paylaşımı |
| 465 / 587 | SMTPS / gönderim | istemcinin postayı sunucuya bırakması |
| 3306 | MySQL | veritabanı |
| 3389 | RDP | Windows uzak masaüstü |
| 5432 | PostgreSQL | veritabanı |
| 6379 | Redis | bellek içi veri deposu |
| 8080 | HTTP (alternatif) | yönetici yetkisi olmadan açılan web sunucuları |
Son satır bir kuralı ele veriyor. 1.024’ün altındaki numaraları açmak çoğu sistemde yönetici yetkisi ister. Kural, ağın kendisinden değil işletim sisteminden gelir ve amacı basittir: sıradan bir kullanıcı 443’ü kapıp kendi sahte sunucusunu oraya oturtamasın. Yetkisi olmayan geliştiricinin 8080’e ya da 3000’e düşmesinin sebebi bu tek kısıttır.
İlk aralığın yetki istemesi tarihsel bir güvenlik önlemi. Fikir şuydu: düşük numaralı bir kapıyı yalnızca makinenin yöneticisi açabilirse, sıradan bir kullanıcı sahte bir web sunucusu kurup gelenleri kandıramaz.
Ama burada altı çizilmesi gereken bir şey var. Numara ile hizmet arasındaki bağ gelenek, zorunluluk değil. 80’i dinleyen bir program web sunucusu olmak zorunda değil; istersen orada bambaşka bir protokol konuşabilirsin. Aynı şekilde web sunucunu 8080’de de çalıştırabilirsin, yalnızca adres çubuğunda numarayı yazmak zorunda kalırsın.
Bunu bilmek pratikte işe yarıyor. Bir kapının açık olması orada beklediğin hizmetin çalıştığını kanıtlamıyor; yalnızca bir şeyin dinlediğini gösteriyor.
Numaranın ne taşıdığı da başlıkta yazmıyor. Aynı numara iki ayrı taşıma protokolünde birbirinden bağımsız kullanılabiliyor: 53 hem bağlantı kuran hem bağlantısız taşımada tanımlı ve ikisi ayrı soketler. Yani “53 açık” cümlesi bile eksik; hangi taşımada açık olduğunu söylemeden bir şey ifade etmiyor.
Aynı kapıdan yüz binlerce konuşma
Şimdi ilk bakışta çelişki gibi duran bir şey. Bir web sunucusu tek bir numarayı dinliyor, diyelim 443. Aynı anda yüz binlerce kişi ona bağlanıyor. Numara bir tane olduğuna göre sunucu bunları nasıl ayırıyor?
Önce bir ayrım. Yoldaki kutular paketin üstündeki hedefe bakıyordu; o hedef adres, port değil. Yoldaki hiçbir yönlendirici port numarasına bakmak zorunda değil. Port, yalnızca iki uçta anlam taşıyor.
Cevap, taşıma katmanının soketi tek bir sayıyla değil, dört sayıyla tanımlamasında. Kaynak adres, kaynak port, hedef adres, hedef port. Bu four-tuple’ın (dörtlü) tamamı aynı olan iki konuşma olamaz.
Aynı sunucuya bağlanmış üç istemciyi yan yana koyalım:
| Kaynak adres | Kaynak port | Hedef adres | Hedef port |
|---|---|---|---|
| 192.0.2.14 | 51322 | 203.0.113.9 | 443 |
| 192.0.2.14 | 51323 | 203.0.113.9 | 443 |
| 198.51.100.7 | 49930 | 203.0.113.9 | 443 |
Üçünün de hedefi aynı, hatta ilk ikisi aynı makineden geliyor. Ayrım tek bir sütunda: kaynak port. Üçüncüsü ise başka bir makineden, dolayısıyla kaynak portu aynı olsa da karışmazdı.
Gelen her parça için makine bu dört değere bakıyor ve parçayı doğru sokete bırakıyor. Bu ayıklama işine çoklama çözme deniyor.
Four-tuple’da görünmeyen gizli bir beşinci sütun daha var: protokol. Port numarası taşıma katmanına ait ve her taşıma protokolünün kendi numara uzayı var. Yani TCP’nin 443’ü ile UDP’nin 443’ü aynı kapı değil, birbirinden tamamen bağımsız iki kapı. Aynı makinede biri açık öbürü kapalı olabilir; ikisini iki ayrı süreç dinleyebilir. HTTPS’in hem TCP hem UDP 443’te yaşayabilmesi de tam olarak bu yüzden mümkün — QUIC aynı numarayı öteki protokolde kullanıyor ve kimsenin ayağına basmıyor.
Bunun doğal sonucu şu: portu olmayan protokoller de var. IP başlığındaki protokol alanı ICMP diyorsa içeride port yoktur, çünkü ICMP bir taşıma protokolü değildir. Ping’in port numarası yoktur ve bir güvenlik duvarında ping’i “port kapatarak” engelleyemezsin; onu protokol düzeyinde ele almak zorundasın.
Sunucu tarafında olan biteni çağrı sırasıyla görmek daha da netleştiriyor:
1. tutamağı oluştur
2. yerel adres ve porta bağla -> 203.0.113.9:443
3. gelen bağlantıları beklemeye başla
4. bekleyeni kabul et -> YENİ bir soket doğarKendi makinende bu tabloyu görebilirsin. Linux’ta ss -tan, Windows’ta netstat -an dinleyen ve kurulu soketleri listeliyor:
Durum Yerel adres:port Uzak adres:port
LISTEN 0.0.0.0:443 0.0.0.0:*
ESTAB 203.0.113.9:443 192.0.2.14:51322
ESTAB 203.0.113.9:443 192.0.2.14:51323
ESTAB 203.0.113.9:443 198.51.100.7:49930
TIME-WAIT 203.0.113.9:443 192.0.2.14:51290İlk satırda uzak uç boş. Dinleyen soketin karşı tarafı yok, çünkü henüz kimseyle konuşmuyor; yalnızca bekliyor. Yerel taraftaki 0.0.0.0 ise bir makineyi göstermiyor; “bu makinedeki bütün arayüzler” anlamına geliyor.
Bu ayrıntı pratikte sık karşına çıkıyor. Bir süreç soketi 0.0.0.0 yerine 127.0.0.1 adresine bağlarsa yalnızca aynı makineden erişilebilir hâle geliyor; dışarıdan gelen paketler o sokete hiç düşmüyor. Veritabanları çoğu zaman böyle kurulu geliyor ve “servis çalışıyor ama uzaktan bağlanamıyorum” şikâyetinin en yaygın sebebi bu tek satır. Tersi de doğru: yanlışlıkla bütün arayüzlere açılan bir yönetim arayüzü, olması gerekenden çok daha geniş bir kitleye görünür oluyor.
Son satır anahtar. Kabul etmek sana dinlediğin soketi vermiyor; o konuşmaya özel yeni bir soket veriyor. Dinleyen soket kapıda beklemeye devam ediyor. Yüz binlerce bağlantı, yüz binlerce ayrı soket demek — ama hâlâ tek bir port numarası.
DerinleşmeAynı porta iki süreç birden nasıl bağlanabiliyor?
Kural olarak bir portu aynı anda tek bir soket dinler. İkinci bir süreç aynı numaraya bağlanmaya kalkarsa hata alır ve çoğu geliştirici bu hatayı tanır: adres zaten kullanımda.
Ama modern sistemlerde bu kuralı gevşeten bir seçenek var. Süreç soketi açarken “bu portu paylaşmaya razıyım” diyebiliyor; aynı şeyi söyleyen başka süreçler de aynı numaraya bağlanabiliyor. Çekirdek gelen bağlantıları bu süreçler arasında dağıtıyor.
Neden istenir? Çünkü tek bir süreç, tek bir makinenin bütün çekirdeklerini kullanamıyor. Aynı portu dinleyen sekiz süreç açarsan, gelen bağlantılar sekize bölünüyor ve her biri ayrı bir çekirdekte çalışıyor. Aradaki dağıtımı uygulama değil çekirdek yapıyor, üstelik four-tuple’a bakarak: aynı konuşmanın bütün parçaları hep aynı sürece gidiyor.
İkinci faydası kesintisiz güncelleme. Yeni sürümü aynı portu dinleyerek başlatıyorsun, eski sürüm elindeki bağlantıları bitirip kapanıyor. Arada tek bir bağlantı bile reddedilmiyor.
Bedeli de var. Dağıtım bağlantı sayısına göre değil, four-tuple’ın karmasına göre yapılıyor; uzun ömürlü bağlantılarda yük eşit dağılmayabiliyor. Bir süreç yorulurken öteki boş durabiliyor.
Paylaşımı yasaklayan kuralların çoğu, tek çekirdekli bir dünyanın varsayımını taşıyor. Donanım değişince kural da gevşetiliyor — ama kaldırılmıyor, çünkü kazayla aynı portu açmak hâlâ bir hata.
Bir port dışarıdan neye benziyor?
Portun ikinci bir yüzü daha var. Dinleyen her port, dışarıdan bakan biri için bir giriş denemesi noktasıdır; bir makinenin saldırı yüzeyi, kabaca açık portlarının toplamıdır.
Dışarıdan bakan biri üç yanıttan birini alır ve üçü üç ayrı şey söyler:
| gördüğü | ne demek | nasıl anlaşılıyor |
|---|---|---|
| açık | orada dinleyen bir süreç var | bağlantı isteği kabul ediliyor |
| kapalı | makine ayakta ama o portu dinleyen yok | makine “burada kimse yok” diye açıkça reddediyor |
| filtrelenmiş | arada bir güvenlik duvarı var | hiç cevap gelmiyor, istek sessizce yutuluyor |
Aradaki fark önemli. Kapalı bir port cevap verdiği için makinenin varlığını ele veriyor; filtrelenmiş bir port ise makinenin orada olup olmadığını bile söylemiyor. Güvenlik duvarlarının varsayılan davranışının “reddet” değil “sessizce düşür” olmasının sebebi bu.
Buradan iki pratik sonuç çıkıyor. Birincisi, kapatılması gereken şey port değil süreçtir; kimsenin dinlemediği bir numara zaten kapalıdır. İkincisi, bir hizmeti standart dışı bir numaraya taşımak onu gizlemez. Numara değiştirmek yalnızca gelişigüzel taramaların gürültüsünü azaltır, hedefli bir taramayı hiç yavaşlatmaz.
Kendi numaranı sen seçmiyorsun
Four-tuple’ın üç değerini biliyorsun: hedef adres isim çözümlemesinden geldi, hedef port şemadan, kaynak adres de makinenin kendi adresi. Dördüncüsü nereden çıkıyor?
Onu işletim sistemi veriyor. Soket açılırken kaynak portu belirtmezsen çekirdek dinamik aralıktan boş bir numara seçip sana veriyor. Bu numaraya geçici port deniyor ve konuşma bitince havuza geri dönüyor.
Seçimin rastgele olması da önemli. İsim sorgusuna sahtecilik yapmak, kimlik numarasını ve kaynak portu tahmin etmeye dayanıyordu. Kaynak portu tahmin edilebilir olsaydı, araya girmek isteyen tarafın işi bir kat kolaylaşırdı.
Havuzun sınırları da yazılı. IANA dinamik aralığı 49152-65535 diye tanımlıyor, yani 16.384 numara. İşletim sistemleri bu öneriye tam uymuyor: Linux varsayılan olarak 32768-60999 aralığını kullanıyor ve 28.232 numara veriyor, Windows ise IANA aralığına sadık kalıyor. Kendi makinendeki değeri okuyabilirsin:
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999Havuzun sonu da var. Aynı hedef adres ve porta doğru açabileceğin bağlantı sayısı, elindeki geçici numara kadar; four-tuple’ın öteki üç değeri sabitken ayrım yalnızca kaynak porttan gelebiliyor. Yani tek bir arka uca, tek bir porta doğru açabileceğin eşzamanlı bağlantı sayısının tavanı Linux’ta 28.232.
Sayı bol görünüyor ama tükendiği yerler var ve hep aynı desen: çok sayıda kısa ömürlü bağlantı, tek bir hedefe. Saniyede 500 bağlantı açıp kapatan bir vekil sunucu düşün. Her kapanan four-tuple bir süre beklemede kalıyor; bekleme dört dakikaysa aynı anda beklemede duran four-tuple sayısı 500 × 240 = 120.000 eder. Havuzda 28.232 numara var. Havuz saniyeler içinde tükenir ve yeni bağlantı açılamaz — arıza mesajı “adres zaten kullanımda” olur, oysa hedef sunucu turp gibi ayaktadır.
Yukarıdaki çıktıda görünen TIME-WAIT durumu da tam burada devreye giriyor. Kapanan bir bağlantının four-tuple’ı hemen serbest bırakılmıyor, bir süre beklemede tutuluyor. Sebep şu: yolda gecikmiş eski bir paket, aynı four-tuple’la açılan yeni bir bağlantıya düşerse yeni konuşmanın içine eski veri karışır. Bekleme, o paketlerin ömrünün dolmasını garanti ediyor. Bu sürenin kaç dakika olduğunu ve neden o kadar olduğunu el sıkışmayı kurarken hesaplayacağız.
Bedeli havuzda görülüyor. Kısa ömürlü çok sayıda bağlantı açan bir sunucuda beklemedeki four-tuple’lar birikiyor ve boş numara bulunamaz hâle gelebiliyor. Sıradan bir kullanıcı bunu hiç görmez; tek bir arka uca saniyede binlerce bağlantı açan bir vekil sunucu görür.
Soketin çekirdek tarafını burada kapalı kutu bırakıyorum: tutamağın nasıl bir tabloya düştüğünü, tamponların nerede durduğunu ve kopyalamanın maliyetini 20. bölümde ağ kartına indiğimizde açacağız.
Özet
Peki, ne öğrendik?
- Adres binayı gösteriyor, süreci değil. Kimlik adres ile port numarasının ikisi birden; port alanı 16 bit olduğu için toplam 65.536 kapı var.
- Numara ile hizmet arasındaki bağ gelenek. Standart üç aralık tanımlıyor, ama açık bir kapı orada beklediğin hizmetin çalıştığını kanıtlamıyor.
- Soketi dört değer tanımlıyor: kaynak adres, kaynak port, hedef adres, hedef port. Tek bir dinleme portu bu sayede yüz binlerce ayrı konuşmayı taşıyabiliyor.
- Kabul işlemi yeni bir soket doğuruyor; dinleyen soket kapıda kalıyor ve her konuşma kendi soketine düşüyor.
- Kaynak portu sen değil çekirdek seçiyor, dinamik aralıktan ve tahmin edilemez biçimde; havuzun sonu da bağlantı sayısına sınır koyuyor.
Four-tuple tamam, kapı belli, soket açılmaya hazır. Ama şu ana kadar hep “taşıma katmanı” deyip geçtim; adını bir kez andım, ne vaat ettiğini hiç açmadım. Kapıyı buldun; peki oradan geçen her şey aynı sözü mü veriyor?
Bölüm 6: Bağlantısız Taşıma: UDP
Aynı kapıdan geçen her taşıma aynı sözü vermiyor. En kolayı hiçbir vaatte bulunmayan: isim sorgusunun 53 numaralı kapıya “bağlantısız taşımayla” gittiğini söyleyip geçmiştim.
O taşımanın adı UDP ve tanımı 1980 tarihli RFC 768’de duruyor — dört sayfa. Hiçbir şey vaat etmeyen bir taşıma neye yarıyor?
Sekiz bayt, dört alan
Başlığın tamamı bu:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
| kaynak port | hedef port |
+-------------------------------+-------------------------------+
| uzunluk | checksum |
+-------------------------------+-------------------------------+
| yük (payload) |Dört alan, her biri 16 bit, toplam sekiz bayt. Karşılaştırma için: bir sonraki bölümde göreceğimiz bağlantı kuran taşımanın başlığı en az yirmi bayt ve on bir alan taşıyor.
Alanları soldan sağa okuyalım. Kaynak ve hedef port, four-tuple’ın iki ayağı; makine gelen parçayı doğru sokete bunlarla bırakıyor. Kaynak port zorunlu bile değil, cevap beklemiyorsan sıfır bırakabiliyorsun.
Uzunluk alanı başlık dahil parçanın bayt sayısını taşıyor. On altı bit olduğu için üst sınır 65.535 bayt, yükte kalan da 65.527. Pratikte bu sınıra hiç yaklaşılmıyor: yol üstündeki en küçük çerçeveye sığmayan bir parça yolda bölünüyor ve bölünen parçalardan biri kaybolursa tamamı çöpe gidiyor.
Dördüncü alan checksum ve ilginç olan o.
Hesaba giren şey yalnızca yukarıdaki sekiz bayt ile yük değil. Gönderen, hesabı yapmadan önce var olmayan bir başlık uyduruyor: içinde IP kaynak adresi, IP hedef adresi, protokol numarası ve UDP uzunluğu var. Adı sözde başlık ve telde hiç gitmiyor; yalnızca iki uçta da aynı biçimde kurulup hesaba katılıyor.
Neden? Çünkü UDP’nin tek başına cevaplayamadığı bir soru var: bu datagram gerçekten bana mı geldi? Bir yönlendiricinin belleğinde hedef adres bozulursa paket yanlış makineye düşer; o makinenin UDP katmanı, kendi adresini sözde başlığa koyup hesapladığında sağlama tutmaz ve paketi atar. Adresi taşımayan bir sağlama bu hatayı hiç göremezdi.
Bunun bir bedeli var ve adını koymak gerekiyor: taşıma katmanı, altındaki katmanın alanlarını okuyor. Katman sınırının kasten delindiği yerlerden biri burası. Ve delinmesinin somut bir bedeli daha var: adres çevirisi, IP başlığındaki adresi değiştirdiği için taşıma katmanının sağlamasını da yeniden hesaplamak zorunda kalıyor.
Checksum ne yakalar, ne kaçırır?
Hesap sandığından basit. Gönderen taraf parçanın içeriğini 16 bitlik sayılar dizisi sayıyor, hepsini topluyor, en anlamlı bitten taşan eldeyi sonuca geri ekliyor ve çıkan sayının tersini alana yazıyor. Adreslerin de hesaba katılması, parçanın yanlış makineye teslim edildiğini yakalamayı sağlıyor.
Adreslerin hesaba girmesi bir katman ihlali. Taşıma katmanı, kendi altındaki katmanın alanlarını okuyor; bunun için geçici olarak kurulan yapıya sözde başlık deniyor ve telde hiç gönderilmiyor, yalnızca iki tarafta hesaplanıyor.
Alıcı aynı hesabı tekrarlıyor. Sonuç tutmuyorsa parça bozulmuş demektir ve sessizce atılıyor — kimse haber vermiyor.
Şimdi bu korumanın sınırı. İki ayrı 16 bitlik sayıda birbirini götüren iki bit dönerse toplam değişmiyor:
1110 0110 0110 0110 -> 1110 0110 0110 0111 (son bit 0 -> 1)
1101 0101 0101 0101 -> 1101 0101 0101 0100 (son bit 1 -> 0)
----------------------- -----------------------
toplam aynı toplam aynıBitler değişti, toplam değişmedi, alıcı hiçbir şey fark etmedi. Bu yüzden checksum’a hata saptama deniyor, hata düzeltme değil — üstelik saptaması da eksiksiz değil.
Bir tuhaflık daha: alan isteğe bağlı. Sıfır yazılırsa “ben hiç hesaplamadım” anlamına geliyor ve alıcı denetlemiyor. Bu esneklik protokolün ilk tasarımından kalma; bugünün adres ailesinde ise checksum zorunlu.
DerinleşmeBu kadar zayıf bir koruma neden hâlâ kullanılıyor?
Checksum’ın zayıflığı 1980’de de biliniyordu. Yerine daha güçlü bir yöntem koymamanın üç sebebi var ve üçü de hâlâ geçerli.
Birincisi maliyet. Birler tümleyeni toplaması, dönemin donanımında birkaç talimatla yapılabilen en ucuz işlemdi ve bugün de öyle: toplama, ekleme, tersini alma. Daha güçlü yöntemler bit düzeyinde bölme ya da çarpma istiyor. Her paket için, saniyede milyonlarca kez.
İkincisi katmanlı savunma sağlıyor, çünkü bu yolun tek denetimi olmuyor. Kablo düzeyinde her çerçevenin kendi ve çok daha güçlü bir denetimi var; bozulmuş bir çerçevenin taşıma katmanına kadar gelmesi zaten beklenmiyor. Taşımadaki hesap, o denetimin kapsamadığı yeri kolluyor: yönlendiricinin belleğinde ya da kartın tamponunda dönen bir bit, kablo denetiminden sonra oluştuğu için orada yakalanamaz.
Üçüncüsü end-to-end argument (uçtan uca savı). Aradaki her cihaza güvenmek yerine, denetimi yolun iki ucuna koymak. Zayıf bir uçtan uca denetim, güçlü ama parça parça denetimlerin yakalayamadığı bir sınıf hatayı yakalıyor.
Peki yetiyor mu? Yetmiyor. Ölçümler, saptanmadan geçen bozulmaların düşünülenden sık olduğunu gösterdi ve bu yüzden veri bütünlüğüne gerçekten ihtiyaç duyan katmanlar kendi denetimlerini kuruyor. Dosya aktarım protokolleri özet alıyor, şifreli taşımalar bütünlük etiketi taşıyor, depolama sistemleri kendi sağlamalarını yazıyor.
Bir denetimin gücü, onu kimin ve nerede yaptığından ayrı düşünülemez. Aynı zayıf hesap, tek başına dayanılırsa yetersiz; katmanlı bir savunmanın parçasıysa yerinde.
Hiçbir söz vermemek neden işe yarıyor?
Bu taşıma teslim sözü vermiyor, sıra sözü vermiyor, yineleme koruması vermiyor. Kaybolan paketi yeniden göndermiyor, sıralamayı düzeltmiyor, hızını ağa göre kısmıyor. Standart bunu gizlemiyor bile; teslimin garanti edilmediği metnin kendisinde yazılı.
Karşılığında iki şey kazanıyorsun.
Birincisi zaman kazandırıyor: bağlantı kurulmadığı için baştan bir gidiş-dönüş ödemiyorsun. İlk paket doğrudan veriyi taşıyor. Bir isim sorgusu tek paket gidip tek paket dönüyor ve milisaniyeler içinde bitiyor. El sıkışan bir taşımada aynı sorgu, daha soru sorulmadan bir tur harcardı.
İkincisi mesaj sınırı. Gönderdiğin her mesaj alıcıya ayrı bir mesaj olarak çıkıyor; iki mesaj birleşmiyor, bir mesaj ikiye bölünmüş gibi okunmuyor. Akış taşıyan bir protokolde nerede bittiğini kendin işaretlemek zorundasın. Burada sınır zaten korunuyor.
Bir ayrıntı da soket tarafında. Bağlantısız bir sokete de “bağlan” diyebiliyorsun; bu gerçek bir bağlantı kurmuyor, yalnızca karşı ucu sabitliyor. Kazancı şu: çekirdek artık o sokete hangi hataların ait olduğunu bilebiliyor ve “böyle bir kapı yok” cevabını sana iletebiliyor. Sabitlemezsen o cevap sessizce düşüyor.
Bu yüzden bu taşımayı seçen uygulamalar birbirine benziyor: isim çözümlemesi, ağ yönetimi, sesli ve görüntülü görüşme, oyunlar. Ortak noktaları, geç gelen verinin hiç gelmemiş sayılması. Kaybolan bir ses paketini yeniden istemek anlamsız; o an çoktan geçti.
Şaşırtıcı olan, en yeni web protokolünün de bunun üstüne kurulmuş olması. HTTP/3 garantileri bırakmıyor, onları taşımadan alıp uygulamanın içine taşıyor: yeniden gönderim de tıkanıklık denetimi de var, ama artık çekirdekte değil uygulamada. Sebebini 14. bölümde açacağız.
El sıkışma olmamasının bir de karanlık tarafı var. Kaynak adresi doğrulayan hiçbir adım olmadığı için gönderen, paketin üstüne başkasının adresini yazabiliyor. Cevap o adrese gidiyor.
Sorun, cevabın sorudan büyük olmasıyla ciddileşiyor. Kısa bir isim sorgusuna çok daha uzun bir cevap dönebiliyor; saldıran taraf küçük paketler gönderip kurbanın üstüne katlanmış bir trafik yığıyor. Buna yükseltme saldırısı deniyor ve bağlantısız taşımanın en bilinen kötüye kullanımı. Savunması da protokolde değil, işletmede: açık resolver’ı herkese kapatmak, cevap hızını sınırlamak, kaynak adresi kendi ağının çıkışında doğrulamak.
Kendi makinende görmek istersen bunlar soyut kalmasın. Wireshark’ta udp.port == 53 süzgeci, ya da komut satırında tcpdump -n udp port 53, bir sayfa açtığın anda giden isim sorgularını dökecek. Her satırda göreceğin şey tek bir paket: soru gitti, cevap geldi, arada başka hiçbir şey yok.
Özet
Peki, ne öğrendik?
- Başlık sekiz bayt ve dört alan: kaynak port, hedef port, uzunluk, checksum. Bağlantı kuran taşımanın başlığı bunun en az iki buçuk katı.
- Checksum hata saptar, düzeltmez ve saptaması da eksiksiz değil: birbirini götüren iki bit dönmesi toplamı hiç değiştirmiyor.
- Hiçbir söz vermemenin karşılığı zaman ve sınır. El sıkışma olmadığı için ilk paket doğrudan veri taşıyor, ve mesaj sınırları alıcıda korunuyor.
- Bu taşımayı seçen uygulamaların ortak noktası, geç gelen verinin işe yaramaması.
İsim sorgusu bu yüzden tek pakette bitti. Ama sayfanın kendisi tek pakete sığmıyor ve kaybolan bir parçayı kimsenin fark etmemesi kabul edilebilir değil. Garanti istemeyen taşımayı gördün; peki karşı taraf senin geldiğini nereden bilecek?
Bölüm 7: Üç Adımlı El Sıkışma
Kapıyı buldun. Karşı taraf ise senin geldiğini henüz bilmiyor: bir soket açmak bağlantı kurmuyor, önce iki ucun da birbirini duyduğunu kanıtlaması gerekiyor.
Bunun bedeli üç mesaj, ve o üçüncü mesajın neden gerektiği ilk bakışta belli olmuyor.
İki mesaj neden yetmiyor?
El sıkışmanın üç işi var. Birincisi karşılıklı isteklilik: her iki uç da diğerinin bağlanmaya razı olduğunu öğreniyor. İkincisi parametre kararı. Başlangıç sıra numarası ve alıcının ilan ettiği tampon boyu tam burada kararlaştırılıyor. Üçüncüsü kaynak ayırmak. Tampon alanı ile bağlantı tablosunda bir satır ayrılıyor; saldırganın bastığı yer orası.
İnsan konuşmasında iki mesaj yeter. Sorarsın, cevap gelir, iş biter. Ağda yetmiyor, çünkü araya üç şey giriyor: gecikme sabit değil, kaybolan mesajlar yeniden gönderiliyor ve mesajlar sırasını şaşırabiliyor.
İki mesajlı kurulumun birinci arızası gecikmiş bir kopya. Eski bir kurulum isteğinin kopyası ağda oyalanıp sunucuya geç varırsa, sunucu tarafında yarı açık bir bağlantı kalıyor. İstemcisi olmayan bir bağlantı. İkinci arıza daha sinsi: kapanmış bir bağlantının gecikmiş verisi yeni bağlantıda ikinci kez kabul ediliyor.
Üçüncü mesajın gerekçesi bu yüzden nezaket değil. RFC 9293 onu, ağda dolaşan eski kurulum isteklerinin karışıklık yaratmasını engellemek diye yazıyor. İlk isteği alan taraf onun taze mi bayat mı olduğunu bilemiyor. Tek çıkar yol gönderene doğrulatmak.
Standart aslında dört mantıksal adım tanımlıyor. Ortadaki ikisi tek segmentte birleşebildiği için geriye üç mesaj kalıyor. Üçlü el sıkışma adı da tam olarak buradan geliyor.
Üç mesaj, iki durum makinesi
Adım bir: istemci başlangıç sıra numarasını seçiyor ve SYN denetim biti kalkık bir segment gönderiyor. Bu bitlerin yaygın adı bayrak, ben de öyle diyeceğim. Kendisi SYN-SENT durumuna geçiyor.
Adım iki: sunucu SYN-RECEIVED durumuna geçiyor. Henüz bağlanmış değil. Kendi başlangıç numarasını ilan ediyor ve istemcininkini onaylıyor; SYN ile ACK aynı segmentte birlikte kalkık duruyor.
Adım üç: istemci onayı gönderiyor ve ESTABLISHED oluyor. Sunucu ise ancak bu üçüncü mesaj eline geçince aynı duruma varıyor. İki uç aynı anda kurulmuş sayılmıyor.
| Mesaj | Kalkık bayraklar | İstemci durumu | Sunucu durumu |
|---|---|---|---|
| birinci | SYN | SYN-SENT | LISTEN |
| ikinci | SYN + ACK | SYN-SENT | SYN-RECEIVED |
| üçüncü | ACK | ESTABLISHED | ESTABLISHED |
Üç mesajı ve iki tarafın durumlarını birlikte izlemek istersen:
SYN biti kalkık, içinde istemcinin seçtiği başlangıç sıra numarası var. Bu numara sıfırdan başlamıyor; her bağlantı için tahmin edilemeyecek biçimde yeniden üretiliyor.- İstemci ilk mesajı yolluyor ve bekliyor.
SYNbiti kalkık, içinde istemcinin seçtiği başlangıç sıra numarası var. Bu numara sıfırdan başlamıyor; her bağlantı için tahmin edilemeyecek biçimde yeniden üretiliyor. - Sunucu tek segmentte hem cevaplıyor hem soruyor. Aynı segmentte
SYNveACKbirlikte kalkık. Onay numarasıx+1, çünküSYNbayrağı sıra uzayında bir bayt yer kaplıyor. Sunucu henüz bağlanmış değil, yalnızca yer ayırdı. - Üçüncü mesaj gönderene doğrulatıyor. Bu mesaj nezaket değil. İlk isteği alan taraf onun taze mi yoksa ağda oyalanmış bayat bir kopya mı olduğunu bilemez; ayıran tek şey, doğru numaranın geri getirilmesi.
- İki uç aynı anda kurulmuyor. İstemci üçüncü mesajı **yollar yollamaz**
ESTABLISHEDoluyor. Sunucu ise o mesaj **eline geçene kadar** bekliyor. Aradaki boşluk tam bir tek yön gecikmesi kadar; bu sürede istemci veri yollayabilir, sunucu henüz dinliyordur. - Fatura: veri gitmeden ödenen bir gidiş-dönüş. Uygulama verisi ancak buradan sonra akabiliyor. Üçüncü mesaj boş gitmek zorunda da değil — içinde ilk isteği taşıyabilir, ve el sıkışmayı güvenlikle birleştiren protokollerin hedeflediği tasarruf tam olarak bu turdur.
Sunucudaki uygulama süreci bağlantıyı tam o anda görüyor; kabul için bekleyen çağrı üçüncü mesaj varınca dönüyor. Dinleyen soket ile konuşan soket ayrı şeylerdi; el sıkışma bitince sunucuda ikincisi yaratılıyor ve dinleme kesintisiz sürüyor.
Beşinci bölümün apartmanına dönersek: kapıyı çalmak içeri girmek değil. Kapı açılacak, içeriden bir ses cevap verecek, sen de o sesi duyduğunu belli edeceksin. Üç mesaj tam olarak bu. İkinci mesaj istemciye sunucunun canlı olduğunu kanıtlıyor, üçüncü mesaj sunucuya istemcinin canlı olduğunu. Daha kısası yok.
Üçüncü mesajın boş gitmesi zorunlu değil; içinde istemciden sunucuya veri taşıyabiliyor. Bağlantı zaten tam çift yönlü (full duplex): aynı bağlantıda veri iki yöne birden akıyor. İki ucun da kendi başlangıç numarasını ilan etmesinin sebebi bu.
İki uç aynı anda kurulum isteği gönderirse sorun çıkmıyor. İkisi de SYN-SENT durumundan SYN-RECEIVED durumuna, oradan ESTABLISHED durumuna geçiyor ve standart bunu desteklemeyi şart koşuyor. Aynı port çifti arasında aynı anda yalnızca tek bir bağlantı olabiliyor; ama tek bir port, farklı karşı portlarla çok sayıda bağlantı taşıyabiliyor.
Bir ayrıntı da sıra numarası uzayında duruyor. SYN bayrağı orada 1 bayt yer kaplıyor, bu yüzden onay numarası başlangıç numarasının bir fazlası oluyor. Salt onay ise hiç yer kaplamıyor. Kaplasaydı onayların onayı diye sonsuz bir zincir doğardı ve standart bunu açıkça yazıyor.
İki ucun ilan ettiği numara sıfırdan başlamıyor. Her bağlantı için yeniden ve tahmin edilemeyecek biçimde seçiliyor. Sebebi güvenlik: numarayı bilen biri trafiği hiç görmeden o bağlantıya veri yazabiliyor. Numaranın burada yaptığı tek iş kurulumu işaretlemek. Kayıpları bulup sırayı düzelten asıl işini 58. bölümde çalıştıracağız; burada yalnızca ilan ediyorum.
DerinleşmeNumarayı tahmin edilemez yapan tam olarak ne?
Standart seçimi rastlantıya bırakmıyor, şarta bağlıyor. RFC 9293 saat sürümlü bir üretim istiyor (MUST-8): sayaç kabaca her 4 µs’de bir artıyor ve 32 bitlik uzay yaklaşık 4,55 saatte başa dönüyor. Bir segmentin ağda yaşayabileceği en uzun süreden çok daha uzun; eski bir bağlantının numaraları yenisiyle çakışmıyor.
Saat tek başına yetmiyor. Önerilen formül numarayı bağlantının kimliğine bağlıyor: yerel adres, yerel port, uzak adres, uzak port ve gizli bir anahtar bir işleve giriyor, çıkan değer sayaca ekleniyor. O işlevin dışarıdan hesaplanabilir olmaması ayrıca şart koşulmuş (MUST-9), yoksa bir bağlantının numarasından diğerininki türetiliyor.
Uzayın büyüklüğü 4.294.967.296 farklı numaraya çıkıyor. Kulağa bol geliyor ama saldırgan four-tuple’ı zaten biliyor. Asıl korumayı sağlayan şey uzayın genişliği değil, seçimin tahmin edilemezliği.
Numara aynı zamanda bir tazelik damgası. Gecikmiş eski bir kurulum isteği karşı tarafa taze bir istek gibi görünüyor; alıcı ikisini kendi başına ayıramıyor. Ayıran şey, üçüncü mesajın doğru numarayı geri getirmesi.
El sıkışma aynı zamanda bir pazarlık
İlk iki mesaj yalnızca selamlaşma taşımıyor. Başlıktaki alanlar burada dolduruluyor ve seçeneksiz haliyle o başlık 20 bayt.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
| kaynak portu | hedef portu |
+-------------------------------+-------------------------------+
| sıra numarası |
+---------------------------------------------------------------+
| onay numarası |
+-------+-------+---------------+-------------------------------+
| uzun. | ayrl. | bayraklar | pencere |
+-------+-------+---------------+-------------------------------+
| checksum | acil veri işaretçisi |
+-------------------------------+-------------------------------+
| seçenekler (0 ile 40 bayt) |Alanları soldan okuyalım. Kaynak portu ile hedef portu 16’şar bit; soket four-tuple’ının taşıma tarafı bu iki alan. Sıra numarası ile onay numarası 32’şer bit, yani 4’er bayt. Onay numarası beklenen bir sonraki baytın numarasını taşıyor, ACK bayrağı da o alanın geçerli olduğunu söylüyor.
Başlık uzunluğu alanı 4 bit ve başlığı 32 bitlik kelimeler cinsinden ölçüyor. Üst sınırı on beş kelime, yani 60 bayt. Seçeneklere kalan en fazla yer 40 bayt. Taşıma başlığı ile IPv4 başlığı birlikte her veri birimine en az 40 bayt sabit yük bindiriyor.
Bayrak alanı bugün sekiz atanmış denetim biti taşıyor ve her birinin tek cümlelik bir işi var:
| bayrak | ne demek |
|---|---|
SYN | bağlantı kur; başlangıç numaram bu |
FIN | benden yollanacak veri kalmadı |
RST | bu bağlantı yok, iptal et |
ACK | onay numarası alanı geçerli |
PSH | biriktirme, uygulamaya hemen ver |
URG | acil işaretçi alanı geçerli |
ECE | karşı taraftan tıkanıklık bildirimi geldi |
CWR | bildirimi aldım, pencereyi kıstım |
Listeyi IANA’nın TCP Header Flags defteri yönetiyor; yeni bir bit oraya yazılmadan kullanılamıyor. Bağlantı yönetimini bunlardan üçü yapıyor: RST, SYN ve FIN.
RST ile FIN arasındaki fark ince ama sahada belirleyici. FIN kibar bir kapanış: “benim söyleyeceğim bitti, sen devam edebilirsin”. RST ise “böyle bir bağlantı yok, ne gönderdiysen at” demek. Kapalı bir porta bağlanmaya çalıştığında aldığın o anlık ret, teldeki karşılığıyla tam olarak bu bayraktır — bekleyip zaman aşımına uğramamanın sebebi de o.
Son ikisi ilerideki bir durağa bağlanıyor: tıkanıklık kayıp beklemeden, yol üstündeki bir yönlendirici tarafından da bildirilebiliyor. ECE ve CWR o bildirimin taşıma katmanındaki iki ucu.
Seçenekler: pazarlığın asıl yapıldığı yer
Pazarlık kısmı seçeneklerde duruyor ve bunların çoğu yalnızca SYN bayraklı segmentlerde gönderilebiliyor. Yani anlaşma ya el sıkışmada olur ya hiç olmaz; bağlantı kurulduktan sonra taraflar bu ayarları değiştiremiyor.
| tür | seçenek | boy | ne pazarlık ediliyor |
|---|---|---|---|
| 2 | En büyük segment boyu (MSS) | 4 bayt | tek seferde kaç bayt veri kabul ediyorum |
| 3 | Pencere ölçekleme | 3 bayt | pencere alanını kaç bitlik kaydırmayla çarpayım |
| 4 | SACK izinli | 2 bayt | seçici onayı destekliyorum |
| 8 | Zaman damgası | 10 bayt | her segmente saat vur; gidiş-dönüşü ölç |
| 1 | Dolgu (NOP) | 1 bayt | sonraki seçeneği 4 baytlık hizaya getir |
| 0 | Seçenek sonu | 1 bayt | liste bitti |
İlk dördü bağlantının ömrü boyunca etkili olan kararlar ve üçü de bu kitapta ilerideki bölümlerin konusu: pencere ölçekleme ile seçici onay 59. bölümde kayan pencereyi kurarken, zaman damgası ise 61. bölümde gecikmeyi ölçerken çalışacak.
Bir seçenek karşı tarafça anlaşılmazsa sessizce yok sayılıyor — cevapta o seçenek geri gelmiyor ve gönderen “desteklenmiyor” diye anlıyor. Pazarlığın “hayır” demesi bu: konuşmamak.
MSS seçeneği hiç gelmezse varsayılan devreye giriyor: IPv4’te 536 bayt, IPv6’da 1.220 bayt. İkisi de taban boydan başlık yükü düşülerek çıkıyor, 576 bayt eksi 40 bayt ve 1.280 bayt eksi 60 bayt. Bu değerler kimseyi mutlu etmiyor ama kimseyi de kırmıyor.
Üçüncü mesaj hiç gelmezse?
Önce kapıyı çalmanın cevabına bakalım. Kapalı bir porta gelen bağlantı isteği sessizlikle karşılanmıyor; geriye RST ile ACK birlikte dönüyor. Açık portta ise SYN ile ACK dönüyor. Fark tek bir segmentte görünüyor.
Bu yüzden port taraması el sıkışmanın ortasında durabiliyor. Yarı açık tarama (nmap -sS) üçüncü mesajı hiç göndermiyor, yerine RST atıp bağlantıyı koparıyor; el sıkışma tamamlanmadığı için uygulamanın günlüğüne hiçbir bağlantı düşmüyor. Üçüncü mesajı gönderip el sıkışmayı bitiren tarama (nmap -sT) ise iz bırakıyor.
Aynı boşluk bir saldırıya da açık. SYN seli ağı ya da belleği değil, port numarasına bağlı yarı açık bağlantı kuyruğunu tüketmeyi hedefliyor. Saldırgan çoğu zaman sahte kaynak adresle SYN yağdırıyor; ikinci mesajın cevabı hiç gelmiyor ve kayıt kuyrukta asılı kalıyor. Varsayılan kuyruk derinliği tipik olarak yarım düzine ile birkaç düzine arasında. Saldırının ucuzluğu tam buradan geliyor.
Kayıt sonsuza kadar durmuyor. Örnek bir uygulamada ilk SYN-ACK gönderilirken 75 saniyelik bir zamanlayıcı kuruluyor. Ama zamanlayıcı dolmadan kuyruk dolarsa gerçek istemciler kapıda kalıyor.
Standart yarı açık bağlantıyı ayrıca tanımlıyor: bir uç kapatmış ya da çökmüş, diğerinin haberi yok. Böyle bir bağlantı sessizce sürmüyor. İki yönden birine veri gönderilmeye çalışıldığı anda RST ile sıfırlanıyor. Kural genel: bağlantı henüz açık değilken gönderilmemiş bir şeyi onaylayan geçersiz bir ACK gelirse RST gidiyor. Gecikmiş eski bir SYN’in yarattığı sahte kurulum böyle iptal ediliyor.
Kuyruğun neden bu kadar kolay dolduğu da ölçülmüş. Bağlantı durumunu tutan yapı Linux 2.6.10’da 1.300 baytın üstünde yer kaplıyor; ölçümleri derleyen belge RFC 4987. SYN cookie savunması bu yükü tümden kaldırıyor. Sunucu SYN-RECEIVED için hiç durum ayırmıyor. Tutması gereken durumu ikinci mesajın sıra numarasına kodluyor. Üçüncü mesajın onay numarası o değeri geri getirince durum yeniden kuruluyor.
Kuyruk diye bir yapı olmayınca taşacak bir şey de kalmıyor. Bedeli, sıra numarasına sığmayan bazı TCP seçeneklerinin bu kipte kaybolması; çoğu sistemde varsayılan olarak kapalı duruyor. Sunucu durumu saklamak yerine karşı tarafa taşıtınca tüketilebilecek kaynağı da ona devretmiş oluyor. Aynı fikri, durumu senin makinene yazan çerez mekanizmasında yeniden göreceğiz.
Bu üç mesajın faturası ne kadar?
Bedeli ölçmenin birimi belli. El sıkışmanın maliyeti tam olarak bir gidiş-dönüş süresi, kısaca 1 RTT. Bağlantı kurup tek bir nesne çekmek ise 2 RTT artı aktarım süresi ediyor.
Bağlantısız gönderim kurulum için hiçbir gidiş-dönüş ödemiyordu; aradaki fark tam olarak bu bir tur. Taşıma el sıkışması ile güvenlik el sıkışması ayrı yapıldığında iki ardışık el sıkışma oluyor ve fatura ikiye katlanıyor. İkisini tek el sıkışmada birleştiren protokoller, ve oturum biletiyle kurulumu sıfır gidiş-dönüşe indiren yöntemler tam olarak bu bedeli hedef alıyor.
İlk SYN’in ağ için hiçbir ayrıcalığı yok. Yetkili sunucudan öğrenilen adres burada ilk kez bir bağlantı isteğinin üstüne yazılıyor. Paketin başına gelen dört gecikme onun için de aynen geçerli; sıradan bir paket gibi, alan adları arası yönlendirmeyle yol alıyor.
Kapanış tarafı ise kurulumdan pahalıya geliyor ve dört mesaj sürüyor: FIN, ACK, FIN, ACK. Sebebi bağlantının tam çift yönlü olması — iki ayrı yön var ve her yön ayrı ayrı kapanıyor. Buna yarı kapanma deniyor: bir uç “benim söyleyeceğim bitti” derken karşı taraf konuşmaya devam edebiliyor.
Kapanışın da kendi durum adları var ve iki taraf ayrı yollardan yürüyor:
| taraf | sıra | durumlar |
|---|---|---|
| kapatan | FIN gönderir → ACK alır → FIN alır → ACK gönderir | FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED |
| kapatılan | FIN alır → ACK gönderir → uygulama kapatır → FIN gönderir | CLOSE-WAIT → LAST-ACK → CLOSED |
İkinci satırın ortasındaki italik adım bir arıza teşhisi taşıyor. CLOSE-WAIT durumundan çıkışı protokol değil uygulama tetikliyor: karşı taraf kapandı, çekirdek onayladı, ve şimdi sıra senin programının soketi kapatmasında. Program bunu yapmayı unutursa soket orada kalıyor. Bir sunucuda yığınla CLOSE-WAIT görüyorsan sorun ağda değil, kodda — bir yerde kapatılmayan bir tutamaç var. Buna karşılık yığınla TIME-WAIT görmek normaldir; o durumdan çıkışı zamanlayıcı sağlıyor.
Onay kendi FIN’iyle aynı segmentte birleşirse mesaj sayısı üçe iniyor. Kapanışı başlatan taraf TIME-WAIT durumunda en uzun segment ömrünün iki katı kadar bekliyor. RFC 9293 o ömrü 2 dakika sayıyor, yani bekleme 4 dakika.
Bu dört dakikanın iki ayrı gerekçesi var ve ikisi de bir arızayı önlüyor. Birincisi son onayın kaybolma ihtimali: ACK yolda düşerse karşı taraf FIN’ini yeniden gönderiyor ve onu tekrar onaylayacak birinin ayakta olması gerekiyor. İkincisi gecikmiş kopya: aynı four-tuple hemen yeniden kullanılırsa eski bağlantının yolda kalmış bir segmenti yeni konuşmanın içine düşebiliyor. Bekleme, o segmentlerin ömrünü doldurmasını garanti ediyor. Beşinci bölümde geçici port havuzunun neden daraldığını sormuştuk; cevabı bu dört dakika.
Buraya kadar anlatılan her adımı kendi makinende görebilirsin. Wireshark’ta tcp.flags.syn == 1 && tcp.flags.ack == 0 süzgeci yalnızca ilk mesajları listeliyor, yani bir sayfa açtığında kaç ayrı bağlantı kurulduğunu orada sayabilirsin. Komut satırında ise ss -tan çıktısını izle: aynı bağlantı sırayla SYN-SENT, ESTAB ve kapanıştan sonra TIME-WAIT satırlarında görünüyor.
Özet
Peki, ne öğrendik?
- Üçüncü mesaj bir doğrulama adımı: ilk isteği alan taraf onun taze mi bayat mı olduğunu bilemediği için gönderene doğrulatıyor.
- Kurulum aynı zamanda pazarlık: en büyük segment boyu yalnızca SYN bayraklı segmentlerde gönderilebildiği için boy anlaşması ya el sıkışmada olur ya hiç olmaz.
- Başlangıç sıra numarası bir güvenlik parametresi: tahmin edilebilirse yol üstünde hiç bulunmayan bir saldırgan kurulmuş bağlantıya veri sokabiliyor.
- Kaynak ayırma saldırının hedefi: yarı açık bağlantı kuyruğu sahte kaynak adresli SYN’lerle doluyor ve gerçek istemciler kapıda kalıyor.
- Bağlantının faturası bir gidiş-dönüş: veri gitmeden önce ödenen bu tur, garanti vermeyen taşımada hiç ödenmiyor.
Üç mesaj bitti, iki uç da karşısının orada olduğunu biliyor ve sıra numaraları anlaşıldı. Bağlantı kuruldu; peki aradaki herkes ne yazdığını okuyabilir mi?
Bölüm 8: Simetrik Şifreleme
Bağlantı kuruldu ve imleç parolanın yanında bekliyor. Yazacağın şey aradaki onlarca cihazın önünden geçecek, ve hepsi onu olduğu gibi okuyabilecek.
Okunamaz hâle getirmek varsayılan bir davranış değil, ayrı bir hazırlık gerektiriyor ve o hazırlığın ilk yarısını bu bölümde kuruyoruz.
Aradaki herkes ne görüyor?
Ağ güvenliği tek bir vaat gibi konuşuluyor. Aslında dört ayrı vaat var ve hiçbiri diğerinin yerine geçmiyor. Gizlilik, içeriği yalnızca gönderenin ve hedeflenen alıcının anlayabilmesi. Kimlik doğrulama, iki tarafın da karşısındakinin kim olduğunu teyit edebilmesi. Mesaj bütünlüğü, mesajın yolda ya da sonrasında fark edilmeden değiştirilememesi. Erişilebilirlik ise hizmetin kullanıcılara açık kalması.
Bu bölümde yalnızca birincisini çözüyoruz. Şifrelemenin bütünlük vermediğini baştan bilmen gerekiyor: okunamaz bir mesaj, değiştirilemez bir mesaj anlamına gelmiyor. Bütünlük ayrı bir mekanizma istiyor ve o mekanizmanın kendi anahtarı var.
Aradaki saldırganın elinde ne olduğunu beş başlıkta toplayabilirsin. Mesajları yakalayıp dinleyebiliyor. Kurulu bir bağlantıya kendi mesajını sokuşturabiliyor. Kaynak adresini, hatta paketteki herhangi bir alanı sahteleyebiliyor. Süregelen bir bağlantıda taraflardan birini çıkarıp yerine geçebiliyor. Kaynakları boğarak hizmeti tümden engelleyebiliyor.
Bunların ilki özel bir yetenek bile istemiyor. Karışık (promiscuous) moda alınmış bir ağ arayüzü, yanından geçen bütün paketleri okuyup kaydediyor; parolalar dahil. Paylaşımlı Ethernet ve kablosuz gibi yayın ortamlarında bu doğrudan çalışıyor.
Sahtecilik de ucuz. Paketin üstündeki kaynak adresi bir kanıt taşımıyor; yalnızca bir iddia. O alanı gönderenin kendisi dolduruyor, ve doğru doldurduğunu kimse denetlemiyor.
SYN, SYN-ACK ve ACK ile kurulan bağlantı bir kanal açıyor, ama o kanal hiçbir şey saklamıyor. Sade bir TCP ya da UDP soketinde hiç şifreleme yok: sokete yazdığın düz metin parola, internette düz metin olarak yol alıyor. Bunun en görünür karşılığı adres çubuğunda duruyor. HTTP varsayılan olarak 80. portu kullanıyor, HTTPS ise 443’ü; iyi bilinen portlar bir gelenekti. HTTPS ayrı bir taşıma değil; HTTP ile TLS’in birleşimi.
Şifrelemenin üç kelimesi, saldırganın üç modeli
Kriptografinin sözlüğü üç terimden ibaret. Açık metin (plaintext) gönderilecek şey, şifreli metin (ciphertext) telde giden şey, anahtar ise ikisi arasındaki dönüşümü belirleyen sayı. Şifreleme algoritması açık metni anahtarla şifreli metne çeviriyor, çözme algoritması tersini yapıyor.
Bunu bir kasayla düşünmek işi kolaylaştırıyor. Kasanın modeli herkesçe biliniyor ve mağazadan satın alınabiliyor; onu güvenli yapan şey kombinasyonun sende kalması. Şifreleme de aynı yere yaslanıyor: algoritma yayımlanmış durumda, gizli tutulan tek şey anahtar. Haritalaması şöyle: kasanın mekanizması algoritma, kombinasyon anahtar, içine koyduğun belge açık metin, kilitli kasa ise şifreli metin. Benzetme şurada biter: kasayı arkadaşına yollarken kombinasyonu telefonda söyleyebilirsin, ağda ise o telefon hattı da saldırganın dinlediği hat.
Bir şemayı kırmanın üç ayrı zemini var. En zayıfı yalnızca şifreli metin saldırısı: saldırganın elinde sadece ciphertext var ve iki yolu kalıyor. Anahtar uzayını baştan sona taramak, ya da metnin istatistiğini çözümlemek. Bilinen açık metin saldırısında iş kolaylaşıyor, çünkü saldırgan bazı şifreli metinlerin açık karşılığını da biliyor. Seçilmiş açık metin saldırısında ise istediği metnin şifrelisini elde edebiliyor. Bu en güçlü model ve iyi bir şema ona karşı da dayanmak zorunda.
Bu bölümün konusu olan aile simetrik anahtarlı şifreleme ve tanımı tek cümle: iki taraf aynı anahtarı paylaşıyor. Aynı anahtar hem kilitliyor hem açıyor.
AES bir mesajı değil, bir bloğu şifreliyor
Bugün kullanılan simetrik şifrenin adı AES ve tanımını bilmek bir yanlış anlamayı baştan kesiyor: AES bir mesajı şifrelemiyor, tam olarak 128 bitlik bir bloğu şifreliyor. 16 bayt girer, 16 bayt çıkar. Anahtar 128, 192 ya da 256 bit olabiliyor ve uzunluk tek bir şeyi değiştiriyor — kaç tur döneceğini: sırasıyla 10, 12 ve 14 tur.
Her tur aynı dört adımı tekrarlıyor: bayt değiştirme, satır kaydırma, sütun karıştırma ve tur anahtarını ekleme. Üçü karıştırıyor, dördüncüsü anahtarı işin içine sokuyor. Fikir Shannon’ın koyduğu iki ölçüte dayanıyor — karıştırma, açık metnin her bitinin çıktının her bitini etkilemesi; yayma, anahtar ile şifreli metin arasındaki ilişkinin istatistiksel olarak izlenemez olması. Tek bir turda ikisi de zayıf; on turda pratikte imkânsız.
Ama senin isteğin 16 bayt değil. Uzun bir mesajı bloklara bölüp her birini ayrı ayrı şifrelemek gerekiyor ve bunun nasıl yapılacağı ayrı bir karar. Kararın adı çalışma kipi ve şifrenin kendisi kadar önemli.
Tablodaki XOR, iki biti karşılaştıran en basit işlem: ikisi farklıysa 1, aynıysa 0 veriyor. Aynı değerle iki kez uygulandığında ilk hâline dönmesi, onu şifrelemenin vazgeçilmez aleti yapıyor.
| kip | nasıl çalışıyor | sorunu / gücü |
|---|---|---|
ECB | her blok bağımsız şifrelenir | aynı açık blok hep aynı şifreli bloğu verir — desen sızar |
CBC | her blok, önceki şifreli blokla XOR’lanıp şifrelenir | deseni kırar; sıralı çalışır, paralelleşmez |
CTR | bir sayaç şifrelenip açık metinle XOR’lanır | blok şifreyi akış şifresine çevirir; paralelleşir |
GCM | CTR + bütünlük etiketi | hem gizler hem kurcalanmayı yakalar |
ECB’nin kusuru soyut değil, gözle görülür. Bir görüntü dosyasını ECB ile şifrelersen aynı renkteki bölgeler aynı şifreli bloğa dönüşür ve resmin hatları şifreli çıktıda okunmaya devam eder. Şifreleme yapıldı, ama içerik hâlâ tanınıyor. Bu yüzden ECB pratikte hiçbir yerde kullanılmıyor.
CBC ile CTR’nin ortak şartı ise bir sayı: her mesajda yeni bir başlangıç değeri. CBC’de adı başlangıç vektörü (IV), CTR’de sayacın başlangıcı (nonce). İkisi de gizli olmak zorunda değil, ama tekrarlanmamak zorunda. CTR kipinde aynı sayacı iki farklı mesaj için kullanırsan iki şifreli metnin XOR’u iki açık metnin XOR’unu verir; anahtar hiç kırılmadan içerik açığa çıkar. Kriptografide en sık yapılan uygulama hatalarından biri tam olarak budur.
Son satır bugünün varsayılanı ve bir eksiği kapatıyor: şifreleme tek başına kurcalamayı engellemiyor. CTR kipinde şifreli metindeki bir biti çeviren saldırgan, açık metindeki karşılık gelen biti de çevirmiş oluyor — anahtarı hiç bilmeden. GCM bunun üstüne bir doğrulama etiketi ekliyor ve alıcı etiketi tutmayan mesajı hiç çözmüyor. Aynı anda gizlilik ve bütünlük veren bu aileye AEAD deniyor. TLS 1.3’ün eski şifre takımlarını tümden atmasının sebebi de bu: artık yalnızca AEAD kabul ediliyor.
Tanımın açıkta bıraktığı şeyin de bir adı var: anahtar dağıtımı. İki taraf o anahtar değerinde nasıl anlaşacak?
Ev ağında bu sorunun cevabı elden veriliyor. WPA2 ve WPA3’ün kişisel kipinde parolayı cihaza sen yazıyorsun; değer ağdan hiç geçmiyor. Katılım sırasında telde dolaşan şey de parola değil, ondan türetilen taze bir AES anahtarı; o türetmenin adımlarını 29. bölümde açacağım. Uzaktaki bir sunucu için cevabı 9. bölüme bırakıyorum; önce anahtarın kendisini tanımak gerekiyor.
Anahtar kısaysa akıl gerekmiyor
Standartlaşan ilk simetrik şema DES oldu: 1993 tarihli, NIST kaynaklı bir ABD şifreleme standardı. 56 bitlik bir anahtar kullanıyor ve girdiyi 64 bitlik açık metin blokları halinde alıyor.
DES bir blok şifresi, ve blok şifreleri çıplak kullanılmıyor. Etraflarına bir kip sarılıyor; DES’te bu, şifreli blok zincirleme (cipher block chaining). Kipin işi şu: aynı açık metin bloğu her seferinde aynı şifreli çıktıyı vermesin diye her blok bir öncekine bağlanıyor. Bu, şifreleme algoritmasının kendisi değil; onun etrafındaki kullanım kuralı.
DES Challenge’da 56 bit anahtarla şifrelenmiş bir ifade, kaba kuvvetle bir günden kısa sürede çözüldü. Bilinen iyi bir analitik saldırı yoktu. Şemayı düşüren şey zekâ değil, anahtarın kısalığıydı.

Ayakta tutma çabası 3DES oldu: üç farklı anahtarla üç kez şifreleme. Kalıcı cevap Kasım 2001’de geldi. NIST’in yeni simetrik anahtar standardı AES DES’in yerini aldı ve bugün hâlâ orada. AES veriyi 128 bitlik bloklar halinde işliyor, yani tek seferde 16 bayt. Anahtar 128, 192 ya da 256 bit olabiliyor; blok boyu sabit kalıyor, değişen anahtar. Bir HTTP isteğinin ilk satırı bile birden çok bloğa yayılıyor.
Ölçek farkı düz metinde kayboluyor, o yüzden yan yana koymak gerekiyor:
| DES | AES | |
|---|---|---|
| Standart | 1993 | Kasım 2001 |
| Anahtar | 56 bit | 128, 192 ya da 256 bit |
| Blok | 64 bit | 128 bit (16 bayt) |
| Anahtar uzayı | 2^56, yaklaşık 72 katrilyon | 2^128 |
| Tüm anahtarları denemek | 1 saniye varsayarsak | 149 trilyon yıl |
Alt satır bu tablonun en sert yeri. Aynı kaba kuvvet donanımı DES anahtar uzayını 1 saniyede tarıyorsa, AES’in en kısa anahtarında 149 trilyon yıl harcıyor. Arada 2^72 kat var.
Aynı anahtarla kaç kayıt gönderebilirsin?
Anahtarın uzunluğu tek başına yetmiyor. Aynı anahtarın ne kadar iş görebileceğini üç kural sınırlıyor.
İlk kural anahtarı işlere bölmek. Aynı anahtarı birden çok kriptografik işlev için kullanmak kötü kabul ediliyor, o yüzden şifreleme ile mesaj kimlik doğrulama kodu (MAC) TLS 1.2 ve öncesinde ayrı anahtarlar kullanıyordu: dört anahtar türetiliyordu, iki yönün her biri için birer şifreleme ve birer MAC anahtarı. TLS 1.3’te ayrı MAC anahtarı yok: şifreleme ile doğrulama tek AEAD algoritmasında birleştiği için bölme başka eksende yapılıyor, yön başına ve evre başına ayrı anahtar.
İkinci kural aynı girdiyi aynı anahtarla iki kez şifrelememek. Bunun aracı nonce, yani ömür boyu yalnızca bir kez kullanılan sayı. Tekrar oynatma (playback) saldırısını kıran şey bu. Kaydedilip sonra yeniden gönderilen bir mesaj, yeni nonce’a cevap veremiyor.
TLS 1.3’te kayıt koruması AEAD ile yapılıyor ve AEAD dört girdi alıyor: tek bir anahtar, bir nonce, açık metin, ve kimlik doğrulamaya dahil edilecek ek veri. TLS’te ek veri kaydın başlığı. Nonce ise elle seçilmiyor. Kaydın 64 bitlik sıra numarası ağ bayt sırasında kodlanıyor, sola sıfırla dolduruluyor ve o yönün statik IV’siyle XOR’lanıyor. Sıra numarası okuma ve yazma için ayrı tutuluyor, her kayıttan sonra bir artıyor, anahtar değişiminde sıfırlanıyor. Bir trafik anahtarıyla gönderilen ilk kayıt 0 numarasını kullanmak zorunda. Böylece aynı anahtar altında iki kayıt asla aynı nonce’u görmüyor.
Üçüncü kural anahtarı zamanında bırakmak. AES-GCM ile tek bir bağlantıda yaklaşık 24 milyon tam boy kayıt şifrelenebiliyor; sonrasında anahtarın tazelenmesi gerekiyor. Bir anahtarın ömrü saatle ölçülmüyor, kayıt sayacıyla ölçülüyor.
TLS’in gizlilik vaadi dürüst ve sınırını da söylüyor. Kanal kurulduktan sonra gönderilen veri yalnızca uçlara görünüyor, ama uzunluk gizlenmiyor. İsteğinin kaç bayt olduğu dışarıdan sayılabiliyor; bulanıklaştırmak isteyen kayıtlara dolgu ekliyor.
Bütün bunları kendi makinende görebilirsin. Bir terminalde sudo tcpdump -n -A -i any 'tcp port 80 or tcp port 443' çalıştır, başka bir terminalde aynı sayfayı iki kez iste: önce curl http://example.com/, sonra curl https://example.com/. İlk çıktıda istek satırı ekranda düz okunuyor. İkincisinde yalnızca kayıt başlıkları görünüyor, gerisi anahtarın altında.
Özet
Peki, ne öğrendik?
- Güvenlik dört ayrı vaat: gizlilik, kimlik doğrulama, mesaj bütünlüğü ve erişilebilirlik. Şifreleme bunlardan yalnızca ilkini veriyor.
- Korumasızlık varsayılan: sade bir sokete yazılan parola telde düz metin gidiyor, ve yanından geçen paketleri okumak için karışık moda alınmış bir arayüz yetiyor.
- Şemayı düşüren şey çoğu zaman algoritma değil, anahtarın kısalığı: DES’i bitiren analitik bir buluş değildi, 56 bitlik uzayın taranabilir olmasıydı.
- Anahtarın bir kullanım bütçesi var: her kayıt nonce’unu sıra numarasından türetiyor ve tek bağlantıda şifrelenebilecek kayıt sayısının bir tavanı bulunuyor.
Şifrelemenin gücü artık elinde ve nereden geldiğini biliyorsun. Bu bölüm boyunca iki tarafın aynı anahtarı bildiğini varsaydım. Şifreleme var, ama anahtarı karşı tarafa nasıl ulaştıracaksın?
Bölüm 9: Açık Anahtarlı Kriptografi
Şifreleme kuruldu, anahtar hazır. Ama o anahtarı hiç tanışmadığın bir sunucuya nasıl ulaştıracaksın?
Ulaştırmayacaksın: iki taraf hiç tanışmadan, açıkta konuşarak ortak bir sırra varabiliyor.
İki anahtar, biri herkesin gözü önünde
Simetrik şifrelemenin şartı tekti: tek gizli anahtar, iki yön, ve o anahtarı iki tarafın da önceden bilmesi. Şart tam burada patlıyor. Tarayıcın bir sunucuya ilk kez bağlanıyor ve ortada paylaşılmış hiçbir sır yok.
Açık anahtarlı kriptografi anahtarı ikiye ayırıyor. Açık anahtar şifreler; sunucu onu isteyen herkese verir. Özel anahtar çözer, yalnızca alıcıda durur ve hiçbir zaman hatta çıkmaz. Sana kilit veriliyor, anahtar verilmiyor.
Kasa hâlâ ortada duruyor ama artık iki ayrı kombinasyonu var: biri yalnızca kilitliyor, öteki yalnızca açıyor. Kilitleyen kombinasyonu herkese dağıtabilirsin, kasanın içi yine de güvende kalır. Benzetme şurada biter: gerçek bir kasada aynı kombinasyon hem kilitler hem açar, burada iki yön matematiksel olarak birbirinden ayrılmıştır.
Şemanın iki şartı var. Birincisi, iki anahtar birbirini geri almalı: açık anahtarla şifrelenen mesajı özel anahtar aynen açmalı. İkincisi, açık anahtardan özel anahtarı hesaplamak pratikte imkânsız olmalı.
Fikir iki çalışmayla yayımlandı: 1976’da Diffie-Hellman, 1978’de RSA. Aynı fikir kabaca aynı yıllarda Birleşik Krallık’ta da doğmuştu, ama orada gizli tutuldu. İki bin yıldır yalnızca tek anahtarla yürüyen bir alan birkaç yılda ikiye ayrıldı.
Bunun nerede çalıştığını görmek için uzağa gitmen gerekmiyor. Tarayıcın iyi bilinen port numaralarından birine, 443’e bağlanırken de aynı iki anahtar devreye giriyor. Uzak bir makineye kabuk açtığında da öyle. Fark protokolde, fikirde değil.
RSA tek bir işlemin üstünde duruyor
Her bit dizisi tek bir tam sayıya karşılık gelir. Bir mesajı şifrelemek bu yüzden bir sayıyı şifrelemekle aynı şeydir. RSA’nın kullandığı işlem de tek: x mod n, yani x’in n’e bölümünden kalan.
Ad, üç yazarının baş harflerinden geliyor: Rivest, Shamir, Adleman. Anahtar üretimi beş adımda bitiyor. Gerçekte asallar 1024 bit uzunluğunda seçilir; burada elle takip edebilmen için ikisini küçük tuttum.
1. p = 11, q = 13 iki asal seçilir
2. n = 143 n = p · q
z = 120 z = (p-1)(q-1)
3. e = 7 7 ile 120'nin ortak böleni yok
4. d = 103 7 · 103 = 721, 721 mod 120 = 1
5. açık anahtar (143, 7) özel anahtar (143, 103)Modül iki anahtarda da ortak; ayıran şey üs. Şifreleme ile çözme aynı kalıbı iki kez uyguluyor:
şifreleme: c = m^e mod n -> 9^7 mod 143 = 48
çözme: m = c^d mod n -> 48^103 mod 143 = 9Dokuzun yedinci kuvveti 4782969 ediyor ve 143’e bölündüğünde kalan 48. Şifreleme yalnızca n’den küçük m için tanımlı; uzun veri bu yüzden bloklara ayrılıyor.
Güvenlik tek bir varsayıma dayanıyor: büyük bir sayıyı çarpanlarına ayırmak zordur. Özel anahtarı bulmak, n’yi p ile q’ya ayırmakla aynı iştir. 143’ü kafadan çarpanlarına ayırırsın; 2048 bitlik bir n için aynı işi yapan pratik bir yöntem yok.
İkinci özellik daha az bilinir ve bu bölümün sonunu belirler: sıra değiştirilebilir. Önce açık sonra özel anahtar uygulamak da, önce özel sonra açık anahtar uygulamak da mesajı aynen geri verir. İmzanın dayanağı bu simetri.
Bir de bedel var. Üs alma hesap açısından pahalı ve simetrik şifreleme aynı işi en az yüz kat hızlı yapıyor. Bu yüzden açık anahtar veriyi şifrelemek için kullanılmıyor. İkinci bir anahtarı, oturum anahtarını kurmak için kullanılıyor; veriyi o simetrik anahtar şifreliyor.
Açıkta konuşup aynı sayıda buluşmak
Diffie-Hellman anahtar uzlaşması ayrı bir algoritmadır ve bir şifreleme yöntemi değildir. Mesaj taşımaz. Yaptığı tek iş, iki tarafın ortak bir sayıda buluşmasını sağlamak.
Açık değerler büyük bir asal p ve p’den küçük bir taban g. İkisi de herkese açık. Her taraf kendi gizli sayısını bağımsız seçiyor, g’nin o kuvvetini p modülünde hesaplıyor ve çıkan değeri hatta gönderiyor.
açık değerler: p = 97, g = 5
sen gizli 17 -> 5^17 mod 97 = 83 (hatta 83 gider)
karşı gizli 29 -> 5^29 mod 97 = 74 (hatta 74 gider)
sen 74^17 mod 97 = 29
karşı 83^29 mod 97 = 29Aynı sayıya iki ucun ayrı ayrı nasıl vardığını adım adım izleyelim:
p ve ondan küçük bir taban g. İkisi de gizli değil; standartta yazılı olabilir, el sıkışmanın içinde açıkça gönderilebilir. Gizlilik bu iki sayıdan gelmiyor.- İki sayı baştan herkese açık. Büyük bir asal
pve ondan küçük bir tabang. İkisi de gizli değil; standartta yazılı olabilir, el sıkışmanın içinde açıkça gönderilebilir. Gizlilik bu iki sayıdan gelmiyor. - Her taraf kendi gizli sayısını seçiyor. Bu iki sayı makinenin dışına hiç çıkmıyor. Karşı taraf bile öğrenmiyor — ve öğrenmesine gerek de yok, bütün numaranın kalbi bu.
- Hatta yalnızca sonuçlar gidiyor. Her taraf
gnin kendi gizli kuvvetinipmodülünde hesaplayıp gönderiyor. Ters işlem — çıkan sayıdan üssü bulmak — ayrık logaritma problemi ve büyükpiçin pratikte çözülemiyor. - İkisi de aynı sayıya varıyor. Her taraf karşıdan gelen değeri kendi gizli üssüyle yeniden yükseltiyor.
(g^a)^bile(g^b)^aaynı şey olduğu için sonuç eşit çıkıyor. Ortak sır hiç gönderilmedi, iki yerde ayrı ayrı üretildi. - Dinleyen her mesajı gördü ve sonuca varamadı. Hattı baştan sona kaydeden biri dört sayının hepsine sahip. Eksik olan tek şey gizli üslerden biri, ve onu elindeki sayılardan hesaplamak ayrık logaritma almak demek.
Hattan yalnızca dört sayı geçti: 97, 5, 83 ve 74. Gizli sayılar hiç gönderilmedi. Ortak sır da gönderilmedi; iki taraf onu kendi tarafında ayrı ayrı hesapladı. Dinleyen taraf dört sayıyı da görüyor, sırra varamıyor.
Yukarıdaki dört satırı bir hesap makinesinde tekrarlayabilirsin; sonuç her seferinde aynı çıkar. İki tarafın birbirinden habersiz hesapladığı sayı, aynı sayı. Üç mesajlık el sıkışmanın bir gidiş-dönüş bedeli vardı; bu uzlaşma da onun üstüne biniyor. Bugünün güvenli web bağlantısı anahtar değişimi için Diffie-Hellman’ı zorunlu tutuyor; el sıkışmanın bunu nasıl yürüttüğünü 10. bölümde açacağız.
DerinleşmeKarşıdan gelen açık değer neden ayrıca denetleniyor?
TLS 1.3’ü tanımlayan RFC 8446 hatta giden açık değeri tek satırda yazıyor: gönderilen şey Y = g^X mod p’dir. Aynı bölüm kodlamayı da sabitliyor. Değer, en anlamlı baytı başa yazan (big-endian) bir tam sayı olarak yazılır ve p’nin bayt boyuna kadar soldan sıfırla doldurulur. Doldurma bir süs değil: aynı grupta bütün açık değerlerin aynı uzunlukta olması için. ffdhe2048 grubunda p 2048 bit olduğu için hatta giden tek bir açık değer tam 256 bayt tutuyor.
Grup adları da standartta sabit. Sonlu cisim tarafında ffdhe2048 (onaltılık yazımda 0x0100), ffdhe3072 (0x0101) ve ffdhe4096 (0x0102) var; eliptik eğri tarafında secp256r1 (0x0017), x25519 (0x001D) ve x448 (0x001E). Addaki sayı asalın bit uzunluğudur.
Asıl ders standardın dayattığı denetimde. Taraflar karşıdan gelen Y değerinin 1 < Y < p-1 aralığında olduğunu doğrulamak zorundadır. Sebebi şu: özenle seçilmiş bozuk bir Y, karşı tarafı çok az sayıda olası sonuç barındıran küçük bir altkümeye hapsedebiliyor. Hesap yine doğru çalışıyor, sonuç yine üretiliyor, ama tahmin edilebilir hâle geliyor.
Hangi grupta uzlaşıldığını kendi makinende görebilirsin:
openssl s_client -connect www.rfc-editor.org:443 -tls1_3 </dev/null 2>/dev/null | grep 'Temp Key'Çıkan satır uzlaşılan grubun adını taşır; bugün büyük ihtimalle x25519 göreceksin.
Parmak izinden imzaya
Aynı bedel imzayı da şekillendiriyor. İmza mesajın kendisine değil, özetine atılır. Kriptografik özet fonksiyonu girdinin boyu ne olursa olsun sabit uzunlukta bir çıktı üretir.
MD5 RFC 1321’de tanımlı ve dört adımlı bir süreçte 128 bit üretiyor, yani 16 bayt. SHA-1’in künyesi NIST FIPS PUB 180-1 ve çıktısı 160 bit, yani 20 bayt. Onaltılık yazıldığında ilki 32, ikincisi 40 karakter tutuyor.
Eşleme çoktan-bire. Sonsuz sayıda girdi sonlu sayıda çıktıya düştüğü için çakışma matematiksel olarak kaçınılmaz.
Checksum da sabit uzunlukta bir özet üretiyordu ve o da çoktan-bire bir eşlemeydi. Aradaki fark tek bir şartta. Checksum’da aynı değeri veren ikinci bir mesaj üretmek kolaydır; kriptografik özette, verilen bir özetten onu üreten mesajı bulmak hesap açısından yapılamaz olmalıdır. 16 bitlik bir toplam bu şartı karşılamaz.
Burada gizlilikten ayrı bir hedef devreye giriyor. Mesaj bütünlüğü şifrelemeden gelmiyordu; o boşluğu özet fonksiyonu dolduruyor.
Şimdi sayısal imza. Mesajın özeti gönderenin özel anahtarıyla şifrelenir ve mesajla birlikte gider. Doğrulama üç adımdır: imzayı gönderenin açık anahtarıyla çözersin, eline geçen mesajın özetini kendin hesaplarsın, ikisini karşılaştırırsın. Eşitlerse tek işlemle iki soru birden cevaplanmış olur. İmzayı atan özel anahtarı kullanmıştır ve mesaj yolda değişmemiştir.
Simetrik anahtarla bu kanıt kurulamaz. Anahtar iki taraftadır ve o mesajı ikisi de üretebilirdi. Açık anahtarlı imzada ise alıcı mesajı ve imzayı mahkemeye götürüp imzayı atanın kim olduğunu kanıtlayabilir; buna inkâr edilemezlik deniyor.
Aynı matematik, kimlik doğrulamanın kendisinde de aynen çalışıyor. Karşı taraf sana bir nonce yollar. Sen onu özel anahtarınla şifreleyip geri gönderirsin, o senin açık anahtarınla çözüp aynı sayıyı bulur. Kaydedilmiş eski bir cevabın tekrar oynatılması böyle kesilir.
Ama bir boşluk var. Araya giren biri her iki tarafa da öteki taraf gibi görünürse iki ayrı bağlantı kurar ve ikisini birden okur; buna ortadaki adam saldırısı deniyor. Matematik iki uçta da doğru çalıştı; yanlış olan, anahtarın kime ait olduğuydu.
Aynı boşluk imzada da duruyor. Saldırgan kendi açık anahtarını başkasınınmış gibi sunarsa doğrulama kusursuz çalışır ve yanlış kişiyi doğrular. Yetkili sunucudan dönen kaydın doğruluğunu kanıtlayan şey de bir imzaydı ve o imza aynı boşluğun üstünde duruyor. Bir açık anahtarın gerçekten kime ait olduğunu onaylayan sertifika zincirini 11. bölümde kuracağız.
Özet
Peki, ne öğrendik?
- Açık anahtar ikiye ayrılmış tek bir kimliktir: şifreleyen yarısı herkeste durur, çözen yarısı sahibinden hiç ayrılmaz.
- RSA’nın tamamı tek bir modüler üs alma işlemidir ve güvenliği, büyük bir sayıyı çarpanlarına ayırmanın zorluğuna dayanır.
- Diffie-Hellman bir uzlaşmadır: hatta hiç görünmeyen ortak sırrı iki taraf kendi tarafında ayrı ayrı hesaplar.
- İmza mesajın kendisine değil özetine atılır ve tek doğrulamayla hem imzalayanı hem de mesajın değişmediğini kanıtlar.
Anahtar sorunu çözüldü, imza mekanizması elimizde. Simetrik şifreleme, anahtar uzlaşması ve imza artık ayrı ayrı duruyor; peki gerçek bir bağlantı bunları hangi mesajlarla tek bir kanalda birleştiriyor?
Bölüm 10: TLS El Sıkışması
Simetrik şifreleme, anahtar uzlaşması ve imza ayrı ayrı elinde. Üçünü tek bir kanalda birleştiren şey bir bağlantı.
Kilit o kanalda kuruluyor ve birkaç mesaja sığıyor. Peki el sıkışma tam olarak neyi pazarlıyor?
Kilit tam olarak nereye takılıyor?
Kilit taşıma katmanının içine takılmıyor. Uygulama bir TLS kitaplığı çağırıyor, kitaplık da TCP’yi çağırıyor; sıra tam olarak bu ve tersi değil. TCP’nin kendisi hiç değişmiyor: aynı sıra numaraları, aynı pencere, aynı bayraklar. Değişen tek şey, sokete düz yazdığın metnin ağa şifreli çıkması.
Bunun pratik karşılığı 443 numaralı port. Kilitli web trafiği oradan geçiyor ama o port sıradan bir port; yol üstündeki yönlendiriciler orada özel hiçbir iş yapmıyor. Şifrelemeyi iki uç kendi arasında hallediyor. Kitaplık web’e özel de değil: isim sorgusunu gizleyen DoH ve DoT da altında aynı kilidi taşıyor.
Kilidin verdiği söz üç parçalı. Gizlilik simetrik şifrelemeden geliyor. Bütünlük kriptografik özetlemeden, kimlik doğrulama ise açık anahtar kriptografisinden. Üçü ayrı ayrı gerekiyor, çünkü şifreleme tek başına kurcalamayı engellemiyor. Okuyamayan biri de bitleri karıştırabilir; kilitli bir kutuyu açamadan sallamaya benziyor.
Kilitsiz HTTP bu üç sözden hiçbirini vermiyor. Hat dinlemeye de ortadaki adam saldırısına da açık. Amaç, dürüst olması beklenmeyen bir ağın üstünde dürüst bir kanal kurmak. Adı hâlâ SSL diye anılan eski protokol 2015’te kullanımdan kaldırıldı; bugünkü sürüm TLS 1.3 ve künyesi RFC 8446.
Tek gidiş-dönüş nasıl mümkün oldu?
El sıkışmanın dört işi var ve dördü de birkaç mesajın içine sığıyor: sürüm pazarlığı yapmak, kriptografik algoritmaları seçmek, karşı tarafı doğrulamak ve ortak anahtar malzemesi kurmak. Bunlar üç evreye dağılmış: Key Exchange, Server Parameters, Authentication. İlk evre bittikten sonra geriye kalan her şeyi şifreli akarken göreceksin; sunucunun sertifikası bile açıkta gitmiyor.
İlk mesaj ClientHello. İçinde 32 bayt uzunluğunda bir rastgele değer, önerilen protokol sürümleri, simetrik şifre ile anahtar türetme işlevinin (HKDF) özet çiftlerinden oluşan liste ve key_share uzantısında bir dizi Diffie-Hellman anahtar payı duruyor. Sürüm alanına ayrıca bak, çünkü tuhaf görünüyor. Adı legacy_version ve içine 0x0303, yani TLS 1.2 yazılıyor; gerçek sürüm ise supported_versions uzantısında 0x0304 olarak duruyor. Sebebi uyumluluk: yol üstündeki eski kutular tanımadıkları bir sürüm numarası görünce bağlantıyı düşürüyordu.
Bir gidiş-dönüşü kurtaran hileyi de burada göreceksin. İstemci sunucunun hangi grubu seçeceğini tahmin ediyor ve anahtar payını daha ilk mesajda gönderiyor. Sunucu kabul ederse ortak sır ikinci mesajda zaten hesaplanabilir hâle geliyor. Tahmin tutmazsa sunucu HelloRetryRequest yolluyor, istemci el sıkışmayı doğru grupla baştan kuruyor ve bir gidiş-dönüş daha ödüyor. El sıkışma özeti sıfırlanmıyor: ilk alışveriş de özete giriyor.
istemci -> sunucu ClientHello random 32 bayt, key_share, supported_versions
sunucu -> istemci ServerHello seçilen takım, sunucunun key_share'i
EncryptedExtensions <-- buradan sonrası şifreli
Certificate
CertificateVerify
Finished
istemci -> sunucu Finished
[uygulama verisi]El sıkışmanın hangi mesajında neyin kararlaştığını sırayla görelim:
ClientHello yalnızca "merhaba" demiyor: desteklediği şifre takımlarını, gerçek sürüm numarasını ve key_share uzantısında bir Diffie-Hellman anahtar payını da taşıyor. Bu pay bir tahmin — sunucunun hangi grubu seçeceği henüz bilinmiyor.- İstemci selamla birlikte bir tahmin yolluyor.
ClientHelloyalnızca "merhaba" demiyor: desteklediği şifre takımlarını, gerçek sürüm numarasını vekey_shareuzantısında bir Diffie-Hellman anahtar payını da taşıyor. Bu pay bir tahmin — sunucunun hangi grubu seçeceği henüz bilinmiyor. - Tahmin tuttuysa ortak sır ikinci mesajda hazır.
ServerHelloseçilen takımı ve sunucunun kendi payını getiriyor. İki pay birleşince ortak sır her iki tarafta hesaplanabilir hâle geliyor. Tahmin tutmazsa sunucu geri çeviriyor ve bir gidiş-dönüş daha ödeniyor. - Buradan sonrası şifreli. Sunucunun geri kalan mesajları el sıkışma trafik anahtarlarıyla korunuyor. Sertifika bile açıkta gitmiyor — yol üstünde dinleyen biri hangi siteye bağlandığını sertifikadan okuyamıyor.
- İki taraf da el sıkışmayı mühürlüyor.
Finishedmesajı o ana kadar geçen bütün mesajların özetini taşıyor. Yolda tek bir alan değiştirilmiş olsa özet tutmaz ve bağlantı kesilir. Pazarlığı geriye çekmeye çalışan bir saldırgan tam burada yakalanıyor. - Fatura: bir gidiş-dönüş. Uygulama verisi üçüncü mesajdan sonra akabiliyor. Bunun altında bir de taşıma el sıkışmasının turu var; ilk bayt gitmeden önce toplam iki gidiş-dönüş ödeniyor. Aynı iş TLS 1.2 üstünde üç tur alıyordu.
Dökümde ServerHello satırına bak: seçilen şifre takımını ve sunucunun kendi payını taşıyor. Hemen ardından gelen EncryptedExtensions, sunucu el sıkışma trafik sırrından türeyen anahtarlarla korunan ilk mesaj. Finished ise doğrulama bloğunun sonuncusu: el sıkışmanın bütünlüğünü ve hesaplanan anahtarların doğruluğunu mühürlüyor. İçeriği yanlış çıkarsa bağlantı decrypt_error uyarısıyla kesiliyor; el sıkışmaya karışan bir kutu varsa tam burada yakalanıyor.
Sertifikayı burada yalnızca sunucunun gönderdiği imzalı belge olarak alıp geçiyorum. Onu kimin imzaladığını ve o imzaya neden güvenildiğini, sertifika zincirini kuran 11. bölümde açacağım.
SYN ve SYN-ACK ile ödediğin bir gidiş-dönüş vardı; kripto el sıkışması onun üstüne bir tane daha koyuyor. Yani ilk uygulama baytın yola çıkmadan önce iki gidiş-dönüş ödemiş oluyorsun. Naif bir tasarımda ya da TLS 1.2 üstünde bu üç gidiş-dönüştü.
Beş takım, iki karar
Şifre takımına baktığında artık yalnızca iki şey göreceksin: kayıtları koruyan AEAD algoritması ve HKDF ile kullanılacak özet algoritması. Anahtar değişimi ile imza algoritması takımın dışına, ayrı uzantılara çıkarıldı. Adlandırma kalıbı bu yüzden sade: TLS_AEAD_HASH.
| Takım | Durum |
|---|---|
| TLS_AES_128_GCM_SHA256 | zorunlu |
| TLS_AES_256_GCM_SHA384 | önerilen |
| TLS_CHACHA20_POLY1305_SHA256 | önerilen |
| TLS_AES_128_CCM_SHA256 | tanımlı |
| TLS_AES_128_CCM_8_SHA256 | tanımlı |
Takım adındaki sayı anahtar uzunluğunu veriyor: ilk satırda 128 bit, ikincisinde 256 bit. Seçenek sayısı bir önceki sürümdeki 37’den 5’e indi ve bu sadeleşmeyi kasıtlı bir güvenlik kararı olarak oku; az seçenek, az yanlış yapılandırma anlamına geliyor.
İkinci karar daha sert çıkıyor: RSA ile anahtar taşıma seçeneği tamamen kaldırıldı ve anahtar değişimi için Diffie-Hellman zorunlu hâle geldi. Bunun sonucuna ileri gizlilik deniyor. Sunucunun uzun ömürlü özel anahtarı sonradan ele geçse bile eski oturumlar açılamıyor, çünkü o oturumların anahtarı hiç telden geçmedi. Matematiğini az önce kurduğun Diffie-Hellman anahtar uzlaşması, protokolde tam olarak burada işe koşuluyor.
Veri korumasında da şifreleme ile doğrulama tek algoritmada birleşti. Eskiden bunları arka arkaya iki ayrı adımda yapıyordun ve sıralamayı yanlış kurmak koca bir saldırı sınıfı üretiyordu.
Anahtarların kendisini kimse elle seçmiyor. Anahtar takvimini HKDF-Extract ve HKDF-Expand üstüne kurmuşlar. Türetme etiketleri tls13 önekiyle başlıyor. Her türetmeye o ana kadarki bütün el sıkışma mesajlarının özeti giriyor. Yani anahtar, konuşmanın kendisine bağlı kalıyor. Ortak sırrı da doğrudan kullanmıyorlar. Ondan yön başına ve evre başına ayrı anahtarlar çıkıyor. Simetrik şifrelemenin anahtarını işlere bölme kuralı vardı; HKDF takvimi tam olarak onu uyguluyor.
DerinleşmeKuantum sonrası anahtar değişimi el sıkışmaya kaç bayt ekliyor?
Melez anahtar uzlaşması RFC 10024 ile standartlaştı. Tanımı sade: birden çok anahtar değişim algoritması aynı anda çalışıyor ve çıktıları birleştiriliyor, bileşenlerden en az biri sağlam kaldığı sürece sonuç güvenli sayılıyor. Bugünkü melezler ML-KEM ile geçici eliptik eğri Diffie-Hellman’ı birleştiriyor.
Üç grup tanımlı. X25519MLKEM768 kayıt değeri 4588 ile önerilen olan, SecP256r1MLKEM768 4587, SecP384r1MLKEM1024 4589. Standart öncesi deneysel kod noktaları aynı belgeyle geçersiz ilan edildi.
Fatura şurada. X25519MLKEM768 seçildiğinde istemcinin anahtar payı 1.216 bayt: 1.184 bayt ML-KEM kapsülleme anahtarı ve 32 bayt X25519. Sunucunun payı 1.120 bayt ve içinde 1.088 baytlık ML-KEM şifreli metni var. Ortaya çıkan ortak sır 64 bayt. NIST eğrisiyle kurulan SecP256r1MLKEM768 grubunda istemci payı 1.249 bayt.
Düz X25519 payı ise yalnızca 32 bayt. Aradaki fark istemci yönünde 1.184 bayt, sunucu yönünde 1.088 bayt; el sıkışma başına 2.272 bayt ek yük.
Bu yükün neden hissedildiğini görmek için tek bir hesap yetiyor. Bir çerçevenin taşıyabileceği Ethernet yükü 1.500 bayt. Ondan 20 bayt IPv4 ve 20 bayt TCP başlığı düşünce geriye 1.460 bayt kalıyor. 1.216 baytlık anahtar payı bunun %83’ünü dolduruyor ve ClientHello mesajının geri kalanına 244 bayt yer bırakıyor.
Boyut büyüyünce doğrulama da zorunlu hâle geliyor: sunucu istemcinin kapsülleme anahtarını denetlemek, geçersizse bağlantıyı illegal_parameter uyarısıyla kesmek zorunda. İstemci de şifreli metnin uzunluğunun seçilen gruba uyduğunu doğruluyor.
Kayıtlara bölmek, kapanışı ilan etmek
El sıkışma bitince iş kayıt katmanına kalıyor. Kayıt katmanı dört içerik türü tanıyor: handshake, application_data, alert ve yalnızca eski yazılımlarla uyum için duran change_cipher_spec. Böylece birden çok üst protokol aynı kayıt katmanını paylaşabiliyor.
Veri en fazla 16.384 baytlık parçalara bölünüyor ve her parça kendi bütünlük etiketini taşıyor. Bölmenin sebebi şu: alıcı bağlantının kapanmasını beklemeden her kaydı geldiği anda doğrulayıp kullanabiliyor.
Kapanış da protokolün içinde. Saldırgan sahte bir TCP kapatma parçası üretirse taraflardan biri veriyi olduğundan kısa sanır; buna kesme saldırısı deniyor. Çözüm kapanışa ayrı bir kayıt türü vermek; o tür de bütünlük hesabına giriyor. Her taraf yazma yönünü kapatmadan önce close_notify göndermek zorunda, ve o uyarıdan sonra gelen veri yok sayılıyor. Taşımanın FIN’i tek başına yeterli kanıt sayılmıyor.
İkinci ziyaret daha ucuz. İlk el sıkışma bittikten sonra sunucu NewSessionTicket ile istemciye bir PSK kimliği veriyor; istemci sonraki el sıkışmada pre_shared_key uzantısıyla o kimliği sunuyor. Sunucu kabul ederse yeni bağlantı kriptografik olarak eskisine bağlanıyor ve tam el sıkışma yerine eski anahtardan başlanıyor. Sunucu PSK ile doğrulandığı için Certificate ve CertificateVerify mesajlarını hiç göndermiyor.
Eski sürümlerdeki oturum kimliği ve oturum bileti mekanizmalarının ikisi de kaldırıldı; yerlerini önceden paylaşılan anahtar aldı. Ama PSK tek başına kullanılırsa uygulama verisi için ileri gizlilik kayboluyor. Bu yüzden istemci PSK sunarken key_share da gönderiyor: hem tazelik gelsin, hem de sunucu sürdürmeyi reddedip tam el sıkışmaya düşebilsin diye.
Paylaşılan anahtar varsa istemci daha ileri gidebiliyor. İlk mesaj demetinde early_data uzantısıyla birlikte şifrelenmiş bir HTTP isteği gidiyor ve el sıkışma gecikmesi sıfıra iniyor. Bedeli de var. Erken veri yalnızca sunulan PSK’dan türeyen anahtarlarla korunuyor, yani ileri gizliliği yok. Kaydedilip sonradan aynen tekrar oynatılabiliyor da.
DerinleşmeSıfır gidiş-dönüşlü veri neden tekrar oynatma saldırısına açık?
Bu zayıflık standart metninde açıkça sayılıyor. Tekrar oynatma korumasının nereden geldiğine bakınca sebebi de görünüyor. Sıradan veri, sunucunun ServerHello içinde ürettiği rastgele değerden türeyen anahtarlarla korunuyor; kaydedilmiş bir kayıt ikinci bir oturumda anlamını yitiriyor. Erken veri ise sunucu daha tek kelime etmeden yazılıyor. O demeti kaydeden biri, aylar sonra aynı baytları aynı sunucuya yeniden sunabiliyor ve sunucu bunu ilk gelişinden ayıramıyor.
Standart bir savunma dayatıyor ama sınırını da söylüyor: sunucunun her örneği aynı erken el sıkışmayı en fazla bir kez kabul etmek zorunda. Bu, tekrar oynatma sayısını sunucu örneği sayısıyla sınırlıyor, sıfıra indirmiyor. Yöntemlerden ikisi tek kullanımlık bilet vermek ve yakın zamanda görülen ClientHello mesajlarını kaydedip yinelenenleri reddetmek.
İstemci sunucunun hangisini uyguladığını bilemiyor. Tarayıcının sınırı buradan geliyor: erken veriye yalnızca sunucu durumunu değiştirmeyen okuma istekleri konuyor.
Çok bölgeli bir kurulumda ayrı bir tuzak var. Saldırgan aynı ClientHello ile erken veriyi iki bölgeye birden gönderirse birinde sıfır gidiş-dönüşlü kip kabul edilir, diğerinde tam el sıkışmaya zorlanır. İstemci isteği yeniden denediğinde iş sistem genelinde iki kez yapılmış olur.
Bütün bunlar kendi makinende görünür hâle gelebiliyor. openssl s_client -connect ornek-site.test:443 -tls1_3 çıktısında Protocol, Cipher ve Server Temp Key satırlarına bak; sırasıyla pazarlıkla seçilen sürümü, şifre takımını ve anahtar uzlaşma grubunu gösteriyorlar. Kendi sunucunu belgeleme için ayrılmış 203.0.113.10 adresinde dinletiyorsan hedefi doğrudan o sayıyla da verebilirsin.
Özet
Peki, ne öğrendik?
- Kilit uygulama katmanında kuruluyor: TCP hiç değişmiyor, sokete düz yazılan metin ağa şifreli çıkıyor ve varsayılan port 443.
- El sıkışma tek gidiş-dönüşe bir tahminle sığıyor: istemci grubu önceden seçip anahtar payını ilk mesajda gönderiyor, tutmazsa
HelloRetryRequestbir tur daha yazıyor.- Şifre takımı artık yalnızca AEAD ile özet algoritmasını seçiyor: anahtar değişimi ile imza dışarı çıktı, seçenek 37’den 5’e indi ve Diffie-Hellman zorunlu oldu.
- Kayıt katmanı akışı parçalara bölüyor: her kayıt kendi başına doğrulanıyor ve kapanış
close_notifyile ilan ediliyor.
Kanal artık okunamıyor, kurcalanamıyor ve kapanışı bile sahtelenemiyor. Kilit kuruldu; ama kilidi karşı tarafla kurduğunu nereden biliyorsun?
Bölüm 11: Sertifika Zinciri
Kilit kuruldu, anahtar iki uçta hazır. Oturum anahtarını üreten el sıkışmayı izlerken bir cümleyi kasten hızlı geçtim: sunucunun sertifikası doğrulandı.
Perdeyi kaldırıyorum. Karşı tarafın gerçekten o olduğunu söyleyen şey anahtar değil, bir imza zinciri. Peki o zincirin ucu nerede duruyor?
Bir imza neyi mühürlüyor?
Sertifika tek bir iş yapan bir belge. Bir açık anahtarı belirli bir varlığa bağlıyor. O varlık bir kişi olabilir, bir web sitesi olabilir, kenardaki bir yönlendirici olabilir. Belgeyi üreten taraf anahtarın sahibi değildir; bağı kuran şey bir sertifika otoritesi. Sıra şöyle işliyor. Varlık açık anahtarını otoriteye kaydettirir ve kimliğinin kanıtını sunar. Otorite o kimliği anahtara bağlayan belgeyi üretir, sonra belgeyi kendi özel anahtarıyla imzalar.
Doğrulama ters yönde çalışıyor. Okuyan taraf otoritenin açık anahtarını sertifikaya uyguluyor ve içindeki açık anahtar ortaya çıkıyor. Kazancı da tam burada görüyorsun. Hiç tanımadığın bir sunucunun anahtarına güvenmek için tek bir anahtara, otoritenin anahtarına güvenmen yetiyor. Kasa benzetmesi hâlâ iş görüyor ama tek başına yetmiyor. Sağlam bir kilit, arkasında kimin durduğunu söylemez.
İmza belgenin tamamına değil, sabit boyutlu özetine atılıyor ve sebebi maliyet: uzun bir metni doğrudan açık anahtarla şifrelemek pahalı. Sayısal imza, özet fonksiyonunun geri döndürülemez olmasını şart koşuyordu; sertifikada işe yarayan tam olarak o şart. Bugünkü el sıkışma MD5 ile SHA-1’i bıraktı, SHA-256 kullanıyor.
Doğrulama tuttuğunda üç şeyi birden öğreniyorsun. Belgeyi sahibi imzaladı, başkası imzalamadı, imzalanan şey de elindeki metnin ta kendisi.
Ortadaki adam saldırısında matematik doğru çalışıyordu; yanlış olan, açık anahtarın sahibiydi. Sertifikanın kapattığı boşluk tam olarak bu. Aynı boşluk isim çözümlemesinde de vardı: yetkili sunucudan dönen kayıt, kim tarafından yazıldığına dair hiçbir kanıt taşımıyordu.
Sertifikayı göstermek bile yetmiyor. Sunucu onu telde açıkça yolluyor ve kopyalanması kimseyi zorlamaz. Bu yüzden sunucu bir mesaj daha gönderiyor: CertificateVerify. O mesajda el sıkışmanın o ana kadarki tamamını, sertifikanın özel anahtarıyla imzalıyor. Kopyalanmış sertifika bu adımı geçemez.
Bu kanıt tek yönlü isteniyor. Sunucunun sertifikası var, senin çoğunlukla yok. İnternette kimlik iki biçimde kuruluyor: ad ile parola, ya da ad ile açık anahtar sertifikası. Sunucu ikincisini kullanıyor, sen birincisini.
Zincirin ucunu kim koyuyor?
Sunucunun gönderdiği şey tek bir sertifika değil; sıralı bir liste. Yaprak sertifika ilk sırada olmak zorunda. Sonraki her sertifika bir öncekini doğrudan imzalamış olmalı.
certificate_list
[0] yaprak subject = example.com issuer = Ara Otorite A
[1] ara otorite subject = Ara Otorite A issuer = Kök Otorite K
([2] kök subject = Kök Otorite K issuer = Kök Otorite K)Parantez içindeki satır telde yok. Güven demirleri zincirle taşınmıyor; işletim sisteminden ve tarayıcıdan geliyor. Tipik doğrulama zinciri bu yüzden 3 sertifikadan oluşuyor ama telde ikisi gidiyor. DNSSEC imzasında da aynı kural vardı: zincirin ucundaki anahtar dışarıdan gelir.
Yol doğrulamanın girdisi işte o güven çıpası. Zincirin dört koşulu birden tutması gerekiyor. Her sertifikanın öznesi bir sonrakinin ihraççısıdır, ilk halkayı güven çıpası vermiştir, sonuncusu doğrulanacak sertifikadır, hepsi ilgili anda geçerlidir. Bir sertifika aynı yolda iki kez görünemez; döngüyle güven üretmenin kapısı böyle kapanıyor.
Bir anahtarın sertifika imzalamaya yetkili olup olmadığını iki uzantı söylüyor. basicConstraints içindeki cA bayrağı, o anahtarla başka sertifikaların imzasının doğrulanıp doğrulanamayacağına karar veriyor. Uzantı yoksa ya da bayrak yoksa cevap hayır; yaprak sertifika kendini ara otorite ilan edemiyor. Aynı uzantıdaki pathLenConstraint, bu sertifikadan sonra zincire girebilecek azami ara otorite sayısı. Sıfır yazıyorsa hiç giremez.
İkinci uzantı keyUsage ve o bir bit dizisi. Her bitin numarası standartta sabit:
| bit | ad | ne yetkilendiriyor |
|---|---|---|
| 0 | digitalSignature | sıradan imza |
| 5 | keyCertSign | başka sertifikaları imzalamak |
| 6 | cRLSign | iptal listesi imzalamak |
Beşinci bit açık değilse zincirin o halkası kurulamaz. İstemci ayrıca, desteklemediği kritik bir uzantı taşıyan sertifikayı reddetmek zorunda.
Zincirin ucundaki güven demirlerini kim koyuyor? Somut bir liste var. Mozilla’nın CCADB üstünden yayımladığı kök deposu raporunda 172 kök sertifika duruyor. Bunların 121’i “Websites” güven bitini taşıyor, yani TLS’te geçerli sayılıyor — deponun %70,3’ü. O 121 kök 47 ayrı kuruluşa ait. Tarayıcın senin adına kırk yedi kuruluşa güveniyor. Anahtar dağılımı da aynı listede yazılı ve TLS’te geçerli o 121 kökün hepsini kapsıyor. 59’u RSA 4096 bit, 37’si secp384r1 eğrisi, 21’i RSA 2048 bit kullanıyor. Bu üçü 117 kök ediyor. Kalan dördü secp256r1 ve secp521r1 eğrilerinde.
Bu listenin asıl gücü, bir otorite kötü davrandığında ortaya çıkıyor. Yanlış verilmiş bir sertifikanın iki yaptırımı var ve ikisi aynı ağırlıkta değil. Dar olanı şu: otoriteyle çalışıp o tek sertifikayı iptal ettirirsin. Sorun çözülür, otorite yerinde kalır, aynı hata ertesi gün tekrarlanabilir. Geniş olanı otoriteyi kök deposundan düşürtmek. Bunun için güven demiri listelerini tutanlarla konuşman gerekiyor. O otoritenin verdiği bütün sertifikalar aynı anda geçersizleşir; tek tek iptal edilmelerine gerek kalmaz, çünkü yol doğrulamanın ikinci koşulu artık tutmuyor. Zincirin ilk halkasını veren taraf bir güven çıpası değildir. Bedeli de o ölçüde ağır. Depodan düşen otoritenin müşterisi olan her site aynı anda tarayıcıda uyarı vermeye başlar. Kararı veren taraf da bunu bilir. Karar bu yüzden nadir, yavaş ve kanıt ister.
Sertifika hangi adı taahhüt ediyor?
Belgenin kendisi üç üst alandan oluşuyor: imzalanacak gövde, imza algoritmasının adı ve imzanın kendisi. İmza, gövdenin baytlara dökülmüş hâlinin üstüne atılıyor; o dökümün kurallarına DER deniyor ve tek bir gövdenin tek bir bayt dizisine karşılık gelmesini garanti ediyor. Gövdenin içinde sırayla şunlar duruyor:
tbsCertificate
version v3 (INTEGER 2)
serialNumber pozitif tamsayı, en çok 20 bayt
signature imza algoritmasının adı
issuer ihraççının adı
validity notBefore / notAfter
subject öznenin adı
subjectPublicKeyInfo mühürlenen açık anahtar
extensions basicConstraints, keyUsage, subjectAltName, ...
signatureAlgorithm
signatureValueSeri numarası otoritenin verdiği pozitif bir tamsayı ve tek başına anlam taşımıyor. Bir sertifikayı tekilleştiren şey ihraççı adı ile seri numarasının çifti. Uyumlu otoriteler 20 bayttan uzun seri numarası kullanamıyor, çünkü iptal listeleri sertifikayı bu numarayla anıyor.
Geçerlilik iki tarihle çiziliyor ve iki uç da dahil: notBefore ve notAfter. Kodlamada eski bir miras duruyor. 2049 ve öncesi UTCTime ile yazılıyor, 2050 ve sonrası GeneralizedTime ile. Bitiş tarihi tanımsız olan sertifika bile bir tarih taşıyor: 99991231235959Z.
Günlük hayatta çarptığın alan ise ad doğrulaması. Sertifikanın hangi ad için geçerli olduğunu subjectAltName uzantısı söylüyor. Alan adı orada dNSName içinde IA5String olarak duruyor. Karşılaştırma büyük-küçük harf ayrımı gözetmiyor. IP adresi de yazılabiliyor: iPAddress alanına ağ bayt sırasıyla, IPv4 için tam 4 bayt, IPv6 için tam 16 bayt. Uzantıdaki adlar açık anahtara kesin biçimde bağlı sayıldığı için otorite oradaki her adı tek tek doğrulamak zorunda. Her satır bir taahhüt.
Eşleşme iki kimlik arasında aranıyor. Sunucunun sertifikada gösterdiğine sunulan kimlik, istemcinin adres çubuğundaki addan kurduğuna referans kimlik deniyor. Karşılaştırma etiket etiket yapılıyor ve her etiket tutmak zorunda. Joker karakter de yalnız en soldaki etikette durabiliyor.
| sertifikadaki ad | adres çubuğundaki ad | sonuç |
|---|---|---|
*.example.com | foo.example.com | eşleşir |
*.example.com | bar.foo.example.com | eşleşmez |
*.example.com | example.com | eşleşmez |
Son iki satır sezgiye ters. Joker tek bir etiketi karşılıyor; ne iki alt seviyeyi kapsıyor ne de çıplak alan adını. Eski bir alışkanlık da kapandı: sertifikada dNSName varsa istemci Common Name alanına bakarak eşleşme aramamalı. Ad doğrulamasının yeri artık uzantı.
Yanlış verilmiş sertifikayı kim fark ediyor?
Bir sertifika verildikten sonra da yanlış olabilir. Anahtar çalınır, otorite yanılır, ya da adı sertifikada geçen taraf o belgeyi hiç istememiştir. İlk cevap iptal listesi: otoritenin ya da yetkilendirdiği bir birimin yayımladığı imzalı bir liste. Tam bir liste, kapsamındaki süresi dolmamış bütün iptal edilmiş sertifikaları taşıyor; süresi dolan düşer, liste sonsuza kadar büyümez.
Sebepler numaralı ve adlı: 1 keyCompromise, yani anahtarın ele geçmesi; 2 cACompromise, otoritenin kendisinin ele geçmesi; 10 aACompromise. Aradaki 7 hiç kullanılmıyor.
Koca listeyi indirmeden tek bir sertifikanın durumu da sorulabiliyor. Yolun adı çevrimiçi durum sorgusu, kısaltmasıyla OCSP. Üç kesin yanıt veriyor: good, revoked, unknown. İlkini yanlış okumak kolay: good yalnızca “iptal kaydı yok” demek; sertifikanın hiç verilmiş olduğunu bile garanti etmiyor. unknown ise çoğunlukla yanlış kapıyı çaldığını gösteriyor. Nereye soracağını da sertifikanın kendisi söylüyor. authorityInfoAccess uzantısı iki adres taşıyor: eksik ara sertifikayı nereden alacağın ve durumu kime soracağın.
OCSP’nin kendi tasarımında iki kusur var ve ikisi de tarayıcıyı zor durumda bırakıyor. Birincisi gecikme: her bağlantıda üçüncü bir sunucuya bir soru daha sormak, sayfa açılışına bir gidiş-dönüş daha ekliyor. İkincisi ve daha ağırı mahremiyet: o soruyu sorarken hangi siteye bağlandığını sertifika otoritesine söylemiş oluyorsun. Şifreli bağlantı kurmak için attığın adım, gezinme geçmişini üçüncü bir tarafa sızdırıyor.
Çözüm rolleri ters çeviriyor. OCSP stapling (zımbalama) denen yöntemde durumu tarayıcı değil sunucu soruyor: kendi sertifikasının OCSP cevabını önceden alıyor, imzalı hâliyle saklıyor ve el sıkışmanın içine iliştirip sana gönderiyor. Cevap otoritenin imzasını taşıdığı için sunucu onu uyduramıyor; ve cevabın kendi zaman damgası olduğu için bayatı da sürülemiyor. Tarayıcı hiçbir yere soru sormuyor: ne gecikme var ne sızıntı.
Geriye bir açık kalıyor. Sunucu zımbayı hiç iliştirmezse tarayıcı ne yapacak? Cevap uzun süre “devam et” oldu, çünkü ağ arızalarında siteyi kırmak istemediler — ve saldırgan da tam olarak bunu kullanabilirdi: zımbayı yutması yeterliydi. OCSP Must-Staple uzantısı bunu kapatıyor, sertifikaya “benim cevabım her zaman zımbalanmış gelecek” diye yazıyor ve gelmezse tarayıcı bağlantıyı reddediyor.
İptal, yanlış verilmiş bir sertifikayı ancak birileri fark ederse işe yarıyor. Fark etmeyi sağlayan mekanizmanın adı Certificate Transparency. Verilen sertifikalar yalnızca-ekleme günlüklerine yazılıyor. Günlük yanlış verilmeyi engellemiyor; adı sertifikada geçen tarafın bunu görmesini sağlıyor.
Günlük, kabul ettiği zincire imzalı bir zaman damgası döndürüyor. O damga bir kayıt değil, bir söz: bu girdiyi ağaca ekleyeceğim. Söz, Maximum Merge Delay içinde tutulmak zorunda; tutulmazsa günlüğün kendisi suçüstü yakalanıyor. Yalnızca-ekleme özelliği Merkle ağacından geliyor, çünkü yaprak olmayan her düğüm çocuklarının hash’i. Bugünkü ağacın dünküyü kapsadığı bu sayede ucuza kanıtlanabiliyor; geçmişi sessizce silmek mümkün olmuyor. Günlüğe atılan her zincirin de günlüğün tanıdığı bir güven çıpasında bitmesi gerekiyor.

İptalin yavaş ve güvenilmez olduğu kabul edilmiş durumda; çözüm başka yerden geliyor. Sertifika ömrü hızla kısalıyor. 2026-03-15’ten önce azami ömür 398 gündü, bugün 200 gün. Takvim 2027-03-15’ten sonra 100 güne, 2029-03-15’ten sonra 47 güne iniyor. İptal takvimi de sıkı: ağır durumlarda 24 saat, hafif durumlarda kesin üst sınır 5 gün, ara otorite sertifikasında 7 gün. Ömrü 7 günü aşmayan sertifikalar zaten iptal yükümlülüğünün dışında tutuluyor.
Aynı openssl s_client çağrısı, sonuna -showcerts eklendiğinde sunucunun gönderdiği zinciri olduğu gibi basıyor:
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/nullÇıktıda yaprak sertifika en üstte, ara otorite hemen altında duruyor. Kök yok, çünkü zaten sende. Tek bir sertifikanın künyesini görmek istersen, çıktıdaki BEGIN/END bloğunu bir dosyaya kaydet:
openssl x509 -in yaprak.pem -noout -subject -issuer -dates -ext subjectAltNameDönen dört satır bu bölümün tamamı: belge kime verildi, kim imzaladı, hangi tarihler arası geçerli, hangi adları taahhüt ediyor.
Özet
Peki, ne öğrendik?
- Sertifika bir açık anahtarı bir ada bağlar ve bağı otorite kurar; doğrulama ters yönde, otoritenin açık anahtarıyla yapılır.
- Zincirin ucu sertifikadan çıkmaz: güven demirlerini işletim sistemi ve tarayıcı taşır, kök telde hiç gönderilmez.
- Ad eşleşmesi subjectAltName uzantısında aranır; joker yalnız en soldaki etiketi karşılar ve çıplak alan adını kapsamaz.
- İptal yavaş olduğu için ömür kısalıyor: azami sertifika ömrü basamak basamak düşürülüyor, kısa ömürlüler iptal yükümlülüğünün dışında kalıyor.
- Certificate Transparency yanlış verilmeyi engellemez, görünür kılar; yaptırımı asıl kök deposu uygular.
Kanal kuruldu, kilit takıldı, karşı tarafın kim olduğu doğrulandı. Geriye tek bir iş kaldı ve bu bölüm boyunca ona hiç bakmadık: şimdi tam olarak ne göndereceksin?
Bölüm 12: HTTP Mesajının Anatomisi
Kanal kuruldu, karşı taraf doğrulandı. Göndereceğin şey ise şaşırtıcı derecede sade: birkaç satır düz metin.
Şimdiye kadar “istek” deyip içine bakmadım. O metin neye benziyor, hangi kelimesi neyi belirliyor?
Bir istek neye benziyor?
HTTP web’in uygulama katmanı protokolü ve modeli tek cümleye sığıyor: bir taraf istiyor, öbür taraf istenen nesneyi yanıt olarak yolluyor. Bütün protokolde yalnızca iki tür mesaj bulunuyor, istek ile yanıt; üçüncü bir tür aramana gerek yok.
Mesajın kendisi düz metin olarak gidiyor. HTTP/1.1’de her satır ASCII, yani gözünle okuyabilirsin. Karşı tarafın kim olduğu ad doğrulamasıyla çözülmüştü; o kanal bu metni tek harfini değiştirmeden taşıyor.
RFC 9110 mesajı dört parçaya ayırıyor. Başta mesajı tanımlayan ve yönlendiren denetim verisi duruyor. Arkasından ad-değer çiftlerinden oluşan başlık tablosu geliyor. Sonra sınırsız uzunlukta olabilen içerik akışı, en sonda da kuyruk tablosu. Bir isteğin denetim verisi ilk satırda duruyor.
O satırın biçimi sabit: metot, boşluk, hedef URL, boşluk, sürüm ve satırı kapatan CR LF. Adres çubuğuna yazdığın adresin yolu buraya giriyor. Yetkili alanı ayrı, yolu ayrı kutulara koyan ayrıştırma tam da bunun içindi.
Başlık satırları arkadan geliyor. Nerede bittiklerini satır başında duran boş bir CR LF çifti söylüyor; ondan sonrası gövde. Tamamı şuna benziyor:
GET /kitap/bolum-12 HTTP/1.1
Host: example.com
User-Agent: kendi-istemcim/1.0
Accept: text/html
Dört satır, sonra boş bir satır. Her satırın sonunda görünmeyen iki bayt daha var. Onlar da sayıya giriyor: bu istek toplam 102 bayt. İstek satırı tek başına 30 bayt tutuyor. Aynı isteğin zorunlu parçalara indirgenmiş hâli 51 bayt: istek satırı, Host başlığı ve kapanış boş satırı.
HTTP kendi taşımasını da kurmuyor. İstemci sunucunun 80. portuna bir TCP bağlantısı açıyor, mesajlar o soketten geçiyor. HTTPS’te varsayılan port 443 oluyor. Numaranın neden sabit olduğu iyi bilinen portlarda geçmişti.
Bir bağlantıya kaç isteğin sığdığı ayrı bir hesap. Kalıcı olmayan HTTP’de bir TCP bağlantısında en çok bir nesne taşınıyor. Kalıcı HTTP’de sunucu yanıtı gönderdikten sonra bağlantıyı açık bırakıyor. Bunu burada tek cümleyle bırakıyorum; kalıcı bağlantının asıl hesabı iki durak sonra tutulacak.
Bir sayfa nesnelerin toplamıydı ve her nesne ayrı bir URL ile adresleniyor. O yüzden bu metin sayfa başına bir kez değil, onlarca kez yazılıyor.
Metot ne vaat ediyor?
İstek satırının ilk kelimesi isteğin anlamını taşıyor. RFC 9110 sekiz metot tanımlıyor ve bu küme protokole gömülü; uygulama kendi metodunu icat etmiyor. Metot adı büyük-küçük harfe duyarlı, standart adlar da sözleşme gereği tamamı büyük harfle yazılıyor.
| Metot | Ne istiyor | Güvenli | Yinelemeye dayanıklı |
|---|---|---|---|
| GET | kaynağın güncel gösteriminin aktarılmasını | evet | evet |
| HEAD | aynı isteğin yalnızca başlıklarını | evet | evet |
| OPTIONS | kaynağın kabul ettiği seçeneklerin bildirilmesini | evet | evet |
| TRACE | mesajın yolda ne hâle geldiğinin yansıtılmasını | evet | evet |
| PUT | hedefte duranın gövdeyle değiştirilmesini | hayır | evet |
| DELETE | kaynağın güncel gösterimlerinin kaldırılmasını | hayır | evet |
| POST | gövdenin kaynağa özgü kurallarla işlenmesini | hayır | hayır |
| CONNECT | hedefe uçtan uca bir tünel kurulmasını | hayır | hayır |
Son iki sütun sözleşme. Güvenli olmak, metodun anlamının salt okunur olduğunu söylüyor. Sunucuda hiçbir şeyin değişmeyeceğini garanti etmiyor; sunucu istediği sayacı artırabilir. Söylediği şey, istemcinin değişiklik istememiş olduğu.
Yinelemeye dayanıklı metot ise aynı isteği iki kez yollamanın tek kez yollamakla aynı sonucu vermesi demek. POST ikisinin de dışında kalıyor, çünkü anlamını sunucu belirliyor.
Zorunluluk listesi kısa. Genel amaçlı her sunucu GET ve HEAD’i desteklemek zorunda; kalan altısı isteğe bağlı. HEAD’in gövdeyi hiç istememesi ucuz bir yetenek veriyor: bir dosyanın boyutunu indirmeden öğrenebiliyorsun. POST’un altına ise çok iş giriyor: form verisi, mesaj gönderme, yeni kaynak yaratma, var olan içeriğe ekleme. Yeni bir kaynak yarattıysa sunucunun 201 dönmesi ve yeni adresi Location başlığında vermesi bekleniyor.
DerinleşmeGET ile POST arasındaki fark neden teknik değil, sözleşmesel?
Aynı veriyi iki ayrı yoldan gönderebilirsin. Biri GET: veri, hedef adresin içine, soru işaretinden sonra yazılıyor. Öbürü POST: veri gövdeye giriyor ve adres temiz kalıyor. Telde ikisi de aynı sokete yazılan düz metin, ve karşı taraf ikisini de okuyabiliyor.
Aradaki fark teknik değil. Fark, o istekle birlikte neyi ilan ettiğin.
GET dediğin anda isteğin salt okunur olduğunu söylemiş oluyorsun, ve bu ilanı senden başka herkes ciddiye alıyor. Tarayıcı yanıtı önbelleğe koyabiliyor. Kullanıcı adresi yer imine ekleyebiliyor, sonra oradan tekrar girebiliyor. Arama motoru bağlantıyı kendiliğinden izleyebiliyor. Bir vekil sunucu, aynı adrese gelen ikinci isteği hiç sormadan kendi kopyasıyla karşılayabiliyor. Adresin içine yazdığın her şey de sunucu kayıtlarına düz metin olarak düşüyor.
POST dediğinde bunların hepsi kapanıyor. Tarayıcı sayfayı yenilerken “formu yeniden göndereyim mi” diye soruyor, çünkü ikinci gönderimin ikinci bir sipariş anlamına gelip gelmeyeceğini bilmesinin yolu yok.
Sözleşmeyi bozmanın bedelini de sen ödemiyorsun. Silme işini GET ile yapan bir uygulama telde geçerli bir mesaj gönderiyor ve hiçbir kural çiğnenmiş görünmüyor. Sonra bir gün site haritası çıkaran bir robot bütün bağlantıları geziyor, sırayla hepsini siliyor. Robot kusurlu değil, ilan edilmiş anlama göre davrandı.
Başlıklar neyi çözüyor?
Başlık tablosunun kuralı az. Adlar büyük-küçük harfe duyarsız, yani Host ile host aynı alan.
Host zorunlu. Tek makinede birden çok alan adına hizmet veren sunucu, hangi siteyi istediğini bununla ayırt ediyor. Aynı adres, aynı port, farklı siteler. HTTP/2 ve HTTP/3’te bu alanın yerini :authority sözde-başlığı aldı.
Gövdesi olan bir istekte iki alan daha devreye giriyor. Content-Type gövdenin ne olduğunu söylüyor ve karakter kümesi aynı satırda parametre olarak geliyor. Content-Length ise gövdenin uzunluğunu onluk tabanda bayt sayısı olarak veriyor.
POST /yorum HTTP/1.1
Host: example.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
ad=emir&yorum=merhaba+dunyaGövdenin nerede bittiğini o sayı çiziyor. Eksik yazarsan sunucu gelmeyecek baytları beklemeye devam ediyor. Fazla yazarsan bir sonraki isteğin ilk satırını gövdenin parçası sanıyor. Boş gövdeli bir POST’ta bile alan yazılıyor ve değeri sıfır oluyor.
Mesajın sonunda bir tablo daha var, ama çoğu zaman boş kalıyor. Kuyruk, gövde bittikten sonra eklenen alanları taşıyor: akış tamamlanmadan hesaplanamayan bir özet oraya yazılıyor.
Aynı adresten farklı gösterimler istemek
Bir adres tek bir dosyayı göstermek zorunda değil. /logo adresinin arkasında hem PNG hem WebP, hem Türkçe hem İngilizce, hem sıkıştırılmış hem ham bir gösterim durabilir. İstemci hangisini istediğini istek başlıklarıyla söylüyor ve mekanizmanın adı içerik pazarlığı.
Accept: image/webp,image/png;q=0.8,*/*;q=0.5
Accept-Language: tr,en;q=0.7
Accept-Encoding: gzip, brVirgülle ayrılmış her seçeneğin yanında bir q değeri var — 0 ile 1 arasında bir kalite ağırlığı, yazılmazsa 1 sayılıyor. Yukarıdaki satır “WebP’yi tercih ederim, PNG de olur, gerekirse her şeye razıyım” demek. Sunucu listeye bakıp en iyi eşleşmeyi seçiyor ve cevabında hangisini seçtiğini Content-Type ile bildiriyor.
Bir de “hangi başlığa göre seçtim” sorusu var; cevabı Vary başlığında dönüyor ve gibi önbelleğin anahtarını doğrudan etkiliyor. Pazarlık, aynı adresin arkasında birden çok kopya doğurduğu için önbelleğe de haber verilmesi gerekiyor.
Dosyanın yalnızca bir parçasını istemek
İkinci bir mekanizma, isteği bayt aralığına daraltıyor:
Range: bytes=1048576-2097151Sunucu isteği kabul ederse 206 Partial Content dönüyor ve yalnızca istenen aralığı gönderiyor; Content-Range başlığında hangi aralığı verdiğini ve dosyanın toplam boyunu yazıyor. Desteklemiyorsa 200 ile bütün dosyayı gönderiyor — istemcinin bunu anlaması için durum koduna bakması yeterli.
Bu tek başlığın üç ayrı işi var. Kesilen indirme kaldığı bayttan sürüyor. video akışı, filmi baştan indirmek yerine parça parça çekiyor. Ve bir dosyayı birden çok bağlantıyla paralel indiren araçlar, her bağlantıya farklı bir aralık veriyor.
Katmanları sayarken, ağın yedi katmanlı klasik modeli olan OSI’nin oturum katmanına bakacağız ve o katmanın işini bugün kimin yaptığını soracağız. Cevabın bir parçası şimdiden elinde: kopan bir aktarımı işaretli noktadan sürdürmek, ayrı bir katman değil, tek bir istek başlığı.
Üç basamak neyi söylüyor?
Yanıtın ilk satırı durum satırı: sürüm, üç basamaklı durum kodu ve reason phrase (gerekçe cümlesi) yan yana duruyor. Kodu okumak için gövdeyi beklemek gerekmiyor: istek gidip yanıtın ilk baytları dönene kadar geçen bir gidiş-dönüş süresi yetiyor.
Kod bir tam sayı ve geçerli aralık 100 ile 599 arası. Sınıfı ilk rakam belirliyor; son iki basamağın sınıflandırmada hiçbir rolü yok.
| Sınıf | Anlamı | Bu bölümde geçenler |
|---|---|---|
| 1xx | bilgi | — |
| 2xx | başarı | 200, 201 |
| 3xx | yönlendirme | 301, 304 |
| 4xx | istemci hatası | 400, 404, 405, 410 |
| 5xx | sunucu hatası | 500, 501, 505 |
İstemci tanımadığı bir kodu, o sınıfın x00 koduymuş gibi işlemek zorunda: 471 gelirse onu 400 gibi ele alıyor. Anlamını bilmiyor ama ne yapacağını biliyor. Yeni kod eklemek bu yüzden protokolü kırmıyor.
Koddan sonraki reason phrase (gerekçe cümlesi) ise yalnızca tavsiye. Yerel karşılığıyla değiştirilebilir, hiç yazılmayabilir; protokol bundan etkilenmiyor. Kararı taşıyan şey de sayının kendisi.
Asıl bilgi de birbirine yakın duran kodların arasındaki farkta. 404, kaynağın güncel bir gösteriminin bulunamadığını söylüyor. Durumun kalıcı mı geçici mi olduğunu söylemiyor; sunucu kalıcı olduğunu biliyorsa 410 tercih ediliyor. 405 ile 501 de ayrı arızalar. 405’te metot tanınıyor ama o kaynakta izinli değil ve sunucu Allow başlığıyla izinli metotları saymak zorunda. 501’de metot hiç tanınmıyor. 500 ise sunucunun beklenmedik bir durumla karşılaşıp isteği yerine getiremediği hâl. 505 istenen HTTP sürümünün desteklenmediğini bildiriyor. 301 ise nesnenin kalıcı olarak taşındığını, yeni yerinin de Location başlığında durduğunu söylüyor.
Bir kod da hiç veri taşımadığı için var. İstemci elindeki kopyanın tarihini If-Modified-Since başlığıyla isteğe yazıyor. Kaynak o tarihten sonra değişmediyse yanıt 304 oluyor ve gövde hiç gönderilmiyor. O yanıt başlık bölümü bitince bitiyor, içerik de kuyruk da taşıyamıyor. İstek ayrıca If-None-Match taşıyorsa alıcı tarihi yok saymak zorunda. Etiket üzerinden kurulan koşul daha doğru kabul ediliyor. Koşullu isteğin amacı tek cümle: kopya güncelse nesneyi hiç göndermemek.
Bütün bunları kendi makinende görebilirsin. 80. porta elle bir bağlantı açıp istek satırıyla Host başlığını yazman yetiyor. Sonuna iki kez satır sonu koyuyorsun. Belgeleme için ayrılmış bir adla deneyebilirsin:
printf 'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n' \
| nc example.com 80 | head -12İlk satırda sürümü, kodu ve reason phrase’i (gerekçe cümlesini) göreceksin. Altında ad-değer çiftleri sıralı duracak, sonra boş bir satır gelecek, sonra gövde başlayacak. Gördüğün şey, tarayıcının saniyede onlarca kez yazdığı metnin aynısı.

Özet
Peki, ne öğrendik?
- İsteğin biçimi sabit: metot, hedef, sürüm, arkasından ad-değer çiftleri ve satır başında duran boş bir satır.
- Metot bir vaat taşır: güvenli olan salt okunur olduğunu ilan eder, yinelemeye dayanıklı olan ikinci kez yollandığında sonucu değiştirmez.
- Başlıklar mesajı yorumlanabilir kılar: Host hangi siteyi, Content-Type gövdenin ne olduğunu, Content-Length nerede bittiğini söyler.
- Durum kodu üç basamakta karar taşır: sınıfı ilk rakam belirler, tanınmayan kod x00 gibi işlenir, reason phrase (gerekçe cümlesi) yalnızca tavsiyedir.
Metni kanaldan geçirdin, yanıtın ilk satırını okudun. Ama o mesajın hiçbir yerinde senin kim olduğunu söyleyen bir alan yok; sunucu da geçmiş istekler hakkında hiçbir bilgi tutmuyor. İsteği yazdın; peki sunucu seni daha önce gördüğünü nereden bilecek?
Bölüm 13: Durum, Çerez ve Oturum
Bir önceki bölümde yazdığın istekte seni tanıtan tek bir alan yoktu. Sunucu da geçmişi tutmuyor.
Yine de siteler seni hatırlıyor. Bunu yapan şey sunucunun belleği değil, geçen sefer verdiği kâğıdı geri götürmen. O kâğıt neye benziyor?
Sunucu neden hiçbir şey tutmuyor?
Her HTTP isteği ötekilerden bağımsız okunuyor. Bunun protokoldeki adı durumsuzluk. Çok adımlı işlem diye bir kavram yok, ve adımları birbirine bağlama işi protokolün dışında kalıyor.
Durumu bir yerde tutmanın iki yolu var ve ikisi de bu kitapta karşına çıkıyor. Birincisi durumu protokolün uçlarında tutmak. Bağlantı kuran taşımada iki tarafın da karşısındakinin nerede kaldığını gösteren bir kaydı var. İkinci yol durumu mesajların içinde taşımak.
Çerezin yaptığı iş tam olarak bu. Durumu sunucunun belleğinde tutmak yerine senin makinene yazıyor ve her istekte onu geri getirtiyor. Fikir yeni değil: sunucu yarı açık bağlantı durumunu ikinci mesajın sıra numarasına kodlayıp kuyruğu tümden ortadan kaldırabiliyordu. Çerez aynı işi bir kat yukarıda, uygulama katmanında yapıyor.
Çerez dört parçadan kurulur
Mekanizma dört parçayı birden istiyor. İlk ikisi mesajların içinde: yanıt mesajındaki Set-Cookie başlık satırı ve sonraki istek mesajındaki Cookie başlık satırı. Diğer ikisi mesajların dışında: tarayıcının makinende yönettiği çerez dosyası ve sitenin arka ucundaki veritabanı. Dördü bir arada olmadan zincir tamamlanmıyor.
Zincir ilk istekte başlıyor. Siteye ilk vardığında site bir kimlik üretiyor ve veritabanında ona bir kayıt açıyor. Kimliği de yanıtın başlığına yazıyor.
# sunucudan gelen yanıtta
Set-Cookie: oturum=7c1a94e0b3f582d6a4e71b09; Path=/; Max-Age=1800; Secure; HttpOnly
# sonraki her istekte tarayıcıdan giden
Cookie: oturum=7c1a94e0b3f582d6a4e71b09Sonraki isteklerin hepsi o değeri taşıyor. Sunucunun seni tanıması tam olarak şu: gelen satırdaki değeri okumak ve veritabanındaki kaydı bulmak. Tanıdığı şey sen değilsin, taşıdığın numara. Bütün bunu tanımlayan belge RFC 6265, Nisan 2011 tarihli ve tam adı HTTP State Management Mechanism.
Değerin ne anlama geldiğine protokol değil uygulama karar veriyor. Protokol yalnızca taşımayı tarif ediyor, ve gelen Cookie satırını yok saymak sunucunun hakkı.
Tek bir yanıt birden çok Set-Cookie satırı taşıyabiliyor. Bu satırlar tek satıra katlanmıyor: virgül karakteri Set-Cookie’nin kendi sözdiziminde kullanılıyor ve katlama anlamı bozuyor.
Ad ve değerden sonrası kapsamı çiziyor
| Öznitelik | Ne yapıyor |
|---|---|
| Max-Age | çerezin en fazla kaç saniye yaşayacağını söylüyor |
| Expires | aynı şeyi bir tarih olarak söylüyor; ikisi birden varsa Max-Age üstün geliyor |
| Domain | çerezin hangi makinelere gönderileceğini belirliyor, alt adlar da kapsama giriyor |
| Path | çerezi belli bir dizin ve altına sınırlıyor, ama güvenlik için ona güvenilmiyor |
| Secure | çerezi yalnızca güvenli kanaldan gönderilir kılıyor |
| HttpOnly | çerezi HTTP isteklerine ayırıyor, sayfadaki betikler onu okuyamıyor |
| SameSite | çerezin başka bir siteden tetiklenen isteklere eklenip eklenmeyeceğini belirliyor |
Örnekteki çerez 1.800 saniye, yani 30 dakika yaşıyor. Süre hiç yazılmasaydı çerez oturum bitene kadar saklanacaktı, yani tarayıcı kapanınca düşecekti. Oturum çerezi ile kalıcı çerez arasındaki fark tam olarak bu.
Secure yazan çerez yalnızca 443 numaralı portun açtığı kanaldan gidiyor. Koruduğu şey gizlilik, bütünlük değil: etkin bir saldırgan güvensiz kanaldan aynı adı taşıyan bir çerez göndererek onun üstüne yazabiliyor. HttpOnly ile Secure birbirinden bağımsız, bir çerez ikisini birden taşıyabilir.
Standart, genel amaçlı bir tarayıcıdan çerez başına en az 4.096 bayt saklamasını istiyor. Ad, değer ve öznitelikler bu toplama giriyor. Alan adı başına en az 50, toplamda en az 3000 çerez saklanması bekleniyor.
Sunucuların az ve küçük çerez kullanması bekleniyor, çünkü Cookie satırı her isteğe ekleniyor ve upstream (yukarı yön) bant genişliğinden yiyor. Örnekteki adın uzunluğu 6 bayt, kimlik 24 onaltılık basamak, ad-değer çifti 31 bayt ediyor. Başlık adı ve satır sonuyla birlikte Cookie satırı 41 bayt tutuyor. Bir sayfa aynı kaynaktan 60 nesne çekiyorsa aynı çerez tek sayfa yüklemesinde upstream tarafında 2.460 bayt yük üretiyor.
Tarayıcının çerezi kendiliğinden eklemesi bir açık üretiyor
Tabloya yeni eklenen son satır bir savunma ve neyi savunduğunu bilmeden anlamı yok.
Tarayıcının kuralı sade: bir adrese istek giderken, o adrese ait çerezleri kim istemiş olursa olsun ekliyor. Bankana giriş yaptın, oturum çerezin duruyor. Sonra başka bir sekmede bambaşka bir siteyi açıyorsun ve o sayfanın içinde görünmez bir form ya da bir görsel etiketi, senin bankana bir istek yaptırıyor. Tarayıcı o isteğe oturum çerezini de ekliyor — çünkü kuralı bu. Banka isteği senden gelmiş sayıyor.
Saldırının adı siteler arası istek sahteciliği (CSRF). Saldırganın oturum çerezini okuması gerekmiyor, hatta görmesi bile gerekmiyor; yalnızca kullandırması yetiyor. HttpOnly bu saldırıya karşı hiçbir şey yapmıyor, çünkü çerez okunmuyor.
SameSite özniteliği tam buraya oturuyor ve üç değer alıyor:
| değer | başka siteden gelen isteğe çerez eklenir mi |
|---|---|
Strict | hiçbir durumda eklenmez |
Lax | yalnızca üst düzey gezinmede ve güvenli metotlarda eklenir |
None | her zaman eklenir; Secure ile birlikte yazılması zorunlu |
Lax bugünün varsayılanı ve bir ödünleşim: başka bir siteden gelen bir bağlantıya tıkladığında oturumun açık kalıyor, ama aynı siteden tetiklenen bir form gönderimine çerez eklenmiyor. None ise üçüncü taraf çerezleri için kalan tek yol.
İkinci bir savunma da adın kendisinde. Bir çerezin adı __Host- ile başlıyorsa tarayıcı onu yalnızca Secure işaretliyse, Domain yazılmamışsa ve Path kökse kabul ediyor. Böylece o çerezin tam olarak hangi makineye ait olduğu adın içinde kilitleniyor ve bir alt alan adı onu üstüne yazamıyor. __Secure- öneki daha gevşek, yalnızca Secure şartını koyuyor.
Numaranın zarafeti şurada: kural sunucuda değil, adın kendisinde taşınıyor. Çerezi kim gönderirse göndersin, tarayıcı adı okuyup şartı uyguluyor.
Birinci taraf çerez, ziyaret etmeyi seçtiğin siteden geliyor. Üçüncü taraf çerez hiç seçmediğin bir siteden geliyor, sayfanın içine gömülü bir nesne onu çekiyor. Kalıcı üçüncü taraf çerezleri aynı kimlik değerini birden çok sitede görünür kılıyor, ve izleme tam olarak o ortak değerin farklı sitelerde tekrar tekrar geri gönderilmesi. Görünür bir reklam bile gerekmiyor. Görünmez bir bağlantı aynı işi görüyor.

Bir not: Türkçe kaynaklarda “HTTP oturumu” çoğu zaman tek bir istek-yanıt turu anlamına geliyor. Bu kitapta oturum, protokolün üstünde çerezle kurulan kullanıcı oturumudur; 10. bölümde el sıkışmanın sonunda üretilen oturum anahtarıyla akrabalığı yok.
DerinleşmeHTTP durum tutma yükünü neden hiç üstlenmedi?
Durum tutan protokoller karmaşıklaşıyor. İki uçtan biri çökerse iki taraftaki durum görüntüleri birbirini tutmuyor ve uzlaştırılması gerekiyor. Durumlu bir protokolde bir işlemin iki adımı ya birlikte oluyor ya hiç olmuyor, yani yarım kalmış işlemden kurtarma yükü doğuyor. HTTP bu yükü hiç üstlenmemeyi seçti.
Bedeli mesajın içinde taşınan değerin görünürlüğü. İzlemede mekanizmanın kendisi hiç değişmiyor: aynı satır, aynı başlık, aynı veritabanı sorgusu. Değişen tek şey çerezi kimin koyduğu.
Bu yüzden savunma protokolde değil, protokolün dışında kuruldu. Üçüncü taraf izleme çerezleri Firefox ve Safari’de varsayılan olarak kapatıldı, Chrome için de kapatma kararı açıklandı. Hukuk da aynı yerden giriyor: GDPR’a göre bir çerez kişiyi teşhis edebiliyorsa kişisel veri sayılıyor ve kişisel veri kurallarına tabi oluyor. Kullanıcının çerezlere izin verip vermeme konusunda açık denetimi olması gerekiyor, ve sitelerde karşına çıkan onay kutularının dayanağı bu.
Aynı nesneyi kaç kez indirmen gerekiyor?
Bir web önbelleği istekleri asıl sunucuyu hiç işin içine katmadan karşılıyor. Nesne depoda varsa istemciye oradan dönüyor ve istek dışarı çıkmıyor. Yoksa önbellek nesneyi asıl sunucudan istiyor, gelen kopyayı saklıyor, aynı kopyayı istemciye veriyor. Kaçırılan isabet sonraki isabeti hazırlıyor.
Bu kutu iki rolü aynı anda oynuyor: isteği yapan istemciye karşı sunucu, asıl sunucuya karşı istemci. Adı vekil sunucu.
Kazanç iki tane. Birincisi yanıt süresinin kısalması, çünkü kopya sana daha yakın duruyor. İkincisi kurumun dış erişim hattındaki trafiğin azalması. Asıl dert de o hattın doluluğu: kullanım oranı yükseldikçe kuyruk gecikmesi patlıyor.
Bir kurumun erişim hattı 10 Mbit/s olsun. Kullanıcılar saniyede 40 istek yapıyor ve ortalama nesne 200 kbit. Önbelleksiz durumda hattan 8 Mbit/s geçiyor, yani hat %80 dolu. İsabet oranı %55 olduğunda dışarı yalnızca %45 çıkıyor: 3,6 Mbit/s ve %36 doluluk. Asıl sunucudan gelen istek 1,2 saniye, önbellekten gelen 5 ms sürüyorsa ortalama 0,54 saniyeye iniyor. Hiç kapasite satın alınmadı.
Önbellekler ağın ortasına yerleşmiş ara kutulardan biri. Servis sağlayıcıda, mobil ağda ve içeriğin kopyalarını dünyaya yayan içerik dağıtım ağlarında duruyorlar, ve tek bir sayfa isteği yol boyunca birden çok önbelleğe uğrayabiliyor. İsteğin doğuşunda andığım tarayıcı önbellekleri bu zincirin hem ilk halkası hem de sana en yakın duranı.
RFC 9111 iki tür ayırıyor. Paylaşılan önbellek birden çok kullanıcı için saklıyor ve genellikle ara kutu olarak konuşlanıyor. Özel önbellek tek kullanıcıya ait, çoğunlukla tarayıcının içinde duruyor. Tanım da sade: HTTP önbelleği, yanıt mesajlarının yerel deposu ve depoyu yöneten alt sistem. Tünel rolündeki bir taraf önbellek kullanamıyor.
Yaşı tazelik ömrünü aşmamış yanıt taze, aşmış olan bayat. Taze yanıt asıl sunucuya hiç sorulmadan kullanılıyor. Yanıtın yaşı, asıl sunucuda üretildiği ya da orada başarıyla doğrulandığı andan beri geçen süre, ve Age başlığı bu tahmini saniye olarak taşıyor.
Süreye sunucu karar veriyor, kararını da yanıt başlığında bildiriyor.
| Yönerge | Ne diyor |
|---|---|
| max-age | yaş belirtilen saniyeyi geçince yanıt bayat sayılıyor |
| no-store | yanıtın hiçbir parçası saklanmıyor |
| no-cache | saklanabiliyor, ama doğrulanmadan kullanılamıyor |
| private | yanıt tek kullanıcıya ait, paylaşılan önbellek saklayamıyor |
Ortadaki iki satır sık karıştırılıyor. Yasak farklı: no-store saklamayı, no-cache doğrulamadan kullanmayı engelliyor. Tarayıcının kendi önbelleği private yazan yanıtı yine de saklayabiliyor.
Çerez başlığının varlığı yanıtın önbelleklenmesini kendiliğinden engellemiyor. Kişiye özel bir yanıtı paylaşılan önbellekten korumak istiyorsan private ya da no-store’u açıkça yazman gerekiyor.
Sunucu hiç süre vermediyse önbellek kendi tahminini yapıyor. Last-Modified tarihine bakıp o tarihten beri geçen sürenin %10’unu ömür sayması yaygın bir seçim. O ömür dolana kadar oradaki kopya taze sayılıyor, gerçekte eskimiş olsa bile. Her önbellek tazelik ile doğruluk arasında bir takas yapıyor. Aynı takas, yaşam süresi adıyla, önbellek katmanlarının bir kat aşağısında da vardı.
Kopyan hâlâ geçerli mi?
Koşullu istek, metodun uygulanmasından önce sınanacak bir önkoşul taşıyan istek. Önkoşul tutmazsa metot hiç uygulanmıyor. Önbellek tazelemenin en verimli yolu koşullu GET. Aynı mekanizma PUT ile DELETE’te kayıp güncelleme sorununu da önlüyor.
Önkoşulda kullanılabilen kaynak üstverisine doğrulayıcı deniyor. HTTP iki tane tanımlıyor.
Last-Modified gösterimin son değişme anını HTTP tarih biçiminde ve saniye çözünürlüğünde taşıyor. ETag ise opak: içinde ne yazdığı istemciyi ilgilendirmiyor, yalnızca eşit mi değil mi diye karşılaştırılıyor. Tırnak içinde bir dizi. Zayıf üretilmiş etiketin başına W/ öneki konmak zorunda, varsayılanı güçlü doğrulayıcı. Saniye çözünürlüğü yetmediğinde ya da değişiklik tarihi düzgün tutulmadığında tarihten daha güvenilir çalışıyor.
İstemci koşulu iki başlıktan biriyle kuruyor. If-None-Match isteği, elindeki etiketlerden hiçbirinin eşleşmemesi koşuluna bağlıyor; eşleşme varsa koşul yanlış oluyor. If-Modified-Since ise GET ya da HEAD’i gösterimin değişme tarihine bağlıyor, veri değişmediyse hiç aktarılmıyor. İkisi birden gelirse tarih yok sayılıyor, çünkü etiket daha kesin sayılıyor. Birlikte gönderilmelerinin tek sebebi, If-None-Match’i gerçeklemeyen eski ara kutularla uyum.
Koşul yanlış çıkarsa sunucu GET ve HEAD için 304, diğer metotlar için 412 dönmek zorunda. Bu iki kodun sınıfı, durum kodlarını ilk rakama göre ayırırken sabitlenmişti. 304 Not Modified, koşul yanlış çıkmasaydı 200 dönecek olan bir isteğin yanıtı. Sunucu istemciyi kendi kopyasına yönlendiriyor. Yanıt başlık bölümü bitince bitiyor.
Boş dönmüyor ama. 304 üreten sunucu, aynı isteğe 200 dönseydi göndereceği Content-Location, Date, ETag ve Vary alanlarını, ayrıca Cache-Control ile Expires’ı yine göndermek zorunda.
HTTP/1.1 304 Not Modified
Date: Fri, 21 Aug 2026 09:14:02 GMT
ETag: "b41f-63c0a7d1e2"
Cache-Control: max-age=1800
Dört satır ve kapanış boş satırı, toplam 120 bayt. Tam gövdeli karşılığı 18.432 baytlık bir stil dosyası olsaydı fark 153 kat olurdu.
Kazanç turda değil, taşınan baytta. Koşullu istek de tam bir gidiş-dönüş ödüyor: soru çıkıyor, cevap dönüyor. Nesne hiç iletilmediği için aktarım gecikmesi ödenmiyor ve ağ kaynağı harcanmıyor.
Bunu kendi makinende iki adımda görebilirsin. Önce yalnızca başlıkları çekip last-modified satırını kopyalıyorsun, sonra o tarihi koşul olarak geri gönderiyorsun.
curl.exe -sI https://example.com/
curl.exe -sI -H "If-Modified-Since: <yukarıdaki tarih>" https://example.com/İkinci çıktının ilk satırı HTTP/1.1 304 Not Modified oluyor ve gövde hiç gelmiyor. Aynı çıktıda etag ve Age satırları da duruyor, yani doğrulayıcıyı ve paylaşılan bir önbelleğin yaşını tek komutta görüyorsun. example.com belgeleme için ayrılmış bir ad.
Özet
Peki, ne öğrendik?
- HTTP hiçbir şey tutmuyor: her istek ötekilerden bağımsız okunuyor ve adımları birbirine bağlayan şey protokolün dışında kalıyor.
- Çerez durumu senin makinene koyuyor: Set-Cookie yazıyor, Cookie geri getiriyor, tarayıcı saklıyor, veritabanı karşılığını tutuyor.
- Öznitelikler ömrü ve kapsamı çiziyor: Max-Age süreyi, Domain ile Path yeri, Secure ile HttpOnly erişimi sınırlıyor.
- Önbellek kapasite satın almadan doluluğu düşürüyor: kopya sana yaklaşıyor ve dış hattın kullanım oranı geriliyor.
- Koşullu istek baytı kurtarıyor, turu değil: soru yine gidip geliyor, ama nesne hiç iletilmiyor.
Tek bir nesne için bütün bu yolu yürüdün: bir kimlik, bir saklama kararı, bir de tazelik sorusu. Ama açtığın sayfa tek nesne değil; onlarca parçadan kurulu. Bir sayfa yüzlerce parçadan oluşuyorsa, her parça için bu yolu baştan mı yürüyeceksin?
Bölüm 14: HTTP/2'den HTTP/3'e
Bir sayfa yüzlerce parçadan oluşuyor ve her parça için yolu baştan yürümek eski çözümdü. İstek satırını ve durum kodlarını açarken, tek bağlantıya kaç isteğin sığdığını tek cümleyle bırakmıştım.
Borcu burada ödüyorum. Aynı yolun üstünde kaç araba var, ve arkadaki neden bekliyor?
Bağlantıyı açık bırakmak neyi kurtarıyor?
Kalıcı olmayan kipte bir taşıma bağlantısı en çok tek bir nesne taşıyordu. Klasik anlatım dört adımdı: bağlan, ne istediğini söyle, cevabı al, bağlantıyı kes. Dördü de her nesnede baştan tekrarlanıyordu.
Bedeli gidiş-dönüş süresiyle ölçebilirsin. Kalıcı olmayan kipte her nesne iki tur yiyor: biri bağlantı kurulumu, biri istek ve yanıtın ilk baytları. Üç el sıkışmanın RTT bedelini sayarken bu turun ilkini adım adım görmüştük.
Sayıya dökelim. 60 bağlı nesne taşıyan bir sayfa düşün ve gidiş-dönüş süresi 40 ms olsun. Yalnızca kurulum ve istek turları 4.800 ms tutuyor, yani 4,8 saniye. Dosya aktarım süreleri bu hesaba daha hiç girmedi; sayfa açılmadan önce sırf yolu kurmak için beş saniyeye yakın bekliyordun.
Ödediğin şey yalnızca gecikme de değil. Her yeni bağlantı işletim sistemi tarafında tampon, durum kaydı ve kontrol bloğu istiyor; bunların hepsi altmış kez birden kuruluyor.
HTTP/1.1 varsayılanı tersine çevirdi. RFC 9112’de kalıcı bağlantı varsayılandır: sunucu yanıtı gönderdikten sonra bağlantıyı açık bırakıyor ve aynı bağlantıdan birden çok istek ile yanıt geçiyor. Varsayılandan çıkmak için Connection başlığına close yazman gerekiyor. Kapatmak artık istisna.
Kazanç burada görünüyor. Kalıcı bağlantı, sayfadaki bütün bağlı nesnelerin toplam bedelini tek gidiş-dönüşe kadar indirebiliyor. Aynı sayfa iki gidiş-dönüşe, yani 80 ms’ye iniyor: biri kurulum, öbürü bütün nesneler için. Aradaki fark 60 kat.
Sıra zorunluluğu kimi bekletiyor?
HTTP/1.1 bir de boru hattını getirdi. İstemci yanıtı beklemeden istekleri arka arkaya gönderebiliyor. Sunucu güvenli metotları paralel işleyebilir, ama yanıtları isteklerin geldiği sırayla göndermek zorunda.
Zorunluluğun sebebi sade. HTTP/1.1’de istekleri yanıtlarla eşleştiren bir kimlik alanı yok; tek dayanak varış sırası. Protokolün tek varsayımı da güvenilir ve sırayla teslim eden bir taşıma. HTTP/1.0’da durum daha dardı: bir bağlantıda aynı anda yalnızca tek bir istek açık kalabiliyordu.
Sonuç şu: küçük bir nesne, önündeki büyük nesnenin arkasında beklemek zorunda kalıyor. Buna baş engellemesi (head-of-line blocking) deniyor. Burada gördüğün, uygulama katmanındaki baş engellemesi.
tek bağlantı, yanıtlar isteklerin geliş sırasında
istekler : A ---> B ---> C
yanıtlar : [============ A ============][ B ][ C ]
^ B hazırdı, A bitene kadar bekledi2. bölümde paket anahtarlamayı ve kuyruk gecikmesini otoyol şeritleriyle anlatmıştım; tek şeritte önündeki aracı geçemezsin. Tarayıcılar bu şeritten kaçmak için aynı sunucuya paralel bağlantılar açıyor. RFC 9112 kaçışın sebebini açıkça yazıyor. Standardın eski sürümleri paralel bağlantı sayısına sayısal bir tavan koyuyordu. O tavan kaldırıldı, çünkü pek çok uygulama için pratik değildi. Yerine ölçülü olma öğüdü kaldı.
Ölçülü olmayan taraf kazanıyor. 9 bağlantının paylaştığı bir hatta tek bağlantı isteyen onda bir pay alıyor, 11 bağlantı açan ise hattın yarısını alıyor. Tıkanıklık denetimini polisleyen kimse yok. Dahası, tıkanık olmayan bir ağda bile eşzamanlı başlayan gönderimler, daha az bağlantıyla hiç oluşmayacak bir tıkanıklık yaratabiliyor.
Çerçeveye bölmek yetiyor mu?
HTTP/2 ilk olarak 2015’te RFC 7540 ile yayımlandı; yürürlükteki belgesi RFC 9113 oldu. Metotlar, durum kodları ve başlık alanlarının çoğu HTTP/1.1’den olduğu gibi kaldı. Değişen anlam değil, taşıma biçimi.
İkili çerçeveleme geldi. Nesneler çerçevelere bölünüyor ve çerçeveler iç içe geçirilerek gönderiliyor; küçük nesne artık büyüğün bitmesini beklemiyor. Gönderim sırası da geliş sırasına göre değil, istemcinin bildirdiği önceliğe göre kurulabiliyor. Başlık alanları ayrıca sıkıştırılarak kodlanıyor.
Paralellik sayıyla korunuyor. SETTINGS_MAX_CONCURRENT_STREAMS için önerilen alt sınır 100 eşzamanlı akış ve gerekçesi açık: paralelliği gereksiz yere kısmamak. Her akış 65.535 baytlık bir başlangıç penceresiyle açılıyor. Pencere, alıcının “şu kadar baytı onaylamadan gönderme” demesinin yoludur ve adı flow control (akış denetimi); hızlı bir göndereni yavaş bir alıcının tamponunu taşırmaktan alıkoyar.
İş burada bitmiyor. HTTP/2 uygulama katmanındaki baş engellemesini çözüyor, taşıma katmanındakini çözmüyor. RFC 9113 bunu kendi giriş bölümünde açıkça yazıyor. Sebebi tek cümle: tek taşıma bağlantısı verinin sırayla teslim edilmesini garanti ediyor. Kaybolan ya da sırası bozulan tek bir paket, o paketle hiç ilgisi olmayan bütün işlemleri de durduruyor.
Çoklamayı uygulama katmanına koydular, ama alttaki taşımanın kayıp kurtarma mekanizması onu göremiyor. Tarayıcıların hâlâ paralel bağlantı açma teşviki buradan geliyor.
Taşımanın kendisi neden değişti?
Çıplak bir taşıma bağlantısı kendi başına hiçbir güvenlik getirmiyor. Şifreleme ayrı bir katmandan geliyor ve ayrı bir el sıkışma istiyor. Eski kurulumda iki el sıkışma arka arkaya çalışıyordu: önce taşımanın güvenilirlik ve tıkanıklık durumu, sonra güvenlik katmanının kimlik ve anahtar durumu. Biri bitmeden öbürü başlamıyordu.
HTTP/3 anlamları hiç değiştirmiyor. RFC 9114 aynı HTTP anlamlarını yeni bir taşıma protokolünün üstüne taşıyor: QUIC. Yığın şöyle diziliyor: HTTP/3, altında QUIC, onun altında UDP, onun altında IP.
QUIC yeni bir fikir de icat etmiyor. Bağlantı kurulumu, hata denetimi ve tıkanıklık denetimi için bilinen taşıma çözümlerini uygulama tarafına taşıyor. Spesifikasyon algoritmaların koşut olduğunu kendisi söylüyor.
Asıl fark akışlarda. QUIC’te akış çoklaması ve akış başına flow control taşıma protokolünün kendi işi. Güvenilir aktarım akış başına ayrı tutuluyor, tıkanıklık denetimi ise ortak: bütün akışlar tek bir bütçeyi paylaşıyor. Paket kaybında yalnızca o pakette verisi bulunan akışlar yeniden gönderimi bekliyor. Ötekiler yoluna devam ediyor.
Üç kuşağı aynı kayıp üstünde karşılaştırmak istersen:
B hazır olsa bile A bitene kadar bekliyor.- HTTP/1.1: sıra zorunluluğu. Tek bağlantıda yanıtlar isteklerin geldiği sırayla dönmek zorunda, çünkü hangi yanıtın hangi isteğe ait olduğunu söyleyen bir kimlik alanı yok.
Bhazır olsa bileAbitene kadar bekliyor. - HTTP/2: aynı bağlantıda üç akış birden. Her nesne kendi akış kimliğini taşıyan çerçevelere bölünüyor ve çerçeveler karışık akabiliyor. Uygulama katmanındaki engelleme kalkıyor —
BartıkAyı beklemiyor. - Ama engelleme yok olmadı, bir kat aşağı indi. Üç akış tek bir TCP bağlantısında. Bir segment kaybolduğunda TCP sırayı korumak için **bütün** akışı bekletiyor; kaybolan çerçeve
Cye ait olsa bileAveBde duruyor. Taşıma katmanı akışların varlığından habersiz. - HTTP/3: sıra her akışta ayrı tutuluyor. QUIC akış kavramını taşıma katmanına indiriyor ve her akış kendi sıra numarasını taşıyor. Kaybolan paket yalnızca kendi akışını bekletiyor;
AileBakmayı sürdürüyor.
Ayrım paket sınırında duruyor. Çoklama, farklı akışların STREAM çerçevelerini aynı QUIC paketlerine iç içe koyuyor. Tek pakete birden çok akışın verisi konabiliyor. O paketin kaybı hepsini birden durduruyor. Gerçekleştirimlere pakete gereğinden fazla akış koymamaları öğütleniyor.
DerinleşmeQUIC neden çekirdeğe değil, UDP üstüne kuruldu?
Cevap teknik olmaktan çok dağıtımla ilgili.
Klasik bir taşıma protokolü çekirdeğin içinde yaşar. Yeni bir taşıma yazmak, dünyadaki bütün işletim sistemlerinin onu göndermesini beklemek demek. İki klasik taşıma protokolü 40 yıl boyunca alanın tamamını tuttu; sebebi rakipsiz olmaları değil, rakibin oraya girememesiydi.
QUIC kilidi kırmak için taşımayı çekirdeğin dışına çıkardı. Altta kalan tek şey UDP, ve UDP her yerde zaten var: yeni bir çekirdek sürümü de yeni bir soket ailesi de gerekmiyor.
Bunun pratik karşılığı yayılma hızı. QUIC önce Google sunucularında, Chrome’da ve mobil YouTube uygulamasında çalıştı; standartlaşması sonradan geldi. Bir tarayıcı güncellemesi, bir sunucu güncellemesi, ve yeni taşıma sahada. Aynı işi çekirdek üstünden yapmak yıllar alırdı.
Bedeli de var. Uygulama tarafında çalışan bir taşıma, çekirdeğin yıllarca ayarlanmış kodundan ve donanım hızlandırmalarından mahrum kalıyor. Şifreleme her pakette çalışıyor ve bu işlemci zamanı kullanıcının makinesinden çıkıyor.
El sıkışma da tek tura indi. QUIC, TLS 1.3’ü taşıma katmanının içine aldı; güvenilirlik, tıkanıklık denetimi, kimlik doğrulama ve şifreleme durumu tek el sıkışmada birlikte kuruluyor. İstemci daha önce sakladığı oturum biletini kullanırsa el sıkışma gecikmesi sıfıra iniyor ve uygulama verisi ilk pakette gidiyor. O biletin bedelini biliyorsun: tekrar oynatma saldırısına karşı koruma yok. RFC 9114 bu yüzden karşı önlemleri zorunlu tutuyor.
Bir kazanç daha var. QUIC bağlantısı adresle değil, bağlantı kimliğiyle tanınıyor ve bu kimlik QUIC sürüm 1’de en çok 20 bayt olabiliyor. Uç noktanın adresi ve portu değişse bile bağlantı yaşamaya devam ediyor; buna bağlantı göçü deniyor. Değişim her zaman kasıtlı da değil; aradaki NAT kutusu yeni bir giden port atadığında da oluyor. Her iki durumda da yeni yolun doğrulanması gerekiyor, ve doğrulama başarısızsa yalnızca o yol kullanılmıyor. Göçü yalnızca istemci başlatabiliyor, üstelik el sıkışma doğrulanmadan başlatamıyor.
HTTP/3 tarafında eşleme sade. Her istek, istemcinin açtığı çift yönlü bir QUIC akışında gidiyor ve bir akışta yalnızca tek bir istek gönderilebiliyor. İkinci istek yeni akış demek. Akış kimliği 62 bitlik bir tam sayı; en düşük bit akışı kimin açtığını, ikinci bit tek yönlü mü çift yönlü mü olduğunu söylüyor. İki bit dört akış türü üretiyor.
HTTP/3 mesajının parçaları çerçeve tür kodu
başlık bölümü HEADERS 0x01
gövde DATA 0x00
fragman başlıkları HEADERS 0x01
bağlantı ayarları SETTINGS 0x04
kapanış duyurusu GOAWAY 0x07Gövdesi olmayan bir yanıtta DATA çerçevesi hiç gönderilmiyor; gövde 0 bayt ise ortada çerçeve de yok. Her uç ayrıca en az 3 tek yönlü akışa izin vermek zorunda: bir HTTP denetim akışı ve başlıkları sıkıştıran QPACK’in iki akışı. Bu akışlara en az 1.024 baytlık flow control kredisi verilmesi öğütleniyor.
Bunu kendi makinende görebilirsin. Sürüm seçimi TLS el sıkışmasında ALPN uzantısındaki h3 belirteciyle bildiriliyor, sunucu da desteğini Alt-Svc yanıt başlığıyla duyuruyor. HTTP/3 için zorunlu tek bir UDP portu yok; duyuruda port bu yüzden açıkça yazılıyor.
curl -sI https://cloudflare-quic.com/ | grep -i '^alt-svc'
# alt-svc: h3=":443"; ma=86400Sonra trafiği dinle. İlk QUIC datagramı en az 1.200 bayt olmak zorunda ve gerekirse PADDING çerçeveleriyle şişiriliyor; sebebi yükseltme saldırısını sınırlamak. Yol o boyu taşıyamıyorsa QUIC hiç kullanılmıyor. QUIC en küçük IP paketini 1.280 bayt varsayıyor. IPv6’da bundan 40 baytlık IP başlığı ile 8 baytlık UDP başlığı düşülüyor ve datagram tavanı 1.232 bayta iniyor. IPv4 başlığı daha kısa olduğu için orada tavan 1.252 bayt oluyor.
sudo tcpdump -n -c 5 'udp port 443'Şifreli HTTP’nin klasik varsayılan port numarası 443, şifresizinki 80. UDP engellenmiş bir ağda hiçbir şey göremezsin, çünkü orada QUIC bağlantısı hiç kurulamıyor. Standart bu durumda istemcinin eski sürümlere düşmesini bekliyor.
Özet
Peki, ne öğrendik?
- Kalıcı bağlantı varsayılan oldu: sunucu yanıttan sonra kapatmıyor, kapatmak için Connection başlığına close yazmak gerekiyor.
- Baş engellemesi sıra zorunluluğundan doğuyor: istekleri yanıtlarla eşleştiren bir kimlik alanı olmayınca tek dayanak varış sırası kalıyor.
- HTTP/2 çerçeveledi ama taşımayı değiştirmedi: iç içe geçen çerçeveler uygulama katmanını kurtarıyor, kaybolan tek paket yine hepsini durduruyor.
- QUIC güvenilirliği akış başına ayırdı: kayıp yalnızca o pakette verisi olan akışları bekletiyor, el sıkışma ise tek tura iniyor.
Aynı yolun üstünde artık birden çok araba var ve hiçbiri ötekini beklemiyor. İsteğin yola çıktı; peki gerçekten adres çubuğuna yazdığın makineye mi gidiyor?
Bölüm 15: İçerik Dağıtım Ağları
İsteğin yola çıktı. Ama adres çubuğuna yazdığın ada karşılık gelen makineye gitmiyor.
Paketi alan makine çoğu zaman aynı ülkede bile değil. Kararı sen vermedin ve karar istek yola çıkmadan önce alınmıştı. Peki kim aldı?
Tek büyük sunucu neden yetmiyor?
Yaklaşık bir milyar kullanıcıya aynı içeriği ulaştırman gerekiyor. En sade tasarım tek bir dev makine: bütün içerik orada dursun, herkes oraya gelsin.
Bu tasarım üç yerden birden eleniyor: tek bir arıza noktası oluyor, ağın tıkanma noktası oluyor, ve uzaktaki bir istemciye giden yol hem uzun hem tıkanmaya açık kalıyor.
Sonuncusunu fizik tek başına bitiriyor. Tek modlu fiberde kırılma indisi yaklaşık 1,5, yani ışık saniyede 200.000 km yol alıyor. Aradaki mesafe 2.000 km ise tek yön 10 ms, gidiş-dönüş 20 ms. Sunucuyu ne kadar hızlandırırsan hızlandır bu süre olduğu yerde duruyor; kısaltabileceğin tek şey mesafenin kendisi.
Çözümün adı içerik dağıtım ağı, kısaca CDN, ve tanımı sade. Aynı içeriğin kopyalarını coğrafi olarak dağıtılmış birçok yerde tutuyorsun, ve isteği en yakın kopyaya götürüyorsun. Bu çözüm ağın içine kurulmuyor; uygulama katmanında duruyor. İnternet ona yalnızca uçtan uca taşıma veriyor. Böyle hizmetlere over the top deniyor, üstten geçen.
Sunucuları nereye koyacağın ayrı bir tercih ve iki felsefe var. Derine girmek, sunucuları erişim ağlarının içine, kullanıcının dibine sokmak demek. Eve getirmek ise erişim ağlarına yakın buluşma noktalarında daha az sayıda ama daha büyük küme kurmak. İlkini Akamai seçti, ikincisini Limelight tipi işletmeciler.
Derine gitmenin ölçeği şaşırtacak kadar büyük. Akamai 2015’te 240.000 sunucuyu 120’den fazla ülkeye yaymıştı. Bölersen ülke başına ortalama 2.000’den az sunucu düşüyor. Yoğunluk birkaç dev merkezde toplanmıyor, ince yayılmış küçük yığınlara dağılıyor. Aynı ağın başka bir sayımında 1.000’den fazla ağda kurulu 1.000’den fazla küme geçiyor.
Bu ölçeğin sebebi trafiğin kendisi. 2020’de servis sağlayıcıların konut trafiğinin %80’i üç akış hizmetine gidiyordu. Büyük içerik sağlayıcılar bir adım daha atıyor: veri merkezlerini internete bağlayan kendi özel ağlarını işletiyorlar ve trafiği değişim noktalarında doğrudan takas ediyorlar. Aradaki omurga işletmecileri bu akışın dışında kalıyor.
İsteği kim yönlendiriyor?
Adı devreden zincir
Yönlendirmenin asıl aracı DNS. Zincir tanıdık: sorgu kök sunucudan başlıyor, üst düzey alandan geçiyor ve yetkili sunucuya iniyor. İçerik sahibinin yetkili sunucusuna vardığında bir adres almıyorsun. Oradaki kayıt bir CNAME ve soruyu CDN’in alan adına devrediyor.
Bir DNS kaynak kaydı dört alan taşıyor: ad, değer, tür ve yaşam süresi. CNAME kaydında ad takma addır, değer ise o adın kanonik karşılığı. Devir birkaç kez tekrarlanabiliyor, ama zincirin sonunda mutlaka bir A kaydı duruyor. CNAME tek başına adres vermiyor.
Asıl seçimi en sonda CDN’in kendi yetkili sunucusu yapıyor. Kasıtlı bir yan etkisi var: içeriğin gerçekte hangi makinede durduğunu sen bilmiyorsun. Ad da bunu ele vermiyor. Makine tarafından üretilmiş o uzun etiketlerin her biri, bir DNS etiketine tanınan 63 karakterlik sınırın altında kalıyor.
DNS’in ilan edilmiş hizmetlerinden biri zaten yük dağıtımı. Çoğaltılmış sunucular için tek ada birden çok adres karşılık gelebiliyor, ve CDN bu eski yeteneği bir kat yukarıda kullanıyor. Hacim de buna göre büyümüş: Akamai’nin ad sunucuları günde 2,2 trilyon sorgu görüyor, Comcast’inkiler 600 milyar.
Sorana göre değişen cevap
RFC 7871 işe bir olguyu tespit ederek başlıyor. Yetkili ad sunucuları bugün aynı ada, sorana göre farklı adres döndürüyor, ve konum tahmini için baktıkları şey gelen sorgunun kaynak adresi. Kusur da burada. Yetkili sunucu senin adresini görmüyor, özyineli çözücünün adresini görüyor; merkezî bir çözücü ise sana topolojik olarak uzak olabiliyor.
Topolojik yakınlık ile coğrafi yakınlık aynı şey değil. Standart bunu ayrı bir terim olarak tanımlıyor: iki komşu şehir ağ üstünde çok uzak, iki uzak şehir çok yakın olabiliyor.
Standardın çözümü bir DNS seçeneği ve adı EDNS Client Subnet. Mayıs 2016 tarihli, Informational ve EDNS0’ın bir seçeneği olarak taşınıyor:
OPTION-CODE 2 oktet = 8
OPTION-LENGTH 2 oktet
FAMILY 2 oktet adres ailesi
SOURCE PREFIX-LENGTH 1 oktet soldan kaç bit sorulacak
SCOPE PREFIX-LENGTH 1 oktet cevap kaç biti kapsıyor (sorguda 0)
ADDRESS değişken yalnızca öneki taşıyacak kadar oktetStandart metinlerinde bayt yerine oktet yazıldığını göreceksin; ikisi aynı şeyi, sekiz biti anlatıyor. ADDRESS alanı yalnızca öneki kapsayacak kadar oktet taşıyor: 24 bitlik önek üç oktet, 56 bitlik önek yedi oktet. Fazlasını gönderirsen sunucu paketi FORMERR ile geri çevirebiliyor.
Çözücü de boş durmuyor. Gelen cevabı ağa bağlı olarak önbelleğe alıyor, ve birden çok kayıt aynı sorguya uyduğunda en uzun SCOPE PREFIX-LENGTH kazanıyor. Seçenek yalnızca IN, yani Internet DNS sınıfı için tanımlı.
Mahremiyet dengesi standardın kendi metninde duruyor. Çözücülere IPv4 adresini 24 bite, IPv6 adresini 56 bite kırpmaları öneriliyor. IPv4’te bu, adresin son 8 bitini gizlemek demek; geriye kalan blokta 256 adres var ve hangisi olduğun görünmüyor. Kendi ağını tanıyan bir servis sağlayıcı daha azıyla yetinebiliyor. Bir /20 içindeki bütün /24’lerin aynı bölgede olduğunu biliyorsa 20 bit gönderiyor ve önbellek de daha verimli kullanılıyor.
Standart burada durmuyor ve kendi önerdiği özelliği açıkça eleştiriyor. Seçenek açıkken çözüm zincirindeki her sunucu senin ağ adresini görüyor. RFC bu yüzden özelliğin ad sunucusu yazılımlarında varsayılan olarak kapalı gelmesini tavsiye ediyor. Desteklenmediğinde de dünya durmuyor: en kötü sonuç yanlış bir konum tahmini.
Aynı adres, yüzlerce düğüm
İkinci araç anycast. RFC 4786 tarifi şöyle veriyor: tek bir hizmet adresi birbirinden bağımsız birçok düğümden aynı anda ilan ediliyor, ve o adrese gönderilen datagram bunlardan yalnızca birine yöneliyor. Belge Aralık 2006 tarihli ve BCP 126 numarasını taşıyor.
Bir düğümün kendine çektiği ağ bölgesine havza deniyor. Terim coğrafyadan alınmış ama sınırı harita çizmiyor. Sınırı yönlendirme çiziyor ve gün içinde kayabiliyor.
Bedel iki yerde çıkıyor. Birincisi TCP tarafında: el sıkışma çok paketli bir işlem ve bütün paketlerin aynı düğüme düşmesi gerekiyor; eşit maliyetli çoklu yol varsa aynı işlemin paketleri farklı düğümlere dağılabiliyor. İkincisi izleme. Hizmetin ayakta olup olmadığı artık tek cevabı olan bir soru olmaktan çıkıyor, ve bir düğüm öldüğünde bunu yalnızca o havzadaki kullanıcılar hissediyor.
Anycast’in en tanıdık örneği kök DNS sunucuları. Mantıksal olarak 13 kök ad sunucusu var ama her biri dünyaya çok sayıda kopyayla yayılmış. İlanın yönlendirme tarafında nasıl yapıldığını burada kasten açmıyorum; 42. bölümde ele alacağım.
Kenarda seni karşılayan şey bir önbellek
İsteğini taşıyan kalıcı bağlantının öbür ucunda artık kenardaki makine duruyor. Kenar sunucu bir HTTP önbelleği. RFC 9111’in diliyle paylaşılan önbelleğin kenardaki hâli.
Aradığın nesne kenarda yoksa kenar sunucu onu menşe sunucudan alıyor, kendine saklıyor, sana veriyor. Aynı anda iki rol taşıyor: sana sunucu, menşeye istemci.
Her nesne bu yolu izlemiyor. Akış hizmetlerinde aynı videonun farklı kodlamaları kenar düğümlerine önceden yükleniyor. İstek geldiğinde önce bir manifest dosyası dönüyor, ve her parçayı hangi düğümden çekeceğine istemci kendi karar veriyor.
Kopyanın güncelliğini koşullu GET koruyor. Mekanizma aynı; burada kenar ile menşe arasında çalışıyor.
Asıl yeni olan şey ömrün ikiye bölünmesi. Süreyi içerik sahibi belirliyor ve kenara ayrı, tarayıcıya ayrı ömür verebiliyor. Bunu yapan yönerge s-maxage: yalnızca paylaşılan önbelleğe hitap ediyor, tarayıcının özel önbelleğini hiç ilgilendirmiyor, ve hem max-age’i hem Expires’ı eziyor. Kenardaki kopya çok daha uzun yaşıyor.
Kazanç iki kalemde ayrı ayrı sayılıyor: cevap süresi ve bant genişliği tüketimi. İkincisi erişim hattındaki trafiği düşürüyor, ve doyuma yaklaşan bir hatta kuyruk gecikmesini çökertiyor. Birincisini bir örnek üstünde görelim.
kenar isabet oranı 0,85 kenara gidiş-dönüş 12 ms
menşeye düşen pay 0,15 menşeye gidiş-dönüş 180 ms
ortalama = 0,85 × 12 + 0,15 × 180 = 10,2 + 27 = 37,2 msMenşeye her seferinde gitmeye göre kazanç yaklaşık 4,8 kat. İsteklerin %85’i hiç uzağa çıkmıyor.
Ama o 0,85 gökten inmiyor. Bütün hesap tek bir şeye bağlı: kenar sunucu iki isteğin aynı nesneyi istediğine nasıl karar veriyor?
Cevabı önbellek anahtarı veriyor. Varsayılan hâlde bu anahtar metot ile tam adresten oluşuyor: GET https://ornek.com/logo.png. İki isteğin anahtarı aynıysa ikinci istek isabet sayılıyor.
Sorun şu ki aynı adres her zaman aynı cevabı üretmiyor. Sunucu sıkıştırmayı destekleyen istemciye sıkıştırılmış, desteklemeyene ham gövde yolluyor olabilir. Kenar sunucu bunu bilmezse birine ait cevabı ötekine verir. Sunucu bu yüzden cevaba bir uyarı iliştiriyor:
Vary: Accept-EncodingVary başlığı önbelleğe “bu cevap şu istek başlığına göre değişiyor, anahtara onu da kat” diyor. Böylece aynı adres için birden çok kopya tutuluyor ve her istemci doğru olanı alıyor.
Buradaki bıçak iki taraflı ve pratikte en sık yapılan yapılandırma hatası burada. Vary listesine eklenen her başlık, o başlığın her farklı değeri için ayrı bir kopya demek. Accept-Encoding iki üç değer alır, zararsız. Ama Vary: User-Agent yazarsan, tarayıcı sürümü kadar ayrı kopya oluşur — pratikte binlerce. Her biri ayrı ayrı ısıtılmayı bekler, isabet oranı çöker ve yukarıdaki 37,2 ms hızla 180 ms’ye yaklaşır. Kenar sunucu hâlâ çalışıyordur; yalnızca hiçbir şeye yaramıyordur.
Aynı sebeple sorgu dizesindeki izleme parametreleri de önbelleği parçalıyor. Aynı görselin sonuna eklenmiş bir kampanya etiketi, kenar için bambaşka bir nesne demek. Ciddi yapılandırmalarda bu yüzden anahtarın hangi parametreleri kapsayacağı elle sayılıyor.
İşin bir de tersi var. Kenardaki makine yalnızca kopya tutan bir raf olmak zorunda değil; üstünde küçük kod parçaları da çalıştırabiliyor. Kenar hesaplama denen bu yetenek, menşeye hiç gitmeden karar verilebilen işleri kenara indiriyor: bir yönlendirme kuralı, bir oturum denetimi, kullanıcının ülkesine göre farklı bir sayfa. Kazanç aynı yerden geliyor — yayılım gecikmesi, kararı veren makine yaklaştıkça küçülüyor.
Zincire üçüncü katmanı DNS önbelleği katıyor. Kayıtlar yaşam süresi dolunca kendiliğinden düşüyor. Bir ad yeni adrese taşındığında değişiklik bütün süreler dolana kadar internet genelinde bilinmiyor. Addan adrese çeviri en iyi çaba temelli.
Şimdi kendi makinene bak. Bir nesneyi iki kez iste ve ikinci cevabın başlıklarını oku:
> curl -sI https://example.com/logo.png
HTTP/2 200
cache-control: public, max-age=86400, s-maxage=604800
age: 214Bu çıktıda tarayıcıya bir gün, kenara bir hafta ömür verilmiş. Age başlığı, cevabın menşede üretilmesinin ya da doğrulanmasının üstünden geçen saniye sayısını taşıyor. Sıfırdan büyük bir değer, cevabın önbellekten geldiğinin doğrudan kanıtı. 0 saniye görürsen kopya menşeden taze gelmiş.
Seni yönlendiren çözücüyü de görebilirsin. ipconfig /all çıktısındaki DNS Servers satırı, senin adına soran makineyi veriyor, ve EDNS Client Subnet kapalıyken bütün bu seçim onun adresine bakılarak yapılıyor.
Özet
Peki, ne öğrendik?
- Karar sen fark etmeden alınıyor: yazdığın ad CDN’in yetkili sunucusuna devrediliyor ve asıl adres orada seçiliyor.
- CNAME zinciri kimin sunduğunu gizliyor: kayıt dört alan taşıyor ve zincir sonunda mutlaka bir A kaydına düşüyor.
- EDNS Client Subnet tahmini düzeltirken adresini açıyor: IPv4 için 24 bitlik kırpma öneriliyor, ve RFC özelliğin varsayılan olarak kapalı gelmesini istiyor.
- Anycast aynı adresi çok yerde ayakta tutuyor: sınırı havza çiziyor, bedeli izlemede çıkıyor.
- Kenar sunucu paylaşılan bir önbellek: kazancı hem gecikmede hem erişim hattının trafiğinde ölçülüyor.
Kenar sunucunun kapısına vardık ve cevap artık birkaç milisaniye uzakta. Ama aynı kabloda o an akan her şey web değil. Peki aynı ağda o an başka ne akıyor?
Bölüm 16: Diğer Uygulama Protokolleri
İsteğimiz hâlâ yolda. Ama aynı kabloda o an akan tek şey o değil: komşu dairede bir film oynuyor, bir posta sunucusu kuyruğunu boşaltıyor, biri dosya paylaşıyor.
Şimdiye kadar ağı tek bir isteğin gözünden anlattım. Bu bölümde diğerlerine bakıyoruz; ihtiyaçları bambaşka. Aynı taşımadan ne bekliyorlar?
Bir protokolü protokol yapan nedir?
Uygulama katmanında bir protokolün tanımlaması gereken dört şey var. Birincisi hangi ileti türlerinin değişileceği: istek ve yanıt. İkincisi sözdizimi, yani hangi alanların bulunduğu ve nasıl ayrıldığı. Üçüncüsü o alanların ne anlama geldiği. Dördüncüsü süreçlerin ne zaman gönderip nasıl karşılık vereceği.
Bu dördünün tanımını herkesin okuyabildiği bir belgede bulabiliyorsan elinde bir açık protokol var demektir; o belge de çoğu zaman bir RFC oluyor. Elle yazdığın istek satırının çalışma sebebi buydu: karşı taraf aynı belgeyi okumuştu. Karşısında tescilli protokoller var; görüntülü toplantı uygulamalarının çoğunda telde ne aktığını yalnızca üreticisi bilir.
İkinci ayrımı mimaride yapıyorsun. İstemci-sunucu mimarisinde bir uçta sürekli açık duran, kalıcı adresli bir makine bulunuyor. İstemciler aralıklı bağlanıyor, adresleri değişebiliyor ve birbirleriyle hiç konuşmuyor. HTTP, IMAP ve FTP bu mimarinin örnekleri.
Eşler arası mimaride sürekli açık sunucu yok. Her uç hizmeti başka uçlardan istiyor, karşılığında kendisi de veriyor; dosya paylaşımında BitTorrent böyle çalışıyor. Kazancına kendiliğinden ölçeklenme deniyor: katılan her yeni eş sisteme yeni talep getirirken aynı anda yeni kapasite de getiriyor. Bedelini ise yönetim karmaşası olarak ödüyorsun. Burada hizmeti veren uçlar da aralıklı bağlı ve adresleri değişiyor.
Zarfın üstü mektubun içiyle aynı olmak zorunda mı?
E-postayı üç parçaya ayırabilirsin: kullanıcı ajanı, posta sunucuları ve SMTP. Yazdığın ileti senin makinende durmuyor; giden de gelen de sunucuda saklanıyor. Sunucunun içinde de iki ayrı yapı buluyorsun. Kullanıcı başına bir posta kutusu gelen iletileri tutuyor, bir de giden kuyruğu var.
Kuyruktaki iletiyi taşıyan protokole SMTP deniyor. Gönderen sunucu, alan sunucuya kendisi bağlanıyor ve arada aracı bir depo bulunmuyor. Bağlantı TCP üzerinden 25 numaralı porta açılıyor ve bağlantıyı başlatan taraf istemci rolüne giriyor. O taraf da bir posta sunucusu. Aktarımı üç evrede tamamlıyorlar: selamlaşma, iletilerin aktarımı ve kapanış.
Komutları düz ASCII metin olarak yazıyorsun; yanıtlar da üç haneli bir kod ile kısa bir ifadeden oluşuyor. Belgeleme için ayrılmış adlarla oturum şöyle görünüyor:
220 mail.example.com ESMTP hazir
HELO gonderen.example.net
250 merhaba gonderen.example.net
MAIL FROM: <deniz@example.net>
250 gonderen kabul edildi
RCPT TO: <arda@example.com>
250 alici kabul edildi
DATA
354 govdeyi bekliyorum, sonu tek nokta
From: deniz@example.net
To: arda@example.com
Subject: kablo raporu
Rapor ekte.
.
250 ileti teslim icin alindi
QUIT
221 kapaniyorumİletinin bittiğini ayrı bir uzunluk alanından değil, tek başına nokta içeren bir satırdan anlıyorsun; yani CRLF.CRLF dizisinden. Bağlantı da kalıcı kalıyor: aynı TCP bağlantısından arka arkaya birçok ileti geçebiliyor.
İki kısıt daha var. SMTP hem başlığın hem gövdenin 7 bitlik ASCII olmasını şart koşuyor. Resim ya da PDF bu boruya olduğu gibi giremiyor, önce ASCII’ye kodlanıyor. Bunu yapan katmanın adı MIME, en bilinen kodlaması base64. Base64 her üç baytı dört karaktere açtığı için gövde yaklaşık %33 şişiyor. İkinci kısıt paketleme: HTTP her nesneyi kendi yanıtında taşırken SMTP birden çok nesneyi tek bir çok parçalı iletide taşıyor. Eklerin aynı iletinin içine girmesinin sebebi bu. Yön de ters: HTTP’de istemci çeker, SMTP’de istemci iter.
Taşıyan protokolle iletinin biçimi ayrı standartlarda duruyor. Aktarımı RFC 5321 tanımlıyor, eski numarası RFC 821’di. İletinin sözdizimi ise RFC 5322’de, eski numaraları RFC 2822 ve RFC 822’ydi. İskelet tanıdık: başlık satırları, boş bir satır, sonra gövde.
Yukarıdaki oturumda iki ayrı adres kümesi geçti. MAIL FROM ile RCPT TO zarfın üstünü yazıyor. From: ve To: satırları ise mektubun içinde duruyor. İkisinin aynı olma zorunluluğu yok ve sahte gönderen sorununun kökü tam olarak burası. SMTP iletinin içeriğiyle ilgilenmiyor; tek işi onu hedef makineye ulaştırmak.
Sahte gönderen nasıl kapatıldı?
Yukarıdaki oturumda hiçbir yerde kimlik kanıtı istenmediğine dikkat et. MAIL FROM satırına istediğini yazabilirsin; SMTP sana inanır. 1982’de bu bir kusur değildi, çünkü ağdaki herkes birbirini tanıyordu. Bugün kusur.
Protokolü değiştirmek mümkün olmadı — dünyadaki her posta sunucusunu aynı gün güncelleyemezsin. Onun yerine üç ayrı katman DNS üzerinden eklendi, ve üçü de TXT kaydını kullanıyor.
SPF en basiti: alan sahibi, “benim adıma yalnızca şu IP adresleri posta gönderebilir” diye bir liste yayımlıyor.
example.net. TXT "v=spf1 ip4:198.51.100.0/24 include:_spf.saglayici.com -all"Alıcı sunucu, bağlanan makinenin adresini bu listeye karşı sınıyor. Sondaki -all “listede yoksa reddet” demek. Kusuru da var: MAIL FROM alanına, yani zarfın üstüne bakıyor — kullanıcının gördüğü From: satırına değil. Üstelik ileti bir posta listesi üzerinden yönlendirilirse gönderen adres değişir ve SPF kırılır.
DKIM başka bir yerden yakalıyor: imza. Gönderen sunucu, seçtiği başlıkları ve gövdeyi özel anahtarıyla imzalayıp iletiye bir DKIM-Signature başlığı ekliyor. Açık anahtar yine DNS’te, secici._domainkey.example.net adresinde duruyor. sayısal imzanın posta zarfındaki hâli bu. Yönlendirmeye dayanıyor, çünkü imza iletiyle birlikte seyahat ediyor. Kusuru: imzayı atan alanın, kullanıcının gördüğü From: alanıyla aynı olması gerekmiyor.
İki mekanizma da aynı boşluğu bırakıyor: kullanıcının gördüğü satır hâlâ korunmuyor.
DMARC o boşluğu kapatıyor ve üçlünün çatı katı. Alan sahibi _dmarc.example.net adresinde bir politika yayımlıyor:
_dmarc.example.net. TXT "v=DMARC1; p=reject; rua=mailto:rapor@example.net"Şartı iki parçalı. Birincisi, SPF ya da DKIM’den en az biri geçmeli. İkincisi ve asıl yenilik: geçen mekanizmanın alanı, From: satırındaki alanla hizalı olmalı. Böylece imzayı saldirgan.com atıp From: satırına bankaniz.com yazmak işe yaramıyor. p= politikası ne yapılacağını söylüyor: none yalnızca raporla, quarantine spam klasörüne at, reject hiç kabul etme.
rua= adresi de az bilinen ama değerli bir parça: uyumlu alıcılar, alan adına kimin posta göndermeye çalıştığını özetleyen günlük raporlar yolluyor. Alan sahibi böylece kendi adının nerede kötüye kullanıldığını görebiliyor.
Üçünün ortak dersi şu: kimliği protokole ekleyemedikleri için adın yanına eklediler. Posta sunucusu değişmedi; değişen şey, o sunucunun DNS’e bir soru daha sorması oldu.
İleti sunucuda; onu kim alıyor?
SMTP çizgiyi burada çekiyor. İletiyi alıcının sunucusuna teslim ediyor ve orada bırakıyor; sunucudan almak ayrı bir erişim protokolünün işi. IMAP iletileri sunucuda tutuyor ve alma, silme, klasör yönetme işini üstleniyor; tanımı RFC 3501’de. IMAP ile POP3’ün numaraları 143 ile 110; ikisi de iyi bilinen port aralığının içinde kalıyor.
Tarayıcıdan girdiğin posta hizmetine webmail deniyor ve yeni bir protokol getirmiyor. HTTP arayüzünü göndermek için SMTP’nin, almak için IMAP ya da POP’un üstüne koyuyor.
Video akışı neden bir indirme sayılmıyor?
2020’de servis sağlayıcıların konut trafiğinin %80’i üç akış hizmetine gidiyordu. Aynı filmi isteyenlerin bağlantıları da birbirine benzemiyor: kimi fiberde, kimi hücresel veride.
Video, sabit hızda gösterilen bir görüntü dizisi. Saniyede 24 görüntü tipik bir gösterim hızı, kayıtta saniyede 30 kare de yaygın. Her görüntü bir piksel dizisi ve her piksel bitlerle temsil ediliyor. Ham hâlde bu sayı devasa. Kodlama onu, görüntü içindeki ve görüntüler arasındaki tekrarı kullanarak düşürüyor. Sabit bit hızında kodlama hızı sabit kalıyor, değişken bit hızında sahnedeki tekrara göre oynuyor. Somut karşılıkları var: MPEG 1 için 1,5 Mbit/s, MPEG2 için 3 ile 6 Mbit/s, MPEG4 için 64 Kbit/s ile 12 Mbit/s arası.
Bir hesap bunu yere indiriyor. 5 Mbit/s sabit hızda iki saatlik film 7.200 saniye × 5 Mbit, yani 36.000 Mbit tutuyor: kabaca 36 Gbit, yaklaşık 4,5 GB. İzlemeye başlamadan önce bunun inmesini beklemek kabul edilebilir bir şey değil.
Akışın tanımı da zaten bu: sen videonun başını izlerken sunucu hâlâ sonrasını gönderiyor. Kısıt sert. Oynatma zamanlaması kaydın özgün zamanlamasıyla aynı olmak zorunda, ağ gecikmesi ise değişken. Bu yüzden istemci tarafında bir tampon şart; ağın eklediği gecikmeyi ve gecikme oynamasını o karşılıyor. Üstüne duraklatma, sarma ve ortaya atlama da isteniyor.
İkinci sorun bant genişliği. Sunucudan sana kalan pay zamanla değişiyor; tıkanıklık evde de, erişim ağında da, çekirdekte de olabiliyor. Kayıp ve gecikme ya oynatmayı geciktiriyor ya da görüntüyü bozuyor.
DASH bu iki sorunu tek tasarımla karşılıyor. Sunucu dosyayı parçalara bölüyor ve her parçayı birden çok hızda kodlayıp ayrı dosyalarda saklıyor. Manifest dosyası bu parçaların adreslerini veriyor; istemcinin elindeki tek harita o. İstemci bant genişliğini düzenli aralıklarla ölçüyor, her seferinde tek bir parça istiyor ve o an sürdürebileceği en yüksek hızı seçiyor. Zekâ sunucuda değil, istemcide. Üç kararı da o veriyor: parçayı ne zaman isteyeceğini, hangi kodlama hızını isteyeceğini ve hangi sunucudan isteyeceğini.
Şimdi parça süresini 4 saniye olarak kabul edelim. İki saatlik film 1.800 parça eder, yani tek bir film için 1.800 ayrı HTTP isteği. Aynı hızda tek parça 20 Mbit, yani 2,5 MB. DASH’in açılımı da bunu söylüyor: HTTP üzerinden dinamik, uyarlanır akış. O parçaların hangi makinede durduğu ise kenar sunucularında çözülmüştü.
DerinleşmeNeden yeni bir akış protokolü değil de sıradan HTTP?
Video için özel bir protokol tasarlamak teknik olarak daha zarif duruyor. Zamanlamayı doğrudan yönetebilir, kaybı seçici toparlayabilir, hızı akışa göre ayarlayabilirdi. Yine de yaygın çözüm sıradan HTTP istekleri oldu. Sebebi üç tane ve üçü de mühendislikten çok ekonomiden geliyor.
Birincisi yolun açık olması. Aradaki güvenlik duvarları, adres çeviricileri ve kurumsal vekiller yıllardır 80 ile 443 numaralı portlardan geçen trafiği tanıyor. Yeni bir protokol bunların her biriyle tek tek pazarlık etmek zorunda kalırdı.
İkincisi altyapının hazır olması. Parçalar sıradan dosya olduğu için var olan önbellekler, kenar sunucuları ve ölçüm araçları hiç değişmeden çalışıyor. Bir parça bir kez çekildiğinde kenardaki kopya sonraki isteyene aynı dosyayı veriyor.
Üçüncüsü sunucunun sadeleşmesi. Karar istemciye geçtiği için sunucunun akılda tutacağı bir oturum durumu kalmıyor, her istek bağımsız. Milyonlarca izleyiciyi tutan tarafta bu doğrudan maliyet demek.
Bedeli de var. Tıkanıklık denetimiyle tampon doldurma aynı anda çalışınca istemcinin ölçtüğü bant genişliği yanıltıcı olabiliyor. Aynı hattan iki akış birden geçtiğinde ikisi de kendini olduğundan hızlı sanıp kaliteyi yukarı çekiyor, sonra beraber düşüyor. Kalite oynaması izleyicinin en çok şikâyet ettiği şey ve kaynağı burası.
Aynı kablodan geçen sesler taşımadan ne istiyor?
Hepsi aynı taşıma katmanının üstünde duruyor ama ondan aynı şeyi istemiyor. İstekler dört eksende ayrışıyor: veri bütünlüğü, zamanlama, throughput ve güvenlik.
Dosya aktarımı ve web işlemleri %100 güvenilirlik istiyor; tek bayt eksik gelen arşiv bozuk arşivdir. Ses ise bir miktar kaybı kaldırıyor. Throughput tarafında da bantlar var: gerçek zamanlı ses 5 Kbit/s ile 1 Mbit/s arasında, akan video 10 Kbit/s ile 5 Mbit/s arasında çalışıyor. Elastik uygulamalar ne bulursa onu kullanıyor. Bu istekler protokol seçimine dönüşüyor:
| Uygulama | Uygulama protokolü | Taşıma |
|---|---|---|
| e-posta | SMTP (RFC 5321) | TCP |
| dosya aktarımı | FTP (RFC 959) | TCP |
| internet telefonu | SIP (RFC 3261), RTP (RFC 3550) ya da tescilli | TCP veya UDP |
| akan video | HTTP, DASH | TCP |
| uzaktan oturum | Telnet (RFC 854), SSH | TCP |
Telefonun UDP tarafına düşebilmesi tesadüf sayılmaz: 6. bölümde bağlantısız gönderimi anlatırken geç gelen verinin hiç gelmemiş sayıldığını söylemiştim.
Listede bir de tarihsel kalıntı duruyor. Telnet uzaktaki makineye bağlanıp komut vermeyi sağlıyor; ama parolalar dahil her şey açık gidiyor. SSH aynı işi güçlü bir şifrelemeyle yapıyor. Bugün 23 numaralı portun yerini 22 almış durumda.
Bu adların hepsi kendi makinende tek bir dosyada duruyor:
grep -E '^(ftp|ssh|telnet|smtp|domain|http|pop3|imap2)[[:space:]]' /etc/servicesHer satırda bir ad, bir numara ve taşıma protokolü göreceksin: smtp 25/tcp gibi. Windows tarafında aynı liste %SystemRoot%\System32\drivers\etc\services yolunda duruyor. Bu bölümde adı geçen protokollerin hemen hepsini o satırlarda bulabilirsin.
Özet
Peki, ne öğrendik?
- Bir protokol dört şeyi tanımlar: ileti türlerini, sözdizimini, alanların anlamını ve gönderme kurallarını. Açık olanın tanımı bir RFC’de durur.
- E-postanın zarfı ile mektubu ayrı yazılır: MAIL FROM ile RCPT TO zarfın üstündedir, From: ile To: mektubun içindedir, ve ikisinin uyuşma zorunluluğu yoktur.
- SMTP teslim eder, erişim protokolü alır: ileti alıcının sunucusunda kalır, oradan çekme işini IMAP ya da POP3 yapar.
- Video akışı yüzlerce küçük istektir: 4 saniyelik parçalarla iki saatlik bir film 1.800 ayrı HTTP isteğine dönüşür ve hızını istemci seçer.
Aynı kablodan geçen sesleri tek tek duydun; kimi güvenilirlik istiyor, kimi zamanında gelmeyi. Ama hepsi o kabloya girerken aynı işlemden geçiyor. İstek makineden çıkacak; peki çıkarken tam olarak neye dönüşüyor?
Bölüm 17: Katmanlı Mimari
İstek makineden çıkarken düz metin olmaktan çıkıyor ve iç içe geçmiş zarflara dönüşüyor. O zarfların bir sırası var, ve o sırayı şimdiye kadar kasten adlandırmadım.
Adı katman. Zarfları bir sonraki durakta açacağız; burada onları saran düzeni kuruyoruz. Peki bu düzen neden kuruldu, ve içinde kaç kat var?
Bir katman neyin üstüne basıyor?
Katmanlı düzenin tanımını tek cümleye sığdırabilirsin. Bir katın elinde iki şey var: kendi yaptığı iş ve hemen altındakinden aldığı hizmet; dışarıya verdiği söz bu ikisinden çıkıyor. Daha aşağısını bilmiyor, ve bilmemesini bir eksik olarak görme — tasarımın kendisi bunu istiyor.
Kazancına modülerlik deniyor. Bir katmanın hizmetini nasıl ürettiği baştan aşağı değişebiliyor ve üstteki kat bunu hiç fark etmiyor. Kablo bakırdan cama dönüyor, tarayıcı tek satırını bile değiştirmiyor. Aynı bağımsızlığı öteki yönde de göreceksin: yeni bir uygulama protokolü yazmak için yol üstündeki yönlendiricilere dokunman gerekmiyor.
Bunu bir kargo şirketinin tezgâhında kolayca görebilirsin. Tezgâhtaki görevli kutunun içine bakmıyor; üstüne bir barkod yapıştırıyor ve işi bitiyor. Ayırma merkezindeki bant barkodu okumuyor, onun tek derdi şehir etiketi. Şoför şehir etiketini de umursamıyor; elinde yalnızca bir sefer listesi duruyor. Haritalama şöyle: kutu uygulamanın mesajı, barkod taşıma başlığı, şehir etiketi ağ başlığı, sefer listesi ise bağ katmanının çerçevesi. Benzetme şurada biter: kargoda tıkanan bir gönderi için görevli kutuyu açıp içine bakabilir, hatta bakmak zorundadır. Katmanlarda o yetki yok.
Modülerliğin yanında ikinci bir kazanç daha var ve adı adlandırma. Yığın açıkça bölündüğü için her parçanın ayrı bir adı, her sınırın ayrı bir yeri oluyor. Katmanlamayı önce bir konuşma dili, sonra bir mühendislik aracı olarak düşün. Arıza da o dille bulunuyor: bağlantı var ama isim çözülmüyor cümlesi, sorunun nerede olmadığını daha kimse bakmadan söylüyor.
Kaç katman var? Üç cevap, üçü de doğru
Katman sayısını sorduğunda üç ayrı rakam duyacaksın ve üçü de aynı ağı tarif ediyor.
OSI referans modeli yedi katman sayıyor; ilan edilmiş amacı karmaşıklığı azaltmak ve ortak standart geliştirmek. TCP/IP ise dörtle yetiniyor: Application, Transport, Internet, Network Interface. En alttaki Ağ Giriş katmanı, OSI’nin veri bağı ve fiziksel katmanlarının işini tek başına görüyor; ona host-to-network da deniyor. Ders kitaplarının çoğu ise ikisinin arasında duran beş katmanlı bir yığın öğretiyor. OSI’nin veri bağı dediği kata bu kitap boyunca bağ katmanı diyeceğim.
| Katman | İşi | Örnek |
|---|---|---|
| Uygulama | iki uçtaki programın konuştuğu dili kurar | HTTP, IMAP, SMTP, DNS |
| Taşıma | veriyi bir süreçten karşıdaki sürece teslim eder | TCP, UDP |
| Ağ | datagrama yol seçer ve varışa kadar iletir | IP, yönlendirme protokolleri |
| Bağ | veriyi yalnızca komşu düğüme kadar götürür | Ethernet, 802.11, PPP |
| Fiziksel | biti elektriğe, ışığa ya da dalgaya çevirir | bakır, radyo, fiber |
En alttaki satırın işi kulağa fazla sade geliyor olabilir. Oysa bir tel çekilmeden önce kararlaştırılması gereken her şeyi orada bulacaksın. Standart bunları dört başlıkta topluyor ve dördünü de bir bit yola çıkmadan cevaplamış olman gerekiyor:
- Mekanik: konnektörün şekli, kaç pin taşıdığı, boyutları. RJ-45’in sekiz pini bu başlıktadır.
- Elektriksel: bir bitin kaç volt olduğu, kaç mikrosaniye sürdüğü, hattın empedansı. 100 ohm’luk twisted pair (bükümlü çift) bu başlıktadır.
- İşlevsel: hangi pinin ne anlama geldiği. 1 ve 2 numaralı pinin “gönder” çifti olması bu başlıktadır.
- Yordamsal: olayların hangi sırayla olacağı. Bağlantı algılama darbeleri ve hız pazarlığı bu başlıktadır.
İki taraf bu dört başlıkta anlaşmamışsa iletim hiç başlamıyor. Bir uç sayısal 1’i +5 volt ve 2 mikrosaniye olarak gönderirken öteki uç +7 volt ve 5 mikrosaniye bekliyorsa, kablo sapasağlam olsa bile karşıya tek bir bit geçmiyor.
Internet yığınında karşılığı olmayan iki kat
OSI’nin yedilisinde TCP/IP’de karşılığı olmayan iki kat var. İkisi de “gerçeklenmedi” diye geçiştiriliyor; oysa ikisinin de tarif ettiği iş bugün fazlasıyla yapılıyor, sadece başka bir yerde.
Sunum katmanı tek bir soruyla uğraşır: aynı bit dizisini iki makine aynı şey olarak mı okuyor? Cevap kendiliğinden evet değil. OSI bu işi ikiye böler. Soyut sözdizim verinin ne olduğunu söyler — “bu alan bir tamsayı, şu alan bir tarih”. Aktarım sözdizimi ise o soyut tanımın telde hangi baytlara döneceğini söyler. İkisini ayırmak, aynı veriyi farklı kodlamalarla göndermeyi mümkün kılıyor.
Bu ayrımın bir gösterimi var ve adı ASN.1; kodlama kuralları da BER ve DER. Kulağa müzelik geliyor, değil: tarayıcının doğruladığı X.509 sertifikası ASN.1 ile tanımlı ve DER ile kodlanmış bir yapıdır. SNMP de aynı gösterimi kullanır. Sunum katmanı ölmedi; adı unutuldu.
İkinci iş bayt sırası. Bir sayıyı belleğe yazarken kimi işlemci en anlamlı baytı başa koyar, kimi sona. İki makine bu konuda anlaşmazsa 1.000 yazan biri karşıda 59.395 okur. Ağda bu yüzden tek bir kural var ve adı ağ bayt sırası: en anlamlı bayt önce. Ağ programı yazan herkes, sayıyı sokete koymadan önce bu sıraya çevirmek zorunda — ve o çevirme tam olarak sunum katmanının işi. Üçüncü iş karakter kodlaması, dördüncüsü sıkıştırma, beşincisi şifreleme. Tarayıcının kurduğu şifreli kanal, kitap boyunca göreceğin en canlı sunum katmanı örneği.
Oturum katmanı ise iki tarafın konuşma düzenini yönetir. Üç işi var. Birincisi diyalog denetimi: sıranın kimde olduğunu belirler, çünkü yarım çift yönlü bir hatta iki tarafın aynı anda konuşması karışıklık demektir. İkincisi eşitleme noktaları: uzun bir alışverişin içine işaretler koyar, bağlantı koptuğunda taraflar en son işaretten devam eder. Üçüncüsü etkinlik yönetimi: birden çok işi tek bir oturumun içinde sıraya dizer.
İkinci iş bugün her yerde. İki saatlik bir dosya transferi %90’da koptuğunda baştan başlamıyorsan, birileri oturum katmanının işini yapıyor demektir — ve o birileri uygulamanın kendisi. HTTP’nin Range başlığı, kesilen indirmeyi kaldığı bayttan sürdüren istemci, QUIC’in bağlantı kimliği: üçü de ayrı bir kat açmadan aynı hizmeti kuruyor.
Internet yığınının kararı “bu işler gereksiz” değildi. Karar şuydu: bu işler her uygulama için aynı değil, o hâlde zorunlu bir kat yapma. Bir dosya transferi eşitleme noktası ister, bir DNS sorgusu istemez. Zorunlu kat, istemeyene de fatura keser.
DerinleşmeOSI hiç gerçeklenmediyse neden hâlâ öğretiliyor?
ISO çalışmayı 1977’de başlattı, modeli 1984’te yayımladı ve 1994’te bir kez gözden geçirdi. Belgenin numarası ISO-7498. Ortaya çıkan şey bir ürün değildi ve hiç olmadı: OSI programı diye bir yazılım, OSI donanımı diye bir kutu yok. Üreticiler yalnızca modelin tarif ettiği kurallara uyuyor.
Ethernet literatürü daha da ileri gidiyor. Model, hangi işin hangi kata düştüğünü sıralar; o işi kimin, hangi kutuda, hangi koddan gerçekleyeceğine karışmaz. Betimleme ile reçete arasındaki fark küçük görünüyor, sonuçları büyük. TCP/IP daha önce geliştirildi, çalışan koduyla geldi ve sahayı aldı. OSI geç kaldı, ve kendi katmanlarının ikisi hiçbir yığında gerçeklenmedi.
Buna rağmen model ölmedi, çünkü asıl ürünü yazılım değil sözlüktü. Bugün bir ağ mühendisi üçüncü katman anahtarı dediğinde herkes yönlendirme yapan bir kutuyu anlıyor. Yedinci katmanda çalışan güvenlik duvarı dediğinde, o kutunun istek başlıklarına baktığını anlıyor. Bu numaralar OSI’den kalma ve TCP/IP’nin dörtlüsü onları hiç üretmedi.
Bir arıza toplantısında da aynı sözlük iş görüyor. Sorun ikinci katmanda mı yoksa üçüncüde mi sorusu, kabloyla yönlendirme tablosunu tek hamlede ayırıyor. Kimse ölçü aletine sarılmadan önce arama alanı yarıya iniyor.
Hangi cihaz hangi katmanda durur?
Sözlüğün asıl işi burada başlıyor. Bir kutunun kaçıncı katmanda çalıştığını belirleyen şey markası ya da fiyatı değil, okuduğu en derin başlıktır. Bir cihaz hangi başlığa kadar iniyorsa o katmanın cihazıdır; daha yukarısını görmez, daha aşağısını zaten taşımak zorundadır.
Aynı katmanın taşıdığı veri parçasının da her katta ayrı bir adı var. Adlar keyfî değil, konuşurken hangi zarftan bahsettiğini belirsizlikten kurtarıyor.
| Katman | Veri parçasının adı | Bu katta duran cihazlar | Karar verirken neye bakar |
|---|---|---|---|
| Uygulama | ileti / veri | vekil sunucu, ters vekil, uygulama güvenlik duvarı, 7. katman yük dengeleyici | istek satırı, başlıklar, alan adı, yol |
| Sunum | veri | şifreleme sonlandıran kutular | gösterim ve kodlama |
| Oturum | veri | ayrı bir kutusu yok | konuşma düzeni |
| Taşıma | segment (TCP) / datagram (UDP) | durum bilgili güvenlik duvarı, NAT, 4. katman yük dengeleyici | port numaraları ve bağlantı durumu |
| Ağ | paket | yönlendirici, 3. katman anahtar, temel güvenlik duvarı | hedef IP adresi |
| Bağ | çerçeve | anahtar, köprü, kablosuz access point (erişim noktası), ağ kartı | hedef MAC adresi |
| Fiziksel | bit | hub, tekrarlayıcı, medya dönüştürücü, kablo, konnektör, prizin kendisi | hiçbir şeye; yalnızca sinyali geçirir |
En üst satırdaki adlar şimdilik yabancı gelebilir; hepsi ileride tek tek açılıyor. Kabaca karşılıkları şöyle: vekil sunucu istemcinin isteğini onun adına ileten kutu, ters vekil aynı işi sunucunun önünde yapan ve istemcinin gerçekte konuştuğu kutu, yük dengeleyici ise gelen istekleri arkadaki birden çok sunucuya dağıtan kutu.
Tabloyu tersten okursan daha çok şey öğreniyorsun. En alttaki cihazın verecek hiçbir kararı yok. Hub gelen elektriği bütün portlara tekrar eder; içeride ne olduğunu bilmez, bilmesi de beklenmez. Bir üste çıktığında cihaz ilk kez bir alana bakıp bir karar veriyor: anahtar hedef MAC adresini okur ve çerçeveyi yalnızca o adresin öğrenildiği porta yollar. Bir üste daha çıktığında karar yerelden çıkar; yönlendirici hedef IP adresine bakar ve paketi başka bir ağa iletir.
Bu tırmanışın somut bir bedeli var: cihaz ne kadar yukarı çıkarsa paket başına o kadar çok iş yapar. Hub’ın gecikmesi mikrosaniyeler, anahtarınki onlarca mikrosaniye, yönlendiricininki daha fazla, istek başlıklarını ayrıştıran bir vekil sunucununki milisaniye mertebesindedir. Kutuyu yukarı taşımak her zaman gecikme satın almak anlamına geliyor.
İki uyarı da tabloyu doğru okumak için gerekiyor. Birincisi, bir cihazın kendi katmanının altındaki her katmanı da gerçeklemesi zorunludur. Yönlendirici üçüncü katman cihazıdır ama çerçeveyi çözmeden pakete ulaşamaz; her portu aynı zamanda ikinci ve birinci katmanda da çalışır. Katman numarası, cihazın tavanını söyler, tamamını değil.
İkincisi, saha adları modelin sınırlarını umursamıyor. 3. katman anahtar, anahtar donanımının hızıyla yönlendirme yapan bir kutudur; ismi ikinci katmanı, işi üçüncüyü anlatır. Ev kutun ise tek kasada modem, yönlendirici, anahtar ve access point’i birleştirir; birinci katmandan üçüncüye kadar hepsinde birden iş görür. Böyle bir kutuya tek bir numara vermek mümkün değildir — ve gerekmez de. Sorulması gereken soru “bu kutu kaçıncı katmanda?” değil, “bu kutu şu anda hangi başlığa bakıyor?” sorusudur.
Aynı harita bir arıza toplantısında da yön veriyor. Bir bağlantı hiç kurulmuyorsa sıra alttan başlar: kablo takılı mı, ışık yanıyor mu, karşı MAC öğrenilmiş mi, hedefe giden bir yol var mı, port açık mı, sunucu cevap veriyor mu. Her basamak bir katmandır ve her basamak arama alanını bir kat daraltır.
Komşuya verilen söz nedir?
Bir katmanın üç muhatabı var: altındaki, üstündeki ve karşı makinedeki eşi. İlk ikisiyle dikey, üçüncüsüyle yatay konuşuyor. Dikey ilişkinin adı hizmet, yatay ilişkinin adı protokol.
Sözleşme çift yönlü. Bir kat aynı anda hem üstüne hizmet veriyor hem altından hizmet alıyor. Hizmetin sınırını bir liste çiziyor; katmanın dışarıya açtığı temel işlemler neyse hizmet o kadar. Protokol ise iki eşin, kimin ne zaman ne göndereceğine dair önceden verdiği söz. Bu ikisini ayrı tutmak, kitabın geri kalanında çok işine yarayacak.
Bu ayrımın kolayca kaçırılan bir sonucu var: hizmet ile protokol bağımsız değişkenlerdir. Aynı hizmeti farklı protokollerle verebilirsin: taşıma katmanının “güvenilir bayt akışı” hizmetini TCP de verir, QUIC de. İkisinin içi tamamen başka, dışarıya verdikleri söz aynı. Bu yüzden bir uygulamayı TCP’den QUIC’e taşımak, üstündeki kodu baştan yazmayı gerektirmiyor.
Hizmetler ikiye ayrılır ve bu ayrım kitabın üçte birini açıklıyor. Bağlantı yönelimli hizmette önce bir kurulum yapılır, sonra veri akar, sonunda bağlantı kapatılır — telefon gibi. Bağlantısız hizmette kurulum yoktur; her birim kendi başına, kendi adresiyle yollanır — mektup gibi. 7. bölümde üç mesajlık el sıkışmayı kuran TCP birincisi, 6. bölümde hiçbir söz vermeyen UDP ikincisidir. IP de bağlantısızdır; güvenilir bir taşıma katmanının bağlantısız bir ağ katmanı üstünde durabilmesi, katmanlamanın en güçlü gösterisidir.
Bu kadar soyut bir sözleşmenin çok somut adları var. Uygulama ile taşıma arasındaki arayüz port numarasıdır; iyi bilinen iki örnek HTTP’nin 80 ve FTP’nin 21 numarasıdır. Çoklama çözme, tam olarak bu arayüzün sözleşmesi üstünde duruyor. Bağ ile ağ arasındaki arayüz ise Ethernet çerçevesinin 2 baytlık tür alanı. O alan, çerçevenin içindekinin üstteki hangi protokole teslim edileceğini söylüyor; bağ katmanının çoklama çözmesi tek bir alana sığmış durumda. Aynı işi LLC katmanında Service Access Point yapıyor.
Taşınan şeyin adı da katman katman değişiyor.
| Katman | Veri biriminin adı |
|---|---|
| Taşıma | segment |
| Ağ | datagram |
| Bağ | çerçeve |
| Fiziksel | bit |
Dördünün ortak adına Protocol Data Unit deniyor; ağ katmanının birimine gündelik konuşmada paket de diyoruz. Adların değişmesini bir süs olarak görme: her kat bir öncekini yalnızca yük sayıyor. Başlık, o katın kendi hizmetini gerçeklemek için var. Bağ katmanı sararken başlığın yanına bir de kuyruk ekliyor; üstündeki katlarda böyle bir şey görmeyeceksin, onlar yalnızca başlık koyuyor.
Bu cümleyi tek bir denklemde toplayabilirsin. Üstten inen veriye o katın gözünden hizmet veri birimi (SDU) denir; kat kendi denetim bilgisini, yani protokol denetim bilgisini (PCI) ekler ve ortaya kendi protokol veri birimi (PDU) çıkar:
(N)-PDU = (N)-PCI + (N)-SDU ve (N)-PDU = (N−1)-SDUİkinci eşitlik kapsüllemenin tanımını veriyor: bir katın ürettiği paket, bir alttaki katın gözünde ham veriden başka bir şey değil. Taşımanın ürettiği segment ağ katmanının SDU’su, ağ katmanının ürettiği datagram bağ katmanının SDU’sudur. Zarfın içinde zarf tam olarak budur ve bir sonraki bölümde aynı işi bayt bayt sayacağız.
Bir yer daha var ve orada tek bir kat kendi içinde ikiye bölünmüş durumda. Bağ katmanı IEEE 802 ailesinde iki alt katmandan oluşuyor. Alttaki MAC alt katmanı hattı kimin ne zaman kullanacağına karar veriyor ve fiziksel adresi taşıyor; Ethernet’in ve Wi-Fi’ın farklı olduğu yer burasıdır. Üstteki LLC alt katmanı (IEEE 802.2) ise üst katmana tek tip bir yüz gösteriyor. Bölünmenin sebebini ekonomide bulacaksın: ağ katmanı, altında bakır mı radyo mu olduğunu umursamak zorunda kalmıyor. ağ kartı denetleyicisinin çipte gerçeklediği şey tam olarak MAC alt katmanıdır.
DerinleşmeBir hizmet çağrısı resmî olarak nasıl yazılır?
OSI hizmeti ne bir fonksiyon imzası ne bir API olarak tanımlar. Onun yerine dört soyut hizmet ilkeli kullanır ve bir hizmet çağrısını bu dördün dizilişiyle yazar.
| ilkel | kim çağırır | ne demek |
|---|---|---|
request | üstteki kat, gönderen uçta | “şu hizmeti başlat” |
indication | katman, alan uçtaki üstüne | “karşıdan böyle bir istek geldi” |
response | üstteki kat, alan uçta | “kabul ediyorum / şu cevabı ver” |
confirm | katman, gönderen uçtaki üstüne | “işlem sonuçlandı, sonucu bu” |
Bir bağlantı kurulumu bu dizilişle yazılır: CONNECT.request → (ağ) → CONNECT.indication → CONNECT.response → (ağ) → CONNECT.confirm. Dört ilkelin tamamı kullanılıyorsa hizmet onaylı, yalnızca ilk ikisi kullanılıyorsa onaysızdır. Veri gönderimi çoğu zaman onaysızdır: DATA.request gider, karşıda DATA.indication doğar, geriye bir şey dönmez.
Bu gösterimin bugünkü değeri iki tane. Birincisi, bir protokol belgesini okurken hizmetin tarifi ile mesajların tarifini birbirinden ayırmayı öğretiyor — ilki katmanın ne söz verdiği, ikincisi telde ne geçtiği. İkincisi, sözlüğün kendisi hâlâ dolaşımda: hücresel ağların 3GPP belgeleri bu dört ilkeli aynen kullanır, ve çekirdek ağın arayüz tanımları böyle yazılmıştır.
Somut bir karşılığını kendi makinende de görebilirsin. Bir sunucu soketinde listen() çağrısı katmanı hazır duruma sokar, karşıdan gelen SYN accept()’in dönmesiyle bir indication gibi yüzeye çıkar, accept()’in kendisi bir response gibi davranır ve istemci tarafındaki connect() çağrısının dönmesi bir confirmdir. Soket arayüzü OSI’nin sözlüğünü kullanmıyor ama aynı dört anı üretiyor.
Ayrımın en güzel sonucunu taşımada göreceksin. Taşımanın uygulamaya verdiği şeye mantıksal iletişim deniyor: iki makine doğrudan birbirine bağlıymış gibi görünüyor. Oysa arada yönlendiriciler var, ve paket anahtarlama her atlamada yeniden işliyor. Aynı datagram yol boyunca farklı bağ protokolleriyle taşınıyor. İlk atlamada onu Wi-Fi taşıyabiliyor, sonrakinde Ethernet; ikisi farklı hizmet veriyor ama datagram aradaki farkı hiç fark etmiyor.
Sınır bazen elle tutulur. Bağ katmanı çipte ya da ağ arayüz kartında gerçekleniyor, üstündeki katlar ise yazılım. Bakırdan radyoya geçtiğinde altındaki her şey değişiyor, MAC alt katmanı ise yerinde kalıyor.
Ortada neden tek bir protokol var?
Yığına yandan bakınca ortada bir daralma görüyorsun. Ağ katmanında tek bir protokol var: IP. Üstünde TCP, UDP, HTTP, SMTP ve QUIC yan yana yaşıyor. Altında Ethernet, Wi-Fi, Bluetooth ve PPP var, en altta da bakır, radyo ve fiber. Darlık yalnızca ortada, ve şekle bu yüzden kum saati deniyor.
Belin dar olmasının bedeli ağır. IP, İnternet’e bağlı milyarlarca cihazın her birinde gerçeklenmek zorunda. Karşılığında alınan şey de o kadar büyük: yeni bir bağ teknolojisi çıktığında yalnızca IP’yi taşıması yetiyor, üstündeki hiçbir protokolün haberi olmuyor.
Bunu yazıya döken belge RFC 1958 ve mimarinin üç köşe taşını sayıyor. Basit bağlanabilirlik, dar bel olarak IP, ve zekânın ağın kenarında durması. Aynı belge bir itirafı da taşıyor: mimari ilk 25 yıl boyunca hiç yazıya dökülmemişti.
Bel o günden beri kalınlaştı. Ağın içinde çalışan ara kutular araya girdi: adres çeviriciler, güvenlik duvarları, önbellekler. istek satırını okuyan bir ara kutu, tanımı gereği katman sınırını çiğniyor.
Katmanlamanın faturası
Buraya kadar hep kazancı saydım. Bedelini de saymak gerekiyor, çünkü üç kalemi var ve üçü de ölçülebilir.
Birinci kalem başlık. Her kat kendi başlığını ekliyor ve bu başlıklar veriye değil, katmanın kendi hizmetine ait. Tek bir HTTP yanıtının tam dolu bir çerçevesini say: 14 bayt Ethernet başlığı, 20 bayt IP, 20 bayt TCP, 4 bayt çerçeve sağlaması, telde ayrıca 8 bayt önsöz ve 12 bayt çerçeve arası boşluk. Toplam 78 bayt gider, 1.460 bayt veri taşınır. Telde harcanan 1.538 baytın %94,9’u işe yarıyor.
Şimdi aynı yığından tek bir tuş vuruşu geçir — uzak bir sunucuya bağlıyken bastığın bir harf. Veri 1 bayt. IP datagramı 41 bayta çıkıyor, çerçeve 59 bayt ediyor ve Ethernet’in 64 baytlık asgari çerçeve şartı yüzünden dolgu ile 64’e tamamlanıyor; telde 84 bayt. Bu kez işe yarayan oran %1,2.
Aynı yığın, aynı katmanlar, arada seksen kat fark. Katmanlamanın faturası sabit değil; paket küçüldükçe büyüyor. Protokollerin başlık sıkıştırmaya niçin bu kadar emek verdiğini bu iki sayı açıklıyor.
İkinci kalem tekrar. Aynı işin birden çok katta yapılması. Hata denetimini say: bağ katmanı çerçevenin tamamı için 4 baytlık bir CRC hesaplıyor, IPv4 kendi başlığı için ayrı bir sağlama tutuyor, TCP başlık ve veri için üçüncü bir sağlama üretiyor. Üç ayrı hesap, büyük ölçüde aynı baytların üstünde.
Gereksiz mi? Hayır, ve sebebi güzel. Uçtan uca bakınca yalnızca TCP’ninki zorunlu: veri ancak alıcı süreçte doğrulanırsa doğrulanmış sayılır, çünkü arada bozulma yalnızca telde değil bir yönlendiricinin belleğinde de olabilir. Alttaki ikisi zorunlu değil, erken. Bozuk bir çerçeveyi ilk atlamada atmak, onu kıtanın öbür ucuna taşıyıp orada attırmaktan ucuz. Buna rağmen IPv6 başlık sağlamasını tamamen kaldırdı — çünkü alttaki CRC yaygınlaştı ve o kalem artık kârını çıkarmıyordu. Bir katmanın işini gerçekten gereksiz kılan şey, ölçünün değişmesi oluyor.
Üçüncü kalem bilgi saklama ve en pahalısı bu. Bir katman altındakini bilmemeye söz verdiği için bazen yanlış karar veriyor. Klasik örneği TCP ile kablosuz: TCP paket kaybını tıkanıklık işareti sayar ve hızını keser. Oysa Wi-Fi’da bir çerçeve girişimden bozulmuş olabilir, yani ortada tıkanıklık yoktur. Bağ katmanı iki durumu ayırt edebilir ama TCP’ye söyleyecek bir kanalı yoktur; sözleşmede öyle bir alan yok. TCP hattı boş sanmayıp yavaşlar, ve boş hat boş kalır.
Bu üçüncü kalem, gerçek sistemlerin katman sınırını neden sürekli deldiğini de açıklıyor. Ağ kartının çerçeveleri işletim sistemi yerine kendisinin bölmesi, yönlendiricinin trafiği taşıma katmanı portlarına bakarak yollara dağıtması, tıkanıklığın kayıp yerine bir bit ile bildirilmesi — üçü de kasten yapılmış birer katman ihlali. Katmanlamayı bir yasa olarak değil, bir varsayılan olarak düşün; mühendislik de çoğu zaman o varsayılanın nerede bırakılacağına karar vermek anlamına geliyor.
Sınır kendi makinende nerede duruyor?
Katman sınırını kavramsal bir şey sanma; kendi makinende üç satırda görebilirsin.
$ ip -o link show wlp3s0
2: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... link/ether 00:00:5e:00:53:af
$ ip -o -4 addr show wlp3s0
2: wlp3s0 inet 192.0.2.37/24 brd 192.0.2.255 scope global wlp3s0
$ ss -tn state established
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 192.0.2.37:41320 203.0.113.9:443Aynı kartın üç ayrı adını görüyorsun. MAC adresi 48 bit tutuyor ve bu ağın dışında hiçbir yerde anlam taşımıyor. IP adresi 32 bit ve İnternet’in tamamında anlamlı. Port numarası 16 bit ve yalnızca senin makinende geçerli. İlk satırdaki mtu alanı da bir sözleşme: bağ katmanı üstündekine 1.500 bayttan fazlasını bir seferde taşımayacağını söylüyor. Üstteki katman buna uymak zorunda. IP’yi tanımlayan RFC 791’de başlık 20 bayt tutuyor, ve o yirmi bayt bu 1.500 baytın içinden çıkıyor.
Özet
Peki, ne öğrendik?
- Katman, altındakine dayanıp üstündekine söz veren bir kattır. Daha aşağısını bilmemesi bir eksik değil, tasarımın kendisidir.
- Katman sayısı modele göre değişir: OSI yedi, TCP/IP dört, ders kitaplarının çoğu beş sayar; sunum ile oturumun işini Internet yığınında uygulama üstlenir — sertifikanın ASN.1 kodlaması ve HTTP’nin
Rangebaşlığı bunun iki canlı örneğidir.- Dikey ilişkinin adı hizmet, yatay ilişkinin adı protokoldür. İkisi bağımsız değişkendir: aynı hizmeti TCP de QUIC de verir. Sözleşmenin somut karşılıkları port numarası ve Ethernet’in tür alanıdır.
- Kapsülleme tek satırlık bir denklemdir:
(N)-PDU = (N)-PCI + (N)-SDUve bir katın ürettiği paket, bir alttakinin gözünde ham veridir.- Katmanlamanın üç kalemlik bir faturası var: başlık yükü paket küçüldükçe %5’ten %99’a tırmanır, aynı iş birden çok katta tekrar edilir, ve bilgi saklama bazen yanlış karara yol açar.
- Kum saatinin beli tek bir protokolden ibarettir. IP’nin her cihazda bulunma zorunluluğu, üstündeki ve altındaki çeşitliliğin bedelidir.
Katmanları saydık, sınırlarını çizdik ve aralarındaki sözleşmenin adını koyduk. Geriye o sözleşmenin içeriği kalıyor: bir katman diğerine tam olarak ne veriyor?
Bölüm 18: Kapsülleme ve Başlıklar
Katmanların birbirine ne sözü verdiğini kurduk. Söylemediğim şey, komşuya tam olarak neyin uzatıldığıydı.
Uzatılan şey çıplak veri değil. Her katman kendisine geleni bir zarfa koyup uzatıyor, ve o zarfın adı başlık. Peki zarfın içinde kaç zarf var?
Dört basamak, tek yük
Uygulama katmanı elindeki mesajı taşımaya veriyor ve taşıma onu hiç açmıyor. İçindeki baytların ne anlama geldiğine bakmadan başına kendi başlığını ekliyor; ortaya bir segment çıkıyor.
Ağ katmanı aynı işi bir basamak aşağıda tekrarlıyor. Aldığı segmentin tamamını, taşımanın az önce yazdığı başlık dahil, tek parça yük sayıyor. Kendi başlığını onun da önüne ekliyor: datagram. Son basamak bağ katmanı; o da datagramı olduğu gibi alıp sarıyor ve ortaya çerçeve çıkıyor.
uygulama [ mesaj ]
taşıma [ TCP | mesaj ] -> segment
ağ [ IP | TCP | mesaj ] -> datagram
bağ [ ETH | IP | TCP | mesaj | FCS ] -> çerçeveKargo şirketine dönersek, her basamak yalnızca kendi etiketini yazar. Bir öncekinin etiketi artık paketin parçasıdır.
Aynı merdiveni baytlarla izlemek istersen:
- Uygulama yalnızca mesajı görüyor. Tarayıcının sokete yazdığı şey 1.460 baytlık düz veri. Bu noktada hiçbir başlık yok; aşağıdaki üç satırda değişmeden kalacak olan yük bu.
- Taşıma 20 bayt ekliyor: segment. TCP başlığı mesajın önüne geçiyor. İçine bakmıyor, açmıyor, yorumlamıyor — mesajın tamamı onun için tek parça yük. Toplam 1.480 bayt.
- Ağ 20 bayt daha ekliyor: datagram. IP başlığı bu kez TCP başlığını da yük sayıyor.
(N)-PDU = (N−1)-SDUdenklemi tam burada işliyor: bir üstün paketi, bir altın ham verisi. Toplam 1.500 bayt. - Bağ hem baştan hem sondan sarıyor: çerçeve. Ethernet 14 baytlık başlığı öne, 4 baytlık
FCSsağlamasını sona koyuyor. Sondan yazan tek katman bu. Toplam 1.518 bayt. - Telde fatura biraz daha kabarıyor. Çerçevenin önüne 8 baytlık önsöz, arkasına 12 baytlık boşluk giriyor. Kanalda harcanan 1.538 baytın 1.460'ı veri: %94,9. Kutular ölçekli değil — gerçek oranda
TCPbaşlığı bu genişliğin yedide biri kadar olurdu.
Son satırdaki FCS dikkatini çekmiş olmalı. Çerçeve hem başlıkla hem kuyrukla sarılıyor; sondan yazan tek katman bağ katmanı.
Her başlık, onu ekleyen katmanın kendi hizmetini kurmak için ihtiyaç duyduğu alanları taşıyor. Üstteki katman o alanları hiç görmüyor. Alttaki katman görüyor ama anlamlarını bilmiyor. Kapsülleme dediğimiz şey tam olarak bu.
Başlıkta tam olarak ne var?
Seçenek taşımayan bir TCP başlığı 20 bayt. Başlık sabit değil; içinde head len adında bir alan var ve başlığın kendi uzunluğunu bildiriyor, çünkü seçeneklerle uzayabiliyor. Yük kısmı da değişken uzunlukta; uygulamanın sokete yazdığı kadar.
Seçeneksiz IPv4 başlığı da 20 bayt. İkisi birlikte her yükün üstüne 40 baytlık sabit bir zarf bindiriyor.
IPv4 başlığını tahmin etmeye gerek yok; RFC 791 alanları bit bit sayıyor. Başlık 32 bitlik satırlar hâlinde okunur ve seçeneksiz hâli tam beş satırdır:
| bit | alan | boy | ne yapıyor |
|---|---|---|---|
| 0 | Sürüm | 4 bit | IPv4 için değeri 4; alıcı başlığı okumadan önce buna bakar |
| 4 | IHL | 4 bit | başlığın kendi uzunluğu, 32 bitlik kelime cinsinden |
| 8 | DSCP | 6 bit | paketin hangi hizmet sınıfına ait olduğu |
| 14 | ECN | 2 bit | yol üstünde tıkanıklık görülüp görülmediği |
| 16 | Toplam Uzunluk | 16 bit | başlık dahil bütün datagram |
| 32 | Kimlik | 16 bit | aynı datagramdan doğan parçaları eşleştirir |
| 48 | Bayraklar | 3 bit | ayrılmış · DF (bölme) · MF (arkadan parça var) |
| 51 | Parça Ofseti | 13 bit | parçanın özgün yükteki yeri, 8 baytlık birimle |
| 64 | TTL | 8 bit | her yönlendiricide bir azalır, sıfırlanınca paket ölür |
| 72 | Protokol | 8 bit | yükün sahibi: 1 ICMP, 6 TCP, 17 UDP |
| 80 | Başlık Sağlaması | 16 bit | yalnızca başlığı korur, yükü değil |
| 96 | Kaynak Adres | 32 bit | gönderenin IP adresi |
| 128 | Hedef Adres | 32 bit | alıcının IP adresi |
| 160 | Seçenekler | 0-40 bayt | yalnızca IHL beşten büyükse vardır |
Dört alan ilk okumada kolayca kayıyor, oysa dördü de kitabın başka bölümlerinde karşına çıkacak.
IHL başlığın uzunluğunu bayt değil, 32 bitlik kelime cinsinden verir. Seçeneksiz başlıkta değeri 5’tir: 5 × 4 = 20 bayt. Alan 4 bit olduğu için en büyük değeri 15, yani başlığın tavanı 60 bayt. Seçeneklere ayrılabilecek yer bu yüzden 40 baytla sınırlı — bu bir tasarım tercihi değil, dört bitin matematiği.
DSCP ve ECN aslında tek bir 8 bitlik alandan bölündü. Eski adı Hizmet Türü’ydü; RFC 2474 üstteki altı biti hizmet sınıfına, RFC 3168 alttaki iki biti tıkanıklık bildirimine ayırdı. İlki paket zamanlamada, ikincisi tıkanıklık denetiminde işe yarıyor. İkisi de aynı bayttan çıkıyor.
Bayraklardaki DF biti “bu paketi bölme” demek. Bölmesi gereken bir yönlendirici DF bitini görürse paketi düşürüp gönderene bir ICMP mesajıyla haber verir ve o mesajın içinde bir sonraki atlamanın MTU’sunu yazar. Gönderen böylece yol boyunca sığacak en büyük boyu adım adım öğrenir; yöntemin adı yol MTU keşfi. O ICMP mesajları bir güvenlik duvarı tarafından susturulursa yöntem sessizce çöker; sahadaki hâlini tünelleri kurarken adım adım izleyeceğiz.
Başlık sağlaması yalnızca başlığı korur, yükü değil. Sebep basit: TTL her atlamada değiştiği için sağlamanın da her yönlendiricide yeniden hesaplanması gerekiyor, ve yükü de kapsasaydı bu hesap her atlamada bütün paket üstünde yapılacaktı. IPv6 alanı tamamen kaldırarak aynı sorunu kökünden çözdü.
Protokol alanı küçük ama işi büyük: yükün hangi üst katman protokolüne ait olduğunu söylüyor, TCP mi UDP mi.
Çerçevenin alanları da sırayla belli; boyları toplandığında zarfın maliyeti çıkıyor:
| alan | boy | ne yapıyor |
|---|---|---|
| önsöz | 8 bayt | alıcıyı çerçevenin başına kilitler |
| hedef adres | 6 bayt | çerçeveyi kimin alacağını söyler |
| kaynak adres | 6 bayt | gönderenin aynı biçimdeki adresi |
| tür alanı | 2 bayt | içerideki protokolü söyler |
| veri | 46-1.500 bayt | datagram buraya girer |
| FCS | 4 bayt | çerçevenin kuyruğu |
Bu iki adresin nasıl kurulduğunu burada kasten boş bırakıyorum. Alanların genişliğini biliyorsun; içlerindeki değerin ne anlama geldiğini 21. bölümde dolduracağız.
Adresler, tür alanı ve FCS birlikte 18 bayt tutuyor. Önsöz (preamble) hariç azami sade çerçeve bu yüzden 1.518 bayt. Araya 4 baytlık bir 802.1Q etiketi girerse tavan 1.522 bayta çıkıyor; etiketin ilk iki baytı 0x8100 tür tanımlayıcısını taşır ve o tanımlayıcıyı bilmeyen bir istasyon çerçeveyi bilinmeyen tür sanıp atar.

Tür alanı (EtherType) 0x0800 ise içeride IP var, 0x0806 ise ARP. FCS’nin içine yazılan değer ise bir CRC-32 sağlaması; hesabın kendisi ilerideki bir bölümün işi.
Her zarf bir sonrakini nasıl gösteriyor?
Kapsüllemenin asıl inceliği zarfları sarmakta değil, açarken hangi sırayla açılacağını bilmekte. Alıcıya gelen şey bir bayt dizisi. Nerede bittiğini, içinde ne olduğunu ve sonraki başlığın hangi protokole ait olduğunu ona kimse söylemiyor — bunların hepsi zarfın kendi içinde yazılı.
Her başlığın içinde, bir sonraki başlığın kim olduğunu söyleyen bir alan var. Bu alanlar bir zincir kuruyor ve zincir, bayt dizisini adım adım çözüyor:
| bulunduğun başlık | işaretçi alanı | değer | sonraki başlık |
|---|---|---|---|
| Ethernet | tür alanı | 0x0800 | IPv4 |
| Ethernet | tür alanı | 0x0806 | ARP |
| Ethernet | tür alanı | 0x86DD | IPv6 |
| Ethernet | tür alanı | 0x8100 | VLAN etiketi, sonra yeniden tür alanı |
| IPv4 / IPv6 | protokol | 1 / 58 | ICMP |
| IPv4 / IPv6 | protokol | 6 | TCP |
| IPv4 / IPv6 | protokol | 17 | UDP |
| IPv4 / IPv6 | protokol | 47 | GRE tüneli |
| IPv4 / IPv6 | protokol | 50 | IPsec ESP |
| TCP / UDP | hedef port | 443 | TLS, ardından HTTP |
| TCP / UDP | hedef port | 53 | DNS |
Zincirin bu kadar sıradan görünmesi aldatıcı. Bu üç alan, yığının tamamının değiştirilebilir olmasını sağlayan şey. Ethernet, içinde IP taşıdığını bilmiyor; yalnızca 0x0800 diye bir sayı taşıyor ve o sayının anlamını bir tabloya bırakıyor. IPv6 ortaya çıktığında Ethernet’in tek bir satırı bile değişmedi; tabloya yeni bir sayı eklendi. Katmanları gerçekten ayıran şey, başlıkta bir isim değil bir numara taşımaktır.
Zarfları açmanın adı kapsülleme çözme ve sarmanın tam tersi sırayla yürüyor. Alıcı kartı çerçeveyi alıyor, FCS’yi yeniden hesaplayıp yazandan farklı çıkarsa çerçeveyi sessizce atıyor. Sağlamsa 14 baytlık başlığı çıkarıp kalanı IP’ye uzatıyor. IP kendi başlığını doğruluyor, hedef adres kendisiyse başlığı çıkarıp protokol alanının gösterdiği yere — diyelim TCP’ye — uzatıyor. TCP checksum’ı denetliyor, hedef porta bakıp doğru sokete bırakıyor. Her kat kendi zarfını açıyor, kendi denetimini yapıyor ve bir üstteki katmanın zarfına hiç dokunmuyor.
Kapsüllemeyi tek cümleye indirmek gerekirse: her katman, bir üstündekinin verdiği her şeyi anlamsız bir yük sayar; ne olduğunu yalnızca bir sayıyla not eder ve o sayıyı okumayı karşı taraftaki eşine bırakır.
Yük hatta sığmazsa?
Bir bağlantı üzerinden gidebilecek en büyük çerçevenin veri alanına MTU deniyor. Ethernet’te 1.500 bayt. Bu bir ağ katmanı kararı değil, bağ katmanı kararı: değeri ikinci katmanda hangi protokolün çalıştığına göre değişiyor. Yol boyunca tek bir sabit değer yok.
Sayı yükseltilebilir de. Bir anahtar bugün 9.720 bayta kadar jumbo çerçeve taşıyabiliyor; aynı veriyi altı kat daha az çerçeveyle göndermek, çerçeve başına düşen 18 baytlık zarfı altı kat fazla verinin üstüne yaymak demek. Yine de bu yetenek standart dışı ve yerelde kalıyor. Sebebi yolun kendisinde. Bir yol, üstündeki en dar bağlantı kadar geniştir, ve yol üstündeki tek bir port jumbo çerçeveyi tanımıyorsa onu sessizce düşürüyor. Uçların birlikte büyütmeyi pazarlık edeceği bir mekanizma da yok; MTU her bağlantının kendi kararı. Büyük MTU bu yüzden ancak kapalı alanlarda işe yarıyor: veri merkezinin içi, depolama ağı, iki yönlendirici arasındaki tek bir hat. Oralarda iki uç da aynı yönetimin elinde.
Geriye kalanı hesaplamak kolay. 1.500 baytlık veri alanından IP başlığının 20 baytını ve TCP başlığının 20 baytını düşünce elde 1.460 bayt kalıyor. SYN paketiyle pazarlığa açılan en büyük segment boyunun tipik değeri de tam olarak bu.
Peki yük bu sınırı aşarsa? IPv4 datagramı bölüyor; işlemin adı parçalama. Her parça kendi başına tam bir IP datagramı ve kendi başlığını taşıyor.
Somut bir örnek kuralım. 2.048 baytlık bir datagramın yükü 2.028 bayt. MTU’su 1.500 olan bir bağlantıya girdiğinde ikiye ayrılıyor:
parça 1: veri 1.480 bayt · ofset 0 · MF=1 · toplam uzunluk 1.500
parça 2: veri 548 bayt · ofset 185 · MF=0 · toplam uzunluk 568Parçaları birbirine bağlayan üç alan var ve üçü de IP başlığında duruyor. Kimlik, iki parçanın aynı datagramdan doğduğunu söylüyor. Bayrak alanındaki MF biti arkadan başka parça gelip gelmediğini bildiriyor. Ofset ise parçanın özgün veri alanındaki yerini veriyor, o da bayt cinsinden değil, 64 bitin yani 8 baytın katları cinsinden. 1.480’i sekize bölünce 185 çıkıyor. Son parça hariç her parçanın verisi bu yüzden sekizin katı olmak zorunda.
Bir ayrıntı daha: TCP başlığı yalnızca ilk parçada duruyor. IP bölerken yükün içine bakmıyor; ikinci parça onun için sıradan bir bayt dizisi.
Parçaları birleştiren tek yer hedef uç sistem. Bedeli şu: bir parça yol boyunca yalnızca küçülebiliyor. IPv6 bu işi sabit başlıktan çıkardı; 40 baytlık başlıkta ne parçalama var ne checksum, amaç yönlendiricide işlemeyi hızlandırmak. Gerekirse parçalama ayrı bir uzatma başlığına iniyor.
Bir terim notu da düşeyim. OSI belgelerinde bu işleme segmentation, TCP/IP belgelerinde fragmentation deniyor. İkisi aynı şeyi anlatıyor.
Zarfın bedeli ne kadar?
Tel üstünde bir yükün taşıdığı toplam zarf 58 bayt: 20 TCP, 20 IP, 18 Ethernet.
1.460 baytlık dolu bir yükle çerçeve 1.518 bayta çıkıyor ve zarfın payı %3,8 oluyor. Şimdi yükü küçült. İstek satırı ve başlıklarla kurulan sade bir HTTP isteği 480 bayt tutsun. Aynı 58 bayt ekleniyor, toplam 538 bayt, zarfın payı %10,8. Zarf hiç değişmedi. Yük küçüldükçe oransal olarak şişti.
Uç vakayı da görelim. Yüksüz bir ACK, 20 baytlık TCP başlığı ile 20 baytlık IP başlığından ibaret: 40 baytlık bir datagram. Ethernet veri alanının alt sınırı 46 bayt olduğu için aradaki fark dolgu ile kapatılıyor ve çerçeve 64 bayta çıkıyor. Telden geçen her şey zarf.
O dolgu baytları ağ katmanına kadar çıkıyor. Onları ayıklayan şey IP başlığındaki uzunluk alanı.
Kanalın ödediği fatura çerçeve boyuyla değil toplamla ölçülüyor. 1.500 baytlık veri taşıyan bir çerçevenin kanal maliyeti, önsöz ve çerçeveler arası boşluk dahil, 1.538 bayt. Yükün payı %97,5. 10 Mbit/s’lik bir hatta bu saniyede 812 çerçeve demek. Aynı hatta asgari boy çerçeveler saniyede 14.880 adet geçiyor ve yalnızca 5.475.840 bit veri taşıyor: kanalın %54,7’si.
Ek yükün bit karşılığı da sabit: 64 bit önsöz, 96 bit iki adres, 16 bit tür alanı, 32 bit FCS. 10 Mbit/s’te çerçeveler arası boşluk 9,6 µs, yani 96 bit süresi. Toplamı 304 bit süresi.
Küçük çerçevenin bir yararı da var. Bozulan bir çerçevede yeniden gönderilecek bit sayısı daha az. Çoklama ile tek bağlantıya sığdırılan istekler de aynı hesabın içinde; zarf yok olmuyor, yalnızca daha çok yükün üstüne yayılıyor.
Bütün bunları kendi makinende görebilirsin:
ip link show
sudo tcpdump -n -e -c 5 'tcp port 443'İlk komut her arayüzün yanına mtu 1500 yazacak. İkincisi her satırın başında çerçevenin kaynak ve hedef adresini, ethertype IPv4 (0x0800) etiketini ve çerçevenin bayt cinsinden boyunu dökecek. Windows tarafında aynı değeri netsh interface ipv4 show subinterfaces komutu veriyor.
Özet
Peki, ne öğrendik?
- Kapsülleme dört basamaklı bir merdiven: mesaj segmente, segment datagrama, datagram çerçeveye giriyor ve her basamak bir öncekinin tamamını yük sayıyor.
- Her başlık kendi katmanının işi için var: üstteki alanları görmüyor, alttaki anlamlarını bilmiyor, ve sondan kuyruk ekleyen tek katman bağ katmanı.
- IPv4 başlığı beş satır, on üç alandır:
IHLbaşlığın tavanını 60 bayta kilitler,DSCPileECNaynı bayttan bölünmüştür,DFbiti yol MTU keşfini başlatır ve checksum yalnızca başlığı korur.- Bağlayıcı alanlar zinciri kuruyor: çerçevedeki tür alanı, IP’deki Protokol ve taşımadaki port numarası yükü doğru üst katmana yönlendiriyor.
- MTU aşılırsa datagram bölünüyor: Kimlik, Bayrak ve Ofset parçaları birbirine bağlıyor, birleştirmeyi ise yalnızca hedef uç yapıyor.
Zarfları saydık, alanlarını adlandırdık, bedelini hesapladık. Ama buraya kadar hepsi anlatı olarak kaldı. Zarflar gerçekten orada mı, bunu kendi gözünle görebilir misin?
Bölüm 19: Paket Yakalama ve Çözümleme
Diyelim ki bir yakalama aracı kurdun ve açılış ekranındaki kart listesinden kendi arayüzünü seçtin. Satırlar akmaya başlıyor; her satır bir çerçeve. Kapsülleme merdivenini kurarken tek tek saydığın başlıklar şimdi o satırların içinde duruyor.
Anlatılan her zarfı yakalamak ve tek tek açıp görmek mümkün. Peki o satırları ekrana taşıyan şey tam olarak ne?
Trafiği kim kopyalıyor?
Ekranda gördüğün program yakalamayı kendisi yapmıyor. Altta, işletim sisteminin içinde duran bir paket yakalama kütüphanesi var; üstünde de senin tıkladığın çözümleyici arayüz. Arayüzün işi baytları adlandırmak.
Alt katman, kartın gönderdiği ve aldığı bütün Ethernet çerçevelerinin bir kopyasını alıyor. Kopya kelimesi burada teknik anlamıyla duruyor. Asıl trafik durmuyor, gecikmiyor, değişmiyor.
Bunun karşılığında araç yükseltilmiş yetki istiyor. Sebep tek: program doğrudan ağ kartına erişmek zorunda.
İlan edilen asgari gereksinimler şaşırtıcı derecede mütevazı: 400 MHz işlemci ve 60 MB boş disk. Üçüncü madde donanımla ilgili — karışık modu destekleyen bir ağ kartı. Asıl yük çözümlemede değil, kartın kopyaladığı trafikte.
Araç üç iş yapıyor. Trafiği anlık izliyor, izlediğini dosyaya kaydediyor, kaydı sonradan yeniden açtırıyor. Aynı ekran bu yüzden iki kaynaktan doluyor: canlı bir ağ kartından ya da daha önce kaydedilmiş bir pcap dosyasından.
Kart listesinde ne göreceğin işletim sistemine bağlı. Linux’ta eth0 ve wlan0, macOS’ta en0 ile lo0, Windows’ta üreticinin verdiği uzun ad. Fiziksel kartların yanında sanal geri döngü arayüzü de listede duruyor; makinenin kendi kendine konuşmasını oradan yakalıyorsun.
Wi-Fi kartıyla yakalayacaksan bir adım daha var: kartı izleme kipine almak. Kablolu kartta bu adım yok.
Neden komşunun paketlerini göremiyorsun?
Tehdit modelinin ilk maddesi karışık mod ve dinlemeydi; ekranda akan liste o maddenin somut hâli.
Ama dinlemeyi mümkün kılan şey ne araç ne de o mod. Ortamın yayın ortamı olması: paylaşılan Ethernet ve kablosuz bağlantı. Herkesin duyduğu bir yerde kartı susturmayı bırakmak yetiyor.
Anahtarlı bir yerel ağda hesap değişiyor. 192.0.2.10 numaralı makineden 192.0.2.11’e giden bir çerçeve, kartın karışık modda olsa bile 192.0.2.12’ye ulaşmıyor. Anahtar onu yalnızca hedefin bağlı olduğu porta gönderiyor.
İşin ters yüzü de var. Anahtarın kendi portları karışık modda çalışıyor; adres öğrenmesinin yolu tam olarak bu. Öğrendiklerini tuttuğu tablo ise sınırlı; tablo taşırılırsa anahtar çerçeveleri yeniden yayına veriyor ve dinleme geri geliyor.
Ekranda gördüğün şey bu yüzden ağın tamamı değil. Kartının duyabildiği kadarı.
Beş bölme, tek paket
Pencere beş bölmeye ayrılıyor: filtre satırı, paket listesi, seçilen paketin detay ağacı, ham bayt dökümü ve durum çubuğu. Listeden bir satır seçtiğin anda alttaki iki bölme dolmaya başlıyor.
Detay ağacı seçilen paketi katman katman açıyor. Katmanlı mimarideki sıra burada tıklanabilir bir ağaca dönüşüyor. Ağaçta bir alanı seçtiğinde aynı alan ham bayt dökümünde de işaretleniyor; iki bölme aynı paketin iki ayrı yazımı.
Aralıklar sabit. 534 baytlık bir çerçevede ilk 14 bayt Ethernet başlığı, sonraki 20 bayt IPv4, sonraki 20 bayt TCP. İlk 54 bayt zarf, gerisi uygulamanın yükü.

Ağacın dalları ile bayt aralıkları birebir örtüşüyor:
| ağaçtaki dal | bayt aralığı | uzunluk |
|---|---|---|
| çerçevenin tamamı | 0 – 533 | 534 bayt |
| Ethernet II | 0 – 13 | 14 bayt |
| Internet Protocol v4 | 14 – 33 | 20 bayt |
| Transmission Control Protocol | 34 – 53 | 20 bayt |
| Transport Layer Security | 54 – 533 | 480 bayt |
Bir dalı açtığın anda sağdaki ham dökümde o aralık işaretleniyor. Zarf elli dördüncü baytta bitiyor, gerisi yük. TLS varsa ağaç yalnızca kaydın türünü ve uzunluğunu veriyor; içerik şifreli olduğu için açılmıyor.
Çözümleyicinin bir daldan diğerine geçme yolu, başlıkların içindeki tür alanları. Ethernet tür alanındaki onaltılık 0806 değeri ARP demek. IP başlığındaki protokol alanında 1 ICMP, 6 TCP, 17 UDP demek. Ağaç bu sayılara bakarak dallanıyor.
Durum çubuğu üç sayı taşıyor: yakalanan toplam paket, o an gösterilen paket sayısı ve etkin profil adı. İkisi arasındaki fark, filtrenin ne kadarını elediğini söylüyor.
Adres çözümleme açıldığında listedeki MAC adresinin ilk 24 biti çözülüyor ve kartı üreten firmanın adı yanına yazılıyor. Bu bilgi ağa sorulmuyor. Program kendi içinde tuttuğu manuf dosyasına bakıyor. Adresin geri kalanının neyi adlandırdığı 21. bölümün işi.
Son bir ayrıntı: kayıt ekranında azami çerçeve 1.514 bayt görünüyor, oysa tel üstünde 1.518 bayt. Aradaki 4 bayt FCS alanı; kart onu doğruladıktan sonra atıyor ve kopyaya hiç koymuyor.
Kayda soru sormak
Filtre kutusu bir tane değil, iki tane. Açılış ekranındakine yazdığın filtre, çerçeveler daha diske yazılmadan alt katmanda uygulanıyor; elediği paket kayda hiç girmiyor. Yakalama sürerken kullandığın kutu ise gösterim filtresi ve elde duran kaydı süzüyor.
İkisinin dili de ayrı. Yakalama filtresi port numarası yazıyor: port 67 or port 68. Gösterim filtresi protokolün alan yolunu yazıyor: bootp.option.dhcp == 3. Aynı DHCP trafiğini seçen iki cümle, iki ayrı sözlükten.
İki dilin ayrı olmasının sebebi zevk değil, nerede çalıştıkları. Yazdığın yakalama filtresi bir metin olarak çekirdeğe gitmiyor; önce küçük bir sanal makinenin komutlarına derleniyor. O sanal makinenin adı BPF ve programı doğrudan çekirdeğin içinde, paket kullanıcı alanına kopyalanmadan önce koşuyor. Her çerçeve için birkaç düzine komut çalışıyor ve sonuç tek bir karar oluyor: kopyala ya da bırak.
Kazancın nereden geldiği buradan çıkıyor. Filtre kullanıcı alanında olsaydı, elenecek her çerçeve önce kopyalanacak, sonra atılacaktı — yani en pahalı iş, atılacak paket için de yapılacaktı. Çekirdekte elemek o kopyayı hiç yaptırmıyor.
Bedeli de dilin darlığı. BPF programı sabit bir yerden başlayıp sabit adımlarla ilerleyen bir yapıya bakabiliyor; “şu protokolün şu alanı” gibi adlandırılmış bir sözlüğü yok, çünkü çekirdek DHCP’nin ne olduğunu bilmiyor. Gösterim filtresi ise kayıt zaten diskteyken, bütün protokol ayrıştırıcıları elinin altındayken çalışıyor. Biri hızlı ve kaba, öteki yavaş ve ayrıntılı.
Aynı sanal makineyi başka yerlerde de göreceksin. tcpdump’ın filtre satırı bunu kullanıyor; komut satırından yakalama yaparken yazacağın ifade de aynı derleyiciden geçiyor.
Alan yolları sayıları da adlandırıyor. DHCP mesaj türünde 1 DISCOVER, 2 OFFER, 3 REQUEST, 4 ACK demek; ARP’ta işlem kodu 1 ise istek, 2 ise cevap anlamına geliyor. Gösterim filtreleri karşılaştırma ve mantık işleçleriyle birleşiyor: ==, !=, >, < ile and, or, xor, not. Her işlecin hem sözcük hem simge yazımı var.
Soket four-tuple’ında tanıştığın port numarası, filtre dilinde üç ayrı alana ayrılıyor. tcp.port == 80 iki yönü birden, tcp.srcport kaynağı, tcp.dstport == 443 yalnızca hedefi seçiyor. tcp.flags.syn == 1 ise kaydın içindeki bütün bağlantı kurulumlarını listeliyor.
Bunları ezberlemene gerek yok. Detay ağacındaki bir alana sağ tıklayıp Apply as Filter demek o alanı filtre satırına yazıyor. contains işleci de belirli bir protokolün gövdesinde metin arıyor.
DerinleşmeYakalama filtresi ile gösterim filtresi neden aynı şey değil?
İkisi de aynı trafiği seçiyor ama aynı yerde durmuyorlar. Yakalama filtresinin bedeli geri alınamaz olması. Yoğun bir hattı bir saat boyunca yalnızca DHCP portlarıyla izlediysen, sonradan aklına gelen ‘o sırada hangi bağlantı koptu’ sorusunun cevabı elinde yok. O çerçeveler hiç yazılmadı. Elenen çerçeve sayaçlara da girmiyor: durum çubuğundaki yakalanan toplam onları hiç görmediği için “ne kadarını kaçırdım” sorusunun cevabı da kayıtta yok.
Kazancı da tam olarak aynı yerden geliyor. Kalabalık bir hatta her şeyi diske yazmak kısa sürede gigabaytlara çıkıyor. Erken eleme, diski ve işlemciyi daha ilk anda koruyor.
Gösterim filtresinde böyle bir kayıp yok. Filtre satırını temizlediğin anda gizlenen paketler geri geliyor, çünkü hiçbiri atılmamıştı.
Sık kullandığın uzun bir gösterim filtresini bir düğmeye bile bağlayabilirsin; aynı kaydı her açışında tek tıkla süzülüyor. Yakalama filtresinde böyle bir düğmenin anlamı yok, çünkü onun eleme anı çoktan geçmiş oluyor.
Aynı ödünleşim günlük kaydından veri ambarına kadar her yerde çıkıyor. Genellenebilir ders şu: bir süzgeç ne kadar erken uygulanırsa o kadar ucuza gelir ve o kadar geri alınamaz olur.
Akış takibi aynı bağlantıya ait TCP paketlerini birleştirip tek bir konuşma olarak gösteriyor. Bayraklar tek tek okunuyor: SYN başlatır, ACK onaylar, RST ani sonlandırır, FIN düzgün kapatır. Yüksüz bir ACK satırında uygulama verisi len=0 yazıyor; o çerçeve yalnızca başlıktan ibaret. Kapanış sırasında uçlardaki durumlar CLOSE_WAIT, TIME_WAIT ve FIN_WAIT adlarını alıyor.
Konuşmanın içeriğine gelince, orada bir sınır var. TLS yoksa sokete yazılan parola İnternet’i düz metin olarak geçiyor ve ekranda da düz metin okunuyor. TLS varsa yakalayıcı yalnızca kaydın türünü ve uzunluğunu görüyor. El sıkışmada kurulan oturum anahtarı elinde olmadan içerik açılmıyor; o anahtarı araca vermeyi 60. bölüme bırakıyorum.
İstatistik ekranları kaydın bütününü sayıyor. Protokol hiyerarşisi hangi protokolden kaç paket olduğunu, IPv4 istatistiği her adresin kaç kez geçtiğini, HTTP sayacı metotları ve yanıt kodlarını veriyor; örnek bir kayıtta 165 GET isteği sayılmış. Kaydın tamamı yerine yalnızca seçtiğin paketleri ayrı bir dosyaya da yazabilirsin: numara aralığı, virgülle ayrılmış numaralar ya da işaretlediklerin.
Kendi kaydını üç komutla üretip sorgulayabilirsin:
sudo tcpdump -i eth0 -c 200 -w birinci.pcap
capinfos birinci.pcap
mergecap -w butun.pcap birinci.pcap ikinci.pcapİlk komut aynı yakalama katmanını kullanıyor ve iki yüz çerçeveyi dosyaya yazıyor. capinfos dosyanın özetini döküyor: paket sayısı, ilk ve son paketin zamanı, yakalamanın süresi. mergecap iki kaydı tek dosyada birleştiriyor ve birleşmiş dosyanın hangi iki dosyadan geldiğini bile söylüyor.
Özet
Peki, ne öğrendik?
- Yakalama işini arayüz yapmıyor: trafiği kopyalayan katman işletim sisteminin içinde duruyor, kopya asıl akışı geciktirmiyor ve o erişim yükseltilmiş yetki istiyor.
- Karışık mod tek başına yetmiyor: dinlemeyi mümkün kılan şey ortamın yayın olması, anahtarlı bir ağda çerçeve komşunun portuna zaten hiç gitmiyor.
- Ağaç ile bayt dökümü aynı paketi gösteriyor: bir alanı seçmek onun bayt aralığını işaretliyor, ilk elli dört bayt zarf, gerisi yük.
- İki filtre iki ayrı dil konuşuyor: biri yakalama başlarken port düzeyinde eliyor, diğeri elde duran kaydı alan yollarıyla süzüyor.
Ekrandaki her satırı açtın, baytlarını saydın, hangi aralığın kime ait olduğunu gördün. Ama bu kopyayı sana veren şey hâlâ kutunun içinde duruyor: çerçeveyi tele koyacak olan tam olarak ne?
Bölüm 20: Ağ Arayüz Kartı
Yakalama arayüzünde her satırı bayt bayt sayıp zarfları tek tek gördün. Çerçeveyi tele koyacak şeyi ise henüz adlandırmadım.
O şey bir program değil. Kablonun ucundaki ağ kartı, kendi işlemcisiyle çalışan ayrı bir bilgisayar. Peki bu kartın sınırı tam olarak nerede başlıyor?
Kart tam olarak nerede duruyor?
Ağ kartı, bilgisayarı ağa fiziksel olarak bağlayan parça. Türkçe adını ağ arayüz kartı olarak göreceksin; kimi kaynakta ağ adaptörü ya da ağ arayüz denetleyicisi diye de geçiyor. Kısaltması NIC.
Kart makinenin sistem veriyoluna takılıyor ve diğer bileşenlerin gözünde sıradan bir giriş/çıkış aygıtından farkı olmuyor; klasik yuvası da PCI. Ethernet’in ilk günlerinde üstü yongalarla kaplı kocaman bir devre kartı olarak duruyordu. Bugün aynı işi tek bir yongada, ya da daha büyük bir sistem yonganın içindeki bir bölümde bitiriyorlar. Anakarta tümleşiği de var, USB’den takılanı da. Kart yine de tek bir parçadan ibaret değil; donanım, yazılım ve firmware birlikte çalışıyor.
Asıl ayrımı kartın hangi katmanları taşıdığında bulacaksın. Kart ikisini birden gerçekliyor, bağ katmanını ve fiziksel katmanı; üstündeki her şey yazılımda kalıyor. Sınırın çipte olduğunu söylemiştim, ama orada adını vermediğim bir şey vardı: bu iki katman arasındaki iç arayüz.
Soket four-tuple’ını kurarken çekirdeğin altında ne olduğunu kapalı kutu bırakmıştım. Kutuyu şimdi açıyorum. Soket katmanını kullanıcı alanı ile çekirdek alanının tam sınırında buluyorsun. Altında TCP ve UDP duruyor, onun altında IP, en altta da fiziksel ağa bakan sürücü.
Çerçeveyi kim kuruyor?
Kartın kalbinde, MAC protokolünü de taşıyan tek bir özel amaçlı denetleyici yonga var. Çerçeveleme, hatta erişim ve hata sezme bu yonganın işi. Üçünü de donanımda yapıyor.

Yonganın içi de ikiye bölünmüş durumda. MAC bölümü çerçeveyle ilgileniyor, fiziksel katman bölümü sinyalle. İşte o iç arayüzün adı hıza göre değişiyor: 100 Mbit/s’te MII, gigabitte GMII, on gigabitte XGMII. Fiziksel katman tarafı kendi içinde ayrıca katmanlı. Orada bir kodlama alt katmanı ile ortama bağlanan ve ortama bağımlı alt katmanlar duruyor.
Çerçeveleme, datagramın önüne başlık arkasına kuyruk eklemek demek. Kapsülleme merdivenini çıkarken bu basamağı dışarıdan, yani başlık ve kuyruk eklenmiş hâliyle görmüştük. Gönderme tarafında denetleyici, üst katmanların ana bellekte hazırlayıp bıraktığı datagramı oradan alıyor ve çerçeveyi kendisi kuruyor.
Ama çerçevelemenin asıl zorluğu ekleme değil, ayırma. Fiziksel katmanın alıcıya verdiği şey kesintisiz bir bit dizisi; içinde nokta, boşluk ya da satır sonu yok. Alıcı bu akışta bir çerçevenin nerede başlayıp nerede bittiğini bilmek zorunda, yoksa elindeki baytların hangisinin adres hangisinin veri olduğunu söyleyemez. Sorunun adı çerçeve sınırlandırma ve tarih boyunca dört ayrı çözümü denendi.
Bayt sayısı. Çerçevenin başına uzunluğu yazarsın, alıcı o kadar bayt sayar. Zarif ama kırılgan: o sayıyı taşıyan bayt bozulursa alıcı sınırı kaçırır ve bir daha asla bulamaz — sonraki bütün çerçeveler kayar. Tek bir bit hatası kalıcı bir hizasızlık üretiyor.
Bayrak baytı ve bayt doldurma. Çerçevenin iki ucuna özel bir bayrak baytı konur. PPP’de bu değer 0x7E. Peki veri içinde aynı bayt geçerse? Gönderen onun önüne bir kaçış baytı (0x7D) ekler ve baytı değiştirir; alıcı kaçışı görünce sonraki baytı ham veri sayar. Kaçış baytının kendisi de kaçırılır. Bedeli değişken: rastgele veride yaklaşık %1 şişme, ama en kötü durumda çerçeve iki katına çıkabilir.
Bayrak dizisi ve bit doldurma. Aynı fikrin bit ölçeğindeki hâli. HDLC’de bayrak 01111110, yani altı ardışık bir. Gönderen veride beş ardışık bir gördüğü anda araya zorla bir sıfır sokar; böylece veri içinde altı ardışık bir asla oluşamaz. Alıcı beş birden sonra gelen sıfırı sessizce atar.
veri 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0
telde (doldurulmuş) 0 1 1 1 1 1 [0] 1 0 1 1 1 1 1 [0] 1 1 0Köşeli parantezler gönderenin eklediği, alıcının atacağı bitler. Şişme en kötü durumda %20’de kalıyor — bit doldurmanın bayt doldurmadan üstün olduğu yer burası.
Fiziksel katman ihlali. Dördüncüsü en zarifi ve Ethernet’in kullandığı yol. Hat kodlaması bazı sinyal desenlerini veri için kullanmıyorsa, o kullanılmayan desen sınır işareti olur. Veri içinde geçmesi fiziksel olarak imkânsız olduğu için doldurmaya hiç gerek kalmıyor. Hat kodlamasına indiğimizde göreceksin: 4B/5B, 32 desenden yalnızca 16’sını veriye ayırıyor ve artan desenler tam da bunun için duruyor.
Ethernet aslında üç yöntemi birden kullanıyor. önsöz ve çerçeve başlangıç sınırlayıcısı başlangıcı, uzunluk alanı ile taşıyıcının kesilmesi sonu, çerçeveler arası boşluk da iki çerçevenin birbirine karışmamasını sağlıyor.
Hata sezme bitlerini de gönderen taraftaki denetleyici koyuyor. Alan taraftaki denetleyici aynı bitleri denetliyor. İki uçtaki yonga, işletim sistemine hiç sormadan anlaşıyor.
Yazılımın devreye girdiği tek nokta alış tarafında. Kart bir çerçeve aldığında işlemciyi kesiyor. Kesmeye yanıt veren sürücü yazılımı hata durumlarını ele alıyor ve datagramı ağ katmanına yukarı veriyor. Donanımın bittiği çizgi tam orası.
Çerçevenin üstündeki adres de kartın kendi adresi, ve kart bu kimliği üstündeki ROM’da taşıyor. Birinci katman aygıtı sayılan bir parçanın ikinci katman aygıtı olarak da anılması bu yüzden. Bu adresin nasıl kurulduğunu, yani MAC adresinin biçimini 21. bölümde tek tek açacağız.
Çekirdek işi karta nasıl devrediyor?
Paket akışı arayüze girip çıkarken doğrudan bellek erişimiyle yönetiliyor; kısaltması DMA. Kart ana belleği kendisi okuyup yazıyor. Kopyalama işini CPU yapmıyor.
İkisinin buluştuğu yer bir halka tampon. Halka, sabit sayıda tanımlayıcıdan oluşan bir dizi. Her tanımlayıcı bellekteki bir paket tamponunun adresini ve o tamponun kime ait olduğunu taşıyor. Çekirdek sıradaki boş tanımlayıcıyı dolduruyor ve sahipliği karta bırakıyor. Kart sırası gelince tanımlayıcıyı okuyor, veriyi DMA ile çekiyor, işi bitince sahipliği geri veriyor.
Tanımlayıcının kart ile çekirdek arasında nasıl el değiştirdiğini izleyelim:
- Halka ikisinin ortasında. Halka ana bellekte duruyor ve iki tarafın da eriştiği tek yer orası. Her tanımlayıcı bir paket tamponunun adresini ve o tamponun kime ait olduğunu taşıyor.
- Çekirdek tanımlayıcıyı yazar. Çekirdek sıradaki boş girişi dolduruyor ve sahiplik bitini karta çeviriyor. Devretme bundan ibaret: paketin kendisi kopyalanmıyor, yalnızca adresi yazılıyor.
- Kart sırayı kendisi okur. Kart, sırası gelen tanımlayıcıyı ana bellekten kendisi okuyor. İşletim sistemine sorulmuyor, çünkü halkanın hangi girişinde olduğunu kart da sayıyor.
- Veriyi kart çeker. Paket, tanımlayıcının gösterdiği tampondan doğrudan bellek erişimiyle alınıyor. Kopyalamayı CPU yapmıyor; veri ana bellekten kartın tamponuna gidiyor.
- Çerçeve çıkar, kesme döner. Denetleyici çerçeveyi kurup tele veriyor ve sahipliği çekirdeğe iade ediyor. Kesme en sonda geliyor; birleştirme açıksa tek kesme birden çok girişi kapatıyor.
Halkanın derinliği kartlarda tipik olarak 256 ile 4.096 tanımlayıcı arasında. En küçük çerçevelerle tam yükte, saniyede bir gigabit taşıyan bir hatta 256 girişli alma halkası 172 µs’de doluyor. Derinlik bellek gibi görünüyor ama çekirdeğe tanınan süreyi ölçüyor.
Süre yetmezse ne oluyor? Kuyruğa alınmış paketleri tutacak bellek dolduğunda gelen paket düşüyor. Kayıp tam olarak orada oluyor, kablonun ortasında bir yerde değil.
Halkanın öbür ucundaki kesme de bedava değil. Saniyede bir gigabit taşıyan bir hatta en küçük çerçeve 64 bayt, ama telde 84 bayt yer kaplıyor. Yanına 7 baytlık önsöz, 1 baytlık ayraç ve 12 baytlık çerçeveler arası boşluk ekleniyor. Toplamı 672 bit eder. Tam yükte saniyede 1.488.095 çerçeve geçiyor. Her çerçeve için bir kesme, saniyede 1,49 milyon kesme demek. Tek bir çekirdek için ulaşılamaz bir sayı.
Kartlar bu yüzden kesme birleştirme yapıyor: sürücü ya da kart, işlemciyi kesmeden önce birkaç çerçeve biriktiriyor. 32 çerçevede bir kesme verildiğinde aynı yük saniyede 46.503 kesmeye iniyor. Çerçeveler yine aynı halkada birikiyor. Değişen tek şey, çekirdeğin kaç kez rahatsız edildiği.
Bedeli de aynı bölme işleminden çıkıyor. 32 çerçevede bir kesme veren kart, gruptaki ilk çerçeveyi en kötü durumda 31 çerçeve süresi bekletiyor. Boş bir hatta durum daha kötü: grup hiç dolmazsa kesme de hiç gelmiyor. Yalnızca çerçeve sayan bir politika bu yüzden tek başına kullanılamıyor.
Kartlar ikinci bir politika daha taşıyor. İlk çerçeve halkaya düştüğü anda bir zamanlayıcı başlıyor ve süre dolunca kesme veriliyor, grup dolsun dolmasın. ethtool -c eth0 çıktısında yan yana duran iki ayar tam olarak bunlar: biri çerçeve sayıyor, biri mikrosaniye. 200 µs’ye ayarlanmış bir zamanlayıcı, boş bir hatta gelen tek çerçeveye 0,2 ms’ye kadar gecikme ekliyor; aynı ayar tam yükte gecikmeyi düşürüyor, çünkü işlemci kesme işlemekten kurtulunca kuyruklar daha çabuk boşalıyor. Ayarın işareti yüke bağlı.
Darboğaz gerçekten kartta mı?
Her Ethernet arayüz yongası, desteklediği ortamın tam çerçeve hızında gönderip alabiliyor. Darboğaz yongada değil.
Toplam başarımı dört şey belirliyor. İşlemci gücü, işlemci ile kart arasındaki iç sinyal yolunun hızı, kart üstündeki tampon bellek miktarı ve sürücünün kalitesi. Dördü de Ethernet standardının dışında kalıyor. Makine yetişemezse çerçeveler arayüzde düşürülüyor ya da yok sayılıyor, ve standart bunu kusur saymıyor. Sebebi açık. Standart bir bilgisayarın ne kadar hızlı olacağını tanımlamaya çalışmıyor.
Sayılar farkı gösteriyor. Az önce saydığımız 1.488.095 çerçevelik tavan en küçük çerçevelere aitti. Aynı hatta en büyük çerçevelerle tavan saniyede 81.274 çerçeveye iniyor. Çerçeve sayısı on sekiz kat azalıyor, taşınan veri artıyor.
Bir çerçevenin telde ne kadar durduğu tek bir bölmeden çıkıyor. L bitlik bir paketi R bit/s hızındaki bir hatta itmek L/R saniye sürüyor. 1.518 baytlık bir çerçeve için bu, gigabitlik hatta 12,1 µs. On kat hızlı bir hatta aynı iş 1,21 µs’ye iniyor. Gecikme bileşenlerini ayırırken buna iletim gecikmesi demiştik.
Rakamların ucu bugün bile açık. On gigabitlik bir kanalın tam çerçeve hızına piyasadaki masaüstü ve sunucuların bir kısmı hâlâ yetişemiyor.
Bu yüzden bazı üreticiler üst katman protokol işlemesini kartın üstünde yapan arayüzler satıyor. Boşaltma motorlarının çıkış noktası bu. Somut bir örnek. Çekirdek karta 65.535 baytlık tek bir tampon veriyor, kart onu 1.460 baytlık parçalara bölüyor. 44 tam parça ve 1.295 baytlık bir artık çıkıyor, toplam 45 parça. Yazılımın 45 kez yapacağı iş bir kez yapılıyor.
Kendi makinende bakmak istersen Linux’ta iki program var: mii-tool ve ethtool.
ethtool eth0
ethtool -g eth0
ethtool -c eth0
ethtool -k eth0
ip -s link show eth0İlk komut arayüzün hızını ve çalıştığı kipi yazıyor. İkincisi halka tamponunun azami ve o anki derinliğini, üçüncüsü kesme birleştirme ayarlarını, dördüncüsü açık olan boşaltma özelliklerini döküyor. Sonuncudaki düşen çerçeve sayacı sıfırdan büyükse makinen kartın hızına yetişemiyor demektir.
İlk satırdaki kip de kendi başına bir başarım ayarı. Bir hattın verinin hangi yönde ve ne zaman akabileceğine dair üç seçeneği var, ve üçünün de adı var:
| kip | veri yönü | örnek |
|---|---|---|
| tek yönlü (simplex) | yalnızca tek yön, hiç dönüş yok | radyo yayını, klavyeden bilgisayara |
| yarım çift yönlü (half duplex) | iki yön de mümkün ama aynı anda değil | telsiz, hub’a bağlı Ethernet |
| tam çift yönlü (full duplex) | iki yön aynı anda | anahtara bağlı Ethernet, telefon |
Ortadaki kip ile alttaki arasındaki fark yalnızca hız değil. Yarım çift yönlü bir hatta iki taraf aynı anda konuşabildiği için çarpışma diye bir olasılık vardır ve o olasılığı yönetecek bir kurala ihtiyaç duyulur. Tam çift yönlü hatta böyle bir kural gerekmez, çünkü gönderme ve alma ayrı yollarda yürür.
Tam çift yönlü çalışmanın iki koşulu var: ortamın aynı anda işleyen ayrı gönderme ve alma yolları olması, ve hatta tam olarak iki istasyon bulunması. Koşullar sağlanınca çarpışma diye bir olasılık kalmıyor. Kip 1997’de standartlaştı, ve bugün bağlantıların neredeyse tamamı böyle çalışıyor. Hızı ve kipi seçen şey Auto-Negotiation, yani iki cihazın da desteklediği en yükseğini kendiliğinden bulan protokol.
Bir arıza tam burada saklanıyor. Hattın yalnızca bir ucunda Auto-Negotiation açıksa, uzlaşmaya çalışan taraf yarım çift yönlü kipe düşüyor. Diğer uç elle tam çift yönlüye sabitlenmişse kip uyuşmazlığı kaçınılmaz oluyor. Bu arıza sıradan web trafiğinde hiç görünmüyor. Bandı gerçekten dolduran bir başarım testinde ortaya çıkıyor.
Özet
Peki, ne öğrendik?
- Ağ kartı iki katmanı birden gerçekliyor: bağ katmanı ile fiziksel katman kartın üstünde, geri kalan her şey yazılımda; yığının donanımla buluştuğu çizgi orası.
- Çerçeveyi denetleyici yonga kuruyor: çerçeveleme, hatta erişim ve hata sezme donanımda bitiyor ve ana işlemciye hiç uğramıyor.
- Halka tampon ile DMA işi devrediyor: çekirdek tanımlayıcıyı dolduruyor, kart veriyi bellekten kendisi çekiyor, ve halkanın derinliği aslında çekirdeğe tanınan süredir.
- Kesme birleştirme çekirdeği kurtarıyor: çerçeve başına bir kesme tam yükte ulaşılamaz bir sayıya çıktığı için kart birkaç çerçeveyi biriktirip tek kesme veriyor.
Kart hazır. Halkayı okuyor, çerçeveyi kuruyor, hatayı donanımda seziyor. Ama çerçevenin üstünde iki alan hâlâ boş duruyor. Kart oraya kimin adını yazacak?
Bölüm 21: Fiziksel Adresleme
Çerçeve kartın halka tamponunda hazır bekliyor. Tamponu da kartın kendi işlemcisini de gezdin; üstüne yazılacak iki adı ise boş bıraktım.
O ad fabrikada verilmiş, kartın belleğinde duruyor ve bu ağın dışında hiçbir anlamı yok. Fabrikanın verdiği bir ad dünyada nasıl tek kalıyor?
Bir adı dünyada tek yapan ne?
Ethernet arayüzünün adı 48 bit. Onaltılık yazımda bu 12 haneye düşüyor, çünkü her onaltılık hane tam 4 bit taşıyor. Haneler ikişer gruplanınca 6 sekizli çıkıyor, ve adresi kısa çizgilerle ayrılmış görmenin sebebi bu. Sayının adı MAC adresi; literatürde fiziksel adres ya da NIC adresi diye de anılıyor, ama bu kitapta tek biçimde kalıyor.
Adın MAC olmasının sebebi Ethernet’in ortam erişim denetimi sistemi. O sistem yalnızca kimin ne zaman konuşacağını ayarlamakla kalmıyor, çerçevenin kendisini ve adreslemesini de kapsıyor.
48 bitlik uzay 281.474.976.710.656 adres tutuyor. Bu kadar geniş bir uzayda iki üreticinin aynı sayıyı vermemesi tesadüf sayılamaz. Uzayın dağıtımını IEEE yönetiyor; kart üretecek şirket oradan bir blok satın alıyor ve ödediği ücret sembolik kalıyor. Tekliği sağlayan şey o satın alma.
Dilimin adı kurumsal tekil tanımlayıcı; Türkçe kaynaklarda Organizasyonel Tek Kimlik, kısaltmasıyla OUI. IEEE her üreticiye 24 bitlik bir OUI veriyor. Üretici adresin ilk 24 bitine kendi OUI’sini koyuyor, kalan 24 biti kendi üretim sayacıyla dolduruyor. Tek dilim 16.777.216 adres taşıyor.
Bugün dilim tek boyda satılmıyor. On altı milyon adres, yılda birkaç yüz cihaz üreten bir şirket için akıl almaz bir israftı; IEEE bu yüzden üç beden tanımladı:
| blok | ayrılan bit | üreticiye kalan | adres sayısı |
|---|---|---|---|
| MA-L | 24 | 24 bit | 16.777.216 |
| MA-M | 28 | 20 bit | 1.048.576 |
| MA-S | 36 | 12 bit | 4.096 |
Bunun pratik bir sonucu var ve arıza ararken tökezletiyor: ilk üç sekizli artık tek başına üreticiyi vermeyebilir. MA-S bloğunda ilk 36 bit, yani dört buçuk sekizli IEEE’ye ait; aynı ilk üç sekizliyi 256 ayrı şirket paylaşıyor olabilir. Adresten üretici çözen araçlar bu yüzden tam eşleşme değil, en uzun önek eşleşmesi yapıyor — yönlendirme tablosunda karşına çıkacak mantığın aynısı, başka bir uzayda.
Yine de çoğu durumda ilk üç sekizliye bakarak arayüz yongasının üreticisini bulmak mümkün. Arıza ararken işe yarıyor: elindeki adresin hangi karta ait olduğunu bilmek, o kartı binada aramaktan kolay.
Fabrikanın verdiği adın ikinci yararı, ağ yöneticisinin adres dağıtma ve yönetme işini tamamen ortadan kaldırması. İş üretim hattında bitiyor.

Neden kartın kendi adı var?
Arayüz sözleşmesi her katmana kendi adlandırma düzenini bırakıyor, ve üç katman üç ayrı ad kullanıyor. Uygulama katmanında makinenin adı, ağ katmanında IP adresi, bağ katmanında MAC adresi var. Adın sayıya nasıl çevrildiğini kök sunuculardan yetkili sunucuya kadar adım adım takip etmiştik. Oradaki ad insan içindi.
MAC adresi düz bir ad: içinde ağ kısmı, makine kısmı gibi bir bölümlenme yok. Zaten işi de dar; çerçeveyi bir arayüzden, ona fiziksel olarak bağlı başka bir arayüze ulaştırmaktan ibaret. Kart nereye giderse gitsin adresi değişmiyor. 802.11 arayüzü olan bir telefon hangi ağa girerse girsin aynı adı taşıyor. Ad kartla birlikte yolculuk ediyor.
IP adresi ise hiyerarşik. Ağ kısmı ve makine kısmı var, ve makine başka bir alt ağa taşınınca adresin değişmesi gerekiyor.
Kartlara MAC yerine doğrudan IP verilseydi ne olurdu? Başka ağ katmanı protokollerini desteklemek zorlaşırdı; MAC bilerek tarafsız bırakıldı. Kart ağ katmanı adresini tutsaydı, o adresin kart belleğinde saklanması gerekirdi. Her taşınmada ve her açılışta yeniden yapılandırılırdı.
Kartlarda hiç adres olmaması ise başka bir bedel getirirdi. Yerel ağ geniş yayın ortamı, yani ortamdaki veriyi herkes alıyor. Adres olmasaydı makine yerel ağdaki her çerçeve için kesmeye uğrardı. Adres, işletim sistemini rahatsız etmemek için var.
Kart hangi çerçeveyi açar?
Kapsülleme merdivenini çıkarken bu iki alanın genişliğini vermiş, içini kasten boş bırakmıştım. Çerçevede hedef adres önce, kaynak adres sonra geliyor ve ikisi de 6 bayt tutuyor. Sıra keyfi değil ve kartın işini doğrudan belirliyor.
Ethernet arayüzü kablodaki her çerçeveyi en azından hedef adres alanına kadar okumak zorunda. Adres tutmuyorsa geri kalanını okumadan bırakabiliyor. Hedef adres kendisininkiyle eşleşiyorsa ya da yayın adresiyse yükü ağ katmanına çıkarıyor. Eşleşme yoksa çerçeveyi atıyor ve datagramı yukarı hiç vermiyor.
Bu filtre kapatılabiliyor. Yakalamayı karışık modda yaparken kart eşleşmeyen çerçeveleri de yukarı veriyordu; ekranda gördüğün trafik o yüzden kendi adresinle sınırlı kalmıyordu.
Adres alanlarından önce önsöz duruyor: 8 baytlık bir alan. İşi alıcı ile göndericinin saat hızlarını eşitlemek. IEEE 802.3 bu alanı ikiye ayırıyor: ilk 7 bayt önsöz, son 1 bayt çerçeve başlangıç sınırlayıcısı. Desen 7 bayt boyunca 10101010, ardından bir bayt 10101011 geliyor. Sondaki iki 1 biti adres alanının başladığını işaretliyor.
Kaynak adres alanı çerçeveyi gönderen cihazın MAC adresini taşıyor. Bu alan her zaman tek bir arayüzü gösteren adres olmak zorunda, oraya yayın adresi yazılamıyor. Ethernet MAC protokolü kaynak adresi hiçbir şekilde yorumlamıyor. Alan üst katman yazılımı, arıza takibi ve anahtarlar için duruyor. Anahtar, kaynak adresleri kendi portlarıyla eşleyen tabloyu bu alandan kuruyor; anahtarın her portunun da fabrikada atanmış kendi adresi var.
Adreslerden sonra gelen tür alanı içerideki üst katman protokolünü bildiriyor. Çerçevenin sonundaki CRC ise bozulmayı sezmek için duruyor.
DerinleşmeAynı iki bayt hem "uzunluk" hem "tür" olabilir mi?
Ethernet’in iki ayrı çerçeve biçimi var ve ikisi bugün aynı kabloda yan yana yaşıyor.
Ethernet II — piyasadaki adıyla DIX, üç üreticinin baş harflerinden — adreslerden sonraki iki baytı tür olarak kullanıyor: içeride hangi protokol var? IEEE 802.3 ise aynı iki baytı uzunluk olarak tanımladı: veri alanında kaç bayt var?
İki standart aynı alana iki farklı anlam yükleyince alıcının bir ayırt etme yöntemine ihtiyacı oldu. Çözüm sayının kendisinde saklı. Veri alanının üst sınırı 1.500 bayt, yani onaltılıkta 0x05DC; bir uzunluk alanı bu değeri hiçbir zaman aşamaz. Tür değerleri ise kasten 0x0600 yani 1.536’dan başlatıldı.
| alandaki değer | alıcı ne anlıyor |
|---|---|
| 1.500 ve altı | bu bir uzunluk → çerçeve IEEE 802.3 |
| 1.536 ve üstü | bu bir tür → çerçeve Ethernet II |
| arası (1.501-1.535) | tanımsız; kimse kullanmıyor |
Aradaki 35 değerlik boşluk boşa harcanmış değil, kasten boş bırakılmış bir tampon. İki biçimin bir arada yaşayabilmesinin bedeli bu.
802.3’ün bir sorunu vardı: alanı uzunluğa harcayınca protokolü söyleyecek yer kalmadı. Bunun için veri alanının başına ayrı bir başlık kondu. LLC başlığı üç bayt taşır: hedef ve kaynak hizmet access point ile bir denetim baytı. Sekiz bitlik bu noktalar protokol dünyasını adreslemeye yetmediği için üstüne bir de SNAP başlığı eklendi: 3 bayt OUI ve 2 bayt tür. Toplam sekiz bayt — yalnızca Ethernet II’nin iki baytta yaptığı işi yapmak için.
Bugün IP taşıyan hemen her çerçeve Ethernet II. 802.3 biçimi ölmedi ama daraldı: anahtarlar arasında döngüyü kıran denetim mesajları ve bazı eski protokoller hâlâ LLC ile konuşuyor. Kendi yakalamanda ethertype IPv4 (0x0800) yazan her satır birinci biçimi, 802.3, LLC yazan her satır ikincisini gösteriyor.
Kırk sekiz bitin nasıl bölündüğünü tek tek açalım:
- Önsöz saatleri eşitliyor. Yedi baytlık tekrarlı desen alıcının saatini gönderene kilitliyor. Sekizinci baytın sonundaki iki 1 biti adres alanının başladığını işaretliyor.
- Hedef adres okunuyor. Tele ilk giren adres alanı hedef adres. Kart onu kendi fabrika adresiyle karşılaştırıyor; yayın adresi de eşleşme sayılıyor.
- Eşleşme yoksa bırakıyor. Çerçevenin geri kalanı okunmuyor ve işletim sistemi hiç rahatsız edilmiyor. Kartın her çerçeveyi en azından bu alana kadar okumasının sebebi bu.
- Kaynak adres geçiyor. Ethernet MAC protokolü bu alanı yorumlamıyor. Anahtar port tablosunu buradan kuruyor; arıza takibi de çerçeveyi kimin gönderdiğini buradan okuyor.
- Yük yukarı çıkıyor. Tür alanı içerideki protokolü söylüyor, yük ağ katmanına veriliyor, sondaki FCS bozulmayı sezmek için kalıyor. Karar hedef adreste verilmişti.
İkinci hane ne söylüyor?
Hedef adresin tele ilk giden biti adresin kime gittiğini söylüyor. Sıfırsa tek bir arayüzün MAC adresi, birse bir gruba gönderim. Fabrikada atanan adresin teknik adı bu yüzden tekli yayın adresi. IEEE 802.3 ikinci bite ayrı bir anlam yüklüyor. Sıfırsa adres küresel yönetiliyor, yani üreticiden gelmiş. Birse yerel olarak yönetiliyor.
Bu iki bit adresin neresinde görünüyor? Sekizliler soldan sağa gönderiliyor ama bir sekizlinin içindeki bitler en anlamsızdan en anlamlıya doğru gidiyor. Sıra tersine dönüyor. Bayrak bitleri bu yüzden adresin ikinci onaltılık hanesinde okunuyor.
ilk sekizli : b7 b6 b5 b4 b3 b2 b1 b0
tele çıkış : b0 b1 b2 b3 b4 b5 b6 b7
^ ^
| +-- 0: küresel yönetilen · 1: yerel yönetilen
+----- 0: tekli yayın · 1: çoklu yayınKural bu yüzden tek bir haneye bakarak okunabiliyor:
| ikinci hane | adres ne anlama geliyor |
|---|---|
| tek sayı: 1, 3, 5, 7, 9, B, D, F | çoklu yayın |
| 2, 6, A, E | yerel yönetilen tekli yayın |
| 0, 4, 8, C | fabrikadan gelen küresel tekli yayın |
Yerel yönetilen tekli yayın için 16 haneden yalnızca 4’ü uygun, yani %25.
Şu adres üstünde yürüyelim: 06-4B-7C-D2-05-9A. İlk sekizli 0x06, ikilik yazımda 0000 0110 oluyor. En anlamsız bitten gönderilince tele 0110 0000 olarak çıkıyor. İlk bit sıfır, yani tekli yayın; ikinci bit bir, yani yerel yönetilen. Bu adres tanımı gereği hiçbir üreticiye ait değil.
48 bitin hepsi bir olursa adres yayın adresine dönüşüyor: FF-FF-FF-FF-FF-FF. Gönderen kart herkesin işlemesini istiyorsa hedef adres alanına o özel değeri yazıyor. Yayın adresine gönderilen bir çerçeveyi yerel ağdaki her istasyon alıyor ve işlemek zorunda kalıyor. Bedeli herkese dağılıyor.
Yayın adresi aslında çoklu yayının özel hâli: bütün istasyonlardan oluşan grup. Bit kuralı da bunu doğruluyor, çünkü ilk bit bir olduğu için adres teknik olarak çoklu yayın. Çoklu yayın adresi tek bir çerçevenin bir istasyon grubu tarafından alınmasını sağlıyor. Arayüz, bir ya da daha fazla grup adresine gelen çerçeveleri alacak şekilde programlanabiliyor.
Ethernet’te yayın adresi tek bir sabit değer. IP’deki yayın adresi ise hangi alt ağda olduğuna göre değişiyor. Düz adres uzayı ile hiyerarşik adres uzayı arasındaki fark tam burada görünüyor.
Bir üst kattaki grup, buradaki adrese nasıl çevriliyor?
Ağ katmanı bir gruba paket yollamak istediğinde elinde bir çoklu yayın IP adresi var, ama kart yalnızca MAC adresi tanıyor. Aradaki dönüşüm bir tablo değil, doğrudan bir hesap — ve tasarımı bu kitapta göreceğin en pratik hilelerden biri.
IPv4’te kural şu: MAC adresinin ilk 25 biti sabit (01:00:5E ve ardından bir sıfır biti), kalan 23 bite IP adresinin son 23 biti kopyalanıyor.
IP 224.0.0.251 → MAC 01:00:5E:00:00:FB
IP 239.255.255.250 → MAC 01:00:5E:7F:FF:FAİlk sekizli 01, yani ilk bit bir: adres tanımı gereği çoklu yayın. Hesap hiçbir sunucuya sormadan, hiçbir tablo tutmadan yapılabiliyor.
Bir kusuru var ve kasten kabul edilmiş. Çoklu yayın IP adresinin makine kısmı 28 bit ama MAC’e yalnızca 23 biti sığıyor; aradaki 5 bit düşüyor. Yani 32 ayrı IP grubu aynı MAC adresine düşüyor. Kart bunlardan birine üye olduğunda öteki 31’inin çerçevelerini de yukarı veriyor, ve ayıklamayı işletim sistemi yapıyor. Donanım filtresinin kaçırdığını yazılım filtresi topluyor.
IPv6 aynı numarayı daha bol yerle yapıyor: 33:33 ile başlıyor ve adresin son 32 bitini kopyalıyor. Çakışma ihtimali pratikte kalmıyor.
Aynı adres bir kat yukarıda yeniden doğuyor
MAC adresinin ikinci bir hayatı daha var. IPv6’da bir makine kendi adresini kendi üretiyor ve o adresin alt yarısını çoğu zaman kartın MAC adresinden çıkarıyor. Yönteme EUI-64 deniyor ve üç adımdan oluşuyor:
- 48 bitlik adresi ortadan ikiye böl.
- Araya
FF:FEiki sekizlisini sok — 48 bit 64 bite çıkar. - İlk sekizlideki yerel yönetim bitini ters çevir.
MAC 00:1B:44:11:3A:B7
adım 1 00:1B:44 | 11:3A:B7
adım 2 00:1B:44:FF:FE:11:3A:B7
adım 3 02:1B:44:FF:FE:11:3A:B7 → ::021b:44ff:fe11:3ab7Üçüncü adım ilk bakışta keyfî görünüyor. Değil: EUI-64 uzayında bitin anlamı ters çevrilmiş — orada 1 “küresel”, 0 “yerel” demek. Aynı bit, iki farklı standartta zıt anlamlar taşıyor ve dönüşüm bunu düzeltiyor. Bir bitin anlamının bağlama göre değişmesi, bu kitapta gördüğün en sinsi uyumsuzluk olabilir.
Yöntemin bir bedeli daha vardı ve bu kez kabul edilmedi. MAC adresi değişmediği için ondan türetilen IPv6 adresinin alt yarısı da değişmiyordu; makine hangi ağa giderse gitsin adresinin yarısı aynı kalıyor, yani bu bölümün sonunda konuşacağımız iz kalıcı hâle geliyordu. RFC 8981 bu yüzden geçici adresler tanımladı ve modern işletim sistemleri dışarı çıkarken MAC’ten türetilmiş adresi değil, düzenli aralıklarla yenilenen rastgele bir adresi kullanıyor. Makinenin kendi IPv6 adresini nasıl bulduğunu anlatırken buraya geri döneceğiz.
MAC adresi yazılımla değiştirilebiliyor. Bugün kullanılan Ethernet arayüzlerinin hepsi buna izin veriyor, standart açıkça zorunlu kılmasa da uygulamada durum bu. Fabrika adı bir kilit değil, bir varsayılan.
Yerel yönetilen adresler Ethernet’te uzun süre seyrek kullanıldı. Sebebi sade: her arayüz zaten fabrikada tek bir adres alıyordu. Adres rastgeleleştirmesi tam olarak bu az kullanılan kapıdan geçiyor. İkinci biti bire çekiyor ve fabrikadan gelen adı bırakıyor. Rastgele üretilen sayının ikinci hanesi bu yüzden 2, 6, A ya da E oluyor.
İzlemeyle ilgisi doğrudan MAC’in düz yapısından geliyor. Değişmeyen bir ad, cihaz nereye giderse gitsin aynı kaldığı için tek başına bir iz. Telefonun her ağda aynı adı göstermesi, o telefonu her ağda tanınır yapıyor. Rastgeleleştirme bu izi kesiyor.
Kendi fabrika adını görmek istersen:
getmac /v /fo listKomut her ağ kartı için bir blok döküyor: bağlantı adı, ağ bağdaştırıcısı, Fiziksel Adres ve taşıma adı. O satırdaki 12 hane, kartın ROM’una yazılmış ad. İkinci haneye bak: 0, 4, 8 ya da C ise elindeki ad gerçekten fabrikadan geliyor.
Özet
Peki, ne öğrendik?
- MAC adresi 48 bitlik ve bölümsüz: hiyerarşi taşımadığı için kart nereye taşınırsa taşınsın aynı sayıyı gösteriyor.
- Tekliği IEEE’nin dağıtımı sağlıyor: üretici 24 bitlik OUI’sini adresin ilk yarısına koyuyor, kalan yarıyı kendi üretim sayacıyla dolduruyor.
- Kart her çerçeveyi hedef adrese kadar okuyor: eşleşme ya da yayın adresi yoksa gerisini okumadan bırakıyor ve işletim sistemini hiç rahatsız etmiyor.
- Kural tek haneye iniyor: ikinci onaltılık hane tekse çoklu yayın; 2, 6, A ve E yerelde verilmiş, 0, 4, 8 ve C ise küresel tekli yayın anlamına geliyor.
- Çoklu yayın adresi hesaplanır, sorulmaz: IPv4’te
01:00:5Eönekine adresin son 23 biti kopyalanır ve 32 grup aynı MAC’e düşer; ayıklamayı yazılım tamamlar.- Aynı adres bir kat yukarıda yeniden doğuyor: EUI-64 araya
FF:FEsokup yerel yönetim bitini ters çevirir, çünkü o bitin anlamı iki standartta zıttır.
Çerçevenin iki adresi de yerinde: kimin gönderdiği ve kimin alacağı yazılı. Ama bu çerçeve şimdi bakırın ya da camın içinde kilometrelerce yol alacak. Yolda tek bir bit ters dönerse bunu kim fark edecek?
Bölüm 22: Hata Sezme ve CRC
Çerçeve hazır. Fabrikadan gelen MAC adresini başına yazdık, ama yolda bir bit ters dönerse bunu kimin fark edeceğini söylemedim.
Fark eden bir gözlemci yok. Çerçevenin sonuna eklenen küçük bir sayı var ve bütün iş onda. Peki dört bayt, 1.500 baytlık bir yükü nasıl koruyabiliyor?
Bir bit neden ters döner?
Telin üstündeki sinyal yol boyunca zayıflıyor. Üstüne bir de dışarıdan gelen elektromanyetik gürültü biniyor. Alıcı eşiğe yakın bir gerilim gördüğünde yanlış karar veriyor ve gönderilen sıfır, bir olarak okunuyor. Bit hatasının fiziksel sebebi bu iki etkinin toplamı.
Olasılık kanaldan kanala değişiyor ve fiberde diğer bütün ortamlardan çok daha düşük kalıyor. Yıldırım gibi atmosferik olaylar ise hem telli hem telsiz ortamda aynı şeyi yapıyor: art arda gelen bitleri topluca bozuyor. Bu kümeye patlama hatası deniyor. Ayrım yöntem seçimini belirliyor, çünkü tek bir biti koruyan hesap on bitlik bir patlamanın karşısında çaresiz kalıyor.
Sinyalin neden zayıfladığını ve gürültünün nereden geldiğini burada bırakıyorum; ortamın kendisine kitabın sonunda bakacağız.
Bir şeyi de baştan sabitleyeyim. Hiçbir sezme yöntemi %100 güvenilir değil; her yöntem bazı hataları kaçırıyor, ama nadiren. Denetim alanı büyüdükçe hem sezme hem düzeltme gücü artıyor. Bedeli her çerçevede taşınan fazladan bit.
Sezmek ile düzeltmek aynı iş mi?
Hata denetimi iki ayrı aşamada yürüyor. Önce saptama: bir bozulma var mı? Sonra düzeltme: bozulan neydi ve doğrusu neydi? İki büyük aile bu iki aşamayı farklı paylaştırıyor.
FEC (forward error correction, ileri yönlü hata düzeltme) ikisini birlikte yapıyor. Alıcı göndericiye hiçbir şey sormadan bozulan biti geri çeviriyor. Yaygın iki algoritması Hamming kodlaması ve Reed-Solomon kodlaması; 1-2 bitlik hataları anlayıp düzeltebiliyorlar.
Asıl kazanç hızda. Alıcı hatayı yerinde düzelttiği için bir gidiş-dönüş süresi beklenmiyor. Derin uzay bağlantılarında bu belirleyici oluyor, çünkü orada bir sorunun cevabı dakikalarca yolda kalıyor. Gerçek zamanlı ses ve videoda da öyle.
Patlama hataları FEC’i zorluyor. Fiziksel katmanın çözümü, denetim bitlerini ekledikten sonra bitleri karıştırmak. Tek bir gürültü patlaması artık komşu bitleri değil, birbirinden uzak bitleri vuruyor. Alıcı sırayı geri çevirince küme dağılmış oluyor.
ARQ (automatic repeat request, otomatik tekrar isteği) daha az iddialı. Bozulan paketi yeniden gönderiyor, o kadar. Bu yüzden akış kontrolüyle birlikte çalışıyor. Veriyi paketlere bölmenin sebeplerinden biri de bu: bozulan tek paket yeniden gönderiliyor, koca dosya değil.
Bir kodun gücünü ölçen tek sayı
“Bu yöntem kaç bitlik hatayı yakalar?” sorusunun tahmine dayanmayan bir cevabı var ve tek bir büyüklüğe iniyor.
İki bit dizisi arasındaki Hamming uzaklığı, kaç konumda farklı olduklarıdır. 1011010 ile 1001110 arasındaki uzaklık ikidir; üçüncü ve beşinci bitler tutmuyor. Bir hata tam olarak bunu yapıyor: diziyi kendisinden d uzaklıktaki başka bir diziye taşıyor.
Denetim biti eklediğinde bütün bit dizileri geçerli olmaktan çıkıyor; yalnızca bir kısmı geçerli kod sözcüğü oluyor. Kodun gücünü belirleyen şey, bu geçerli sözcüklerin birbirine ne kadar uzak durduğu. En yakın iki geçerli sözcük arasındaki uzaklığa kodun asgari uzaklığı (dmin) deniyor ve her şey ondan çıkıyor:
d bitlik hatayı SEZMEK için dmin ≥ d + 1
d bitlik hatayı DÜZELTMEK için dmin ≥ 2d + 1İki formülün arasındaki fark, geometrik olarak düşününce kendiliğinden anlaşılıyor. Geçerli sözcükleri bir uzayda noktalar gibi düşün. Sezmek için, d bitlik bir hatanın seni başka bir geçerli noktaya düşürmemesi yeter — arada en az bir adım daha olmalı. Düzeltmek ise daha fazlasını istiyor: bozulmuş diziye en yakın geçerli noktanın tek olması gerekiyor, yani her noktanın çevresindeki d yarıçaplı kürelerin birbirine değmemesi. İki kat yer gerekiyor, formüldeki 2 katsayısı da oradan geliyor.
Şimdi tanıdık iki kodu ölç:
| kod | dmin | sezer | düzeltir |
|---|---|---|---|
| tek eşlik biti | 2 | 1 bit | — |
| Hamming (7,4) | 3 | 2 bit | 1 bit |
| genişletilmiş Hamming (8,4) | 4 | 3 bit | 1 bit |
Tek eşlik bitinin dmin = 2 olması, iki geçerli sözcüğün en az iki bit farklı olması demek — bir bit çevirirsen mutlaka geçersiz bir diziye düşersin, bu yüzden hatayı görürsün. Ama hangi bitin ters döndüğünü söyleyemezsin: d + 1 = 2 sağlanıyor, 2d + 1 = 3 sağlanmıyor. Bu kitapta ilerideki her yöntemin gücü aynı cetvelle ölçülüyor.
Bedeli de aynı cetvelde okunuyor. Sözcükleri birbirinden uzaklaştırmanın tek yolu daha çok denetim biti eklemek, yani her çerçevede daha az veri taşımak. Güvenilirlik ile verim aynı bütçeden besleniyor.
Saymak nereye kadar yetiyor?
En ucuz sezme tek bir bit ekliyor. Asenkron haberleşmede her karakterin yanına giden eşlik biti bu. Çift eşlikte bir’lerin sayısı çift olacak şekilde ayarlanıyor, tek eşlikte tek. Hangisinin kullanılacağına iki tarafın önceden karar vermesi gerekiyor.
Alıcının işi sayı saymak. Gelen bir’leri sayıyor; teklik ya da çiftlik tutmazsa bozulma var demektir ve karakter yeniden isteniyor. Bir baytlık 01001011 içinde dört tane bir var, o yüzden çift eşlikte eklenen bit sıfır oluyor. Bayt başına bir bit, yani %12,5 yük.
Kör noktası da aynı yerde duruyor. Çift sayıda bit ters dönerse toplam yine tutuyor ve hata görünmez kalıyor. Hatalar patlama hâlinde geldiğinde bu bir istisna olmaktan çıkıyor: tek eşlik bitiyle korunan bir çerçevede sezilemeyen hata olasılığı %50’ye yaklaşabiliyor.
İki boyutlu eşlik bir kat yukarı çıkıyor. Veri satır ve sütunlara diziliyor, her satır ve her sütun için ayrı eşlik hesaplanıyor. Tek bit bozulduğunda bozuk satır ile bozuk sütunun kesişimi hatalı biti veriyor; alıcı onu çevirip düzeltiyor. İki bit bozulduğunda ise düzeltemiyor, yalnızca sezebiliyor. Pratikte kullanılmamasının sebebi bedeli: 4x4’lük bir matriste 16 veri biti için 9 eşlik biti gerekiyor, yani %56 yük.
Checksum aynı fikri bir adım ileri taşıyor. İnternet checksum veriyi 16 bitlik tamsayılar dizisi sayıyor, bir tümleyen toplamını alıyor ve sonucu denetim alanına yazıyor. Alıcı aynı hesabı yeniden yapıp karşılaştırıyor. Eşit değilse hata sezildi. Eşitse sezilmedi, ama yine de olmuş olabilir.
Zayıflığı gösterilebilir. Üç kelime al: E38F, A51C, 4B60. Toplamları 2BF3 çıkıyor. Şimdi birinci kelimeyi bir artır, ikinciyi bir azalt. İkisi de değişti, sonuç yine 2BF3 çıkıyor. Toplama değişmeli olduğu için kelimelerin sırasını bozmak da sonucu değiştirmiyor.
TCP ve UDP checksum yalnızca 16 bit yer kaplıyor. Yükü çok düşük, koruması da o oranda zayıf. Sebep tasarımda: taşıma katmanı yazılımda çalışıyor ve ucuz bir hesap seçiyor. IPv6 başlığında bu alan hiç yok; yönlendiricide işlemeyi hızlandırmak için kaldırılmış ve koruma alt ile üst katmanlara bırakılmış.
Çerçevenin sonundaki dört bayt
Bağ katmanı aynı ödünleşimi ters yönde çözüyor. Hesap ağ kartının üstündeki özel donanımda çalışıyor, bu yüzden pahalı bir yöntem göze alınabiliyor. O yöntem CRC.
CRC (cyclic redundancy check, döngüsel artıklık denetimi) kodlarının öbür adı polinom kodları. Bit dizisi, katsayıları 0 ve 1 olan bir polinom gibi ele alınıyor. Gönderici ile alıcı önce r+1 bitlik bir üreteç deseninde anlaşıyor; desenin en soldaki biti 1 olmak zorunda ve deseni standart veriyor. Hesap mod-2 aritmetiğiyle yürüyor: elde ve borç yok, toplama ile çıkarma aynı işlem ve ikisi de bit bazında XOR.
Gönderici veriyi r bit sola kaydırıp üretece bölüyor. Kalan, veriye eklenen CRC bitleri oluyor:
D = 100110 veri, 6 bit
G = 1101 üreteç, r+1 = 4 bit (r = 3)
100110000 ÷ G -> kalan 110
tele çıkan -> 100110110
alıcıda kalan -> 000
soldan dördüncü bit ters: 100010110 -> kalan 011 (hata sezildi)Alıcı ayrı bir hesap tutmuyor. Veriyi ve CRC bitlerini birlikte üretece bölüyor; kalan sıfırdan farklıysa hata var.
Uluslararası standartlarda 8, 12, 16 ve 32 bitlik üreteçler tanımlı. Ethernet’in seçtiği CRC-32’nin üreteci 33 bitlik sabit bir desen ve aynı desen bağ katmanındaki IEEE protokollerinde ortak. Her standart iki şeyi garanti ediyor: r+1 bitten kısa bütün patlamalar ve tek sayıda bit hatasının hepsi kesin yakalanıyor. Daha uzun patlamalar da yüksek olasılıkla seziliyor. 32 bitlik artıklıkta kaçırma olasılığı %0,0000000233’e iniyor.
Üç yöntemi aynı hata patlaması üstünde karşılaştıralım:
- Çerçeve yola çıkıyor. Kartın kabloya ittiği bit dizisi. Her kutucuk bir bit; hepsi doğru çıktı ve karşı uçta doğru okunması bekleniyor.
- Gürültü patlaması vuruyor. Atmosferik bir darbe ardışık dört biti birden ters çeviriyor. Bozulma tek tük gelmiyor, küme hâlinde geliyor; sezme yönteminin sınavı da bu.
- Tek eşlik biti. Bir’lerin sayısını çift ya da tek tutuyor. Tek sayıda dönüşü kesin yakalıyor; dört bit döndüğü için burada toplam yine tutuyor ve hata görünmez kalıyor.
- İnternet sağlaması. Veriyi 16 bitlik sayılar dizisi sayıp topluyor. Bu patlamayı görüyor, ama birbirini telafi eden iki değişimde toplam aynı kaldığı için kör kalabiliyor.
- CRC-32 ve aradaki fark. Aynı bitleri bir polinom gibi bölüyor: 33 bitten kısa her patlama kesin yakalanıyor. Alan 1 bitten 32 bite çıkarken kör nokta milyarda bire iniyor.
DerinleşmeCRC neden bölme, ve neden tam olarak bu desen?
Bir sezme değerinden istenen tek şey var: veriyle birlikte yolculuk etsin ve bozulma onu da bozsun. Toplamanın kör noktası bir uygulama kusuru değil; değişmeli bir işlemden başka türlüsü çıkmıyor.
Bölme kalanı öyle davranmıyor. Kalan, dizinin her bitinin konumuna duyarlı; bir biti başka bir yere taşımak kalanı da değiştiriyor. Patlama garantisinin kaynağı burada: ardışık bir bozulma, üreteç deseninin derecesinden kısa kaldığı sürece kalanı sıfır bırakamıyor.
Desenin en soldaki bitine konan şart da aynı yerden geliyor. Kalanın genişliğini desenin derecesi belirliyor; baştaki bir sıfır dereceyi düşürür ve çerçevede ayrılan alanın bir kısmı boşa gider. Tek sayıda bit hatasının hepsinin yakalanması ise desenin (x+1) çarpanını taşımasından: tek sayıda terimli hiçbir hata deseni ona tam bölünmüyor.
Desenin kendisi de keyfî seçilmiyor. Standartlaşan polinomlar, hangi hata desenlerinin tam bölünemeyeceğine bakılarak belirlenmiş ve seçim bir kez yapıldıktan sonra dondurulmuş. İki ucun aynı deseni kullanması şart olduğu için desen değiştirmek, dünyadaki bütün adaptörleri aynı anda değiştirmek demek. Spesifikasyon bit sırasına kadar iniyor: CRC değeri tele yazılırken polinomun en yüksek dereceli katsayısı ilk, sabit terim son bit olarak çıkıyor.
Ethernet çerçevesinin son alanı FCS (frame check sequence, çerçeve denetim dizisi). 32 bit, yani 4 bayt, ve içine CRC-32 sonucu yazılıyor. Hesap hedef adres, kaynak adres, tür alanı ve veri alanları üzerinden yapılıyor; baştaki 8 bayt, yani önsöz ile çerçeve başlangıç sınırlayıcısı, hesaba katılmıyor. Kapsülleme merdiveninde bu alanı adlandırmış ama içini boş bırakmıştım.
Bu dört baytın bedeli çerçeve boyuna göre değişiyor. 1.518 baytlık dolu bir çerçevede FCS’nin yükü %0,26 kalıyor. 64 baytlık en küçük çerçevede aynı alan %6,25’e çıkıyor. Aradaki fark kabaca yirmi dört kat.
Hesap tutmazsa çerçeve düşürülüyor ve arayüzün hata sayacı bir artıyor. Üst katmana hiçbir şey çıkmıyor. Alıcı kart göndericiye ne ACK ne NAK yolluyor; Ethernet güvenilir değildir. Düşen çerçevedeki veri ancak üst katmanda güvenilir bir protokol varsa kurtarılıyor. Bağ katmanı hatayı tespit ediyor, telafi etmiyor.
Yol üstünde iki tuzak var. Bir anahtar çerçeveyi tamponuna alıp CRC’sini denetledikten sonra iletiyorsa bozuk çerçeve orada duruyor; hedef adresi okur okumaz iletiyorsa CRC’ye hiç bakılmadan bozuk çerçeve yayılabiliyor. Bu tercihin adını anahtarı açtığımızda koyacağız. İkinci tuzak da anahtarın elinde: çerçeveye bir etiket eklendiğinde FCS baştan hesaplanıyor.
Sayacı kendi makinende görebilirsin:
ip -s link show enp3s0
ethtool -S enp3s0 | grep -i crcİlk komut RX satırının altında errors sütununu dökecek. İkincisi sürücünün tuttuğu ayrıntılı sayaçlardan rx_crc_errors benzeri bir satır verecek. Sayı artıyorsa kablo, konnektör ya da yakındaki bir gürültü kaynağı sorguya çekilir.
Özet
Peki, ne öğrendik?
- Bozulmanın sebebi zayıflama ve gürültü: yıldırım gibi olaylar bitleri tek tek değil ardışık kümeler hâlinde deviriyor ve yöntem seçimini belirleyen şey bu.
- Saptama ile düzeltme ayrı işler: FEC ikisini birlikte yapıp gidiş-dönüş süresini kurtarıyor, ARQ ise yalnızca saptayıp bozulan paketi yeniden istiyor.
- Ucuz yöntemlerin kör noktası ölçülü: tek eşlik biti çift sayıda dönüşü, internet checksum birbirini telafi eden değişimleri kaçırıyor.
- CRC bölmeye dayanıyor: veri r bit kaydırılıp üretece bölünüyor, kalan çerçeveye ekleniyor ve alıcıda kalanın sıfırdan farklı çıkması hatayı ele veriyor.
Çerçevenin sonu artık dolu ve başındaki iki adres de yerinde. Peki oraya yazdığın MAC’i sen nereden buldun? Elinde hedefin IP adresi var; aradaki eşlemeyi kim yapıyor?
Bölüm 23: Adres Çözümleme: ARP
Çerçevenin sonuna dört baytlık FCS’yi koyduk; başındaki iki adres alanı da tanımlıydı. Elinde ise yalnızca bir IP adresi var ve aradaki eşlemeyi kimse önceden yapmadı.
Geriye tek bir iş kalıyor: sormak. Ağda sormak ise harfi harfine bağırmak demek. Peki bağırınca kim cevap veriyor?
Soru sorulmadan önce bir karar veriliyor
Makinen çerçeveyi yazmadan önce sessiz bir hesap yapıyor. Hedef IP adresini ve kendi adresini alt ağ maskesinden geçiriyor. İki sonuç aynıysa hedef aynı ağda oturuyor; farklıysa hedef uzakta kalıyor.
Somut bir örnek üstünde yürüyelim. Adresin 192.0.2.10 ve maskesi 255.255.255.0 olsun. Hedef 192.0.2.40 ise maskeden geçen iki sonuç da aynı çıkıyor; komşusun. Hedef 198.51.100.5 olsaydı sonuçlar ayrışacak ve soru o makine için hiç sorulmayacaktı.
Uzak hedefte ARP hedefin kendisi için sorulmuyor, default gateway (varsayılan geçit) için soruluyor — yani makinenin, kendi ağında olmayan her şeyi teslim ettiği çıkış kapısı için. Çerçevenin hedef MAC adresi yönlendiricinin arayüzü oluyor. Paketin içindeki hedef IP adresi ise olduğu gibi kalıyor. İki adres, iki ayrı katmanın işi; birbirlerinin yerine geçemezler.
Karar verildikten sonra ilk bakılan yer makinenin kendi ARP tablosu. Tablonun her satırı bir IP adresini bir MAC adresine eşliyor. Yeni açılmış bir makinede bu tablo boştur. Dolduran şey kullanımın kendisi: makine kiminle konuştuysa onun satırı orada durur. Kimse elle yapılandırmıyor.
Mahalle bakkalını düşün. Müşterisinin adını bilir ama kimin hangi kapıda oturduğunu ancak bir kez sorup deftere yazarak öğrenir. Defter ARP tablosu, ad IP adresi, kapı numarası MAC adresi. Benzetme şurada biter: bakkalın defteri sokağın dışına çıkmaz, ARP de kendi alt ağının dışını çözemez.
Yetkili sunucuya kadar giden ad çözme zincirini izlemiştin; burada aynı iş bir kat aşağıda, adresten karta doğru yapılıyor. Ağa yeni katılan bir makine bunu ilk saniyede yaşıyor: DNS sorgusunu taşıyacak çerçeve için yönlendiricinin MAC adresi gerekiyor. İstek, sen farkına varmadan bir soruya bağlı bekliyor.
Neden yayınla soruluyor?
Tabloda kayıt yoksa makine soruyu ağa yayınlıyor. Çerçevenin hedef MAC alanına FF-FF-FF-FF-FF-FF yazılıyor. Sebep sade: sorunun kime gideceği bilinmiyor.
Yayını yerel ağdaki bütün düğümler alıyor. Standart, hedefi tümü bir olan her çerçeveyi her istasyonun alıp işlemesini şart koşuyor. Hedef olmayan cihazlar, örneğin yönlendirici, mesajı dikkate almadan atıyor. Ama atmadan önce almış ve işlemiş oluyorlar.
Ölçek tam burada gizleniyor. Belgeleme için ayrılmış 192.0.2.0/24 bloğunu örnek alalım; içinde 254 kullanılabilir adres var. Tek bir ARP isteği, soranın dışındaki 253 komşunun kartını uyandırıyor. Ağ kartının gelen çerçeveyi halka tampona alıp çekirdeğe taşımasının bir bedeli vardı. O bedel burada 253 kez ödeniyor.
Cevap veren tek bir makine oluyor: istekteki IP adresinin sahibi. Cevap da yayınla dönmüyor, tek bir çerçeveyle geliyor. Asimetri kasıtlı; cevabı yalnızca soranın duyması yeter.
Öğrenme çift yönlü işliyor. Cevabı alan makine eşlemeyi belleğine yazıyor ve bir daha sormuyor. Cevabı veren de soranın adresini kendi tablosuna ekliyor, çünkü ARP paketi soranın kendi IP ve MAC adresini de taşıyor. Soru sorarken kendini de tanıtıyorsun.
Birbirinin yayın çerçevelerini alan düğümlerin tamamına broadcast domain (yayın alanı) deniyor. Yayın yerine çoklu yayın kullanmak daha iyi bir fikirdi; ilk biti bir olan adresler çoklu yayındı ve IPv6’nın adres çözümlemesi tam olarak oraya yaslanıyor. Bu bağırışın nereye kadar gittiğini kasten açık bırakıyorum; sınırını bir sonraki durakta çizeceğiz.
Bir yana: RARP ters yönü çözüyor, MAC adresinden IP adresini öğreniyor. Vekil ARP ise yönlendiricinin başkası adına cevap vermesi; işi yürütüyor ama ağdaki trafiği artırıyor.
Paketin içinde tam olarak ne var?
ARP’ın tanımı 1982 tarihli RFC 826. Yaptığı işin adı adres çözümleme: elindeki IP adresine karşılık gelen MAC adresini bulmak. Belgedeki paket biçimi dokuz alandan oluşuyor: donanım türü, protokol türü, iki adres uzunluğu, işlem kodu ve dört adres alanı.
Uzunluk alanları ilk bakışta fazlalık gibi duruyor. Fazlalık sayılmazlar. MAC adresi 6 bayt, IPv4 adresi 4 bayt ve ARP bu iki uzunluğu ayrı alanlarda ilan ediyor. Yani ARP IPv4’e gömülü bir protokol değil; hangi adres ailesini çözdüğünü paketin kendisi söylüyor.
ar$hrd 2 bayt donanım türü
ar$pro 2 bayt protokol türü
ar$hln 1 bayt donanım adres uzunluğu -> 6
ar$pln 1 bayt protokol adres uzunluğu -> 4
ar$op 2 bayt işlem kodu -> istek 1, cevap 2
ar$sha 6 bayt gönderenin MAC adresi
ar$spa 4 bayt gönderenin IP adresi
ar$tha 6 bayt hedefin MAC adresi
ar$tpa 4 bayt hedefin IP adresi
--------------------------------------------
toplam 28 baytAlanları gerçek değerlerle doldurunca resim netleşiyor. Belgeleme için ayrılmış adresleri kullanayım. Örnek kart adresleri de uydurma sayılmaz; RFC 7042 belgeleme için 00-00-5E-00-53-00 ile 00-00-5E-00-53-FF arasını ayırmış. Soran makine 192.0.2.10, kartının adresi 00-00-5E-00-53-2A, aradığı adres ise 192.0.2.40 olsun. İstekte kendi adres ikilisini gönderen alanlarına yazıyor ve aradığı adresi hedef IP alanına koyuyor. Hedefin MAC adres alanını ise boş bırakıyor. Zaten bilseydi sormazdı.
Cevap da aynı dokuz alanı taşıyor, yalnızca roller yer değiştiriyor. Adresin sahibi kendi kartının adresini gönderen alanına yazıyor ve çerçeveyi doğrudan soranın kartına yolluyor.
istek (op 1) gönderen 192.0.2.10 / 00-00-5E-00-53-2A
hedef 192.0.2.40 / boş
çerçeve hedef MAC FF-FF-FF-FF-FF-FF
cevap (op 2) gönderen 192.0.2.40 / 00-00-5E-00-53-3C
hedef 192.0.2.10 / 00-00-5E-00-53-2A
çerçeve hedef MAC 00-00-5E-00-53-2AEthernet’in veri alanı en az 46 bayt olduğu için araya 18 bayt dolgu giriyor. Bir ARP isteği tel üstünde bu yüzden 64 baytlık asgari çerçeve olarak gidiyor. Sorduğun soru, kablodaki en küçük çerçeve.
Çerçevenin tür alanı 0x0806. Alıcı bu değere bakıp yükü ARP modülüne veriyor. Kapsülleme merdiveninde bu tür alanını zaten görmüş ve değerini not etmiştin. ARP paketi bir bağ katmanı çerçevesinin içinde taşınıyor ama ağ katmanı adreslerini içeriyor; iki katmanın tam sınırına oturuyor.
Gelen paketi alan makine sırayla üç şey soruyor: bu donanım türünü tanıyor muyum, bu protokolü konuşuyor muyum, hedef protokol adresi ben miyim. İşlem koduna en sonda bakılıyor. Üstelik gönderenin adres çifti tabloda zaten varsa, kod okunmadan önce güncelleniyor. Yani kimse sormadan gelen bir cevap da tabloyu tazeliyor.
Tablo ne kadar hatırlıyor?
Kayıtların bir ömrü var. Tipik değer 20 dakika; süre dolunca eşleme unutuluyor. Windows dinamik bir kaydı bellekte 2 dakika tutuyor, o süre içinde yeniden konuşulursa ömür 10 dakikaya çıkıyor. Aynı protokolde ömür on kata kadar fark ediyor. Bu bir ihlal sayılmıyor, çünkü RFC 826 tablo yaşlandırmayı ve zaman aşımını zorunlu kılmıyor.
ARP tablosu bu yüzden alt ağdaki her makineyi içermez. Kimisi tabloya hiç girmemiştir, kimisinin süresi dolmuştur. Bir makine ağdan koptuğunda kaydı kendiliğinden siliniyor. Eşlemeyi elle sabitlemek de mümkün; arp -s bir satırı statik yapıyor.
Şimdi adresini yeni alan bir makineye bak. RFC 5227, bir adresi kullanmadan önce 3 yoklama paketi göndermeyi kurala bağlıyor. Yoklamada gönderen IP alanı sıfır bırakılıyor; amaç, henüz sahiplenilmemiş bir adresle komşuların önbelleğini kirletmemek. Çakışma çıkmazsa makine 2 ilan paketi yolluyor. İlan, gönderen ve hedef IP alanı aynı olan bir ARP isteği. Bedava ARP dediğimiz şey bu. Adresini savunan makine iki savunma arasında en az 10 saniye bekliyor; iki çakışan makinenin ağı doldurmasını engelleyen sınır bu.
Aynı kural kötüye de kullanılıyor. Sahte bir cevap komşunun satırını sessizce değiştiriyor ve trafik saldırganın kartına akıyor; adı ARP zehirlemesi. Resolver’ın önbelleğine sahte kayıt yerleştiren ve orayı yaşam süresi boyunca elinde tutan bir saldırı vardı. Buradaki numara aynı fikrin bir kat aşağıdaki hâli. Ortaya çıkan sonuç, adını Diffie-Hellman anlatırken koyduğumuz ortadaki adam saldırısı — bu kez yerel ağın içinde. Anahtar üstündeki dinamik ARP denetimi, MAC adresi ile IP eşleşmelerini karşılaştırıp bunu kesiyor.
Bunların hepsini kendi makinende görebilirsin. Windows’ta tablo arp -a ile geliyor, Cisco yönlendiricide karşılığı show arp oluyor. Çıktının biçimi de öğretici. Her satırda bir IP adresi, karşısında bir MAC adresi ve kaydın türü duruyor.
Arayüz: 192.0.2.10 --- 0x5
Internet Adresi Fiziksel Adres Tür
192.0.2.1 00-00-5e-00-53-01 dinamik
192.0.2.40 00-00-5e-00-53-3c dinamikListedeki ilk satır neredeyse her makinede aynı işi görüyor: geçidin kaydı. Dinamik kayıtlar zamanla silinir, statik olanlar sen silene kadar durur. En hızlı deney de burada: bir satırı arp -d ile düşür, sonra o adrese tek bir paket yolla. Tablo kendini yeniden dolduruyor ve aradaki soruyu kimse sana sormuyor.
Gösterim filtresiyle trafiği ayıklamayı öğrenmiştin; arp.opcode == 1 istekleri, arp.opcode == 2 cevapları getiriyor. Aynı adresi iki farklı kartın sahiplendiği anı ise arp.duplicate-address-detected yakalıyor.
Peki kimse cevap vermezse? Gönderen isteği tekrarlıyor, sonunda paketleri düşürüyor. Sessizlik görünür bir hataya dönüşüyor: yönlendirici kaynağa ICMP Hedef Bilgisayara Ulaşılamıyor mesajı gönderiyor.
Özet
Peki, ne öğrendik?
- ARP tek bir soruyu çözüyor: elindeki IP adresinin hangi MAC adresine ait olduğunu bulur, ve bunu yalnızca kendi alt ağının içinde yapabilir.
- Soru yayınla gidiyor, cevap tekil dönüyor: isteği bütün komşular alıp işler, cevabı ise yalnızca adresin sahibi verir.
- Öğrenilen eşleme saklanıyor: tablo kullanıldıkça dolar, kayıtların ömrü dolunca silinir, ve bu süreyi RFC 826 zorunlu kılmaz.
- Gelen her mesaj göndereni tazeliyor: bedava ARP de bu kurala yaslanır, ARP zehirlemesi de.
Soruyu sordun, cevabı aldın, eşlemeyi tabloya yazdın. İsteğin hâlâ sırada bekliyor. Bağırdın ve herkes duydu; peki “herkes” tam olarak kim?
Bölüm 24: Anahtarlama ve Ortam Erişimi
ARP isteği bütün ağa bağırıldığında o çerçeveyi gerçekten herkes duyuyordu. Duyanların sınırını kimin çizdiğini söylemedim.
Sınırı bir kural çizmiyor. Kablonun öbür ucundaki kutu çiziyor. Peki o kutu hangi çerçeveyi nereye göndereceğini nereden biliyor?
Tabloyu kim yazıyor?
Anahtar bir bağ katmanı cihazı ve hiç de edilgen bir kutu değil. Çerçeveyi alıyor, saklıyor, sonra iletiyor; kararını verirken de çerçevenin başına bakıyor.
Makinen çerçeveyi anahtara adreslemiyor; karşı makinenin fabrika adresini yazıyor ve arada bir cihaz durduğundan haberi bile olmuyor. Anahtar ağın görünmez elemanıdır.
Görünmez olduğu kadar da bakımsızdır. Kutuyu prize takar, kabloları geçirir, işine dönersin. Tablosunu kendi doldurur; hiçbir yönetici tek satır yapılandırmaz.
O tablonun her satırı üç alan taşıyor: bir MAC adresi, o adrese ulaşan arayüz ve kaydın zaman damgası. Standart metnindeki adı iletme veritabanı, sahadaki adı MAC adres tablosu.
Asıl numara satırın nereden geldiğinde. Anahtar hedef adresten hiçbir şey öğrenmez, kaynak adresten öğrenir. Gelen çerçevenin göndericisini alır, çerçevenin girdiği port numarasıyla eşler ve tabloya yazar. Konuşan herkes konuştuğu anda yerini ele veriyor.
Bunun için her port karışık modda çalışır. Yakalama arayüzünü açarken kartı bu moda almıştın; anahtarın portları zaten hep öyle durur. Kendisine gelmeyen çerçeveleri de alır, çünkü öğrenmesi gereken tam olarak onlardır. Kural çerçevenin başlığındaki kaynak adres; bazı anahtarlar bunun üstüne bir ARP çerçevesinin veri alanında duran adresi de okuyup tabloya ekler.
Mahalle bakkalı defterini nasıl tutuyorsa anahtar da tablosunu öyle tutuyor. Benzetme burada bir adım öteye gidiyor: bakkal sorup öğreniyordu, anahtar sormuyor bile.
Ölçek de dikkat ister. Adres alanı 48 bit, yani iki üzeri kırk sekiz kadar olası ad var. Bir anahtarın tablosu ise birkaç bin satır. Anahtar adres uzayını tutmuyor, yalnızca duyduklarını tutuyor.
Hedefi tanımıyorsa ne oluyor?
Çerçeve içeri girdiğinde sıra sabit: kaynak kaydı önce, hedef araması sonra. Aramanın üç sonucu var ve üçü de ayrı bir davranış üretiyor.
Hedef, çerçevenin geldiği portta görünüyorsa anahtar çerçeveyi hiç iletmez. Düşürür. İki makine aynı kabloda oturuyorsa birbirlerini zaten duymuşlardır; bu davranışın adı filtreleme.
Hedefin yeri biliniyorsa çerçeve tek bir kablodan çıkar. Ağın geri kalanı o trafiği hiç görmez. Anahtarın bütün değeri bu cümlede.
Hedef tabloda yoksa anahtar bilmediğini itiraf eder. Çerçeveyi geldiği port dışındaki bütün portlardan kopyalar. Bu davranışın adı flooding (taşkın). Kopya gönderene geri verilmez; kimse kendi çerçevesini geri almaz.
Bilinmeyen makine cevap verdiği anda çerçevesi anahtara girer, anahtar onun portunu öğrenir ve o adrese bir daha flooding (taşkın) yapmaz. Bilgisizlik tek bir çerçeve boyunca sürüyor.
Tablonun ilk çerçeveden başlayarak nasıl dolduğunu izleyelim:
- Önce gönderen yazılıyor. C çerçevesini 3. porttan veriyor. Anahtar hedefe bakmadan önce kaynak adresi alıp geldiği port numarasıyla eşliyor ve tablonun ilk satırını kendi yazıyor.
- Hedef tabloda yok. Sıra aramaya geliyor. Aranan adres tabloda karşılık bulmuyor, çünkü o makine henüz tek bir çerçeve göndermedi; anahtar duymadığı kimseyi tanımıyor.
- Taşkın başlıyor. Çerçeve, geldiği port dışındaki bütün portlardan kopyalanıyor. Dört kablodan çıkıyor ve yalnızca biri hedefe varıyor. Gönderene geri verilmiyor.
- Cevap kayda dönüşüyor. E cevabını 5. porttan veriyor. Aynı kural yine işliyor: kaynak adres tabloya yazılıyor ve anahtar artık o adresin hangi kabloda olduğunu biliyor.
- Artık tek kablo yetiyor. Aynı hedefe giden sonraki çerçeve yalnızca 5. porttan çıkıyor. Öbür kablolar o trafiği hiç görmüyor ve o adres için bir daha taşkın yapılmıyor.
Bir çerçeve türü bu kuralın dışında kalıyor. Tümü bir olan FF-FF-FF-FF-FF-FF dizisi yayın adresiydi; o adrese giden çerçeve, tablo ne kadar dolu olursa olsun bütün portlarda kopyalanır. Anahtar yayını kesmez. ARP, anahtarın ardında da bağırarak çalışmayı sürdürür.
Kasten açık bıraktığım broadcast domain sınırının cevabı tam olarak burada duruyor. Ağda yalnızca hub, köprü ve anahtar varsa ortaya tek bir broadcast domain çıkıyor. O duvarı ancak yönlendirici örüyor.
Kayıtların bir de ömrü var. Bir adresten belli bir süre çerçeve gelmezse satır silinir; bu süreye yaşlanma süresi deniyor ve tipik değeri 5 dakika, yani 300 saniye. Süre ayarlanabiliyor, ders kitabı örneklerinde 60 dakikalık anahtarlar da geçiyor. Tabloya üç tür kayıt giriyor: dinamik, sürekli ve sınırlı statik. Dinamik olanlar kullanılmayınca silinir, kalan ikisi elle kaldırılır.
Bir anahtarın konsoluna girersen tabloyu tek komutla görebilirsin:
Switch# show mac-address-table
MAC adresi Port Tür
00-00-5e-00-53-1c 3 dinamik
00-00-5e-00-53-7b 5 dinamik
00-00-5e-00-53-a4 1 sürekliAnahtar ağı neye böldü?
Anahtara giden her kablo kendi başına bir collision domain (çarpışma alanı). Bağlantı tam çift yönlü çalışıyor ve o kabloda çarpışma olmuyor. 24 portlu bir anahtar 24 collision domain ve tek broadcast domain demek.
Yerini aldığı cihaza bakınca fark keskinleşiyor. Hub bir porttan aldığı sinyali, o port hariç bütün portlara güçlendirerek kopyalar. Tablosu yoktur, kararı yoktur, seçeneği yoktur. 24 portlu bir hub’da tek çerçeve 23 gereksiz kopya üretir ve kutunun tamamı tek kocaman collision domain’e dönüşür.
Aynı çerçeve öğrenmiş bir anahtarda portların yalnızca %4,2’sini meşgul ediyor. Kalan yirmi üç kablo aynı anda başka konuşmalar taşıyor.
Tek bir kanalı paylaşmanın üç ailesi
Paylaşılan kabloda çözülmesi gereken problem tek cümleyle yazılıyor: N düğüm, tek bir kanal, ve aynı anda konuşan iki düğümün mesajı da bozuluyor. Sıra kimde? Yarım yüzyıllık literatür buna üç ayrı aile hâlinde cevap veriyor.
Kanalı bölmek. Kanalı baştan paylara ayırıp her düğüme kendi payını vermek. Zamanda bölersen TDMA, frekansta bölersen FDMA olur; çoklamaya indiğimizde ikisini de ayrıntısıyla göreceğiz. Adil ve çarpışmasız; ama bir düğümün payı, o düğüm susarken de kimseye açılmıyor. Tek bir düğüm konuşuyorsa kanalın 1/N’ini kullanabiliyor.
Rastgele erişim. Payı baştan dağıtma, isteyen istediği anda konuşsun; çarpışma olursa sonrasını kurala bağla. Az yükte muhteşem — tek konuşan kanalın tamamını alıyor. Yük arttıkça çarpışmalar çoğalıyor ve verim çöküyor.
Sıra alma. Bir düzenleyici sırayı dağıtsın (yoklama), ya da konuşma hakkı bir jeton gibi düğümden düğüme dolaşsın (jeton geçirme). İki ailenin iyi yanlarını birleştiriyor, karşılığında bir düzenleyiciye ya da dolaşan bir jetona bağımlı hâle geliyor. Halka topolojisini konuşurken ikincisini göreceğiz.
Ethernet ikinci aileden ve o ailenin tarihi tek bir soyağacı çiziyor.
ALOHA’dan CSMA/CD’ye: her adım bir kayıp kapatıyor
ALOHA, 1970’te Hawaii’de doğdu: verin varsa gönder, çarpışırsa rastgele bekleyip yeniden dene. Dinleme yok, kontrol yok. Analizi klasiktir ve verimi 1/(2e), yani yaklaşık %18. Kanalın beşte dördü boşa gidiyor.
Dilimli ALOHA tek bir kural ekliyor: gönderime ancak dilim sınırında başla. Böylece iki çerçeve ya tam çakışıyor ya hiç çakışmıyor; kısmi çakışmanın yarattığı israf kalkıyor. Verim 1/e, yani yaklaşık %37. Tek bir senkronizasyon kuralı verimi ikiye katlıyor.
CSMA bir adım daha atıyor: konuşmadan önce dinle. İnsan sohbetinin kuralı. Yine de çarpışma bitmiyor, çünkü sinyalin kabloda yol alması zaman alıyor: uzaktaki bir düğüm konuşmaya başlamış olabilir ve sen henüz duymamış olabilirsin. Çarpışma penceresi, iki uç arasındaki yayılım gecikmesi kadar.
CSMA/CD son adımı atıyor: konuşurken de dinle. Çarpışmayı fark ettiğin anda sus. ALOHA bütün çerçeveyi boşa gönderirken, CSMA/CD birkaç mikrosaniye sonra kesiyor.
Paylaşılan kablonun kuralı bu sonuncusuydu ve dört adımda yürüyordu: hattı dinle, boşsa gönder, gönderirken sezmeye devam et, başka bir iletim duyarsan kes. Kesen kart bir karıştırma sinyali yolluyor, sonra ikili üstel geri çekilmeye giriyor: rastgele bir süre bekleyip yeniden deniyor. Algoritma 1.024 ayrı geri çekilme süresi ayırt ediyor ve kart bir çerçeveden ancak 16 ardışık çarpışmadan sonra vazgeçiyor.
64 baytlık asgari çerçeve nereden çıktı?
Kitap boyunca Ethernet’in en küçük çerçevesini 64 bayt diye kullandık ve bu sayıyı hiç gerekçelendirmedim. Gerekçesi tam olarak burada, çarpışma sezmede.
Bir kartın çarpışmayı fark edebilmesi için, çarpışma haberi kendisine döndüğünde hâlâ gönderiyor olması gerekiyor. Aksi hâlde çerçeveyi bitirip işine döner, çarpışmadan hiç haberi olmaz ve veri sessizce kaybolur. Şart bu yüzden zamansal:
gönderim süresi ≥ 2 × en uzak iki düğüm arasındaki yayılım gecikmesiSağdaki değere dilim süresi deniyor. 10 Mbit/s’lik klasik Ethernet’te, tekrarlayıcılar dahil azami 2.500 metrelik bir ağ için bu süre 51,2 µs olarak sabitlendi. Şimdi soldaki tarafa çevir:
10.000.000 bit/s × 51,2 µs = 512 bit = 64 baytİşte o kadar. Asgari çerçeve boyu bir veri kararı değil, ışığın kabloda ne kadar yavaş gittiğinin sonucu. Kırk baytlık bir onay paketi niçin dolguyla 64 bayta tamamlanıyordu? Sebebi kırk yıl önceki bir kablonun uzunluğu.
Geri çekilmedeki 1.024 sayısı da aynı yerden geliyor: bekleme süresi dilim süresinin katları cinsinden ölçülüyor ve 2^10 en fazla kaç dilim beklenebileceğini söylüyor.
Sayı hızla birlikte büyümek zorundaydı, çünkü hız artınca aynı 512 bit çok daha kısa sürede çıkıyor. 100 Mbit/s’te mesafe kısaltılarak çözüldü; 1 Gbit/s’te ise başka bir çare bulundu — çerçevenin arkasına, çarpışma penceresi dolana kadar anlamsız bit eklemek. Yöntemin adı taşıyıcı uzatma ve tam çift yönlü kip yaygınlaşınca kimse kullanmadı.
Tam çift yönlü kip geldiğinde bu kuralın dayanağı kalmadı. Aynı kabloda çarpışma diye bir olay olmayınca CSMA/CD standartta durmayı sürdürdü ama fiilen devre dışı kaldı.
DerinleşmeHub neden öldü, ve öldüğü gün çarpışmaya ne oldu?
Ethernet 1973’te Xerox PARC’ta doğdu. Robert Metcalfe ve David Boggs koaksiyel kablo üzerinde önce 2,94 Mbit/s, sonra 10 Mbit/s taşıdılar. O kabloya bağlı bütün düğümler tek bir collision domain’deydi, çünkü ortam gerçekten paylaşılıyordu. Hub o dünyanın cihazıydı ve kendi başına hiçbir suç işlemiyordu.
Çarpışmanın bir arıza sayılmaması da buradan geliyor. Yarım çift yönlü paylaşımlı bir kanalda iki kartın aynı anda konuşması beklenen bir olaydı; tasarımın yaptığı tek şey sonrasını kurala bağlamaktı. Geri çekilme aralığının 1.024 ayrı değere bölünmesi bile o dünyanın ölçüsünü taşıyor: tekrarlayıcıyla bağlanmış çok segmentli bir yerel ağın azami istasyon sayısı da aynı sebeple 1.024.
Koşul, kart aynı anda hem gönderip hem alabilir hâle gelince ortadan kalktı. 10 Mbit/s’lik bir hattın kullanılabilir bandı 20 Mbit/s’ye çıktı ve hub’ın rekabet edecek bir tarafı kalmadı.
Anahtar ile hub arasındaki farkın altında özel donanım var. Anahtar çerçeveyi genel amaçlı bir işlemcide değil, ASIC denen özel bir yongada yönlendiriyor; gecikmenin mikrosaniyeyle ölçülmesinin sebebi bu. Yongaya çerçevenin ne kadarını okutacağın ise bir tercih. Sakla-ve-ilet tamamını alıp CRC’sini denetler, kes-ve-ilet yalnızca hedef adresi okuyup yola koyulur, parçasız iletme (fragment-free) ilk 64 baytı bekler.
Küçük bir ev anahtarının veri sayfası bu tercihleri sayıya çeviriyor. MAC adres veritabanı 4.000 giriş, toplam paket tamponu 128 KB. İç gecikme 10 Mbit/s portta 30 µs, 100 Mbit/s portta 6 µs, 1000 Mbit/s portta 4 µs. Port başına iletme hızı da sırasıyla 14.800, 148.800 ve 1.480.000 paket.
Ortadaki sayı tesadüf değil. En küçük çerçeve telde 84 bayt, yani 672 bit yer kaplıyordu; aynı kanal maliyeti 100 Mbit/s’de saniyede 148.809 çerçeve veriyor. Veri sayfasındaki 148.800 tam bu sayı.
Bütün portlar aynı anda tam yüklenirse iç elektronik yetişemeyip çerçeve düşürebilir; buna bloklama, yetişebilene bloklamayan anahtar deniyor.
Flooding (taşkın) ne zaman kusura dönüşür?
Tablonun bir sınırı olduğunu söylemiştim; saldırgan da bunu biliyor. Anahtar zehirleme saldırısı sahte kaynak adresli çok sayıda çerçeveyle tabloyu doldurur, gerçek adreslere yer bırakmaz. O noktadan sonra anahtar her şeyi flooding’e (taşkına) verir. Anahtarlı ağda dinleme zorlaşıyor ama bitmiyor. Tabloda kaydı olmayan hedefler ile yayın çerçeveleri hâlâ herkese ulaşıyor.
Savunması port güvenliği. Bir porta kaç MAC adresinin ilişkilendirilebileceğini sınırlarsın; sınır aşılınca port askıya alınır, gelen veri yok sayılır ya da port tümden kapatılır.
İkinci tuzak kabloda. İki anahtar arasına yedek olsun diye ikinci bir bağlantı çekmek makul bir fikir gibi durur. Sonucu döngü yolu oluyor. Döngüye giren çerçeve sonsuza dek dolaşır, trafik hattın azami hızına tırmanır ve ağ doyar.
Kapalı bir makineye yollanan tek bir çerçeve bunu başlatmaya yetiyor. Adres hiçbir anahtarın tablosunda karşılık bulmaz, her anahtar onu flooding’le (taşkınla) çoğaltır ve döngü varsa kopyalar birikmeye başlar.
IEEE 802.1D bu yüzden Spanning Tree Protocol’ü (yayılan ağaç protokolü) tanımlıyor. Yedekli bağlantılar fiziksel olarak yerinde durur ama bazı portlar bloklanır, geriye tek bir etkin yol kalır. Köprüler birbirlerine BPDU adı verilen küçük mesajlar yolluyor; kimliği en küçük olan kök köprü seçiliyor. Kimlik, varsayılanı 32.768 olan öncelik değeri ile cihazın MAC adresinin birleşimi.
Bir port beş durumdan birinde bulunur: bloklama, dinleme, öğrenme, gönderme, kapama. Özgün protokolde dinleme ve öğrenme 30 saniye sürüyordu; bir kablo koptuğunda ağın kendine gelmesi yarım dakikayı buluyordu. Hızlı sürümü 2 saniyede bir BPDU yollayarak topolojiyi izliyor, yol koptuğunda bloklu portu açıyor.
Buraya kadar ayrı ayrı gördüğün şeyler tek bir arayüz çıktısında yan yana duruyor. MTU paketin üst sınırını çiziyordu; anahtarın portunda o sınır da, spanning tree durumu da, flooding (taşkın) anahtarı da ayrı birer satır:
Switch# show interface fastethernet 0/2
MTU 1500 bayt
Spanning tree durumu: gönderme
Bilinmeyen tekli yayın flooding'i: açıkÖzet
Peki, ne öğrendik?
- Anahtar kendi öğreniyor: tablosunu kaynak adreslerden kurar, tak-çalıştır çalışır, ve her satırında bir adres, bir arayüz, bir zaman damgası tutar.
- Üç karar veriyor: hedef aynı porttaysa çerçeveyi düşürür, yeri biliniyorsa tek kablodan yollar, bilinmiyorsa bütün portlara kopyalar.
- Flooding (taşkın) bilgisizliğin bedeli: yalnızca bir çerçeve sürer, ama yayın adresine giden çerçevelerde hiç bitmez.
- Anahtar çarpışmayı böler, yayını bölmez: port sayısı kadar collision domain üretir ve hepsini tek bir broadcast domain’in içinde bırakır.
- Ethernet rastgele erişim ailesinden gelir: ALOHA %18, dilimli ALOHA %37 verim verirken CSMA dinlemeyi, CSMA/CD ise konuşurken dinlemeyi ekledi; her adım bir israfı kapattı.
- 64 bayt bir veri kararı değil: çarpışmayı sezebilmek için çerçevenin, haberi geri dönene kadar sürmesi gerekiyordu ve 10 Mbit/s × 51,2 µs tam olarak 512 bit eder.
- Yedeklilik denetimsiz kurulmuyor: ikinci bir kablo döngü demektir ve Spanning Tree Protocol (yayılan ağaç protokolü) protokolü olmadan ağ kendi kopyalarında boğulur.
Anahtar artık kimin hangi kabloda olduğunu biliyor ve ağı senin adına parçalara ayırdı. Ama o kabloları kimse rastgele çekmedi. Binadaki her prizin bu kutuya nasıl ulaştığının bir düzeni var; peki o düzenin adı ne?
Bölüm 25: Ağ Topolojileri
Anahtarın portundan çıkan kabloyu eline al ve takip et. Kablo tavana çıkıyor, koridoru geçiyor, bir dolapta bitiyor. Binada döşenmiş hiçbir kablo oraya rastgele gitmiyor.
Her prizin anahtara nasıl bağlandığının bir adı, bir ölçüsü ve bir üst sınırı var. O sınırı kim koydu?
Kabloların dizilişi sinyalin yolunu vermiyor
Topoloji dediğinde aslında iki ayrı soruyu birden soruyorsun. Fiziksel topoloji kabloların nasıl döşendiğini anlatıyor ve fiziksel katmana düşüyor. Mantıksal topoloji sinyalin hangi yoldan aktığını anlatıyor; onun yeri bağ katmanı. Katmanlı mimaride bir katmanın diğerine ne vaat ettiği ayrı bir şeydi; aynı ayrım burada kabloyla sinyalin arasına düşüyor.
Bir ağın iki topolojisinin birbirine benzemesi diye bir zorunluluk yok, ve bu ilk bakışta şaşırtıcı geliyor. Kablolar yıldız gibi dizilmiş bir ağ, sinyal akışı bakımından halka ya da ortak yol gibi işleyebiliyor. 10BaseT tam olarak böyle: kablolama yıldız, akış veri yolu. Düzenin adı da ikisinden geliyor, star-bus.
Mantıksal tarafta karşına iki kalıp çıkıyor. Yayın topolojisinde gönderen sinyali ortama bırakıyor ve ilk gelen ilk hizmeti alıyor. Jetonlu geçişte iletme hakkı istasyonlar arasında dolaşan bir jetonla veriliyor. Ortamı kimin, ne zaman kullanacağını bu kalıp belirliyor.
Fiziksel tarafta klasik liste altı başlık: veri yolu, halka, yıldız, genişletilmiş yıldız, ağaç ve örgü. Altısını da eşit ağırlıkta öğrenmene gerek yok — ikisi tarihe karıştı, biri her yeri kapladı. Hangisinin kazandığını bugün masanın altına bakarak görebilirsin.
Ağı adlandıran ikinci ölçü: menzil
Şekil ağın nasıl kurulduğunu söylüyor. İkinci bir ölçü daha var ve o da ağın ne kadar uzağa yayıldığını söylüyor. Sahada duyduğun kısaltmaların çoğu bu ikinci ölçüden geliyor.
| kısaltma | açılımı | tipik menzil | örnek |
|---|---|---|---|
| PAN | kişisel alan ağı | birkaç metre | kulaklık, akıllı saat, kablosuz klavye |
| LAN | yerel alan ağı | oda, kat, bina | ofis anahtarı, ev kablosuz ağı |
| CAN | yerleşke ağı | komşu birkaç bina | üniversite kampüsü, hastane yerleşkesi |
| MAN | metropol alan ağı | bir şehir | operatörün şehir halkası, kablo şebekesi |
| WAN | geniş alan ağı | şehirler, ülkeler | kiralık hat, operatör omurgası |
Tablonun ikinci sütunu kabaca doğru ama yanıltıcı. Sınırı çizen şey mesafe değil, sahiplik. Yerel ağda kabloyu sen döşüyorsun ve bir kez döşendikten sonra o kablodan ne kadar veri geçirdiğin kimseyi ilgilendirmiyor; kimse sana fatura kesmiyor. Geniş alan ağında ise hattı kiralıyorsun ve bant genişliği aylık bir faturaya dönüşüyor.
Bu tek fark, ağ tasarımının neredeyse tamamını açıklıyor. Yerel ağda bant genişliği bedava olduğu için israf edilebilir; sıkıştırmadan gönderirsin, yedeklemeyi gece yaparsın, gerekirse kabloyu bir üst kategoriyle değiştirirsin. Geniş alanda ise her bit para olduğu için sıkıştırmayı, önbelleklemeyi ve trafik önceliklendirmeyi mecburen kullanıyorsun. Yerel ağ hızlarının geniş alan hızlarını onlarca yıldır önde götürmesinin sebebi teknoloji değil, bu maliyet farkıdır.
Bir de bu eksene sığmayan bir tane var: depolama alanı ağı. Onu menzille değil taşıdığı yükle tanımlıyorsun; sunucuları disk dizilerine bağlıyor. Aynı odada duruyor ama yerel ağdan ayrı tutuluyor, çünkü disk trafiğinin gecikme toleransı ağ trafiğininkinden çok daha düşük.
Tek kabloya asılmak neden bitti?
Veri yolu topolojisinde bütün cihazları tek bir kabloya asıyorsun. O kabloya segment, omurga ya da trunk deniyor. Sinyal kendi başına hattın iki ucuna doğru ilerliyor. Üstünden geçtiği her istasyon adrese bakıyor ve kendisine değilse sinyali bırakıyor. Kart hedef adrese bakıyor, kendisine değilse gerisini okumadan atıyordu.
Kurulumu koaksiyel kabloyla yapıyordun. Her istasyona bir T-konnektör takılıyor, hattın ilk ve son ucuna sonlandırıcı bağlanıyordu. Sonlandırıcı dediğimiz şey, içinde 50 ohm’luk direnç bulunan bir BNC konnektör; takmayı unutursan ağ hiç çalışmıyordu.

Kırılganlığı kablonun kendisinde arayacaksın. Ana kablodaki tek bir kopma ağı ikiye bölüyor; parçalar kendi içinde konuşmayı sürdürüyor ama aralarındaki iletişim bitiyor. Arızanın yerini bulmak da kolay olmuyor.
Sınırlar da serttir. İnce koaksiyelle bir segmenti en çok 185 metre, kalın koaksiyelle 500 metre uzatabiliyordun. İnce koaksiyelde bir segmente en çok 30 istasyon bağlanıyor ve iki istasyon arasında en az 0,5 metre bırakılıyordu. Kalın koaksiyelde bir segment 100’den fazla cihaz taşımıyor, cihazlar da kabloya 2,5 metrenin katı olan noktalardan takılıyordu. Tekrarlayıcı, sinyali güçlendirip ileten birinci katman cihazı. Onlarla toplam menzil 2.500 metreye, kullanıcı sayısı 1.024’e çıkabiliyordu.
Adların kendisinde de bir şablon göreceksin.
10 Base 5
| | +-- segment menzili, yaklaşık 500 metre
| +------- temel bant sinyalleşme
+----------- 10 Mbit/s10Base2’deki 2 ise 185 metreyi anlatıyor; yuvarlama cömert davranmış. Kalın koaksiyel kablo yaklaşık 1 cm kalınlığında ve sert olduğu için döşenmesi zordu. Sarı kılıfı yüzünden ona sarı Ethernet deniyordu.
Neden her şekil yıldıza döndü?
Halka topolojisinde veri, hedefine varana kadar her cihazdan geçiyor ve her cihaz sinyali güçlendirip bir sonrakine veriyor. Zayıflamanın bu yüzden en düşük düzeyde kaldığını göreceksin.
Söz sırası 3 baytlık bir jetonla dağıtılıyor. Jeton boştaysa veri ve hedef adres jetona yüklenip halkaya bırakılıyor. Jetonu olmayan cihaz konuşamıyor.
Asıl sürprizi kablolamada bulacaksın. Halka çalışırken halka gibi görünüyor ama kablolama fiilen yıldız: cihazlar merkezdeki MAU kutusuna bağlanıyor ve halka o kutunun içinde kuruluyor. IBM’in MSAU’sunda 10 bağlantı çıkışı vardı ve kutu, arızalanan istasyonu halkadan çıkarıp devreyi kapatıyordu. Ölçeği de fena değildi: UTP ile 72, STP ile 260 istasyona kadar çıkıyordu.

Token Ring IEEE 802.5 olarak standartlaştı ve 4 ya da 16 Mbit/s çalışıyordu. Halkanın hızını üstündeki en yavaş cihaz belirliyordu. Donanımı Ethernet’ten kat kat pahalı olduğu için yayılamadı.
Yıldızda her cihaz merkezdeki hub ya da anahtara kendi kablosuyla bağlanıyor. Bir cihazın merkeze uzaklığı en çok 100 metre olabiliyor. Bir bağlantının durumu da merkezdeki port ışığından okunuyor.
Arıza davranışı da veri yolunun tam tersine çalışıyor: uçtaki bir arıza yalnızca o ucu düşürüyor. Merkezdeki cihazın arızası ise tüm ağı durduruyor. Kırılganlık ortadan kalkmadı, tek noktada toplandı.
Bedeli kablo. Veri yoluna göre çok daha fazla kablo çekiliyor ve üstüne merkez cihazın maliyeti biniyor. Karşılığında kurulum, büyütme ve arıza bulma kolaylaşıyor. Hub’ın kendisi çok portlu bir tekrarlayıcı; kopyalama davranışını ve yerini anahtara neden bıraktığını biliyorsun. Bir ARP isteği bütün komşuların kartını uyandırıyordu; hub o uyandırmayı elektrik düzeyinde yapıyor. Yıldızı yayan şey bu ucuz kutu oldu.
Örgü topolojide bağlantı sayısı n(n-1)/2 ile büyüyor. 12 uçlu bir ağ 66 kablo istiyor; aynı 12 uç yıldızda 12 kabloyla bağlanıyor. Fark 5,5 kat. Karşılığı yedeklilik: bir bağlantı koptuğunda sinyal hedefine başka bir yoldan ulaşıyor. Örgü bu yüzden çoğunlukla geniş alan ağlarında kullanılıyor.
Ağaç topoloji veri yolu ile yıldızın birleşimi. Yıldız kümeleri bir omurga üstüne diziliyor ve tepede kök görevi gören bir cihaz duruyor. Bir segmentteki sorun diğerlerine bulaşmıyor ama omurgadaki arıza yine tüm ağı etkiliyor. Genişletilmiş yıldız ise küçük yıldızların yine yıldız biçiminde birbirine bağlanması. Bina kablolamasının gerçek şekli bu.
DerinleşmeBeş-dört-üç kuralı neydi, ve neden tam olarak bu sayılardı?
Tekrarlayıcı hub’ın tek hatlı atası: bir girişi ve bir çıkışı var. Bakırın yüz metrede biten menzilinden öteye gitmek isteyen ağ araya bir tekrarlayıcı koymak zorundaydı.
Sinyali sonsuza kadar tazeleyemezsin. Her tekrarlayıcı yola bir gecikme ekliyor ve uçtaki iki istasyonun birbirini zamanında duyması gerekiyor. Kural buradan çıktı: bir uçtan diğerine giden sinyal en çok 5 segment ve 4 tekrarlayıcı geçebilir, bu segmentlerin en çok 3’ünde bilgisayar bulunabilir.
Üçüncü sayı bir ayrım gerektiriyor. Üstünde en az bir bilgisayar olan kabloya dolu segment deniyor. Yalnızca iki segmenti birleştiren, üstünde hiç bilgisayar olmayan kabloya ise bağlantı segmenti deniyor. Kural fiilen şunu söylüyor: beş segmentin ikisi yalnızca mesafe uzatmak için var olacak. Üçüncü sayı 10BaseT’ye geçilirken kendiliğinden gevşedi, çünkü orada her segmentin ucunda tek bir kullanıcı duruyor.
Sayılar menzili de veriyor: 10Base5’in 2.500 metresi, art arda eklenmiş beş adet 500 metrelik segmentin toplamı.
Numaraların ardındaki aile
Kitap boyunca 802 ile başlayan numaralar görüyorsun ve hepsi aynı yerden geliyor. IEEE’nin 802 numaralı komitesi yerel ve metropol alan ağlarının standartlarını yazıyor; her alt numara ayrı bir çalışma grubu.
| grup | konusu | bugünkü durumu |
|---|---|---|
| 802.1 | köprüleme, VLAN, ağaç protokolleri, port tabanlı kimlik doğrulama | canlı |
| 802.2 | mantıksal bağ denetimi | donduruldu |
| 802.3 | Ethernet | canlı; ailenin en kalabalık grubu |
| 802.4 | jetonlu veri yolu | kapandı |
| 802.5 | Token Ring | kapandı |
| 802.11 | kablosuz yerel ağ | canlı |
| 802.15 | kişisel alan ağı; Bluetooth ve düşük güçlü telsizler | canlı |
| 802.16 | kablosuz geniş bant erişim | kapandı |
Sahada bu numaraların kendisinden çok harfli uzantıları konuşuluyor, ve o harfler tek tek bir özellik anlatıyor: 802.1Q sanal ağ etiketi, 802.1X porta bağlanan cihazın kimlik doğrulaması, 802.1D ile ardılları döngü engelleme, 802.3af ve devamı kablodan güç besleme, 802.11’in harf dizisi de kablosuzun kuşakları.
İki şeye dikkat. Birincisi, bütün aile yalnızca iki katmanda yaşıyor: fiziksel ve bağ. 802 numarası bir teknolojiyi söyler, bir katmanı değil; hepsinin üstünde aynı IP çalışır. İkincisi, 802.2’nin ayrı bir numarası olması bir tasarım kararının izi. IEEE bağ katmanını ikiye böldü: alttaki yarı her teknolojide farklı, üstteki yarı hepsinde ortak olsun istedi. Ortak yarı beklenen ilgiyi görmedi ve Ethernet’te fiilen atlandı — ama bölünmenin kendisi, aynı üst katmanın onlarca farklı alt teknolojinin üstünde çalışabilmesinin sebebi.
Yüz metre nereden çıkıyor?
Structured cabling (yapısal kablolama), taşıma-ekleme-değiştirme döngüsünü ucuzlatmak için tasarlanıyor. Aynı altyapı masaüstünden IP telefona, kablosuz access point’e kadar her cihazı taşımak zorunda. Plansız büyümüş bir kablolama ise günün saatine ve trafiğe göre gelip giden arızalar üretiyor. Hatayı bulmak kabloyu ucundan ucuna takip etmek demek.
İki büyük standart var. Amerika’da ANSI/TIA-568 ailesi duruyor: C.0 genel kablolama, C.1 ticari bina, C.2 bakır twisted pair, C.3 fiber. Uluslararası düzeyde aynı işi ISO/IEC 11801 görüyor. TIA bileşeni kategori ile derecelendiriyor, ISO kanalı sınıf ile.
Standardın adlandırdığı altı parça var: bina giriş odası, ekipman odası, bina omurga kablolaması, telekomünikasyon odası, yatay kablolama ve iş alanı. Telekomünikasyon odasının sahadaki gündelik adı ise kat dolabı. Yatay kablolama o dolaptan iş alanındaki duvar prizine uzanıyor; parçaları priz, aradaki sabit kablo, dolaptaki patch panel ve panelle anahtar arasındaki patch kabloları.
Şimdi bütçe. Bakır twisted pair’in uçtan uca güvenle taşıdığı yol 100 metrede kesiliyor ve standardın işi o 100 metreyi paylaştırmak. Sabit kablo, standardın adıyla temel bağlantı, en çok 90 metre olabiliyor. Kalan 10 metre patch kablolarının payı: kat dolabındaki ekipman ve patch kabloları 6 metreyi, prizden bilgisayara giden patch kablosu 3 metreyi geçmemeli.
duvar prizi -> bilgisayar 3 m
kat dolabı -> duvar prizi 90 m sabit kablo, temel bağlantı
patch panel -> anahtar 6 m
-----------------------------------
kanal 99 m sınır 100 mTIA iki ayrı ölçüm birimi tanımlıyor: temel bağlantı yalnızca duvar prizi ile dolaptaki sonlandırma arasındaki sabit kablo, kanal ise patch kabloları dahil uçtan uca giden yol. Sınırın kendisi de ölçüme dayanıyor. Ortalama bir ofis binasında masaüstlerinin ezici çoğunluğu en yakın kat dolabına 100 metreden yakın duruyor.
Prizden dolaba uzanan yolu parça parça görelim:
- İş alanı prizle başlıyor. Standart her iş alanı için en az iki priz istiyor. Masadaki bilgisayar bu prize en çok 3 metrelik bir patch kablosuyla bağlanıyor; bu kablo bütçenin en görünür ama en kısa parçası.
- Sabit kablo duvarın içinde. Prizden kat dolabına uzanan kablo en çok 90 metre olabiliyor. Tavandan ve duvardan geçtiği için sonradan değiştirmesi en pahalı parça bu; en iyi malzeme buraya konuyor.
- Dolapta panele iniyor. Sabit kablo kat dolabında patch panelde sonlanıyor. Panelden anahtara giden ekipman ve patch kabloları toplam 6 metreyi geçemiyor.
- Kanal 99 metrede kapanıyor. Uçtan uca ölçülen bu yolun adı kanal ve sınırı 100 metre. Patch kabloları için ayrılan toplam pay 10 metre olduğundan 3 ile 6 metrelik uçlar payın içinde kalıyor.
- Omurga yukarı çıkıyor. Kat dolapları bina omurgasıyla ekipman odasına bağlanıyor, dış hat da bina giriş odasından geliyor. Standart bu yıldızın derinliğini en fazla iki kademeyle sınırlıyor.
Geri kalan kurallar da sayıya bağlı. Her iş alanı için en az iki priz zorunlu ve bunlardan biri dört çiftli UTP olmak zorunda. Bina omurgası ise en fazla iki kademeli bir yıldızla sınırlı: ekipman odasındaki ana çapraz bağlantı ile kat dolabındaki yatay çapraz bağlantı arasında en çok bir ara nokta olabiliyor.
Bir binada en çok kablo yatay kablolamada bulunuyor. Tavanın ve duvarların içinden geçtiği için değiştirmesi omurgadan çok daha pahalı, ve en iyi malzeme bu yüzden yatay kabloya konuyor. Kategori de bant genişliği demek: Cat 5e 100 MHz, Cat 6 250 MHz, Cat 6A 500 MHz. TIA, 100 metrelik 10GBASE-T için en az Cat 6A istiyor; Cat 6 ile mesafe 37 ile 55 metreye iniyor.
Kabloyu burada yalnızca adıyla anıyorum. UTP’nin ucundaki RJ-45’in iki resmi sonlandırma şeması var: T568A ve T568B. Elektriksel olarak aynılar, fark sekiz telin renk sırasında. Kabloyu elimize kitabın sonlarında alacağız.
Özet
Peki, ne öğrendik?
- Topoloji iki ayrı sorunun cevabı: kabloların dizilişi fiziksel topoloji, sinyalin izlediği yol mantıksal topoloji, ve ikisi aynı ağda farklı olabilir.
- Veri yolu kendi sınırlarına çarptı: tek kablo, tek kopmada ikiye bölünen ağ, 185 ile 500 metrelik segmentler ve yeri zor bulunan arızalar.
- Halka fiilen bir yıldızdı: jeton halkanın içinde dolaşıyordu ama kablolar merkezdeki kutuya gidiyordu.
- Yıldız kırılganlığı merkeze topladı: uçtaki arıza tek bir ucu düşürüyor, merkezdeki arıza her şeyi durduruyor, bedeli de fazladan kablo.
- Structured cabling (yapısal kablolama) bir bütçe: bakırın 100 metrelik kanalı, 90 metrelik sabit kablo ile 10 metrelik patch payı arasında bölüşülüyor.
Binanın şekli oturdu, anahtar da kat dolabında yerinde duruyor. Aynı anahtara bağlı iki bilgisayar aynı ağda olmak zorunda mı?
Bölüm 26: Sanal Yerel Ağlar
Structured cabling’in (yapısal kablolamanın) yıldız düzeninde her priz kat dolabındaki anahtara bağlanıyordu. Geriye bir soru kalıyor: aynı anahtara takılı iki bilgisayar aynı ağda olmak zorunda mı?
Zorunda değil. Tek bir anahtar, birbirini hiç görmeyen ağları aynı anda taşıyabiliyor. Peki bunu neyle yapıyor?
Aynı kutuda kaç ağ var?
ARP isteği, broadcast domain’deki bütün komşuların kartını tek tek uyandırıyordu. Yayın yalnızca ARP değil. DHCP de, hedefi henüz öğrenilmemiş her çerçeve de aynı yolu izliyor. Hepsi LAN’ın tamamını dolaşıyor, bant genişliğini yiyor ve herkese herkesin trafiğini duyuruyor.
Sanal yerel ağ, yöneticinin çizdiği bir port kümesi ve o kümenin dışına taşmayan bir broadcast domain. Sınır tek bir kutunun içinde de durabiliyor, birkaç anahtara da yayılabiliyor. Çizgiyi donanım çekmiyor; anahtarın çerçeveyi hangi porta ileteceğine karar veren yazılım çekiyor. Kutunun içine bakarsan ikiye bölünmüş bir şey göremezsin.
Port tabanlı ayrımda arayüzleri gruplara bölen kişi ağ yöneticisi oluyor ve her grup bir VLAN sayılıyor. Sonuç trafik yalıtımı: bir gruptaki porttan çıkan çerçeve yalnızca aynı gruptaki portlara ulaşıyor. Yirmi dört portlu bir anahtarı ikiye bölmek, onu iki bağımsız on iki portlu anahtara ayırmakla aynı sonucu veriyor. Öğrenilen adresler de ayrılıyor. Bir VLAN’da görülen MAC, öbürünün tablosuna hiç yazılmıyor.
Grubu belirleyen ölçüt coğrafya olmaktan çıkıyor. Bir port, üstündeki makinenin hangi ekibe ya da hangi uygulamaya hizmet ettiğine göre VLAN’a giriyor. Eskiden bunun tek yolu makineleri aynı kat dolabına toplamaktı. Şimdi bir çalışan ekip değiştirdiğinde kablolamaya dokunulmuyor; üçüncü katman adresi bile aynı kalıyor. Değişen tek şey, portun hangi VLAN’a ait olduğu.
Ölçek tarafında da kazanç var. Altı küçük grubun her birine ayrı bir anahtar almak yerine kırk sekiz portlu tek bir kutu hepsini alabiliyor. VLAN’sız o kutu yalıtım vermez.
Yönetici her portu bir VLAN’a bildiriyor ve anahtarın içinde bir port-VLAN eşleme tablosu birikiyor. Bildirilmemiş portlar varsayılan VLAN’a düşüyor; yerel VLAN diye de anılıyor. Orası ölü bir alan değil. Anahtar kendi yönetim adresini ve komşularıyla konuştuğu keşif trafiğini orada tutuyor. Yani boş bıraktığın port, çalışan bir ağın ucunda açık duruyor.
Üyelik illa porta bağlı da değil. Statik üyelikte portu VLAN’a katan yönetici; dinamik üyelikte kararı anahtar veriyor. Takılan makinenin MAC adresine, mantıksal adresine ya da konuştuğu protokole bakıyor. MAC tabanlı üyelikte cihaz hangi porta takılırsa takılsın kendi VLAN’ına düşüyor.
| port | VLAN | ne takılı |
|---|---|---|
| 1-8 | 10 | muhasebe masaüstleri |
| 9-16 | 30 | laboratuvar makineleri |
| 24 | trunk | üst kattaki anahtar |
Bu tabloda muhasebe masası laboratuvar makinesini hiç görmüyor. Aynı kutuya takılı olmaları bir şey değiştirmiyor.
İki anahtarı nasıl bağlarsın?
Ağ tek kutuda bitmiyor. İki anahtarda da aynı VLAN’lar varsa, aralarına VLAN başına bir kablo çekmek işe yarıyor. Ama ölçeklenmiyor. N tane VLAN, yalnızca iki anahtarı birbirine bağlamak için her anahtarda N port yiyor.
Ölçeklenen çözümün adı trunk portu. İki anahtarda birer port trunk olarak ayarlanıyor ve aralarına tek bir hat çekiliyor. Trunk’ta VLAN ayrımı yok; hangi VLAN’ın çerçevesi olursa olsun o tek hattan geçiyor. İki VLAN’lı bir kurulumda kablo sayısı ikiden bire iniyor: %50 tasarruf.
Uç cihazın takıldığı, tek bir VLAN’a ait ve etiketsiz çalışan porta erişim portu deniyor. İkisi arasındaki fark çerçevenin üstünde görünüyor.
Trunk’tan geçen çerçeve sıradan bir Ethernet çerçevesi olamaz. Üstünde hangi VLAN’a ait olduğu yazmak zorunda. Anahtar, çerçeveyi hatta vermeden önce ona küçük bir alan basıyor; karşı uçtaki anahtar o alanı okuyup söküyor. Etiketi ekleyen de söken de anahtar. Uç cihaz onu hiç görmüyor. Bu işin standart adı IEEE 802.1Q.
802.1Q 1998’de yayımlandı ve VLAN’ı üreticiden bağımsız hâle getirdi. Ondan önce etiketleme üreticiye özel yollarla yapılıyordu ve ortama göre ayrışmıştı: Fast Ethernet’te ISL, FDDI’da 802.10, ATM’de LAN Emulation. ISL veriyi kapsülleyip başına 26 baytlık bir başlık, sonuna 4 baytlık bir CRC ekliyordu. 30 bayt ek yük, 802.1Q etiketinin yedi buçuk katı.
VLAN listesinin kendisi de anahtarlar arasında dolaşabiliyor. Bir kutuyu sunucu kipine alıp listeyi orada tutuyorsun; aynı yönetim alanındaki diğerleri listeyi ondan çekiyor. Kolaylık, ama bütün ağı tek noktadan bozma yetkisi de aynı yerde.
Trunk kararının kendisi de pazarlığa açık. Bir portun trunk olup olmayacağı beş kipten biriyle ayarlanıyor ve otomatik kipteki bir port, karşı taraf istekliyse kendiliğinden trunk’a dönüşüyor. Sızma testi kitaplarının atlama saldırısı dediği şey buradan besleniyor: saldırgan kendini komşu bir anahtar gibi tanıtan bir pazarlık mesajı yolluyor, takılı olduğu erişim portunu trunk’a çevirtiyor, sonra istediği VLAN kimliğini kendi çerçevesine yazıp o broadcast domain’in içine düşüyor.
Saldırı iki ihmalin üstünde yürüyor: portun pazarlığa açık bırakılması ve varsayılan VLAN’ın dokunulmadan durması. İkisini de kapatmak zor değil. Kullanılmayan bir port ya elektriksel olarak kapatılır ya da hiçbir yere çıkmayan tek bir VLAN’a sabitlenip pazarlık dışı bırakılır.
DerinleşmePortu baştan kapalı saymak neyi değiştirir?
Varsayılan VLAN’ın kolaylığı ortada: anahtarı kutusundan çıkarıp takıyorsun ve hiçbir ayar yapmadan çalışıyor. Bedeli, hiç ayarlanmamış bir portun da aynı sebeple çalışıyor olması. Açıkları tek tek kapatmak da kalıcı bir çözüm değil, çünkü her yeni port unutulabilecek yeni bir ayar demek.
IEEE 802.1X varsayımı tersine çeviriyor. Port baştan kapalı sayılıyor; kabloyu takan cihaz kimliğini kanıtlayana kadar oradan yalnızca kimlik denetimi trafiği geçiyor. Kimliği soran taraf anahtarın kendisi, kararı veren arkadaki kimlik doğrulama sunucusu, kanıtı sunan da istemci. Kanıt kabul edilirse port normal trafiğe açılıyor, edilmezse kapalı kalıyor.
Standardın kendisi kimliğin nasıl kanıtlanacağını söylemiyor. 802.1X yalnızca EAP yöntemlerini taşıyan bir çerçeve tanımlıyor ve tanımlanmış yaklaşık 40 yöntem var; parolayı, sertifikayı ya da SIM kartını seçmek ağın sahibine kalıyor. Bir güvenlik standardının kimlik denetimini standartlaştırmak yerine onun taşınacağı yolu standartlaştırması, ilk bakışta eksiklik gibi duruyor. Ağların birbirine hiç benzemediği düşünülünce tasarımın asıl sağlam tarafı orası.
Genel ders şu: varsayılan bırakılmış bir ayar, saldırgan için bedava bir varsayımdır.
Dört bayt nereye giriyor?
Etiket 4 bayt ve çerçevenin başına girmiyor. İki adres alanının ardından, tür alanının önüne sokuluyor. Kapsüllemede her başlık kendi yükünün önüne ekleniyordu. 802.1Q bu düzeni bozuyor.
hedef MAC 6 bayt
kaynak MAC 6 bayt
--- 802.1Q etiketi, 4 bayt --------------------------------
TPID 2 bayt sabit 0x8100
TCI 2 bayt 3 bit öncelik + 1 bit + 12 bit kimlik
-----------------------------------------------------------
tür alanı 2 bayt
veri 46-1500 bayt
FCS 4 bayt etiketten sonra yeniden hesaplanırİlk iki bayta etiket protokol tanımlayıcı deniyor ve değeri hep aynı kalıyor: onaltılık 8100. Bu değeri gören alıcı, elindeki çerçevenin etiketli olduğunu anlıyor.

Sonraki iki bayt etiket denetim bilgisi. O 16 bitin 12 biti VLAN kimliği, 3 biti öncelik; geriye 1 bit kalıyor. On iki bitlik alan 4.096 farklı değer ayırt ediyor. Kullanılabilir numara sayısı 4.094; ayrılan iki değeri IEEE 802.1Q metni söylüyor. Cisco dönemi bir cihazda tanımlanabilen aralık ise 1 ile 1001 arasıydı. O, standardın sınırı değil, cihazın sınırıydı.
Öncelik bitleri 802.1p’nin hizmet sınıfı bitleri: üç bit, sekiz düzey, sıfırdan yediye. IP başlığındaki hizmet türü alanının bu kattaki karşılığı sayılabilir. Bir portta öncelik açıksa, tıkanma anında önce yüksek öncelikle işaretlenmemiş çerçeveler düşürülüyor.
Etiket eklendikten sonra çerçevenin sonundaki FCS yeniden hesaplanıyor; sebebi CRC’nin çerçevenin tamamını kapsaması. Boy da değişiyor: etiketsiz azami çerçeve önsöz hariç 1.518 bayt, etiketli 1.522 bayt. Veri alanı ise sabit: 46 ile 1.500 bayt arası.
1.522 bayt standarda IEEE 802.3ac ekiyle 1998’de girdi. 2006’daki 802.3as eki, bütün etiketleme biçimleri için sınırı 2.000 bayta çekti; zarf çerçeve azami boya 482 bayt daha ekliyor.
Etiketin asıl bedeli en küçük çerçevede görünüyor: etiketsiz asgari 64 bayt, etiketli 68 bayt. Dört baytın küçük çerçevede neden ağır bastığını FCS’nin payını hesaplarken görmüştün.
Etiketli bir çerçeve, etiket bilmeyen bir istasyona düşerse ne oluyor? O istasyon başlıkta tanımadığı bir tür değeri buluyor ve çerçeveyi sessizce düşürüyor. Böyle bir çerçevenin oraya varması da pek olmuyor, çünkü etiketi yalnızca bunun için ayarlanmış cihazlar basıyor.
Anahtarın MAC öğrenme tablosunu doldurması ve döngüyü kesen spanning tree tanıdık. Spanning tree ağaç da VLAN başına ayrı işliyor. Çoklu spanning tree 802.1s ekiyle 2003’te tanımlandı, 802.1Q’nun 2005 baskısına girdi ve her bölge 64’e kadar ayrı örnek çalıştırabiliyor.
İki VLAN nasıl konuşur?
Ayırmak kolay oldu. Ayırdıklarını tekrar konuşturmak üçüncü katmana çıkmayı gerektiriyor. Ayrı broadcast domain, ayrı IP alt ağı demek. Muhasebe 192.0.2.0/24 olsun, laboratuvar 198.51.100.0/24. Aradaki her datagramın, iki alt ağı da tanıyan bir cihaza uğraması gerekiyor. Sanki ortada bağlantısız iki anahtar var.
Yönlendiricide her VLAN için ayrı bir fiziksel arayüz tutmak pahalı. Tek arayüzün üstünde alt arayüz açılıyor; her birine ayrı bir alt ağ ve ayrı bir VLAN numarası veriliyor. Böylece tek bir kablo, kaç VLAN varsa o kadar mantıksal bacak taşıyor.
Yönlendirici çerçeveyi alıyor, etiketi söküp hangi alt ağa ait olduğunu buluyor, kararını verdikten sonra hedef VLAN’ın etiketini takıp aynı porttan geri yolluyor. Üreticiler ikisini tek kutuda birleştirip satıyor.
Bunu kendi makinende de görebilirsin. Linux’ta bir arayüzün üstüne etiketli bir alt arayüz eklemek üç satır sürüyor.
ip link add link eth0 name eth0.10 type vlan id 10
ip addr add 192.0.2.10/24 dev eth0.10
ip -d link show eth0.10Son komutun çıktısında vlan protocol 802.1Q id 10 satırını görüyorsun. O arayüzden çıkan her çerçeve artık etiketli.
Özet
Peki, ne öğrendik?
- Sanal yerel ağ bir port kümesidir: anahtarın iletim yazılımı, aynı kutunun içinde birbirini görmeyen broadcast domain’ler kurar.
- Etiket dört bayttır: iki bayt sabit tanımlayıcı, iki bayt da kimlik ile önceliği taşıyan denetim alanıdır.
- Trunk tek hattır: bütün VLAN’lar aynı kablodan geçer, etiketi ise yalnızca iki uçtaki anahtarlar görür.
- VLAN’lar arası geçiş yönlendirmedir: ayrı alt ağlar ancak üçüncü katmana çıkıp geri dönerek konuşabilir.
- Boş port boş değildir: hiçbir VLAN’a bildirilmemiş bir arayüz, anahtarın yönetim trafiğini taşıyan varsayılan VLAN’da bekler.
Aynı kabloda birden çok ağ taşımayı çözdük; ayrımı dört baytlık bir etiket ile anahtarın iletim kararı yapıyor. Kablosuz bağlıysan ortada kablo yok; çerçeve o boşlukta nasıl gidiyor?
Bölüm 27: Kablosuz Erişim: 802.11
Dizüstünü toplayıp bahçeye çıktın. Çerçeve hâlâ aynı çerçeve, taşıdığı istek hâlâ aynı istek. Değişen tek şey şu: onu artık bakır bir tel değil, aradaki boşluk taşıyor.
Boşluğun da kuralı var. Ama kabloda işleyen kural burada yürümüyor: kimsenin çarpışmayı göremediği bir ortamda çarpışma nasıl önlenir?
Kablo yoksa hangi kural değişiyor?
Metal kablo elektrik akımı taşır. Havadaki taşıyıcı ise belirli bir frekanstaki elektromanyetik dalga.
Kablosuz LAN sıfırdan bir ağ da değildir. Var olan LAN teknolojisinin fiziksel katmanı ve bağ katmanının bir kısmı kablosuzlaştırılmıştır. IP ve üstü hiç değişmez. Değişen yalnızca 802.11’in MAC katmanı ile onun fiziksel katmanıdır. Yani kapsülleme merdiveninin en alt basamağı sökülüp yerine yenisi takılıyor, üstündeki basamaklar aynen kalıyor.
Bu sınır standardın kendi kapsamında da yazılı. IEEE 802 ailesinin tamamı yalnızca iki katmanı düzenler: bağ katmanı ile fiziksel katman. Ailede 802.3 CSMA/CD’ye ayrılmış, 802.11 kablosuz ağa. IEEE bu işe 1997’de başladı; ilk sürüm 2,4 GHz’de 2 Mbit/s için tasarlanmıştı. O gün bu hız bir DSL bağlantısıyla aynı mertebedeydi.
Kablosuz, ortamı paylaşan yayın bağlantılarının en saf örneği. Paylaşılan ortamın temel kuralı tek cümleyle yazılır: göndermeden önce hattı dinle, boşsa gönder, doluysa boşalmasını bekle. Bu kuralın adı CSMA.
Dinlemek tek başına yetmiyor. Birkaç makine aynı anda hattı boş görüp aynı anda gönderebilir. Üstelik çarpışma göndericinin başına gelen bir şey de değildir. Alıcının aynı anda iki ya da daha fazla sinyali üst üste almasıdır.
Anahtar her kabloyu ayrı bir collision domain’e çeviriyordu; paylaşılan kabloda ise CSMA/CD göndericiye kendi çarpışmasını sezdiriyordu. Telsizde o adım yok. Bir gönderici aynı anda hem gönderip hem dinleyemiyorsa çarpışmayı kendisi göremez, göremediğini de ortasında kesemez.
Ethernet CSMA/CD kullanır, 802.11 ise CSMA/CA. Biri çarpışmayı sezer, öteki ondan kaçınır.
Duymadığın komşu seni nasıl bozuyor?
Havada sinyal gittikçe zayıflar. Bu zayıflamanın adı yol kaybı: elektromanyetik dalganın vericiden alıcıya giderken güç yoğunluğunun düşmesi. Düşüşün hızı ortama bağlı. Yol kaybı üssü boş uzayda 2, şehir içinde 2,7 ile 3,5 arasında, bina içinde 3 ile 6 arasında. Duvarlar sinyali mesafeden daha hızlı yiyor.
Şimdi bir evi düşün. Telefon mutfakta, dizüstü balkonda, access point ikisinin ortasındaki koridorda. Mutfaktaki telefon balkondaki dizüstünü hiç duymuyor; arada iki duvar var ve mesafe yol kaybını büyütüyor. İkisi de kanalı dinlediğinde boş buluyor, çünkü kendi açılarından kanal gerçekten boş. Ama iki sinyal koridordaki access point’te üst üste biniyor. Bu duruma gizli terminal deniyor.
Kanalı boş sanmanın iki sebebi var. Karşı tarafın sinyali sana henüz ulaşmamıştır. Ya da sönümlenme yüzünden hiç ulaşmıyordur.
Koordinasyon için ayrı bir bant da yok. Kanalın nasıl paylaşılacağına dair anlaşma, paylaşılan kanalın kendisinden yapılmak zorunda. Dalganın kendi davranışını, yani yol kaybının hesabını burada kasten bırakıyorum.
Sıranı nasıl bekliyorsun?
802.11 göndericisi kanalı bir kerede boş görmekle yetinmez. DIFS adı verilen bir süre boyunca kesintisiz boş görmek zorundadır. Kanal o süre boyunca sessizse çerçevenin tamamı gönderilir. Gönderim yarıda kesilmez.
Alıcı çerçeveyi sağlam aldıysa SIFS kadar bekler ve bir ACK döner. Bu onay gizli terminal yüzünden zorunlu; gönderici çerçevesinin vardığını başka türlü bilemez.
Kanal doluysa gönderici hemen sıraya girmez. Rastgele bir geri çekilme sayacı başlatır. Sayaç yalnızca kanal boşken geri sayar. Kanal dolduğunda durur, boşalınca kaldığı yerden devam eder. Sıfıra indiğinde gönderim yapılır. Böylece sırasını bekleyen cezalandırılmaz.
ACK gelmezse gönderici çarpışma varsayar. Geri çekilme aralığını ikiye katlar ve baştan dener. Pencerenin üst sınırı fiziksel katmana göre 200 ms mertebesine kadar çıkabiliyor. Burada kabul edilmiş bir körlük var. 802.11’de kayıp ile çarpışma aynı belirtiyi verir ve ikisi birbirinden ayrılamaz.
Gizli terminali asıl çözen mekanizma rezervasyon. Gönderici önce küçük bir RTS paketiyle kanalı ayırtır. Access point CTS ile cevap verir ve bu cevabı yayın olarak gönderir. CTS’i duyan herkes, gönderici hariç, kendi gönderimini erteler. Balkondaki dizüstü mutfaktaki telefonu duymuyordu ama koridordaki access point’i duyuyor.
RTS ve CTS’in içinde, ardından gelecek gönderimin ne kadar süreceği yazılıdır. Susma süresi bir tahmin değil, ilan edilmiş bir sayıdır. RTS paketleri de çarpışabilir; kısa oldukları için kaybedilen zaman küçük kalır.
Veri çerçevesi gidip ACK döndüğünde cihaz çerçeveyi kendi kuyruğundan siler. Erişim noktası çerçeveyi ancak ondan sonra yönlendiriciye iletir.
Kanalı dinlemekten onaya kadar giden sırayı adım adım izleyelim:
- Kanal DIFS boyunca dinleniyor. Gönderici kanalı bir anlığına boş görmekle yetinmez; DIFS süresince kesintisiz boş görmek zorundadır. Bu süre dolmadan hiçbir çerçeve havaya çıkmaz.
- Kanal doluysa sayaç donuyor. Gönderici hemen sıraya girmez, rastgele bir geri çekilme sayacı başlatır. Sayaç yalnızca kanal boşken geri sayar; kanal dolduğunda durur ve boşalınca kaldığı yerden devam eder.
- RTS kanalı ayırtıyor. Gönderici küçük bir RTS paketi yollar. Erişim noktası CTS ile cevap verir ve bu cevabı yayın olarak gönderir; CTS duyan herkes, gönderici dışında, kendi gönderimini erteler.
- Veri çerçevesi havaya çıkıyor. RTS ve CTS içinde ilan edilen süre boyunca kanal bu gönderime ayrılmıştır. Çerçevenin tamamı gönderilir ve gönderim yarıda kesilmez.
- SIFS kadar sonra ACK dönüyor. Alıcı çerçeveyi sağlam aldıysa SIFS kadar bekleyip onay yollar. ACK gelmezse gönderici çarpışma varsayar, geri çekilme aralığını ikiye katlar ve baştan dener.
Ağa ilk adım nasıl atılıyor?
Bütün bunlar cihaz ağa çoktan girmişken olup bitiyor; girmenin kendisi ayrı bir iş. Access point’le kurulan ilk bağlantı tek başına internet demek değildir. Üstünde kimlik doğrulama ve DHCP çalışır; tam erişim ancak ondan sonra gelir.
Ağı bulmanın iki yolu var. Pasif yolda cihaz kanalları dinler ve ağın varlığını ilan eden beacon çerçevelerini toplar. Aktif yolda cihaz kendisi bir yoklama isteği yayınlar, menzildeki access point’lerin hepsi yoklama cevabı gönderir. Uygulamada ikisi birden kullanılır.
Seçim yapıldıktan sonra cihaz seçtiği access point’e bir ilişkilendirme isteği yollar ve karşılığında ilişkilendirme cevabı alır. Bu aşamada henüz hiçbir kimlik ya da parola alışverişi yok. Sorulan tek şey, konuşup konuşamayacakları.
Kablosuz ağlar iki yapıda kurulur. Access point olmadan kurulanına ad-hoc kipi denir, teknik adı IBSS. Access point üzerinden yürüyene altyapı kipi denir, teknik adı temel hizmet kümesi. Evdeki modem ile ona bağlı cihazlar bir BSS. Aynı alt ağda aynı SSID’yi taşıyan birden çok BSS birleşince genişletilmiş hizmet kümesi çıkar ortaya.
Altyapı kipinde istemciler birbirleriyle doğrudan konuştuklarını sanır. Bütün paketler erişim noktasından geçer; access point kablosuz tarafta bir hub gibi davranır. Tek bir anahtar, VLAN etiketiyle birbirini hiç görmeyen ağları taşıyabiliyordu; burada tersi oluyor ve tek bir erişim noktası herkesi aynı ortama basıyor.
İlişkilendirme bittiğinde artık havaya çerçeve koyabilirsin. O çerçevenin zarfı Ethernet’inkinden geniş duruyor. İçinde dört adres alanı var ve her biri 6 bayt.
çerçeve denetimi 2 bayt sürüm, tür, alt tür, sekiz bayrak
süre 2 bayt RTS/CTS ile ayrılan gönderim zamanı
adres 1 6 bayt çerçeveyi alacak taraf
adres 2 6 bayt çerçeveyi havaya koyan taraf
adres 3 6 bayt access point'in bağlı olduğu yönlendirici arayüzü
sıra denetimi 2 bayt çerçeve sıra numarası
adres 4 6 bayt yalnızca ad hoc kipinde
yük 0-2312 bayt IP datagramı
CRC 4 bayt bozulma denetimiÜçüncü adres bu listenin kilidi. Kabloda iki MAC adresi alanı yetiyordu; havada üçüncüsü gerekir, çünkü çerçevenin kablolu tarafta nereye çıkacağı da yazılmak zorunda.
Çerçeve denetim alanı bit bit bölünmüştür: 2 bitlik protokol sürümü, 2 bitlik tür, 4 bitlik alt tür, ve ardından birer bitlik sekiz bayrak. Tür alanı üç değer alır: 0 yönetim, 1 denetim, 2 veri. Wi-Fi’da veri çerçevesi türlerden yalnızca biri. Alt tür alanı beacon ile ACK’i birbirinden ayırır. Denetim ve yönetim çerçeveleri ağın kendi işleyişini taşır ve okura hiç görünmez.
Zarfın bedelini hesaplayalım. Dört adres birden kullanıldığında başlık ve CRC toplam 34 bayt tutar, altyapı kipinde dördüncü adres boş kaldığı için 28 bayt; Ethernet’in sabit zarfı ise 18 bayt. Aradaki fark on bayt ve bunun altı baytı doğrudan üçüncü adres alanından geliyor. En büyük yük 2.312 bayt olduğuna göre en büyük çerçeve 2.346 bayt eder. Zarfın payı yüzde bir buçuk civarında kalır.
Peki bu çerçeve hangi frekansta gidiyor? 2,4 GHz bandı ülkeye göre 11 ile 14 arasında kanala bölünmüştür ve bu sayı teknik değil düzenleyici bir karardır. 20 MHz genişliğinde birbiriyle örtüşmeyen kanal sayısı ise yalnızca üç. Aynı apartmanda dördüncü bir access point açıldığı anda birinin kanalı zorunlu olarak bir başkasıyla örtüşür. Aynı lisanssız ISM bandında mikrodalga fırın, bebek telsizi, Bluetooth kulaklık ve garaj kapısı kumandası da çalışır; girişim bu bandın doğal hâli.

Havadaki çerçeveyi ağa dahil olmayan herhangi bir kablosuz cihaz da dinleyebilir; ortam paylaşıldığı için izleme riski baştan var. Altyapı kipinde iletişimin şifrelenmesinin sebebi bu. WEP’ten WPA2’ye, oradan 2018’de gelen WPA3’e uzanan mirasın nasıl işlediğini iki durak sonra açacağız.
Bağlandığın ağın künyesini kendi makinende görebilirsin. Linux’ta iw dev wlan0 link bağlı olduğun BSSID’yi, SSID’yi, frekansı ve sinyal gücünü basar. iw dev wlan0 scan ise beacon ve yoklama cevaplarından toplanan ağ listesini verir. Windows’ta aynı işi netsh wlan show interfaces ve netsh wlan show networks mode=bssid görür.
$ iw dev wlan0 link
Connected to 00:00:5e:00:53:0b (on wlan0)
SSID: kat3-koridor
freq: 2437
signal: -58 dBmİlk satırdaki adres, havaya koyduğun çerçevelerin birinci adres alanına yazdığın değerdir.
Özet
Peki, ne öğrendik?
- Değişen tek şey ortam: kablosuz LAN yeni bir ağ kurmaz, var olan LAN’ın fiziksel katmanını ve MAC’inin bir kısmını kablosuzlaştırır.
- Çarpışma alıcıda olur: gönderici aynı anda gönderip dinleyemediği için kendi çarpışmasını göremez, ve gizli terminal bu körlüğü kalıcı hâle getirir.
- CSMA/CA beklemeyi kurala bağlar: DIFS boyunca dinlemek, donan bir geri çekilme sayacı ve SIFS sonrasında dönen ACK, çarpışma sezmenin yerini alır.
- RTS/CTS bir rezervasyondur: susulacak süre kanalın üstünden ilan edilir, çünkü koordinasyon için ayrılmış başka bir bant yoktur.
- Dört adres zarfı genişletir: altyapı kipinde 28 bayta çıkan zarfın farkı, çerçevenin kablolu tarafta nereye çıkacağını taşıyan üçüncü adresten gelir.
Kanalın boşalmasını bekledin, sıranı aldın, çerçeveyi havaya bıraktın ve onayını geri aldın. Sıra kanalın kendisinde: oraya tam olarak kaç bit sığıyor, ve bunu ne belirliyor?
Bölüm 28: Radyo Kanalı ve Kapasite
Kanal boşaldı, çerçeveyi gönderdin. O havaya kaç bit sığdığını ise geçen sefer söylemedim.
Sığan bit sayısını üç şey belirliyor: kanalın genişliği, modülasyonun derinliği ve kaç antenle konuştuğun. Peki bu üç ayarı kim çeviriyor?
Bir kanala kaç bit sığıyor?
Bir kanalın taşıyabileceği en yüksek hızın adı Shannon kapasitesi. Girdisi yalnızca iki tane: kanalın bant genişliği ve sinyal-gürültü oranı. İkincisini kısaca SNR diye anacağım.
SNR bir oran ve desibelle yazılıyor: alınan sinyal gücünü gürültü gücüne bölüyorsun, onluk logaritmasını alıp onla çarpıyorsun. 0 dB ikisinin eşit güçte olması demek. Aynı ölçek mutlak güç için de çalışıyor. 1 mW’a bölünmüş hâline dBm deniyor; tipik bir mobil vericinin tepe gücü 250 mW, yani 24 dBm.
İki girdi aynı biçimde davranmıyor ve aradaki fark bütün radyo tasarımını belirliyor. SNR sabitken kapasite bant genişliğiyle doğrusal büyüyor. SNR tarafı ise logaritmik çalışıyor: gücü artırmanın getirisi belli bir noktadan sonra neredeyse kayboluyor. Hız arayan radyo bu yüzden önce banda bakıyor, sonra güce.
Sayıya dökelim. 20 MHz’lik bir kanalda 25 dB SNR ile Shannon kapasitesi 166 Mbit/s çıkıyor. Kanalı 40 MHz’e çıkarıp SNR’yi sabit varsayarsan sonuç 332 Mbit/s oluyor, tam iki kat.
O varsayımın tutmadığı yer tam olarak burası. Gürültü gücü bant genişliğiyle doğru orantılı; kanalı genişletmek sinyalle birlikte gürültüyü de içeri alıyor. Bandı ikiye katlamanın SNR maliyeti 3 dB; desibel ölçeğinde 3 dB tam iki kat demek ve 10 × log10(2) bunu veriyor. 25 dB düşüp 22 dB’ye iniyor ve 40 MHz’deki gerçek sonuç 293 Mbit/s oluyor. İki kat değil, 1,76 kat.
Kanal genişliği basamakları 20, 40, 80, 160 ve 320 MHz. 20 MHz’den 160 MHz’e sekiz kat spektrum var, 320 MHz’e on altı kat. Her basamakta aynı üç desibellik vergi de ödeniyor.
Vergiyi sonuna kadar işlet: 20 MHz’den 160 MHz’e üç ikiye katlama var, toplam 9 dB. SNR 25 dB’den 16 dB’ye düşüyor ve kapasite 856 Mbit/s çıkıyor. Sekiz kat spektrum karşılığında 5,15 kat hız aldın. Basamak çıktıkça getiri eriyor.
Shannon’un verdiği sayı zaten teorik bir üst sınır. Pratikte ulaşılan hız her zaman bunun altında kalıyor.
Bir sembol kaç bit taşıyor?
Genişlik hikâyenin yarısı. Öteki yarısı, o kanalda gönderilen her sembolün kaç bit taşıdığı.
Modülasyon, taşıyıcı bir sinüs dalgasının genliğini, frekansını ya da fazını değiştirerek bit taşımak demek. Temel üç yöntemin adı ASK, FSK ve PSK. Üstlerinde QPSK ve QAM duruyor. QPSK aynı taşıyıcı frekansında dört ayrı faz kullanıyor ve veri hızını BPSK’ya göre ikiye katlıyor. Frekans değişmiyor, sembolün taşıdığı bit sayısı değişiyor.
Aynı fikri iki eksene birden yayan biçimin adı m-QAM ve m tane farklı genlik-faz bileşimi tanımlıyor. Bileşim sayısı her ikiye katlandığında sembol bir bit daha taşıyor; taşınan bit sayısına modülasyon derinliği deniyor.
| şema | bileşim sayısı | sembol başına |
|---|---|---|
| 4-QAM | 4 | 2 bit |
| 16-QAM | 16 | 4 bit |
| 64-QAM | 64 | 6 bit |
| 256-QAM | 256 | 8 bit |
Bir sembol pratikte 2 ile 8 bit arasında taşıyor. Alıcı tarafta iş bir yuvarlamaya iniyor. Gelen sinyalin genliğini ve fazını ölçüyor, sonra en yakın sembole yuvarlıyor. Bit hatası tam olarak bu yuvarlamanın yanlış komşuya düşmesi. Derinlik arttıkça noktalar birbirine yaklaşıyor ve yanlış komşu daha kolay kazanıyor.
Her basamağın bir SNR faturası var ve fatura hızla büyüyor. 16-QAM’in eşiği yaklaşık 12 desibel, 64-QAM’inki 18, 256-QAM’inki 24. Aradaki düzen sabit: sembol başına iki bit eklemek, kabaca altı desibel daha temiz bir kanal istiyor. Desibel çarpan ölçüsü olduğu için altı desibel dört kat daha güçlü bir sinyal demek. Derinliği bir basamak artırmanın bedeli, hızın kazandığından çok daha dik yükseliyor.

Derinlik bu yüzden sabit seçilmiyor. Uyarlamalı modülasyon, SNR değiştikçe şemayı ve gücü uçuş sırasında değiştiriyor ve kabul edilebilir hata oranındaki en yüksek hızı arıyor. Aynı kanalda, aynı anda, 16-QAM 11,5 Mbit/s verirken 64-QAM 26,9 Mbit/s veriyor. Tek değişen sembol başına bit.
Wi-Fi radyoları için pratik alt sınır 20 dB SNR; hücresel radyolar -10 ile -6 dB kadar aşağıda çalışabiliyor. O sınır 64-QAM’in faturasını karşılıyor, 256-QAM’inkini karşılamıyor. Tavan da kuşakla yükseldi: 802.11n’de 64-QAM olan üst sınır 802.11ac’de 256-QAM’e çıkarıldı. Modülasyonun matematiğini burada kesiyorum; dalga biçimlerini ve türetmeyi 48. bölümde açacağım.
Havayı kiminle paylaşıyorsun?
SNR’yi düşüren şey her zaman mesafe olmuyor. Wi-Fi lisanssız bantta çalışıyor: kurallara, özellikle güç sınırlarına uyan herkese açık. Komşunun ağı da bu yüzden senin havanı paylaşıyor ve bunun için senden izin almıyor.
2,4 GHz’in kaç kanala bölündüğünü ve o bandı hangi cihazlarla paylaştığını saymıştık; çıkış yolu yukarı taşınmak. 802.11ac 5 GHz’de birbiriyle örtüşmeyen 23 kanal buluyor. Seçilebilir kanal sayısı da bantla büyüyor: 5 GHz’de 150’yi, en son eklenen 6 GHz’de 250’yi aşıyor. Bunun bedeli menzilden ödeniyor; hesabını spektrumu açtığımızda yapacağım.
Anahtar her portu ayrı bir collision domain’e çevirip ortamı bölüyordu. Havada böyle bir bölme yok. İkinci bir access point eklemek de yardım etmiyor; yalnızca aynı SSID’yi taşıyan bir küme kuruyor. Aynı üçüncü katman alt ağındaki bu kümenin adı genişletilmiş hizmet kümesi. İçinde access point değiştirirken IP adresin değişmiyor, çünkü 802.11 hareketliliğe bağ katmanından bakıyor. Dolaşımı hızlandıran mekanizmalardan ikisi standartta tanımlı: hızlı yeniden kimlik doğrulama, ve access point’in cihaza yeni access point’ler önerebilmesi. Üstüne bir de üreticiye özel çözümler biniyor.
Kanal nasıl bölüşülüyor?
Kanal tek bir taşıyıcı değil. İçi, alt taşıyıcı denen ince şeritlere bölünmüş durumda.
Klasik frekans bölmeli çoklamada bu şeritler birbirine karışmasın diye aralarına koruma bandı konuyor. Koruma bandı harcanmış spektrum demek: taşıyıcı yok, bit yok, boşluk var. OFDM o boşluğu kaldırıyor. Alt taşıyıcılar dikey seçiliyor; hafifçe üst üste binseler de her alt taşıyıcının merkezinde komşusunun etkisi sıfırlanıyor. Koruma bandına gerek kalmıyor.
Şerit sayısı kanalın genişliğine bağlı. 4G’de 5 MHz’lik bir kanalda 300 alt taşıyıcı var, 20 MHz’de 1.200. Alt taşıyıcı aralığı 15 kHz, bir sembol 66,6 µs sürüyor; iki sayı birbirinin tersi.
Bir kullanıcıya atanabilen en küçük parçanın adı kaynak bloğu: 12 alt taşıyıcı üzerinde 7 sembollük bir dilim. Frekans ekseninde 180 kilohertz, zaman ekseninde yarım milisaniye tutuyor. 20 megahertzlik bir kanal bu bloklardan yüz tane çıkarıyor ve hepsi orta derinlikte dolduğunda taşıyıcının tepe hızı yüz megabit mertebesine geliyor.
DerinleşmeYüz megabit hangi çarpımdan çıkıyor?
Izgaranın tamamı üç sayının çarpımı, ve üçü de yukarıda geçti.
Bir blokta 12 alt taşıyıcı ile 7 sembol var, yani 84 sembol. Her sembolün taşıdığı bit sayısını modülasyon derinliği belirliyor: orta derinlikte altı bit, en üst derinlikte sekiz. Altı bitle bir blok 504 bit taşıyor. Blok yarım milisaniye sürdüğü için bu, saniyede bir megabitin biraz üstü demek.
Kanalın tamamı da aynı çarpımın büyüğü. 20 megahertzlik kanalda 1.200 alt taşıyıcı var; on ikişerli bloklara ayrılınca 100 blok çıkıyor. Yüz blok, blok başına bir megabit: taşıyıcının tepe hızı yaklaşık 100 megabit. 5 megahertzlik kanalda aynı bölme 25 blok verdiği için tepe hız da dörtte birine iniyor.
Buradan iki şey görünüyor. Birincisi, hızın bant genişliğiyle doğru orantılı olması: kanalı iki katına çıkarmak blok sayısını da iki katına çıkarıyor. İkincisi, aynı hızı derinlikten kazanmanın çok daha zor olması — sekiz bite çıkmak hızı yalnızca üçte bir artırıyor, karşılığında kanalın çok daha temiz olmasını şart koşuyor. Şebeke kurarken önce bant, sonra derinlik aranmasının sebebi bu.
Baz istasyonu hangi bloğun hangi cihaza gideceğine 1 ms’lik aralıklarla karar veriyor. Kanal tek bir kullanıcıya sonuna kadar bırakılmıyor. Devre anahtarlama hattı tek konuşmaya ayırıyor, paket anahtarlama ise talebe göre bölüştürüyordu. Buradaki ızgara aynı fikrin frekans eksenli hâli.
Bu bölüştürmenin protokol adı OFDMA ve onu 4G, 5G ile Wi-Fi 6 kullanıyor. OFDM’den farkı eksen sayısı: OFDM yalnızca frekansta bölüyor, OFDMA aynı ızgarayı zamanda da bölüyor. Kanalın boşalmasını bekleyen CSMA/CA, sırayı tek bir gönderene veriyordu. OFDMA aynı anda birden çoğuna veriyor. Wi-Fi tarafında bir ek adım var. Access point gönderimden önce MU-RTS yolluyor; içinde hangi cihazın hangi kaynak birimini dinleyeceği yazılı. Her alıcı da kendisine atanmış alt kanaldan CTS ile cevap veriyor.
Wi-Fi 6 ve 7 access point’ler yine de OFDM konuşmak zorunda, çünkü eski cihazlar OFDMA bilmiyor. Geriye uyumluluğun bedeli bu.
Izgaranın frekans ve zaman eksenlerinde nasıl bölündüğünü görelim:
- Kanalın iki boyutu. Bir radyo kanalı yalnızca frekansta bölünmüyor, zamanda da bölünüyor. Dikey eksen frekans, yatay eksen zaman; her hücre ikisinin kesiştiği bir parça.
- En küçük parça. 4G'de bir kullanıcıya atanabilen en küçük dilim 12 alt taşıyıcı üzerinde 7 sembol. Toplamı 84 sembol, 180 kHz genişlik ve 0,5 ms süre.
- Hücrenin derinliği. Aynı hücrenin kaç bit taşıdığını modülasyon belirliyor: 64-QAM'de 504 bit, 256-QAM'de 672 bit. Izgara aynı kalıyor, taşınan yük değişiyor.
- Kanalı genişletmek. Kanal 20 MHz'den 40 MHz'e çıkınca alt taşıyıcı sayısı, dolayısıyla satır sayısı ikiye katlanıyor. Aynı sürede iki kat blok geçiyor.
- Bölüşüm. Baz istasyonu blokları 1 ms'lik aralıklarla farklı cihazlara dağıtıyor. Kanal tek bir kullanıcıya bırakılmıyor; A, B ve C aynı anda taşınıyor.
Kaç antenle konuşuyorsun?
Üçüncü ayar anten sayısı. MIMO, aynı anda birden çok anten üzerinden göndermek demek. Tek kullanıcılı hâlinde yaygın yapılandırma iki gönderici ve iki alıcı antenle 2x2.
Aynı donanım iki ayrı işe koşulabiliyor. Uzamsal çeşitleme aynı bilgiyi farklı yollardan paralel gönderiyor. Hız artmıyor; artan şey güvenilirlik ve menzil, çünkü bütün yolların aynı anda bozulması olası değil.
Radyo sinyali nesnelerden yansıyıp alıcıya farklı zamanlarda varıyor; buna çok yollu yayılım deniyor. Çeşitleme bunu kusur saymıyor, kaynak sayıyor. Anten eklemek iki uç arasındaki yol sayısını artırıyor. İki antenli gönderici ile iki antenli alıcı arasında on iki ayrı yol sayılabiliyor. Alıcı bu kopyaları birleştirince SNR yükseliyor ve buna anten kazancı deniyor.
Uzamsal çoklama ise aynı yolda aynı anda farklı veri akışları gönderiyor. Hızı gerçekten katlayan bu. 64-QAM ile dört akışta sembol başına 24 bit taşınıyor. Tavanı zorla: 802.11ac’nin sekiz akışı 256-QAM ile sembol başına 64 bit taşıyor. Aynı sembolde 2x2 ve 64-QAM 12 bitte kalıyor. Kanal genişliği ikisinde de aynı, fark 5,33 kat.
Kazancın bedeli alıcıda ödeniyor. Karışmış gelen akışları ayırmak için denklem çözmek gerekiyor ve katsayılar zamanla değişen rastlantısal büyüklükler. Ayrıştırma her zaman temiz çıkmıyor.
Çok kullanıcılı MIMO’da access point aynı anda farklı cihazlara gönderiyor. Anten sayısı sabitken kapasite kullanıcılar arasında bölünüyor. İş hüzme biçimlendirmeye dayanıyor ve cihazların coğrafi olarak ayrışmış olmasını gerektiriyor. Aynı masada oturan iki telefonda kazanç kayboluyor. Anten sayıları da kuşakla arttı: 802.11n 4x4’e, 802.11ac 8x8’e kadar destekliyor ve MU-MIMO ilk kez o kuşakta geldi.
| kuşak | standart | yıl | teorik tepe hız | getirdiği |
|---|---|---|---|---|
| — | 802.11b | 1999 | 11 Mbit/s | 22 MHz kanal |
| — | 802.11g | 2003 | 54 Mbit/s | — |
| Wi-Fi 4 | 802.11n | 2009 | 600 Mbit/s | 40 MHz, MIMO |
| Wi-Fi 5 | 802.11ac | 2013 | 6,9 Gbit/s | 160 MHz, 256-QAM, MU-MIMO |
| Wi-Fi 6 | 802.11ax | 2020 | 9,5 Gbit/s | OFDMA |
| Wi-Fi 7 | 802.11be | 2024 | 30 Gbit/s üzeri | 320 MHz, üç bant |
Yirmi beş yılda teorik tepe hız 11 Mbit/s’den 30 Gbit/s’e, yaklaşık 2.727 kat arttı. Tablodaki sayılar teorik tavan; gündelik hız hep altında. Denemelerden bildirilen sayılar ise bu tavanın üstüne bile çıkabiliyor: 802.11ax için 5 GHz bandında 10,53 Gbit/s ölçüldüğü bildirildi. Bu sayıya hangi yapılandırmada ulaşıldığı kaynakta yazmıyor; ikisi aynı ölçüde karşılaştırılamaz. Wi-Fi 7’nin standart adı IEEE 802.11be ve 26 Eylül 2024’te onaylandı. Sıradaki kuşak IEEE 802.11bn, hedef yayım Mart 2028.
Hangi ayarların şu an açık olduğunu kendi makinende görebilirsin. Windows’ta netsh wlan show interfaces çıktısı radyo türünü, bandı, kanalı ve o anki alma-gönderme hızını yan yana veriyor.
Radio type : 802.11ac
Band : 5 GHz
Channel : 44
Receive rate (Mbps) : 866.7
Transmit rate (Mbps) : 866.7
Signal : 84%Aynı satırların Linux tarafındaki karşılığını iw dev wlan0 link veriyor. iw dev wlan0 station dump bir adım ileri gidiyor. Hızın yanına o hızı üreten üç ayarı da yazıyor.
tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2Satırdaki üç alan bu bölümün üç sorusu. 80MHz kanal genişliği, VHT-MCS modülasyon derinliği, VHT-NSS ise akış sayısı. Hızın gün içinde oynadığını görürsen sebebi bu bölümün tamamı. Kanal yerinde duruyor, derinlik değişiyor.
Özet
Peki, ne öğrendik?
- Kapasitenin iki girdisi var: Shannon bant genişliğini ve SNR’yi alır, ve bandı büyütmek doğrusal kazandırırken gücü büyütmek logaritmik kazandırır.
- Genişletmenin vergisi gürültü: gürültü de bantla büyüdüğü için 20 MHz’den 40 MHz’e geçmek hızı iki katına değil 1,76 katına çıkarır.
- Derinliği kanalın kalitesi seçer: her sembol 2 ile 8 bit arasında taşır, ve uyarlamalı modülasyon bu sayıyı uçuş sırasında değiştirir.
- Aynı kanal aynı anda bölüşülür: OFDMA ızgarayı kaynak bloklarına ayırır, MIMO ise aynı bloğun üstünde birden çok akış taşır.
Kanalın kaç bit taşıdığını artık uçtan uca sayabiliyorsun. O bitler havada ilerlerken menzildeki her radyo onları duyuyor. Peki duyan neden okuyamıyor?
Bölüm 29: Kablosuz Ağ Güvenliği
Menzildeki her radyo o çerçeveyi duydu. Duymak ile okumak arasındaki farkı yaratan şey mesafe değildir; bağlanırken üretilmiş ortak bir sırdır.
O sır hiçbir zaman havaya çıkmadı. Peki iki taraf ona nasıl vardı?
Şifrelenen tam olarak ne?
Ağa yeni giren bir cihazın üç işi var ve üçü de sen parolayı yazdıktan sonra, saniyenin içinde bitiyor: access point’le ilişkilendirilecek, ağla karşılıklı kimlik doğrulayacak, çerçevelerini şifreleyecek. Üçüncüsü sanıldığından geniş. Şifrelemenin yalnızca kullanıcı verisini kapsadığını sanma; doğrulama sırasında giden çerçeveleri de içine alıyor.
Pazarlık bir keşif adımıyla başlıyor: access point beacon yayınlıyor, ya da cihazın kendisi bir yoklama isteği gönderiyor. Bu iki yol ağı bulup ilişkilendirmeye kadar götürüyordu; aynı çerçeveler bir menü de taşıyor. Access point sunduğu kimlik doğrulama ve şifreleme biçimlerini ilan ediyor, cihaz da içlerinden birini istiyor. Dikkat et: o anda cihaz henüz doğrulanmış değil ve anahtar iki tarafta da yok.
Wi-Fi kartını izleme kipine alıp yanından geçen her çerçeveyi kaydetmeyi öğrenmiştin. Menzilde duran bir yabancı da aynı şeyi senden izin almadan yapar; kaydedilen trafik şifreliyse eldeki dosya anlaşılmaz kalır.

Şifrelemenin açık olup olmadığını frame control alanındaki tek bitlik WEP bayrağından okuyabilirsin. Başlığın kendisi korunmuyor: dört adres alanı açıkta gidiyor, şifrelenen kısım yalnızca yük. Her adres alanı 6 bayt; üç adresli bir başlık toplamda 24 bayt tutar. Şifrelenen yük ise 0 ile 2.312 bayt arasında değişir. Dinleyen biri içeriği okuyamaz, kimin kiminle konuştuğunu yine de görür. Kanal genişliği ve modülasyon derinliği taşınan bit sayısını belirliyordu; şifreleme o sayıya dokunmaz.
Bütün bu işler tek bir soy ağacında duruyor: WEP’ten WPA’ya, oradan WPA2’ye ve WPA3’e. En eski adın açılımı hedefini de söylüyordu. WEP, kablolu ortamla eşdeğer bir mahremiyet vaat ediyordu. Eski access point kataloglarında güvenlik satırı 64, 128 ve 152 bitlik WEP seçenekleriyle reklam ediliyordu. Güvenlik bir kutu özelliğiydi. WPA ile WPA2 2004’te geldi, WPA3 ise 2018’de. Aradaki on dört yıl boyunca WPA2 el sıkışması sahadaki tek seçenek olarak kaldı. Bir güvenlik protokolü için uzun bir süre bu, ve o sürenin sonunda ne olduğunu birazdan göreceksin.
Parola hattan geçmeden anahtar nasıl doğuyor?
Evinde ve küçük bir ofiste çalışan kipin adı kişisel kip. Access point’e tek bir parola girilir ve bütün cihazlar onu paylaşır. Parolayı yalnızca cihaz ile access point bilir. Parola bağlantıdan önce cihazlarda bulunduğu için bu düzenin adı önceden paylaşılan anahtar.
WPA2-PSK doğrulaması iki aşamadan oluşur ve aşamalar birbirinden bağımsız çalışır. Birinci aşamada istemci bir 802.11 Authentication çerçevesi gönderip Open System ister. Adı kimlik doğrulamaya benziyor ama sana parola sormuyor. Access point Status Code alanına Successful yazıyor ve iş bitiyor. O başarı damgasına aldanma; hiçbir sırrın doğrulandığı anlamına gelmiyor.
Birinci aşama bittiğinde cihaz ilişkilendirilmiştir, ama gerçek doğrulama hiç olmamıştır. İkinci aşama 802.1X üstünde koşar ve yalnızca o oturuma ait taze bir AES anahtarı üretir. Adı dört adımlı EAPOL el sıkışması. EAPOL, genişletilebilir kimlik doğrulama protokolünün yerel ağ üstünde taşınan biçimi.
Sırayı adım adım izleyelim. Access point ilk nonce’u gönderiyor. İstemci paylaşılan sır ile o nonce’u birleştirip bir MIC (bütünlük kodu) üretiyor ve kendi nonce’unu ekliyor. Access point kodu doğruluyor, karşı tarafın canlı olduğunu ölçüyor ve AES oturum anahtarını üretiyor. İstemci de kodu doğruluyor, onayını gönderiyor ve anahtarı kuruyor. Paylaşılan sır iki işe birden yarıyor: şifrelemeye ve bu MIC’in (bütünlük kodunun) üretilmesine.
Nonce’lar kaydedilmiş bir mesajın yeniden oynatılmasını da engelliyor. Her oturuma yeni bir anahtar üretmek, paylaşılan sırra kaba kuvvet uygulamayı zorlaştırıyor. El sıkışma bittiğinde anahtarı iki tarafta hazır buluyorsun, ama paylaşılan sır hiçbir zaman hatta çıkmamış oluyor. Üretilen anahtar AES’e ait. Simetrik şifrelemenin anahtar dağıtımı sorunu tanıdık; burada o anahtarı elden veren bir merci yok, iki tarafın ortak parolası var.
Bağlanma izini paket paket sayabilirsin: beacon’dan son ACK’e kadar dokuz paket geçiyor ve bunun son dördü EAPOL el sıkışması. Adres alma sırası ondan sonra geliyor, çünkü kimlik doğrulanmadan DHCP bile çalışamıyor.
El sıkışmanın kendisi de bir açık taşıyordu
WPA2’nin dört adımlı el sıkışması on üç yıl boyunca sağlam sayıldı. 2017’de bulunan kusur şifrede değil, sıralamadaydı.
Üçüncü mesaj yolda kaybolabiliyor. Protokol bunu öngörmüş: access point cevap gelmezse aynı mesajı yeniden gönderiyor. İstemci de her aldığında anahtarı yeniden kuruyor — ve anahtarı yeniden kurmak, yanındaki sayaçları da sıfırlamak demek.
Sayaç kipinin en tehlikeli hatası tanıdık: aynı anahtarla aynı sayacı iki kez kullanmak, iki şifreli metnin XOR’unun iki açık metnin XOR’unu vermesi demek. Saldırgan üçüncü mesajı kaydedip yeniden oynattığında tam olarak bunu tetikliyor. Anahtar kırılmıyor, tahmin edilmiyor, hesaplanmıyor; yalnızca ikinci kez kullanılıyor. Saldırının adı da bunu söylüyor: anahtarın yeniden kurulması.
Düzeltmeyi protokolde değil gerçeklemelerde arayacaksın; istemciler aynı anahtarı ikinci kez kurmayı reddeder hâle getirildi. Yani telde giden mesajlar aynı kaldı, değişen şey o mesajlara verilen tepki oldu.
Geçiş kipi eski açığı geri getiriyor
WPA3’e geçişin de bir pürüzü var ve bu kez kusur uyumlulukta. Bir access point hem WPA3 hem WPA2 kabul edecek şekilde ayarlanabiliyor; adı geçiş kipi ve amacı eski cihazları dışarıda bırakmamak.
Sorun şu: hangi kipin kullanılacağına istemci ile access point el sıkışmanın başında karar veriyor, ve o pazarlık henüz korunmuyor. Araya giren biri istemciyi WPA2 tarafına düşürebiliyor. Bu olduğunda birazdan göreceğin bütün WPA3 kazanımları — özellikle kaydedilmiş el sıkışmadan parolayı deneme imkânının kapanması — geri geliyor.
WPA3 el sıkışmayı nasıl değiştirdi?
WPA3’ün getirdiği asıl değişim el sıkışmanın kendisinde. WPA2’nin dört adımı menzilde duran biri tarafından kaydedilebiliyordu. Kayıt eldeyse parola havuzunu denemek ağla hiç konuşmadan, saldırganın kendi makinesinde yapılır; bunun adı çevrimdışı sözlük saldırısı. WPA3’ün kullandığı SAE, Dragonfly ailesinden geliyor: parolayla doğrulanan ve bu saldırıya dayanıklı bir anahtar değişimi. Ailenin tanımı RFC 7664’te yazılı; belgeyi Harkins kaleme aldı, IRTF’in CFRG grubu Kasım 2015’te yayımladı.
Değişim iki adımda kuruluyor. Commit adımında iki taraf da parolaya dair tek bir tahmine bağlanır. Birer skaler ve eleman üretip değiş tokuş eder, ortak sırrı hesaplar. Confirm adımında ise aynı sırrı türettiklerini, dolayısıyla aynı parolaya sahip olduklarını birbirine kanıtlarlar. Her taraf birer Commit ve birer Confirm gönderdiği için değişim dört çerçeve eder. Diziliş WPA2’nin dört adımına benziyor, üretilen şey benzemiyor.
Ortak sır tek parça da bırakılmaz. Bir doğrulama anahtarı ile bir ana anahtar olmak üzere ikiye gerilir. Skaler ve eleman üretildikten sonra ara değer geri dönülemez biçimde yok edilmek zorundadır. Karşı taraf aynı skaler ve elemanı olduğu gibi geri gönderirse bu bir yansıtma saldırısı işaretidir. Değişim orada durur.
İki tarafın parolayı hiç göndermeden nasıl anlaştığını izleyelim:
- İki taraf aynı parolaya bağlanır. Değişimden önce her iki taraf da parolaya dair tek bir tahmine bağlanır. Bağlandığı tahmin sonuna kadar sabit kalır; doğru olup olmadığı ancak Confirm adımında anlaşılır.
- Commit değiş tokuş edilir. Her taraf birer skaler ve eleman üretip karşıya yollar, geleni kendi değeriyle birleştirip ortak sırrı hesaplar. Aynı skaler ve eleman olduğu gibi geri gelirse değişim durdurulur.
- Ortak sır ikiye geriliyor. Sır tek parça bırakılmaz: bir doğrulama anahtarı (kck) ile bir ana anahtar (mk) çıkarılır. Skaler ve eleman üretildikten sonra ara değer geri dönülemez biçimde yok edilir.
- Confirm ile kanıt geliyor. İki taraf da aynı sırrı türettiğini gösteren bir Confirm yollar. Kanıt tutarsa aynı parolayı bildikleri anlaşılır; parolanın kendisi hiçbir adımda havaya çıkmaz.
- Oturum anahtarı kuruluyor. Dört çerçeve bitince iki tarafta da yalnızca bu oturuma ait bir anahtar durur. Diziliş WPA2 el sıkışmasını andırır, ama anahtarı doğuran şey paylaşılan sırrın kendisi değildir.
DerinleşmeKaydedilmiş bir el sıkışma parolayı neden ele veriyor?
Kaydın parolayı ele vermesi WPA2’nin bir hatası değil, tasarımının kaçınılmaz bedeli. Dört adım paroladan türetilmiş bir MIC (bütünlük kodu) taşımak zorunda; taşımasa iki taraf birbirinin doğru sırrı bildiğini hiç ölçemez. Ama karşı taraf o kodu yeniden hesaplayıp doğrulayabiliyorsa, kaydı alan da hesaplayabilir. Paroladan türetilmiş veriyi hatta gönderen her protokol aynı kapıyı açar. Ağ bir denemeyle binlerce denemeyi ayırt edemez, çünkü denemelerin hiçbiri ağa uğramaz.
Bu yüzden dirençli olmanın tanımı hesap gücüyle değil, etkileşim sayısıyla yazılır. Bir anahtar değişimi sözlük saldırısına dirençliyse şu geçerlidir: saldırganın kazancı, dürüst tarafla kaç kez etkileşime girdiğine bağlıdır. Saldırgan bir protokol koşusundan parola hakkında tek bir bilgi alır, o da denediği tahminin doğru olup olmadığıdır. Bin tahmin bin koşu demektir ve her koşu ağın görebildiği, sayabildiği ve kısıtlayabildiği bir olaydır.
RFC 7664 bunu bir tasarım gerekliliği olarak yazar: Dragonfly edilgen saldırıya, etkin saldırıya ve çevrimdışı sözlük saldırısına birden direnir. WPA3’ün el sıkışması o aileden geldiği için kaydedilmiş bir yakalamanın üstünde günlerce çalışmak karşılıksız kalır.
Genel ders şu: bir sırrı korumak çoğu zaman onu gizlemek değil, denenmesini pahalılaştırmaktır.
Kurumsal kipte parola nereye gitti?
Kurumsal kipte parola kullanıcı başına ayrışır ve kimlik olarak sertifika da kullanılabilir. Protokol iki taraf yerine üç taraf arasında koşar: cihaz, access point ve RADIUS gibi bir kimlik doğrulama sunucusu. Access point bu konuşmada neredeyse tamamen bir aktarıcıdır. Kimlik bilgileri istemci ile sunucuda durur, access point’te değil.
Bu düzenin adı 802.1X, resmî adı ise port tabanlı ağ erişim denetimi. Adında ne kablosuz ne parola geçer. Kablolu ve kablosuz yerel ağa ortak bir kimlik denetimi getirmek için tasarlandı. Erişim portunu baştan kapalı sayan aynı denetim kabloda da vardı; burada kapı bekçisi erişim noktasında duruyor.
Kimlik denetleyici ayrı bir kutu değildir; anahtarın ya da access point’in üstlendiği bir roldür. İstemciden gelen kimlik yanıtını alır, bir RADIUS Erişim İsteği paketine kapsülleyip sunucuya iletir. Aynı EAP verisi iki ayrı zarfla taşınır: cihazla access point arasında EAPOL, access point’le sunucu arasında RADIUS. Sunucunun işi kimlik doğrulamayı, yetkilendirmeyi ve hesap kaydını tek merkezde toplamaktır.
Doğrulamayı istemci de başlatabilir. Bir EAPOL-Start çerçevesi gönderir, doğrulayıcı kimlik isteğiyle yanıt verir. Oturumu kapatırken EAPOL-Logoff gider ve port yeniden yetkisiz duruma düşer. EAP’in kendisi kimlik doğrulamaz; yöntemleri taşır. Tanımlanmış yaklaşık 40 yöntem var ve aralarındaki fark kullandıkları kimlik malzemesi: parola, sertifika, SIM kartı ya da donanım tokeni. Adlar bunu söyler; EAP-TLS sertifikaya dayanır, EAP-SIM telefonun SIM kartına. İstemci önerilen yöntemi reddedip kendi listesini önerebilir ve bu pazarlık adımının adı NAK.
EAP-TTLS iki aşamada çalışır ve RFC 5281’de tanımlanır. Önce istemci sunucuyu doğrular ve aralarında bir TLS tüneli kurulur. Sonra sunucu istemciyi o şifreli tünelin içinde doğrular, ardından tünel yıkılır. Parola hiçbir zaman açıktan geçmez. Oturum anahtarı el sıkışma sırasında kuruluyordu; burada aynı tünel tek bir parolayı taşımak için kuruluyor.
Sonucu sunucu access point’e bildirir ve kanal şifrelemesi için gereken malzemeyi de ona gönderir. Kurumsal kipte de sonunda aynı dört adımlı el sıkışma koşar, ama artık kimlik için değil kanalı şifrelemek için.
Access point’in ilan ettiği menüyü kendi makinende de görebilirsin. Linux’ta nmcli -f SSID,SECURITY,CHAN dev wifi list menzildeki her ağın yanına o satırı basar.
$ nmcli -f SSID,SECURITY,CHAN dev wifi list
SSID SECURITY CHAN
kat3-koridor WPA2 6
lab-3b WPA3 36
kampus-net WPA2 802.1X 11Üçüncü satırdaki 802.1X işareti o ağın kurumsal kipte koştuğunu söyler.
Özet
Peki, ne öğrendik?
- Şifrelenen kısım yüktür: başlıktaki adres alanları açıkta gittiği için dinleyen biri içeriği okuyamasa bile kimin kiminle konuştuğunu görür.
- İlişkilendirme kimlik doğrulama değildir: Open System isteğine dönen Successful damgası hiçbir sırrın doğrulandığını göstermez.
- Anahtar oturuma özeldir: dört adımlı el sıkışma paylaşılan sır ile nonce’ları birleştirip her bağlantıya yeni bir AES anahtarı üretir, sırrı hatta hiç koymaz.
- SAE tahmini pahalılaştırır: Commit ile Confirm üstüne kurulan değişim, kaydedilmiş bir el sıkışmadan parola havuzunu denemeyi işe yaramaz hâle getirir.
- Kurumsal kipte kimlik başka yerde durur: access point aktarıcıdır, karar kimlik doğrulama sunucusundadır ve el sıkışma yalnızca kanalı şifrelemeye yarar.
Evdeki ağın kapısını kimin, neyle ve hangi sırayla açtığını artık biliyorsun. Sokağa çıkınca o kapı arkanda kalıyor. Peki hiçbir kablosuz ağ yokken telefonun neye bağlanıyor?
Bölüm 30: Hücresel Ağlar
Evden çıktın. Sokakta yürüyorsun, telefonun hâlâ bağlı ve ortada tanıdığın hiçbir ağ adı yok.
Bağlandığın şey bir hücre: kilometrelerce öteye kadar planlanmış bir örgünün tek bir gözü. Peki o hücre seni nasıl tanıdı?
Hücre neden hücre?
Operatör kapsayacağı coğrafyayı dairesel ya da altıgen alanlara böler. Her alanın ortasına, komşularından bağımsız çalışan bir düğüm koyar. O düğümün adı baz istasyonu, alanın adı hücre.
Baz istasyonu bir cihaz türü değil, bir rol. Kendi alanındaki kablosuz uçlarla kablolu ağ arasında paket taşır. Evdeki 802.11 access point de aynı rolü oynar. Aradaki farkı alanın büyüklüğü yaratıyor. İç mekânda kablosuz menzil 10 ile 30 m arasında kalır, hücre kulesi ise 4 ile 15 km arasında bir alanı kapsayabilir. Operatör bu alanları yan yana dizerek onlarca kilometreyi örter ve onlarca Mbit/s mertebesinde hız verir.
Menzil merdiveninde arada iki basamak daha var. Kısa mesafeli dış mekân bağlantısı 50 ile 200 m arasında kalır, orta mesafeli olan 200 m ile 4 km arasında. Hücrenin hangi basamağa kurulacağını kapsanacak alan ve oradaki cihaz yoğunluğu belirler. Şehir merkezinde hücre küçülür, kırda büyür.
Küçük hücrenin asıl sebebi kapsama değil, kapasite
Buraya kadar hücreyi bir kapsama aracı gibi anlattım. Değil. Bir operatör isterse şehrin ortasına tek bir yüksek kule dikip yüz kilometrekareyi tek seferde örtebilirdi. Bunu yapmamasının sebebi başka ve bütün hücresel fikri o sebepten doğdu.
Operatörün elinde sabit bir spektrum dilimi var; diyelim 20 MHz. Tek bir dev kule kurarsan o 20 MHz’i şehirdeki herkes paylaşır. Frekans sonlu, abone sonsuz.
Hücresel fikir tek bir hamleyle bunu tersine çeviriyor: gücü düşür, kapsamayı küçült, ve aynı frekansı uzaktaki başka bir hücrede yeniden kullan. Sinyal zaten mesafeyle sönümlendiği için, yeterince uzaktaki iki hücre birbirini duymuyor. Şehirde 100 hücre varsa ve her frekans 14 ayrı yerde tekrar kullanılabiliyorsa, toplam kapasite 14 katına çıkıyor. Spektrum hiç büyümedi; yeniden kullanıldı.
Bedava değil. İki hücre aynı frekansı kullandığında birbirine gürültü olur; buna ortak kanal girişimi deniyor. Bu yüzden aynı frekans komşu hücrede kullanılamıyor, belli bir uzaklık bırakmak gerekiyor.
Bu uzaklığı belirleyen sayının adı küme boyu (N): kaç hücrelik bir grubun, spektrumun tamamını aralarında bölüştüğü. Her hücreye toplam kanalın 1/N’i düşüyor ve aynı desen şehir boyunca tekrarlanıyor.
Altıgen bir ızgarada N rastgele bir sayı da olamıyor. Deseni boşluk bırakmadan tekrarlayabilmek için yalnızca belli değerler işe yarıyor: 3, 4, 7, 9, 12, 13, 19 ve devamı. Sahada en yaygın seçim yedi.
Küme büyüdükçe aynı frekansı kullanan iki hücre birbirinden uzaklaşıyor. Yedi hücrelik bir kümede o uzaklık, hücrenin yarıçapının kabaca dört buçuk katı oluyor — yani bir frekansı yeniden kullanabilmek için dört beş hücre ötesine gitmek gerekiyor.
Şimdi ödünleşim çıplak. N küçüldükçe kapasite artıyor, girişim de artıyor. N = 3 her hücreye spektrumun üçte birini verir ama ortak kanal hücreleri iyice yakınlaşır; N = 12 temiz bir sinyal verir, karşılığında her hücre spektrumun on ikide birine razı olur. Şebeke planlamacısının işi tek bir cümleye iniyor: girişimin kabul edilebilir olduğu en küçük N’i bulmak.
İkinci kapasite hamlesi anteni bölmek. Baz istasyonuna her yöne yayan tek bir anten yerine, 120 derecelik üç yönlü panel koyarsın; her panel kendi frekans grubunu kullanır ve tek bir kule üç ayrı hücre gibi davranır. Buna sektörleme deniyor. Bir kulede üç panelin farklı yönlere baktığını gördüysen, o üç panel kapasiteyi üçe katlayan tasarımın kendisi.
Talep yine de aşarsa üçüncü hamle var: hücreyi ikiye bölmek. Gücü düşürüp yarıçapı yarıya indirirsen aynı alana dört kat hücre sığar. Şehir merkezindeki hücrelerin niçin bu kadar küçük olduğunun cevabı bu — kapsama yetmediği için değil, kapasite yetmediği için.
Bir düzeltme. Yukarıdaki klasik plan 2G ve 3G’nin dünyasıdır. 4G ve 5G çoğu zaman N = 1 ile çalışır: bütün hücreler aynı frekansı kullanır. Girişim ortadan kalkmadı; onunla baş etme yöntemi değişti. Komşu baz istasyonları hangi zaman-frekans bloklarını kime vereceklerini birbirleriyle koordine ediyor, hatta bazen aynı cihaza birlikte gönderiyor. Yani planlama, kâğıt üstündeki bir frekans deseninden gerçek zamanlı bir zamanlama kararına taşındı.
Hücrelerin toplamına radyo erişim ağı deniyor, kısaca RAN. Kenar ağdır: cihazı baz istasyonuna bağlar, kapsamı coğrafyayla sınırlıdır ve tek bir servis sağlayıcının denetimindedir. Verdiği hizmet bağ katmanı hizmetidir. Cihaz ile daha büyük ağ arasındaki ilk sıçrama orasıdır.
3GPP’nin adlandırması sabit ve bu bölümde onu kullanacağım. Cihaz User Equipment (UE), radyo kanalı New Radio (NR), baz istasyonu gNodeB (gNB).
Telefonun tarafında iş tek bir radyoya da düşmez. Bir telefonda yaklaşık on bir ayrı radyo bulunur; beşi hücreseldir, kalanı Wi-Fi, Bluetooth, UWB, uydu, NFC ve GPS içindir. Hücresel bağlantı ayrıca tam çift yönlü çalışır. Veri gönderirken aynı anda karşı yönden veri alırsın.
Baz istasyonunun arkasında ne var?
Baz istasyonu tek başına bir ağ değil. Arkasında çekirdek ağ durur; bağlantılardan, yönlendiricilerden ve sunuculardan oluşur, hem cihazlara hem baz istasyonlarına hizmet verir. Sayı ilişkisi de tek yönlü işliyor: çekirdek ağ tek, RAN ise çok sayıda.
5G çekirdeğinin en görünür tasarım kararı düzlem ayrımı; adı CUPS. Denetim düzlemi kimin bağlandığına ve hangi yolun kurulacağına karar verir. Kullanıcı düzlemi yalnızca paket taşır.
Paketi taşıyan işlevin adı Kullanıcı Düzlemi İşlevi (UPF). Her cihaza bir UPF atanır ve o UPF cihazla internet arasında röle gibi çalışır. Politika uygulama, yasal dinleme, trafik kullanım ölçümü ve QoS denetimi orada oturur. Kotanı sayan yer orasıdır.
UPF ile baz istasyonu arasındaki arayüzün adı N3. Trafik o arayüzde tünellenir: IP datagramı bir UDP paketinin içine girer, o paket de bir başka IP paketinin içine. Kapsülleme her katmanda bir başlık ekliyordu; tünel aynı işi bir kat fazlasıyla yapıyor. Kullanıcı düzlemi tünelinin adı GTP-U.
Denetim düzlemindeki işlevlerin de adı var. Erişim ve Hareketlilik Yönetimi İşlevi (AMF) bağlantı, erişilebilirlik ve hareketlilik yönetimini, erişim yetkilendirmesini ve konum hizmetlerini üstlenir. Oturum Yönetimi İşlevi (SMF) her cihaz oturumunu yönetir; IP adresini de o tahsis eder. AUSF cihazları doğrular, UDM ise kullanıcı kimliğini ve kimlik doğrulama gizlerini üretip yönetir. Bu bölümlemenin tarifi 3GPP TS 23.501’de duruyor.
Kart seni nasıl tanıtıyor?
Kartın işi ad taşımak değil, sır taşımak. SIM kartı ya da sanal SIM seni ve ev ağını dünyadaki bütün hücresel ağlara tanıtır. İçinde yalnızca ev ağının bildiği bir kriptografik anahtar vardır. Ziyaret ettiğin ağda alacağın hizmet de ev ağındaki ücretli aboneliğine bağlıdır.

Kimliğin havada açık gitmez. TS 33.501’e göre abonenin kalıcı kimliği SUPI’dir ve ev ağının açık anahtarıyla şifrelenip SUCI olarak taşınır. Kartın fabrikadan gelen adını gizlemek için adres rastgeleleştirme çıkmıştı; burada aynı sorun şifrelemeyle çözülüyor.
Yordamın adı 5G-AKA ve iki yönlü çalışır. Kayıt sırasında ziyaret edilen AMF, cihazın ev ağındaki AUSF’unu bulur ve oraya şifreli, doğrulanmış bir TLS tüneli açar. Oradaki UDM, kartın anahtarıyla bir kimlik doğrulama jetonu ve nonce üretip imzalar. Aynı anda cihazın üretmesi beklenen yanıtı önceden hesaplayıp saklar.
Cihaz da boş durmaz. Kartındaki paylaşılan gizle, jetonun gerçekten kendi ev ağından geldiğini doğrular. Doğrulama bittiğinde ev ağındaki AUSF bir anchor key (çapa anahtarı) üretip ziyaret edilen ağa gönderir; cihaz aynı anahtarı kendi başına hesaplar. Ziyaret edilen ağ kartın kendi anahtarını hiç görmez.
Wi-Fi parolası, SAE el sıkışması sırasında ele verilmeden doğrulanıyordu. Hücresel ağda aynı işi kartın içindeki anahtar yapıyor.
Ağa katılmak iki aşamalı. Önce kayıt gelir, yani karşılıklı kimlik doğrulama. Sonra PDU oturumu kurulur: cihaza IP adresi tahsis edilir ve veri düzlemi yolu açılır.
İkisinden de önce bir taşıyıcı gerekir. Cihaz radyo bağlantısını bir RRC connection setup isteği ve yanıtıyla açar. Kimlik bilgisi henüz o adımda gitmez.
Telefonun hücreye tutunma sırasını baştan sona izleyelim:
- Radyo bağlantısı kuruluyor. Kenar ağa varan cihaz önce RRC connection setup isteğiyle radyo bağlantısını açar. Kimlik bilgisi henüz gitmez; bu bağlantı yalnızca sonraki adımların taşıyıcısıdır.
- Kayıt ev ağına kadar gidiyor. Ziyaret edilen AMF, cihazın ev ağındaki AUSF'unu bulup oraya şifreli bir TLS tüneli açar. UDM jetonu üretir, cihaz da SIM'indeki gizle jetonun kaynağını doğrular.
- SMF oturumu kuruyor. PDU oturumu kurulumunda SMF cihaza IP adresi tahsis eder ve trafiği hangi UPF'in taşıyacağına karar verir. Veri düzlemi yolu bu adımda belirlenir.
- N3 tüneli açılıyor. Baz istasyonu ile UPF arasındaki N3 arayüzünde GTP-U tüneli kurulur: IP datagramı bir UDP paketinin, o da bir başka IP paketinin içine girer.
- Trafik internete çıkıyor. UPF tünelden çıkardığı paketi internete verir. Politika uygulama, trafik kullanım ölçümü ve QoS denetimi de aynı noktada yapılır.
Radyo zamanı kime bölüşülüyor?
Baz istasyonunun elindeki kaynak zaman ve frekanstan ibaret. OFDMA kanalı bir zaman-frekans ızgarasına bölüyordu ve o ızgaranın en küçük dağıtım birimi kaynak bloğuydu. Hücresel ağda o bloğu dağıtan baz istasyonudur.
Ölçeği somut bir kanalda görmek daha kolay. 10 MHz’lik bir kanalda 50 kaynak bloğu vardır ve her blok 180 kHz’lik bir alt kanalı kaplar. Elli blok 9 MHz eder. Kalan 1 MHz koruma bandına ve denetim taşımasına gider.
Dağıtım kararı sürekli yenilenir. Baz istasyonu hangi bloğun hangi cihaza gideceğine 1 ms aralıklarla karar verir. Bu, saniyede 1.000 zamanlama kararı demek.
Blokların genişliği alt taşıyıcı aralığına bağlı. 4G’de o aralık 15 kHz’de sabittir. 5G’de 15, 30, 60 ve 120 kHz arasından seçilir; 30 kHz seçilirse bir blok 360 kHz’lik alt kanalı kaplar. Taşıyıcının kendi genişliğinin kuşakla nasıl büyüdüğünü bir sonraki durakta açacağım.
Tek taşıyıcı yetmediğinde taşıyıcılar birleştirilir. Taşıyıcı toplama 3GPP Release 10 ile LTE-Advanced’e girdi. En çok beş bileşen taşıyıcı toplanır, her biri en çok 20 MHz, toplamda 100 MHz.
Dağıtımı cihaz da besliyor. Aldığı referans sinyalinin kalitesini ölçer ve baz istasyonuna 4 bitlik bir Kanal Kalite Göstergesi (CQI) değeri bildirir. O değer kullanılacak modülasyonu ve beklenen verimi belirler.
Kararı veren yazılım baz istasyonunun radyo yığınında oturur ve iş bölümü nettir. PDCP IP başlıklarını sıkıştırır ve şifreler. RLC çerçeveyi parçalayıp ARQ ile güvenilir kılar. MAC tamponlar, çoklar ve o 1 ms’lik zamanlama kararını verir. O-RAN yaklaşımı bu yığını üç parçaya böler: Central Unit, Distributed Unit ve Radio Unit.
Standart yığının arayüzlerini ve üst düzey işlevlerini sabitler. Kaynak bloğu atamasının ve çerçeve zamanlamasının nasıl yapılacağını ise operatöre bırakır. İki operatörün aynı bantta farklı hissettirmesinin sebebi orada.
Bağlantı ayakta kalırken ne oluyor?
Radyonun bedeli pilde ölçülür. LTE radyosu verici ya da alıcı konumdayken 1000 mW ile 3500 mW arasında çeker. Kapalıyken tüketim 15 mW’ın altına iner, yani açık durumun %1 ile %2 arasına.
Bu fark uykuyu zorunlu kılar. Cihaz DRX uykusundayken gelen trafik, geçerli DRX döngüsü bitene kadar baz istasyonunda tamponlanır. Uzun uyku enerji kazandırır, gecikme ekler. Kuyruk gecikmesi, paketin sırada beklediği süreydi. DRX o kuyruğu kasten uzatıyor.
Bir de yürürken olan var. Bağlanma noktan değiştiğinde veri akışı kaynak baz istasyonundan hedefe geçiyor. Bu devrin adını ve kopmadan nasıl yürüdüğünü iki durak sonra açacağım.
Bağlandığın hücrenin künyesini kendi makinende görebilirsin. Linux’ta ModemManager kuruluysa mmcli -L takılı modemleri listeler, mmcli -m 0 ise kayıt durumunu, operatör adını ve sinyal kalitesini basar.
$ mmcli -m 0
Status | state: connected
| power state: on
| signal quality: 58% (recent)
3GPP | operator name: ornek-operator
| registration: homeSon satırdaki home, kartın kendi ev ağında olduğunu söyler. Orada roaming yazsaydı anchor key’i üreten ağ ile seni taşıyan ağ farklı olurdu.
Özet
Peki, ne öğrendik?
- Hücre bir plandır: dairesel ya da altıgen alanların her birinde bağımsız bir baz istasyonu durur ve o istasyon, kablosuz uçlarla kablolu ağ arasında paket taşıyan bir roldür.
- Çekirdek ağ işi ikiye böler: CUPS ile denetim düzlemi kimin bağlanacağına ve yolun nasıl kurulacağına karar verir, kullanıcı düzlemindeki UPF ise trafiği N3 üzerinden tünelleyip internete çıkarır.
- Kimliği kart taşır: karttaki anahtarın kopyası yalnızca ev ağında bulunur, kalıcı kimlik havada SUCI olarak şifreli gider ve ziyaret edilen ağ o anahtarı hiç görmez.
- Zaman kaynak bloğuyla dağıtılır: 180 kHz’lik bir blok 1 ms aralıklarla bir cihaza verilir; hangi bloğun kime gideceğine ise operatörün yazılımı karar verir.
- Uyku bir ödünleşimdir: radyo kapalıyken tüketim açık durumun yüzde biri ile ikisi arasına iner, karşılığında gelen trafik baz istasyonunda bekler.
Hücre seni tanıdı, kartını doğruladı ve sana zaman dilimi ayırdı. Peki bütün bu trafik hangi frekansta gidiyor, ve o frekansı kim dağıtıyor?
Bölüm 31: Spektrum ve Kuşaklar
Telefonun bir hücreye bağlandı ve trafiğin akmaya başladı. Hangi frekansta aktığını söylemedim.
Frekans sınırlı bir kaynak. Bir bandı kullanmak, o bandın sahibinden izin almak demek. Peki sahibi kim?
Frekansı kim dağıtıyor?
Radyo spektrumu ulusal bir varlık sayılıyor ve sahibi ülkenin kendisi oluyor. Bandın hangi hizmete açılacağına ulusal hükûmet karar veriyor. Aynı frekans iki ülkede iki ayrı işe tahsis edilmiş olabiliyor.
Bu yüzden bir üst kat var. ITU Telsiz Tüzüğü dünyayı üç bölgeye ayırıyor ve tahsis tabloları bölgeden bölgeye değişiyor. Türkiye Bölge 1’de, Amerika kıtası Bölge 2’de. Bir bandın hücresel hizmete açılması işte bu ölçekte bir karar. WRC-27’nin 1.2 numaralı gündem maddesi 6,425 ile 7,125 GHz arasını ve 10 ile 10,5 GHz arasını tartışıyor.

Ülke içinde dağıtımı düzenleyici kurum yapıyor; Türkiye’de bu işi BTK yürütüyor. IMT hizmetleri için yapılan yetkilendirme ihalesi 26 Ağustos 2015’te sonuçlandı ve hizmet 1 Nisan 2016’da başladı. Baz istasyonu seni tanıyıp çekirdek ağa bağlıyordu; o bağlantının hangi frekansta kurulduğuna karar veren zincir buraya kadar uzanıyor.
Kullanım hakkının verilme biçimi üçe ayrılıyor ve üçü ayrı bir bedelle geliyor.
| kullanım | kim yayın yapabilir | bedeli |
|---|---|---|
| lisanslı | ihaleyi kazanan tek sahip | bant parayla alınır |
| paylaşımlı | öncelikli kullanıcı yokken herkes | öncelikli gelince çekilirsin |
| lisanssız | güç sınırına uyan herkes | girişimi kimse engellemez |
Lisanslı bantta tek sahip var ve o sahip tipik olarak bir hücresel operatör. Başka kimse orada yayın yapmadığı için operatör girişimi kendi ağının içinde tutuyor. 3,5 GHz civarındaki paylaşımlı bant ise özel 5G kurulumlarına örnek: bir fabrika lisans satın almadan kendi hücresel ağını burada kurabiliyor.
Lisanssız bant herkese açık ama kuralsız değil. Kuralların ilki verici gücüne konan sınır. Bedelini de ödüyorsun: 2,4 GHz’te mikrodalga fırınla bebek telsizinin işareti seninkine karışıyor ve bunu engelleyen kimse yok.
Lisanssız bantta çözüm, girişimi önlemek yerine ondan kaçmak oluyor. Bluetooth bunu açıkça yapıyor. 2,4 ile 2,5 GHz arasını 1 MHz’lik 79 kanala bölüyor. Her zaman diliminden sonra başka bir kanala atlıyor. Girişim yapan cihaz tek bir kanalı tutuyorsa, atlama dizisinde o kanala ara sıra denk geliyorsun. Bozulan çerçeve bir sonraki dilimde başka bir frekanstan gidiyor.
Bandın içi nasıl bölünüyor?
Spektrum üç basamaklı bir hiyerarşi. Bant içinde birden çok kanal var, her kanalın içinde de birden çok alt kanal.
Kanal dediğimiz şey, taşıyıcı frekansın çevresinde ortalanmış belirli bir bant genişliği. Bant genişliği burada birebir bandın genişliği demek: sinyalin kapladığı frekans aralığının Hz cinsinden eni. Aynı terimi gecikme bileşenlerini ayırırken saniyede taşınan bit sayısı diye ölçmüştük. Aynı kelime, iki ayrı büyüklük.
Bandı kanallara bölmek fiziğin değil düzenlemenin işi. 2,4 GHz bandı ülkeye göre 11 ile 14 arası kanala bölünüyor; sayının ülkeden ülkeye değişmesi bunu kanıtlıyor.
Kanalı büyütmek doğrudan komşusundan yer almak demek. 2,4 GHz’in üç örtüşmeyen kanalını ve 5 GHz’in 23 kanalını saymıştık. Yanlarına genişliklerini yazınca fark ortaya çıkıyor: üç kanal 60 MHz eder, yirmi üç kanal 460 MHz. Aynı 20 MHz’lik kalıpla 5 GHz bandı 7,7 kat daha fazla yer veriyor.
İlan edilen genişliğin tamamı da veriye gitmiyor. Komşu kanallar birbirine karışmasın diye aralarına koruyucu bant bırakılıyor. O boşluk hiçbir veri taşımadan bandın bir kısmını yiyor.
Sayıya dökelim. 10 MHz’lik bir hücresel kanal 50 kaynak bloğuna bölünüyordu. Her blok frekansta 180 kHz yer tutuyor. Elli blok 9 MHz eder. İlan edilen genişliğin %90’ı veriye gidiyor; kenarda kalan 1 MHz koruyucu bandın bedeli.
İlk iki basamağı kendi makinende görebilirsin. Linux’ta tek komut menzildeki her ağı frekansıyla birlikte listeliyor:
nmcli -f SSID,CHAN,FREQ,SIGNAL device wifi listFREQ sütunu taşıyıcı frekansı megahertz cinsinden veriyor, CHAN ise aynı taşıyıcının bant içindeki kanal numarasını. Üçüncü basamak o çıktıda görünmüyor; alt kanalları yalnızca radyonun kendisi biliyor.
Hücresel tarafta aynı işi modem yöneticisi görüyor ve tek satır yetiyor:
mmcli -m 0Çıktı modemin bağlandığı operatörü, kullandığı erişim teknolojisini ve o an üstünde durduğu bandı yazıyor. Kanalı Wi-Fi’da sen seçiyorsun. Hücresel bantta o seçimi şebeke yapıyor.
İki yön aynı spektrumu nasıl paylaşıyor?
Kanalları saydık ama bir soruyu atladım: aynı anda hem gönderip hem alman gerekiyor. Bu iki yön spektrumu nasıl bölüşüyor?
İki cevap var ve ikisi de bu kitapta tanıdık bir ayrımın tekrarı — frekansta mı bölersin, zamanda mı?
Frekans bölmeli çift yönlülük (FDD) iki ayrı bant kullanıyor: biri upstream, biri downstream (aşağı yön). İkisi arasında bir de çift yönlülük boşluğu bırakılıyor, çünkü kendi vericinin kendi alıcını sağır etmemesi gerekiyor. Kazancı gerçek eşzamanlılık; bedeli spektrumun çift olarak tahsis edilmesi ve bölüşümün sabit kalması.
Zaman bölmeli çift yönlülük (TDD) tek bir bant kullanıyor ve yönler sırayla konuşuyor. İki kazancı var. Birincisi eşleştirilmemiş spektrum yetiyor — ki yüksek bantlarda bulunan neredeyse hep budur. İkincisi ve daha önemlisi, bölüşüm ayarlanabilir: trafik indirme ağırlıklıysa zaman dilimlerinin dörtte üçünü downstream’e verirsin.
Bu ikinci nokta kablo şebekesinin derdinin tam çözümü. Orada upstream ile downstream arasındaki bölüşüm spektrumun içine donanımla gömülü ve değiştirmek için her yükseltece kamyon çıkması gerekiyor. TDD’de aynı bölüşüm bir yazılım ayarı.
Bedava değil. TDD’de komşu baz istasyonlarının saatleri birbirine kilitli olmak zorunda: biri yayın yaparken öteki aynı frekansta dinliyorsa, komşusunun sinyali kendi alıcısını boğar. Bu yüzden TDD şebekeleri GPS ya da benzeri bir zaman kaynağıyla senkronize çalışır ve komşu operatörler bölüşüm desenini bile birbirine uydurmak zorunda kalır. FDD böyle bir koordinasyon istemiyordu.
Kuşakların tercihi de buradan okunuyor: alt bantlarda eski FDD tahsisleri sürüyor, 5G’nin orta ve yüksek bantları ise ezici çoğunlukla TDD. Eşleştirilmiş spektrumun kıt ve pahalı olmasının sebebi de bu.
Yukarı çıkmanın bedeli ne?
Radyo sinyali yayıldıkça güç kaybediyor. Sebebi bir engel değil; sinyal gittikçe daha geniş bir alana yayılıyor. Yol kaybı frekans ile mesafenin çarpımına bağlı büyüyor. Kaybın formülünü 48. bölüme bırakmıştım; burada yalnızca sonucunu kullanıyorum.
Sonuç şu. 3,5 GHz yerine 26 GHz kullanmak aynı mesafede yaklaşık 55 kat daha fazla yol kaybı demek. Aynı kaybı korumak istersen menzil 7,43 kat kısalıyor, yani %13,5’e iniyor: 1 km yerine 135 m. Kapsanan alan yarıçapın karesiyle orantılı olduğu için aynı coğrafi alanı örtmek yaklaşık 55 kat daha fazla hücre istiyor. Fatura doğrudan direk sayısına yazılıyor.
Elindeki cihaz bu hesabı kurtarmıyor. Bir mobil cihazın tipik azami verici gücü 250 mW, yani 24 dBm. Bant yükseldikçe bu sayı büyümüyor. Kaybı aynı ölçekte yazalım: 55 kat 17,4 dB’ye karşılık geliyor. Gücün sabitken bu farkı anten kazancından ya da kısalan mesafeden bulmak zorundasın.
Sektör bantları üç sınıfta konuşuyor. Bu üçlü ayrım kesin bir standart değil, sektörün konuşma dili.
| sınıf | frekans | menzil | tipik hız |
|---|---|---|---|
| düşük bant | 1 GHz altı | 16 km ve üzeri | 50-250 Mbit/s |
| orta bant | 1-6 GHz | 8 km mertebesinde | 100-900 Mbit/s |
| yüksek bant | 25-66 GHz | 1,6 km altı | 3 Gbit/s’e yakın |
Düşük bantta uzağa gitmenin bedeli doğrudan hızdan ödeniyor. Orta bant ikisini dengeliyor ve 1,8 GHz ile 3,3-3,8 GHz arası bu aralığın en çok kullanılan yeri. Yüksek bandın adı milimetre dalga; 26, 40, 50 ile 66 GHz bu aralıkta yaygın olan bantlar. Adın kendisi bir ölçüden geliyor ve hesabı basit. Dalga boyu, ışık hızının frekansa bölümü. Işık saniyede 300.000 km gidiyor; 26 GHz’te dalga boyu 11,5 mm çıkıyor, 71 GHz’te 4,2 mm’ye iniyor. Aynı bölme 3,5 GHz’te 86 mm veriyor. Milimetre dalga görüş hattı istiyor, yani ağaç ve bina arkasına geçemiyor. Wi-Fi da bunu denedi: 60 GHz’te çalışan 802.11ad 7 Gbit/s’e ulaşıyor ve odadan çıkamadığı için yaygınlaşamadı.
Aynı bedeli evinde de ödüyorsun. 2,4 GHz’te yayın yapan bir access point kapalı alanda onlarca metre, açık alanda bunun birkaç katı kadar kapsıyor. 5 GHz’te yapılan yayın duvar gibi engellerce daha fazla emiliyor ve aynı cihazın kapalı alandaki kapsaması düşük kalıyor.
Cetvelin neresinde duruyoruz?
Sektörün konuşma dilinin karşısında bir de belge dili var. 3GPP TS 38.104 frekans aralıklarını isimlendiriyor: FR1 410 MHz ile 7,125 GHz arasını, FR2 ise 24,25 GHz ile 71 GHz arasını kapsıyor. Sınırlar belirtimde 5.1-1 numaralı çizelgede duruyor ve hepsi megahertz cinsinden yazılı: 410 MHz’ten 7.125 MHz’e, 24.250 MHz’ten 71.000 MHz’e. İki aralığın arasında bir boşluk kalıyor ve o boşluğun adı sonradan kondu. 7,125-24,25 GHz dilimi FR3, yani üst orta bant. 6G tartışmalarında “altın bant” diye anılan yer burası.
O sıfat bir hesabın kısaltması. Yol kaybı karşılaştırmasını 10 GHz için tekrarlayalım: 3,5 GHz’e göre 8,2 kat kayıp çıkıyor, 26 GHz’teki 55 katın yerine. Aynı kaybı korursan menzil 1 km yerine 350 m oluyor. 26 GHz’te 135 m’ye inmişti. FR3 kapasiteyi mmWave’in fiyatına almıyor.
Genişlikleri yan yana koyunca fark ortaya çıkıyor: FR1’in tamamı 6,715 GHz tutuyor. FR3 tek başına 17,125 GHz, yani FR1’in 2,55 katı. FR2 ise 46,75 GHz eder ve FR1’in yaklaşık 7 katına çıkıyor. Bugünkü hücresel şebekelerin üstünde durduğu aralık, cetvelin en dar ucu.
Kuşakların cetvel üstünde nereye düştüğünü yan yana görelim:
- Tek cetvel, üç aralık. Aynı doğrusal eksende üç aralık yan yana duruyor: FR1 410 MHz ile 7,125 GHz arası, FR3 7,125-24,25 GHz arası, FR2 24,25-71 GHz arası.
- Genişlikler yan yana. FR1'in tamamı 6,715 GHz, FR3 17,125 GHz, FR2 ise 46,75 GHz. Bugünkü hücresel şebekelerin durduğu yer cetvelin en dar ucu.
- Menzil ve hız ters çalışıyor. Aşağıda menzil uzun, hız düşük; yukarıda menzil kısa, hız yüksek. Aynı eksende iki büyüklük birbirinin tersine gidiyor.
- Yukarı çıkmanın faturası. 3,5 GHz yerine 26 GHz seçmek aynı mesafede 55 kat yol kaybı demek; menzil %13,5'e iniyor ve aynı alan için 55 kat hücre gerekiyor.
- Arada kalan boşluk. FR1 ile FR2 arasındaki FR3 hücresel hizmete henüz açık değil. WRC-27'nin 1.2 numaralı gündem maddesi bu boşluğun alt ucunu tartışıyor.
Kuşak atlamak radyo tarafında ne değiştiriyor? En somut karşılığı taşıyıcı genişliğinde görüyorsun. Tek bir taşıyıcının azami genişliği 4G’de 20 MHz, 5G’de 100 MHz: radyoya verilen frekans dilimi 5 kat genişledi. İkincisi alt taşıyıcı aralığı. 4G’de bu aralık tek bir değere, 15 kHz’e sabitlenmişti; 5G onu 15, 30, 60 ve 120 kHz arasında seçilebilir yaptı, çünkü yüksek bantta dar alt taşıyıcı işe yaramıyor.
DerinleşmeKuşakların takvimini kim tutuyor?
Pazarlama “5G” diyor, standart yazan kurumlar başka bir dil konuşuyor. ITU-R kuşakları IMT numaralarıyla anıyor: 3G IMT-2000, 4G IMT-Advanced, 5G IMT-2020. 6G da IMT-2030 çerçevesinde tanımlanacak. Numaradaki yıl bir çıkış günü değildir; çerçevenin hedef yılıdır.
Belirtim tarafını 3GPP yürütüyor ve sürüm sürüm ilerliyor. 5G-Advanced’i taşıyan Release 19, 2026 başında donduruldu. Release 20 çift kulvarlı yürüyor: 5G-Advanced çalışmalarıyla 6G çalışmaları aynı sürümün içinde birlikte gidiyor. İlk normatif 6G sürümü Release 21 olacak ve ASN.1 dondurma hedefi Mart 2029.
Asıl olay o “dondurma” kelimesinde. Bir kuşak, bir lansman gününde başlamıyor; belirtim metni değişmez ilan edildiğinde başlıyor. Üretici çip tasarımını o tarihe göre kilitliyor, operatör yatırım planını o tarihe göre yapıyor. Dondurma olmadan iki üretici aynı belirtimin iki ayrı sürümünü uygular ve ortaya birbiriyle konuşamayan iki cihaz çıkar. Bandın açılması ise ayrı bir takvime, WRC toplantılarına bağlı.
Kuşak dediğimiz şey bu iki takvimin kesiştiği yerde doğuyor. Bir üçüncüsü ulusal: belirtim donsa ve bant tahsis edilse bile hizmet, düzenleyicinin yetkilendirmesini beklemek zorunda. Pazarlama adı en son takılıyor, üstelik çoğu zaman ilk şebeke açıldıktan sonra.
Özet
Peki, ne öğrendik?
- Spektrumun sahibi devlettir: bir bandı kullanmak ulusal bir izne bağlıdır, ve o izin lisanslı, paylaşımlı ya da lisanssız biçimde verilir.
- Lisanssızın bedeli girişimdir: bant bedavadır ama davranış kurallıdır, ve aynı frekansta konuşan cihazları kimse birbirinden ayırmaz.
- Yukarı çıkmak menzil yakar: 3,5 GHz yerine 26 GHz seçmek yol kaybını 55 kat artırır ve aynı alanı örtmek 55 kat hücre ister.
- Kuşak bir frekans dilimidir: 4G’nin 20 MHz’lik taşıyıcısı 5G’de 100 MHz’e çıktı ve alt taşıyıcı aralığı sabit olmaktan çıktı.
Frekansın nereden geldiğini ve neyin karşılığında geldiğini artık biliyorsun. Bandı seçtin, hücreye bağlandın, sonra yürümeye başladın. Peki attığın her adımda bağlandığın hücre değişirken bağlantın neden kopmuyor?
Bölüm 32: Hareketlilik ve Aktarma
Otobüs kalkıyor ve sayfayı yeni açtın. Birkaç yüz metre sonra bağlandığın hücre değişecek, ama isteğin kopmayacak.
Kopmamasının sebebi şans değil. Hücreler arasında el değiştirmek yönetilen bir iş. Peki o devri kim yönetiyor?
Yer değiştirmek adresi neden bozuyor?
Hareketlilik tek bir durum adı taşımıyor; dört kademeli bir yelpaze oluşturuyor ve her kademenin bedeli farklı.
| kademe | ne oluyor | zorluk |
|---|---|---|
| yerinde duruyorsun | hiçbir şey değişmiyor | yok |
| kapanıp başka ağda açılıyorsun | taşınacak oturum yok | düşük |
| aynı sağlayıcının hücreleri arasında geziyorsun | açık oturum taşınıyor | orta |
| sağlayıcı ağları arasında geçiyorsun | oturum ve kimlik birlikte taşınıyor | yüksek |
Yelpazenin kolay ucunda ayakta tutulacak bir şey yok. Cihaz yeni yerde sıfırdan bağlanıyor. Zorluk oturum açıkken yer değiştirmekten doğuyor.
Kökü de adreste. Her IP adresi iki parça taşıyor: birinci parça hangi ağda olduğunu, ikinci parça o ağın neresinde olduğunu söylüyor. Adres yer bilgisi taşıdığı için yer değiştiren, adresini de değiştirmek zorunda kalıyor.
Bu tek başına felaket sayılmaz. Felaket, üstteki katmanın o adrese yaslanmasıyla başlıyor. Bir bağlantı soket four-tuple’ıyla tanınıyordu: kaynak IP, kaynak portu, hedef IP, hedef portu. Four-tuple’ın herhangi bir üyesi değişirse alıcı gelen segmenti aynı sokete yönlendiremiyor. Bağlantı kopmuş sayılıyor.
Somut bir vakaya bakalım. Tarayıcın 203.0.113.9:51820 adresinden 192.0.2.30:443 sunucusuna bağlandı. Başka bir alt ağa geçtiğin anda cihaza 198.51.100.7 düşüyor. Four-tuple’ın ilk üyesi değişti, kalan üçü aynı kaldı. Sunucudaki tabloda bu yeni four-tuple’ın karşılığı yok. Gelen segment bir sokete değil, bir RST yanıtına gidiyor.
Buradan yalnızca iki çıkış var. Ya ağ değişikliği gizler ve üst katman adresin değiştiğini hiç görmez, ya da bağlantı adresle tanınmaktan vazgeçer. Hücresel ağ birinci yolu seçti, QUIC ikinciyi.
Aktarmayı kim başlatıyor?
Aktarma, cihazın ağa bağlanma noktasının değişmesi. Cihaza giden veri akışı kaynak baz istasyonundan hedef baz istasyonuna aktarılıyor. Gerekçesi her zaman zayıflayan sinyal olmuyor. İkinci gerekçe yük: hedef daha az cihaz ve daha az trafik taşıyorsa karar onun lehine çıkabiliyor.

Kararı veren de cihaz değil. Hâlâ bağlı olduğun kaynak baz istasyonu hedefi seçiyor ve ona bir Handover Request iletisi gönderiyor. Cihazın işi ölçmek. Modülasyonu seçen 4 bitlik CQI raporu tanıdık; aynı rapor aktarma kararının da girdisi.
Rapor sürekli bir ölçek taşımıyor, basamaklı bir ölçek taşıyor. 4 bitlik alan 16 ayrı seviye kodluyor. Ölçmenin bir de pil bedeli var. LTE radyosu iletirken ya da almayı beklerken 1000-3500 mW harcıyor. Kapalıyken 15 mW’ın altına iniyor, yani açık hâlin %1 ile %2’si kadar.
Gelen rapor tek başına aktarmayı başlatmaya yetmiyor. Cihaz komşu hücreyi kendi hücresinden bir tık iyi buldu diye karar tetiklenmiyor; komşunun belirgin biçimde iyi olması ve bu üstünlüğün bir süre devam etmesi aranıyor. Aradaki paya histerezis deniyor ve olmadığında iki hücrenin sınırında duran bir telefon aralarında gidip geliyor. Her gidiş gelişte yeni bir aktarma yükü doğuyor; sahadaki adı ping-pong aktarma.
Hedef baz istasyonu, cihaz daha oraya geçmeden radyo zaman dilimlerini ayırıyor ve gereken bilgiyi taşıyan bir HR ACK ile yanıt veriyor. Yer önce hazırlanıyor, cihaz sonra taşınıyor.
Sıranın her adımının bir adı var. Ölçüm raporu, aktarma isteği ve isteğin onayı; ardından cihaza giden RRC yeniden yapılandırma iletisi. Cihazı asıl yerinden oynatan ileti bu. Cihaz yeni istasyona tutununca bir yeniden yapılandırma tamam iletisi dönüyor. Hedef de kaynağa aktarmanın başarılı olduğunu bildiriyor.
Asıl incelik kaynak tarafta. Kaynak baz istasyonu cihaza doğrudan göndermeyi bıraktığı anda elindeki datagramları atmıyor; onları hedefe iletiyor, hedef de radyo kanalından cihaza ulaştırıyor. Cihaz iki istasyon arasında havadayken hedef o veriyi tamponda bekletiyor. Kaybı önleyen şey bu yönlendirme.
Cihaz açısından iş burada bitmiş sayılıyor. Yeni istasyondan gönderebildiği anda aktarma tamamlanmış görünüyor. Oysa çekirdek tarafındaki yol hâlâ eski istasyona bakıyor.
Devrin hangi adımda kimin elinde olduğunu izleyelim:
- Ölçüm raporu gider. Cihaz aldığı referans sinyallerin kalitesini ölçüyor ve kaynak baz istasyonuna 4 bitlik bir kanal kalitesi değeri bildiriyor. Karar bu ölçümle besleniyor.
- Kaynak hedefi seçer. Kararı cihaz vermiyor. Hâlâ bağlı olunan kaynak baz istasyonu hedefi seçiyor ve ona bir Handover Request iletisi gönderiyor.
- Hedef yeri hazırlar. Hedef, cihaz daha gelmeden radyo zaman dilimlerini ayırıyor ve cihaz için gereken bilgiyi taşıyan bir HR ACK ile yanıt veriyor.
- Cihaz el değiştirir. Cihaz kaynaktan ayrılıp hedefe tutunuyor. Kaynak elindeki datagramları atmıyor, hedefe iletiyor; hedef de cihaz gelene kadar onları tamponda bekletiyor.
- Çekirdek yolu değiştirir. Radyo tarafı bitince tünelin ucu yeni baz istasyonuna çevriliyor. Hedef tamamlandığını bildirince kaynak taraf ayırdığı radyo kaynaklarını serbest bırakıyor.
Bu sıranın ne kadar sık tekrarlandığını hücrenin boyutu belirliyor. Yukarı bantlar kapsamayı daraltıyordu; hücre küçüldükçe aynı yolda daha çok aktarma oluyor. 300 m yarıçaplı, yani 600 m çaplı bir hücreyi 5 km/sa hızla yürüyen biri 432 saniyede, yani 7,2 dakikada kat ediyor. Aynı hücre 100 km/sa giden bir araç için 21,6 saniyeye iniyor.
Bağlantı koparak mı devrediliyor, kopmadan mı?
Aktarmanın nasıl yapıldığının iki klasik cevabı var ve aralarındaki fark tek bir sözcükte: sıra.
Sert aktarma (break-before-make) önce eski bağı bırakır, sonra yenisini kurar. Arada kısa bir boşluk oluşur. Basit, ucuz ve tek bir radyo yeter — cihaz aynı anda iki hücreyle konuşmak zorunda değil. Bedeli o boşluk.
Yumuşak aktarma (make-before-break) tersini yapar: yeni bağ kurulmadan eskisi bırakılmaz. Geçiş süresince cihaz iki hücreyle birden konuşur ve aynı veriyi iki yoldan alır. Boşluk yoktur; karşılığında cihaz iki radyo zinciri, şebeke de iki kat kaynak ayırmak zorundadır. 3G’nin kod bölmeli tasarımı bunu ucuza yapabiliyordu, çünkü komşu hücreler aynı frekansı kullanıyordu.
LTE ve 5G sert aktarmaya döndü — ama boşluğu neredeyse görünmez kılarak. Hazırlığın tamamı kesinti başlamadan önce yapılıyor:
- Cihaz komşu hücrelerin sinyal gücünü sürekli ölçüp kaynak baz istasyonuna raporluyor.
- Kaynak, hedef baz istasyonuyla doğrudan konuşup yer ayırtıyor. İki baz istasyonu arasındaki bu arayüzün adı LTE’de X2, 5G’de Xn — trafik çekirdek ağa hiç uğramıyor.
- Kaynak, cihaza “şu hücreye geç” komutunu yolluyor.
- Cihaz yeni hücreye bağlanırken, kaynakta biriken paketler hedefe tünellenerek aktarılıyor. Böylece geçiş anında sırada bekleyen veri kaybolmuyor.
Kalan kesinti tipik olarak on milisaniyeler mertebesinde ve bir görüşmede duyulmuyor. Ama hâlâ sıfır değil, ve en kritik anda — sinyal zayıfken — o komutun cihaza ulaşması gerekiyor. 5G bunun için üçüncü bir yol getirdi: koşullu aktarma. Şebeke hedefi ve tetikleyici koşulu önceden cihaza veriyor, cihaz koşul sağlandığında komut beklemeden kendisi geçiyor. Karar anındaki gidiş-dönüş tamamen ortadan kalkıyor.
Çekirdek neden yerinde duruyor?
Radyo tarafı değişirken sabit duran bir taraf var. Her cihaza bir UPF atanıyordu; o UPF cihazla internet arasında röle gibi çalışıyor ve trafiği N3 arayüzünde tünelliyordu. İnternetin gördüğü sabit nokta orası.
Aktarmada değişen şey de cihazın adresi değil, o tünelin ucu. Radyo tarafı bittikten sonra SMF, UPF’ye tünelin ucunu yeni hedef baz istasyonu olacak biçimde değiştirmesini söylüyor. Hedef, aktarmanın tamamlandığını kaynağa bildirince kaynak taraf ayırdığı radyo kaynaklarını serbest bırakıyor.
Çekirdek yarısının da kendi ileti sırası var. Hedef istasyon çekirdeğe bir yol değiştirme isteği yolluyor, çekirdek PDU oturumunu güncelliyor ve isteği onaylıyor. Eski yola en sonda bir veri sonu işareti düşüyor. O işaretten sonra o tünelden veri gelmiyor. Kaynak istasyona giden son ileti cihaz bağlamını kapatıyor.
Adres vererek bakınca daha keskin. Cihazın adresi 203.0.113.9, UPF’nin adresi 198.51.100.5, kaynak baz istasyonu 198.51.100.20 ve hedef istasyon 198.51.100.21. İnternetteki gönderen 192.0.2.30 olsun. İki zarfı yan yana koyalım:
önce dış zarf: 198.51.100.5 -> 198.51.100.20 iç zarf: 192.0.2.30 -> 203.0.113.9
sonra dış zarf: 198.51.100.5 -> 198.51.100.21 iç zarf: 192.0.2.30 -> 203.0.113.9İç zarfta tek bir bayt bile oynamıyor. Gönderen tarafta bu devri gösteren hiçbir iz yok.
Tünelin ucu neden hep aynı kutuda kalıyor? Çünkü UPF yalnızca röle değil. Politika uygulaması, yasal dinleme, trafik kullanım ölçümü ve hizmet kalitesi denetimi de orada yürüyor. Bunların hepsi akışın tamamını tek noktadan görmeyi istiyor. Çapayı oynatmak, bu dört işi birden taşımak demek olurdu.
Zaman çizgisi bu yüzden iki yarıya bölünüyor: önce radyo erişim ağındaki ayrılma ve tutunma, sonra çekirdekteki yol değiştirme. Cihaz için kesinti yalnızca ilk yarıdaki ayrıl-tutun aralığı.
Cihazın nerede olduğunu AMF takip ediyor: sen hücre değiştirirken ağa tutunmanın ve erişim yetkinin sürmesinin kaydını o tutuyor. Bir operatörde tek bir çekirdek ağ çok sayıda radyo erişim ağına hizmet ediyor.
Yelpazenin en zor ucunda sağlayıcı da değişiyor. Hücresel dünyada kimliğin bir kullanıcı adı taşımıyor, bir abonelik taşıyor: parasını ödediğin bir ev ağın var ve seni asıl tanıyan orası. Karşılaştırmayı ev tarafı yapıyor ve ziyaret edilen ağa yalnızca anchor key gönderiliyordu. 5G’nin getirdiği fark tam burada: 4G’de aynı karşılaştırma ziyaret edilen ağın kendisinde yapılıyordu.
Wi-Fi aynı sorunu neden ucuza çözüyor?
Hücresel tarafın bunca iş yapmasının sebebi, sorunu üçüncü katmanda çözmek zorunda olması. 802.11 bir bağ katmanı standardı ve dolaşımı da o katmanda ele alıyor. Üst katmanlar olan bitenden habersiz kalıyor.
Genişletilmiş hizmet kümesinin içinde access point değiştirirken IP adresi değişmiyordu; komşuya geçmek yalnızca ilişkilendirmeyi yenilemek demek. Dolaşımı hızlandıran üç ek çalışma grubunun kendi tarihi var: 802.11k-2008 komşu ölçümünü, 802.11r-2008 hızlı yeniden kimlik doğrulamayı, 802.11v-2011 ise ağın cihaza aday access point önermesini getirdi.
Bu iddiayı kendi makinende birkaç komutla doğrulayabilirsin. Windows’ta netsh wlan show interfaces, Linux’ta iw dev wlan0 link bağlı olduğun access point’i yazıyor:
SSID : kampus-ag
BSSID : 00:1a:2b:3c:4d:5eBinanın öbür ucuna yürü ve komutu tekrarla. SSID satırı aynı, BSSID satırı başka. ipconfig ya da ip addr ile baktığında IPv4 adresin de değişmemiş olacak.
Ucuzluğun sınırı da burada. Alt ağın kenarını geçtiğin anda adresin değişiyor ve bağ katmanının hilesi bitiyor.
Adres değişince bağlantı neden ölmüyor?
İkinci çıkış yolu bağlantıyı adresten koparmak. QUIC bağlantıyı four-tuple’la değil bir bağlantı kimliğiyle tanıyordu ve buna bağlantı göçü deniyordu. Kimliğin birincil işi, alt katmanlardaki adres değişikliklerinin paketleri yanlış uca göndermesini engellemek.
Kimliğin bir de boyu var. QUIC sürüm 1’de bağlantı kimliği en çok 20 bayt tutuyor. Daha uzununu gören uç paketi düşürmek zorunda.
Değişikliklerin hepsi kasıtlı da değil. NAT yeniden bağlama, aradaki kutunun akışa yeni bir çıkış portu ya da yeni bir çıkış adresi vermesiyle oluyor. Uç, karşı tarafın adresinde herhangi bir değişiklik sezerse yol doğrulaması yapmak zorunda.
Yol doğrulaması, yeni adresten gelen paketlerin sahte kaynak taşımadığını sınıyor. Gönderen, tür kodu 0x1a olan PATH_CHALLENGE çerçevesinin 8 baytlık veri alanına 64 bitlik rastgele bir değer koyuyor. Alıcı aynı veriyi taşıyan bir PATH_RESPONSE üretmek zorunda. Datagram ayrıca en az 1.200 bayta genişletiliyor, böylece yeni yolun bu boyutu taşıyabildiği de sınanmış oluyor. Gerçek yük datagramın %0,67’si, kalanı dolgu.
Göç serbest de değil. El sıkışma doğrulanmadan göç başlatılamıyor ve başlatma sorumluluğu istemcide. Sunucu, bir istemci adresinden yoklama dışı paket görmeden o adrese yoklama dışı paket göndermiyor. Bu sınama tek yönü kanıtlıyor; ters yönü karşı taraf kendi başına yapıyor.
Doğrulama bitince uç, tıkanıklık denetleyicisini ve gidiş-dönüş süresi kestiricisini yeni yol için başlangıç değerlerine sıfırlamak zorunda. Tek istisna yalnızca portun değiştiği durum; o genelde NAT yeniden bağlamasıdır ve eski durum korunabiliyor. Bir kural daha var. Uç, birden fazla yerel adresten gönderirken aynı bağlantı kimliğini yeniden kullanamıyor. Sebep gizlilik: sabit bir kimlik, pasif bir gözlemcinin iki ayrı ağdaki etkinliği aynı kişiye bağlamasına izin verirdi.
DerinleşmeMobil IP yirmi yıl uğraştı, QUIC nasıl bu kadar ucuza çözdü?
Ağ katmanının bu soruya verdiği eski cevabın adı mobil IP ve çekirdek fikri iki adres. Ev adresi, düğüm internete nereden bağlanırsa bağlansın değişmiyor. Ziyaret adresi ise düğümün o an bulunduğu yeri gösteriyor. Üst katman ev adresini görüyor, ağ ziyaret adresini kullanıyor.
Bunu yürütmek için ağda iki yeni rol gerekiyordu. Ev aracısı, düğümün ev ağındaki bir yönlendirici; düğüm evden uzaktayken datagramları ona tünelleyerek ulaştırıyor. Yabancı aracı ise ziyaret edilen ağdaki yönlendirici ve kayıtlı düğüme yönlendirme hizmeti veriyor. İkisi de altyapı demek: çözümün çalışması için yolun her iki ucundaki yönlendiricilerin bu işi bilmesi gerekiyor.
QUIC’in kolaylığı zekâsından değil, durumun nerede durduğundan geliyor. Bağlantı durumu uçlarda; ağdaki hiçbir kutunun bir şey bilmesi gerekmiyor. Üstelik QUIC’te güvenilirlik, tıkanıklık denetimi, kimlik doğrulama ve şifreleme durumu tek bir gidiş-dönüşte kuruluyor. Yani bağlantıyı yeniden kurmanın bedeli zaten bir gidiş-dönüş, ve bağlantı göçü o bedeli de ödememeyi sağlıyor.
Özet
Peki, ne öğrendik?
- Hareketlilik bir yelpaze: kapalı cihazı taşımak bedava, açık oturumu taşımak pahalı, ve pahalı olanın kökü adresin yer bilgisi taşımasıdır.
- Aktarmayı kaynak yönetir: hedefi seçen ve isteği gönderen kaynak baz istasyonudur, cihaz yalnızca ölçüm raporu üretir.
- Yer önce hazırlanır: hedef radyo dilimlerini cihaz gelmeden ayırır ve kaynak biriken datagramları atmak yerine hedefe iletir.
- Çekirdek yerinde durur: aktarmada değişen şey UPF’ye giden tünelin ucudur, cihazın adresi değil.
- Bağlantı kimliği adresin yerini alır: QUIC bağlantıyı four-tuple’la tanımadığı için adres değişse de bağlantı yaşar, ama yeni yol önce doğrulanır.
Yer değiştirirken bağlantının neden ayakta kaldığını artık iki ayrı katmanda izleyebiliyorsun. İkisinin de dayandığı şey aynı: cihazın elinde bir adres olması. Telsiz de olsan telli de olsan bağlandın; peki bağlanır bağlanmaz aldığın o adresi sana kim verdi?
Bölüm 33: Adres Kiralama: DHCP
Bir önceki durakta hücreden hücreye geçtin ve bağlantın kopmadı. O bağlantının dayandığı adresi sana kimin verdiğini ise erteledim.
Adresi veren bir sunucu var. Verirken yalnızca adresi söylemiyor; ağdan çıkış kapısını da aynı cevaba koyuyor. Peki adresi olmayan bir makine o cevabı nasıl isteyebiliyor?
Adresi elle yazmaktan neden vazgeçildi?
Adres makineye iki yoldan geliyor: ya elle bir yapılandırma dosyasına yazıyorsun, ya da makine ağa katıldığı anda ağdaki bir sunucudan alıyor.
Elle yazmak tek satırlık bir iş de değil. Dört alanı birden doldurman gerekiyor: IP adresi, alt ağ maskesi, default gateway ve DNS sunucusu. Üçünü doğru girip birini yanlış girdiğinde makine yarım çalışıyor — arızası da en can sıkıcı türden, çünkü bazı şeyler yürüyor. DHCP bu dördünü tek cevapta dağıtır.
Dinamik adreslemenin üç tarihsel uygulaması var: RARP, BOOTP ve DHCP. Sonuncusu BOOTP’nin gelişmiş hâli ve paket biçimini ondan devraldı. BOOTP diski olmayan makineler için tasarlanmıştı ve sunucuda her makine için önceden bir kayıt açmayı şart koşuyordu. DHCP o şartı kaldırdı. Yerine yeniden kullanılabilir adres dağıtımını ve ek yapılandırma seçeneklerini koydu. Standardı 1997 yılında yayımlanan RFC 2131’dir ve o belge kendinden önceki tanımı geçersiz kılar.
Dağıtılan adresler bir adres havuzundan gelir. Havuz sunucuda elle tanımlanır ve ağın tamamı kadar geniş olmak zorunda değildir. Örnek bir ev ağı düşün: 192.168.42.0/24 bloğunda makinelere verilebilecek 254 adres var. Havuza .100 ile .199 arasını verirsen 100 adres dağıtılabilir hâle gelir, yani kullanılabilir adreslerin %39,4’ü. Kalanı statik yapılandırmaya kalır.
Bir de zincirin ucu var. Adres dağıtan sunucunun kendi adresi statiktir, çünkü adres dağıtan makinenin adresini kimse dağıtamaz.
Dört mesaj neden dört?
Kiralama dört mesajdır: DHCPDISCOVER, DHCPOFFER, DHCPREQUEST ve DHCPACK. İki taraf da iki kez konuşur.
İlk mesaj bir yayındır, çünkü istemci sunucunun adresini bilmez. Hedef IP adresi 255.255.255.255 olur, hedef MAC adresi FF-FF-FF-FF-FF-FF. En baştaki adres hiçbir makineye verilmez ve anlamı “bu ağdaki herkes”tir.
İstemci kendi adres alanına 0.0.0.0 yazar ve adresini bilmediğini paketin içinde açıkça ilan eder. İstekle cevabı eşleştiren şey bu yüzden adres olamaz. Eşleştirmeyi 4 baytlık rastgele bir işlem kimliği yapar, alanın adı xid.
Taşıma tarafında DHCP, UDP kullanır. İstemciden sunucuya giden mesajlar 67 numaralı porta, sunucudan istemciye dönenler 68 numaralı porta gider. İki ayrı port, cevabın da yayın olarak dönebilmesi içindir.
İkinci mesajda sunucu havuzdan bir adres seçer ve teklif eder. Teklifin içine kendi kimliğini de koyar. Sunucunun verdiği adresi taşıyan alanın adı yiaddr, açılımı “senin adresin” ve genişliği 4 bayt.
Üçüncü mesaj kabuldür ve o da yayındır. Aynı ağda teklif veren başka sunucular varsa reddedildiklerini duymak zorundadır. Dördüncü mesaj geldikten sonra adres kiralanmış olur.
Dört mesajın sırasını ve her birinin ne taşıdığını görelim:
0.0.0.0, hedef alanına 255.255.255.255 yazıyor. İki uç durum aynı pakette: kimliği olmayan biri, adresi olmayan bir alıcıya sesleniyor.- Adresi olmayan makine herkese sesleniyor. İstemci sunucunun adresini bilmiyor, kendi adresi de yok. Kaynak alanına
0.0.0.0, hedef alanına255.255.255.255yazıyor. İki uç durum aynı pakette: kimliği olmayan biri, adresi olmayan bir alıcıya sesleniyor. - Sunucu bir adres teklif ediyor. Havuzdan bir adres seçip
yiaddralanına — açılımı "senin adresin" — yazıyor ve kendi kimliğini de ekliyor. Bu henüz bir kira değil, bir teklif; istemci başka sunuculardan da teklif almış olabilir. - Kabul de yayın gidiyor, ve sebebi var. İstemci hangi teklifi kabul ettiğini yayınla ilan ediyor. Aynı ağdaki öteki sunucuların, ayırdıkları adresi havuza geri koyabilmek için reddedildiklerini **duymaları** gerekiyor. Tekli gönderim bu haberi taşıyamazdı.
- Onay geliyor, kira başlıyor. Dördüncü mesajla adres artık istemcinin. Yanında maske, varsayılan geçit, ad sunucuları ve kira süresi de geliyor — hepsi numaralı seçenekler hâlinde.
İlk iki adım her zaman gerekmez. İstemci önceki adresini hatırlıyor ve onu tekrar kullanmak istiyorsa dörtlünün başını atlayıp doğrudan DHCPREQUEST’ten başlar. İki mesaj kısalır.
Mesajın türü başlıkta durmaz. Tanımlı 8 tür, 53 numaralı seçenekte tek bayt olarak taşınır.
| kod | mesaj | ne yapar |
|---|---|---|
| 1 | DHCPDISCOVER | istemci ağda sunucu arar |
| 2 | DHCPOFFER | sunucu bir adres teklif eder |
| 3 | DHCPREQUEST | istemci teklifi kabul eder |
| 4 | DHCPDECLINE | teklif edilen adres kullanımda çıktı |
| 5 | DHCPACK | kira onaylanır |
| 6 | DHCPNAK | sunucu isteği reddeder |
| 7 | DHCPRELEASE | istemci adresi geri bırakır |
| 8 | DHCPINFORM | adres var, yalnızca ayar isteniyor |
Reddin anlamı dardır. İstemcinin elindeki adres yanlıştır, örneğin başka bir alt ağa taşınmıştır, ya da kirası bitmiştir.
Seçenekler yalnızca tür taşımaz. Her yapılandırma parçası numaralı bir seçenektir, ve istemci istediği numaraları bir liste hâlinde sayar.
| numara | seçenek | taşıdığı |
|---|---|---|
| 1 | alt ağ maskesi | ağın sınırı |
| 3 | yönlendirici | varsayılan geçidin adresi |
| 6 | DNS sunucusu | ad çözecek sunucunun adresi |
| 51 | kira süresi | kiranın ömrü |
| 53 | mesaj türü | dörtlünün hangi adımı |
| 54 | sunucu kimliği | teklifi kimin verdiği |
| 55 | parametre isteği | istemcinin istediği numaralar |
Sıralamanın da bir kuralı var. Cevapta hem maske hem geçit varsa maske önce gelmek zorundadır. Geçit seçeneği tercih sırasına dizilmiş bir yönlendirici listesi taşıyabilir; ev ağında liste tek satırlıktır.
DerinleşmeHer mesajda boş giden 192 bayt neden hâlâ orada?
DHCP mesajının seçeneklerden önceki sabit kısmı 236 bayttır ve bu biçim BOOTP’den devralındı. Alanların çoğu o günün sorunlarına göre ölçüldü, bugünün sorunlarına göre değil.
En görünür artık, istemcinin MAC adresini taşıyan alan. Ona 16 bayt ayrılmıştır, oysa bir Ethernet adresi 6 bayttır. Her mesajda 10 bayt boş gider. Alan geniş tutulmuştu, çünkü BOOTP yazıldığında bağ katmanı adreslerinin hepsi altı sekizli değildi.
İkinci artık daha büyük: sunucu adı alanı 64 bayt, açılış dosyası alanı 128 bayttır. İkisi birlikte 192 bayt tutar ve sabit başlığın %81,4’üdür. İkisi de disksiz açılış içindir; hangi sunucudan hangi dosyanın çekileceğini yazarlar. Evdeki bir telefon için o alanların tamamı baştan sona boştur.
Boyutun bir de tavan hikâyesi var. Sabit kısmın üstüne asgari 312 baytlık seçenek alanı gelince 548 bayt eder. 8 baytlık UDP başlığı ile 20 baytlık IP başlığı da eklenince toplam tam 576 bayta oturur. O sayı keyfi seçilmedi. Bir IP makinesinin kabul etmek zorunda olduğu en küçük datagram odur, yani mesaj en kısıtlı makinede bile parçalanmadan geçecek biçimde ölçülmüştür.
Adres neden kiralık?
Adres kalıcı değildir. Kiralanır. Kira yenilenebilir, cihaz kapanınca adres havuza döner. “Kira” burada bir benzetme de sayılmaz; standardın kendi terimidir.
Kira süresi 51 numaralı seçenekte 32 bitlik bir sayı olarak gelir. Diyelim ki ev yönlendiricin 24 saatlik kira veriyor. İstemci sürenin bitmesini beklemez, iki zamanlayıcı tutar. İlki sürenin %50’sinde, ikincisi %87,5’inde dolar.
İlk zamanlayıcı dolunca istemci yenileme durumuna geçer ve adresi veren sunucuya tek hedefli bir istek yollar. İkincisi dolunca yeniden bağlanma durumuna geçer ve artık herhangi bir sunucuya yayın yapar. İki kademenin sebebi basit: adresi veren sunucu ölmüş olabilir.
Örneğimizde ilk zamanlayıcı 12. saatte, ikincisi 21. saatte dolar. Geriye üç saatlik bir tampon kalır.
Zamanlayıcılar tam bu değerlerde de kurulmaz. Standart, sabit değerin etrafına rastgele bir sapma eklenmesini ister. Sebebi ölçek: aynı anda kiralanan bütün adresler aynı anda yenilenmek isterse sunucu tek seferde boğulur. Sapma bunu dağıtır.
Aynı kaygı açılışta da var. İstemci ilk mesajı göndermeden önce 1 ile 10 saniye arasında rastgele bekler. Elektrik geldiğinde evdeki bütün cihazların aynı saniyede konuşmasını engelleyen şey bu bekleme.
Cevap gelmezse istemci pes etmez. Yeniden gönderim gecikmesi 4 saniyeden başlar, her denemede ikiye katlanır ve 64 saniyede tavan yapar. Beşinci denemeye kadar geçen toplam bekleme 60 saniyedir.
Adresin gerçekten boş olduğunu iki taraf da ayrı ayrı sınar. Sunucu teklif edeceği adresi bir ICMP yankı isteğiyle yoklayabilir, çünkü havuzda boş görünen adres ağda kullanılıyor olabilir. İstemci de teklif edilen adres için bir ARP isteği yayınlar; cevap gelirse adres kullanımdadır ve reddini göndermek zorundadır.
Adres kesinleşince istemcinin son bir işi kalır. Bedava ARP komşuların eski kayıtlarını temizletiyordu; makine yeni adresini duyurmak için tam onu yapar.
Sunucunun da istemciye verdiği iki söz vardır. Kira boyunca adresi başkasına vermez, ve aynı istemciye her seferinde aynı adresi vermeye çalışır. İkincisi bir garanti değil, bir gayrettir.
Evdeki kutu kaç iş yapıyor?
Evdeki kutu tek cihaz gibi görünür. İçinde dört ayrı iş vardır.
Modem, kablo ya da DSL hattını sayısal veriye çevirir. Yönlendirici paketleri ağlar arasında iletir; güvenlik duvarı ve adres çevirisi de onun tarafındadır. Anahtar kablolu portları birbirine bağlar. Access point kablosuz tarafı taşır. Dördünü tek kasada birleştirmek bir üretim tercihidir, protokol zorunluluğu değil.

Katman karşılıkları da farklıdır. Yönlendirici ağ katmanında, anahtar bağ katmanında, ağ kartı ile tekrarlayıcı fiziksel katmanda çalışır. Ev kutusu üç katmanda birden iş görür. Yıldız topolojinin merkezine bir cihaz konuyordu; evdeki kutu tam o merkezde durur. İlişkilendirme tek bir access point’le kuruluyordu; o access point de aynı kasanın içindedir.
Adres dağıtan sunucu da genelde ayrı bir makine değildir. Yönlendiricinin içinde durur ve yönlendiricinin bağlı olduğu bütün alt ağlara hizmet eder.
Geçit görevini de yönlendirici üstlenir. Default gateway, bir bilgisayarın paketlerini başka bir alt ağa iletmek için kullandığı adrestir. Makinelerin de yönlendirme tablosu vardır ama ağa bağlı tek yönlendirici varsa seçilecek bir şey yoktur, ve ev ağının hâli tam budur.
Tablonun ilk satırı varsayılan yoldur: hedefi eşleşmeyen bütün paketler geçidin adresine iletilir. Windows’ta bu tabloyu route print ile görürsün. Öteki satırların nereden geldiğini yönlendiricinin içine indiğimizde açacağım.
Geçit tanımlanmadığında belirti nettir. Makineler birbirine ulaşır, ağın dışıyla iletişim başarısız olur. Geçide bloğun ilk kullanılabilir adresini vermek zorunlu değil ama yaygın bir alışkanlıktır. Örnek ağımızda geçit 192.168.42.1 adresinde oturur.
IANA üç bloğu özel adres bloğu olarak yerel ağlara ayırmıştır: 10/8, 172.16/12 ve 192.168/16. Bu adresler internette yönlendirilmez. Dışarı çıkarken bu adreslerin nasıl geçerli birer adrese çevrildiğini burada bırakıyorum; çeviri tablosuyla birlikte açacağım.
Hiçbir sunucu cevap vermezse makine boş kalmaz. 169.254.0.0/16 bloğundan kendine bir adres uydurur; bunun adı bağ-yerel adresleme, yaygın adı APIPA. Ekranda o adresi görmek, kiralamanın hiç gerçekleşmediğini söylemenin başka bir yoludur.
Kiranın kimden alındığını kendi makinende görebilirsin. Windows’ta ipconfig /all çıktısı IP adresini, MAC adresini, DNS sunucusunu ve adresi veren sunucuyu birlikte listeler. Yönlendirici tarafında show dhcp lease kiralanmış adreslerin tablosunu döker. Yakalama filtresi yazmayı öğrenmiştin; aynı araç bu dört mesajı hâlâ eski adıyla, bootp diye ayırır.
Özet
Peki, ne öğrendik?
- Adres iki yoldan gelir: ya elle yazılır ya da ağa katılma anında bir sunucudan alınır, ve ikinci yol dört alanı birden doldurur.
- Kiralama dört mesajdır: istemci yayınla arar, sunucu teklif eder, istemci yine yayınla kabul eder, sunucu onaylar.
- Tür seçenekte taşınır: mesajın hangi adım olduğunu 53 numaralı seçenekteki tek bayt söyler, başlıktaki ayrı bir alan değil.
- Adres kiralıktır: istemci ilk zamanlayıcıda kendi sunucusuna, ikincisinde herhangi bir sunucuya dönerek kirayı tazeler.
- Ev kutusu dört iştir: modem, yönlendirici, anahtar ve access point aynı kasada birleşmiştir, ve default gateway olarak yazılan adres o kasanındır.
Artık makinen adresi nereden aldığını ve dışarı çıkarken hangi kapıya yöneleceğini biliyor. Geriye tek bir soru kalıyor. Paketin hedefi elinde; makinen o hedefin bu ağda olmadığına nasıl karar verdi?
Bölüm 34: Adresin Anatomisi
Ev yönlendiricisi sana bir adres, bir maske ve bir default gateway vermişti. Maskeyi kullanmadan bıraktım.
Makinen hedefin bu ağda olmadığını işte o maskeyle anladı. Yaptığı iş tek bir şeyden ibaret: iki sayıyı karşılaştırmak. Peki neyi neyle karşılaştırıyor?
Bir adres kaç parçadan oluşur?
IPv4 adresi aslında tek bir sayı. Uzunluğu 32 bit, yani 4 bayt. Kimse otuz iki basamaklı bir ikili diziyi gözüyle okuyamadığı için adres 8 bitlik dört parçaya bölünüp noktayla ayrılıyor. Her parçanın adı oktet.
Bir oktet 256 farklı değer taşır: en küçüğü 0, en büyüğü 255. Üst sınır keyfi bir seçim değil, sekiz bitin tamamının bir olması: 11111111. Okteti 256 olan bir adres hiçbir arayüze girmez.
Dört oktet tek bir isim taşımıyor. Adres iki bilgiyi birden söylüyor: makinenin hangi ağda olduğunu ve o ağın içindeki yerini. İlkine ağ parçası, ikincisine makine parçası deniyor.
Posta kodunu düşün. Kod mektubu doğru dağıtım merkezine götürür, kapı numarası o merkezin içinde tek bir kapıyı bulur. IP adresi aynı iki işi tek bir sayıya sıkıştırıyor: ağ parçası merkezi söylüyor, makine parçası kapıyı. Benzetme şurada biter: posta kodu ile kapı numarası zarfın üstünde ayrı ayrı yazılıdır, IP adresinde ise tek bir sayı vardır ve sınırın nereye düştüğünü adres sana söylemez.

Bu dört oktet, kapsüllemede üçüncü zarfın başlığına, kaynak ve hedef alanlarına yazılıyor. MTU o zarfın boyunu sınırlar, içindeki adresin yapısına karışmaz.
Sınırı kim çiziyor?
Sınırı söyleyen şey alt ağ maskesi. Maske de 32 bittir ve dört okteti vardır. Ama bir adres değildir. Hiçbir makineye atanmaz, hiçbir paketin üstüne yazılmaz.
Maskenin deseni serbest de değil. Solda kesintisiz bir dizi bir, sağda kesintisiz bir dizi sıfır bulunur. Birler ağ parçasını işaretler, sıfırlar makine parçasını. Bu kural yüzünden bir maske oktetinde topu topu dokuz ondalık değer görünebilir.
0 128 192 224 240 248 252 254 255Adresle maskeyi buluşturan işlem bitsel VE. Adresin her biti maskedeki karşılığıyla eşleşir ve maskenin sıfır olduğu her yerde sonuç sıfırlanır. Geriye yalnızca ağ parçası kalır. Çıkan değerin adı ağ adresi.
Somut bir vaka kuralım. Örneği ev ağından belge blokuna taşıyorum; alt ağa bölmeyi 203.0.113.0/24 üstünde göstermek daha temiz. Belgelemeye ayrılmış o bloktan 203.0.113.70 adresini alıyorum, maskeyi de 255.255.255.192 seçiyorum.
adres 203.0.113.70 11001011 00000000 01110001 01000110
maske 255.255.255.192 11111111 11111111 11111111 11000000
--------
VE 203.0.113.64 11001011 00000000 01110001 01000000Hesabın tamamı son oktette olup bitiyor: 70 ile 192’nin VE’si 64. İlk üç oktet maskede baştan sona bir olduğu için olduğu gibi geçiyor. Şimdi aynı adresi daha kısa bir maskeden geçir. 255.255.255.0 ile sonuç 203.0.113.0 çıkar. Adres değişmedi, maske değişti, ağ değişti.
Aynı adresi iki farklı maskeden geçirince ne olduğunu görelim:
- Adres dört oktete bölünüyor. 203.0.113.70 tek bir 32 bitlik sayı. Noktalar sayının içinde yok; okunabilsin diye 8 bitlik dört parçaya bölünüp yazılıyor.
- /24 maskesi altına iniyor. Maskenin ilk üç okteti tamamen bir, sonuncusu tamamen sıfır. Birlerin bittiği yer ağ parçasının bittiği yer.
- Bitsel VE ilk ağı veriyor. Maskenin sıfır olduğu her bit sıfırlanıyor, geriye 203.0.113.0 kalıyor. Son oktetin tamamı makineye ayrılmış durumda.
- Maske /26 olarak uzuyor. Aynı adres, farklı maske. Son oktette iki bit daha ağa geçiyor ve sınır oktetin ortasına düşüyor: 11000000, yani 192.
- Sonuç başka bir ağ. 70 ile 192 arasındaki VE işlemi 64 veriyor ve ağ adresi 203.0.113.64 oluyor. Adres hiç değişmedi, ağ değişti.
Makine bu işlemi her paket için iki kez yapıyor. Önce hedef adresi kendi maskesinden geçiriyor, sonra kendi adresini aynı maskeden. İki sonuç eşitse hedef aynı ağdadır ve çerçeve doğrudan ona yazılır. Eşit değilse paket varsayılan geçide çıkar.
Bir önceki durağın borcu tam burada kapanıyor. Adresi 203.0.113.70/26 olan makine 198.51.100.9 numaralı hedefe paket yazacak. Hedefi kendi maskesinden geçirince 198.51.100.0 buluyor, kendi ağı ise 203.0.113.64. İkisi eşleşmiyor. Çerçeve bu yüzden geçide, yani 203.0.113.65 adresine yazılıyor.
Aynı hesap daha eski bir borcu da kapatıyor. Makine ARP’ı yalnızca kendi ağındaki komşular için soruyordu. Kimin komşu sayılacağına karar veren işlem buydu.
Sınır bazen çok yakından geçer. 203.0.113.130 aynı maskeden 203.0.113.128 olarak çıkıyor ve bu değer 203.0.113.64 ile eşit değil. İki makine kâğıt üstünde komşu görünse de aynı alt ağda değil.
Her ağın iki adresi baştan gider. Makine bitlerinin tamamı sıfır olan değer ağ adresidir, tamamı bir olan değer yayın adresidir. Atanabilir ilk adres ağ adresinden bir sonraki, son adres yayın adresinden bir öncekidir.
Kartın fabrikadan gelen adresi ve bütün komşuları birden uyandıran yayın adresi tanıdık. Buradaki yayın adresi onun üçüncü kattaki karşılığı. Geçide ağ adresinden sonraki ilk adresi vermek ise bir kural değil. Yerleşmiş bir gelenek, çoğu ağda öyle bulursun.
Bir bloğu nasıl bölersin?
Maskeyi noktalı ondalık yazmak yerine kaç bitinin bir olduğunu söylemek daha kısa. Eğik çizgili gösterimin tamamı bu: /20 demek, maskenin ilk 20 biti bir ve kalan 12 biti sıfır demek. Çizgiden sonraki sayının adı önek uzunluğu.
RFC 4632 yazımı sabitliyor: dört oktetlik bir değer, eğik çizgi, sonra sıfır ile otuz iki arasında bir tam sayı. Tanımlı önek uzunluğu sayısı böylece 33 oluyor.
Alt ağ kurmak, makine bitlerinden bir kısmını ödünç bit olarak ağ parçasına almaktır. Ağ bitleri hiç değişmez; uzayan şey maskedir. Denklem sabit: ağ bitleri artı ödünç bitler artı makine bitleri 32 eder.
Bütün alt ağ hesabı iki formüle iniyor. b ödünç alınan bit sayısı, h geriye kalan makine bit sayısı olsun:
alt ağ sayısı = 2^b
alt ağ başına adres = 2^h
atanabilir adres = 2^h − 2Sondaki iki, her alt ağın yuttuğu ağ adresi ile yayın adresi. Üç formülden yalnızca ikisini ezberlemek yeter, üçüncüsü çıkarma.
Tersinden de çalışıyor ve sahada asıl kullanılan yön bu: elinde makine sayısı var, önek arıyorsun. “Bana 50 adres lazım” dediğinde 2^h − 2 ≥ 50 eşitsizliğini sağlayan en küçük h değerini bulursun. h=5 için 30, yetmiyor; h=6 için 62, yetiyor. Önek 32 − 6 = /26.
Son okteti kullanan öneklerin tamamı tek bir merdivene sığıyor ve bu merdiveni akılda tutmak alt ağ hesabının yarısıdır:
| önek | maske | blok büyüklüğü | toplam | atanabilir |
|---|---|---|---|---|
| /24 | 255.255.255.0 | 256 | 256 | 254 |
| /25 | 255.255.255.128 | 128 | 128 | 126 |
| /26 | 255.255.255.192 | 64 | 64 | 62 |
| /27 | 255.255.255.224 | 32 | 32 | 30 |
| /28 | 255.255.255.240 | 16 | 16 | 14 |
| /29 | 255.255.255.248 | 8 | 8 | 6 |
| /30 | 255.255.255.252 | 4 | 4 | 2 |
| /31 | 255.255.255.254 | 2 | 2 | 2 |
| /32 | 255.255.255.255 | 1 | 1 | 1 |
Merdiven her satırda ikiye bölünüyor: maskeye bir bit eklemek blok büyüklüğünü yarıya indiriyor. Sağdaki iki sütunun /31 ve /32 satırlarında birbirine eşit olmasının ayrı bir hikâyesi var; ona birazdan geleceğiz.
203.0.113.0/24 bloğunu dört parçaya bölmek istiyorsun. Dört parça 2 bit ödünç almak demek. Yeni önek /26 ve maske 255.255.255.192 oluyor. Makine parçası 6 bit kalıyor, yani her alt ağda 64 adres var ve bunun 62’si atanabilir.
Sınırları ikili yazmadan bulmanın kısayolu blok büyüklüğü. Maskenin son oktetteki değerini 256’dan çıkarırsın: 256 eksi 192, 64. Alt ağlar son oktette 64’er adımla ilerler.
| alt ağ | ağ adresi | atanabilir aralık | yayın adresi |
|---|---|---|---|
| 1 | 203.0.113.0 | .1 - .62 | 203.0.113.63 |
| 2 | 203.0.113.64 | .65 - .126 | 203.0.113.127 |
| 3 | 203.0.113.128 | .129 - .190 | 203.0.113.191 |
| 4 | 203.0.113.192 | .193 - .254 | 203.0.113.255 |
Aynı hesap başka bir blokta da yürüyor. 198.51.100.0/24 sekiz parçaya bölünürse önek /27 olur, maske 255.255.255.224 çıkar ve blok büyüklüğü 32’ye iner. Her parçada 30 atanabilir adres kalır.
Bölmenin bir bedeli var. Tek bir /24 bloğunda 256 adresin ikisi kaybolur; kayıp oranı %0,8’de kalır. Aynı blok dört /26’ya ayrılınca kayıp sekize çıkar ve oran %3,1 olur.
Bedel en uçta çıplak görünür. İki yönlendiriciyi bağlayan noktadan noktaya bir hat için /30 kullanılır ve dört adresin yalnızca ikisi işe yarar. Verim %50.
Bu israfın bir çaresi var ve merdivenin sondan ikinci satırında duruyor. RFC 3021, noktadan noktaya hatlarda /31 kullanmayı serbest bırakıyor. Mantığı şu: ağ adresi ile yayın adresi ancak bir alt ağda “ötekiler” varken anlamlıdır. Bir hattın iki ucu varsa yayın yapmaya gerek yok — karşı taraf zaten tek bir makine. Öyleyse iki adresi de arayüze verebilirsin ve verim %50’den %100’e çıkar. Bir operatörün binlerce hattı olduğunda kazanılan adres sayısı ciddi. Merdivenin son satırındaki /32 ise bir ağ değil, tek bir makineye giden bir yol; geri döngü arayüzlerinde ve yönlendirme tablosunda karşına çıkacak.
Bir tasarım problemi: aynı blok, dört farklı beden
Şimdiye kadar blokları hep eşit parçalara böldük. Gerçek bir ağda departmanlar eşit büyüklükte olmuyor ve eşit bölmek adres israf ediyor. Çözümün adı değişken uzunluklu maske (VLSM): aynı blok içinde farklı öneklere sahip alt ağlar kurmak.
Elinde 192.168.10.0/24 var ve dört ihtiyaç bekliyor:
| bölüm | gereken makine |
|---|---|
| Satış | 50 |
| Muhasebe | 25 |
| Depo | 10 |
| İki yönlendirici arası hat | 2 |
Kural tek: en büyükten başla. Küçükten başlarsan büyük blok için hizalı bir yer kalmaz, çünkü her alt ağ kendi büyüklüğünün katı olan bir adreste başlamak zorunda.
Satış, 50 makine. 2^6 − 2 = 62 ≥ 50, önek /26, blok 64. İlk boş adres .0. → 192.168.10.0/26, kullanılabilir .1-.62, yayın .63.
Muhasebe, 25 makine. 2^5 − 2 = 30 ≥ 25, önek /27, blok 32. İlk boş adres .64 ve 64, 32’nin katı — hizalı. → 192.168.10.64/27, kullanılabilir .65-.94, yayın .95.
Depo, 10 makine. 2^4 − 2 = 14 ≥ 10, önek /28, blok 16. İlk boş adres .96, 16’nın katı. → 192.168.10.96/28, kullanılabilir .97-.110, yayın .111.
Hat, 2 adres. 2^2 − 2 = 2, önek /30, blok 4. İlk boş adres .112. → 192.168.10.112/30, kullanılabilir .113-.114, yayın .115.
Sonuç tabloya döküldüğünde:
| bölüm | ağ | aralık | yayın | boşa giden |
|---|---|---|---|---|
| Satış | 192.168.10.0/26 | .1 - .62 | .63 | 12 |
| Muhasebe | 192.168.10.64/27 | .65 - .94 | .95 | 5 |
| Depo | 192.168.10.96/28 | .97 - .110 | .111 | 4 |
| Hat | 192.168.10.112/30 | .113 - .114 | .115 | 0 |
Geriye 192.168.10.116 ile 192.168.10.255 arası, yani 140 adres boşta kalıyor. Yarın beşinci bir bölüm eklendiğinde yer var.
Şimdi aynı işi eşit bölmeyle yapmayı dene. Dört bölüm için dört alt ağ, yani /26. Satış sığar, ama Depo 62 adreslik bir bloğun içinde 10 makineyle oturur ve 52 adres ölür; iki adreslik hat 60 adres yakar. Toplam boş: 121 adres, ve elinde beşinci bir alt ağ için hiç yer kalmaz. VLSM’in kazandırdığı şey adres değil, gelecekte manevra alanı.
Bir uyarı da düşeyim: VLSM’in çalışabilmesi için yönlendirme protokolünün maskeyi ilanla birlikte taşıması gerekiyor. Taşımayanlar — birazdan göreceğin sınıflı düzenin kalıntıları — aynı ağda iki farklı önek gördüklerinde yanlış karar veriyor. Yönlendirme protokollerini karşılaştırırken bu ayrımı tekrar kullanacağız.
Bölmenin sebebi adres tasarrufu mu?
Alt ağın tanımı aslında topolojik. Arada yönlendirici olmadan birbirine ulaşabilen arayüzler bir alt ağ oluşturur. Adresin yapısı bu fiziksel gerçeği yazıya dökmekten ibaret.
Bölmenin ilk gerekçesi de adres tasarrufu değil, yayın trafiği. Ağ büyüdükçe yayın etki alanı büyür ve bütün makineler yoğun yayının ortasında kalır. İkinci gerekçe yönetim: farklı yerlerdeki bölümler birbirini etkilemez ve tek bir ağ numarası içeriden bölünebilir.
Bu esneklik sonradan kazanıldı. 1990’lardan önce sınırı maske değil, adresin ilk okteti çiziyordu. Üç beden vardı ve arada kalan kurumların hiçbirine uymuyordu. Sınırı sınıftan alıp maskeye taşıyan sınıfsız gösterim bu üç bedeni ortadan kaldırdı; eğik çizgili yazım da oradan geliyor.
DerinleşmeSınıflı adresleme neden battı ve CIDR neyi kurtardı?
Sınıflı düzende maske ezberden okunurdu. İlk oktet 1 ile 126 arasındaysa adres A sınıfıdır ve maskesi 255.0.0.0; 128 ile 191 arasındaysa B sınıfıdır ve maskesi 255.255.0.0; 192 ile 223 arasındaysa C sınıfıdır ve maskesi 255.255.255.0.
Sınıf aslında adresin ilk bitlerine yazılıydı. A sınıfında ilk bit sıfır, B sınıfında ilk iki bit bir-sıfır, C sınıfında ilk üç bit bir-bir-sıfır. 224 ile 239 arası çoklu yayın için D sınıfına, 240 ve üstü deneysel kullanım için E sınıfına ayrılmıştı.
Düzenin kapasitesi tek tabloya sığıyor.
| sınıf | ağ sayısı | ağ başına makine |
|---|---|---|
| A | 126 | 16.777.214 |
| B | 16.382 | 65.534 |
| C | 2.097.150 | 254 |
Can alıcı kusur satırların birinde değil, iki satır arasındaki boşlukta. RFC 4632’nin tespiti açık: C sınıfının 254 adresi çoğu kurum için azdı, B sınıfının 65.534 adresi ise fazlaydı. Arada bir beden yoktu.
Sayıyla bakınca israf görünür oluyor. Üç yüz makinelik bir kuruma B sınıfı verilirse 65.234 adres hiç kullanılmadan o kurumun üstünde kalır. Bloğun %99,5’i çöpe gider.
Yürürlükteki belge RFC 4632: Fuller ve Li imzalı, Ağustos 2006 tarihli, BCP 122 numaralı. Kendinden önce gelen RFC 1519’u yürürlükten kaldırdı.
Bedelini de aynı belge yazıyor. Sınıflar kalkınca adresin ilk bitlerine bakıp maskeyi tahmin etmek imkânsız hale geldi. RFC 4632 bu yüzden maskenin ya da önek uzunluğunun yönlendirme protokollerinde açıkça taşınmasını şart koşuyor. Taşımayan eski protokoller kullanım dışı kaldı.
Genel ders şu: bir kuralı veriye gömdüğün anda, kuralı değiştirmek için veriyi değiştirmen gerekir.
Bölmenin tersi de var. Komşu ağları tek bir kısa önekte birleştirmeye üst ağ oluşturma deniyor; öneki 3 bit kısaltmak sekiz komşu ağı tek satıra indiriyor. RFC 4632’ye göre paket anahtarlamalı bir ağda yönlendirme durumunu küçültmenin bilinen tek yolu bu.
Uzayın her köşesi de bölünmeye açık değil. Dört milyarlık alanın içinden bazı bloklar kesilip özel işlere ayrıldı, ve bir adresin hangi bloğa düştüğünü tanımak arıza ararken ilk adımdır:
| blok | adı | ne demek |
|---|---|---|
10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 | özel kullanım | internete çıkmaz; evindeki adres bunlardan biri |
127.0.0.0/8 | geri döngü | paketi makinenin kendisine gönderir, kabloya hiç çıkmaz |
169.254.0.0/16 | bağ-yerel | adres sunucusu bulunamayınca makinenin kendine seçtiği alan |
100.64.0.0/10 | operatör NAT | abonelerin operatörün içindeki adresleri |
224.0.0.0/4 | çok noktaya yayın | tek bir makineyi değil, bir grubu adresler |
192.0.2.0/24 198.51.100.0/24 203.0.113.0/24 | belgeleme | kitaplarda ve örneklerde kullanılmak üzere ayrıldı |
255.255.255.255 | sınırlı yayın | yalnızca bu ağdaki herkes; yönlendirici geçirmez |
0.0.0.0/8 | “bu ağ” | henüz adresi olmayan makinenin kaynak adresi |
Tablonun altıncı satırı bu kitabın kendisini de açıklıyor: örneklerde hep 203.0.113.x görmenin sebebi, o bloğun tam olarak bunun için ayrılmış olması. Gerçek bir kuruma ait adres yazmak, okurun onu bir hedef sanmasına yol açardı.
Yedinci satırdaki 255.255.255.255 özel bir yayın: hedefi bilinmeyen ilk konuşmalarda kullanılıyor. Makine daha kendi adresi yokken adres sunucusunu arıyordu; o mesajın hedefi tam olarak bu adres, kaynağı ise sekizinci satırdaki 0.0.0.0. İki uç durum aynı anda: adresi olmayan bir makine, kimliği olmayan bir alıcıya sesleniyor.
Bütün bu yapıyı kendi makinende tek komutla görebilirsin. Windows’ta ipconfig adresi ile maskeyi ayrı satırlara yazar; Linux’ta ip -brief addr ikisini birleştirip 203.0.113.70/26 biçiminde tek parça verir. İki çıktı da aynı 32 biti anlatıyor, biri noktalı ondalık maskeyle, öteki önek uzunluğuyla.
Özet
Peki, ne öğrendik?
- Adres tek bir sayıdır: 32 bitlik değer okunabilsin diye 8 bitlik dört oktete bölünür ve noktalı ondalık yazılır.
- Sınırı maske çizer: adres kendi ağ parçasının nerede bittiğini söylemez, bunu yanındaki 32 bitlik desen söyler.
- Karar bitsel VE ile verilir: makine hem hedefi hem kendini aynı maskeden geçirir, sonuçlar eşitse komşudur, eşit değilse paket geçide çıkar.
- Bölmenin bedeli iki adrestir: her alt ağ bir ağ adresi ile bir yayın adresi yutar, dörde bölünen bir blok sekiz adres kaybeder — noktadan noktaya hatlarda /31 bu bedeli sıfırlar.
- Hesap iki formüle iniyor:
2^balt ağ sayısını,2^h − 2alt ağ başına atanabilir adresi verir; sahada bunları tersinden, gereken makine sayısından öneke doğru kullanırsın.- VLSM eşit bölmeyi bırakır: en büyük bölümden başlayıp her alt ağı kendi büyüklüğünün katına hizalarsan, aynı /24 bloğunda dört farklı beden yan yana durur ve geriye manevra alanı kalır.
- Önek uzunluğu maskenin kısaltmasıdır: eğik çizgiden sonraki sayı maskedeki bir bitlerinin adedidir ve sınıfların yerini almıştır.
Adresin anatomisini çıkardık: otuz iki bit, bir maske ve maskenin çizdiği bir sınır. Ama bu düzenin toplamı baştan belli, çünkü 32 bitin alabileceği değer sayısı sabit: 4.294.967.296. Dört milyarı biraz aşan bu havuz bütün dünyaya yetiyor mu?
Bölüm 35: Adres Tükenmesi ve IPv6
Adresi maskeyle ikiye bölüp havuzun toplamını saydın: dört milyarı biraz aşan bir sayı. Yetmedi.
Merkezden dağıtım 2011’de bitti. ICANN elindeki son bloğu bölgesel kayıt kuruluşlarına verdi; o günden sonra yeni adres ancak geri kazanımdan ya da devirden geldi. Peki yerine ne kondu?
Dört cevap, tek büyütme
Adres sıkıntısı 1990’ların ortasında görünür oldu. Sorun soyut bir sayma alıştırması değildi; kurumlar internete açılamadığı için ağın büyümesi fiilen durdu. Tükenmeye dört ayrı cevap üretildi: IPv6, CIDR, özel adresleme ve adres çevirisi. Üçü ömür uzatıyor. Yalnızca biri adres alanını gerçekten büyütüyor.
Büyüten cevap IPv6. Adresi 128 bit, yani IPv4’ün 32 bitine göre dört kat uzun. Alan ise dört kat değil, 2 üzeri 96 kat büyük. Bu çarpan yaklaşık 7,9 çarpı 10 üzeri 28 ediyor ve toplam adres sayısını 3,4 çarpı 10 üzeri 38 civarına çıkarıyor. Adres yalnızca dört kat uzarken alanın katlanarak büyümesinin sebebi bu.
Sürüm numarası neden 5’i atladı? IP sürüm 5 diye bir çalışma vardı ama araştırma aşamasında kaldı ve hiç standartlaşmadı. Numara bu yüzden 4’ten 6’ya sıçradı. Yeni protokolün çalışma adı da IPng’ydi: IP next generation.
Tükenme tek gerekçe değildi. Ağ katmanının akış kavramını tanıyıp farklı akışlara farklı davranması istendi. Gerçek zamanlı uygulamalar için başarım yetersizdi, güvenlik protokole sonradan eklenmişti, yönlendirme tabloları şişiyordu. IPv6’yı tasarlayanların önünde tek bir sorun yoktu; birikmiş bir demet vardı.
Yürürlükteki belirtim RFC 8200. Temmuz 2017 tarihli, STD 86 numarasını taşıyor ve kendinden önceki belirtimi geçersiz kılıyor. İlk sürümü ise Aralık 1995 tarihini taşıyordu. Otuz yaşını geçmiş bir protokolden söz ediyoruz. Değişen tek şey ağ katmanı oldu; uygulama ve fiziksel katman aynı kaldı, o yüzden tarayıcı ya da kablo değiştirmek gerekmiyor.
Kırk baytta ne var?
Sabit başlık 40 bayt ve alanları hep aynı yerde duruyor. Yönlendirici her pakette başlık uzunluğunu yeniden hesaplamak zorunda kalmıyor.
Version 4 bit değeri 6
Traffic Class 8 bit IPv4'teki hizmet türü alanının karşılığı
Flow Label 20 bit aynı akışa ait datagramların etiketi
Payload Length 16 bit sabit başlıktan sonra gelen bayt sayısı
Next Header 8 bit zincirdeki bir sonraki başlığın numarası
Hop Limit 8 bit her düğümde bir azalan sayaç
Kaynak adres 128 bit
Hedef adres 128 bit40 baytın 32 baytı, yani %80’i, yalnızca iki adres. IPv4’te aynı oran %40’tı: 20 baytlık başlıkta 8 bayt adres. Başlık iki katına çıkarken adres alanı dört katına çıktı.
Next Header, IPv4’teki Protokol alanıyla aynı değer kümesini kullanıyor: 6 TCP, 17 UDP, 58 ICMPv6, 44 parçalama başlığı. Zincirin halkalarını bağlayan alan bu.
Hop Limit, IPv4’teki yaşam süresi alanının devamı. Sıfıra düşen paket yolda atılıyor ama hedefin kendisi sıfır gördüğü paketi atmıyor. Ad değişikliği dürüst: alan hiçbir zaman saniye saymıyordu, sıçrama sayıyordu. Terimi sıçrama sınırı diye sabitliyorum.
Payload Length’in kapsamı IPv4’teki Toplam Uzunluk’tan dar: Toplam Uzunluk kendi başlığını da sayıyordu, bu alan saymıyor. Akış etiketi aynı akışa ait datagramları işaretliyor ama akışın kesin tanımı yok. Alan duruyor, ortak kullanım sözleşmesi zayıf.
Başlığın hikâyesi ekleme değil, çıkarma. Checksum, parçalama alanları ve seçenek alanı sabit başlıktan çıktı. Parçalama yol üstünde değil kaynakta yapılıyor ve MTU zarfın boyunu sınırlıyordu. Yerlerini bir zincir aldı.
Uzatma başlığı altı türde sayılıyor: hop-by-hop seçenekleri, hedef seçenekleri, yönlendirme, parçalama, kimlik doğrulama ve şifreli yük. Hop-by-hop seçenekleri yol üstündeki her yönlendirici için, hedef seçenekleri yalnızca varış düğümü için. Parçalama da artık bir alan değil, Next Header değeri 44 olan ayrı bir başlık.
Alt sınır da tabana yazıldı. IPv6 her bağdan en az 1.280 baytlık MTU istiyor; daha dar bir bağ parçalamayı kendi altındaki katmanda halletmek zorunda. Asgari MTU’da yüke kalan yer 1.240 bayt ve uzatma başlığı eklendikçe bu pay daralıyor. Ayarlanabilir bağlar için tavsiye 1.500 bayt, sebebi de açıkça tünelleme.
Sekiz grup, iki nokta üst üste
128 bit onluk yazılınca okunmuyor. Adres bu yüzden 16’şar bitlik sekiz gruba bölünüyor, gruplar iki nokta üst üste ile ayrılıyor ve onaltılık yazılıyor. Her onaltılık basamak dört bit taşıdığı için her grup dört basamak.
Kural olmasa aynı adresin birkaç geçerli yazımı olurdu ve karşılaştırma metin düzeyinde bozulurdu. Yazım bu yüzden tek biçime bağlandı. Kurallar kısa. Baştaki sıfırlar atılır, harfler küçük yazılır, en uzun ardışık sıfır dizisi çift iki noktaya iner. Tek bir sıfır grubu için çift iki nokta kullanılmaz. İki dizi eşit uzunluktaysa baştaki kısaltılır.
2001:0db8:0000:0000:0000:0000:0000:0042 -> 2001:db8::42
2001:0db8:0000:0000:00ff:0000:0000:0001 -> 2001:db8::ff:0:0:1İlk satırda 39 karakterlik gösterim 12 karaktere iniyor. İkinci satırda iki sıfır dizisi eşit uzunlukta, bu yüzden baştaki kısalıyor ve ikincisi açık kalıyor. İki yazım da aynı 128 biti anlatıyor.
Adresin ilk 64 biti alt ağı, son 64 biti o bağdaki arayüzü gösteriyor. Yönlendirme ilk yarıya bakıyor, teslim ikinci yarıya. Alt ağa bölmedeki posta kodu benzetmesi burada da yürüyor: ilk yarı posta kodu, ikinci yarı kapı numarası. Benzetme şurada biter: posta kodunda sınır anlaşmayla kayabilir, burada tam ortadan geçer.
Klasik yöntemde arayüz kimliği, Değiştirilmiş EUI-64 biçimiyle 48 bitlik MAC adresinden türetiliyor. Kartın fabrikadan gelen adresi tanıdık; makinenin IPv6 adresinin yarısı orada, kartın üstünde yazıyor.
Tek bir /64 alt ağ 2 üzeri 64 arayüz taşıyor. Bu yaklaşık 1,8 çarpı 10 üzeri 19 eder ve IPv4’ün tamamından 4.294.967.296 kat geniştir. Bir /56 önek 256, bir /48 önek 65.536 adet /64 alt ağa bölünüyor. Ev kullanıcısının elinde bile birden çok alt ağ oluyor.
Türü de adresin başı söylüyor. Adresin ilk birkaç bitine bakmak, onun ne işe yaradığını tablodan okumaya yetiyor:
| önek | tür | ne demek |
|---|---|---|
2000::/3 | genel tekli yayın | internette yönlendirilen adres |
fe80::/10 | bağ-yerel | yalnızca bu kabloda geçerli; yönlendirici geçirmez |
fc00::/7 | benzersiz yerel | kuruma özel, 10.0.0.0/8 bloğunun karşılığı |
ff00::/8 | çoklu yayın | bir grubu adresler; sonraki dört bit kapsamı verir |
::1/128 | geri döngü | makinenin kendisi |
::/128 | belirsiz | henüz adresi olmayan makinenin kaynak alanı |
64:ff9b::/96 | NAT64 öneki | içine bir IPv4 adresi gömülür |
2001:db8::/32 | belgeleme | bu kitaptaki örnekler bu bloktan |
Çoklu yayın adresinin dördüncü onaltılık basamağı kapsamı taşıyor ve bu, IPv4’te olmayan bir denetim: ff02::1 yalnızca bu bağdaki herkes, ff05::1 bu siteyi, ff0e::1 ise küresel kapsamı gösteriyor. Bir yayının nereye kadar gideceği artık adresin içinde yazılı.
Önek uzunlukları da bir hiyerarşi kuruyor ve sayıları akılda tutmak kolay: bölgesel kayıt kuruluşu operatöre genelde /32 verir, operatör bir kuruma /48, ev abonesine /56, ve her alt ağ /64 olur. Ev kullanıcısının elinde 256 alt ağ bulunmasının sebebi budur.
IPv6’da yayın adresi yok. Kartın adresinde yayının aslında çoklu yayının özel hâli olduğunu görmüştük; IPv6 o özel hâli tümden attı. Yayının işini çoklu yayın devraldı: herkesi uyandıran çağrı yerine yalnızca ilgili grubu uyandıran çağrı var. Bir de yeni bir tür geldi. Aynı hizmet adresi birçok kenar sunucuda ayakta tutulabiliyordu; anycast IPv6’da bir adres türü olarak tabana yazıldı.
Makine kendi adresini nasıl buluyor?
Durumsuz otomatik yapılandırma ne elle ayar ister ne de ayrı bir sunucu. Yönlendirici öneki ilan ediyor, makine arayüz kimliğini kendi üretiyor, adres ikisinin birleşimi oluyor. Kısa adı SLAAC.
Bağ-yerel adres, fe80:: öneki ile arayüz kimliğinin birleştirilmesiyle üretiliyor ve başka bir bağa iletilmiyor. Yönlendirici olmasa bile makine komşularıyla konuşabiliyor. İlişkilendirme biter bitmez kart ağa katılıyordu; bağ-yerel adres tam o anda, kimseye sorulmadan hazır oluyor.
Adres kullanılmadan önce çakışma denetiminden geçmek zorunda. Kısa adı DAD. Makine adresi önce geçici sayıyor ve bu adres başkasında mı diye soruyor. Kural SLAAC’a özel değil; DHCPv6 ya da elle ayar fark etmiyor. DHCPv6 rakip de değil: hangi adresin kimde olduğunu sıkı denetlemek isteyen ağ onu seçiyor, ikisi aynı anda da çalışabiliyor.
Komşu keşfi beş ICMPv6 mesajı tanımlıyor: 133 yönlendirici isteği, 134 yönlendirici ilanı, 135 komşu isteği, 136 komşu ilanı ve 137 yönlendirme. ARP tablosu komşunun adresini tutuyordu; onun yerine geçen şey tek bir protokol değil, bu beşli.
Komşu isteği iki iş birden yapıyor. Komşunun bağ katmanı adresini öğreniyor. Bellekteki eşlemenin hâlâ geçerli olduğunu da doğruluyor. İkinci iş ARP’ta yoktu.
Soru bütün ağa da gitmiyor. İstenen düğüm çoklu yayın adresi, hedef adresin son 24 bitinin ff02::1:ff00:0/104 önekine eklenmesiyle kuruluyor. Belgeleme önekinden bir örnek: 2001:db8::1a2b:3c4d adresini arayan çağrı ff02::1:ff2b:3c4d adresine gidiyor. Uyanan düğüm sayısı avuç içi kadar kalıyor.
Ters yönde de bir ilan var. Yönlendirici ilanı hem düzenli aralıklarla hem de istek üzerine gidiyor, içinde önek, sıçrama sınırı önerisi ve bağ parametreleri taşıyor. Makinenin default gateway listesi bu ilanlardan kuruluyor.
İki sürüm aynı kabloda
İnternette bayrak günü yok. Bütün yönlendiriciler aynı gün yükseltilemediği için iki sürüm yan yana yaşamak zorunda. Geçişin zor tarafı teknik değil takvimsel.
Çift yığın bir makine ikisini birden konuşuyor. Bir ismin IPv6 karşılığı AAAA kaydında duruyor ve kaydın tür numarası 28. A kaydı 32 bit taşıyor, AAAA kaydı 128 bit.
İstemci iki soruyu peş peşe soruyor ve önce AAAA’yı gönderiyor. İkisinin de dönmesini beklemiyor. A cevabı önce geldiyse AAAA için 50 ms bekliyor. Bağlantı denemeleri arasındaki varsayılan bekleme 250 ms, alt sınır 100 ms, üst sınır 2 saniye. İlk kurulan bağlantı kazanıyor ve diğerleri iptal ediliyor. Yarışın adı Happy Eyeballs, varsayımı IPv6’yı tercih etmek. Kullanıcı hiçbir şey fark etmiyor.
Yolun ortasında IPv6 konuşmayan bir ağ varsa tünel kuruluyor. Tünelleme, IPv6 datagramını IPv4 datagramının yükü olarak taşımak demek: paketin içinde paket. Tünelde iki adres çifti aynı anda yaşıyor. Dış başlıktaki çift tünel uçlarını gösteriyor, iç başlıktaki çift gerçek kaynak ve hedefi. Çekirdek ağ da kullanıcı trafiğini baz istasyonuna tünelliyordu; zarf değişti, fikir aynı.
Tünel tek çare değil ve bugün mobil şebekelerde asıl kullanılan yöntem başka: çeviri. NAT64 adındaki geçit, IPv6-only bir ağdaki istemciyi IPv4-only bir sunucuya bağlıyor. Yanındaki DNS64 ise numaranın kalbi: istemci AAAA sorduğunda ve karşılığı yoksa, A kaydındaki 32 bitlik adresi alıp 64:ff9b::/96 önekinin içine gömerek sahte bir IPv6 adresi üretiyor.
gerçek IPv4 203.0.113.9
DNS64 üretir 64:ff9b::cb00:7109 (cb007109, 203.0.113.9'un onaltılığı)İstemci bunu sıradan bir IPv6 adresi sanıp bağlanıyor; paket öneki tanıyan NAT64 geçidine düşüyor, geçit gömülü adresi çıkarıp IPv4 tarafına çeviriyor. İstemcinin IPv4 yığını hiç olmadı, ama IPv4 dünyasına erişti.
Bir boşluk kalıyor: DNS64 yalnızca ada bakan uygulamalar için çalışıyor. Bir program IPv4 adresini kod içine gömmüşse ya da doğrudan IPv4 soketi açıyorsa numara işlemiyor. 464XLAT bunu da kapatıyor — cihazın içinde küçük bir çevirici, uygulamanın açtığı IPv4 soketini IPv6’ya çevirip NAT64’e gönderiyor. Bugün telefonunun mobil veri bağlantısı büyük ihtimalle tam olarak böyle çalışıyor: şebeke IPv6-only, uygulamaların çoğu bunu hiç bilmiyor.
Sayı tarafında iş yavaş yürüdü. Google’ın ölçümünde IPv6 üzerinden erişen kullanıcı oranı 2026’da, martın 28’inde, %50,10 oldu ve on sekiz yılda ilk kez yarı aşıldı. Yayılma 25 yılı aştı, hâlâ sürüyor. Aynı sürede uygulama katmanı baştan aşağı değişti: web, sosyal medya, akış, oyun, uzaktan görüşme. Sebebi de bu farkta. Uygulama tek tarafta değişebiliyor, ağ katmanı sürümü herkesin birlikte değişmesini istiyor.
Kendi makinende bakabilirsin. Linux’ta ip -6 addr show fe80:: ile başlayan bağ-yerel adresi ve genel adresi yan yana yazar, Windows’ta ipconfig çıktısında Link-local IPv6 Address satırı durur. ping -6 ve dig AAAA ise karşı tarafın IPv6 konuşup konuşmadığını söyler.
Özet
Peki, ne öğrendik?
- IPv6 adresi 128 bittir: adres dört kat uzadı ama adres alanı 2 üzeri 96 kat büyüdü.
- Sabit başlık 40 bayttır: bu başlığın %80’i iki adrestir ve alanlar hep aynı yerde durur.
- Gösterim tek biçime bağlıdır: baştaki sıfırlar atılır, en uzun sıfır dizisi çift iki noktaya iner, harfler küçük yazılır.
- Adres iki yarıdan oluşur: ilk 64 bit alt ağı, son 64 bit o bağdaki arayüzü gösterir.
- Makine adresini kendi üretir: yönlendirici öneki ilan eder, makine kimliği ekler, çakışma denetimi onaylar.
Adres alanı büyüdü, gösterim sadeleşti ve makine kendi adresini kendi kurdu. Paket artık geçitten çıkmaya hazır. Peki onu ilk alan yönlendirici, hedefe giden yolun tamamını biliyor mu?
Bölüm 36: Yönlendirici Mimarisi
Yolun tamamını bilen bir makine yok. Paketi alan yönlendirici yalnızca bir sonraki adımı biliyor ve kararını o adımda veriyor.
Bu kutuyu şimdiye kadar kapalı tuttum. Kapağını açıyorum: içeride hedefi arayan bir tablo, portları birbirine bağlayan bir doku ve nanosaniyeyle ölçülen bir bütçe var. Karar bu kadar hızlı nasıl çıkıyor?
Yönlendirici içeride kaç iş yapıyor?
Ağ katmanının iki ayrı işi var. Tek bir paketi doğru kabloya itmeye iletme, o kabloyu söyleyen tabloyu doldurmaya yönlendirme demiştim; ikisi kutunun içinde ayrı yerlerde yaşıyor. İletme her kutuda ayrı koşan veri düzleminin işi, yönlendirme ağ çapında çalışan kontrol düzleminin. Bu bölümün konusu birincisi.
Kapağı kaldırdığında dört parça görüyorsun: giriş portları, yüksek hızlı bir anahtarlama dokusu, çıkış portları ve bir yönlendirme işlemcisi. Doku, giriş portlarını çıkış portlarına bağlayan iç ağdır.
Aradaki hız farkı altı basamak. İletme donanımda yapılır ve nanosaniye ölçeğinde çalışır; yönlendirme ile yönetim yazılımdır ve milisaniye ölçeğinde çalışır.
Nanosaniye ölçeği somut bir bütçe demek. En küçük Ethernet çerçevesinin telde gibi 84 bayt yer kapladığını hatırla. 10 Gbit/s’lik bir hatta bu çerçevelerden tam yükte saniyede yaklaşık 14,9 milyon tanesi geçiyor. Paket başına işlem bütçesi 67 ns. Giriş portunun hedefi işini hat hızında bitirmektir; yetişemezse tampon dolar ve paket düşer. Yönlendiricinin içindeki bütün tasarım baskısı bu tek cümleden çıkıyor.
Bütçenin içine sabit bir iş de giriyor. IPv4 başlığındaki alanları tek tek adlandırmıştım; TTL o başlığın 8 bitlik alanıydı. Datagram her yönlendiriciden geçtiğinde bu sayaç bir azalır, sıfırlandığında da atılır. Böylece hiçbir datagram sonsuza dek dolaşamaz. TTL her atlamada değiştiği için 16 bitlik başlık sağlaması da yeniden hesaplanmak zorunda.
Tablodaki bir satır ne söylüyor?
Yönlendirme tablosundaki her satır dört şey taşır: ağ hedefi, alt ağ maskesi, bir sonraki durak ve çıkış arayüzü. Ağ hedefi tek başına kullanılmaz; satırı bir öneke çeviren şey yanındaki maskedir.
Maske bir adresi ağ ve makine parçasına bölüyor, CIDR yazımı da önek uzunluğunu taşıyordu. Tablo aynı ayrımı kullanıyor: her hedef ağ için bir satır vardır, her hedef makine için değil. Datagram hedef ağa bağlı yönlendiriciye ulaştığında dağıtımı o yapar.
Tablonun ilk satırlarını ise kimse yazmamıştır. Yönlendiricinin bir ağa fiziksel olarak bağlı arayüzü varsa o ağa nasıl ulaşacağını zaten bilir; bunlara doğrudan bağlı yollar denir.
Aynı hedefe birden çok satır çıkarsa aradaki farkı metrik açar. Metrik bir yolun kullanım maliyetidir ve genelde atlama sayısıdır. Aynı kaynaktan gelen iki satırı en düşük metrik ayırır; farklı kaynaklardan gelenlerin nasıl elendiğini birazdan göreceğiz.
Bir de her adrese uyan bir satır var. Varsayılan yol, hedefi ve maskesi 0.0.0.0 olan satırla yazılır. Maskesi sıfır olduğu için hiçbir bit eşleşmesi aramaz; önek uzunluğu da sıfırdır. Makinenin varsayılan geçide neden yöneldiğini biliyorsun; ev yönlendiricisinin tablosundaki karşılığı tam olarak bu satır.
Aslında ortada iki tablo var ve adları ayrı. Yönlendirme protokollerinin öğrendiği her şeyin toplandığı, aday yolların yan yana durduğu tabloya RIB deniyor. Karar verilip donanıma indirilen, iletmenin gerçekten baktığı sadeleşmiş kopyaya ise FIB. RIB yazılımda yaşıyor ve büyük olabilir; FIB donanımda duruyor ve her paket için nanosaniyeler içinde okunmak zorunda.
Gerçek bir tablo çıktısında her satırın başında kaynağını söyleyen bir harf durur. C doğrudan bağlı, S elle yazılmış statik demektir. R ve O ise yönlendirme protokollerinden öğrenilmiş satırlardır. Bu satırların oraya nasıl geldiğini burada bırakıyorum; yönlendiricilerin aynı haritada nasıl yakınsadığını birazdan göreceğiz.
Gerçek bir tablo neye benziyor?
Şimdiye kadar tabloyu tarif ettim; artık bakma zamanı. Aşağıdaki çıktı bir kenar yönlendiricinin tablosu ve her satırı okumaya değer:
Gateway of last resort is 203.0.113.2 to network 0.0.0.0
192.0.2.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.0.2.0/24 is directly connected, GigabitEthernet0/0
L 192.0.2.1/32 is directly connected, GigabitEthernet0/0
203.0.113.0/30 is subnetted, 1 subnets
C 203.0.113.0/30 is directly connected, Serial0/0/0
S 198.51.100.0/24 [1/0] via 203.0.113.2
O 10.20.0.0/16 [110/65] via 203.0.113.2, 00:14:22, Serial0/0/0
S* 0.0.0.0/0 [1/0] via 203.0.113.2Baştaki harf satırın nereden geldiğini söylüyor:
| harf | kaynak | yönetimsel uzaklık |
|---|---|---|
C | doğrudan bağlı ağ | 0 |
L | arayüzün kendi adresi, /32 yerel yol | 0 |
S | elle yazılmış statik yol | 1 |
O | OSPF ile öğrenilmiş | 110 |
R | RIP ile öğrenilmiş | 120 |
B | BGP ile öğrenilmiş | 20 / 200 |
Köşeli parantezin içindeki iki sayı da ayrı şeyler söylüyor: soldaki yönetimsel uzaklık, sağdaki metrik. İkisini karıştırmak yaygın bir hata. Yönetimsel uzaklık kaynaklar arasında seçim yapar — aynı ağa hem statik hem OSPF yol geldiyse statik kazanır, çünkü 1 < 110. Metrik ise aynı kaynağın iki yolu arasında seçim yapar. Uzaklık eşit değilse metriğe hiç bakılmaz.
S* satırındaki yıldız o yolun son çare geçidi olduğunu, yani hiçbir satır tutmazsa paketin oraya gideceğini işaretliyor.
L satırı ilk bakışta gereksiz görünüyor: 192.0.2.1/32 zaten 192.0.2.0/24 içinde. Ama ikisi farklı iş yapıyor. /24 satırı “bu ağa çerçeve yazabilirim” derken, /32 satırı “bu adres benim, paketi yukarı ver” diyor. En uzun önek eşleşmesi ikisini kendiliğinden ayırıyor.
Aynı tablonun Linux’taki hâli daha az süslü ama aynı bilgiyi taşıyor:
$ ip route
default via 203.0.113.2 dev eth1 proto static metric 100
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1
198.51.100.0/24 via 203.0.113.2 dev eth1 proto static
203.0.113.0/30 dev eth1 proto kernel scope link src 203.0.113.1proto kernel doğrudan bağlıya, proto static elle yazılana karşılık geliyor. scope link ise “bu hedefe ulaşmak için bir sonraki durak yok, doğrudan komşu” demek — via yazmayan her satır böyle. Windows tarafında aynı tabloyu route print basar.
Bir sonraki durak da aranmak zorunda
Tablodaki via 203.0.113.2 satırına dikkatli bak: bir IP adresi yazıyor, bir arayüz değil. Yönlendirici o paketi kabloya koyabilmek için hangi arayüzden çıkacağını bilmeli, ve bunu ancak 203.0.113.2 adresini tabloda ikinci kez arayarak bulabilir. İşlemin adı özyinelemeli arama.
İkinci arama 203.0.113.0/30 satırına düşüyor, o satır Serial0/0/0 diyor, iş bitiyor. Zincirin doğrudan bağlı bir satırda bitmesi şart; bitmezse yol etkin değil sayılır ve tabloya hiç yazılmaz.
Bunun çok somut bir arıza karşılığı var. Statik bir yol yazdın, komutu kabul edildi, ama show ip route çıktısında satır görünmüyor. Sebebi neredeyse her zaman budur: yazdığın bir sonraki durak adresi, tabloda çözülemiyor. Satır yanlış değil, ulaşılamaz.
Zincirin son halkasında bir arama daha var ve o artık üçüncü katmanda değil. Çıkış arayüzü ile bir sonraki durağın IP adresi belli; kabloya yazılacak çerçevenin hedef MAC adresi ise belli değil. Komşunun donanım adresini soran mekanizma tanıdık. Tek bir paketin iletilmesi bu yüzden üç ayrı aramadan geçiyor: hedef için önek eşleşmesi, bir sonraki durak için özyinelemeli arama, ve komşu için adres çözümlemesi.
Tablo yalnızca yönlendiricilere ait bir şey de değil. Az önce andığım default gateway, ev makinesinde de böyle bir tablonun ilk satırında duruyor.
Aynı adrese üç satır uyuyorsa hangisi kazanır?
Arama merkezde yapılmaz. İletme tablosunun bir kopyası her giriş portunda durur ve port, başlık alanlarına bakıp çıkış portunu kendi başına bulur. Buna merkezsiz anahtarlama denir. Merkezî tek bir arama birimi olsaydı bütün portlara aynı 67 ns’lik bütçeyle yetişmek zorunda kalırdı. Darboğaz hesap değil, tabloya bakma hızıdır. Tabloyu her porta kopyalamak, tek bir birimi N kat hızlandırmaktan ucuza geliyor.

Giriş portundaki işin adı da bellidir: eşleştir ve uygula. Önce tabloda hedefe uyan satır bulunur, sonra o satırın söylediği eylem yapılır.
Eşleştirmenin kuralı tek cümleye sığıyor. Verilen bir hedef adres için tabloda bakarken, adrese uyan öneklerin en uzunu seçilir. Buna en uzun önek eşleşmesi deniyor ve birden çok satırın uyması normaldir. Kazanan, daha çok bit sabitleyen satırdır.
Dört satırlık bir tabloyla bakalım:
| önek | kapsadığı adres | çıkış arayüzü |
|---|---|---|
| 203.0.113.0/24 | 256 | 1 |
| 203.0.113.128/25 | 128 | 2 |
| 203.0.113.160/27 | 32 | 3 |
| 0.0.0.0/0 | hepsi | 0 |
Hedef 203.0.113.170 gelsin. Üç özgül satır da uyar. Son sekizli 170, ikili yazımla 10101010; /25 maskesiyle VE işleminin sonucu 128, /27 maskesiyle 160 çıkar ve ikisi de kendi satırının değeriyle tutar. En uzun önek /27 olduğu için paket üçüncü arayüze gider.
Hedef 203.0.113.140 için sonuç değişir: son sekizli /27 maskesinden geçince 128 çıkar ve satırın 160’ıyla tutmaz, o yüzden kazanan /25 olur. 203.0.113.5 için geriye yalnızca /24 kalır. 198.51.100.7 için hiçbir özgül satır tutmaz ve varsayılan satır devreye girer.
Her ek önek biti kapsanan adres sayısını yarıya indiriyor. Tablo adres aralıklarıyla kurulsaydı, bir aralığın ortasındaki küçük bir kümeyi başka porta göndermek için aralığı parçalara bölmen gerekirdi. En uzun önek eşleşmesi bu bölmeyi gereksiz kılıyor. Özel durumu daha uzun bir önekle yazarsın; genel kural olduğu yerde kalır.
Bir adresin tablodaki hangi satırlara uyduğunu, hangisinin kazandığını izleyelim:
- Adres giriş portuna geliyor. Hedef 203.0.113.170. Karar yalnızca bu adresle tablodaki satırların karşılaştırılmasından çıkıyor; başka hiçbir alana bakılmıyor.
- İlk satır tutuyor. Adresin ilk üç sekizlisi satırınkiyle aynı, yani /24 öneki eşleşiyor. Bu satır tek başına kalsaydı paket birinci arayüzden çıkacaktı.
- İkinci satır da tutuyor. Son sekizli 170, ikili yazımla 10101010. /25 maskesiyle VE işleminin sonucu 128 ve satırın kendi değeriyle aynı; aday sayısı ikiye çıkıyor.
- En uzun önek kazanıyor. 170 sayısının /27 maskesiyle VE sonucu 160 ve o satırla da tutuyor. Üç aday içinde en çok bit sabitleyen /27, karar onun.
- Karar çıkışa dönüşüyor. Paket üçüncü arayüze veriliyor. Alttaki varsayılan satır bu adrese de uyuyordu, ama uzunluğu sıfır olduğu için her yarışı kaybediyor.
Kural belli, ama bütçe hâlâ 67 ns. Tabloda binlerce satır var ve her biri için bir maskeleme, bir karşılaştırma gerekiyor. Bunları tek tek yapmak o bütçeye sığmıyor; sığdıran şey belleğin türü oluyor. En uzun önek eşleşmesi genellikle üçlü içerik adresli bellek ile yapılır. Sıradan bellekte adres verip içerik alırsın; burada içerik verip adres alırsın. Üçlü olmasının sebebi her bitin üç durum taşıyabilmesi: 0, 1 ve umursama. Maskenin donanımdaki karşılığı tam olarak o üçüncü durum. Adresi verdiğinde bütün satırlar aynı anda karşılaştırılır ve cevap tek saat çevriminde çıkar.
Bunun bir bedeli var. Bütün satırları aynı anda karşılaştırabilmek için her satır kendi karşılaştırıcısını taşımak zorunda. Bu yüzden üçlü bellek sıradan bellekten pahalıdır ve her aramada daha çok güç harcar. Fatura satır başına yazılıyor: tablo büyüdükçe kutu da pahalılaşıyor.
Kuralın bir de sınırı var: geleneksel iletme yalnızca hedef adrese bakar, oysa karar başlıktaki başka alanlara da bağlanabilir. Bu genişlemeyi, kontrol düzlemi kutudan söküldüğünde akış kurallarıyla birlikte açacağız.
Paketi çıkışa kim taşıyor?
Anahtarlama hızı, paketlerin girişlerden çıkışlara aktarılabildiği hızdır ve genellikle hat hızının katı olarak ölçülür. N girişli bir yönlendiricide istenen değer hat hızının N katıdır. Dokunun üç ana türü var.
Birincisi bellek üzerinden anahtarlama. İlk kuşak yönlendiriciler sıradan bilgisayarlardı; anahtarlama doğrudan işlemcinin denetimindeydi ve paket sistem belleğine kopyalanıyordu. Her datagram veri yolunu iki kez geçtiği için hızı bellek bant genişliği sınırlıyordu.
İkincisi ortak veri yolu üzerinden anahtarlama. Darboğaz yolun kendisidir: aynı anda tek paket geçebildiği için hız veri yolunun bant genişliğine takılır; buna yol çekişmesi denir. Örnek bir erişim yönlendiricisinde bu tavan 32 Gbit/s’lik bir veri yoludur.
Üçüncüsü ara bağlantı ağı. Büyük bir anahtar, daha küçük anahtarların birkaç aşamasından kurulur; çapraz çubuk ve Clos ağları bu aileye girer. Fikir de yeni değildir, önce çok işlemcili bilgisayarlarda işlemcileri birbirine bağlamak için geliştirilmişti.
Paralelliği kullanmanın bir bedeli var. Datagram girişte sabit uzunlukta hücrelere bölünür, hücreler dokudan geçirilir ve çıkışta yeniden birleştirilir. Doku değişken boyutlu paketi değil, eşit boyda parçaları taşıyor.
Ölçeklenmenin yolu ise dokuyu çoğaltmak. Örnek bir taşıyıcı yönlendiricinin temel birimi 8 anahtarlama düzlemi. Her düzlem üç aşamalı bir ara bağlantı ağı; toplam kapasite yüzlerce Tbit/s’ye çıkıyor.
Kuyruk kutunun neresinde oluşuyor?
Kuyruk kutunun içinde iki ayrı noktada birikebilir ve ikisinin sebebi ayrıdır.
Doku, giriş portlarının toplamından yavaşsa kuyruk giriş tarafında oluşur ve tampon taşarsa gecikme ile kayıp doğar. Bir de çıkış portu çekişmesi var: aynı çıkışa giden iki datagramdan yalnızca biri aktarılabilir, öbürü bekler.
Bekleyen paket kuyruğun önündeyse arkasındakileri de durdurur. Baş engellemesini uygulama katmanında görmüştün; burası aynı kusurun donanımdaki karşılığı. Öndeki paket başka bir çıkış için beklerken, arkasındakinin gideceği çıkış çoktan boşalmış olabilir. Yine de kımıldayamaz.
Çıkış tarafındaki kuyruğun sebebi bunun tersi. Doku hattan hızlı çalışıyorsa datagramlar çıkış portuna, hattın iletim hızından daha hızlı gelir. Orada biriken şey bu hız farkının kendisi.
Tampon dolduğunda iş politikaya dönüşüyor. Hangi datagramın atılacağı bir düşürme politikasıdır. Hangi paketin sıradaki olarak gönderileceği ise ayrı bir zamanlama disiplinidir. İkisini de bir sonraki durakta açacağız.
Gecikmenin dört bileşenini ayırmış, kuyruk gecikmesini tek başına bırakmıştık. Artık o kuyruğun fiziksel yerini biliyorsun. Paketin başına gelen şey yolun uzunluğu değil, bu kutunun içindeki doluluk.
Özet
Peki, ne öğrendik?
- İletme yerel bir iştir: karar tek bir kutunun içinde, giriş portuna gelen datagramın hangi çıkışa verileceği sorusuyla sınırlıdır.
- Arama girişte yapılır: tablonun kopyası her giriş portunda durduğu için port, eşleştir ve uygula adımlarını merkeze sormadan yürütür.
- En uzun önek kazanır: aynı adrese birden çok satır uyabilir ve seçilen, daha çok bit sabitleyen satırdır; varsayılan satır sıfır bitle her yarışı kaybeder.
- Yönetimsel uzaklık ile metrik ayrı işler yapar: ilki hangi kaynağa güvenileceğini, ikincisi aynı kaynağın hangi yolunun kısa olduğunu seçer.
- Tek bir paket üç arama gerektirir: hedef için önek eşleşmesi, bir sonraki durak için özyinelemeli arama, komşunun donanım adresi için de adres çözümlemesi.
- Doku hattan hızlı olmak zorundadır: N girişli bir kutuda istenen anahtarlama hızı hat hızının N katıdır ve bu hız ancak paralel bir iç ağla kurulur.
- Kuyruk kutunun içinde doğar: doku yavaşsa girişte, hat yavaşsa çıkışta birikir ve baş engellemesi boş bir çıkışı bile bekletebilir.
Yönlendirici hedefi buldu, paketi doğru çıkışa verdi ve orada bir kuyruk buldu. Ama o kuyrukta bekleyen tek paket değil: aynı anda gelen bin paketten hangisinin önce çıkacağına hâlâ birileri karar veriyor. O kararı kim veriyor ve hangi ölçüye göre?
Bölüm 37: Kuyruk Yönetimi
Yönlendirici çıkış hattını seçti. Paket şimdi o hattın önünde bekliyor, ve önünde başkaları var.
Hangisinin önce gideceğini kablo belirlemiyor. Sırayı bir politika kuruyor, kararı da o politikayı işleten küçük bir zamanlayıcı veriyor. Peki hangi politika?
Kuyruk ne zaman büyüyor?
Bir hattın önünde kuyruk oluşmasının tek bir sebebi var ve kulağa fazla basit geliyor: gelen bit hızı, o hattın gönderebildiği bit hızını bir süre boyunca aşıyor. Fark biriktikçe kuyruk uzuyor. Varış hızı geri düşünce kuyruk boşalıyor. Kuyruk kalıcı bir hâl değil; geçici bir taşkının deposu.
Bir düğümdeki gecikmeyi dört kaleme ayırmıştım: işleme, kuyruk, iletim ve yayılma. Bunlardan yalnızca kuyruk kalemi trafikle birlikte değişiyor. İşleme gecikmesi, yani bit hatası denetimi ile çıkış hattının belirlenmesi, mikrosaniyenin altında kalıyor. Bunu aklında tut: yönlendiricide harcanan zamanın büyük kısmı sırada beklemekten geliyor, hesaplamadan değil.
Kuyruğun ne kadar büyüyeceğini tek bir oranda toplayabiliyorsun. Paket uzunluğu ile ortalama varış hızını çarpıp hattın bit iletim hızına bölüyorsun. Oran sıfıra yakınken ortalama kuyruk gecikmesi küçük kalıyor. Ama 1’e yaklaştıkça gecikmenin düz bir çizgi izlemediğini, keskin biçimde tırmandığını göreceksin; 1’i geçtiği yerde gelen iş hizmet edilebilenden fazla oluyor ve ortalama gecikme sonsuza gidiyor.
Hesabı bir örnek üzerinden yürütelim. 1.500 baytlık paketler 100 Mbit/s’lik bir hatta saniyede 8.000 kez geliyor. Paket başına 12.000 bit demek, tek paketin iletimi ise 120 µs sürüyor. Bu girdilerle oran 0,96 çıkıyor. Hat teknik olarak yetiyor — kâğıt üstünde kapasitenin %4’ü bile boşta — ama kuyruk çoktan tırmanmaya başlamış oluyor. Kapasite planlamasında “yetiyor” ile “rahat” arasındaki fark tam olarak burada.
Kuyruğun kapasitesi de sonlu olduğu için sonu belli: dolu kuyruğa varan paket düşürülüyor. O paketi bir önceki düğüm ya da kaynak uç yeniden gönderebiliyor, ya da hiç göndermiyor. Otoyol benzetmesinde giriş rampasındaki bekleme kuyruk gecikmesine karşılık geliyordu. Benzetme tam burada bitiyor: sıkışan araç eninde sonunda geçer, silinen paket geçmez.
Tampon ne kadar olmalı?
Çıkış kuyruğunun sebebi, dokunun hattan hızlı olmasıydı. Tamponun boyu işte o farkın ne kadarını soğurabildiğini söylüyor.
Boyutunu uzun yıllar tek bir pratik kural belirledi ve hâlâ karşına çıkıyor. RFC 3439 ortalama tamponu, tipik bir gidiş-dönüş süresi ile hat kapasitesinin çarpımı kadar seçmeyi öneriyor. Kuralın örnek olarak aldığı gidiş-dönüş süresi 250 ms. Daha yeni öneri aynı çarpımı akış sayısının kareköküne bölüyor. Aynı hatta 100 akış varsa gereken tampon onda birine iniyor, çünkü akışların tepe noktaları aynı ana düşmüyor.
Fazla tamponu bir iyilik sanma. Hiç boşalmayan uzun bir kuyruk gidiş-dönüş süresini büyütüyor, gerçek zamanlı uygulamaların başarımını düşürüyor ve TCP’nin tepkisini ağırlaştırıyor. Bu etki en çok ev yönlendiricilerinde göze çarpıyor.
Kuyruk hesabının iki girdisi soyut da kalmıyor; bir yönlendiricinin arayüz durum çıktısında ikisini yan yana görebilirsin:
Serial0/1/0 is up, line protocol is up
MTU 1500 bytes, BW 1544 Kbit/sec, DLY 20000 usec
Queueing strategy: fifo
Output queue: 0/40 (size/max), 0 drops
Input queue: 0/75 (size/max), 0 dropsÇıkış kuyruğu 40 paketlik, giriş kuyruğu 75 paketlik. Hattın kapasitesi 1.544 Kbit/s ve arayüzün MTU’su 1.500 bayt. MTU bir bağ katmanı kararıydı; burada aynı sayı kuyruk hesabının girdisi oluyor. Kuyruk tam dolduğunda içinde 60.000 bayt, yani 480.000 bit bekliyor. Bu hattın onu boşaltması yaklaşık 311 ms sürüyor. Sıranın sonuna eklenen paket bunu peşinen kabul ediyor.
Kimi atmalı, kime haber vermeli?
Çıkış portunun vermesi gereken iki ayrı karar var. Yer kalmadığında hangi paketin düşürüleceği bir karar; sırada bekleyenlerden hangisinin gönderileceği bambaşka bir karar. Birincisi düşürme politikası, ikincisi zamanlama disiplini.
En basit düşürme politikasına kuyruk sonu düşürme deniyor: tampon doluyken gelen paket atılıyor, kuyrukta bekleyenlere dokunulmuyor. İki alternatifi var: paketleri önceliğe göre atmak, ya da kuyrukta bekleyen birini geri çıkarmak.
Üçüncü seçenekte düşürmek yerine işaretliyorsun. ECN ve RED tıkanıklığı haber vermek için paketlere işaret koyuyor. Soru böylece değişiyor: kimi atayım değil, kime haber vereyim. IETF’in tavsiyesi de bu yönde. RFC 7567 ağ cihazlarının kuyruk uzunluğunu yönetmek ve uçtan uca gecikmeyi düşürmek için bir etkin kuyruk yönetimi mekanizması uygulamasını istiyor.
Yaygın uygulamalarından biri RFC 8290’da tanımlı FQ-CoDel. Akış kuyruklamayı CoDel etkin kuyruk yönetimiyle birleştiriyor; varsayılan hedef gecikmesi 5 ms, ölçüm aralığı 100 ms. Farklı akışların paketlerini birbirine karıştırdığı için ani trafiğin ürettiği baş engellemesinin etkisini de azaltıyor.
İşaretin duracağı yer ise IP başlığında hazır bekliyor. Oradaki 8 bitlik hizmet türü baytı ikiye bölünmüş: ilk 6 bit ayrımlaştırılmış hizmet kod noktası, son 2 bit ECN. RFC 2474 o alanı, paketin her düğümde göreceği davranışı seçen bir kod noktası olarak tanımlıyor ve 64 ayrı değer taşıyabiliyor. Öncelik sınıfı ile tıkanıklık işareti, 20 baytlık IP başlığında yan yana duruyor.
İşaretleme şöyle yürüyor. Yönlendirici o iki biti kuruyor, işaret hedefe kadar taşınıyor, hedef de dönüş onayında ECE bitini kurup göndereni yavaşlatıyor. Hangi durumda işaretleneceğine ağ işletmecisi karar veriyor. Bildirimin neden gerektiği klasik TCP ile CUBIC’e bakınca anlaşılıyor. İkisi de gönderme hızını kayıp oluşana kadar artırıyor ve darboğazda neredeyse hiç boşalmayan bir kuyruk bırakıyor.
Sıradaki paketi kim seçiyor?
Zamanlama disiplininin dört klasik cevabı var. Varsayılanı ilk gelen ilk gider, diğer adıyla FIFO. Paketler çıkış portuna varış sırasına göre iletiliyor ve hiçbir sınıflandırma yapılmıyor; yukarıdaki arayüz çıktısında kuyruk stratejisi satırının yazdığı da buydu.
Kalan üç politika ise tek kuyrukla çalışmıyor. Gelen trafik önce sınıflara ayrılıyor ve her sınıf kendi kuyruğuna giriyor. Sınıflandırmada başlığın herhangi bir alanı kullanılabiliyor. Öncelikli zamanlayıcı, bekleyen paketi olan en yüksek öncelikli kuyruktan gönderiyor; aynı sınıfın içinde yine ilk gelen ilk gider kuralı işliyor.
Dönüşümlü tarama (round robin) ise sınıf kuyruklarını sırayla dolaşıyor. Sırası gelen her sınıftan tam bir paket gönderiyor ve boş kuyruğu atlıyor. Hiçbir sınıf diğerini aç bırakamıyor. Ağırlıklı adil kuyruk bunun genelleştirilmiş hâli: her sınıfın bir ağırlığı var ve her turda ağırlığı oranında hizmet alıyor. Bir sınıfın aldığı pay, kendi ağırlığının bütün ağırlıklar toplamına oranı. Garanti mutlak bir hız değil, kapasitenin bir oranı.
Zamanlayıcının sırayı nasıl dağıttığını tur tur izleyelim:
- Altı paket aynı sırayla varıyor. Çıkış portuna dördü yedekleme, ikisi ses olmak üzere altı paket geliyor. Bundan sonrası tek bir soruya bakıyor: bu altı paket hattan hangi sırayla çıkacak?
- Trafik iki sınıfa ayrılıyor. İlk gelen ilk gider dışındaki politikalar tek kuyrukla çalışmıyor. Paketler başlıktaki bir alana bakılarak sınıflara bölünüyor ve her sınıf kendi kuyruğunda bekliyor.
- FIFO sırayı hiç bozmuyor. İlk gelen ilk gider hiçbir sınıflandırma yapmıyor. Çıkış sırası varış sırasının aynısı kalıyor; ses paketleri önlerindeki yedekleme paketleri bitene kadar bekliyor.
- Öncelik ses sınıfını öne alıyor. Öncelikli zamanlayıcı, bekleyen paketi olan en yüksek öncelikli kuyruktan gönderiyor. Ses kuyruğu boşalınca sıra aşağı geçiyor, boşalmazsa yedekleme hiç sıra alamıyor.
- Ağırlık payı orana çeviriyor. Ağırlıklı adil kuyrukta her sınıf turda ağırlığı oranında hizmet alıyor. Buradaki iki bir ağırlıkla yedekleme iki paket geçirirken ses bir paket geçiriyor.
Sırayı değil hızı sınırlamak
Zamanlama disiplinleri sıraya karar veriyor: kuyrukta bekleyenlerden hangisi önce çıkacak? Ama bir de ikinci soru var: bir akış saniyede kaç bit gönderebilir? Bu ikincisinin mekanizması ayrı ve adı jeton kovası.
Fikir tek bir resimle anlaşılıyor. Her akış için bir kova düşün. Kovaya sabit bir hızla, saniyede r bit değerinde jeton damlıyor. Kovanın derinliği b; taştığı anda fazla jeton kayboluyor. Bir paket çıkabilmek için boyu kadar jeton harcamak zorunda. Jeton yoksa paket ya bekliyor ya düşüyor.
İki parametre iki ayrı söz veriyor:
uzun vadeli ortalama hız = r
tek seferde çıkabilecek en büyük patlama = b
T süresi boyunca çıkabilecek en çok veri = r · T + bİkinci satır kritik. Kova doluyken bir anda b kadar veri çıkabiliyor; yani sınırlayıcı akışı boğmuyor, kısa süreli patlamalara izin veriyor. Sessiz kalan bir akış “kredi biriktirmiş” oluyor. Kovanın derinliği bu yüzden bir hoşgörü ayarı: küçük b düzgün ama katı, büyük b esnek ama darboğazda daha çok kuyruk üretiyor.
Jetonu olmayan pakete ne yapılacağı ayrı bir karar ve iki ad taşıyor. Ölçüm-cezalandırma (policing) fazlayı ya düşürüyor ya da düşük öncelikli diye işaretleyip yola devam ettiriyor — hızlı ve ucuz, ama kayıp üretiyor. Şekillendirme (shaping) fazlayı bir kuyrukta bekletip jeton biriktikçe salıyor — kayıp üretmiyor, karşılığında gecikme ekliyor. Aynı kova, iki farklı sonuç: biri bant genişliğini, öteki gecikmeyi ödüyor.
Bunu her gün görüyorsun. Tarifende yazan “100 Mbit/s” bir kablonun fiziksel hızı değil, operatörün kenar cihazına koyduğu jeton kovasının r değeri. Hat gerçekte 1 Gbit/s taşıyabiliyor olabilir. Bulut sağlayıcılarının API kotaları, mobil tarifelerdeki “adil kullanım” sonrası yavaşlatma ve bir dosya indirirken ilk birkaç saniyenin daha hızlı gitmesi — üçü de aynı kovanın farklı ayarları. O ilk hızlı saniyeler tam olarak b kadar.
Sırayla adil olmak throughput bakımından adil olmak anlamına gelmiyor, çünkü her sırada geçen paketin taşıdığı bit sayısı eşit olmayabiliyor. İnternetin ağ katmanı servis modeli de hâlâ best effort. Datagramın hedefe ulaşacağına, sırasına, zamanlamasına ve akışa ayrılacak bant genişliğine dair söz verilmiyor.
Garanti veren alternatifler tanımlandı ama varsayılan olmadı. Intserv garantili bant genişliği, kayıpsızlık ve sıra vaat ediyordu; Diffserv aynı şeyleri mümkün düzeyinde bıraktı. Hücresel tarafta ise aynı fikir bir sınıf tablosuna dönüşmüş durumda. 3GPP’nin hizmet kalitesi sınıf göstergesi ses için 100 ms, gerçek zamanlı oyun için 50 ms, akan video için 300 ms, web gezinme için 600 ms azami gecikme hedefi tanımlıyor.
Adalet hedefi de basit yazılıyor: aynı darboğazı K oturum paylaşıyorsa her biri ortalama R/K almalı. Ama kimse dayatmıyor. Paralel bağlantı açan uygulama payını büyütüyor; hâlihazırda dokuz bağlantı varken bir bağlantı isteyen onda bir alıyor, on bir bağlantı isteyen yarıyı alıyor. Sabit hızda gönderip kaybı kabullenen bir UDP uygulamasını denetleyen merci de yok. Bir sağlayıcının kendi kaynağını nasıl paylaştırdığı sorusunun mekanizması tam olarak bu ikisi: paket zamanlama ve tampon yönetimi.
DerinleşmeAğ tarafsızlığı teknik bir kural mı, hukuki bir kural mı?
Mekanizmanın kendisi tarafsız. Öncelikli zamanlayıcı bir sınıfa neden öncelik verildiğini sormuyor, ağırlıklı adil kuyruk da ağırlıkları kimin yazdığını umursamıyor. Tartışma bu yüzden mekanizmanın değil, mekanizmayı kimin hangi gerekçeyle ayarladığının tartışması.
ABD’de 2015 tarihli FCC kararı üç açık ve net çizgi kuralı koydu: yasal içeriği engelleme yok, yasal trafiği kasten yavaşlatma yok, ücretli önceliklendirme yok. Üçü de makul ağ yönetimi kaydıyla sınırlandı. Yani teknik gerekçeyle yapılan ayrım kuralın dışında bırakıldı, ve bu kaydın sınırının nerede olduğu tartışmanın asıl yeri hâline geldi.
Sonrası daha da öğretici. Aynı kural 2017’de geri alındı, 2024’te geri alma geri alındı. Hukuki çerçeve on yılda üç kez değişti.
Hukuki eksen tek bir tanımda düğümleniyor: bir sağlayıcı ne sayılıyor? Telekomünikasyon hizmeti sayılırsa ortak taşıyıcı yükümlülükleri doğuyor: makul ücret, ayrım gözetmeme ve düzenlemeye tabi olma. Bilgi hizmeti sayılırsa doğmuyor. Aynı kutu, aynı kuyruk, aynı zamanlayıcı, farklı hukuki sınıf.
Ülkelerin tutumu da birbirinden farklı, çünkü tartışmanın dayandığı gerekçeler teknik değil toplumsal: ifade özgürlüğünün korunması, yeniliğin ve rekabetin teşvik edilmesi.
Özet
Peki, ne öğrendik?
- Kuyruk geçici bir taşkının deposu: varış hızı çıkış hattının kapasitesini aştığı sürece uzuyor, düştüğünde boşalıyor, ve taştığında hem gecikme hem kayıp üretiyor.
- Tampon iki yönlü bir bedel: azı kayıp, fazlası gecikme demek, ve fazlasının faturası en çok ev yönlendiricilerinde ödeniyor.
- Düşürmek tek seçenek değil: etkin kuyruk yönetimi tıkanıklığı işaretleyerek haber veriyor ve o haber hizmet türü baytındaki iki bite sığıyor.
- Zamanlayıcı bir politika taşıyor: FIFO hiç sınıflandırmıyor, öncelik bir sınıfı öne alıyor, ağırlıklı adil kuyruk ise kapasitenin bir oranını garanti ediyor.
Çıkış hattının önündeki sırayı bir politikanın kurduğunu artık biliyorsun. Ama paketi o hatta yollayan şey hâlâ bir tablodaki tek satırdı. O satırı oraya kim yazdı?
Bölüm 38: Cihaz Yapılandırma
Masanın üstünde iki yönlendirici duruyor ve aralarındaki hat çalışıyor. Yine de bir taraftan öbürüne tek paket geçmiyor. İkisinin de tablosunda karşı ağın satırı yok.
O satırı bu kez elle sen yazacaksın. Peki kutudan yeni çıkmış bir cihaza nereden konuşulur?
Kutunun kapısı nerede?
Bir yönlendiriciye üç yoldan bağlanılır: konsol portu, telnet ve yardımcı port. Üçü de aynı komut satırını açar. Farkları nereden ve hangi güvenle geldiğindir.
Konsol portu ağ portu değildir, ama RJ-45 yuvası biçiminde ve cihazın arka yüzünde durur. Bilgisayara rollover kabloyla ve RJ-45’i DB-9’a çeviren bir adaptörle bağlanır; yönetim arayüzleri EIA-232 seri standardını kullanır. Konsol cihazı yerinde yönetmek içindir. Yardımcı port ise modem üzerinden uzaktan ulaşmak ya da WAN bağlantısına yedek olmak için durur. Ağ çöktüğünde ayakta kalan yol konsoldur.

Şifreler ayrı ayrı tanımlanır ve fabrika çıkışında hiçbiri yoktur. Cihazda beş tane durur: ikisi ayrıcalıklı kip, biri konsol portu, biri yardımcı port, biri telnet için. Ayrıcalıklı kipin iki şifresinden enable secret olanı şifrelenmiş saklanır; ikisi birden tanımlıysa geçerli olan odur. Konsol şifresi line console 0 kipine geçilip önce login, sonra password yazılarak konur. Sıra ters çevrilirse cihaz, şifre konana kadar girişin kapalı olduğunu söyleyen bir uyarı verir. Telnet ve yardımcı port şifresini koyabilmenin yolu ise önce konsoldan girmektir. İlk temas fiziksel olmak zorunda.
Telnet tarafında akılda kalan bir sayı var: aynı anda beş oturum açılabilir. Şifre satırı bu yüzden line vty 0 4 diye yazılır ve sıfırdan dörde kadar beş sanal terminali birden kapsar. Oturum ayrıcalıklı kipte telnet ya da connect ile açılır, disconnect ile kapanır. Komut bir IP adresi ya da makine adı alır; ad verilecekse cihazda ad çözümlemesi ayarlı olmalıdır. Telnet’in kendisi düz metin taşır. Kullanıcı adı, parola, yazdığın her komut ve dönen her çıktı hattı olduğu gibi geçer; aradaki herhangi bir noktada dinleyen biri oturumun tamamını okur. Bu yüzden telnet bugün yalnızca yönetim ağı fiziksel olarak ayrılmış eski cihazlarda kalmıştır ve yerini SSH almıştır.
SSH telnet’ten tam olarak nerede ayrılıyor?
SSH aynı işi yapar — uzaktaki makinede bir kabuk açar — ama işi üç ayrı katta kurar ve üçünün de telnet’te karşılığı yoktur.
Birincisi, sunucunun kimliği. Bir sunucuya ilk kez bağlandığında SSH sana bir parmak izi gösterir ve onaylamanı ister. Onayladığında sunucunun açık anahtarı makinene kaydedilir. Sonraki her bağlantıda sunucu, o anahtarın gizli eşini elinde tuttuğunu kanıtlamak zorunda kalır. Web sertifikalarından farkı burada: SSH’ta varsayılan olarak imzalayan bir üçüncü taraf yoktur, güven ilk karşılaşmada kurulur. Bunun bedeli de bellidir — ilk bağlantı, zincirin doğrulanmayan tek halkasıdır. Kayıtlı parmak izi bir gün değişirse SSH gürültülü bir uyarı verir; sunucu gerçekten yeniden kurulmuş olabilir, ya da araya biri girmiştir.
İkincisi, senin kimliğin. Parolayla giriş mümkündür ama zayıf halkadır: parola karşı tarafa gider ve tahmin edilebilir. Açık anahtarla girişte ise gizli anahtar makinenden hiç çıkmaz. Sunucu bir soru gönderir, sen onu gizli anahtarınla imzalarsın, sunucu elindeki açık anahtarla imzayı doğrular. Karşı taraf ele geçse bile eline yalnızca açık yarısı geçer ve onunla hiçbir yere giremez.
Üçüncüsü, kanallar. SSH tek bir şifreli bağlantının içinde birden çok mantıksal kanal açabilir. Kabuk oturumu bir kanaldır, dosya kopyalama başka bir kanal, bir port’un karşı tarafa taşınması bir başkası. Tünelleme yeteneği buradan geliyor: yerel bir porta gelen bağlantı şifreli oturumun içinden geçirilip karşı taraftaki bir adrese açılabiliyor. Yalnızca dışarı açık tek kapısı SSH olan bir sunucunun arkasındaki veritabanına bu şekilde ulaşılabiliyor.
Üç maddenin toplamı, SSH’ın 1995’te tek hamlede üç ayrı aracı birden emekliye ayırmasını açıklıyor: uzak oturum, uzak komut çalıştırma ve dosya kopyalama. Üçü de aynı doğrulanmış kanalın içine girdi.
DerinleşmeŞifreyi unutan neden cihazın sahibi olmaya devam eder?
Şimdi o beş şifrenin hepsinin unutulduğunu varsay. Kurtarma yolu yazılımsal değil, fiziksel. Cihaz kapatılıp açılır, ilk 60 saniye içinde Break tuşuyla ROM Monitör kipine düşülür ve 16 bitlik yapılandırma kaydı 0x2102 değerinden 0x2142 değerine çevrilir. Açılış zaten üç adımdır: POST ile donanım sınanır, sonra işletim sistemi imajı aranır, en sonunda yapılandırma aranır. Kaydın son dört biti hangi imajın nereden yükleneceğini belirleyen boot alanıdır. 0x2142 değeriyle cihaz NVRAM’i hiç okumadan açılır; şifreler o dosyanın içindedir, dosya da okunmamıştır. Açılan boş cihazda NVRAM’deki dosya elle RAM’e kopyalanır ve şifreler yeniden yazılır. Kopyalamanın yönü de işe yarıyor: NVRAM’den RAM’e gelen dosya oradakiyle birleştirilir, ters yön ise hedefteki dosyayı silip yenisini yazar. Eski yapılandırma böylece kaybolmaz. İş bitince değer 0x2102’ye döndürülür.
Yapılandırma dosyası hiç yoksa cihaz seni kendiliğinden setup kipine sokar ve soru-cevapla temel ayarları kurmayı önerir. Köşeli parantezdeki değerler varsayılan cevaplardır, Ctrl-C diyalogu iptal eder.
Prompt’un son karakteri ne söylüyor?
Yönlendiricinin üstünde bir işletim sistemi çalışır ve bu sistem yalnızca paket iletmez; cihazdaki hafızayı, işlemciyi ve arayüzleri de o yönetir. Buradaki kip adları ve komut sözcükleri tek bir satıcının kabuğuna ait. Cisco’nun ürününde sistemin adı IOS. Mekanizma satıcıdan bağımsızdır, sözcükler değildir.
Komut satırının iki giriş kipi var. Kullanıcı kipinde hiçbir yapılandırma yapamazsın. Değiştirmek için ayrıcalıklı kipe geçmen gerekir. enable yukarı çıkarır, disable geri indirir, logout cihazdan tümüyle çıkarır. Hangi kipte olduğunu prompt’un son karakterinden okursun.
| prompt | kip | oradan ne yapılır |
|---|---|---|
Kenar> | kullanıcı | yalnızca bakılır |
Kenar# | ayrıcalıklı | show çalıştırılır, yapılandırmaya geçilir |
Kenar(config)# | genel yapılandırma | cihazın tamamını ilgilendiren ayar yazılır |
Kenar(config-if)# | arayüz yapılandırma | tek bir arayüzün ayarı yazılır |
Kutudan çıkan her yönlendiricinin adı Router’dır. configure terminal genel yapılandırma kipine geçirir, hostname de oradaki adı değiştirir. Değişiklik anında prompt’a düşer.
Ezber de gerekmez. Tek başına ? bulunduğun kipteki bütün komutları listeler, com? o harflerle başlayanları, komut ? o komutun parametrelerini. Sekme tuşu tek adaya inmiş parametreyi tamamlar ve yardımın kapsamı bulunduğun kiple sınırlıdır. Komutlar benzersiz kaldığı sürece kısaltılabilir: show yerine sh, configure terminal yerine conf t aynı işi görür.
Hata mesajı üç tane. % Ambiguous command cihazın komutu ayırt etmesine yetecek karakteri yazmadığını, % Incomplete command gereken parametreyi girmediğini söyler. % Invalid input detected at ^ marker ise hatanın tam yerini şapka işaretiyle gösterir.
Arayüz neden kapalı geliyor?
Genel yapılandırma kipinden interface komutuyla tek bir arayüzün kipine inilir; arayüz adı tip ve numaradan, bazı cihazlarda tip ve yuva/numaradan oluşur. exit bir basamak yukarı çıkarır. Adres veren komut ip address ve adresin yanına alt ağ maskesi de yazılır. Aynı arayüze ikinci bir adres verilecekse maskeden sonra secondary eklenir. Maske, adresin hangi bitlerinin ağ parçasına ait olduğunu söylüyordu; komut o maskeyi önek olarak değil ondalık olarak ister.
Sonra en sinsi satır geliyor. Yönlendiricide bütün arayüzler varsayılan hâliyle kapalı gelir ve açan komut no shutdown’dır. Bu tek satır unutulduğunda yapılandırma kâğıt üstünde doğru görünür ama hiçbir paket geçmez.
Arayüz durumu da tek değil çift sayıdır.
| durum | ne demek |
|---|---|
up/up | çalışıyor |
up/down | hat protokolünde sorun var |
down/down | arayüzde sorun var |
administratively down | sen kapatmışsın |
Bir arayüz açıldığında ekrana iki olay satırı düşer. Biri bağlantının, öbürü hat protokolünün durum değiştirdiğini bildirir. Bunlar komutun çıktısı değil, cihazın olay günlüğüdür. Yazmakta olduğun komutun ortasına da düşebilirler. Cihaz bu satırları konsola bağlı bilgisayara gönderir; telnet ile bağlıysan görmezsin ve terminal monitor demen gerekir.
Seri bir WAN arayüzünde bir yük daha var. Saat işaretini taşıyan uç DCE’dir ve hız orada clock rate ile verilir; ders örneğinde bu değer 128000 bit/s. Karşı uçta böyle bir komut yoktur, o uç saati dinler. LAN arayüzünde bu iş hiç çıkmaz.
Tabloya elle bir satır yazmak
Arayüze adres verdiğin anda o ağın doğrudan bağlı yolu tabloya kendiliğinden düşer. Bedavaya gelen kısım orada biter.
Gerisi elle yazılır. Anahtarın MAC öğrenme tablosunu kimse yapılandırmıyordu; tablo duyulan kaynak adreslerden kendiliğinden doluyordu. Burada öyle bir kendiliğindenlik yok. Statik yönlendirme budur: satırı tabloya bir algoritma değil bir insan koyar ve o satır silinene kadar orada durur.
Komut üç alan ister: gidilecek ağın adresi, o ağın maskesi ve bir sonraki yönlendiricinin adresi. Üçüncünün yerine paketin çıkacağı arayüzün adı da yazılabilir.
Vakayı kuralım. Kenar cihazın LAN’ı 192.0.2.0/24, merkez cihazın LAN’ı 198.51.100.0/24, aradaki noktadan noktaya bağ 203.0.113.0/30. Kenar uç .1, merkez uç .2 adresini alıyor. /30 öneki dört adres taşır; ağ ve yayın adresi düşülünce iki uca iki kullanılabilir adres kalır ve ondalık maskesi 255.255.255.252 olur. İki cihaz da ikişer doğrudan bağlı satıra bedavaya sahip. Karşı LAN için toplam iki satır yazılır.
Kenar(config)# ip route 198.51.100.0 255.255.255.0 203.0.113.2
Merkez(config)# ip route 192.0.2.0 255.255.255.0 203.0.113.1Dışarısı için üçüncü bir satır gerekir. Biçimi aynıdır, yalnızca hedef ağ da maske de sıfırlarla yazılır.
Kenar(config)# ip route 0.0.0.0 0.0.0.0 203.0.113.2Yönlendirme tablosu en uzun önek eşleşmesiyle okunuyor ve varsayılan yol sıfır uzunluğuyla her yarışı kaybediyordu. Bu satır o yolun elle yazılmış hâlidir. Kenar cihaz artık tanımadığı her adresi merkeze yollar.
Aynı ağa iki ayrı kaynaktan yol gelirse kimin kazanacağına yönetimsel uzaklık karar verir ve küçük olan kazanır. Doğrudan bağlı arayüz 0, statik yol 1, komşulardan öğrenilmiş yollar 90 ile 120 arasında, bilinmeyen ise 255 taşır. Son değerdeki bir yol tabloya hiç yazılmaz. Metriğe ancak uzaklıklar eşitse bakılır.
Elle yazmanın kazancı da var. Bu iki cihaz birbirine tek bir güncelleme mesajı göndermiyor: hat yalnızca veri taşıyor, işlemci yalnızca paket iletiyor ve tabloya yanlış bir satır sızdıracak öğrenme süreci yok. Bedeli de aynı yerden çıkıyor. Kenar ile merkez arasındaki hat koparsa tablo bunu fark etmez. Satır silinene kadar paketleri kopmuş hatta yollamayı sürdürür.
Yazdığın çalışıyor mu, kapatınca kalıyor mu?
Yapılandırmak ve doğrulamak iki ayrı iş. show ip route tabloyu, show ip interface brief bütün arayüzlerin adreslerini kısaca, show interfaces arayüz istatistiklerini listeler.
Kenar# show ip route
Gateway of last resort is not set
C 192.0.2.0/24 is directly connected, GigabitEthernet0/0
C 203.0.113.0/30 is directly connected, Serial0/0/0
S 198.51.100.0/24 [1/0] via 203.0.113.2Satır başındaki C ile S kaynağı ayırır, köşeli parantezdeki çift ise yönetimsel uzaklık ile metriktir. Doğrudan bağlı satırda sonraki atlama alanı hiç yoktur, çünkü gidilecek bir sonraki düğüm de yoktur. En üstteki satır ise varsayılan yolun tanımlanmadığını söylüyor.
show ip interface brief çıktısı arayüzü, adresini, adresin geçerliliğini, atanma yöntemini ve iki durum sütununu tek satırda verir. Method sütunundaki manual, adresin elle yazıldığını gösterir.
Yolun çalışıp çalışmadığını ping söyler. Varsayılan ayarlarla beş adet 100 baytlık ICMP yankı isteği gönderir ve zaman aşımı 2 saniyedir. Çıktıda ünlem yanıt geldi, nokta hiçbir şey gelmedi, U hedef makineye, N hedef ağa ulaşılamıyor demektir. Sonunda başarı yüzdesi ile en küçük, ortalama ve en büyük gidiş-dönüş süresi yazılır.
Bir iş daha kaldı. Cihazda dört ayrı hafıza var: RAM çalışan yapılandırmayı, ROM açılış için gereken küçük imajı, FLASH işletim sisteminin tam sürümünü, NVRAM ise başlangıç yapılandırmasını tutar. Cihaz açılırken NVRAM’deki dosyayı RAM’e kopyalar; komut satırında ne yaparsan yap, sonucu yalnızca o kopyaya işlenir. show running-config o an geçerli olanı, show startup-config açılışta okunacak olanı gösterir; ikisinin farkı kaydedilmemiş işin tam listesidir. copy running-config startup-config yazılmadan hiçbir düzenleme yeniden başlatmadan sağ çıkmaz.
Özet
Peki, ne öğrendik?
- Konsol portu son çaredir: ağ portu değildir, rollover kabloyla bağlanır ve ağ tümüyle çökse bile ayakta kalan tek yönetim yolu odur.
- Kip prompt’ta yazar:
>bakmaya,#değiştirmeye,(config)#ve(config-if)#ise yazmakta olduğun ayarın kapsamına karşılık gelir.- Arayüz kapalı doğar: adresi verilmiş bir arayüz
no shutdownyazılmadan up/up olmaz ve doğru görünen yapılandırma tek paket geçirmez.- Statik yol üç alandan ibarettir: ağ, maske ve bir sonraki atlama; satır silinene kadar tabloda durur, çünkü onu tazeleyecek bir protokol yoktur.
- RAM’deki iş kalıcı değildir: çalışan yapılandırma ile başlangıç yapılandırması ayrı dosyalardır ve aradaki fark kaydedilmemiş işin listesidir.
Bu ağda iki satır yazdın ve tablo doldu. Aynı işi tam bir örgüde yapmak n×(n−1) satır demek: 3 cihazda 6, 10 cihazda 90, 1.000 cihazda 999.000. Peki binlerce yönlendiricide bu satırları kim elle yazacak?
Bölüm 39: Yönlendirme Protokolleri
Bir önceki durakta iki satırı elle yazdın ve ağ çalıştı. Bin cihazlık bir ağda kimse o satırları elle yazmaz.
Yönlendiriciler komşularıyla konuşuyor ve ağın haritasını kendileri çıkarıyor. Peki bir kutu, hiç görmediği bir hattın maliyetini nereden bilecek?
Bilgi kimde duruyor?
Algoritmanın gözünde ağ bir çizge. Düğümler yönlendiriciler, kenarlar da aralarındaki hatlar oluyor. Her kenarın bir maliyeti var; o maliyeti protokol hesaplamıyor, ağı işleten kişi elle belirliyor. Bütün kenarlara 1 verirsen en ucuz yol, en az atlamalı yol hâline geliyor. Maliyet bant genişliğiyle ters orantılı da tanımlanabilir, tıkanıklıkla ters orantılı da.
Bir paketin çıkış portu, yönlendirme tablosundan en uzun önek eşleşmesiyle bulunuyordu. O tabloyu dolduran hesap her yönlendiricide ayrı ayrı dönüyor; ortada işi dağıtan merkezî bir beyin bulunmuyor.
Link state (bağlantı durumu) algoritmalarında her yönlendirici topolojinin tamamını bilir. Bütün düğümler, bütün hatlar ve bütün maliyetler elindedir. Uzaklık vektörü algoritmalarında ise yönlendirici işe yalnızca doğrudan bağlı komşularının maliyetiyle başlar. Gerisini komşusundan duyar.
Komşunun tahminine güvenmek
Uzaklık vektörünün çekirdeğinde tek bir kural var ve kural tek cümleye sığıyor: bir hedefe en ucuz yolun maliyeti, her komşuya gitmenin bedeli ile o komşunun aynı hedefe biçtiği bedelin toplamıdır — hangi komşuda bu toplam en küçükse, yol oradan geçer.
Kuralın adı Bellman-Ford. Bir yönlendirici onu uygularken elinde iki sayı bulunur: komşuya giden hattın kendi maliyeti, ki bunu kendisi bilir, ve komşunun bildirdiği tahmin, ki bunu yalnızca duyar. İkincisini doğrulayamaz, çünkü komşusunun haritasını hiç görmez. Bütün zayıflık bu tek noktada toplanıyor: karar, doğrulanmamış bir sayıya dayanıyor.
Algoritma yinelemeli, eşzamansız ve kendi kendini durdurandır. Bir düğüm komşularına yalnızca kendi vektörü değiştiğinde haber verir. Haber gelmezse hiçbir işlem yapılmaz.
Maliyet düşerse yeni değer birkaç turda ağa oturur. Yükselmesi ise turlarca sürer. Yönlendirici komşusunun eski ucuz ilanına kanabilir; oysa o ucuz yol aslında kendi üzerinden geçmektedir.
Ortaya çıkan şeyin adı sayarak sonsuza gitme. İki komşu birbirinin tahminini birer birer artırır ve aralarında bir yönlendirme döngüsü kurulur. Döngü kendiliğinden kırılır. Ama çok yavaş kırılır.
Sayalım. Hedef ağa B doğrudan bağlı ve maliyeti 2; C aynı hedefe B üzerinden 3 maliyetle ulaşıyor. C’nin pahalı bir doğrudan hattı da var: 12. Şimdi B’nin hattı bozulup 30’a çıkıyor. B, C’nin 3’lük eski ilanına bakıp kendini 4 ilan ediyor ve sayı ikisi arasında birer birer tırmanıyor. Onuncu turda C kendi 12’lik hattına düşüyor, bir tur sonra B 13’te oturuyor. RIP’in 30 saniyelik sayacıyla bu on bir tur 330 saniye eder. Yani 5,5 dakika.
İki savunma geliştirildi. Split horizon (bölünmüş ufuk) iki kuraldan oluşur: bir yönlendirme mesajı, gönderildiği arayüzün alt ağ bilgilerini taşımaz; ve bir komşudan öğrenilen bilgi aynı arayüzden geri gönderilmez. Zehirli geri dönüş bir adım daha atar. Yönlendirici hedefe komşusu üzerinden gidiyorsa, o komşuya uzaklığını sonsuz ilan eder. Gerçek uzaklığını bilir, söylemez.
Bu genel bir çözüm sayılmaz. İki komşu arasındaki döngüyü keser, üç ya da daha fazla düğümü kapsayan döngüyü yakalayamaz.
Yakınsama, ağdaki bütün yönlendiricilerin bütün alt ağlar hakkında tam ve doğru bilgiye sahip olması demektir. Döngü sonsuz metriğe kadar sürerse yakınsama o kadar gecikir.
DerinleşmeSonsuz neden tam olarak 16 seçildi?
Tavan, sayarak sonsuza gitmeyi engellemiyor. Yalnızca ne zaman biteceğini söylüyor. Az önceki örnekte C’nin yedek hattı olmasa sayaç 4, 5, 6 diye 16’ya kadar çıkar ve 14 turda tavana çarpardı: 420 saniye, yani 7 dakika. Tavan hiç olmasaydı sayma da hiç durmayacaktı.
RFC 2453 bu değerin seçimini açık bir ödünleşim olarak yazar: hiçbir gerçek yolun ulaşamayacağı kadar büyük, ama gereğinden büyük olmayan bir sayı. Bir yanda ağın büyüyebileceği çap duruyor, öbür yanda yakınsama süresi. Sonsuzu 16 seçmek, RIP’e on beş atlamadan büyük bir ağ kurdurmamayı peşinen kabul etmektir. Sayı bir doğa sınırı değil, protokolün kendine ayırdığı zaman bütçesidir.
Aynı yerde başka bir seçim de yapılabilirdi. IGRP sonsuzu 4.294.967.295 alır ve çapı fiilen sınırlamaz; karşılığında saymanın kısa sürede tavana çarpma güvencesini bırakır. O sayıya kadar birer birer saymak, hiç durmamakla aynı kapıya çıkar. Aynı denklem, başka bir bedel.
RIP’i yürüten şey sayaçlarıdır
Uzaklık vektörünün en tanıdık uygulaması RIP. 1982’de BSD-UNIX dağıtımına dahil edildiği için yayıldı ve metrik olarak atlama sayısını kullanıyor. Bir yolun taşıyabileceği en büyük geçerli değer 15 atlamadır. 16 sonsuz demektir ve sayma orada durur.
Güncellemeler komşular arasında 30 saniyede bir gider; mesajın adı response, karşılığı ilandır. Tek bir mesaj en fazla 25 hedef alt ağ taşır. Biçim de küçüktür: 4 baytlık bir başlık ve her biri 20 baytlık kayıtlar. En büyük RIP mesajı 504 bayt eder, yani tipik bir Ethernet çerçevesinin üçte birinden azdır. RIP UDP tabanlıdır ve 520 numaralı portu kullanır. Tabloyu çekirdek değil, uygulama düzeyinde koşan routed adlı sıradan bir süreç yönetir.
Sayaç üç tanedir. Güncellemenin yanında 180 saniyelik geçersizlik ve Cisco uygulamasında 240 saniyelik temizleme durur. Ortadaki sayının gerekçesi RFC 2453’te yazılıdır. Zaman aşımı güncelleme aralığının altı katı seçilmiştir, çünkü tek bir kayıp mesaj yüzünden yol geçersiz kılınmamalıdır. Geçersiz kılınan yol da hemen silinmez: 120 saniyelik bir çöp toplama sayacı kurulur ve metriği 16’ya çekilerek komşulara ilan edilir.
Sayaçların bir de kilitlenme huyu var: aynı ağdaki yönlendiriciler zamanla aynı anda güncelleme göndermeye başlar. RFC 2453 bu yüzden ya yükten etkilenmeyen bir saat ya da her kurulumda 0-5 saniyelik rastgele bir kayma zorunlu tutar.
Yapılandırması iki komuttan ibarettir. Statik yolu yazarken gidilecek hedefi de maskesini de sen söylüyordun; burada yalnızca kendi ağlarını bildirirsin.
Kenar(config)# router rip
Kenar(config-router)# network 192.0.2.0
Kenar(config-router)# network 203.0.113.0Sürüm farkı tek cümlede kapanıyor. RIPv1 güncellemelerde alt ağ maskesini taşımaz, RIPv2 taşır. Maske adresi ağ ve makine parçasına bölüyordu; maskesiz bir ilan, /27 gibi bir ağı komşusuna hiç anlatamaz.
Aynı harita, ayrı ağaçlar
Link state’te (bağlantı durumunda) her yönlendirici kendi yerel durumunu bilir: hangi arayüzleri açık, hangi komşulara erişebiliyor. Bu yerel durumu sel yayılımıyla ağın tamamına dağıtır. Yayılan şey haritanın tamamı değil, yalnızca sezilen değişikliktir.
Yayılım bittiğinde herkesin elinde birebir aynı harita durur. Sonra herkes o haritadan kendi ağacını çıkarır. Dijkstra’nın döngüsü iki satırdır. Kesinleşmemiş düğümler arasından tahmini maliyeti en küçük olanı seç ve kümeye ekle. Sonra komşularının tahminlerini D(v) = min(D(v), D(w) + c(w,v)) ile güncelle.
Beş yönlendiricili bir örnek kurayım. Sekiz hattın maliyeti sırasıyla A-B 2, A-C 5, A-E 7, B-C 1, B-D 4, C-D 2, C-E 6 ve D-E 3 olsun. A’nın çıkardığı sonuç dört satır: B’ye 2 doğrudan, C’ye 3 (B üzerinden), D’ye 5 (yine B üzerinden), E’ye 7 doğrudan. Doğrudan A-C hattı 5 iken B üzerinden 3 çıkıyor. En kısa yol her zaman doğrudan hat olmuyor.
Aynı hesabı C yaptığında ağacın kökü değişir ve tablo başka satırlar taşır. Veritabanı ortaktır, ağaç kişiseldir.
Aynı veritabanından her yönlendiricinin kendi ağacını nasıl çıkardığını görelim:
- Herkes kendi hattını bilir. Üç yönlendiricinin elinde yalnızca kendi arayüzlerinin maliyeti var. A, C'ye giden 5 maliyetli hattını bilir; B ile C arasındaki 1 maliyetli hattan haberi yoktur.
- İlan sel yayılımıyla dağılır. Her yönlendirici kendi yerel durumunu alanın tamamına gönderir. Gönderilen şey tablonun tamamı değil, yalnızca sezilen değişikliktir.
- Üç veritabanı birebir aynı. Yayılım bittiğinde üç kutuda da aynı harita durur: aynı düğümler, aynı hatlar, aynı maliyetler. Ortak olan şey veritabanıdır.
- Herkes kendini kök alır. Aynı haritadan her yönlendirici ayrı bir en kısa yol ağacı hesaplar. Kök her seferinde hesabı yapan düğümün kendisidir.
- Tablolar farklı çıkıyor. A için C'ye giden yol B üzerinden 3 maliyetlidir; B için aynı hedef doğrudan 1 maliyetlidir. Tek veritabanından üç ayrı tablo çıkıyor.
OSPF bu haritayı nasıl taşıyor?
OSPF bu ailenin standart üyesidir ve adındaki Open sözcüğü belirtimin herkese açık olduğunu anlatır. Sürüm 2, RFC 2328’de tanımlıdır: J. Moy, Nisan 1998, STD 54. Belge protokolü tek bir otonom sistemin içinde çalışmak üzere tanımlar; otonom sistem, tek bir yönetimin altındaki ve dışarıya tek bir ağ gibi görünen yönlendirici kümesidir.
Taşıma tarafı RIP’ten ayrılıyor. OSPF doğrudan IP üzerinde koşar ve protokol numarası 89’dur. İki çoklu yayın adresi kullanır: 224.0.0.5’i OSPF koşan her yönlendirici dinler, 224.0.0.6’yı yalnızca atanmış yönlendirici ile yedeği dinler.
Komşuluk Hello protokolüyle kurulur. Yerel alan ağında Hello 10 saniyede bir gider, ölüm aralığı bunun dört katıdır: 40 saniye. NBMA ağlarda aynı çift 30 ve 120 saniyedir. Hello paketi yönlendirici kimliğini, alt ağ maskesini, alan kimliğini, önceliği ve iki zamanlayıcıyı taşır. Alan kimliği, maske ve zamanlayıcılar iki uçta aynı değilse komşuluk hiç kurulmaz. Kurulma da adım adımdır: Down, Init, Two-way, Exstart, Exchange, Loading, Full.
Yayın ağlarında bir atanmış yönlendirici ve onun yedeği seçilir; ilanları kendinde toplayıp dağıttığı için ağdaki mesaj sayısı düşer. Noktadan noktaya bağlantılarda böyle bir seçime gerek yoktur.
Ölçek büyüyünce otonom sistem alanlara bölünür. İlanlar yalnızca kendi alanında yayılır ve alan sınır yönlendiricileri kendi alanlarındaki uzaklıkları özetleyip omurgada ilan eder. Bir yönlendirici kendi alanının topolojisini ayrıntısıyla bilir; diğer alanlar için yalnızca yönü bilir. Alanlar arası bütün özetler omurga alanından geçer. Alan 0 diye anılır, kimlikler 32 bit olduğu ve IP adresi biçiminde yazıldığı için 0.0.0.0 diye de görülür.
Sessiz bir ağ da sessiz sayılmaz. RFC 2328 LSRefreshTime’ı 30 dakika, MaxAge’i bir saat, MinLSInterval’ı 5 saniye ve CheckAge’i 5 dakika olarak sabitler. İçerik hiç değişmese bile her ilan 1.800 saniyede bir yeniden üretilir. 50 yönlendiricili bir alanda bu, ortalama 36 saniyede bir ilan ve tam tazeleme turu başına 2.450 teslimat demektir.
Aynı hedefe iki protokol iki yol kurar
OSPF maliyetinin standart bir hesaplama kuralı yoktur. Cisco’nun varsayılanı 10^8 / bant genişliğidir ve cost 1 ile 65.535 arasında bir değer alır. Bir yolun metriği, yol üzerindeki bütün hatların cost toplamıdır. Formül 100 Mbit/s hattı cost 1, 10 Mbit/s hattı cost 10 yapar. 1 Gbit/s için ham sonuç 0,1’dir ama alt sınır 1 olduğu için gigabit hat ile fast ethernet aynı kefeye düşer. Formülün 100 Mbit/s üstünde gözü yoktur.
Şimdi aynı hedefe giden iki yolu yan yana koy.
| yol | atlama | RIP metriği | OSPF cost |
|---|---|---|---|
| iki adet 10 Mbit/s hat | 2 | 2 | 20 |
| üç adet 1 Gbit/s hat | 3 | 3 | 3 |
RIP birinciyi seçer, çünkü 2 sayısı 3’ten küçüktür ve hattın hızını hiç görmez. OSPF ikinciyi seçer, çünkü onun gözünde 3 maliyeti 20 maliyetinden ucuzdur. Aynı ağda, aynı hedefe, iki ayrı yol. Eşit maliyetli birden çok yol çıkarsa OSPF hepsini birden kullanır.
İkisi aynı cihazda birden koşuyorsa karar yönetimsel uzaklığa düşer ve küçük olan kazanır: OSPF 110, RIP 120. Tabloda kimin kazandığını satır başındaki harften okursun.
Kenar# show ip route
C 192.0.2.0/24 is directly connected, GigabitEthernet0/0
R 198.51.100.0/24 [120/2] via 203.0.113.2, 00:00:11, Serial0/0/0
O 203.0.113.64/26 [110/3] via 203.0.113.2, 00:04:52, Serial0/0/0show ip ospf database komutu ise haritanın kendisini listeler: Link ID, ilanı gönderen yönlendirici, ilanın yaşı, sıra numarası ve checksum. Durum çıktısındaki SPF sayacı da topolojinin ne sıklıkta değiştiğinin doğrudan ölçüsüdür.
Son fark dayanıklılıkta. Link state’te (bağlantı durumunda) bozuk bir yönlendirici en fazla kendi hatlarının maliyetini yanlış ilan eder; herkes kendi tablosunu ayrı hesapladığı için hata orada kalır. Uzaklık vektöründe bir düğümün vektörünü başkaları kullanır. Her yere çok ucuz yolu olduğunu söyleyen bir yönlendirici, bütün trafiği kendine çeker.
Özet
Peki, ne öğrendik?
- Uzaklık vektörü komşusuna inanır: Bellman-Ford denklemi komşunun tahminini kanıt görmeden kabul eder; yükselen bir maliyetin ağa yerleşmesi bu yüzden turlarca sürer.
- Sonsuz sonlu bir sayıdır: RIP’te 16 değeri saymayı durdurur ve aynı seçim ağın çapını on beş atlamayla sınırlar.
- Link state’te (bağlantı durumunda) ortak olan veritabanıdır: aynı haritadan her yönlendirici kendini kök alan ayrı bir ağaç çıkarır, tablolar bu yüzden farklıdır.
- Sayaçlar protokolün karakteridir: RIP 30 saniyede bir konuşur, OSPF 10 saniyede bir Hello gönderir ve 40 saniye susan komşuyu ölü sayar.
- Metrik seçimi yolu değiştirir: atlama sayan RIP ile bant genişliğine bakan OSPF aynı hedefe iki ayrı yol kurar.
Yönlendiriciler haritayı kendileri çıkardı ve kimse tek bir satır yazmadı. Peki bu kararın illa o kutuların içinde verilmesi mi gerekiyor?
Bölüm 40: Kontrol Düzlemi ve SDN
Yönlendiriciler haritayı kendi çıkardı. Ama o kararın orada verilmesi bir doğa yasası sayılmaz; bir mimari tercihtir.
Kararı bir yerden alıp başka bir yere koymak mümkün. Yer değişince kutunun içinde ne kaldığı da değişiyor. Karar nereye taşınıyor?
Kararı nereye koyarsın?
Kontrol düzlemini kurmanın iki yolu var. Birincisinde her kutu yönlendirme algoritmasının bir parçasını kendi içinde koşturur; parçalar birbiriyle konuşarak tabloyu hesaplar. Adı yönlendirici başına kontrol. Bağlantı durumu ilanları bütün otonom sisteme taşıyor, aynı topoloji haritası her düğümde ayrı ayrı tutuluyordu. Onlarca kutu, aynı hesabı onlarca kez yapıyordu.
İkinci yolda hesap kutuların dışına çıkar. Uzaktaki sunucularda koşan bir yazılım, denetleyici, tabloyu hesaplayıp cihazlara kurar. Yönlendirici tabloyu almış olur, üretmiş olmaz. Yaklaşımın tam adı mantıksal olarak merkezîleştirilmiş kontrol. Buradaki mantıksal kelimesi bütün yükü taşıyor: ortada tek bir makine yok, tek bir karar mercii var. Denetleyici başarım, ölçeklenme ve hata toleransı için fiziksel olarak dağıtık kurulur. Arkada birden çok sunucu, paylaşılan bir durum ve biri düştüğünde devralan eşler durur.
Karşı taraftaki klasik yönlendirici yekpare satılır. Anahtarlama donanımı ve üstünde koşan yazılım aynı satıcıdan gelir. Standart protokolleri konuşur, ama o protokollerin uygulaması da, altındaki işletim sistemi de satıcıya aittir. O işletim sisteminin genel adı ROS, yani yönlendirici işletim sistemi.
Ayrımın kendisi yeni sayılmaz. İletme veri düzleminde, yönlendirme kontrol düzleminde yaşıyordu; kararı en uzun önek eşleşmesi kesiyordu. Yeni olan, kontrol düzleminin kutudan sökülebilmesi.
Sökmenin fiziksel gerekçesi de orada duruyordu: o altı basamaklık fark iki dünyayı aynı gövdede yan yana tutuyor. Kontrol düzlemini yeniden düşünme ilgisi 2005 civarında canlandı. İnternet tarihi 2008’i yazılım tanımlı ağın yılı olarak yazdı.
Kararın kutunun içinde ve dışında durduğu iki düzeni yan yana koyalım:
- Aynı ağ, iki ayrı kuruluş. Solda üç yönlendirici, sağda üç anahtar. Alt yarıları aynı işi yapıyor: gelen paketi bir tabloya bakarak çıkışa veriyorlar. Fark üst yarıda başlıyor.
- Solda karar kutunun içinde. Yönlendirici başına kontrolde her kutu yönlendirme algoritmasının bir parçasını kendi içinde koşturuyor. Karar veren yazılım, kararı uygulayan donanımla aynı gövdede duruyor.
- Kutular birbirine ilan yolluyor. Parçalar tek başına yetmiyor; komşularıyla konuşarak ortak bir sonuca varıyorlar. Tablo bu konuşmadan çıkıyor ve aynı hesap her kutuda ayrı ayrı yapılıyor.
- Sağda karar yukarı taşınıyor. Anahtarların içinde yönlendirme yazılımı kalmıyor. Karar mercii tek: mantıksal olarak merkezî bir denetleyici. Kendisi fiziksel olarak birden çok sunucuya yayılabilir.
- Denetleyici tabloyu kuruyor. Hesap tek yerde bitiyor, sonuç aşağı iniyor. Denetleyici güneye bakan API üzerinden yalnızca güncellenmesi gereken anahtarlara yeni akış kayıtlarını yazıyor.
Neye bakarak karar veriliyor?
Kararı veren tek alanın hedef adres olması gerekmiyor. Genelleştirilmiş iletmede başlıktaki birçok alan kararı birlikte belirler. Eşleşme üç katmandan birden alan okuyabilir: bağ, ağ ve taşıma katmanı alanları aynı kuralda yan yana gelir.
Akış kaydının ilk yarısı eşleşme, yani başlıkta aranan desen değerleri. İkinci yarısı eylem: düşür, ilet, değiştir ya da denetleyiciye gönder. Kaydın tamamı yedi bileşen taşır — eşleşme alanları, öncelik, sayaçlar, talimatlar, zaman aşımları, cookie ve bayraklar. Kaydı tekil kılan ikili ise eşleşme alanları ile öncelik.
Üst üste binen desenleri öncelik ayırır. Aynı pakete uyan iki kayıttan önceliği yüksek olan kazanır. Aynı en yüksek öncelikte birden çok kayıt eşleşirse sonuç tanımsız. Sayaçlar da her kayıtta ayrı tutulur: kaç paket ve kaç bayt eşleşti.
Belgeleme adresleriyle kurulmuş bir örnek, s1 anahtarının dört portu için:
| öncelik | eşleşme | eylem |
|---|---|---|
| 200 | kaynak 198.51.100.0/24, hedef 203.0.113.0/24, TCP hedef portu 80 | forward(4) |
| 200 | kaynak 198.51.100.0/24, hedef 203.0.113.0/24, TCP hedef portu 443 | forward(3) |
| 100 | hedef 203.0.113.0/24 | forward(3) |
| 0 | bütün alanlar joker | CONTROLLER |
198.51.100.7 adresinden 203.0.113.9 adresine giden ve hedef portu 80 olan bir paket iki kayda birden uyar. Kazanan 200 önceliğindeki kayıt. Aynı adres çifti arasında hedef portu 22 olan bir paket ise yalnızca alttaki kayda uyar. Aynı hedefe giden iki paket, iki ayrı porttan çıktı.
Her akış tablosu bir table-miss kaydı taşımak zorunda: bütün alanlar joker, önceliği sıfır. 192.0.2.5 adresinden 192.0.2.9 adresine giden bir paket üç özgül kaydın hiçbirine uymaz; onu bu son satır karşılar. Kayıt hiç yoksa varsayılan davranış paketi düşürmektir.
Eşleşme ile eylemin ikilisi farklı cihazları tek çatı altında topluyor. Yönlendirici en uzun hedef önekine bakar, anahtar hedef MAC adresine. Güvenlik duvarı adres ve port ikilisine bakıp izin verir ya da reddeder. Adres çevirisi ise ikisini yeniden yazar. Tek tek tablolar orkestra edildiğinde ağ çapında bir davranış doğuyor, ama hiçbir anahtar o davranışın tamamını bilmiyor.
Eşleşmenin hangi alanları okuyabildiği de yazılı bir liste. İlk OpenFlow sürümü on iki alan tanımladı ve bu on iki alan, kitabın üç ayrı katmanında tanıdığın başlıklardan geliyor:
| katman | alanlar |
|---|---|
| — | giriş portu |
| bağ | kaynak MAC · hedef MAC · tür alanı · VLAN kimliği · VLAN önceliği |
| ağ | kaynak IP · hedef IP · protokol · hizmet türü |
| taşıma | kaynak port · hedef port |
Her alanın yanında bir de joker hakkı var: o alanı “umursama” diye işaretlersen kural bütün değerlere uyuyor. Tek bir satır böylece bir paketi değil, bir sınıfı tarif ediyor.
Şimdi bunu yönlendirme tablosuyla karşılaştır. Orada tek bir alan vardı — hedef IP — ve tek bir eylem: bir sonraki durağa ilet. Burada on iki alan ve dört eylem ailesi var. Klasik yönlendirme, bu tablonun yalnızca hedef IP alanı doldurulmuş, geri kalanı jokerlenmiş özel hâli. Genelleştirilmiş iletme adı da tam olarak bunu söylüyor: eskisini yok etmiyor, kapsıyor.
Birden çok satırın aynı pakete uyması normal; kazananı öncelik alanı seçiyor. En uzun önek eşleşmesinin buradaki karşılığı bu — orada “daha çok bit sabitleyen” kazanıyordu, burada “yöneticinin daha yüksek numara verdiği”.
Aynı trafiği iki yola nasıl bölersin?
Trafiği ağdaki yollara istenen oranlarda dağıtma işinin adı trafik mühendisliği. Klasik yönlendirmede operatörün elinde tek düğme var: bağlantı ağırlıkları. Gerçek bir denetim için fazlasıyla kaba bir araç. Bir düğümden diğerine akan 10 Gbit/s’lik trafiği %60 ve %40 diye iki yola bölmek istediğini varsay. Birinci yola 6 Gbit/s, ikincisine 4 Gbit/s düşecek. Ağırlıkları oynatarak bu bölüşümü kuramazsın.
Asıl istenen şey genelde daha da zor. Aynı iki nokta arasındaki iki trafik türünü ayrı yollardan geçirmek. Karar yalnızca hedef adrese bakıyorsa iki trafik aynı yolu paylaşmak zorunda. Akış kurallarında bu ayrım, kaynak öneki ya da taşıma portu farkıyla iki ayrı kayda yazılır.
Merkezî kontrolün üç gerekçesi var. Birincisi yönetim kolaylığı: yanlış yapılandırmalardan kaçınmak ve akışları esnek yönlendirmek. İkincisi merkezden programlamanın kolaylığı. Üçüncüsü açık bir kontrol düzlemi uygulamasının satıcı kilidini kırması.
Dağıtık programlamak zor iştir. Statik yolu elle yazmış, çalışan yapılandırma ile başlangıç yapılandırması arasındaki farkı görmüştün. 500 yönlendiricili bir ağda cihaz başına 2 dakika iyimser bir tahmin. Toplamı yine de 1.000 dakika, yani yaklaşık 16,7 saat — tek bir kural değişikliği için.
Bütün bunları toplayan tanım dört maddeli: genelleştirilmiş akış tabanlı iletme, kontrol ile veri düzleminin ayrılması, kontrol işlevlerinin anahtarların dışında durması ve programlanabilir kontrol uygulamaları. Dördü birden yoksa ortada yazılım tanımlı ağ da yok.
Denetleyici anahtarla nasıl konuşuyor?
Denetleyicinin içinde üç bileşen buluyorsun. En altta denetlenen anahtarlarla mesajlaşan iletişim katmanı duruyor. Ortada bağlantıların ve anahtarların durumunu dağıtık bir veritabanında tutan durum yönetimi var. En üstte kontrol uygulamalarına bakan arayüz katmanı oturuyor.
Yukarıdaki uygulamalarla kuzeye bakan API üzerinden, aşağıdaki anahtarlarla güneye bakan API üzerinden konuşulur. Güneydeki API bir yetenek listesinden çok bir sınır çizgisi: neyin denetlenebilir olduğunu o tanımlıyor.
Kontrol uygulamaları paketten çıkarılmış durumda. Üçüncü bir taraf yazabilir. Veri düzlemi anahtarları ise hızlı, basit ve sıradan olacak şekilde tasarlanıyor. Zekâyı dışarıya verdikleri için ucuzlar.
Güneydeki trafiğin somut hâli OpenFlow. Mesajlar TCP üzerinden taşınır, şifreleme isteğe bağlıdır ve üç sınıf vardır: denetleyiciden anahtara, anahtardan denetleyiciye ve simetrik olanlar. IANA’nın tahsis ettiği varsayılan port TCP 6653; eski 6633 ve 976 portları bırakıldı.
Her mesaj 8 baytlık ortak bir başlıkla başlıyor: 1 bayt sürüm, 1 bayt tür, 2 bayt uzunluk, 4 bayt işlem kimliği. Son alanın adı xid; cevap isteğin xid’ini aynen taşır. Bütün mesajlar big-endian gönderilir. Adlar ile numaralar da sabit:
| yön | mesaj | numara |
|---|---|---|
| anahtardan denetleyiciye | OFPT_PACKET_IN | 10 |
| anahtardan denetleyiciye | OFPT_FLOW_REMOVED | 11 |
| anahtardan denetleyiciye | OFPT_PORT_STATUS | 12 |
| denetleyiciden anahtara | OFPT_PACKET_OUT | 13 |
| denetleyiciden anahtara | OFPT_FLOW_MOD | 14 |
Bu sayılar OpenFlow 1.5.1 sürümünden; o sürümün sürüm baytı 0x06. Denetleyici anahtara önce ne yapabildiğini sorar; buna features denir. Kural yazma işini modify-state ile yapar. Anahtar ise tanımadığı bir paketi packet-in ile hem paket hem denetim olarak denetleyiciye devreder.
Bir bağlantı koptuğunda dizi şöyle işliyor. Anahtar port-status ile denetleyiciyi uyarır. Denetleyici link state (bağlantı durumu) bilgisini günceller. Kayıtlı yönlendirme uygulaması çağrılır ve yeni yolları hesaplar. Sonra yalnızca güncellenmesi gereken anahtarlara yeni tablolar kurulur.
Bu döngünün bir bedeli var, çünkü denetleyici ayakta olsa bile uzakta. Diyelim ki bir anahtardan tek yön 10 ms uzakta duruyor; uyarının gidişi ve yeni tabloların dönüşü en az 20 ms sürer. Veri düzlemi nanosaniye ölçeğinde çalışıyor, o pencerede çok sayıda paket eski karara göre işlenir.
Operatörler bu mesajları elle üretip göndermez. ONOS’un niyet çerçevesi gibi üst düzey soyutlamalar nasıl yerine ne diye tarif etmeye yarar.
Zekâ ağın neresinde duruyor?
RFC 7426 yazılım tanımlı ağı bir yetenekle tanımlıyor: yazılım uygulamaları ağ cihazlarını tek tek programlayabilsin ve ağın bütününün davranışı böylece denetlenebilsin. Anahtar unsur, iletme düzlemi ile kontrol düzleminin arasına bir soyutlama koymak. Aynı belge ikili değil beşli bir ayrım yapar: iletme, işletim, kontrol, yönetim ve uygulama düzlemleri. Buradaki ikili anlatım onun sadeleştirilmiş hâli.
Yirminci yüzyıl telefon ağında zekâ santrallerdeydi. Uçlar yalnızca rakam ve ses gönderebiliyordu. RFC 1958 internetin ilkesini bunun tersi olarak yazdı: zekâ ağın içine gizlenmez, uçlarda durur. Bugün tablo bir kez daha döndü. Zekâ, ağın içindeki sıradan beyaz kutuların üzerine yazılım katmanı olarak biniyor.
O beyaz kutular artık açık bir API konuşuyor; mimarinin donanım tarafı bu. Aynı kutuların üstünde programlanabilir servisler koşturmayı ise yolun üstündeki kutuları açtığımız durakta ele alacağım. Eşleşme ile eylem fikri de OpenFlow’da durmadı: P4 gibi diller paket işleme hattının kendisini programlanabilir kılıyor.
Google kendi ağları için ORION adında bir kontrol düzlemi yazdı. Orada yönlendirme ile trafik mühendisliği protokol sayılmaz; çekirdeğin üstünde koşan birer uygulamadır. İç ağda klasik anlamda yönlendirme protokolü yok.
Bu mimari bugün veri merkezlerinin içinde ve arasında yaygın kullanılıyor. 5G hücresel ağlarda da taşıyıcı bir bileşen. Aynı ayrımı, çekirdek ağın denetim ve kullanıcı düzlemlerine bölünmesinde zaten görmüştün.
Merkezîleştirmenin yönlendirmeyle sınırlı kalması da gerekmiyor: denetleyici, bildirilen tıkanıklık seviyelerine bakıp göndericilerin hızını belirleyebilir. Ağ işlevlerinin bundan sonra protokollerle mi merkezî hesapla mı gerçekleştirileceği açık bir soru.
Bölümün sorusunun cevabı ise tek. Hem hedef tabanlı iletme tablosunu hem genelleştirilmiş akış tablosunu dolduran şey kontrol düzlemidir.
Özet
Peki, ne öğrendik?
- Kontrol düzlemi taşınabilir: yönlendirme hesabı ya her kutunun içinde koşar ya da uzaktaki bir denetleyicide, ve bu bir tasarım tercihidir.
- Merkezîlik mantıksaldır: karar mercii tektir, makine tek olmak zorunda değildir; denetleyicinin kendisi fiziksel olarak dağıtık kurulur.
- Kural desen ile eylemden oluşur: eşleşme başlığın birçok alanını birlikte okur, öncelik çakışmayı çözer, sayaçlar da eşleşen paketi ölçer.
- Joker satır zorunludur: hiçbir kuralın tutmadığı paketi table-miss kaydı karşılar, o da yoksa paket düşer.
- Ayrım açık bir protokole dayanır: denetleyici ile anahtar arasındaki OpenFlow mesajları güneye bakan API’yi somutlaştırır.
Kararı kimin verdiğini artık biliyorsun. Ama verilen kararın işe yarayıp yaramadığı ayrı bir soru: o hattan kaç paket geçti, hangi kural kaç kez tuttu ve bunu kim sayıyor?
Bölüm 41: Ağ İzleme ve Yönetimi
Kararı denetleyici verdi. Ama o kararın tuttuğunu kimse ölçmediyse elde yalnızca bir varsayım var.
Paket geçti gitti. Geçtiği her cihaz onu bir sayaca ekledi ve o sayaçlar bir yere akıyor. Peki o sayacı kim okuyor?
İzlemek yönetimin yalnızca ilk adımı
Tek bir ağ, birbiriyle etkileşen binlerce donanım ve yazılım bileşeninden oluşur. Bu ölçekte hiçbir şey tek tek gözle izlenmez. Klasik tanım da izlemekle yetinmiyor; beş fiili birden sayıyor: izlemek, sınamak, yoklamak, yapılandırmak ve değerlendirmek.
Ağ yönetiminin mimarisi üç parçadan kurulur. En altta yönetilen cihaz durur: anahtar, yönlendirici, erişim sunucusu, köprü, hatta sıradan bir bilgisayar. Onun üstünde bir yönetim ajanı çalışır. Ajan cihazın bilgilerini alır, saklar ve merkeze aktarır; merkezden gelen değişikliği de cihaza o uygular. Üçüncü parça merkezdeki yönetim sunucusudur ve soruyu o sorar.
Cihazdan toplanan veriyi üç türe ayırabilirsin. Yapılandırma verisi cihazın nasıl ayarlandığını söyler. İşletim verisi o an ne yaptığını söyler. Sayaçlar üçüncü kümede, cihaz istatistiklerinin içinde durur.
Operatörün önünde üç yol var. Komut satırından arayüz yapılandırmayı tek bir cihazda yaptın; aynı işi binlerce cihazda elle yapmak ölçeklenmiyor. İkinci yol sayacı uzaktan sorgulamak ve değer yazmak. Üçüncüsü ise ağ genelinde yapılandırma yönetmeye yarıyor.
SNMP bir sayacı hangi adla sorar?
SNMP bu mimarinin protokol karşılığıdır: ajan uygulama, yönetici uygulama ve ağ yönetim sistemi. Mesajları UDP taşır ve iyi bilinen port numarası 161’dir; IANA 1024’ün altını bu sınıfa ayırmıştır. Ölçüm trafiğinin kendisi garantisiz bir taşımaya binmiş durumda.
Bilgi iki kipte taşınır. İstek/yanıt kipinde sunucu sorar, cihaz cevaplar. Trap kipinde cihaz kimse sormadan kendi haber verir. Mesaj türü altı tane.
| mesaj | yön | ne yapar |
|---|---|---|
GetRequest | yöneticiden ajana | tek bir değeri ister |
GetNextRequest | yöneticiden ajana | sıradaki değeri ister |
GetBulkRequest | yöneticiden ajana | büyük bir bloğu tek seferde ister |
SetRequest | yöneticiden ajana | değeri değiştirir |
Response | ajandan yöneticiye | istenen değeri döndürür |
Trap | ajandan yöneticiye | sorulmadan olayı bildirir |
Bu altısının içinde biri protokolün ne olduğunu değiştirir. SetRequest uzaktan bir değeri yazar; SNMP o anda okuma aracı olmaktan çıkar. Trap ise alarmın protokol düzeyindeki karşılığıdır.
Yazma yetkisi olan bir protokolün kimlik doğrulaması da olmalı — ve olmaması, SNMP’nin uzun süre taşıdığı yaranın kendisiydi. Sürümlerin tarihi bu tek sorunun etrafında dönüyor:
| sürüm | kimlik doğrulama | telde |
|---|---|---|
| v1 | topluluk dizesi | düz metin |
| v2c | topluluk dizesi | düz metin |
| v3 | kullanıcı adı + kriptografik özet | şifreli olabiliyor |
İlk iki sürümdeki topluluk dizesi teknik olarak bir paroladır ama pratikte bir paroladan beklenen hiçbir şeyi yapmaz: pakette düz metin gider, yani hattı dinleyen herkes okur. Üstüne bir de yaygın varsayılanları vardır — okuma için public, yazma için private. Bir ağ tarayıcısının ilk denediği şey tam olarak bu iki kelimedir, ve SetRequest yetkisi veren bir dizeyi bulmak cihazı yeniden yapılandırma yetkisi bulmak demektir.
v3 üçünü birden getirdi: göndereni doğrulayan bir kimlik denetimi, mesajın kurcalanmadığını gösteren bir MIC (bütünlük kodu) ve isteğe bağlı şifreleme. Ayrıca tekrar oynatmayı engellemek için her cihazın bir açılış sayacı ve zaman damgası taşıması şart koşuldu.
Buna rağmen sahada hâlâ bol miktarda v2c çalışıyor, çünkü kurulumu kolay ve pek çok cihaz onunla geliyor. Pratik kural şu: SNMP trafiğini ayrı bir yönetim ağında tut, ve SetRequest yetkisini gerçekten gerekmedikçe hiç açma.
Başlık da sabittir. PDU türü alanı mesajın hangi aileden geldiğini söyler; get ve set başlığında ayrıca Request ID, Error Status ve Error Index alanları durur.
get / set başlığı
+----------+------------+--------------+-------------+
| PDU türü | Request ID | Error Status | Error Index |
| 0 - 3 | | 0 - 5 | |
+----------+------------+--------------+-------------+
trap başlığı: PDU türü alanı burada 4 değerini taşırBir sayacın adresini veren şey ise MIB’dir. MIB, SNMP ile alınabilecek bilginin resmî tanımıdır: hangi sayacın hangi adla ve hangi anlamla durduğunu belge düzeyinde sabitler. Buradaki değişkenler noktalı bir sayı dizisiyle adlandırılır ve dizinin her basamağı ağacın bir dalına karşılık gelir.
1.3.6.1.2.1.7.1 → UDPInDatagramsBu kimliğin karşılığı, cihazın aldığı UDP datagramlarını sayan 32 bitlik bir alandır. Yazımı SMI adlı veri tanımlama diline dayanır.
RFC’lerde tanımlı 400 MIB modülü var ve üreticiye özgü olanların sayısı bundan çok daha fazla. Ethernet benzeri arayüzlerin yönetilen nesneleri RFC 3635’te tanımlıdır. Anahtarlamalı ağlar için uzaktan izleme modülü ise RFC 2613’te durur ve SMON MIB adıyla anılır. Aynı sorgu böylece farklı markaların anahtarlarından aynı biçimde işletim bilgisi çeker: sıcaklık, bağlı kullanıcı sayısı, bağlantı hızı, cihazın çalışma süresi.
Yapamadığı da var. Bir Set tek cihaza tek değer yazar ve yarıda kalırsa geri alınmaz. NETCONF birden çok cihaz üzerinde atomik commit yapabilir: ya hepsinde uygulanır ya hiçbirinde. Mesajları XML ile kodlanır ve güvenli bir taşıma üstünden uzak yordam çağrısı olarak gider. <lock> işlemi yapılandırma deposunu kilitler; o sırada başka bir oturum aynı yere yazamaz. YANG ise protokol değil, veri modelleme dilidir.
Sayaç kimin geçtiğini bilmez
Port başına paket saymak yararlı grafikler üretir. Ama sayaç ne kadar geçtiğini bilir, kimin nereye gittiğini bilmez.
Cevap akış kavramında. Bir akış, bağlantı, ağ ve taşıma katmanı başlık alanlarının belli bir bileşimiyle tanımlanır. Akış kurallarını merkezî denetleyici yazıyordu; o kuralın yanında duran iki sayaç eşleşen paket ve bayt sayısını tutuyor. Kural birçok başlık alanına birden baktığı için sayacın hangi trafiği saydığı da o alanlarla tanımlanmış oluyor. Yönlendirme kararının kendisi ölçümü üretiyor.
Akış bilgisi toplamak için iki ayrı sistem geliştirildi. sFlow serbest lisanslı bir belirtim, NetFlow ise Cisco Systems’in protokolü. NetFlow zamanla IPFIX’e evrildi ve IETF standardı olarak geliştirildi.
Akış izleme paket akışlarını akış kaydına çevirir. Kayıt paketin kendisini taşımaz, akışın özetini taşır. Kapasite planlaması bunun en sıkıcı kullanımı. Asıl değeri, olağandışı trafiği ve başka türlü görünmeyecek saldırı trafiğini fark ettirmesinde.
Anahtar bu protokolleri desteklemiyorsa trafik dışarıdan alınır. Ayna port bir ya da birkaç portun trafiğini kopyalayıp tek bir porta verir. Oraya bağlanan analizör trafiğin kendisini görür, sayacını değil. Büyük bir üreticideki adı SPAN portudur. Standartlaşmış bir özellik de değildir: yetenek ve sınırlar üreticiye göre değişir, bazıları aynalanan trafiği ağ üstünden uzak bir alıcıya bile gönderir.
Fiber hatlarda ikinci bir yol var. Optik ayırıcı ışığın kopyasını çıkarır ve dışarıdaki bir makineye verir. Üçüncüsü prob: bir anahtar portuna takılır ve sürekli karışık modda çalışarak geçen trafiğin istatistiğini üretir.
Eşik olmadan veri bilgi olmaz
Bir ölçüm sisteminin ilk kararı zaman ölçeğidir. Birçok analizör yükü varsayılan olarak 1 saniyelik ortalamayla gösterir. Bu kısa bir pencere gibi durur ama değildir. Sonuna kadar dolu bir 10 Mbit/s Ethernet kanalı o saniyede kuramsal olarak 14.880 çerçeve taşır. Gigabit Ethernet 1.488.000 çerçeveye çıkar, tam 100 kat. 100 Gbit/s sistemde sayı 148.800.000 olur.
DerinleşmeYoklama aralığı ölçümü nasıl sessizce yalan söyler?
Bir sayaç sonsuz değildir. Klasik SNMP sayaçları 32 bit genişliğinde; bir oktet sayacı 4.294.967.296 oktette başa döner. Sonuna kadar dolu 1 Gbit/s bir hatta bu sınıra yaklaşık 34,4 saniyede varılır. 10 Gbit/s’te süre 3,4 saniyeye iner.
Şimdi bunu toplama aralığıyla yan yana koy. Yüksek başarımlı bir trafik izleyici arayüz sayaçlarını 60 saniyede bir toplar ve binlerce arayüzlü ağları bu tempoyla taşır; arayüz başına günde 1.440 örnek eder. Tempo yönetilebilir görünüyor. Ama gigabit bir upstream bağlantısında sayaç iki yoklama arasında bir kez başa dönmüşse, iki okuma arasındaki fark gerçek trafiğin altında çıkar. Ölçüm hata vermez, sessizce küçük bir sayı söyler.
Kaçış yolu iki tane ve ikisi de bedelli. Ya sayacı genişletirsin, ya yoklamayı sıklaştırırsın; ikincisi hem cihazın işlemcisini hem de ölçüm trafiğini büyütür.
İzlenmesi gereken asgari küme üç kalemden ibaret: port kullanım oranı, yayın ve çoklu yayın hızı, bir de CRC hatası gibi temel hata istatistikleri. Hata sayacı, sorun yaşayan cihazı adres vermeden işaret eder.
Saha pratiğinde aşırı yük eşikleri şöyle konur. Sekiz saatlik iş günü ortalamasında %20, günün en yoğun saatinde %30, on beş dakikalık ortalamalarda %50. Otuz dakikalık bir örnekte %25 gördüysen bu, iş günü ortalaması için konan sınırın üstünde. Bunları önce anahtarları çekirdeğe bağlayan upstream portlarında izlersin; darboğaz oradadır. Kuyruk, trafiğin ortalamasıyla değil değişkenliğiyle büyüyordu; eşikler tam o değişkenliği yakalamak için farklı pencerelere konur.
Çok sayıda anahtardan düzenli istatistik toplayıp hepsine tek tek bakmayı denersen veride boğulursun. Toplamak kolay, yorumlamak zor. Bazı üreticiler bunun için sağlık raporu üretir ve yalnızca yeterince ciddi hata görülen cihazları listeler. Eşik, veriyi bilgiye çeviren şeydir.
Arıza tespiti ayrı bir hattan yürür. Sistem cihazlara düzenli aralıklarla yoklama paketi yollar; cihaz belli sayıda denemeden sonra cevap vermezse düştü işaretlenir ve haber verilir. IP ağlarında en basit biçimi ping’dir: yankı isteği gider, kaç tanesinin döndüğü sayılır. Cihazın kendi olay mesajları ise syslog olarak akar; logging buffered bellekte tutar, show logging gösterir, logging <host> başka bir makineye yollar.
Aynı fikri kendi makinende de görebilirsin. netstat komutu TCP/IP bağlantılarını, gönderilen ve alınan paket ayrıntılarını, yönlendirme tablosunu ve arayüz istatistiklerini basar.
$ netstat -e -s
Arayüz İstatistikleri
Alınan Gönderilen
Bayt 418.223.104 37.884.912
Tekli yayın paketi 412.771 298.140
Atılan 0 0
Hata 0 0Bu tablo bir anahtar portunun küçük kopyası. MRTG, aynı sayaçları SNMP ile yoklayıp tarayıcıda görülebilen grafiklere çeviren yaygın bir yazılım. iperf ise ters yönde çalışır: ağı yüksek veri hızıyla zorlayan aktif bir sınayıcıdır. Wireshark ise canlı trafiği ya da kaydedilmiş bir pcap dosyasını okuyup istatistik çıkarır. Sayaç düzeyinde bakmakla paket düzeyinde bakmak birbirinin yerine geçmez, tamamlar.
Özet
Peki, ne öğrendik?
- Ağ yönetimi izlemekten geniştir: sınamak, yoklamak, yapılandırmak ve değerlendirmek aynı işin fiilleridir; mimari de yönetilen cihaz, ajan ve sunucudan kurulur.
- SNMP sayaçlara ortak bir ad verir: MIB hangi değerin hangi nesne kimliğiyle duracağını sabitler, bu yüzden aynı sorgu farklı markalardan aynı bilgiyi çeker.
- Trap alarmın protokol karşılığıdır: olağandışı olayı ajan kendi başlatır ve
SetRequestprotokolü okumanın yanında bir yazma aracına çevirir.- Akış izleme sayacın söyleyemediğini söyler: kayıt paketi taşımaz, akışın özetini taşır ve trafiğin neyden oluştuğunu görünür kılar.
- Eşik veriyi bilgiye çevirir: ham grafik tek başına bir şey söylemez, anlamı hangi pencerede hangi oranın aşıldığına konan sınır üretir.
Buraya kadar ölçülen her şey tek bir yönetimin altındaydı: sayaçlar aynı merkeze aktı, eşiği de alarmı da aynı ekip yönetti. Bu ağdaki herkes birbirine güveniyor; peki paket bu sınırdan çıktığında ne o güven kalıyor ne de ortak bir harita; yolunu neye bakarak seçiyor?
Bölüm 42: Alanlar Arası Yönlendirme
Bir ağın içinde herkes aynı yönetime bakıyordu; güven de oradan geliyordu. Sınırın ötesinde ikisi de yok, kimsenin elinde bütün ağın haritası da yok.
Yine de paket yolunu buluyor. Peki tam haritayı kimsenin görmediği bir yerde o yol nasıl seçiliyor?
Sınırı çizen şey coğrafya mı?
Şimdiye kadar anlattığım yönlendirme iki varsayıma yaslanıyordu. Bütün yönlendiriciler birbirinin aynı, ve ağ düz bir yüzey. İkisi de gerçek değil.
Düzlüğün bedelini hemen görürsün. Her yönlendirici herkesle tablo alışverişi yapsaydı o alışverişin kendisi hatları doldurur ve veri paketine yer kalmazdı. Ölçek sorununun asıl yüzü de burası.
İkinci kırılma noktası ölçekle ilgili değil. Her ağ yöneticisi kendi ağındaki yönlendirmeyi kendi denetlemek ister ve kimseye hesap vermek istemez.
İnternetin cevabı yönlendiricileri bölgelere toplamak oldu. Bu bölgeye otonom sistem deniyor; aynı yapının bir adı da alan (domain). Otonom sistem, tek bir kuruluşun yönettiği yönlendiriciler ve ağlar kümesi; çoğu zaman o kuruluş bir servis sağlayıcı oluyor. Sınırı coğrafya çizmiyor, yönetim çiziyor.
İki şartı var. Birincisi içeri bakar: bir otonom sistem kendi içinde bağlı olmak zorundadır, yani içindeki herhangi iki düğüm arasında en az bir yol bulunur. İkincisi dışarı bakar. İçeride birden çok iç protokol ve birden çok metrik koşsa bile, dışarıya tek ve tutarlı bir yönlendirme planı gösterilir.
Eski tanım daha katıydı: bir otonom sistemin bütün yönlendiricileri tek bir iç protokol koşardı. Şart zamanla dışarıya bakan yüze taşındı. Bugün iç protokolü her otonom sistem kendi seçer, komşusu bambaşkasını koşar ve kimse kimseye sormaz. Bağlantı durumu ile uzaklık vektörü aynı ağda yakınsıyordu; o karar sınırın içinde kalır.
Dış protokolde serbestlik yok: iki otonom sistem konuşacaksa aynı dış protokolü koşmak zorundadır. İnternette o protokol tek: BGP. Dördüncü sürümü RFC 4271’de tanımlı ve otonom sistemler arası fiili standart.
Sınırda duran cihaza geçit yönlendirici denir. Başka otonom sistemlerdeki yönlendiricilere doğrudan hattı vardır.

Sınırda ne konuşuluyor?
BGP oturumu iki yönlendirici arasında yarı kalıcı bir TCP bağlantısıdır. Bir kez kurulur, sürekli açık tutulur ve bütün ilanlar bu tek borudan akar. Dinleyen taraf 179 numaralı TCP portunu açar. Taşıma olarak TCP kullandığı için parçalama, yeniden iletim, onay ve sıralama BGP’nin işi olmaz.
Oturum fiziksel bir hatla birebir örtüşmez: iki uç arasında doğrudan kablo olmayabilir. Üstünden dört mesaj geçer.
| mesaj | ne yapar |
|---|---|
OPEN | oturumu açar ve karşı tarafı doğrular |
UPDATE | yeni yol ilan eder ya da eskisini geri çeker |
KEEPALIVE | sessizlikte bağlantıyı canlı tutar |
NOTIFICATION | hatayı bildirir ve oturumu kapatır |
Dördünün de başı aynı. BGP başlığı 19 bayttır: 16 baytlık Marker, 2 baytlık Length, 1 baytlık Type. Bir mesaj en çok 4.096 bayt olabilir, en kısa UPDATE ise 23 bayt. KEEPALIVE yalnızca başlıktan ibarettir, yani 19 bayt.
Marker alanı bir zamanlar kimlik doğrulama taşıyordu. Bugün yalnızca geriye uyumluluk için duruyor ve tamamı bir yapılmak zorunda.
Canlılığı iki zamanlayıcı yönetir. Hold Time ya sıfır olacak ya da en az 3 saniye; iki taraf OPEN mesajında kendi değerini önerir ve küçük olan kazanır. Önerilen varsayılan 90 saniyedir. KEEPALIVE aralığı bunun üçte biri, yani 30 saniye. Oturum düşmeden önce üç mesajlık pay kalıyor. Alt sınır da konmuş: KEEPALIVE saniyede birden sık gönderilemez.
Hold Time dolarsa oturum düşer ve o komşudan öğrenilen bütün yollar tablodan silinir. Kopan oturumu yeniden kurmak için önerilen bekleme 120 saniyedir.
İlanın kendisi de bir ritme bağlı. Aynı öneke ait iki ilan arasında dışarıya doğru en az 30 saniye, kendi sınırının içinde 5 saniye bırakılır. Bir hat saniyede on kez inip kalksa bile bu titreme komşuya aktarılmaz.
BGP’nin iki yüzü var. Komşu otonom sistemlerden erişilebilirlik bilgisi almak eBGP’nin işi; o bilgiyi kendi sınırının içine yaymak iBGP’nin. Geçit yönlendiriciler ikisini birlikte koşar.
Böyle bir yönlendirici üç ayrı tablo tutar: komşuluk tablosu, bütün komşulardan gelen yolların biriktiği BGP tablosu ve elemeden sonra kalanların yazıldığı IP yönlendirme tablosu. Yönlendirme tablosu en uzun önek eşleşmesiyle okunuyordu; BGP oraya yalnızca kazanan satırı yazar. Satırın önündeki harf kaynağını söyler: doğrudan bağlı ağ C, elle yazılan satır S, BGP’den öğrenilen yol B.
İlan edilen şey mesafe mi, güzergâh mı?
BGP bir yol vektörü protokolüdür ve adı tam olarak ne gönderdiğini söyler. Komşuya mesafe sayısı değil, geçilen otonom sistemlerin listesi gider. İlan edilen şey çıplak bir önek de olmuyor: önek artı öznitelikler gidiyor ve ikisi birlikte yol diye anılıyor. Belirleyici iki öznitelik var: güzergâhı taşıyan AS_PATH ve sonraki durağı veren NEXT_HOP.
AS_PATH somut olarak numaralardan oluşan bir dizidir. İlan dışarıya çıkarken yönlendirici kendi AS numarasını listenin başına ekler. Liste böylece yolun kendisi olur.
Döngü denetimi tek satırlık bir iş. Yönlendirici gelen yolun listesini tarar ve kendi numarasını görürse o yolu eler. Yol vektörünün uzaklık vektörüne üstünlüğü tam olarak burası. Tek bir AS_SEQUENCE parçasına en çok 255 otonom sistem sığar, taşarsa yeni bir parça açılır.
Bir ilan teknik bir bilgi değil, bir söz. İlan eden taraf o öneke giden paketleri hedefe doğru ileteceğine söz verir. İlanı geri çekmek bu sözü geri almaktır.
Sözün kapsamı genişletilebilir. Bir otonom sistem ilanında önekleri birleştirir, komşuya tek satır göndererek onlarca alt ağı kapsar ve genel tablo bu sayede şişmez.
Numaranın kendisi de bir kez dara düştü. Temel tanımda AS numarası 2 baytlıktı; tükeneceği görülünce 4 bayta çıkarıldı. Eski yazılımlar yeni numaraları okuyamadığı için 23456 numarası AS_TRANS adıyla ayrıldı ve gerçek bilgi AS4_PATH ile AS4_AGGREGATOR özniteliklerine taşındı. Kazanç büyük: 65.536 numaralık uzay 4.294.967.296’ya çıktı.
En kısa yol neden her zaman kazanmıyor?
İlanı alan geçit yönlendirici onu bir alma politikasından geçirir ve yolu kabul ya da reddeder. Politika tek bir otonom sistemi tümüyle dışlayabilir: onun üstünden geçen her yol elenir. Aynı politika o yolun komşulara ilan edilip edilmeyeceğine de karar verir.
Aynı hedefe birden çok yol öğrenildiğinde eleme sırası sabittir.
- Yerel tercih değeri — saf politika kararı, sayıyı yönetici koyar.
- En kısa AS_PATH — listedeki durak sayısı.
- En yakın NEXT_HOP — iç maliyeti en düşük çıkış.
- Kalan ölçütler — yukarıdakiler eşit çıkarsa bakılır.
Yerel tercihe AS_PATH’ten önce bakıldığı için politika kısa yolu geçersiz kılabilir.
Vakayı kuralım. 203.0.113.0/24 önekini AS 64500 ilan ediyor. Karar veren geçide bu önek iki yoldan geliyor: AS 64501’den gelen yolun AS_PATH uzunluğu 2, AS 64502 ile AS 64503 üstünden gelenin 3. Yerel tercih eşitse kısa olan seçilir. Ama AS 64502’den gelen yola daha yüksek bir yerel tercih verilirse uzun yol kazanır. Paket üç otonom sistem atlayarak gider.
Aynı önek için gelen ilanların hangi ölçütle elendiğini izleyelim:
- Önek tek yerden doğuyor. 203.0.113.0/24 önekinin sahibi AS 64500 ve ilanı o başlatıyor. İlan sınırdan çıkıp komşulara yayılıyor, karar veren geçide iki ayrı yoldan ulaşıyor.
- Üstteki liste iki durak. AS 64501 doğrudan komşu. İlan geçide vardığında AS_PATH listesinde iki numara var, çünkü yolu her geçen otonom sistem kendi numarasını listenin başına ekliyor.
- Alttaki liste üç durak. Aynı önek AS 64502 ile AS 64503 üzerinden de geliyor. Aynı hedef, aynı ilan, daha uzun liste. Geçidin BGP tablosunda artık iki aday duruyor.
- Eşitlikte kısa liste kazanır. İki yolun yerel tercihi eşitse eleme ikinci ölçüte iniyor ve AS_PATH uzunluğuna bakılıyor. İki duraklı yol seçiliyor, üç duraklı olan tabloya hiç yazılmıyor.
- Yerel tercih uzun yolu seçer. Yönetici alt yola daha yüksek bir yerel tercih verirse eleme birinci ölçütte biter. Uzunluk hiç sorulmaz ve paket üç otonom sistem atlayarak gider.
Seçim bittiğinde bir soru kalıyor: paket kendi ağından hangi kapıdan çıkacak? Sıcak patates yönlendirmesi aynı hedefe birden çok çıkış varsa iç maliyeti en düşük geçidi seçer. Kaç otonom sistem atlanacağı hesaba hiç katılmaz. AS 64500’ün iç maliyeti 30 ve 45 olan iki çıkışı varsa ucuz olan kazanır, toplam uçtan uca yol daha uzun olsa bile.
DerinleşmeBir yol neden teknik değil ticari gerekçeyle seçiliyor?
Bir otonom sistemin komşularına hangi hedefleri ilan edeceği bir politika kararıdır ve gerekçesi çoğu zaman teknik olmaz.
Tipik örüntü şu. Bir servis sağlayıcı kendi müşteri ağlarına giden ve onlardan gelen trafiği taşımak ister. Başka sağlayıcılar arasında geçiş trafiği taşımak istemez, çünkü o trafikten geliri yoktur. Uygulaması sessizdir: taşımak istemediği trafiğin yolunu komşusuna hiç ilan etmez. İlan edilmeyen yol komşunun haritasında hiç var olmaz, dolayısıyla o yönde tek paket bile gelmez.
Aynı hamleyi küçük ağ da yapar. İki sağlayıcıya birden bağlı bir ağ, ikisi arasında ücretsiz geçit olmayı reddedebilir; yöntem bir sağlayıcıya diğerine giden yolu hiç ilan etmemektir.
Merkezde iyi bağlanmış az sayıda büyük ağ duruyor: ulusal ve uluslararası kapsamı olan birinci kademe sağlayıcılar. Rakipler birbirine internet değişim noktalarında ve eşleme hatlarında bağlanıyor. Sağlayıcı ile otonom sistem de birebir aynı şey sayılmaz: bazı birinci kademe sağlayıcılar bütün ağı için tek otonom sistem kullanır, bazıları ağını onlarca birbirine bağlı otonom sisteme böler. İçerik sağlayıcılar ise kendi özel ağlarını kurup veri merkezlerini internete bağlıyor ve çoğu zaman birinci kademe ile bölgesel sağlayıcıları tümüyle atlıyor.
İlana kim kefil?
BGP’nin bilinen açığı şu: bir öneki ilan eden otonom sistemin gerçekten yetkili olup olmadığı protokolün kendisinde denetlenmiyor.
Bedeli 1997’de görüldü. Küçük bir servis sağlayıcıdaki arızalı bir yönlendirici ulusal omurga yönlendiricilerine hatalı yönlendirme bilgisi verdi. Diğerleri trafiği o cihazın üstüne boğdu ve internetin büyük bölümleri birkaç saate varan sürelerle koptu.
Aradan geçen yıllar bu mekanizmayı hiç değiştirmedi. AS 64510, kendisine ait olmayan 203.0.113.0/24 alanını 203.0.113.0/25 ve 203.0.113.128/25 diye ikiye bölüp ilan ediyor. En uzun önek eşleşmesi yüzünden bu iki satır, /24 satırını her yerde yeniyor ve trafik sorgulanmadan yön değiştiriyor. Bu işe rota kaçırma deniyor.
Önek kaynağı doğrulaması boşluğu kapatmak için sonradan eklendi ve RFC 6811’de tanımlı. Her yola üç durumdan biri veriliyor: kayıt yoksa NotFound, kayıt varsa ve ilan eden uyuyorsa Valid, kayıt varsa ama ilan eden uymuyorsa Invalid.
İşletme tarafında iki ucuz savunma daha var. Birincisi bir sayaç. Bir komşudan kabul edilecek yol sayısına tavan konur; komşu bir anda bütün tabloyu ilan etmeye kalkarsa oturum kapanır ve hata yayılmadan durur. İkincisi oturumun kendisini korur: paketler TTL 255 ile gönderilir ve alıcı tam 255 bekler, çünkü uzaktaki biri bu değeri üretemez.
Aynı öneki birden çok yerden ilan etmenin meşru bir kullanımı da var. İçerik dağıtım ağı aynı içeriği birden çok kenar sunucudan sunuyordu; anycast’in yönlendirme tarafını buraya bırakmıştım. O ilanı taşıyan şey BGP. Kendi ağının içindeki anycast’ten farkı denetimde: küresel ölçekte yönlendirme sistemi başkalarının elinde. Hangi düğümün hizmet vereceğine o sistem karar verir, ölçüt de isteğin ağın hangi noktasından doğduğudur. Sunucu seçimi uygulama katmanında yapılmaz, yol seçiminin yan ürünü olarak çıkar.
Böylece omurga sorularından üçüncüsünü kapatabiliriz.
Omurga sorusu 3 — Kimsenin yolun tamamını bilmediği bir ağda paket yolunu nasıl buluyor?
Yolu tek parça hâlinde gören kimse yok. Her otonom sistem yalnızca komşusunun ilettiği güzergâh listesini biliyor ve kendi payına düşen tek adımı seçiyor. Bütün yol, o tek adımlık kararların uç uca eklenmesinden çıkıyor.
Bir öneki kimin ilan ettiğini kendi makinenden sorabilirsin.
curl -s 'https://stat.ripe.net/data/prefix-overview/data.json?resource=1.1.1.0/24'Cevaptaki iki alan yetiyor.
"announced": true
"asns": [ { "asn": 13335, ... } ]Birincisi önekin şu anda ilan edildiğini, ikincisi ilan edenin kim olduğunu söylüyor.
Özet
Peki, ne öğrendik?
- Otonom sistem bir yönetim sınırıdır: tek bir kuruluşun elindeki yönlendirici ve ağ kümesidir, kendi içinde bağlıdır ve dışarıya tek bir yönlendirme planı gösterir.
- BGP oturumu tek borudur: 179 numaralı portta yarı kalıcı bir TCP bağlantısı kurulur, dört mesaj hep oradan geçer ve sessizliği KEEPALIVE doldurur.
- Yol vektörü güzergâhı taşır: komşuya bir maliyet sayısı gitmediği için döngü denetimi listede kendi numaranı aramaya iner.
- Politika kısa yolu ezebilir: yerel tercihe AS_PATH’ten önce bakılır, çıkış kapısını da sıcak patates seçer.
- İlan kendiliğinden denetlenmez: protokol ilan edenin yetkisini sormaz, o boşluğu kaynak doğrulaması ile yol sayacı sonradan kapatır.
Paket sınırdan çıktı ve yolunu kimsenin tek başına çizmediği bir haritada buldu. Geri dönecek cevabın da bir adrese ihtiyacı var. Peki paket eve dönerken kendi adresini nasıl bulacak?
Bölüm 43: Adres Çevirisi
Paket dışarı çıktı ve yolunu buldu. Ama üstündeki adres artık seninki değil.
Sınırdaki geçit kaynak alanını silip yerine kendi adresini yazdı. O adres değiştiği için cevap da geçide dönecek. Peki geçit dönen cevabı senin makinene nasıl ulaştırıyor?
Aynı adres neden milyonlarca ağda birden var?
Kendi makinenin adresine bakarsan büyük ihtimalle 192.168 ile başlıyor. Aynı adres şu anda başka ağlarda da duruyor, hem de milyonlarcasında. Bu bir kaza değil. Üç blok yerel ağlara ayrıldı ve bu üç blok internette yönlendirilmiyor.
| Blok | Uçlar | Adres sayısı |
|---|---|---|
10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | 16.777.216 |
172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 1.048.576 |
192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 65.536 |
Üçünün toplamı 17.891.328 adres eder. Hangisinin seçileceğine ağın boyu karar veriyor; kurumsal ağların çoğu en büyük bloktan çalışıyor.
Böyle bir adresi hedef gösteren paket omurgada yol bulamıyor. Otonom sistemlerin birbirine hangi önekleri ilan ettiğini gördün; özel bloklar o ilanların hiçbirinde geçmiyor. Taşıyıcı yönlendirici onu düşürüyor. Bu yüzden özel adresleme tek başına bir çözüm değil; ikinci parça çeviridir.
Geçit paketin üstünde neyi değiştiriyor?
Ev kutusunun dört işini sayarken varsayılan geçidin dışarı çıkan paketleri neden çevirdiğini açmadan bırakmıştım. Cevabın adı NAT (Network Address Translation, Ağ Adres Çevirisi).
Geçidin iki arayüzü iki ayrı dünyaya ait. İçeri bakan yüz özel bloktan bir adres taşıyor, dışarı bakan yüz genel bloktan. Çeviri tam bu iki yüzün arasında oluyor.
İşin kendisi tek cümleye sığıyor: geçit, giden paketin kaynak adresini ve kaynak portunu siliyor, yerine kendi dış adresini ve kendi seçtiği yeni bir portu yazıyor. Seçeneksiz bir IPv4 başlığı 20 bayt tutuyor. Silinen kaynak adres onun içinde 4 baytlık bir pencere; kaynak portu taşıma başlığında 2 baytlık bir alan.
Değiştirdiği çifti bir çeviri tablosuna yazmasa dönüş paketini kime vereceğini bilemezdi. Tablonun iki sütunu var: WAN tarafı ve LAN tarafı. Bir satır tam olarak bir akışın kimliği.
| Protokol | WAN tarafı | LAN tarafı |
|---|---|---|
| TCP | 198.51.100.83:60117 | 192.168.42.137:52310 |
| TCP | 198.51.100.83:60118 | 192.168.42.104:52310 |
| UDP | 198.51.100.83:60119 | 192.168.42.137:51820 |
Gelen yönde işlem simetrik olarak yürüyor. Uzaktaki sunucu cevabı 198.51.100.83:60117 hedefine gönderiyor. Geçit tabloya bakıyor, hedef alanını 192.168.42.137:52310 yapıyor ve paketi içeri veriyor. O sunucu senin özel adresini hiç görmedi.
Dört alanı yan yana koyunca hangi ikisinin oynadığı tek bakışta çıkıyor:
| yön ve nokta | kaynak IP | kaynak port | hedef IP | hedef port |
|---|---|---|---|---|
| giden · geçitten önce | 192.168.42.137 | 52310 | 203.0.113.9 | 443 |
| giden · geçitten sonra | 198.51.100.83 | 60117 | 203.0.113.9 | 443 |
| dönen · geçitten önce | 203.0.113.9 | 443 | 198.51.100.83 | 60117 |
| dönen · geçitten sonra | 203.0.113.9 | 443 | 192.168.42.137 | 52310 |
Dört alanın geçitten önce ve sonra nasıl göründüğünü izleyelim:
192.168.42.137 milyonlarca ağda birden var.- Giden paket geçide varıyor. Kaynak alanında evindeki özel adres, hedef alanında uzaktaki sunucu. Bu paket olduğu gibi internete çıkarsa cevabı dönecek bir yer yok:
192.168.42.137milyonlarca ağda birden var. - Geçit yalnızca kaynak çiftini değiştiriyor. Kaynak adresin yerine kendi genel adresini, kaynak portun yerine kendi seçtiği yeni bir numarayı yazıyor. Hedef çiftine hiç dokunmuyor — iki kartta da aynı duruyor.
- Değişikliği bir satıra yazıyor. Bu satır olmadan dönüş paketini kime vereceğini bilemezdi. Satırı yazan şey içeriden çıkan bu ilk paket; dışarıdan gelen ve tabloda karşılığı olmayan bir istek hiçbir yere gidemiyor.
- Dönen paket aynı satırı ters okuyor. Cevap
198.51.100.83:60117hedefine geliyor. Geçit satırı bulup hedef çiftini LAN tarafına çeviriyor. Giden yönde kaynak, dönen yönde hedef değişiyor; tek satır iki yönü birden tarif ediyor.
Kalın yazılan alanlar geçidin dokunduğu yerler. Giden yönde kaynak çifti, dönen yönde hedef çifti değişiyor; öteki iki alana hiç dokunulmuyor. Bu simetri tesadüf değil, tablonun kendisi: bir satır iki yönü birden tarif ediyor.
Aynı tabloya iki uçtan bakınca ilginç bir şey oluyor. Senin makinen bağlantıyı 192.168.42.137:52310 ↔ 203.0.113.9:443 diye biliyor; sunucu ise 203.0.113.9:443 ↔ 198.51.100.83:60117 diye. İki uç aynı bağlantıya farklı adlar veriyor ve ikisi de haklı. Ortadaki kutu bir çevirmen gibi çalışıyor, ve iki taraf da çevirmenin varlığından habersiz.
Alanlara dokunmanın bir bedeli var: geçit hem IP başlığının checksum’ı hem de taşıma katmanının sağlamasını yeniden hesaplamak zorunda. Satırlar protokolü de taşıyor, çünkü ICMP’nin portu yok; orada eşleme kimlik alanı üzerinden kuruluyor.
Bir yana: Cisco terminolojisinde aynı makinenin iki adı var. İçerideki özel adres iç yerel adres, geçidin dışarıya bakan yüzündeki genel adres ise iç global adres diye geçiyor. Hangi taraftan bakıldığına göre ad değişiyor.
Bir bağlantının kimliğini soket four-tuple’ı taşıyordu: kaynak adres, kaynak portu, hedef adres, hedef portu. NAT bunun ilk iki bileşenini yolun ortasında değiştiriyor. İki uç aynı bağlantıya bakıp farklı four-tuple’lar görüyor.
Bu düzenlemenin iki kazancı var. Sağlayıcıdan abone başına tek adres almak yetiyor, cihaz başına bir adres değil. İkincisi, iç adres planı dışarıdan bağımsız kalıyor: sağlayıcı değişse de içerideki adresler olduğu gibi duruyor.
Tek adresin arkasına kaç bağlantı sığıyor?
Dışarı çıkan bütün datagramların kaynak adresi aynı; ayıran şey kaynak portları. Çeviriyi mümkün kılan da bu. Sınır buradan geliyor: port alanı 16 bit, sıfır kullanılmadığı için geriye 65.535 numara kalıyor. Pratikte tek bir dış adresin arkasında yaklaşık 60.000 eşzamanlı bağlantı taşınıyor. Darboğaz adres değil, port havuzu.
Beşinci bölümün apartmanı burada bir kat yukarı taşınıyor. Sokak adresi geçidin dış adresine, daire numarası geçidin attığı dış porta, dairede oturan da içerideki makineye karşılık geliyor. Benzetme şurada bitiyor: apartmanda daire numaralarını kimse yeniden dağıtmaz, geçitte ise numarayı her akış için geçidin kendisi seçiyor.
Numarayı geçidin seçmesi bir sorunu kendiliğinden eliyor. Yukarıdaki tablonun ilk iki satırında iki ayrı cihaz aynı kaynak portu seçmiş, ama çakışma yok.
| Tür | Eşleme |
|---|---|
| Statik NAT | Bir iç adres hep aynı dış adrese; kalıcı satır |
| Dinamik NAT | Havuzdan geçici eşleme; iş bitince bırakılıyor |
| Port çevirisi | Çok sayıda iç adres tek dış adrese; ayrım portta |
Ev ve mobil ağlarda gördüğün çeviri neredeyse her zaman üçüncüsü, yani port çevirisi (PAT, öteki adıyla NAPT). RFC 3022’nin tanımladığı temel NAT’ta bir özel adres bir dış adrese bağlanıyor; porta dokunmadan çoğa bir eşleme kurulamıyor. Ölçek sınırı da buradan çıkıyor: çok geniş özel ağlarda tek bir port havuzu ve tek bir tablo darboğaza dönüşüyor.
Tabloya satırı kim yazıyor?
Satırı yazan şey içeriden çıkan ilk pakettir. Dışarıdan gelen ve tabloda karşılığı olmayan bir istek hiçbir yere gidemiyor. Geçit onu kime vereceğini bilmiyor. NAT arkasındaki bir sunucuya dışarıdan bağlanma problemi tam olarak budur. Uygulama tasarımcısı bunu hesaba katmak zorunda, özellikle iki ucun doğrudan buluşmaya çalıştığı eşler arası uygulamalarda.
Tablodaki satırlar ölümlü oluyor. Kullanılmayan eşleme zaman aşımıyla siliniyor ve RFC 4787 bu süreye alt sınır koyuyor: bir UDP eşleme zamanlayıcısı iki dakikadan önce dolamıyor, önerilen varsayılan ise beş dakika ve üstü. Eşlemenin silinmemesi için uygulamanın daha kısa aralıklarla canlı tutma paketi göndermesi gerekiyor. Uzun süre sessiz kalan bir bağlantının koptuğunu gördüysen sebebi bu. Linux tabanlı bir geçitte tablonun kendisine conntrack -L ile bakabilirsin; çıktıdaki her satır bir eşlemedir.
Tabloya satır yazmanın elle yapılan bir yolu da var. Port yönlendirme, dış adresin belirli bir portuna gelen paketi sabit bir iç adrese ve porta gönderen kalıcı bir satır kuruyor. Ev kamerası böyle açılıyor.
Bütün geçitler aynı satırı aynı şekilde yazmıyor
Şimdiye kadar “bir satır açılıyor” dedim. Gerçekte o satırın ne kadar açık olduğu geçitten geçide değişiyor ve bu fark, NAT’ın arkasında çalışan uygulamaların kaderini belirliyor.
İki ayrı soru var. Birincisi eşleme: aynı iç çiftten farklı hedeflere giden paketler aynı dış portu mu kullanıyor? İkincisi süzme: açılan dış porta kim paket gönderebiliyor?
| davranış | aynı dış port | içeri kimi kabul ediyor |
|---|---|---|
| tam koni | her hedefe aynı | herkes |
| adres kısıtlı koni | her hedefe aynı | yalnızca daha önce paket yolladığın IP |
| port kısıtlı koni | her hedefe aynı | yalnızca daha önce paket yolladığın IP ve port |
| simetrik | her hedefe ayrı | yalnızca o hedef |
İlk üçünde eşleme uç-bağımsız: dışarıdan bakan port, hedef kim olursa olsun aynı kalıyor. RFC 4787’nin ilk şartı da bu ve sebebi birazdan görülecek. Dördüncüsünde ise her yeni hedef yeni bir dış port doğuruyor; dışarıdan bakan biri senin portunu tahmin edemiyor.
Simetrik NAT bir güvenlik kazancı gibi duruyor ama asıl etkisi başka: iki ucun doğrudan buluşmasını imkânsıza yakın kılıyor.
İki NAT arkasındaki iki makine birbirini nasıl buluyor?
Görüntülü görüşme, çevrimiçi oyun ve dosya paylaşımı aynı problemi çözmek zorunda: iki tarafın da tablosu boş, ikisi de yalnızca içeriden çıkan paketle satır açabiliyor, ve kimse ilk paketi alamıyor. Kilitli bir kapının iki yanında iki kişi.
Çözüm üç parçalı ve üçünün de adı var.
STUN en basiti. İnternette duran bir sunucuya paket yolluyorsun, o da “seni 198.51.100.83:60117 olarak görüyorum” diye cevap veriyor. Kendi dış adresini ve portunu böyle öğreniyorsun — kendi geçidin sana söylemiyor, dışarıdaki bir tanık söylüyor.
Delik açma (hole punching) asıl numara. İki taraf da öğrendiği dış çifti bir aracı sunucu üzerinden karşıya bildiriyor, sonra ikisi birden karşının dış çiftine paket yolluyor. Her paket kendi geçidinde bir satır açıyor. İlk paketler karşı tarafın geçidinde henüz satır olmadığı için düşüyor; ama satırlar açıldıktan sonra ikinci tur geçiyor. İki kapı da içeriden açılmış oluyor.
Numaranın çalışması için eşlemenin uç-bağımsız olması şart: aracıya bildirdiğin portun, karşı tarafa giderken de aynı kalması gerekiyor. Simetrik NAT tam burada işi bozuyor — bildirdiğin port yalnızca aracıyla konuşurken geçerli.
TURN ise pes etmenin adı. Delik açılamıyorsa trafik ortadaki bir röle sunucusundan geçiriliyor. Çalışıyor, ama artık uçtan uca değil: gecikme artıyor ve bant genişliğini biri ödüyor.
Üçünü sırayla deneyip en iyisini seçen çerçevenin adı ICE. Tarayıcındaki görüntülü görüşme başlarken saniyenin bir kısmını tam olarak buna harcıyor: adayları topluyor, sırayla sınıyor, çalışan ilk yolu seçiyor. Eşler arası dağıtımın niçin bu kadar uğraştırdığını söylemiştim; sebebi tam olarak bu üç harfli merdiven.
Adres yükün içine yazılmışsa ne oluyor?
Buraya kadar geçit yalnızca başlıklara dokundu. Bazı protokoller bu varsayımı bozuyor: adresi yükün içine yazıyorlar.
Klasik örnek FTP. İstemci veri bağlantısı için sunucuya kendi adresini ve portunu bir komut satırıyla bildiriyor — ve o satır, IP başlığında değil, TCP yükünün içinde yazılı bir metin. Geçit başlıkları çevirip yükü olduğu gibi geçirirse, sunucu içerideki özel adrese bağlanmaya çalışıyor ve hiçbir yere varamıyor.
Çare, geçidin yükü de okuyup içindeki adresi düzeltmesi. Bunu yapan parçanın adı uygulama katmanı geçidi (ALG) ve tanımı gereği yedinci katmana çıkan bir üçüncü katman cihazı. Katmanlamanın üçüncü faturası bilgi saklamaktı; ALG o faturanın en çıplak kalemidir.
Bedeli de ağır. ALG protokolü bilmek zorunda, yani her yeni protokol için yeni kod gerekiyor. Yük şifreliyse hiçbir şey yapamıyor. Ve yanlış çalıştığında ortaya, hiçbir ucun açıklayamadığı arızalar çıkıyor: SIP telefonlarının tek yönlü ses sorunu çoğu zaman kutudaki bir ALG’nin eseridir. Modern protokoller bu yüzden adresi yükün içine hiç yazmıyor; STUN ile dış adresini öğrenip onu yazmayı tercih ediyorlar.
Bir yan etki daha var ve adı saç tokası (hairpinning). İçerideki bir sunucuyu, dış adresini yazarak yine içeriden çağırdığında paket geçide çıkıp aynı arayüzden geri dönmek zorunda. Kutuların bir kısmı bunu yapmıyor: aynı sunucu dışarıdan erişilebilirken içeriden erişilemiyor. Ev ağında “telefon şebekeden çalışıyor, Wi-Fi’da çalışmıyor” şikâyetinin en sık sebebi budur.
DerinleşmeNAT bir güvenlik önlemi mi, yoksa öyle sanılan bir yan etki mi?
İçerideki cihazların dışarıdan doğrudan adreslenememesi çeviriye sık sık bir güvenlik avantajı diye yazılır. Ama bu tasarlanmış bir politika değil, tablonun boş olmasının yan etkisi. Politika yazılan ve uygulanan bir kuraldır; buradaki koruma yalnızca satır bulunmamasıdır. Tabloya satır yazan her mekanizma o korumayı delip geçer: elle açılan bir port yönlendirme, içeriden kurulan her bağlantı, kutunun kendiliğinden eşleme açan özellikleri. Gerçek politika kutunun kural tablosunda durur; sınırdaki listede ilk eşleşen satırın kazandığını birazdan göreceğiz. Oradaki ret yazılmış bir karardır, buradaki kapalılık ise yalnızca bir boşluktur.
İkinci itiraz daha derin. Bir ağ katmanı cihazı taşıma katmanının port alanına dokunuyor; yönlendiricinin üçüncü katmanın üstüne çıkmaması beklenirdi. End-to-end argument’a ödetilen bedel de bu. Bağlantının kimliğine artık yalnızca uçlar karar vermiyor.
Dört cevaptan yaygınlaşanlar erteleyenler oldu. Kökten çözen IPv6 yayıldığı ölçüde her cihaz yeniden dışarıdan adreslenebilir hâle geliyor ve çeviriden gelen erişilemezlik kendiliğinden kayboluyor. İçeriyi kapalı tutan bir şey kalıyorsa o çeviri değil, yazılmış bir kuraldır.
Çeviri ikinci kez yapılırsa ne oluyor?
Bu iş yalnızca evlerde olmuyor. Kurum ağları ve 4G/5G hücresel ağlar aynı mekanizmayı yoğun kullanıyor. Telefonunun mobil veriyle aldığı adres de çevrilmiş bir adres.
Operatör aboneye genel adres vermeyi de bırakabiliyor. Bu düzenlemenin adı CGNAT (Carrier-Grade NAT), yani operatör düzeyi çeviri. RFC 6598 bunun için 100.64.0.0/10 bloğunu paylaşımlı adres alanı olarak ayırdı. Blokta 4.194.304 adres var ve bir operatör bununla dört milyondan fazla aboneyi genel adres harcamadan numaralayabiliyor. Blok klasik özel adres alanından ayrı tutuldu. Sebebi çakışma: abonenin evinde zaten özel adres kullanılıyor ve aynı blok iki katmanı birbirine karıştırırdı. Bu trafik sağlayıcı sınırlarının ötesine de iletilmiyor.
Sonuç iki kat çeviri. Ev geçidi 192.168.42.137:52310 çiftini 100.64.19.7:60117 yapıyor, operatörün cihazı da onu 198.51.100.83:41022 yapıyor. Paketin kaynağı hedefe varana kadar iki kez değişiyor. İki ayrı tabloda iki satır duruyor. Bedeli de belli: port yönlendirme çalışmıyor, kayıt tutmak zorlaşıyor ve bir abonenin yaptığı, dış dünyada aynı adresi paylaşan öteki abonelere yansıyor.
Bütün bunları kendi makinende yan yana koyabilirsin:
ip addr show # Windows'ta: ipconfig
curl -s https://api.ipify.orgBirincisi içerideki özel adresi basıyor, ikincisi dışarıdan görünen adresi. İki farklı adres, tek makine.
Özet
Peki, ne öğrendik?
- Özel adresleme tek başına yetmiyor: üç blok yalnızca yerel ağda anlamlı, dışarı çıkışı ancak çeviri ile birlikte mümkün oluyor.
- Çeviri iki alana dokunuyor: geçit kaynak adresi ile kaynak portu değiştiriyor ve dönüş yolunu tek bir tablo satırında saklıyor.
- Sınırı koyan şey port havuzu: 16 bitlik alan tek dış adresin arkasına yaklaşık 60.000 eşzamanlı bağlantı sığdırıyor.
- Tabloyu içeriden çıkan paket yazıyor: karşılığı olmayan istek içeri giremiyor, kalıcı satırı ise port yönlendirme elle açıyor.
- Her geçit satırı aynı genişlikte açmıyor: koni davranışlarında dış port her hedefe aynı kalır, simetrik NAT’ta ise hedef başına değişir ve delik açma çalışmaz.
- İki uç birbirini üç adımda buluyor:
STUNdış adresi öğretir, delik açma iki kapıyı içeriden açar,TURNbaşarısızlıkta trafiği röleye alır — sırayıICEyürütür.- Operatör aynı işi ikinci kez yapabiliyor: CGNAT abonenin adresini de paylaştırıyor ve kaynak adres yolda iki kez değişiyor.
Geçit paketin üstündeki iki alanı senden habersiz değiştirdi ve bunu yaparken sıradan bir yönlendiricinin işini aştı. Adres çevrildi; peki yol üstünde paketimize dokunan başka kim var?
Bölüm 44: Ara Kutular
Bir önceki durakta paketin kaynak adresi geçitte değişti. O kutu paketi yalnızca iletmedi, başlığındaki bir alana dokundu. Yönlendiricinin tanımında böyle bir iş yok.
Yolun geri kalanı da benzer kutularla dolu ve çoğunun adı burada hiç geçmedi. Peki bir cihaz ne zaman yönlendirici olmaktan çıkıyor?
Bir kutu ne zaman yönlendirici olmaktan çıkar?
Resmi tanım RFC 3234 numaralı belgede duruyor. Tanıma göre ara kutu, kaynak ile hedef arasındaki veri yolunda bulunan ve bir IP yönlendiricisinin olağan işlevleri dışında iş gören her aracı kutudur. Tanımın biçimine dikkat et: ortada bir cihaz listesi yok, bir dışlama kuralı var.
Çizgi de katman numarasıyla çekiliyor. Bir yönlendiriciden en fazla üçüncü katmana kadar işlem yapması bekleniyor; dördüncü katmandaki port numarasına uzanan bir kutu o çizginin dışına çıkmış oluyor. Adres çeviren kutuyu zaten tanıyorsun: port çevirisinin end-to-end argument’a ödettiği bedeli saymıştık.
Katman eşlemesi eski bir tablodan geliyor: tekrarlayıcı fiziksel katmanda, anahtar ikinci katmanda, yönlendirici üçüncü katmanda durur. Adlandırma da tam burada karışıyor: IP dünyasında yönlendiricinin kendisine de geçit deniyor, oysa aynı ad ulaşımdan uygulamaya kadar dört katmanı birden kaplayan kutular için de kullanılıyor. Bir kutunun adı hangi katmanda çalıştığını söylemez; söyleyen şey baktığı alandır.
Ara kutular beş sınıfta toplanıyor ve her sınıf başka bir yerde duruyor.
| sınıf | eline aldığı şey | durduğu yer |
|---|---|---|
| adres çevirisi | başlıktaki adres ve port | ev, hücresel ağ, kurum ağı |
| güvenlik duvarı ve saldırı tespiti | geçme izni | şirket, kurum, servis sağlayıcı, erişim ağı |
| yük dengeleyici | isteğin kendisi | kurum, servis sağlayıcı, veri merkezi, mobil ağ |
| önbellek | yanıtın kopyası | servis sağlayıcı, mobil ağ, içerik dağıtım ağı |
| uygulamaya özgü kutu | tek bir protokolün verisi | konuştuğu uygulamanın yanı |
Dağılımın kendisi de bir şey söylüyor. Güvenlik duvarı ile saldırı tespiti tablodaki dört yerin hepsinde birden tekrarlanıyor. Aynı işlev dört kez satın alınıyor. O kutu hem erişim ağlarında hem çekirdek ağda duran özelleşmiş bir ara kutu olarak sınıflandırılıyor.
Beş sınıfın tamamı tek bir soyutlamaya iniyor: eşleştir ve uygula. Güvenlik duvarı IP adresleriyle taşıma portlarını eşleştirir, eylemi de izin vermek ya da reddetmektir. Yönlendirici, anahtar ve adres çevirici aynı kalıbı kullanır. Değişen tek şey hangi alana bakıldığıdır.
Bir istek kaç bağlantıya bölünüyor?
Vekil sunucu iki rolü aynı anda oynuyordu: isteği yapan istemciye karşı sunucu, menşe sunucuya karşı istemci. Ters vekil aynı ikiliği sunucunun önünde kurar ve istemcinin bağlantı kurduğu, el sıkıştığı taraf odur. İstemci tek istek yaptığını sanır; yolda iki ayrı istek-yanıt çifti oluşur.
Uygulama geçidi bu ikiliği bir adım ileri taşır. Yetkili kullanıcı için hedefe kendi bağlantısını kurar ve veriyi iki bağlantı arasında aktarır. Baktığı yer de IP, TCP ve UDP alanlarıyla sınırlı kalmaz; uygulama verisinin kendisini de okur. Başlık okumak ile içerik okumak arasındaki fark, kutunun hangi katmana kadar indiğini belirler.
Klasik vekilin bir bedeli var. İstemci yazılımının kutuya nasıl ulaşacağını bilmesi gerekir, örneğin tarayıcıya vekilin adresi elle girilir. Ters vekilde bu bedel ortadan kalkar. İstemci hiçbir ayar yapmaz, çünkü kutu zaten adın gösterdiği adreste oturur.
Asıl kırılma TLS tarafında. TLS üç şey sağlar: şifreli bir bağlantı, veri bütünlüğü ve uç nokta kimlik doğrulaması. Üçüncüsü burada can alıcı hâle geliyor, çünkü doğrulanan şey yol değil uç nokta oluyor. El sıkışmada iki taraf sertifikalarını ve özel anahtarlarını kullanarak birbirini doğrular ve paylaşılan bir sır üretir. Özel anahtarı elinde tutan kutu, o oturumun uç noktasıdır. Bu işe TLS sonlandırma deniyor. Sertifika zinciri bir adı doğruluyordu; TLS’i sonlandıran ters vekil o adın sahibi olarak konuşur.
Vakayı kuralım. İstemci 198.51.100.25 adresinden çıkıyor. Ters vekil 203.0.113.10 adresinde 443 portunu dinliyor, arkasında 192.0.2.11, 192.0.2.12 ve 192.0.2.13 duruyor. Tek bir HTTPS isteği için yolda 2 ayrı TCP bağlantısı ve 2 ayrı TLS oturumu kurulur. İstemcinin doğruladığı sertifika 203.0.113.10 adresindeki özel anahtara aittir. Arka uçtaki makinenin adını istemci hiç görmez. Kutu arkaya 80 portundan şifresiz bile konuşabilir.
Tek isteğin yolda kaç bağlantıya bölündüğünü görelim:
- İstemci tek bir adrese bağlanıyor. 198.51.100.25 adresindeki tarayıcı 203.0.113.10 adresinin 443 portunu çalıyor. Elinde yalnızca bu adres var; arkada kaç makine durduğunu bilmiyor.
- TLS ters vekilde sonlanıyor. El sıkışmanın karşı ucu bu kutu. Doğrulanan sertifika 203.0.113.10 adresindeki özel anahtara ait olduğu için oturumun uç noktası da bu kutu oluyor.
- Havuzdan bir arka uç seçiliyor. Karar IP başlığındaki hedef adresten çıkmıyor; kutu isteğin kendisine bakıyor. Üç makine de aynı tek adresin arkasında durduğu için seçim dışarıdan görünmüyor.
- İkinci bağlantı kuruluyor. Kutu bu kez istemci gibi davranıyor ve 192.0.2.12 adresine kendi bağlantısını açıyor. Yolda artık iki ayrı TCP bağlantısı ve iki ayrı TLS oturumu var.
- Yanıt zincirin tersinden dönüyor. Arka uç yanıtı kutuya, kutu da istemciye veriyor. İstemci tek istek yaptığını sanıyor; arka uçtaki makinenin adını hiç görmüyor.
Arka uç istemcinin kim olduğunu nereden bilecek?
İki bağlantıya bölmenin doğal bir sonucu var ve pratikte ilk gün karşına çıkıyor. Arka uçtaki sunucu, bağlantıyı kuran taraf olarak ters vekili görüyor. Kayıtlarında tek bir adres birikiyor, coğrafi kısıtlar çalışmıyor, adres başına hız sınırı bütün trafiği tek bir kovaya topluyor.
Çözüm üç ayrı yerde duruyor ve hangisini seçtiğin, vekilin hangi katmana kadar indiğine bağlı:
| yöntem | nereye yazılıyor | koşulu |
|---|---|---|
X-Forwarded-For | HTTP başlığına | vekil HTTP’yi okuyabiliyor olmalı |
Forwarded (RFC 7239) | HTTP başlığına, standart biçimde | aynı; adresle birlikte protokol ve ana bilgisayarı da taşır |
| PROXY protokolü | TCP bağlantısının ilk baytlarına | vekil HTTP’yi hiç okumasa da çalışır |
İlk ikisi bir liste tutuyor: her vekil kendi gördüğü adresi sona ekliyor, böylece zincir baştan sona okunabiliyor. Üçüncüsü ise bambaşka bir yerde çalışıyor — bağlantı kurulur kurulmaz, herhangi bir uygulama verisinden önce, tek bir satır hâlinde gerçek adres ve port yazılıyor. Şifreli trafiği hiç açmadan ileten bir dördüncü katman dengeleyici ancak bunu kullanabiliyor.
Bir güvenlik tuzağı da tam burada. Bu başlıkları istemci de yazabilir; hiçbiri doğrulanmıyor. Arka uç listenin tamamına güvenirse, saldırgan başka bir adresten geliyormuş gibi görünebilir. Kural şu: yalnızca kendi vekilinin eklediği son değere güven. Listede ondan öncesi istemciden gelmiş olabilir ve kanıtlanamaz.
Yükü dağıtan kutu neyi gizliyor?
Yük dengeleyicinin işi üç adımdır. Dışarıdan gelen istemci isteklerini alır, işi içeride dağıtır, sonucu dış istemciye döndürür. Dördüncü ve asıl etkisi bu üçünün yanında bir parantez gibi durur: veri merkezinin iç yapısını istemciden gizler.
Kararın nasıl verildiğinin ayrı bir adı var. Uygulama katmanı yönlendirmesi deniyor, çünkü karar IP başlığındaki hedef adresten çıkmıyor; isteğin kendisine bakılıyor. Havuzda üç arka uç varsa ve dağıtım sıra ile yapılıyorsa, 900 istekten her arka uca 300 tanesi düşer.
Sıra ile dağıtmak en basit kural ve tek başına yeterli değil. Kutunun elindeki seçenekler bir merdiven oluşturuyor:
| yöntem | kararı neye dayandırıyor | ne zaman doğru seçim |
|---|---|---|
| dönüşümlü | sıradaki arka uç | istekler birbirine benzer, arka uçlar özdeş |
| ağırlıklı dönüşümlü | her arka uca verilen pay | arka uçlar farklı güçte |
| en az bağlantı | o an en az açık bağlantısı olan | istek süreleri çok değişken |
| en kısa yanıt süresi | ölçülen gecikme | arka uçların yükü öngörülemez |
| özet tabanlı | istemci adresinin ya da bir çerezin özeti | aynı istemci hep aynı arka uca gitmeli |
Son satırın bir adı var: oturum yapışkanlığı. Arka uç kullanıcının oturumunu kendi belleğinde tutuyorsa, aynı kullanıcının her isteği aynı makineye düşmek zorunda — düşmezse kullanıcı sürekli oturumdan atılır. Durumun sunucudan neden çıkarıldığını biliyorsun; yapışkanlık, o dersi öğrenmemiş bir mimarinin ödediği bedeldir.
Özet almanın da bir tuzağı var. En akla yakın yöntem özet mod N — N arka uç sayısı. Ama havuza bir arka uç eklediğinde N değişiyor ve neredeyse bütün anahtarlar başka bir makineye kayıyor. Tek bir sunucu eklemek bütün oturumları dağıtıyor, bütün önbellekleri soğutuyor.
Çözümün adı tutarlı özetleme. Arka uçları ve anahtarları aynı dairesel uzaya yerleştiriyorsun; bir anahtar, saat yönünde kendisinden sonraki ilk arka uca ait oluyor. Havuza yeni bir arka uç girdiğinde yalnızca onun hemen solundaki dilim el değiştiriyor, geri kalan her şey yerinde kalıyor. Taşınan anahtar oranı 1/N’e iniyor. Aynı fikir içerik dağıtım ağlarında ve dağıtık önbelleklerde de aynen kullanılıyor.
Bir de kimin havuzda kalacağı sorusu var. Dengeleyici arka uçları düzenli aralıklarla yokluyor; adı sağlık denetimi. Etkin denetimde kutu her birkaç saniyede bir özel bir istek atıp cevabı ölçüyor, edilgen denetimde ise gerçek trafikteki hataları sayıyor. Belirlenen eşiği aşan arka uç havuzdan çıkarılıyor ve düzelince geri alınıyor. Bu mekanizma olmadan dengeleyici, ölmüş bir sunucuya sadakatle istek yollamayı sürdürür.
Bu kutunun var oluş nedeni bir zorluk listesinde geçiyor: yükü yönetmek ve dengelemek, işlem, ağ ve veri darboğazlarından kaçınmak. Yük dengeleyici bir ölçek aracıdır. Güvenlik önlemi olarak tasarlanmamıştır; iç yapıyı gizlemesi ondan çıkan bir yan etkidir.
Adın yanıltmasına da izin verme. Ağ geçidi yedekliliği protokollerinde dengeleme tek bir sanal IP adresi ile birden çok sanal MAC adresi üzerinden, ARP cevaplarıyla ve ikinci katmanda yapılır. Yol üstündeki yük dengeleyici ise isteğin kendisine bakıyor. Aynı ad iki ayrı katmanda karşına çıkıyor.
İçerik dağıtım ağının kenar sunucusunu tanıyorsun ve önbellek isabetinin yolu nasıl kısalttığını da. Sunucuları erişim ağlarının derinine iten o yerleştirme felsefesi, RFC 3234 tanımına göre tam anlamıyla bir ara kutu üretir. Sunucu veri yolunda durur ve yönlendiricinin işi olmayan bir iş yapar.
Bu kutuların bir bölümü ağın kendi zayıflığını telafi etmek için orada. IP en iyi çaba modelinde çalışır ve hiçbir garanti vermez; veri merkezleri ile içerik dağıtım ağları istemci ağlarının yakınına yerleştiği için aynı hizmet birden çok noktadan verilebilir hâle gelir. Eksik garantiyi kapatan şey protokolün kendisi değil, yolun üstüne konan kutulardır.
Kasa yazılıma dönünce ne değişti?
Tarihsel model sadeydi. Her ağ katmanı işlevi için ayrı bir kutu satın alınırdı: güvenlik duvarı bir kutu, yük dengeleyici başka bir kutu, adres çevirici üçüncü bir kutu. İşlev ile kasa aynı şeydi. Başlangıç noktası tescilli ve kapalı donanım çözümleriydi.
Yönlendiricinin yekpare kasasında veri düzlemi ile kontrol düzlemi aynı satıcı yazılımında birlikte duruyordu. Yol üstündeki kutular da aynı kalıptaydı. Sonra yön değişti.
Bugün tescilli donanımdan uzaklaşılıyor ve açık bir arayüz gerçekleyen sade donanıma doğru gidiliyor. Yerel eylemler eşleştir-uygula kalıbıyla programlanabilir hâle geliyor, yenilik de donanımdan yazılıma kayıyor. Ağ işlev sanallaştırmanın tanımı buradan çıkıyor: sade donanım üstündeki ağ, hesaplama ve depolama kaynakları üzerinde programlanabilir hizmetler. Yük dengeleyici artık bir kasa değil, bir sunucuda çalışan bir süreçtir.
Şimdi geri çekilip resmin tamamına bak. İnternet mimarisinin bilinen adı kum saati modelidir: fiziksel, bağlantı, taşıma ve uygulama katmanlarında çok sayıda protokol varken ağ katmanında yalnızca bir tane vardır. O ince bel IP’dir ve internete bağlı milyarlarca cihazın her birinde gerçeklenmek zorundadır. Belin çevresine sonradan dört kalem birikti: adres çevirisi, ağ işlev sanallaştırma, güvenlik duvarları ve önbellekleme.
Mimarinin üç köşe taşı sayılıyor: yalın bağlanabilirlik, ince bel olarak IP, ve zekânın ağın kenarında durması. Sonuncusunun adı end-to-end argument’tır. Beldeki dört kalemin dördü de onu aşındırıyor. İlk ikisine hiçbiri dokunmuyor.
Savın künyesi de belli. 1981’de Saltzer, Reed ve Clark adlandırdı: bir işlev ancak iletişimin uçlarındaki uygulamanın bilgisiyle tam ve doğru gerçeklenebilir. RFC 1958 aynı cümleyi mimarinin merkezine koyuyor — zekâ ağın içinde saklı değildir, uçlardadır. Ama metnin çoğu zaman atlanan bir parantezi var: iletişim sisteminin sağladığı eksik bir sürüm, bir başarım iyileştirmesi olarak bazen yararlı olabilir. Ara kutuların meşruiyeti tam olarak oradan çıkıyor. Sav ağın içindeki işlevi yasaklamıyor; ona yalnızca son söz hakkı vermiyor. Bir mimari ilke de ihlal edildiği için aşınmaz, ihlali ucuzladığı her yerde tekrarlandığı için aşınır.
Özet
Peki, ne öğrendik?
- Ara kutu bir cihaz adı taşımaz: tanımı, veri yolunda durup yönlendiricinin olağan işleri dışında iş görmektir; ölçüt kasanın markası değil, yapılan işin katmanıdır.
- Beş sınıf tek kalıba iner: adres çevirisi, güvenlik duvarı, yük dengeleyici, önbellek ve uygulamaya özgü kutu, hepsi eşleştir-uygula kalıbıyla çalışır.
- Ters vekil oturumu keser: özel anahtar onda olduğu için tarayıcının doğruladığı ad arkadaki makinenin değil, kutunun kendi adıdır.
- Yük dengeleyici bir ölçek aracıdır: isteği alır, işi içeride dağıtır, sonucu döndürür ve bunu yaparken veri merkezinin iç yapısını görünmez kılar.
- Aşınan tek bir köşe taşıdır: belin çevresindeki dört kalem zekânın kenarda durmasını, yani end-to-end argument’ı yıpratır; yalın bağlanabilirliğe ve ince bele dokunmaz.
Beş sınıfın hepsi paketin bir yerine bakıyor ve her biri baktığı yere göre karar veriyor. Peki görmelerini hiç istemiyorsan ne yaparsın?
Bölüm 45: Tünelleme ve IPsec
Bir önceki durakta yolun üstündeki kutuları saydık. Hepsi paketimizi görüyordu.
Paketi saklamanın bir yolu yok. Ama onu bir başka paketin içine koymak mümkün. Dıştaki zarfı okuyan kutu, içeridekini hiç göremez. Peki bu nasıl yapılıyor?
Bir paket nasıl başka bir paketin yükü olur?
Tünellemeyi tek cümleye indirebilirsin: bir IP paketi, başka bir IP paketinin yükü hâline geliyor. Dıştaki paket için içteki sıradan bir bayt dizisidir.
Can alıcı ayrıntıyı adreslerde bulacaksın. Dış başlığın kaynağı ile hedefi tünelin iki ucunu gösteriyor; iç başlıktakiler ise asıl göndereni ve asıl alıcıyı. Aynı paketin üstünde aynı anda iki ayrı adres çifti bulunur. Yol üstündeki ara kutuların hepsi bu yüzden dış başlığa bakar ve içerideki adresi hiç göremez.
Bunu mümkün kılan alanı IP başlığında bulabilirsin. Protokol alanı, içerideki yükün ne olduğunu tek baytla ilan ediyor.
| protokol alanı | içerideki yük |
|---|---|
| 41 | IPv6 paketi |
| 47 | genel yönlendirme kapsüllemesi (GRE) |
| 50 | şifrelenmiş yük (ESP) |
| 51 | kimlik doğrulama başlığı (AH) |
| 115 | ikinci katman tünelleme protokolü (L2TP) |
Listedeki 47 numara bir ayrımı da netleştiriyor: GRE’nin tek işi kapsüllemek ve hiçbir şeyi şifrelemiyor. Tünellemekle şifrelemeyi aynı şey sanma.
Tünelin taşıdığı şeyin her zaman bir IP paketi olduğunu da varsayma. İki uzak veri merkezi arasında Ethernet çerçevelerini IP datagramlarının içinde taşıyabiliyorsun; VXLAN’ın segment kimliği 24 bit, dış zarfı UDP ve tahsisli hedef portu 4789.
Tünellemenin doğuş sebebi gayet pratik. İnternette bütün yönlendiricilerin aynı gün yükseltildiği bir bayrak günü yaşanmıyor. Yeni protokolü konuşan ağ parçaları birbirinden kopuk kaldı ve aralarındaki bütün hatlar eski protokolü konuşuyordu. Tünel bu boşluktan doğdu.
Tünelin iki görünümü var ve hangisine baktığın çok şeyi değiştiriyor. Mantıksal görünümde iki uç tek bir sanal bağla bağlıymış gibi duruyor; fiziksel görünümde arada bir sürü yönlendirici sıralanıyor. Kapsülleme her katmanın mecburen yaptığı bir işti; tünel aynı işi bir kat yukarıda ve kasten tekrarlar. Kargo tezgâhı bu kez kutuyu ikinci bir kutuya koyar ve üstüne yeni bir barkod basar. Ayırma merkezi yalnızca yeni barkodu okur.
Dıştaki zarfın içtekini nasıl sardığını adım adım açalım:
- İç paket olağan bir datagram. Kaynağı 192.0.2.7, hedefi 203.0.113.9. Bu iki adres tünel boyunca hiç değişmez ve yol üstündeki hiçbir yönlendirici onları okumaz.
- Kuyruk eklenir, tamamı şifrelenir. Dolgu, dolgu uzunluğu ve sonraki başlık alanları sona eklenir; ardından iç başlık dahil her şey ilişkideki anahtarla şifrelenir.
- ESP başlığı öne konur. Sekiz baytlık sabit kısım iki alandan oluşur: güvenlik parametre indeksi ve sıra numarası. Alan uç doğru anahtarı bu indeksle bulur.
- Dış başlık tünelin ucunu yazar. Yeni IP başlığının kaynağı ve hedefi tünelin iki ucudur. Aynı paketin üstünde artık iki ayrı adres çifti duruyor.
- Yol yalnızca dış zarfı görür. Aradaki yönlendiriciler 198.51.100.4 ile 198.51.100.9 arasında sıradan bir datagram taşıdıklarını sanır; gövdesi onlar için anlamsız bir bayt dizisidir.
- Çıkışta dış zarf soyulur. Tünelin ucu doğrulama kodunu sınar, şifreyi çözer ve dış başlığı atar. İç paket kendi adresleriyle kaldığı yerden devam eder.
IPsec zarfı nereden sarmaya başlıyor?
IPsec’in koruması datagram düzeyinde çalışıyor: şifreleme, kimlik doğrulama ve bütünlük doğrudan IP paketine uygulanıyor. Uygulamanın bundan haberi olmasına gerek kalmıyor, çünkü koruma bir katman altta yapılıyor. Kapsam da geniştir: BGP ve DNS gibi kontrol trafiği de aynı zarfın içine girer. Tek tek seçim yok.
IPsec’in iki kipini ayırt etmen gerekiyor. Taşıma kipinde yalnızca yük şifrelenip doğrulanıyor ve orijinal IP başlığı açıkta kalıyor. Tünel kipinde ise başlığı dahil datagramın tamamı şifreleniyor. Aradaki fark, dışarıdan bakan birinin kiminle konuştuğunu görüp göremeyeceğidir.
IPsec’i tek bir protokol olarak da düşünme. Kimlik Doğrulama Başlığı (AH, RFC 4302, protokol numarası 51) kaynak doğrulaması ile bütünlük veriyor ama gizlilik vermiyor. Şifrelenmiş Yük (ESP, RFC 4303, numarası 50) üçünü birden verir ve çok daha yaygın kullanılır.
ESP tünel kipinde sıra hiç değişmiyor. Orijinal datagramın tamamına, başlık alanları dahil, bir kuyruk ekleniyor. Sonuç, ilişkideki algoritma ve anahtarla şifreleniyor. Öne ESP başlığı konuyor ve bir mesaj doğrulama kodu üretilip ekleniyor. En sona, adresleri tünelin ucuna yazılmış yeni bir IP başlığı gelir.
ESP başlığı iki adet 4 baytlık alanla başlar. İndeks ile sıra numarasını taşıyan bu sabit kısım 8 bayt eder. Kuyrukta ise dolgu, dolgu uzunluğu ve sonraki başlık alanları durur. Dolgu 0 ile 255 bayt arasında değişiyor. Blok şifreler bloğu tamamlamak için dolgu istediği için tünelin ek yükünü sabit bir sayı olarak hesaplayamıyorsun.
Sıra numarası tekrar oynatma saldırılarını engelliyor. Her yeni güvenlik ilişkisinde sıfırdan başlıyor ve gönderilen her datagramda bir artıyor. Alan taraf bütün paketleri hatırlamıyor; bir pencere tutuyor ve tekrarı o pencerenin içinde arıyor. Paketin sonundaki doğrulama alanında ise paylaşılan gizli anahtarla üretilmiş bir mesaj doğrulama kodu buluyorsun. Anahtarı bilmeyen biri tek bir biti değiştirse kod tutmuyor ve paket düşüyor; gönderene bir uyarı da gitmiyor.
Kim, hangi anahtarla, hangi yöne?
Burada şaşırtıcı bir ayrıntı var: IP bağlantısız çalışıyor ama IPsec bağlantı yönelimli çalışıyor. Veri gönderilmeden önce iki uç arasında bir güvenlik ilişkisi kuruluyor ve ikisi de durumu bellekte tutuyor.
İlişkinin kimliğini 32 bitlik bir sayı taşıyor ve adına güvenlik parametre indeksi deniyor. Değerini alıcı seçiyor, çünkü tabloyu o tutuyor. Gönderen bu sayıyı pakete yazıyor, alan uç da tablosuna bakıp hangi anahtarla çözeceğini buluyor. İlişki tek yönlüdür; çift yönlü bir tünel için gidişe bir, dönüşe bir tane gerekir. Anahtarları da ayrıdır. Sayının ne kadar hızlı büyüdüğünü görmek için sayalım: dört uçlu tam bir örgüde 6 tünel ve 12 ayrı güvenlik ilişkisi kurman gerekiyor.
IPsec iki ayrı veritabanı tutuyor ve ikisinin işi başka. Güvenlik politikası veritabanı ne yapılacağını söylüyor: bu datagram korunacak mı, düz mü geçecek, atılacak mı. Güvenlik ilişkileri veritabanı nasıl yapılacağını söyler: hangi anahtar, hangi algoritma, hangi sıra numarası. Karar, paketin kaynak adresine, hedef adresine ve protokol numarasına bakılarak verilir. Bölünmüş tünel, yani trafiğin yalnızca bir kısmını tünele sokma kararı, işte bu satırda veriliyor.
Anahtarları elle girmek küçük bir kurulumda işini görüyor ama yüzlerce uçlu kurumsal bir ağda altından kalkamıyorsun. Bu yüzden anahtar kurulumunu İnternet Anahtar Değişimi’ne devrediyorlar. İki taraf kimliğini ya önceden paylaşılmış bir sırla ya da sertifikayla kanıtlar. Ortak sırra Diffie-Hellman anahtar uzlaşmasıyla varılıyordu; tünel o mekanizmayı olduğu gibi devralır.
Anahtar değişiminin kendisi de iki aşamaya bölünmüştür. Önce çift yönlü bir yönetim ilişkisi kurulur. Asıl veri ilişkileri ikinci aşamada, o ilişkinin korumasında pazarlık edilir.
Tünelin iki ucunu üç ayrı biçimde eşleştirebilirsin: iki uç makine, iki yönlendirici, ya da bir yönlendirici ile bir uç makine. Sanal özel ağ (VPN) kurulumunun iki klasik türü, uzaktan erişim ile siteden siteye, bu seçeneklerin ikisine karşılık gelir. Eşleşme tesadüf değil; mimarinin kuralı şu: güvenlik geçidi tünel kipini desteklemek zorundadır, taşıma kipi ise isteğe bağlıdır.
Kurumun gerekçesi ayrıca ekonomiktir: özel hat çekmek yerine interneti omurga olarak kullanır. Bağlanan cihaz uzaktaki ağa fiziksel olarak bağlıymış gibi çalışır. Tünelin güvenliği yolun güvenliğine dayanmaz; ele geçirilen paketler anahtar olmadan çözülemez.
WireGuard aynı işi kaç parçayla yapıyor?
WireGuard’ın kendi tanımı tek satır: IP paketlerini UDP üzerinden güvenli biçimde kapsüller. El sıkışma Noise çerçevesinin IK biçimini kullanır. TCP üstünde tünel kurmanın yarattığı iç içe yeniden gönderim sorunu böylece hiç doğmaz. Alt katman kaybı gizlemez.
Şifre takımı pazarlığı yoktur; IPsec’te pazarlıkla seçilen ne varsa burada sabitlenmiştir. Simetrik şifreleme ChaCha20, doğrulama Poly1305, anahtar uzlaşması Curve25519, özet BLAKE2s. Seçenek listesi olmadığı için yanlış seçenek de yoktur.
Merkezdeki fikre kripto anahtarlı yönlendirme deniyor. Açık anahtarlarla izinli adres listelerinin basit bir eşleşmesidir. Aynı liste iki iş görür: gönderirken yönlendirme tablosu gibi, alırken erişim denetim listesi gibi davranır.
Bölünmüş tünelin somut karşılığı bu listedir. Listeye 0.0.0.0/0 yazılırsa bütün trafik tünele girer. Dar bir önek yazılırsa yalnızca o hedefler girer ve geri kalan her şey yerel çıkışı kullanır.
El sıkışma birkaç dakikada bir tekrarlanır. Anahtarlar döner ve amaç ileri gizliliktir. Zamanlama pakete değil saate bağlıdır, çünkü tasarımın paket kaybına dayanıklı olması gerekir. Tekrar oynatma koruması 64 bitlik, geri sarılamayan bir sayaçla ve yaklaşık 2.000 değerlik kayan bir pencereyle yapılır.
Kılavuz sayfası, adres çevirisinin arkasındaki bir arayüz için 25 saniyelik kalıcı canlı tutma aralığı önerir. Sebep açık: durum tutan kutunun eşlemeyi unutmaması gerekiyor. Unutursa dönüş trafiği düşer.
Her pakette kaç bayt ödüyorsun?
Her bağ, taşıyabileceği en büyük yük boyuyla sınırlıdır; Ethernet’te bu sınır 1.500 bayttır. Tünel bu sınırı değiştirmez. Aynı sınırın içine daha fazla başlık sokar.
Tünel arayüzü de bir arayüzdür ve kendi MTU değerini taşır. Bu değer altındaki bağdan hep daha dardır. Yönlendirici, çıkış arayüzünün MTU’sundan büyük bir paket alırsa onu daha küçük parçalara böler; tünel girişi de bir çıkış arayüzüdür.
Hesap kolay. Dış zarf seçeneksiz bir IPv4 başlığıysa 20 bayt gider. 1.500 baytlık yükte bu %1,3 eder. ESP tünel kipinin asgari ek yükü 30 bayttır. İç pakete 1.470 bayt kalır ve pay %2’ye çıkar. WireGuard’ın IPv4 dış zarflı ek yükü 60 bayttır. İç pakete 1.440 bayt kalır, yani %4. Dış zarf IPv6 ise sabit başlık 40 bayt olduğu için ek yük 80 bayta çıkar ve iç pakete 1.420 bayt kalır.
Aynı hesap, parçalama eşiğiyle birlikte çıkardığımız 1.460 baytlık MSS değerini de aşağı çeker. IPv6 geçiş tünelleri standardı, yani RFC 4213, tünel arayüzünün MTU’sunu tek satırla hesaplar: dış yolun MTU’su eksi kapsülleyen IPv4 başlığının boyu. Aynı standart sabit tünel MTU’sunu 1.280 ile 1.480 bayt arasına hapseder ve varsayılanın 1.280 olmasını önerir.
IPv6 her bağın en az 1.280 baytlık bir MTU taşımasını şart koşar. Buna asgari bağ MTU’su denir. Aynı belge, ayarlanabilir bağların 1.500 bayt ya da daha büyük yapılandırılmasını önerir ve gerekçeyi açıkça yazar: olası kapsüllemelere yer bırakmak.
Doğru boyu gönderenin kendisi ölçer: datagramlarını parçalama yasağı biti kurulu yollar, sığmayan paketi bir yönlendirici atıp geriye parçalanamaz kodlu bir ICMP mesajı gönderdiğinde tahminini küçültür ve yeniden dener. Bu ölçmenin adı yol MTU keşfi, künyesi RFC 1191 ve tünelin varlığında zorunlu hâle geliyor.
Parçalanan bir datagram yalnızca hedef uçta birleştirilir. Tünelde bu kural iki kez işler. Dış paket tünelin çıkışında, iç paket ise asıl hedefte birleştirilir. Kendi makinende ikisini de yoklayabilirsin.
ip link show wg0 # tünel arayüzünün MTU'su
ping -M do -s 1412 203.0.113.9 # yükü sabitleyip DF biti kurulu gönderDerinleşmeTünel kuruldu, ping geçiyor, ama büyük dosya hiç gelmiyor: ne oldu?
Gönderen ilk sıçramanın MTU’sunu tahmin olarak alır ve dönen hatalara göre indirir; IPv6’da kaçış yolu büsbütün kapalı, çünkü yol üstündeki yönlendirici parçalama yapmaz ve iş tümüyle gönderen uca kalır. Tahmini besleyen tek şey o hâlde geri dönen ICMP mesajıdır.
Arıza da belgelenmiş. Güvenlik duvarları sık sık bütün ICMP mesajlarını bastıracak biçimde yapılandırılıyor. Hata mesajı dönmeyince gönderen sorunu hiç öğrenemiyor ve tahminini küçültmek için elinde bir sebep kalmıyor. RFC 2923 bu duruma kara delik adını veriyor.
Belirtisi hep aynı biçimde ortaya çıkıyor: ping çalışıyor, küçük istekler çalışıyor, oturum kuruluyor. Ama ilk büyük paketle aktarım durur ve bağlantı zaman aşımına uğrar. Kullanıcı bunu ağın yavaşlığı diye bildirir; oysa yalnızca tek bir boy paket hiç geçmiyor.
Tanısı da ölçmeye dayanıyor. Yükü kademe kademe küçültüp ping -M do denemesini tekrarlarsın; geçen en büyük boy yolun gerçek sınırıdır. Kalıcı çare tünel arayüzünde TCP oturumlarının anlaştığı azami segment boyunu o sınıra sıkıştırmak, yani sorunu el sıkışmada çözmektir.
Özet
Peki, ne öğrendik?
- Tünel bir adres oyunudur: dış başlık tünelin iki ucunu, iç başlık asıl gönderen ile asıl alıcıyı taşır ve yol üstündekiler yalnızca dıştakini okur.
- Kapsülleme ile şifreleme ayrı işlerdir: 47 numaralı protokol hiçbir şey şifrelemeden taşır, ESP ise gizlilik, bütünlük ve köken doğrulamasını birlikte verir.
- IPsec bağlantısız bir katmana durum ekler: tek yönlü güvenlik ilişkileri, 32 bitlik indeksleri ve iki ayrı veritabanıyla tünel bir oturuma dönüşür.
- WireGuard seçenekleri kaldırarak sadeleşir: tek şifre takımı, UDP taşıma ve izinli adres listesi hem yönlendirme hem erişim denetimi işini görür.
- Tünelin faturası her pakette kesilir: 1.500 baytlık yükte ek yük %1,3 ile %4 arasında değişir ve iç paketin sınırı hep daha dardır.
Tünelin ucundan çıktın ve paket artık kendi adresleriyle yoluna devam ediyor. Hedef ağın sınırında ise onu hiç tanımayan bir kural kümesi bekliyor. Oradan geçmek hakkın mı, yoksa izin mi?
Bölüm 46: Güvenlik Duvarları
Tünelin ucundan çıktın ve paket hedef ağın sınırında duruyor. Buraya kadar hiçbir kutu onu geri çevirmedi.
Sınırdaki kutu çevirebilir. Orada bir kural kümesi var ve paket geçmeden önce tek tek yargılanıyor. Peki o kural neye bakıyor?
Sınırda duran şey bir politika
Tünelleme paketi bir başkasının gövdesine koyup dış zarfın arkasına alıyordu; buradaki kutu ise tam tersini yapıyor ve zarfı açıp okuyor. Güvenlik duvarı bir cihaz adı değil, bir sınır tarifi. Kurumun iç ağı ile internetin geri kalanı arasına bir hat çekiyor, sonra o hattı kimin geçeceğine karar veriyor. Tarifin içinde kasa diye bir şey yok; sınır var, bir de o sınırda uygulanan politika. Rafta duran kutuyu değil, kutunun uyguladığı kuralı satın alıyorsun.
Politikanın varsayılanı kapalı: açık olan ne varsa, biri onu tek tek açmış demektir. Gerekçeyi üç maddede toplayabilirsin: hizmet reddi saldırılarını durdurmak, iç verinin izinsiz okunmasını ya da değiştirilmesini engellemek, iç ağa yalnızca yetkilendirilmiş erişime izin vermek. Bu kutuyu savunmanın tamamı sayma; kimlik doğrulama ve şifreleme onun yanında duruyor.
Üç tür var: durumsuz paket süzgeçleri, durum takipli paket süzgeçleri, uygulama geçitleri. Sıralamanın bir mantığı var: her tür, bir öncekinin göremediğini görmek için doğdu.
Bir kural satırı neye bakıyor?
Durumsuz süzgeç kararını paket paket veriyor ve elinde hiç geçmiş tutmuyor. Baktığı alanları tek tek sayabilirsin: kaynak IP adresi, hedef IP adresi, TCP ya da UDP kaynak ve hedef port numaraları, ICMP mesaj türü, bir de TCP başlığındaki SYN ile ACK bitleri.
Bu kısa listenin ne kadar iş gördüğü şaşırtıcı. IP başlığındaki protokol alanı, yükün hangi protokole ait olduğunu söylüyor: ICMP için 1, IGMP için 2, TCP için 6, EGP için 8, UDP için 17. Protokol alanı 17 olan datagramları düşüren tek bir satır, ağdaki her UDP akışını kesiyor. Tek satırla ne kadar şey kapatabileceğini görmek, bu kutuyu neden dikkatle yazman gerektiğini de anlatıyor.
ACK biti segmentin bir onay taşıdığını söylüyor; RST, SYN ve FIN bayrakları da bağlantı yönetimini taşıyor. Dışarıdan gelen ve ACK biti 0 olan TCP segmentlerini düşürürsen dış istemciler içeriye bağlantı açamıyor. İç istemcilerin dışarıya açtığı bağlantılar çalışmayı sürdürür, çünkü onlara dönen paketlerde ACK kuruludur. Tek bit, kapının yönünü belirler.
Kurallar ICMP tür numaralarına da yazılır. Tür 8 ping isteğini, tür 0 cevabını taşır. Tür 11 kod 0 TTL’in tükendiğini, tür 3 kod 3 hedef portun ulaşılamaz olduğunu bildirir. TTL alanı her yönlendiricide bir azalır ve sıfıra düşünce paket silinir; traceroute tam bu davranışın üstüne kuruludur. Ağının haritalanmasını istemiyorsan dışarı çıkan TTL-aşıldı mesajlarını düşürürsün. Keşif orada körelir. Aynı mantıkla yayın adresine giden ICMP paketleri de düşürülür, çünkü ağının smurf tipi bir hizmet reddi saldırısında araç olmasını istemezsin.
Bunun bedeli de var. Bir ICMP mesajı tür, kod ve hataya yol açan datagramın ilk 8 baytını taşır. Yol MTU keşfi susturulduğunda kara deliğe dönüyordu; kuralı yazan taraftan bakınca aynı bedel tek satırlık bir ICMP reddinin içinde duruyor.
Port numarası bir makinenin hangi kapısını gösteriyordu; kural satırındaki port koşulu o uzayın bir dilimini keser. Port uzayı 0 ile 65.535 arasında uzanır. En büyük değer 65.535 olduğuna göre alan 16 bittir.
İlk eşleşen satır kazanır
Kural satırları bir tabloda toplanır ve tablonun adı erişim kontrol listesidir. Yapısı iki sütundan ibarettir: bir aksiyon, bir koşul. Gelen paket listeye yukarıdan girer ve ilk eşleşen satırın aksiyonu uygulanır. Tarama orada durur. Sıra bu yüzden ayrıntı sayılmaz; politikanın kendisidir.
Peki hiçbir satır eşleşmezse ne olur? Listenin sonunda yazılmamış bir satır durur ve o satır her şeyi reddeder. Adı örtük rettir. Yazmadığın kural, yazdığın en güçlü kuraldır.
Somut bir kurum ağı kuralım. Kullanıcılar 198.51.100.0/24 bloğunda otursun, dışa açık web sunucusu 198.51.100.20 adresinde dursun.
| aksiyon | kaynak | hedef | koşul |
|---|---|---|---|
| izin | 198.51.100.0/24 | dışarısı | TCP hedef port 443 |
| izin | dışarısı | 198.51.100.0/24 | TCP kaynak port 443, ACK kurulu |
| izin | 198.51.100.0/24 | dışarısı | UDP hedef port 53 |
| izin | dışarısı | 198.51.100.20 | TCP hedef port 443 |
| ret | her şey | her şey | örtük |
Dört izin satırı ve bir örtük ret; her paket en kötü durumda beş karşılaştırma görür. Dönüş satırının koşuluna klasik olarak bir de kaynak portun 1.023’ten büyük olması yazılır. Kulağa dar geliyor. Oysa o koşul 64.512 portu birden kapsar ve tek başına neredeyse hiçbir şey elemez.
Liste yönlendiricide iki ayrı yerde işler: paket alındığı arayüzde bir kez, yönlendirme kararından sonra çıkış arayüzünde ikinci kez süzülür. Satırlar dardan genişe doğru dizilir; ters sıra, dar bir kuralı hiç çalışmayan bir satıra çevirir. Kolayca gözden kaçan bir tuzak daha var. Oluşturulan liste bir arayüzle ilişkilendirilmezse yazılmamış sayılır.
Listelerin kendisi de ikiye ayrılır. Standart liste yalnızca kaynak adrese bakar; genişletilmiş liste kaynağın yanında hedefe, protokol numarasına ve port numarasına da bakabilir. Klasik komut satırında türü liste numarası belirler: 1-99 arası standart, 100-199 arası genişletilmiş IP listesidir. İsimli listelerde hatalı bir satır, başına no yazılarak tek tek silinebilir. Numaralı listede bu mümkün değildir; liste baştan yazılır. Adres kümesini kısa yazmak içinse joker maske kullanılır; bitleri alt ağ maskesinin tam tersi anlama gelir.
Süzgeç neyi hatırlar, neyi hiç göremez?
Durumsuz süzgeç, bütün bu inceliğe rağmen kaba bir alettir. Hiçbir TCP bağlantısı kurulmamışken bile, kaynak portu 443 ve ACK biti kurulu bir paketi içeri alır. İkinci satırın koşuluna uyuyor, o kadar.
Durum takipli süzgeç bağlantının geçmişini tutuyor. Her TCP bağlantısının kurulumunu ve yıkımını izliyor: SYN’i görüyor, FIN’i görüyor, aradaki paketin anlamlı olup olmadığına karar veriyor. Erişim kontrol listesine fazladan bir sütun ekleniyor ve o sütun tek bir şey söylüyor: bu satırdaki paketi içeri almadan önce bağlantı durum tablosuna bak.
Tablonun anahtarı tanıdık bir four-tuple. İki adres ile iki port, yani 32 + 32 + 16 + 16 bit eder. Toplamı 96 bit, bayta çevirince 12 bayt, üstüne bir de protokol numarası biner. Çeviri tablosu da aynı four-tuple’ı tutuyordu; buradaki tablo yapı olarak onun kardeşidir.
Satırların sonsuza kadar durmasını da bekleme. Hareketsiz bağlantılar zaman aşımına uğruyor ve süresi dolan girdinin paketleri artık içeri alınmıyor. UDP tarafında bu konforu bulamıyorsun: izlenecek bir bağlantı durumu olmadığı için süzgeç UDP’ye çoğu zaman ya hep ya hiç uyguluyor.
Bu belleğin bir bedeli olduğunu da unutma. Tablodaki her satır bir bağlantının kimliğini taşıyor ve bir yerde durmak zorunda; zaman aşımının sebebi de bu, çünkü tablo sonsuz büyüyemiyor. Tersinden okununca aynı cümle bir kapasite sınırı veriyor: durum tutan her kutu, hatırladığı şeyi bir saldırı yüzeyi olarak satın alıyor.
Kutunun ilk paketten sonra neyi hatırladığını izleyelim:
- İç makine bağlantıyı açıyor. 198.51.100.41 adresindeki makine dışarıdaki sunucunun 443 portuna bir SYN gönderiyor. Paket sınırdan çıkarken listenin giden satırıyla eşleşiyor.
- Kutu tabloya satır yazıyor. Satırın anahtarı iki adres ile iki port. Durumsuz bir süzgeçte böyle bir kayıt hiç oluşmaz; kural tablosunun yanındaki bellek tam olarak bu satırdır.
- Paket dış sunucuya çıkıyor. Sınırın dışında olan biten kutuyu ilgilendirmiyor. Elinde tuttuğu tek şey, az önce yazdığı satırın kendisi.
- Dönen yanıt satırla eşleşiyor. Yanıt geldiğinde kutu önce tabloya bakıyor. Dörtlü orada yazılı olduğu için paket anlamlı sayılıyor ve iç makineye veriliyor.
- Karşılıksız paket düşüyor. Aynı anda gelen ikinci paketin başlıkları da kurallara uyuyor: ACK biti kurulu, kaynak portu 443. Tabloda satırı olmadığı için içeri alınmıyor.
Üçüncü tür daha derine iniyor. Uygulama geçidi başlıkla yetinmiyor, uygulama verisinin kendisine bakıyor; ters vekil de iki ayrı bağlantı kurup aralarında veri taşıyordu. Bu türe buradan eklenecek iki şey daha var. Geçit tek başına çalışmıyor: yönlendiricideki süzgeç, geçitten çıkmayan bağlantıları bloklamazsa geçidi atlamak serbest kalıyor. Bedeli de kalıcıdır, çünkü özel muamele isteyen her uygulama kendi geçidini ister ve istemci yazılımı o geçide nasıl ulaşacağını bilmek zorundadır.
Şimdi üç türün de ortak kör noktasına gel. Bütün bu kurallar kaynak adrese güveniyor, oysa kaynak adres güvenebileceğin bir alan değil. IP kimlik sahteciliği, sahte kaynak adresli bir paketi ağa enjekte etmektir; alanı dolduran gönderendir ve kimse doğrulamaz. Savunma da sınırdaki kutuyla bitmez: yerel ağda anahtar üzerinde IP Source Guard gibi bir özellik açılır.
İkinci kör nokta bundan da derinde duruyor. Paket süzme yalnızca TCP/IP başlıklarına bakıyor ve oturumlar arasında hiç ilişki kurmuyor. Saldırı tespit sistemini tam bu iki eksik için kuruyorlar. Derin paket incelemesi yapıyor: paketin içeriğine bakıp bilinen virüs ve saldırı dizilerinden oluşan bir veritabanıyla karşılaştırıyor. Birden çok paket arasındaki ilişkiyi de inceliyor. Port taraması, ağ haritalama ve hizmet reddi saldırısı ancak paketler birlikte bakıldığında görünür.
Hizmet reddi saldırısının tanımı tam buraya oturuyor. Saldırgan hedefi bozmaya çalışmıyor, dolduruyor: bant genişliği ya da sunucu kapasitesi ne kadarsa sahte trafikle tüketiyor ve meşru isteğe sıra kalmıyor. Yarı açık bağlantı kuyruğunu dolduran SYN seli tanıdık; durum tablosu aynı doldurma hamlesine güvenlik duvarında da açık. Dağıtık biçimini üç adımda kuruyorlar: önce hedefi seçiyorlar, sonra ağa dağılmış makineleri ele geçiriyorlar, en sonunda saldırıyı o makinelerden başlatıyorlar. Kaynağı tek bir yerde arama; binlerce makineden geliyor, sınırdaki kutu o trafiği süzmek için önce onu görmek zorundadır ve gördüğü her yeni four-tuple için tablosunda yer açar.
Bu doldurma hamlesinin en eski biçimine karşı zarif bir savunma geliştirilmiş ve mantığını öğrenmen işine yarayacak. SYN seli, sunucuyu kendisi için yer ayırmaya zorlayarak çalışıyordu: her sahte SYN, tabloda bir satır açtırıyordu. Karşı hamle de tam buna cevap veriyor — hiç yer ayırma.
Yöntemin adı SYN çerezi. Sunucu yarı açık bağlantı için bellek ayırmak yerine, o bağlantıya ait bilgiyi kendi göndereceği başlangıç sıra numarasının içine gömüyor. Numarayı rastgele seçmiyor; kaynak adres, kaynak port, hedef adres, hedef port, kaba bir zaman sayacı ve yalnızca sunucunun bildiği bir gizli anahtarı bir özet işlevine sokuyor ve çıkan değeri numara olarak kullanıyor.
Üçüncü mesaj geldiğinde sunucunun elinde hiçbir kayıt yok — ama gerek de yok. Gelen onay numarasından bir eksiltiyor, aynı özeti kendi yeniden hesaplıyor ve tutup tutmadığına bakıyor. Tutuyorsa bu üçüncü mesaj gerçekten kendi gönderdiği ikinci mesaja cevaptır; bağlantıyı o anda kuruyor. Tutmuyorsa mesajı atıyor.
Sahte kaynak adresli bir SYN seli artık hiçbir şey doldurmuyor, çünkü doldurulacak bir yer yok. Saldırgan gerçekten yer ayırtmak istiyorsa üçüncü mesajı da göndermek zorunda; o da kaynak adresini gizleyememek demek.
Bedeli de var ve nerede olduğu öğretici. Sunucu durum tutmadığı için, el sıkışma seçeneklerini — pencere ölçekleme, seçici onay — hatırlayacak yeri de yok. Bu yüzden SYN çerezi normalde kapalı durur ve yalnızca kuyruk taşmaya başlayınca devreye girer. Savunma, saldırı yokken ödenmeyen bir bedelle çalışıyor.
Azaltmanın işe yaradığı bir örneği de görebilirsin. Kök alan adı sunucularına yönelik dağıtık saldırılar bugüne kadar başarıya ulaşamadı: trafik süzme bir yandan, yerel sunucuların üst düzey alan sunucularının adreslerini önbellekte tutması bir yandan, sorguların çoğunu köke hiç uğratmıyor.
Tek bir tespit noktasıyla da yetinemiyorsun. Sensörleri ağın farklı köşelerine dağıtıyorlar ve her biri başka bir denetimi üstleniyor; dışa açık sunucular da iç ağdan ayrılmış bir askersiz bölgede duruyor.
Dışarıdan bakınca bütün bu düzeneği tek bir kelimede göreceksin. Tarayıcı bir portu filtreli işaretlediğinde, arada bir süzgeç olduğunu ama portun ardında ne olduğunu çözemediğini söylüyordur. Ping’e cevap gelmemesini de tek bir şeye yorma: ya makine hiç ayakta değildir, ya da bir süzgeç ICMP’yi yutuyordur. Susmayı kanıt sayamazsın.
Aradaki adam nereye oturuyor?
Trafiği okumak ya da değiştirmek isteyen birinin önce çözmesi gereken bir sorun var: trafiğin kendi üzerinden geçmesi gerekiyor. Saldırının tamamı bu tek adımda saklı ve adımı atmanın sayılı yolu var. Her yol bir katmanda bir yalan söylemekten ibaret.
| katman | yöntem | söylenen yalan | ne durdurur |
|---|---|---|---|
| fiziksel | sahte kablosuz access point | “tanıdığın ağ benim” | ağ adının değil sertifikanın doğrulanması |
| bağ | ARP zehirlemesi | “o IP adresi benim kartımda” | dinamik ARP denetimi, port güvenliği |
| bağ | sahte DHCP sunucusu | “varsayılan geçidin benim” | anahtarda DHCP gözetimi |
| ağ | yol ilanı kaçırma | “o öneke giden en iyi yol benden geçiyor” | öneke imza doğrulama, ilan süzme |
| ad çözme | sahte DNS cevabı | “o adın adresi bu” | imzalı bölge, şifreli ad çözme |
Beş satırın ortak noktası, hiçbirinin şifreyi kırmaya çalışmaması. Saldırgan matematikle uğraşmıyor; yalnızca kendini yolun ortasına koyuyor. Yolun ortasında olmak da tek başına hiçbir şeyi okutmuyor — okuyabilmesi için trafiğin ya şifresiz olması ya da kendisini karşı taraf olarak kabul ettirmesi gerekiyor.
İkincisi tam olarak sertifikanın engellediği şey. Saldırgan araya girse bile, sunucu adına imzalanmış geçerli bir sertifika üretemediği sürece tarayıcı bağlantıyı kuramaz. Bu yüzden gerçek dünyada ortadaki adam saldırıları şifreyi kırarak değil, üç kestirmeden biriyle yürür:
- Şifreye hiç girmemek. Kullanıcıyı şifresiz sürümde tutmak, yönlendirmeyi araya girip yutmak. Sitenin tarayıcıya “beni bir daha asla şifresiz açma” demesi bu kestirmeyi kapatır.
- Güven deposuna sızmak. Cihaza bir kök sertifika kurulmuşsa, o kökle imzalanan her sahte sertifika geçerli görünür. Kurum ağlarındaki trafik denetimi tam olarak budur ve teknik olarak yetkilendirilmiş bir ortadaki adamdır. Aynı yöntem, cihaza zorla sertifika kurdurulduğunda saldırıya dönüşür.
- Kullanıcıyı ikna etmek. Uyarı ekranını geçirtmek, benzer yazılan bir alan adına yönlendirmek. Zincirin en zayıf halkası çoğu zaman matematik değil, dikkat.
Buradan çıkan kural şu: ağın güvenli olduğunu varsaymak yerine, karşı tarafın kim olduğunu her seferinde doğrula. Kafedeki kablosuz ağın adı doğru olabilir ama adı kimse imzalamıyor; sunucunun sertifikasını ise imzalıyor.
İnternet kısıtlamaları hangi katmanda uygulanıyor?
Aynı düzenek bir de tersinden çalışıyor. Trafiğin üzerinden geçtiği yerde duran biri, onu okumak yerine durdurmayı seçebilir. Erişim kısıtlaması dediğimiz şey teknik olarak bir süzme kararıdır ve her yöntem başka bir katmanda iş görür. Katman da iki şeyi belirler: yan hasarın büyüklüğünü ve yöntemin ne kadar hedefli olabildiğini.
| yöntem | hangi katmanda | ne yapıyor | yan hasarı |
|---|---|---|---|
| ad çözme cevabını değiştirme | ad çözme | resolver sahte ya da boş cevap döndürür | o adı kullanan her hizmet birden düşer |
| adres ya da önek düşürme | ağ | hedefe giden paket iletilmez | aynı adresi paylaşan bütün siteler kapanır |
| el sıkışmadaki alan adına bakma | taşıma üstü | şifreli oturum kurulmadan önceki açık alan adı okunur | çok az; yöntem hedefli çalışır |
| protokol parmak izi | derin paket incelemesi | içeriğe değil trafiğin şekline bakar | meşru kullanım da yakalanır |
| hız kısma | ağ | engellemez, kullanılamaz hâle getirir | ölçmesi ve kanıtlaması zor |
Sıralamada bir yön var. Web trafiğinin neredeyse tamamı şifrelendikçe içeriğe bakarak süzme imkânsızlaştı, ve süzme içerikten üstveriye kaydı: hangi adı sorduğun, hangi adrese gittiğin, el sıkışmanın hangi alan adını açıkta bıraktığı. Şifreli ad çözme birinci sütunu, el sıkışmanın açık kısmını da kapatan uzantılar üçüncü sütunu daraltıyor. Aynı hamlenin her seferinde iki sonucu oluyor: mahremiyet artıyor, hedefli süzme zorlaşıyor, buna karşılık kalan tek kaba araç olan adres engellemesinin yan hasarı büyüyor.
Kurum ağındaki içerik süzgeci ile ülke çapındaki erişim engeli teknik olarak aynı araçları kullanıyor. Aralarındaki fark araçta değil, kimin hangi yetkiyle uyguladığında ve neyin denetime açık olduğunda.
Özet
Peki, ne öğrendik?
- Güvenlik duvarı bir sınır politikasıdır: iç ağı internetten ayırır, varsayılanı kapalıdır ve tek tek açılmamış olan her şeyi reddeder.
- Durumsuz süzgeç sayılı alana bakar: iki adres, iki port, ICMP türü ve TCP bayrakları; kararını her pakette baştan verir.
- Örtük ret listenin yazılmayan son satırıdır: ilk eşleşme kazandığı için satır sırası politikanın kendisi olur.
- Durum takibi kural tablosunun yanına bellek ekler: bağlantı durum tablosundaki four-tuple, dönen paketin anlamlı olup olmadığını söyler.
- Süzgecin iki kör noktası vardır: kaynak adres doğrulanamaz ve oturumlar arası ilişki görülemez; saldırı tespit sistemi tam bu boşluğa girer.
Beş satırlık liste kararını verdi ve paket sınırdan çıktı. Bundan sonrası senin ağın değil, operatörün ağı. Peki oradaki ağ senin evdekine benziyor mu?
Bölüm 47: Operatör ve Metro Ağları
Paket senin ağının sınırından çıktı. Şimdi bir operatörün ağında ilerliyor ve orası evdekine benzemiyor.
Aynı Ethernet çalışıyor, ama bambaşka bir ölçekte ve bambaşka kurallarla. Peki bu ağ seninkinden nerede ayrılıyor?
Şehir ölçeğinde ne değişiyor?
Ağları menzillerine göre sıralamıştık ve ortadaki basamağın adı şehir alan ağıydı. Operatörün metro halkası tam bu ölçekte duruyor. Bir şehri kapsar, binaları ve santralleri birbirine bağlar.
İnternetin merkezinde az sayıda, birbirine çok bağlı büyük ağ vardır. Bunlar ulusal ve uluslararası kapsama satan ticari taşıyıcılardır. Her operatör ayrı bir otonom sistem olarak kendi politikasını yürütüyordu. Buradaki konu o politikanın altındaki fiziksel ağdır.
Aynı operatör üç işi birden yapıyor: uzun mesafe yüksek hızlı hatları işletiyor, bir şehrin içinde işletmeler arası metro bağlantıları kuruyor, evlere giden erişim hatlarını da o çekiyor. Senin faturanda üçü tek satırda toplanıyor, oysa arkalarında üç ayrı mühendislik duruyor.
Ethernet bu üç işin ortasında yer değiştirdi. Artık yerel bir ağ teknolojisi sayılmıyor. Taşıyıcılar kıtaları ve dünyayı aşan geniş alan ağlarını onunla kuruyor. Operatör ağını kurum ağından ayıran şey bu yüzden protokolün adı olamıyor. Ayıran şey anahtardan istenen yetenek listesi oluyor, ve kampüs tasarımında o listenin çoğuna hiç ihtiyacın olmuyor. Taşıyıcı sınıfı Ethernet’i tarif eden dört öznitelik sayılır: ölçeklenebilirlik, güvenilirlik, hizmet kalitesi ve hizmet yönetimi.
Mesafe de aynı yönde büyür. Standart, 1000BASE-LX için 5.000 metre şart koşar. Uzatılmış erişimli sürümler 70-100 kilometreye ve ötesine gider. On gigabitte 10GBASE-LR tekli mod fiberde 10 kilometreye, 10GBASE-ER 40 kilometreye ulaşır. Şehir ölçeğinde hizmet götüren bağlantıları kuran şey bu tekli mod arayüzlerdir.
Sorumluluk nerede bitiyor?
Operatörün ağı müşterinin binasında bir yerde biter. O bitiş noktasının adı demarkasyon noktasıdır ve sorumluluk sınırı oradan geçer. Sınırın müşteri tarafında duran kutu müşterinindir; adı müşteri ucu cihazıdır. Demarkasyon noktasından merkez ofise uzanan parçaya yerel döngü denir. Merkez ofis operatörün anahtarlanmış ağının başladığı yerdir; şehirdeki abone hatları orada toplanır.
Geniş alan bağlantısı çoğu zaman operatörden kiralanır. Yönlendiricinin WAN arayüzü o kiralık hatta bakar. Hattın iki ucu operatörün ağında bir sanal devreyle birbirine tanıtılır; paketin izleyeceği yol o tanımdan çıkar.
Kiralama fikri metro Ethernet’ten eskidir. Frame Relay 64 kbit/s ile 1,544 Mbit/s arasındaki hızları destekliyordu; üst sınır 24 kanallık bir T1 hattıdır. Kurumsal hız aralığı buradan başladı ve metro Ethernet onu devraldı.
Servis tipini teknoloji belirlemez. Sanal bağlantının şekli belirler. İki uçlu bir Ethernet sanal bağlantısı üstüne kurulan her servisin adı E-Line’dır. Çok noktadan çok noktaya olan servis E-LAN’dır: birden çok şube tek bir anahtarın portlarındaymış gibi konuşur. E-Tree köklü çok noktalı bir bağlantı üstüne kurulur ve yapraklar yalnızca kökle konuşur.
Her şekil iki sürümde satılır. Port tabanlı sürümde arayüz o servise adanmıştır ve servis çoklamaya izin verilmez. VLAN tabanlı sürümde aynı arayüzde birden çok bağlantı sonlanır. 802.1Q etiketi tek bir kabloda birden çok VLAN’ı yan yana taşıyordu; operatör aynı etiketi müşterilerini ayırmak için kullanır. Altı abone servisinin künyesi MEF 6.3’te durur.
Somut bir vakaya oturt. Şirketin şube ağı 198.51.100.0/24, merkez ağı 203.0.113.0/24 olsun. Şubeyle merkez arasına noktadan noktaya bir bağlantı alırsan servisin adı EPL olur ve şubedeki arayüz o tek servise adanır. Aynı arayüzden veri merkezine, 192.0.2.0/24 ağına, ikinci bir bağlantı daha istersen port tabanlı sürüm yetmez. EVPL’ye geçersin: iki bağlantı aynı fiziksel arayüzde ayrı etiketlerle sonlanır.
| bağlantı şekli | port tabanlı | VLAN tabanlı |
|---|---|---|
| noktadan noktaya (E-Line) | EPL | EVPL |
| çok noktadan çok noktaya (E-LAN) | EP-LAN | EVP-LAN |
| köklü çok noktalı (E-Tree) | EP-Tree | EVP-Tree |
Sözleşmenin sayısal çekirdeği tek bir hız rakamı değildir. Taahhüt edilen bilgi hızı, operatörün altına imza attığı taban hızdır. Burst hızı ise omurganın yükü uygunsa o sözün üstüne çıkabilmektir. Garanti taşımaz, artan kapasiteyi taşır. Trafik taahhüdün üstüne çıktığında hangi paketlerin önce atılacağını bir bayrak işaretler.
Hizmet seviyesi dört ölçüyle yazılır: tek yön çerçeve gecikmesi, gecikme oynaması, çerçeve kayıp oranı ve tek yön erişilebilirlik. Dördü de bir hizmet sınıfı adına bağlanır.
Bu ölçüleri sözleşmeye yazabilmek bir servis modeli tercihidir. Ağ katmanının tek bir modeli yok: ATM’nin sabit bit hızı ile kullanılabilir bit hızı sınıfları bir yanda, IP tarafındaki Intserv (RFC 1633) ile Diffserv (RFC 2475) öbür yanda duruyor. Operatörün sattığı şey, bu ailenin sözleşmeye geçmiş hâlidir.
Bir şehir 4.094 VLAN’a sığmaz
On iki bitlik VLAN kimliği operatör ölçeğinde yalnızca 4.094 kullanılabilir numara ediyor. Üstelik her müşteri kendi numaralarını kendi seçiyor ve numaralar çakışıyor. Sözleşmedeki hizmet sınıfı adı da sahada aynı etiketin üç bitlik öncelik alanına iniyor.
Çıkış yolu, müşterinin etiketinin üstüne ikinci bir etiket koymaktır. 4 baytlık tek etiket azami çerçeveyi 1.518 bayttan 1.522 bayta çıkarır. Operatör kendi dış etiketini eklerse çerçeve 1.526 bayta gider. Zarf çerçevesi bu işi resmileştirir: 1.500 baytlık veriye 482 bayta kadar etiket alanı ekler ve azami çerçeve 2.000 bayta çıkar. Q etiketli zarfın asgari veri alanı 42 bayta düşer, böylece 64 baytlık asgari çerçeve korunur.
Dış etiket operatöründür, iç etiket müşterinin. Müşteri kendi numaralarını serbestçe seçmeye devam eder ve omurgadaki anahtarlar yalnızca dış etikete bakarak iletir.
Boy sorunu böyle çözülür, çap sorunu durur. Eski köprü standardı azami yedi atlamalık bir ağ çapı önermişti. Katman 2’yi bir şehre yaymanın bedeli buradan görünür.
Etiket, adresin yerine geçmez
MPLS’in ilan edilen amacı sabit uzunlukta bir etiketle yüksek hızlı IP iletimidir. En uzun önek eşlemesinin yerini sabit uzunlukta bir kimlik alır. Etiket yığını girdisi 4 bayttır ve dört alan taşır.
MPLS etiket yığını girdisi - toplam 32 bit
+------------------------+--------+-----+-------------+
| Label 20 bit | Exp 3 | S 1 | TTL 8 bit|
+------------------------+--------+-----+-------------+
RFC 3032, Ocak 200120 bitlik alan 1.048.576 değer taşır. Bu, 802.1Q’nun kullanılabilir numara uzayının yaklaşık 256 katıdır. Tek bitlik S bayrağı yığının dibini işaretler ve etiketlerin üst üste binebilmesini mümkün kılan şey odur. Etiketin ardındaki üç bit deneysel kullanım için ayrılmıştı; sahada hizmet sınıfı taşır. 802.1Q’nun öncelik alanının etiketli omurgadaki karşılığı bu üç bittir. TTL alanı 8 bittir; döngü korumasını orada o devralır.
Karar bir kez verilir. Bir paketin hangi iletim denklik sınıfına düştüğüne yalnızca ağa girerken karar verilir. Aynı sınıfa düşen paketlerin izlediği yolun adı etiket anahtarlamalı yoldur. Operatörün sattığı sanal devrenin altındaki gerçek nesne budur.
Sonraki her atlamada iş sadeleşir. Etiket anahtarlamalı yönlendirici paketi yalnızca etiket değerine bakarak çıkış arayüzüne verir. IP adresine hiç bakmaz. MPLS iletim tablosu IP iletim tablosundan ayrıdır ve verdiği karar IP’nin vereceği karardan farklı olabilir.
Bu fark bir kusur sayılmaz, satılan özelliğin kendisidir. Aynı hedefe giden akışlar kaynak ve hedef adrese göre farklı yollara dağıtılabilir ve bunun adı trafik mühendisliğidir. Hızlı yeniden yönlendirme ise yedek yolları bağ kopmadan önce hesaplamaya dayanır. Kopuş anında hesap değil, seçim yapılır.
Bunun için yönlendirme protokolleri de genişletilir. OSPF ve IS-IS’in link state (bağlantı durumu) taşmasına bağ bant genişliği ve ayrılmış bant genişliği eklenir. Giriş yönlendiricisi aşağı akıştaki iletimi RSVP-TE ile kurar.
MPLS geleneksel iki katmanın arasında çalıştığı için 2,5. katman protokolü diye anılır ve sanal devre fikrini paket ağına taşır. Taşıdığı şey yalnızca IP de değildir: ATM, SONET ve Ethernet çerçeveleri aynı etiketli omurgadan geçebilir.
Bedeli yükten çıkar. Kapsülleme her katta MTU’dan yer yiyordu; operatör MTU’yu büyütmezse her MPLS etiketi müşterinin yükünden 4 bayt alır. 1.500 bayt 1.496’ya iner.
Yolu ağa yazmak yerine pakete yazmak
MPLS’in bedeli kontrol düzleminde. Her etiket anahtarlamalı yol için ağdaki her yönlendiricinin bir satır tutması gerekiyor; o satırları dağıtan protokoller de ayrıca kuruluyor, ayrıca işletiliyor. Bin yolu olan bir omurgada bin ayrı durum, her kutuda.
Bu yükü ortadan kaldıran fikrin adı segment yönlendirme. Tersine çeviriyor: yolu ağa dağıtmak yerine paketin başına yazıyor.
Gönderen kenar yönlendirici, paketin izleyeceği yolu bir liste hâlinde başına ekliyor. Listenin her elemanına segment deniyor ve iki türü var. Düğüm segmenti “şu yönlendiriciye, en kısa yoldan git” diyor. Komşuluk segmenti ise “tam olarak şu bağlantıyı kullan” diyor. İkisini karıştırarak istediğin yolu tarif edebiliyorsun: birkaç atlamayı en kısa yola bırak, kritik bir noktada belirli bir hattı zorla.
Ara yönlendiricilerin işi sadeleşiyor. Hiçbir yol durumu tutmuyorlar; listenin en üstündeki segmente bakıyor, gereğini yapıyor, o segmenti listeden düşürüyorlar. Durum ağdan çıkıp pakete taşınmış oluyor.
Aynı fikrin iki ayrı veri düzlemi karşılığı var. SR-MPLS listeyi az önce gördüğün etiket yığını olarak taşıyor — yani mevcut MPLS donanımı olduğu gibi çalışıyor, yalnızca etiketleri dağıtan protokoller gereksizleşiyor. SRv6 ise segmentleri IPv6 adresleri olarak taşıyor ve listeyi bir uzatma başlığına koyuyor; böylece ayrı bir etiket kavramına hiç ihtiyaç kalmıyor.
Etiketin her durakta nasıl değiştiğini takip edelim:
- Giriş yönlendiricisi sınıflar. Paketin hangi iletim denklik sınıfına düştüğüne yalnızca burada karar veriliyor. Kararın ardından paketin başına dört baytlık şerit takılıyor.
- İlk anahtar etikete bakıyor. Gelen değer kendi iletim tablosunda aranıyor, çıkış arayüzü bulunuyor ve şeride yeni bir değer yazılıyor. Hedef adres hiç sorulmuyor.
- İkinci anahtar aynı işi yapıyor. Değerin anlamı yerel: iki komşunun üstünde anlaştığı şey yalnızca o sayı. Bu yüzden her bağda başka bir sayı görünüyor.
- Çıkış yönlendiricisi şeridi alır. Etiket paketten çıkarılıyor ve iletim kaldığı yerden IP ile sürüyor. Buraya kadar izlenen yolun adı etiket anahtarlamalı yoldur.
- IP başlığı yolda hiç okunmadı. Başlık paketin içinde değişmeden durdu. Operatörün sattığı sanal devrenin altındaki gerçek nesne, bu başlığa bir kez bile bakmayan yoldur.
Özet
Peki, ne öğrendik?
- Metro Ethernet bir ölçek kararıdır: aynı çerçeve biçimi şehir alan ağında, tekli mod fiber ve taşıyıcı sınıfı yetenek listesiyle birlikte çalışır.
- Demarkasyon noktası sorumluluğun sınırıdır: yerel döngü orayı merkez ofise bağlar, müşteri ucu cihazı sınırın müşteri tarafında durur.
- Servisin adını sanal bağlantının şekli verir: noktadan noktaya E-Line, çok noktadan çok noktaya E-LAN, köklü çok noktalı E-Tree.
- Sözleşme tek bir hız rakamı değildir: taahhüt edilen bilgi hızı, gecikme, gecikme oynaması, kayıp oranı ve erişilebilirlik bir hizmet sınıfı adına bağlanır.
- Etiket adresin yerine geçmez, kararın yerine geçer: sınıflandırma girişte bir kez yapılır, sonraki her atlama yalnızca 20 bitlik değere bakar.
Metro halkasında paketin önünde dört baytlık bir şerit gidiyor ve kararı o veriyor. Ama şeridin kendisi de kilometrelerce bakırdan ya da camdan geçiyor. Peki bunca yol boyunca paketin kendisi tam olarak ne hâlde?
Bölüm 48: Bitten Sinyale
Şimdiye kadar paketi hep bir nesne gibi anlattım. Kasten basitleştirdim.
Bakırın üstünde paket diye bir şey yok. Orada yalnızca değişen bir gerilim var, ya da bir ışık dalgası. Peki bir bit tam olarak hangi dalga biçimine dönüşüyor?
Telde bit yok, gerilim var
Sinyal, bilgi taşıyan bir fiziksel büyüklük. Karşına üç biçimden biriyle çıkıyor: iletken üzerinde ilerleyen bir elektrik gerilimi, ortamda yol alan bir ışık örneği, bir de havada yayılan elektromanyetik dalga.
Paket metro halkasında bir etiketle taşınıyordu; o etiket de sonunda bu üç biçimden birine iner. Havada ise çerçeve bir kanal üzerinden veriliyordu; oradaki taşıyıcı da elektromanyetik bir dalgadır. Fizik aynı, ortam farklı.
Analog sinyal iki uç arasında sonsuz sayıda ara değer alabiliyor. Sayısal sinyalde böyle bir serbestlik yok; genlik değerleri önceden belirlenmiş ve sayılı.
Fiziksel katman bir anlaşma katmanıdır. İki taraf gerilim seviyesinde ve bit süresinde aynı kuralı paylaşmıyorsa iletim hiç başlamaz. Kablo takılı, ışıklar yanıyor, tek bir bayt geçmiyor. Sahada canını en çok sıkacak arıza tablosu budur, çünkü bakınca her şey yolunda görünüyor.
En sade anlaşmanın adı NRZ. Bakırda dijital 1’i tipik olarak +5 V ya da +3,3 V ile gösteriyorsun, dijital 0’ı ise 0 V ile. Optik ortamda aynı kural ışığa çevrilir: 1 parlak ışık, 0 karanlıktır. Işık kaynağının kendisi de bir tavan koyar: LED’ler en çok 600 MHz’e kadar çalışır. Bilgi doğrudan seviyenin kendisinde durur. NRZ-L bugün de asenkron RS-232 haberleşmesinde kullanılıyor.
Bir bitin süresi veri hızının tersidir. 1 Gbit/s’te bir bit 1 nanosaniye sürer; 10 Gbit/s’te aynı bit 100 pikosaniyeye iner. Yüz pikosaniye, ışığın bir buçuk santimetre yol aldığı süre — alıcının kararını o pencerenin içinde vermesi gerekiyor.
Alıcı sembol sınırını nereden bilir?
Saati ayrı bir telle de taşıyabilirsin, ama her hat için ikinci bir tel çekmek pahalıya patlar. Alternatifi saati sinyalin kendisine gömmek. Bunun çalışması için gelen sinyalde yeterli seviye geçişi bulunması gerekiyor; alıcı sembol sınırlarını ancak o geçişlerden çıkarabiliyor.
NRZI farksal bir kodlama: bilgiyi mutlak seviyede değil, aralık başındaki geçişin varlığında tutuyor. Kutuplamayı ters bağlasan bile anlam bozulmuyor. Gürültü altında bir geçişi saptamak, bir değeri eşikle karşılaştırmaktan daha güvenilir olabilir.
Bipolar-AMI başka bir yol seçiyor: sıfır için hiçbir şey göndermiyor, bir için sırayla pozitif ve negatif darbe yolluyor. Ardışık birler kutup değiştirdiği için doğru akım bileşeni kendiliğinden sıfırlanıyor. Yan ürünü asıl işinden bile hoş: kutup sırasının bozulması tek başına bir hata işareti sayılıyor. Hat kodunun kendisi basit bir hata sezme mekanizmasını bedavaya taşıyabilir.
Manchester kodlaması bu işi daha ileri götürüyor: her bit aralığının tam ortasına zorunlu bir geçiş koyuyor. Sıfırda yüksekten alçağa iniyorsun, birde alçaktan yükseğe çıkıyorsun. Dalga biçimi aslında saat sinyali ile verinin XOR’udur.
Farksal Manchester’da aralık ortasındaki geçiş her zaman durur. Bit değerini belirleyen şey aralık sonundaki geçişin varlığıdır. Token-Ring bu şemayı 4 ve 16 Mbit/s hızlarında kullandı. İki fazlı kodların ortak özelliğini tek cümlede toplayabilirsin: her bit süresinde en az bir geçiş garanti ediliyor. Bu yüzden onlara kendi kendine saatleyen kodlar deniyor.
Bedeli var. Manchester senkronizasyonu kolaylaştırır ama sembol hızını bit hızının iki katına çıkarır ve gereken bant genişliğini aynı oranda büyütür. Klasik 10 Mbit/s Ethernet hattı bu yüzden 20 Mbaud sinyal akıtıyordu. Yani kablodan istediğin her bit için iki sembol ödüyordun ve yük %100’e çıkıyordu.
Aynı bit dizisinin farklı kodlamalarda nasıl göründüğünü karşılaştıralım:
- Sekiz bitlik dizi. Üç kulvar da aynı diziyi taşıyor: 1 0 1 1 0 0 1 0. Kesikli dikey çizgiler bit sınırları; iki çizgi arası bir bit süresi kadar.
- NRZ-L: seviye bilgidir. Bir yüksek gerilim, sıfır alçak gerilim. Ardışık aynı bitlerde hiç geçiş yok; uzun bir dizide alıcı sembol sınırını kaybedebilir.
- NRZI: bilgi geçişte. Seviyenin kendisi anlam taşımıyor. Aralık başında geçiş varsa bir, yoksa sıfır; kutuplama ters bağlansa da okunan dizi değişmiyor.
- Manchester: orta geçiş şart. Her bit aralığının ortasında zorunlu bir geçiş var: sıfır yüksekten alçağa, bir alçaktan yükseğe. Dalga, saat ile verinin XOR'u.
- Faturayı baud ödüyor. Bu dizide NRZ-L beş, Manchester on geçişle iniyor. Garanti edilen sekiz orta geçişin bedeli iki kat sembol hızı: 10 Mbit/s hat 20 Mbaud akıtır.
Bir sembol kaç bit taşır?
Hat kodlaması, veri bitlerinden sinyal elemanlarına yapılan eşlemedir. İyi bir kod yüksek frekans bileşenlerini azaltır, çünkü daha az bant genişliği ister. Doğru akım bileşeninin olmaması da ayrıca istenir.
Buradan iki ayrı büyüklük çıkıyor. Modülasyon hızı baud ile ölçülür ve saniyedeki sinyal elemanı sayısını verir. Veri hızı ise saniyedeki bit sayısıdır. Bir sembol birden çok bit taşıyabiliyorsa veri hızı sembol hızının üstüne çıkar.
4B/5B tam bunu yapar. Her 4 bitlik bloğu 5 bitlik bir sembole çevirir. 100 Mbit/s’lik veri akışı hatta 125 Mbaud’a dönüşür. Yük %25 olur. Aynı iş Manchester ile yapılsaydı 200 Mbaud gerekirdi; şema sembol hızından %37,5 tasarruf ediyor.
5 bitle 32 sembol üretebiliyorsun ve bunların 16’sını veriye ayırıyorsun. Kalanını IDLE gibi denetim sembolleri olarak kullanıyorlar. Bu yüzden bir Fast Ethernet hattı veri yokken bile susmaz; boşta da 125 Mbaud IDLE akıtır. Ağ kartının ışığı hiçbir şey yapmazken de yanıyorsa sebebi bu.
100BASE-TX’in hat işaretlemesi MLT-3’tür. Sinyal artı, sıfır ve eksi olmak üzere üç seviyeden birinde durur. Seviye değişimi bir, değişmemesi sıfır demektir. Bir tam dalga dört sembol süresi aldığı için 125 Mbaud’luk akış kablodan yalnızca 31,25 MHz ister. Kazanç sembol hızında değil, frekanstadır. Karıştırma aynı amaca hizmet ediyor: veriyi rastgeleleştiriyor, yayılan enerji tek bir frekansta toplanmıyor ve geçiş yoğunluğu artıyor.
| şema | eşleme | yük | nerede |
|---|---|---|---|
| Manchester | 1 bit → 2 sembol | %100 | 10 Mbit/s Ethernet |
| 4B/5B + MLT-3 | 4 bit → 5 sembol | %25 | 100BASE-TX |
| 8B/10B | 8 bit → 10 bit | %25 | 1000 Mbit/s hat |
| 64B/65B + PAM16 | 64 bit → 65 bit | %1,5625 | 10GBASE-T |
Tabloya yukarıdan aşağı bakınca bir eğilim göreceksin: hız arttıkça blok kodlamanın bedeli küçülüyor. 8B/10B her 8 bitlik baytı 10 bitlik bir kod grubuna çeviriyor. 1.024 kod grubunun 256’sı veri taşır, kalanı denetimdir. 1000 Mbit/s’lik hat böylece 1.250 Mbaud’a çıkar. Kod grupları hem yeterli geçiş taşıyor hem de zaman içinde bir ile sıfır sayısını dengeliyor; sinyal yolunda birikimli bir yanlılık oluşmuyor.
1000BASE-T başka bir yoldan gider. Kodlaması 4D-PAM5: dört boyutlu kafes modülasyonu ile beş seviyeli darbe genliği modülasyonunun birleşimi. Her çifte sembol başına 2 bit koyuyor ve dört çifti aynı anda çalıştırıyor; 125 Mbaud ile 1000 Mbit/s’e ulaşıyor. Dikkat et, sembol hızı Fast Ethernet’in üstüne hiç çıkmıyor.
10GBASE-T iki koldan birden çalışıyor. Önce 64 bitlik öbekleri 65 bitlik bloklara çeviriyor. Blok kodlamanın yükü %25’ten %1,5625’e iner. Sonra 16 seviyeli darbe genliği modülasyonuyla sembol hızını 800 Mbaud’a indirir. Çift başına 2,5 Gbit/s ve sembol başına 3,125 bit düşer.
Faturayı kablo ödüyor: 10GBASE-T Cat6’da 250 MHz, Cat6A’da 500 MHz bant genişliği istiyor. Cat6 ile erişebildiğin mesafe de 100 metrede kalmıyor, yaklaşık 55 metreye iniyor. Belirtilen en kötü durum bit hata oranı ise 10 üzeri -12’dir. Ortalama her trilyon bitte en fazla bir hata.
Kanalın tavanını kim koyuyor?
Bant genişliği, hattın taşıyabildiği frekans aralığı demek. Bant genişliğini bir kapasite ölçüsü olarak kullanmıştık; buradaki tanımı onun fiziksel karşılığı olarak oku. Fourier’e göre her periyodik sinyali sinüslerin toplamı olarak yazabilirsin. Dar bantlı bir kanal ise o toplamın üst harmoniklerini kesiyor.
Alınan şekil gönderilene benzemez.
Nyquist sınırı gürültüsüz bir kanal için tavanı çiziyor ve iki şeye bakıyor: kanalın bandı ile sembol başına kullanılan seviye sayısı. Bandı iki katına çıkarmak sinyal hızını da iki katına çıkarıyor; seviye sayısı ise hıza çok daha cimri katkı yapıyor.
| 4.000 Hz’lik kanalda seviye sayısı | taşınabilen hız |
|---|---|
| 2 | 8.000 bit/s |
| 4 | 16.000 bit/s |
| 8 | 24.000 bit/s |
| 16 | 32.000 bit/s |
Tablo iki oranı yan yana koyuyor. Seviye sayısını iki katına çıkarmak hıza her seferinde yalnızca 8.000 bit ekliyor: ikiden dörde geçmek hızı ikiye katlıyor, sekizden on altıya geçmek ise yalnızca üçte bir artırıyor. Getiri azalırken alıcının işi zorlaşıyor, çünkü seviyeler birbirine yaklaşıyor. Sınırı çizen şey de burada devreye giriyor: gürültü.
Modülasyon derinliği gürültüyle sınırlanıyordu; aynı tavan bakır telde de geçerlidir. O tavanın adı Shannon sınırı ve iki büyüklüğe bakıyor: kanalın bandı, bir de sinyalin gürültüye göre ne kadar güçlü olduğu.
Aynı 4.000 Hz’lik kanalda, sinyal gürültünün yüz katıysa tavan yaklaşık 26.600 bit/s çıkıyor. Sekiz seviyeli işaretlemenin verdiği 24.000 bit/s bu tavanın altında kalıyor; on altı seviyenin istediği 32.000 bit/s ise duvara çarpıyor. Nyquist “kaç sembol geçirebilirim” sorusunu, Shannon “her sembole kaç bit yükleyebilirim” sorusunu cevaplıyor.
Asıl ders sayıda değil, iki büyüklüğün eşit güçte olmamasında. Bandı iki katına çıkarırsan kapasite de iki katına çıkıyor — doğrudan orantılı. Ama vericinin gücünü iki katına çıkarmak kapasiteye yalnızca kırıntı ekliyor; gücü yüz katına çıkarsan bile kazanç, bandı ikiye katlamanın verdiği kadar bile olmayabiliyor.
Bu tek gözlem, kablosuz kuşakların her seferinde daha geniş kanal peşinde koşmasını ve spektrumun bu kadar pahalı olmasını açıklıyor: güç ucuz, bant pahalı, ve kapasiteyi büyüten bant.
İkinci gözlem şaşırtıcı. Sinyal gürültü kadar zayıf olsa bile kapasite sıfıra düşmüyor; hertz başına yaklaşık bir bit kalıyor. Gürültü iletişimi imkânsız kılmıyor, yalnızca pahalılaştırıyor.
Shannon erişilebilir teorik tavandır. Beyaz gürültü varsayar; darbe gürültüsünü ve bozulmaları hesaba katmaz. Pratikte hep altında kalınır.
DerinleşmeShannon sınırının denklemi ve o 26.600 sayısı nereden çıkıyor?
Sınır tek satırda yazılıyor:
C = B × log₂(1 + S/N)C saniyedeki bit, B hertz cinsinden bant genişliği, S/N ise sinyal gücünün gürültü gücüne oranı. Logaritmanın tabanının iki olması tesadüf değil: cevabı bit cinsinden istiyoruz ve bir bit tam olarak iki olasılık arasındaki seçim.
Hesaba girmeden önce bir birim tuzağı var. Veri sayfalarında sinyal-gürültü oranı hep desibelle verilir, formül ise düz oran ister. Çevirmek gerekiyor: 20 dB demek, sinyalin gürültünün yüz katı olması demek. Her 10 dB bir sıfır ekliyor — 10 dB on kat, 30 dB bin kat.
Şimdi 4.000 Hz’lik kanalı koy:
C = 4.000 × log₂(1 + 100) = 4.000 × 6,66 ≈ 26.600 bit/sAna metindeki iki gözlem de doğrudan denklemin şeklinden çıkıyor. B çarpan olarak dışarıda duruyor, yani onu ikiye katlamak sonucu ikiye katlıyor. S/N ise logaritmanın içinde; onu ikiye katlamak sonuca yalnızca 4.000 × 1 = 4.000 bit/s ekliyor. Bandı %50 genişletmek, gücü on kat artırmaktan daha çok kazandırıyor.
Sınırın kendisi bir varış noktası da değil, bir sözdür: bu hızın altında kalan her hız için, hatayı istediğin kadar küçültecek bir kodlama vardır. Shannon o kodlamanın nasıl bulunacağını söylemiyor — yalnızca var olduğunu kanıtlıyor. Sonraki yetmiş yılın hata düzeltme kodları o kanıtın peşinden gitti.
Termal gürültü iletkendeki elektronların rastgele hareketinden doğar. Hattın tabiatındadır ve ortadan kaldırılamaz. Gücü de bant genişliğiyle doğru orantılıdır. Döngüsel artıklık denetimi ters dönmüş bir biti yakalıyordu; o bitin neden ters döndüğü buraya kalmıştı. Beş ayrı mekanizma sayılır: zayıflama, gecikme bozulması, yansıma, diyafoni ve gecikme oynaması. Bozulmanın miktarı sinyalin frekansına ve genliğine bağlıdır.
Bir telden akan sinyal etrafında manyetik alan üretir. Komşu telde bu alan yeni bir sinyal indükler. Adı diyafoni (crosstalk); Türkçe kaynaklarda çapraz karışma da denir. Empedans uyumsuzluğunda ise sinyalin bir kısmı geri yansır ve hatta duran dalga oluşur. Sonlandırma bu yüzden süs değildir.
Zayıflama ve yükseltme logaritmik ölçekte, desibelle ölçülür. Güç için 10log, gerilim için 20log alınır. 3 dB iki kat, 20 dB yüz kat, 30 dB bin kat demektir. Kendi makinende bu katmanın uçlarını görebilirsin.
ethtool eth0 # hız, çift yönlülük, port türü, desteklenen bağlantı kipleri
cat /sys/class/net/eth0/speed # yalnızca hız, megabit cinsindenÇıktıdaki hız ve port türü, kartın hangi hat kodlamasında anlaştığını dolaylı olarak söyler. Bakır ile fiber arasındaki fark orada görünür.
Özet
Peki, ne öğrendik?
- Sinyal fiziksel bir büyüklüktür: bilgi bir gerilimde, bir ışık örneğinde ya da bir elektromanyetik dalgada taşınır ve bit diye bir nesne telde bulunmaz.
- Hat kodlaması bitten dalga biçimine giden eşlemedir: aynı dizi NRZ-L’de başka, Manchester’da başka görünür ve seçim saatle bant genişliği arasında yapılır.
- İki fazlı kodlar saati sinyalin içine gömer: her bit süresindeki zorunlu geçiş senkronizasyonu bedavaya verir, faturayı iki kat sembol hızıyla keser.
- Blok kodlama bu faturayı ucuzlatır: 4B/5B ve 8B/10B yükü dörtte bire, 64B/65B ise yüzde birbuçuğa indirir ve çok seviyeli işaretleme sembol başına bit sayısını büyütür.
- Kanalın tavanını fizik koyar: Nyquist gürültüsüz durumu, Shannon gürültülü durumu sınırlar ve termal gürültü hattın tabiatında olduğu için hiç yok edilemez.
Şu anda telde saniyede milyarlarca kez değişen bir gerilim var ve o gerilim tek bir konuşmayı taşıyor. Peki aynı telde aynı anda kaç konuşma birden gidebilir?
Bölüm 49: Çoklama Teknikleri
Sinyali telin üstüne koyduk. Şu ana kadar o telde tek bir konuşma varmış gibi yazdım.
Öyle değil. Bir hattın kapasitesi tek göndericiye fazla geniş gelir. Peki o kapasiteyi aynı anda kaç konuşma arasında bölüşmek mümkün, ve bölüşenler birbirini nasıl duymaz?
Kanal, telin kendisi değildir
Tek bir iletim yolunu aynı anda birden çok kullanıcıya açmanın adı çoklama. Adı kulağa ağır geliyor ama yaptığı iş sade.
İki ad burada ayrılır. Fiziksel yolun adı devre ya da bağlantıdır: bakır bir çift, koaksiyel bir hat, cam bir lif. O yoldan tek bir alıcı-verici çiftine ayrılan kapasite dilimine ise kanal denir. Bir devre yüzlerce kanal taşıyabiliyor. Kanalı elinle tutamazsın; ortada yalnızca bir tahsis kaydı var.
Gerekçesi ekonomik. Devre anahtarlamayı ve bant genişliğini biliyorsun; o hattın neden tek kullanıcıya bırakılmadığını burada açıyorum. Yüksek kapasiteli bir hattı tek göndericiye vermek, o bant genişliğinin ancak küçük bir dilimini çalıştırır ve kalanı boşa gider. Hat ise tamamı için ücretlendirilir.
Çoklamanın kullanıcıya verdiği söz bunun karşılığıdır. Her gönderici-alıcı çifti, kendisine ait sanal bir fiziksel kanala sahipmiş gibi davranır. Komşusunun bitlerini görmez, onun sustuğunu ya da konuştuğunu fark etmez.
Sözü tutan düzeneğin iki ucu vardır. Bir uçta girişleri tek hatta bindiren çoğullayıcı, öbür uçta onları yeniden ayıran çoklama çözücü durur. Kanal ayırma da en az bindirme kadar kuralcıdır: iki uç aynı bölme kuralını bilmek zorundadır.
Bunu başarmanın üç temel yolu var: frekans bölmeli çoklama, zaman bölmeli çoklama ve dalga boyu bölmeli çoklama. Kısaltmaları FDM, TDM ve WDM. Sonuncusu ilkinin optik kılığıdır, ikincisi ise kendi içinde ikiye ayrılır.
Frekansta bölmek: herkese kendi şeridi
Frekans bölmeli çoklama, iletim hattının bant genişliğini çok sayıda frekans aralığına böler. Her kanal kendi aralığını alır ve orayı bütün zaman boyunca kullanır. Kimse sıra beklemez.
Aralıklar birbirine değmez. Hücresel kanalın kenarında bir koruyucu bant duruyordu; bakır hatta da aynı boşluk komşu kanalların kenarları için ödenir ve o spektrum hiç kimseye satılmaz.
Yöntemin ön koşulu tek: ortamın kullanılabilir bant genişliği, taşınacak sinyallerin istediği bant genişliğinden büyük olmak zorunda. Aksi hâlde kanal sayısı düşer, ya da kanallar daralır.
FDM ağırlıkla analog işaretlerde kullanılır ve en tanıdık örneği kablolu televizyondur. Ortamda giden bileşik sinyal analogdur. Giriş sayısal olsa bile bu değişmez: akış bir modemden geçirilir ve kendi taşıyıcı frekansına taşınır.
Bit bakır üstünde bir gerilim eğrisine dönüşüyor ve bant genişliği o eğriye bir sınır koyuyordu. Aynı eğri burada kendi frekans dilimine biniyor. Komşularıyla toplanıp tek hatta çıkıyor.
Yığın katman katman büyütülebilir ve her katman bir öncekini çoğullar. Analog taşıyıcı hiyerarşisinde bir mastergroup 2,52 MHz bant genişliği kaplar ve 600 ses kanalı taşır. O blok, on tane daha küçük bloğun bir kez daha çoğullanmasıyla kurulur. Klasik uygulama alanı uzun mesafedir: yüksek kapasiteli fiber, koaksiyel ve mikrodalga taşıyıcılar aynı anda çok sayıda ses ve veri iletimini sırtlar.
Aynı fikri bugün de kullanıyorsun. Bir Wi-Fi kanalı seçmiştin; o seçim de havanın bir frekans diliminin tek bir hücreye ayrılmasıydı. DSL’de ses ve veri aynı bakır telefon hattı üstünde farklı frekanslarda gider. Santraldeki DSLAM ikisini ayırır. Bantlar downstream’de 24-52 Mbit/s, upstream’de 3,5-16 Mbit/s.
Zamanda bölmek: herkese kendi sırası
Zaman bölmeli çoklama başka bir eksen keser. Her kanala düzenli aralıklarla hattın bant genişliğinin tamamı verilir. Bölüşülen şey frekans değil sıradır. Bir dilim boyunca hat tek bir kaynağın olur, sonra el değiştirir.
Dilimin süresi hattı paylaşan kanal sayısına bağlıdır. Kanal arttıkça herkesin sırası kısalır. Dilimin uzunluğu göndericinin ara belleğine eşittir ve tipik olarak bir bit ya da bir bayt kadardır.
Dilimler tur tur akar ve turun da kendi adı var. Bir tura çerçeve denir ve her kaynağa çerçeve başına en az bir dilim düşer. Bağlantı katmanının çerçevesiyle aynı sözcük, aynı şey değil. Sabit atamayla bile farklı hızlar aynı hatta binebilir: yavaş cihaza tur başına bir dilim verilir, hızlı cihaza birkaç tane.
Aritmetiği de basittir. Altı girişin her biri 1 Mbit/s ise, en az 6 Mbit/s kapasiteli tek bir hat ek yük payıyla birlikte altısını da taşır. TDM ağırlıkla sayısal işaretlerde kullanılır. Ders kitapları onu FDM’in yanına daha yüksek kanal kapasitesi, daha düşük gürültü ve daha düşük maliyetle yazar.
Senkron zaman bölmesi bu atamayı önceden ve sabit yapar. Bütün dilimler eşit sürelidir ve her biri aynı miktarda veri taşır. Kaynak susarsa dilim yine ona ayrılmış kalır. Boş geçer.
64 kbit/s nereden çıktı?
Birazdan gelecek sayıların hepsi tek bir kökten büyüyor ve o kök bir ses kaydından geliyor. Telefon şebekesi analog sesi sayısala çevirmek zorundaydı; yöntemin adı darbe kod modülasyonu ve üç adımı var.
Örnekleme. Sürekli bir dalgadan düzenli aralıklarla değer okursun. Kaç sıklıkta? Cevabı örnekleme teoremi veriyor: bir işareti kaybetmeden yeniden kurabilmek için, içindeki en yüksek frekansın iki katı hızda örneklemek gerekiyor. Nyquist’in kanala koyduğu tavanı biliyorsun; bu onun ikiz kardeşi, aynı adamın aynı yıl yazdığı öteki sınır.
Telefon şebekesi insan sesini 4 kHz’lik bir banda sıkıştırmayı yeterli buldu — konuşmanın anlaşılırlığı 300 ile 3.400 Hz arasında zaten korunuyor. Öyleyse:
örnekleme hızı = 2 × 4.000 Hz = saniyede 8.000 örnekNicemleme. Her örnek bir sayıya yuvarlanıyor. Sekiz bit, yani 256 basamak seçildi. Doğrusal olsaydı kısık sesler kaba kalırdı; bu yüzden basamaklar sesin şiddetine göre sıkıştırılıyor — küçük genliklerde sık, büyük genliklerde seyrek. Kuzey Amerika’da bu eğrinin adı μ-yasası, Avrupa’da A-yasası.
Kodlama. Sayıyı bit olarak yola koy. Çarpımı yap:
8.000 örnek/s × 8 bit = 64.000 bit/sİşte o kadar. 64 kbit/s bir mühendislik tercihi değil, insan kulağının bant genişliğinin doğrudan sonucu. Sayısal telefon hiyerarşisinin bütün basamakları bu tek sayının katı olarak kuruldu ve bugün hâlâ öyle:
T1 = 24 kanal × 8 bit + 1 çerçeve biti = 193 bit → 193 × 8.000 = 1,544 Mbit/s
E1 = 32 zaman dilimi × 8 bit = 256 bit → 256 × 8.000 = 2,048 Mbit/sE1’in 32 diliminin ikisi veri taşımıyor: biri çerçeve hizası, biri sinyalleşme için ayrılmış. Geriye 30 kanal kalıyor — birazdan göreceğin sayı tam olarak bu.
Adlarını her gün duyuyorsun. ISDN’in B kanalı veriyi taşır ve saniyede 64000 bitlik kapasitesi vardır; sinyalleşmeyi taşıyan D kanalı da aynı hızdadır. Kuzey Amerika’da T1 diye anılan birincil hız arayüzü 23 B kanalı ile 1 D kanalı taşır. Avrupa’da E1 diye anılan arayüzde 30 B kanalı ve 1 D kanalı vardır. Veri kapasiteleri sırasıyla 1472 ve 1920 kbit/s eder. Bir yönlendiricinin WAN arayüzünde desteklenen standart listesi de bu hiyerarşinin adlarıdır: E1, E3, ISDN, SONET, T1, T3 ve xDSL.
Hem FDM hem senkron atama, gerçekleştirmeyi basitleştirmek uğruna kapasite israf eder.
Aynı telin frekansta ve zamanda nasıl bölündüğünü görelim:
- Tek hattın kapasitesi. İki dikdörtgen de aynı şeyi gösteriyor: bir hattın bütün bant genişliği, bütün zaman boyunca. Dikey eksen frekans, yatay eksen zaman.
- Frekansta kesmek. Frekans bölmeli çoğullamada her kanal kendi frekans aralığını alır ve orayı sürekli kullanır. Dalga boyu bölmeli çoğullama da bu kesimdir; ekseni ışığın rengidir.
- Zamanda kesmek. Zaman bölmeli çoğullamada kesim dikeydir. Her kaynak sırası geldiğinde hattın tamamını alır; A, B ve C dilimleri tur tur devralır.
- İki kesimin de bedeli. Solda şeritler arasındaki koruyucu bant hiç veri taşımaz. Sağda C ikinci turda susuyor ama dilimi yine ona ayrılmış; o dilim boş geçiyor.
İstatistiksel TDM bu israfı kapatır. Dilimleri sabit atamak yerine isteğe göre dağıtır: çoğullayıcı göndermeden önce bütün giriş belleklerini tarar, çerçeve dolana kadar veri toplar, sonra çerçeveyi yollar. Asenkron ya da akıllı TDM diye de anılır. Paket anahtarlama da aslında bunun bir biçimidir. Otoyol şeritlerine dön: senkron atama herkese kendi şeridini ayırır, istatistiksel dağıtım ise şeritleri ortak tutar.
Kablo erişim ağı iki ekseni birden kullanır. Aynı koaksiyel hat üstünde video, veri ve kontrol kanalları farklı frekans bantlarında gider, ve upstream’de aynı bantlar zamanda da bölünür. Bu ikili kesimin kurallarını burada açmıyorum; kablo erişim ağını kurarken oraya geleceğiz.
Üçüncü bir eksen daha var. Yerel ağda ortak kanal bilgisayarlar arasında benzer biçimde paylaştırılır ve MAC protokolleri bu paylaşımın kurallarıdır. TDMA her istasyona her turda sabit uzunlukta bir dilim verir; FDMA her istasyona sabit bir bant ayırır. İkisinde de kullanılmayan pay boşa gider. CDMA ise ne zamanı ne frekansı böler. Her düğüme farklı bir kod atanır, düğümler aynı anda iletir ve alıcı kodu bilerek doğru biti çıkarır.
Işıkta bölmek: aynı kesim, başka ölçek
Dalga boyu bölmeli çoklama mekanizma olarak FDM ile aynıdır. Ayrı bir ad taşımasının tek sebebi optik haberleşmede kullanılmasıdır. Fiberden akan ışık tek renk değildir; her dalga boyu ayrı bir veri kanalı taşır.
Zincir dört parçadan kurulur. Lazerler farklı dalga boylarında ışık üretir. Çoğullayıcı onları tek fiberde birleştirir. Optik yükselteçler onlarca kilometre arayla bütün dalga boylarını birlikte yükseltir. Varışta çoklama çözücü hepsini yeniden ayırır.

Izgara keyfi değil. Kanallar dalga boyuyla değil frekansla numaralanıyor, çünkü kanallar arasındaki eşit aralık frekans ekseninde eşit oluyor. ITU-T G.694.1 ızgarayı tek bir çıpaya bağlıyor: 193,1 THz. Bütün kanallar ondan sabit adımlarla sağa ve sola sayılıyor.
fkanal = 193,1 THz + n × aralık n = ..., −2, −1, 0, 1, 2, ...Aralık ilk kuşakta 200 GHz’di, sonra 100’e, bugün yaygın olarak 50 GHz’e indi; 25 ve 12,5 GHz’lik ızgaralar da tanımlı. Aralık daraldıkça aynı banda daha çok kanal sığıyor, karşılığında lazerin dalga boyunu daha kararlı tutması gerekiyor.
İki adı buradan ayırmak gerekiyor. Aralığı dar olan ve tek bir bandın içine onlarca kanal sıkıştıran biçime yoğun dalga boyu çoklama (DWDM) deniyor — ızgarası yukarıdaki G.694.1. Aralığı çok geniş tutan, tipik olarak 20 nm adımlarla 1270-1610 nm arasına sekiz-on sekiz kanal koyan biçime ise kaba dalga boyu çoklama (CWDM) deniyor; ızgarası ayrı bir belgede, G.694.2’de. Aradaki fark maliyette görünüyor: CWDM’in geniş aralığı, lazerin sıcaklıkla kayan dalga boyunu tolere ediyor, yani soğutucuya gerek kalmıyor. DWDM her lazeri sıcaklık denetimi altında tutmak zorunda.
Fiberde zayıflama dalga boyuna göre değiştiği için ITU bant adlarını da bu eğriye göre seçti.
Bantların tam listesini ve zayıflama eğrisinin nerede dip yaptığını fibere indiğimizde açacağız; burada tek bir tanesi işimize yarıyor. C bandı 1530-1565 nm arasını kaplar, uzun mesafenin evidir ve tek modlu fiberde çoklamaya ayrılmıştır. Genişliği 35 nm, yani yaklaşık 4,38 THz. Elli GHz aralıkla oraya seksen yedi kanal sığar.
Sayılar buradan sonra hızla büyür. 1997’de 10 Gbit/s’lik yüz ışın 1 Tbit/s eşiğini geçti. Ticari sistemler 160 kanalı 10 Gbit/s ile taşıdı. Laboratuvarda 256 kanal 39,8 Gbit/s ile 100 km’de 10,1 Tbit/s verdi.
Kaba biçimi ise senin elindeki kutuda durur. Kaba dalga boyu çoklama birkaç şeridi tek fiber çiftine basar. 10GBASE-LX4 çerçeveyi dört şeride böler ve 1310 nm civarındaki dört dalga boyuyla aynı anda gönderir. 40GBASE-LR4’ün merkezleri 1271, 1291, 1311 ve 1331 nm’dir. Renkler keyfi seçilmez; ızgara ITU-T G.694.2’de yazılıdır.
Kısa mesafede de aynı numara işler. Bir üreticinin çift yönlü modülü 850 ve 900 nm’de iki ayrı 20 Gbit/s kanal kurar ve tek fiber çiftinden 40 Gbit/s çıkarır. 100GBASE-LR4’ün dört dalga boyu ise 1295,56 ile 1309,14 nm arasına sıkışır.
Özet
Peki, ne öğrendik?
- Çoklama bir yolu paylaştırmaktır: fiziksel yolun adı devre, o yoldan bir alıcı-verici çiftine ayrılan kapasite diliminin adı kanaldır.
- FDM frekansı böler: her kanal kendi aralığını bütün zaman boyunca tutar, aralarında duran koruyucu bant ise kasten boş bırakılır.
- TDM sırayı böler: her kanal kendi diliminde hattın tamamını alır; senkron atamada susan kaynağın dilimi yine boş geçer.
- İstatistiksel dağıtım israfı kapatır: çoğullayıcı giriş belleklerini tarar, çerçeveyi doldurur ve yollar; paket anahtarlama bunun bir biçimidir.
- WDM aynı kesimin optik hâlidir: her dalga boyu ayrı bir kanal taşır, C bandına 50 GHz aralıkla yaklaşık 87 kanal sığar.
Bir telin içinde kaç konuşmanın birden gidebildiğini artık biliyorsun. Ama bu bölüm boyunca “tel” dedim ve ne olduğunu hiç açmadım. Bu gerilim eğrisi bir kablonun içinde gidiyor; o kablo nasıl bir şey?
Bölüm 50: İletim Ortamları
Bir önceki bölümde tek telde birden çok konuşmayı bölüştürdük. Telin kendisini hiç açmadım.
Tek bir kablo yok. Bakır çift, ekranlı çift ve koaksiyel ayrı ailelerdir. Her aile ayrı bir ödünleşim satar. Hangisini seçtiğinde neyi kaybettiğini nereden bileceksin?
Bakır telin çevresinde bir alan var
İletim ortamını üçe ayırabilirsin: bakır telde elektrik akımı gidiyor, cam lifte ışık, havada radyo dalgası ya da kızılötesi. Her ortam kendi fiziğine uygun bir kodlamayı dayatıyor. Zayıflama da ortamdan bağımsız bir kader değildir. Elektrik sinyali dirençten, optik sinyal soğurulma ile dağılmadan, elektromanyetik dalga atmosferden kaybeder.
Hız da ortamın verdiği bir sayıdır. Yayılım gecikmesini hesaplarken sinyalin hızını sabit almıştım; oysa o sabit yalnızca kabaca doğruydu. Bakırda hız ışığın üçte ikisine düşüyor, yani saniyede yaklaşık 200.000 kilometreye. Yüz metrelik bir yatay kabloyu sinyal bu hızla 0,5 mikrosaniyede geçiyor.
Bakır kablo 30 kHz ile 3 GHz arasındaki bantta kullanılır. Taşıdığı sinyal çevresinde bir elektromanyetik alan üretir ve o alan komşu tel üzerinde akım doğurur. Bit gerilim eğrisine dönüşürken gürültüyle boğuşuyordu; diyafoni dediğimiz bozulmanın kaynağı işte o yan teldir.
İki bakır tel birbirine dik durduğunda diyafoni en aza iner. Bir kablonun içinde iki teli baştan sona dik tutamazsın. Twisted pair tam bu geometriyi kablo boyunca sürekli taklit eder. İki tel birbirinin etrafında döndükçe etkinin işareti her yarım turda tersine döner. Toplam kendini götürür. İletkenlerin paralel kalması şartsa çözüm başkadır: eş eksenli yapıya, yani koaksiyele geçilir.
Aynı fizik dışarıdan da işler. Metal kanal içinde güç hattına 6,4 cm, açık güzergâhta 12,7 cm bırakılır. Bakır ailesinin ortak zayıflığı bu: yanından geçen her akım kablonun marjından yer. Kablonun her katmanı o marjı korumak için orada.
Telin çevresindeki her katman bir iş yapıyor
UTP ailenin en sade üyesidir. Karakteristik empedansı 100 ohm, dış çapı 0,43 cm. İçinde dört twisted pair, yani sekiz tel var. Her tel diğerinden yalıtılmıştır ve uç RJ-45 ile sonlandırılır. Kablo kanalında az yer kaplaması bu inceliğin getirisidir.
Herkesin RJ-45 dediği sekiz konumlu konnektörün resmî künyesi IEC 603-7’dir. RJ adı ABD telefon sektörünün Registered Jack kaydından kalmadır ve aile kontak sayısıyla ayrışır. RJ-11 iki kontakla tek telefon hattını taşır. RJ-14’ün dört kontağı vardır, RJ-48 de dört kontakla T1 bağlantısını sonlandırır. RJ-45 sekiz kontakla Ethernet’i taşır. Sekiz teli o konnektöre hangi sırayla dizeceğin ayrı bir iş; sonlandırmayı bir sonraki durakta elimize alacağız.
Ekranlama üç düzende üretilir. Her çift ayrı folyoyla sarılır. Bütün çiftlerin üstüne tek bir folyo ya da örgü geçirilir, ya da ikisi birden yapılır. ISO/IEC 11801 adlandırması bunu iki harfle yazar. Eğik çizginin solu genel ekranı, sağı çift başına ekranı anlatır.
| yazım | genel ekran | çift başına ekran |
|---|---|---|
| U/UTP | yok | yok |
| F/UTP | folyo | yok |
| U/FTP | yok | folyo |
| S/FTP | örgü | folyo |
| SF/UTP | örgü ve folyo | yok |
Ekran bedava gelmez. STP’nin ekranı ağ kartından duvar prizine ve oradan anahtara kadar kesintisiz topraklanmak zorundadır. Süreklilik bir yerde koptuğunda ekran kalkan olmaktan çıkıp antene döner: çevredeki sinyalleri toplar ve taşıdığı veriyi bozar. Yarım kurulmuş ekranlı kablo, hiç ekranı olmayandan kötüdür.
Seçim coğrafyayla da değişiyor. UTP Kuzey Amerika’da ve pek çok bölgede en yaygın ağ kablosudur, ekranlı aileler ise ağırlıkla Avrupa’da tercih edilir. Aradaki fark teknik bir üstünlük değil, yerel yönetmelik ve alışkanlık farkıdır.
Dış kılıfın da kendi sınıfı var ve o sınıf kablonun üstüne basılır. CMP plenum sınıfıdır ve kanalsız olarak havalandırma boşluğuna çekilebilir. CMR katlar arası dikey şaft içindir, CM genel bina kablolamasıdır. Plenum kablolarda dış kılıf olarak FEP kullanılır, çünkü FEP yanarken çok daha az duman ve ısı üretir. Standart PVC yalıtım oda sıcaklığında sınıfına göre çalışır. 40 °C üstünde zayıflaması belirgin biçimde artar.
Standardın adı zaten kendini anlatıyor
Ethernet standartlarının adları rastgele harf yığını değil, üç parçalı bir kodlama. Adı okumayı öğrendiğinde listeyi ezberlemene gerek kalmıyor.
1000BASE-T üç parçaya ayrılıyor:
- 1000 — hattın sinyal hızı, megabit cinsinden. Bin megabit, yani bir gigabit.
- BASE — taban bantlı iletim. Kablo tek bir sinyal taşıyor ve o sinyal taşıyıcıya bindirilmiyor. Karşıtı geniş bantlı iletimdir; kablo TV şebekesi öyle çalışır.
- T — ortam ya da kodlama.
Ttwisted pair,Skısa dalga boylu çok modlu fiber,Luzun dalga boylu tek modlu fiber,Cikili eksenel bakır demek. En eski adlarda son parça harf değil sayıdır ve koaks parçasının azami uzunluğunu yüz metre cinsinden verir.
Kodu bir kez öğrenince aile tek bakışta okunuyor:
| ad | hız | ortam | azami mesafe |
|---|---|---|---|
| 10BASE5 | 10 Mbit/s | kalın koaksiyel | 500 m |
| 10BASE2 | 10 Mbit/s | ince koaksiyel | 185 m |
| 10BASE-T | 10 Mbit/s | twisted pair, iki çift | 100 m |
| 100BASE-TX | 100 Mbit/s | twisted pair, iki çift | 100 m |
| 100BASE-FX | 100 Mbit/s | çok modlu fiber | 2 km |
| 1000BASE-T | 1 Gbit/s | twisted pair, dört çift | 100 m |
| 1000BASE-SX | 1 Gbit/s | çok modlu fiber | 550 m |
| 1000BASE-LX | 1 Gbit/s | tek modlu fiber | 5 km |
| 10GBASE-T | 10 Gbit/s | twisted pair, dört çift | 100 m |
| 10GBASE-SR | 10 Gbit/s | çok modlu fiber | 400 m |
| 10GBASE-LR | 10 Gbit/s | tek modlu fiber | 10 km |
Tabloda bakırın sınırı gözle görünüyor. Hız 10 megabitten 10 gigabite, yani bin katına çıkarken twisted pair’in mesafesi hiç değişmiyor: yüz metre. Fiber tarafında ise aynı hız artışı mesafeyi kilometrelerde tutuyor. Bakırda kazanılan her hız, mesafeden değil kablo kalitesinden ödeniyor.
Kategori bir bant genişliği vaadidir
Merdivenin ilk basamakları bugün müzelik: Cat1 ile Cat2 kablolama standardına hiç alınmadı. Cat3 100 ohm’luk UTP’yi 16 MHz’e kadar tanımlar ve 10BASE-T’yi taşır. Cat4 20 MHz’te kaldı. Cat5e 2000 yılında geldi. 1000BASE-T’yi desteklemek için NEXT, ELFEXT ve geri dönüş kaybı sınırlarını sıkılaştırdı. Cat5 yeni kurulumlar için artık önerilmiyor.
Cat6 bir tahmin denemesiydi. 200 MHz’e kadar sinyalleşmeyi geleceğe hazır olsun diye hedefledi. Ama hızlar beklenenden çabuk arttı ve Cat6A ile üstü gerekti. Merdiven bant genişliğiyle yazılır. Cat5e 100 MHz, Cat6 250 MHz, Cat6A 500 MHz, Cat7 600 MHz, Cat7A 1.000 MHz. Cat6A, Cat5e’nin tam beş katı bant demektir.
İki kurum aynı merdivene iki ayrı ad veriyor. TIA bileşene ve kabloya kategori der, ISO kurulmuş kanala ve bağlantıya sınıf der. 500 MHz’lik Cat6A, ISO tarafında Class EA olarak yazılır. Cat7 ile Cat7A yalnız ISO tarafında tanımlıdır ve kablo tipi zorunlu olarak S/FTP’dir. Üst basamak Cat8. TIA ve ISO komiteleri onu 40GBASE-T’yi dört çift bakır üzerinden taşımak için tanımladı. 25GBASE-T’yi de destekliyor.
Structured cabling’in (yapısal kablolamanın) 90 metrelik temel bağlantısı ve 100 metrelik kanalı ölçülüydü. Kategori tam o mesafede anlamını buluyor. 10GBASE-T o kanalı dört çift Cat6A ile ister.
Kategori kabloyla bitmez. Cat5e kanal kurmak istiyorsan jak, panel ve yama kablosu da aynı kategoriye derecelendirilmiş olmalı. Sıradan telefon tipi bir RJ-45 jak bu şartı karşılamaz. Yatay kablo tavan ve duvarların içinden geçtiği için değiştirilmesi omurga kablosundan çok daha pahalıdır. Standart bu yüzden yatay katmanda en iyi malzemeyi önerir.
Koaksiyel neden kaybetti?
Koaksiyel kablonun dış çapı 1-2,5 cm arasındadır. İçteki tek iletken, onu saran boş silindirik dış iletkenle eş eksenlidir. Aradaki dielektrik bu geometriyi kablo boyunca sabit tutar.

Karakteristik empedans uygulamaya göre sabitlenir. Video ve CATV’de 75 ohm, radyo yayınında 50 ohm, yerel ağ ile veri iletişiminde 50-105 ohm. Empedansın kablo boyunca düzensizleşmesi doğrudan zayıflamaya yol açar.
Kablonun üstündeki RG kodu Radio Guide’ın kısaltmasıdır. RG-8 50 ohm’luk kalın Ethernet kablosu, RG-6 75 ohm’luk TV anten kablosu, RG-58 ise 50 ohm’luk ince Ethernet kablosudur. İnce koaksiyelin çapı yaklaşık 0,64 cm, kalının yaklaşık 1 cm. Bu fark inceyi esnek ve kurulabilir, kalını sert ve pahalı yapar. Buna karşılık kalın koaksiyel ince olanın yaklaşık 2,7 katı menzil veriyordu.
Hattın iki ucuna takılan 50 ohm’luk sonlandırıcıyı ve her istasyona geçirilen T konnektörü daha önce görmüştün. Bu ailenin adı BNC. İçine iki parça daha girer: kablonun ucuna takılan konnektörün kendisi ve iki kabloyu birbirine ekleyen barrel konnektör. Böyle bir hattı ölçmek şaşırtıcı derecede kolaydır. T konnektörden ohmmetreyle bakarsan 25 ohm okursun. Uzun kabloda bu 25 ile 30 arasıdır. 0 ohm kısa devre, sonsuz ohm ise kopukluk ya da bozuk bir sonlandırıcı demektir.
Koaksiyelin bant genişliği twisted pair’den fazladır; diyafonisi de zayıflaması da daha azdır. Noktadan noktaya bakınca fark sayıya dökülüyor. Koaksiyel 0-500 MHz bandında çalışır. 10 MHz’te km başına 7 dB kaybeder ve tekrarlayıcıyı 1-9 km’de bir ister. Twisted pair sayısal iletimde 2-3 km’de bir tekrarlayıcı, analog taşımada 5-6 km’de bir yükselteç ister. Fiberde aynı aralık 40 km’ye çıkar. Yine de kaybetti. Onu piyasadan silen şey kablonun kendisi değil, yalnızca veri yolu topolojisinde kullanılması ve montajının zahmetli olmasıydı.
Kısa bakır bağlantı fikri yine de yaşadı. Twinaxial kablo koaksiyele benzer ama içte iki iletken taşır. Yüksek hızlı sinyali 15 metreye kadar götürür. 10GBASE-CX4 bunun üstüne kuruldu ve standarda 2004’te, 802.3ak ekiyle girdi. Daha eskisi 1000BaseCX. 150 ohm’luk twinaxial kabloyla yalnızca 25 metreye kadar gidiyordu, IEEE 802.3z altında tanımlıydı. Twisted pair ise bugün 100 metrede 10 Gbit/s taşıyabiliyor. Ucuz aile, pahalı ailenin işini devraldı.
Özet
Peki, ne öğrendik?
- Büküm bir geometri numarasıdır: iki telin dik durduğunda diyafoniyi en aza indiren açısını kablo boyunca taklit eder; paralel kalması şart olan iletken koaksiyele gider.
- Ekran süreklilik ister: ağ kartından anahtara kadar kesintisiz topraklanmayan folyo ya da örgü, kalkan olmaktan çıkıp çevredeki sinyalleri toplayan bir antene döner.
- Kategori bir bant genişliği vaadidir: Cat5e’nin 100 MHz’inden Cat7A’nın 1.000 MHz’ine uzanan merdiven TIA’da kategoriyle, ISO’da sınıfla yazılır.
- Kategori kanalın tamamına aittir: jak, panel ve yama kablosu aynı dereceye çıkmadıysa kablonun üstündeki kategori tek başına bir şey ifade etmez.
- Koaksiyel teknik olarak kaybetmedi: daha geniş bantlı ve diyafoniye daha dirençli kabloyu piyasadan silen şey veri yolu topolojisi ve montaj zahmetiydi.
Aileyi artık kendin seçebilirsin. Ama seçmekle yapmak arasında bir adım var: o kablonun ucuna konnektörü takıp gerçekten kendin bitirebilir misin?
Bölüm 51: Kablo Sonlandırma
Ailesini seçtiğin kablodan bir makara aldın. Yanında bir avuç konnektör ve bir pense duruyor.
İşin tamamı sekiz teli doğru sıraya dizmek, sonra o sırayı bozmadan sıkmak. Bükümü nerede açacağın da bu işin içinde. Peki o sıra neye göre kuruldu?
Kablonun marjı nerede kazanılır?
Kablo ailelerini, ekranlama seçeneklerini ve bükümün taklit ettiği geometriyi ayırmıştın; komşu çiftlerin birbirine sızmasına diyafoni deniyordu. Elindeki makara o ailelerden biri ve iki ucu da hâlâ açık. Kılıfı soyduğunda sekiz tel görürsün. Bu sekiz tel dört çift hâlinde birbirine bükülmüştür. Çiftlerin ana renkleri turuncu, mavi, yeşil ve kahverengidir. Her çiftin ikinci teli aynı renkte çizgili beyazdır, yani renk kodu çifti gözle okunur kılar.

Bükümün ne işe yaradığını biliyorsun, ama o kadarı fabrikanın işi. Seninki bükümün bittiği yerde başlıyor.
Diyafoni en çok verici ucunda görülür, çünkü sinyal orada en güçlüdür. Adı yakın uç diyafonisi. Konnektördeki metal pinler de kablonun telleri kadar bu sızmaya açıktır. Zayıflama uzunlukla büyüyor, yakın uç diyafonisi ise büyümüyor; çünkü diyafoni bir uç olayı. Bu yüzden masanın altındaki yarım metrelik kötü bir sonlandırma bütün hattı aşağı çekebilir.
Kategori sayısı sana bir hız söylemiyor; kablonun hangi frekansa kadar temiz kaldığını söylüyor. Bant genişliği ile gürültü arasında bir sınır vardı ve kategori sayısı o sınırın kablo tarafındaki karşılığı.
| kategori | bant | ekleme kaybı | yakın uç diyafonisi | ACR |
|---|---|---|---|---|
| 5e | 100 MHz | 24 dB | 30,1 dB | 6,1 dB |
| 6 | 250 MHz | 21,3 dB | 39,9 dB | 18,6 dB |
| 6A | 500 MHz | 20,9 dB | 39,9 dB | 19 dB |
Tablodaki haber ikinci sütunda değil. Üç kategori arasında ekleme kaybı neredeyse aynı; ayrışma yakın uç diyafonisinde oluyor. İkisinin arasındaki fark kablonun gerçek marjıdır ve adı zayıflama-diyafoni oranıdır. Bu fark pozitif kalmak zorundadır. Negatife düştüğü frekansta gürültü sinyali geçer, kablonun kullanılabilir bant sınırı da tam orasıdır.

Sekiz telin sırası nereden geliyor?
Standart iki dizilim tanımlar: tercih edilen T568A ve isteğe bağlı T568B. Sahada isteğe bağlı olan daha yaygın kullanılır. İkisi arasında elektriksel bir üstünlük yoktur ve aynı hızda çalışırlar; fark teknik değil, kurumsal bir sözleşmedir.
Sahada ezberlenen sıra şudur: turuncu-beyaz, turuncu, yeşil-beyaz, mavi, mavi-beyaz, yeşil, kahverengi-beyaz, kahverengi. Bu T568B’dir. Ezberlenen şey renk dizisi değil, çift bütünlüğüdür.
İki şema arasındaki fark sekiz pozisyondan yalnızca dördündedir. 1 ile 3 yer değiştirir, 2 ile 6 yer değiştirir. Mavi çift ve kahverengi çift ikisinde de aynı yerde durur. Pin numaraları konnektörü tutuş biçimine bağlıdır: kontaklar sana bakacak şekilde tuttuğunda soldan sağa 1’den 8’e sayarsın. Sırada tuhaf duran tek şey yeşil çifttir; bir teli 3 numaralı pine girer, ikincisi 4 ile 5’i atlayıp 6’ya gider.
Ortadaki iki pin neden atlanıyor? Sebebi ağ değil telefon. İki şemada da 4 ve 5 birinci çifte, yani maviye ayrılmıştır; analog ses devresi tam oraya bağlanır. 10BASE-T’nin 1, 2, 3 ve 6 pinlerini seçmesi keyfî bir tercih değildi. Aynı kablo üzerinden telefon hizmeti de yürüsün diye orta iki pin boş bırakıldı.
İki dizilim yan yana konunca fark da atlama da tek bakışta görünüyor:
| pin | T568A rengi | T568B rengi | çift | 10/100’de işlevi |
|---|---|---|---|---|
| 1 | yeşil-beyaz | turuncu-beyaz | 3 / 2 | gönderme + |
| 2 | yeşil | turuncu | 3 / 2 | gönderme − |
| 3 | turuncu-beyaz | yeşil-beyaz | 2 / 3 | alma + |
| 4 | mavi | mavi | 1 | kullanılmaz (analog ses) |
| 5 | mavi-beyaz | mavi-beyaz | 1 | kullanılmaz (analog ses) |
| 6 | turuncu | yeşil | 2 / 3 | alma − |
| 7 | kahverengi-beyaz | kahverengi-beyaz | 4 | kullanılmaz |
| 8 | kahverengi | kahverengi | 4 | kullanılmaz |
Dördüncü sütun asıl anlatandır. Bir çiftin iki teli her zaman aynı sayıyı taşır ve bükümü ancak öyle işe yarar. Üç çift yan yana iki pine oturuyor; ikinci ya da üçüncü çift ise ortadaki mavi çiftin üstünden atlayarak 3 ile 6’ya düşüyor. Aradaki iki pin başka bir çifte ait olduğu için o atlama zorunlu.
Son sütun 10BASE-T ve 100BASE-TX içindir. 1000BASE-T’de “kullanılmaz” diye bir şey kalmaz: dört çiftin dördü de aynı anda hem gönderir hem alır, her biri saniyede 250 megabit taşır. Sekiz telin dördünü çakmadan geçen ev yapımı kablonun 100’de çalışıp 1000’de düşmesinin sebebi tam olarak budur.
Düz kablonun kuralı tek cümledir: iki uç aynı şemadadır. Çapraz kabloda bir uç A, öbür uç B’dir. 1 ile 3, 2 ile 6 yer değiştirir; gönderme çifti karşıdaki alma pinlerine düşer. Ters kablo ise veri için değil konsol portu için yapılır. Bir uçtaki sıra 1-8 ise öteki uçta 8-1’dir.
Çapraz kabloyu bugün sahada zor bulursun. Otomatik MDI/MDI-X 1998’de geliştirildi ve 1000BASE-T ile yaygınlaştı. Arayüz, sinyalleri iç kapılar arasında taşır ve yaklaşık 60 ms bekleyip karşıdan bir bağlantı darbesi arar. Bekleme rastgele başlatılır. Yoksa iki uç aynı anda takla atar, hiç anlaşamazlar.
Milimetreler kabloyu düşürür
Sonlandırma sırasında büküm en fazla 13 mm geriye kadar açılabilir. Bu bölümün en somut el kuralı budur. Ders notlarında açıkta kalan tel boyu için 1,7 cm yazar. Bu, standarttan 4 mm daha gevşektir ve ev yapımı kablonun testte düşmesinin bir sebebidir.
Soyma işleminde yalnızca dış kılıf kesilir. Bıçak içerideki tellerin yalıtımına değdiyse kablo görünürde sağlamdır ama testte düşer. Telleri düzeltir, renk sırasına dizer ve yaklaşık 12 mm boyunda düz bir hizada kesersin. Sekiz telin aynı boyda olması hepsinin konnektörün dibine aynı anda dayanmasını sağlar.
İşin aleti tek bir pensedir. Aynı pensenin çoğu zaman bir de RJ-11 yuvası bulunur; yanlış yuvaya sıkarsan konnektör ezilir ve çöpe gider. Sıkmadan önce iki şeyi gözle doğrularsın: sekiz telin de en dibe dayandığını ve dış kılıfın konnektörün içine girdiğini. Konnektörün ön yüzünden sekiz bakır ucu sayabilmelisin. Sıkmanın yaptığı iş tamamen mekaniktir. Konnektörün bıçaklı pinleri yalıtımı delip bakıra gömülür, arkadaki plastik de dış kılıfı sıkıştırır. Bu ikinci sıkıştırmanın adı gerilim boşaltmadır ve kabloyu çekiştiren eli kontaklardan uzak tutar.
Duvar prizinde ve patch panelinde pense hiç işe yaramaz. Orada tel soyulmadan yalıtım delen kontağa bastırılır ve punch-down aleti aynı harekette fazlalığı keser. Patch kablo çok damarlı telden, yatay kablo tek damarlıdan yapılır. Tek damarlı teli patch kablo olarak kullanırsan bükülen uç konnektörün dibinde çatlar. Arıza kesikli olduğu için haftalarca bulunamaz.
Aynı iş camda nasıl yapılıyor?
Bakırda sekiz teli sıraya dizip sıkıyordun. Camda sıraya dizilecek tel yok; hizalanacak tek bir eksen var, ve o eksenin çapı tek modlu fiberde 9 mikron. İki core’u (nüveyi) bir mikronluk kaçıklıkla buluşturmak gerekiyor. Pense bu işi yapamaz — tolerans mekanik değil optik.
Onun yerine üç adım var: soy, kır, birleştir.
Soymak. Önce dış kılıf ve aramid, sonra 900 mikronluk tampon, en son 250 mikronluk birincil kaplama alınır. Geriye 125 mikronluk çıplak cam kalır. Kaplama alındıktan sonra cam yalnızca alkolle silinir; parmakla tutulmaz, çünkü ciltteki yağ hem ölçüme hem eke girer.
Kırmak. Fiber makasla kesilmez, kırılır. Kesici camın yüzeyinde kontrollü bir çizik açar, sonra lif gerilerek çizikten koparılır. Amaç eksene tam dik, aynasal bir yüzey elde etmek. Burası bölümün ikinci somut sayısıdır: kırım açısı 0,5 dereceyi geçmemeli. İyi bakılmış bir kırıcı zaten bu değeri verir; 1 derece kabul edilebilir sınırdır, 2 derecenin üstü kayıp demektir. Kaynaştırma cihazı yüzeyi kamerayla ölçer ve açı eşiği aşarsa işi başlatmadan reddeder.
Neden bu kadar hassas? Bakırda iki telin uçları eğri kesilse de bakır bakıra değdiği anda akım geçer. Camda iş öyle yürümüyor: iki yüzey arasında kalan mikron ölçekli hava boşluğu ışığın iki kez kırılması demek, ve her kırılma sinyalin bir kısmını core’un dışına atıyor. Işığın camda hangi dar açı bandına mahkûm olduğunu bir sonraki bölümde hesaplayacağız; şimdilik şu kadarı yeter — o bant, eksenden yedi dereceden dar.
Birleştirmek. İki yol var ve aralarındaki fark bir kalite kararıdır.
| yöntem | tipik kayıp | yansıma | ne zaman |
|---|---|---|---|
| kaynaştırma (fusion) | 0,02-0,05 dB | çok düşük | kalıcı hat, omurga, uzun mesafe |
| mekanik ek | 0,2-0,5 dB | daha yüksek | onarım, geçici hat, acil müdahale |
Kaynaştırma iki cam ucu elektrik arkıyla eritip birbirine kaynatır. Cihaz önce iki core’u kamerayla görüp hizalar, sonra arkı basar ve ek noktasını ısıyla büzüşen bir kılıfla korur. TIA-568 tek bir ek için üst sınırı 0,3 dB koyar; modern bir cihaz bunun altıda birini verir. Mekanik ek ise iki ucu bir kılavuzun içinde karşı karşıya getirip aradaki boşluğu, camla aynı kırılma indisine sahip bir jelle doldurur. Jel hava boşluğunu optik olarak yok eder. Daha hızlı, alet gerektirmez, ama kaybı bir kat büyüktür ve zamanla bozulur.
Sahada en yaygın uygulama ikisinin ortasıdır: konnektörü fabrikada takılmış kısa bir pigtail alınır ve onun çıplak ucu hattın ucuna kaynaştırılır. Böylece kritik yüzey — konnektörün cilalanmış alnı — fabrika koşullarında üretilmiş olur; sahada yapılan iş yalnızca bir ektir.
Konnektörün alnındaki sekiz derece
Konnektörün ucunda seramik bir kılavuz halka, yani ferrül vardır; çapı SC’de 2,5, LC’de 1,25 mm. Fiber bu halkanın tam ortasından geçer ve alnı cilalanır. Cilanın geometrisi, geri yansıyan ışığın ne kadarının kaynağa döndüğünü belirler.
| cila | alın açısı | geri dönüş kaybı | renk |
|---|---|---|---|
| PC | 0° (küresel) | −30 … −35 dB | — |
| UPC | 0° (ince cila) | −50 … −55 dB | mavi |
| APC | 8° | −60 dB ve daha iyi | yeşil |
APC’nin sekiz derecelik eğik alnı bir hile. Düz bir alından geri yansıyan ışık geldiği yolu izleyip core’a, oradan da lazere döner. Alnı eğdiğinde yansıyan ışın o dar açı bandının dışına düşüyor, core’da tutunamıyor ve kabukta kayboluyor — bir sonraki bölümde kuracağımız şart burada kasten bozuluyor. Geri dönen ışığın lazerin çıkışını bozması bu yüzden ortadan kalkıyor. Analog video taşıyan kablo TV hatlarında ve PON şebekelerinde yeşil konnektör görmenin sebebi budur.
Yeşille maviyi birleştirme. APC ile UPC birbirine takılırsa eğik alın düz alna nokta temasla basar. Sonuç yüksek kayıp ve iki ferrülün de kalıcı hasarıdır. Renk kodu bir süs değil, bir kilit.
Son adım temizliktir ve fiberde arızaların çoğunun sebebi tam olarak budur. Tek bir toz zerresi 9 mikronluk core’un önemli bir kısmını kapatabilir. Ferrül tüy bırakmayan bir bezle ve izopropil alkolle silinir, sonra 200-400 kat büyüten bir muayene mikroskobuyla gözle denetlenir. Sahada üç kelimelik kural şudur: denetle, temizle, yeniden denetle.
Kablo çalışıyor mu, yoksa yalnızca iletiyor mu?
Test cihazının verdiği ilk çıktı tel haritasıdır ve hangi telin hangi pine gittiğini gösterir. Basit bir cihazda her tel için bir LED bulunur. Sekiz LED’in sırayla yanması doğru dizilimi, sıranın bozulması yanlış sonlandırmayı işaret eder.
Süreklilik tek başına yalancı bir ölçüttür. Eski USOC dizilimi her pini karşı pine bağlar, yani testten geçer ama çiftleri yanlış eşler. 1 ile 2 bir çift, 3 ile 6 başka bir çift olmak zorundadır. Bu eşleşme bozulunca bağlantı yine kurulur, hata oranı yükselir. Bunun adı bölünmüş çifttir ve ancak tel haritasıyla yakalanır. Kategori uygunluğunu doğrulamak da tek bir ölçüm değildir. Farklı frekanslarda toplam zayıflama ve yakın uç diyafonisi ayrı ayrı ölçülür. İyi bir cihaz uzunluğu da ölçer ve 100 m sınırını doğrular.
Fiberde tel haritasının karşılığı yok; ölçülen şey ışığın kendisi. İki ayrı alet iki ayrı soruyu cevaplıyor. Işık kaynağı ve güç ölçer ikilisi bağın iki ucuna konur ve tek bir sayı verir: uçtan uca toplam ekleme kaybı, dB cinsinden. Bu kabul ölçümüdür — bağ bütçeye sığıyor mu, sığmıyor mu. OTDR ise tek uçtan çalışır, hatta bir darbe gönderip süreksizliklerden geri saçılan ışığı zamanla kaydeder. Çıktısı bir sayı değil bir profil: kaybın nerede olduğunu metre cinsinden gösterir, bir ekte mi bir konnektörde mi aşırı sıkı bir kıvrımda mı olduğunu ayırır. Biri “geçti mi?” diye sorar, öteki “nerede takıldı?” diye.
Yüz metre tek bir kablonun boyu değildir. Structured cabling’in (yapısal kablolamanın) yatay dağıtımı tanıdık; kanal denen bütün, 90 metrelik kalıcı hat ile 10 metrelik patch payının toplamıdır. O pay dolapta 6 metreyi, çalışma alanında 3 metreyi aşamaz. Bakırın büyük kısmı duvarın ve tavanın içinde kalır, iki ucundaki jaklar ise elinin altındadır. Arıza aramaya bu yüzden uçlardan başlarsın.
Sekiz telden dördü klasik Ethernet’te veri taşır. Bitleri taşıyan teller bunlar. 1000BASE-T ise dördünü birden kullanır. Gigabit’e geçiş kabloyu değiştirmedi, kablonun kullanılan yarısını iki katına çıkardı; hız kuşak kuşak arttı, bakırın verdiği mesafe hiç oynamadı. Kullanılmayan dört teli kesip atmak bu yüzden yasaktır. Üstelik o teller 10 ve 100 Mbit/s Ethernet’te de boş sayılmaz; Power over Ethernet onların ikinci işidir.
DerinleşmeAnahtar kabloya neden hemen gerilim vermiyor?
Bir Ethernet portundan güç vermek kulağa basit geliyor. Sorun karşı uçta ne olduğunu bilmemek. Aynı prize takılan bir telefon santrali ya da besleme beklemeyen eski bir kart, gerilimi gördüğü anda zarar görebilir.
Bu yüzden anahtar önce sormak zorunda. Küçük bir gerilim uygular ve karşı uçta 25.000 ohm’luk bir imza direnci arar. Direnç yoksa hat sade bir veri hattı olarak kalır.
Gücün hangi tellerden geleceği de tek bir cevaba bağlanmadı. A seçeneği gücü veri çiftlerine, yani 1-2 ile 3-6’ya, trafonun orta ucundan bindirir. B seçeneği yedek çiftleri, yani 4-5 ile 7-8’i kullanır. Beslenen cihaz hangisinin geldiğini bilemez ve ikisini de kabul etmek zorundadır.
Bedeli ısıyla ödenir. Tip 1 kaynakta 15,4 W verir, cihazda 12,95 W bırakır. Aradaki 2,45 W tam olarak kablonun ısıya çevirdiği güçtür: 350 mA akım 20 ohm’luk çevrim direncinden geçince kare çarpı direnç hesabı bu sayıyı verir. Tip 2 aynı hesabı daha yüksek gerilim ve 600 mA ile yapar, 34,20 W’a çıkar.
Buradan iki sonuç çıkıyor. Kategori 6 ve 6A’da bakır daha kalın olduğu için doğru akım direnci ve ısınma daha azdır; yüksek güçlü beslemede kategori seçimi bir hız kararı değil ısı kararıdır. İkincisi dolabın içinde durur. Yirmi dört portun her biri 15,4 W beslerse anahtar kendi elektroniğinin dışında yaklaşık 370 W ister; bedel kabloda değil güç kaynağındadır.
IEEE 802.3bt 2018’de beslemeyi dört çiftin tamamına yaydı ve Tip 3 ile Tip 4 sınıflarını tanımladı. Genellenebilir ders şu: bir hattın ikinci işi, birinci işinin bütçesini yeniden yazar.
Özet
Peki, ne öğrendik?
- Kategori bir hız değil frekans sözüdür: merdivenin her basamağı kabloya daha geniş bir bant tanımlar, hıza dönüşmesi o bandın gürültüyle olan farkına bağlıdır.
- Marj diyafonide ölçülür: kategoriler arasındaki fark ekleme kaybında değil yakın uç diyafonisinde ve zayıflama-diyafoni oranında görünür, çünkü diyafoni bir uç olayıdır.
- Sekiz telin sırası telefondan miras kaldı: 4 ve 5 numaralı pinler mavi çifte ayrıldığı için 10BASE-T verisi 1, 2, 3 ve 6 numaralı pinlere yerleşti.
- Sonlandırma milimetrelerle ölçülür: büküm en fazla 13 mm geri açılır, teller 12 mm boyunda düz kesilir ve dış kılıf konnektörün içinde kalır.
- Camda tolerans mekanik değil optiktir: fiber kesilmez kırılır, kırım açısı 0,5 dereceyi geçmemelidir, ve iki ucu birleştirmenin iki yolu bir kalite kararıdır — kaynaştırma 0,02-0,05 dB, mekanik ek 0,2-0,5 dB.
- Süreklilik testi yetmez: bölünmüş çift ancak tel haritasıyla görünür, kategori uygunluğu ise farklı frekanslarda ayrı ayrı ölçülür; fiberde aynı ayrım güç ölçer ile OTDR arasındadır.
Kabloyu artık kendin yapabilirsin — bakırda da camda da. Ama camda yaptığın her hareketin gerekçesi tek bir cümleye dayanıyordu ve o cümleyi henüz kanıtlamadım: ışık ancak çok dar bir açı bandında core’da kalıyor. Peki onu orada tutan tam olarak ne?
Bölüm 52: Fiber Optik İletim
Bakırı ucuna kadar zorladın, sonra camı da elinle sonlandırdın: kırım açısını yarım dereceye tuttun, iki core’u mikron mertebesinde hizaladın, konnektörün alnını sekiz derece eğdin. Her hareketin bir gerekçesi vardı ve hepsi tek bir cümleye dayanıyordu.
Şimdi o cümleyi kanıtlama sırası. İsteğinin bitleri cam bir lifin içinde ilerleyen darbeler. Onları o camın içinde ne tutuyor, ve neden bu kadar dar bir paya sığıyorlar?
Işığı camda tutan şey ceket değil
Fiberi üç iç içe katman olarak düşünebilirsin. En içte ışığın ilerlediği saf cam core var. Onu saran katman kabuk (cladding), en dışta da ceket duruyor. Ceketin optikle bir ilgisi yok; onu camı ezilmeye, neme ve çekmeye karşı korusun diye sarıyorlar.
Işığı içeride tutan şey core ile kabuk arasındaki kırılma indisi farkıdır. Kırılma indisini tek satırda tanımlayabilirsin: ışığın vakumdaki hızının, o maddenin içindeki hızına oranı. Vakumda indis 1 oluyor ve ışık 300.000 km/s gidiyor. Tipik bir fiberde core’un indisi 1,47 ve ışığın hızı 204.082 km/s; kabukta indis 1,46 ve hız 205.479 km/s.
Aradaki fark küçük görünüyor ama sonucunu hiç küçümseme.
Kritik açı bir tanım değil, bir hesap sonucudur
Işık yoğun bir ortamdan daha seyreğine geçerken kırılıyor ve doğrultusundan sapıyor. Geliş açısını yatıklaştırdıkça sapma büyüyor; bir noktada ışık karşı tarafa hiç geçemiyor ve tamamı geri yansıyor. Bu eşiğe kritik açı deniyor ve tek bir şeye bağlı: iki ortamın yoğunluk farkına.
Açıları burada yüzeyin kendisinden değil, yüzeye dik olan doğrudan, yani normalden ölçüyoruz. Bunu aklında tut: “90 dereceye yakın açı” dediğimizde ışının yüzeye neredeyse paralel yattığını kastediyoruz.
Şimdi iki ayrı sayı çıkacak ve ikisinin farkı bu bölümün en önemli sezgisidir.
Cam ile hava arasında. Fizik dersinde öğretilen klasik hesap budur ve sonuç yaklaşık 42 derece. Bir cam blokta ışığın dışarı kaçmaması için sınıra normalden 42 dereceden daha yatık çarpması yeter. Geniş bir tolerans; ışığı cama sokmak neredeyse kendiliğinden oluyor.
Core ile kabuk arasında. Fiberin içinde karşındaki seyrek ortam hava değil, kabuk. Ve kabuk neredeyse core kadar yoğun — indisler 1,47 ile 1,46, aralarında yüzde birlik bir fark bile yok. Sonuç: kritik açı 83,3 derece.
Aradaki uçurumu bir kusur değil, tasarımın kendisi olarak oku. Fiberde ışığın sınıra normalden 83 dereceden daha yatık çarpması gerekiyor; başka bir deyişle ışının fiberin ekseninden sapması 6,7 dereceyi geçemez. Cam blokta 48 derecelik bir sapma payın varken fiberde 7 derecen var.
Bu yüzden ışığı fibere gelişigüzel sokamıyorsun. Fiberin ucunda hava duruyor ve ışık önce o sınırdan giriyor; girerken kırılıyor, sonra içeride tam yansımaya yakalanmak zorunda kalıyor. Bu iki şartı birden sağlayan giriş açılarının kümesine kabul konisi denir.
Koninin ne kadar açık olduğunu veren büyüklüğün adı sayısal açıklık (numerical aperture, NA) ve core ile kabuğun indis farkından hesaplanıyor. Tipik bir tek modlu fiberde bu değer 0,17 civarında ve karşılığı şu: fiberin ucuna, eksenle en fazla 10 derecelik bir açı yapacak şekilde girebilirsin. Tam koni açısı yaklaşık 20 derece. Dışarıdan bakınca kolay görünüyor ama ışık huzmesini bu dar koniye oturtmak, iki fiberin eksenini mikron mertebesinde hizalaman anlamına geliyor. Konnektör ve ek işçiliğinin neden bu kadar belirleyici olduğunu bu bölümün sonunda tekrar göreceğiz; sebebi tam olarak bu 20 derecelik koni.
İki ışını yan yana koyduğunda fark tek bakışta görünüyor:
- Nüve ile kabuk arasındaki fark yüzde bir bile değil. Nüvenin kırılma indisi 1,47, kabuğunki 1,46. Aradaki oran 0,9932; yani kabuk nüveden yalnızca %0,68 daha seyrek. Işığı içeride tutan bütün mekanizma bu küçük farkın üstünde duruyor.
- Açı sınıra dik doğrultudan ölçülüyor. Optikte geliş açısı yüzeyden değil, yüzeye dik olan
normaldoğrultusundan ölçülür. Eksene paralel giden bir ışın normalle 90 derece yapar; dikleştikçe bu açı küçülür. - Yatık ışın nüvede kalıyor. Geliş açısı kritik açıdan büyükse (
sin θc = n₂/n₁→ 83,3°) kırılma çözümü yok: ışığın tamamı geri yansıyor. Işın sınıra çarpa çarpa nüve boyunca ilerliyor. - Dik ışın sınırı geçip kayboluyor. Açı 83,3 derecenin altına düştüğü anda ışın kabuğa geçiyor ve kaplama onu soğuruyor. Figürde açılar okunabilirlik için abartılı; gerçekte ışının eksenden sapması 6,7 dereceyi geçemez.
- Girişte kabul edilen koni dar. Fibere ancak eksenle 9,9 dereceden az açı yapan ışık girebiliyor; sayısal açıklık
NA = √(n₁²−n₂²) = 0,171bunu söylüyor. Konnektör ve ek işçiliğinin mikron mertebesinde olmasının sebebi bu 20 derecelik tam koni.
Derinleşme42 ile 83 dereceyi veren hesap
İki saydam ortamın sınırında ışığın ne yapacağını Snell yasası yazıyor:
n₁ · sin θ₁ = n₂ · sin θ₂Kırılan ışın 90 dereceye dayandığı anda — yani sınıra paralel yattığında — sin θ₂ = 1 oluyor ve denklem sadeleşiyor. Kritik açı buradan düşüyor:
sin θc = n₂ / n₁İki oranı koy. Cam-hava için 1 / 1,48 = 0,676, karşılığı 42,5 derece. Core-kabuk için 1,46 / 1,47 = 0,9932, karşılığı 83,3 derece. Oran bire ne kadar yaklaşırsa açı 90 dereceye o kadar yaklaşıyor; kabuğun core’a yakın yoğunlukta olması bu yüzden payı daraltıyor.
Kabul konisinin yarı açısı da aynı yasanın iki kez uygulanmasıyla çıkıyor:
NA = √(n₁² − n₂²) → √(1,47² − 1,46²) = 0,171
θmax = arcsin(NA) → yaklaşık 9,9 dereceSayısal açıklık bir ödünleşim düğmesi. Büyütürsen ışığı fibere sokmak kolaylaşıyor ama içeri daha çok mod giriyor ve darbe daha çok yayılıyor. Çok modlu fiberin değeri bu yüzden 0,20 civarındayken tek modlu fiberde 0,12’ye kadar iniyor: kabul konisi daraldıkça taşınan sinyal temizleniyor.
DerinleşmeTam yansıma gerçekten "tam" mı, yoksa sınırın ötesine bir şey sızıyor mu?
Adı tam yansıma ama ışığın kabuğa hiç girmediğini söylemek doğru olmaz. Sınırın hemen ötesinde, kabuğun içine doğru sönümlenen bir alan doğar; adı sönümlü dalga (evanescent wave). Genliği mesafeyle üstel olarak düşer ve tipik nüfuz derinliği dalga boyunun kesriyle, yani birkaç yüz nanometreyle ölçülür. Net enerji taşımaz: giren güç aynı çevrimde geri döner, bu yüzden yansıma enerji bakımından gerçekten tamdır.
Ama bu sızıntının iki somut sonucu var.
Birincisi kabuğun neden var olduğunu açıklıyor. Core’u çıplak bırakıp havayla çevirseydin kritik açı 42 dereceye düşer, kabul konisi genişler ve fiber kâğıt üstünde daha kolay çalışırdı. Uygulamada olmaz: sönümlü dalga core’un yüzeyindeki her tozu, her parmak izini, her su damlasını “görür” ve o kirlilik doğrudan kayba yazılır. Kabuk, sönümlü alanın sönmesi için ayrılmış 58 mikronluk temiz bir tampondur. Core 9 mikronken kabuğun 125 mikron olmasının sebebi mekanik değil optiktir.
İkincisi bir dinleme yöntemi. Fiberi yeterince keskin bir yayla bükersen tam yansımanın şartı yerel olarak bozulur ve ışığın bir kısmı kabuğa, oradan da dışarı kaçar. Piyasada kıvrım bağlaştırıcı (clip-on coupler) diye satılan alet tam olarak bunu yapar: kabloyu kesmeden, birkaç dB kayıp pahasına trafiğin bir kopyasını dışarı alır. Fiberin “dinlenemez” olduğu inancı bu yüzden yanlıştır. tehdit modeli burada da geçerli: hattın fiziği değil, üstünden geçen şifreleme koruyor.

Hat kodlamayı, bant genişliğinin fiziksel sınırını ve LED’in 600 MHz’lik tavanını biliyorsun; burada aynı işi lazer diyot yapıyor, çıkan şey elektrik değil ışık.
Elektrikten ışığa geçişi üç tip lazer diyot yapar: Fabry-Pérot, dağıtılmış geri beslemeli (DFB) ve dikey oyuklu yüzey yayıcılı (VCSEL). Karşı uçta ışığı elektriğe çeviren PIN ya da çığ foto diyot durur. İkincisi zayıf sinyali yaklaşık 100 kat kuvvetlendirir. Kaynağın cinsi hızın tavanını da koyar: çok modlu fiberde ışığı üreten parça çoğu zaman o LED’dir, VCSEL ise onun çok üstünde çalışır ve 10 Gbit/s’lik bağların kaynağıdır.
Core’un çapı sınıfı belirliyor
Tek modlu fiberde core 8-10 mikrondur ve ışık tek bir doğrultuda ilerler. Çok modlu fiberde core 50 ya da 62,5 mikrondur. Işık kabuğa çarpa çarpa gider ve yollar arasında uzunluk farkı doğar.
Kabuğun dış çapı iki sınıfta da 125 mikrondur. Künye bu yüzden iki sayıyla yazılır: 62,5/125 çok modlu, 10/125 tek modlu fiberi gösterir. İlk sayı core, ikinci sayı kabuk.
Bir mikron metrenin milyonda biridir. Bir saç teli yaklaşık 40 mikron gelir; 125 mikronluk kabuk onun üç katı, 9 mikronluk core ise dörtte biri kadardır.
Elindeki kabloyu soyduğunda karşına çıkacak katmanların çapları standarttır ve sırayı bilmek sonlandırmanın yarısıdır:
| katman | çap | işi |
|---|---|---|
| core | 9 / 50 / 62,5 µm | ışığın ilerlediği cam |
| kabuk | 125 µm | tam yansımayı kuran ve sönümlü dalgayı sönümleyen cam |
| birincil kaplama | 250 µm | akrilat; camın yüzeyindeki çatlakların büyümesini durdurur |
| sıkı tampon | 900 µm | elle çalışılabilir kalınlık, renk kodu bu katmandadır |
| mukavemet elemanı | — | aramid iplik; çekme kuvvetini cam yerine kendi taşır |
| dış kılıf | 2-3 mm | mekanik ve yangın sınıfı koruma |
İki ayrım burada saklı. Birincisi 250 mikronla 900 mikron arasında: gevşek tüplü kabloda 250 mikronluk lifler jel dolu bir tüpün içinde serbest yüzer, bu yüzden dış kabloda sıcaklıkla gerilen kılıf lifi germez — dış tesis kablosu böyle yapılır. Sıkı tamponlu kabloda ise 900 mikronluk kaplama doğrudan lifin üstündedir; bina içinde konnektör takmak kolaylaşır. İkincisi aramid ipliktedir: fiberi çekerken kuvvet asla cama değil o ipliğe uygulanır. Tek modlu bir lifin izin verilen çekme kuvveti kurulum sırasında yaklaşık 600 newton, kurulumdan sonra kalıcı olarak 60 newtondur.
Camın kırılganlığı konusunda yaygın bir yanlış anlama var. Silika lif, aynı kesitteki çelikten daha yüksek çekme dayanımı taşıyor; kabloyu bitiren şeyi çekmede değil bükülmede arayacaksın. Standart sınır iki sayıyla verilir: kurulum sırasında dış çapın 20 katı, kurulduktan sonra 10 katı. 3 mm’lik bir patch kablosu için bu, çekerken 60 mm, raftayken 30 mm yarıçap demek. Sınırın altına inersen iki şey birden oluyor: tam yansımanın şartı kıvrımın dış yanında bozulup ışık kabuğa kaçar (makro kıvrım kaybı), ve camın yüzeyindeki mikro çatlaklar gerilme altında büyümeye başlar. Birincisi bugün fark edilir, ikincisi aylar sonra. Dolabın içinde kabloyu keskin bir köşeden döndürmenin bedeli budur.
Üçüncü bir türle daha karşılaşacaksın: gradyan indisli çok modlu fiber. Burada core’un indisini merkeze doğru artırıyorlar. Eksende ilerleyen ışın yavaşlar, kenardan dolaşan ışın uzun yolu daha hızlı alır ve ikisi alıcıya yaklaşık aynı anda varır.
Sınıfları karıştırmanın da somut bir bedeli var: lazer ışığını çok modlu core’un tam merkezine verirsen huzme bölünebiliyor. Çözüm, ışığı kasten eksenden kaydırarak veren mod şartlandırma patch kablosudur.
Twisted pair’in sekiz telini T568B sırasına göre kendin diziyordun; fiberde dizilecek tel yok, tutturulacak bir eksen var.
Dispersiyon mesafeyi değil, çarpımı sınırlıyor
Aynı anda yola çıkan ışık, farklı yolları izlediği için uzak uca zaman farkıyla varır. Darbe zamanda yayılır ve komşusuna karışmaya başlar. Buna modal dispersiyon denir.
Dispersiyon sabit bir kusur değildir, birikimlidir. Verilen bir işaretleşme hızında mesafe uzadıkça yayılma büyür. Bu yüzden çok modlu fiberin ölçüsü bant genişliği değil, bant genişliği ile mesafenin çarpımıdır. Birim de bunu söyler: MHz·km.
200 MHz·km’lik bir fiber 1 km’de 200 MHz, 2 km’de 100 MHz taşır. Mesafeyi ikiye katlamanın bedeli hızın yarıya inmesidir.
ISO/IEC 11801’in OM sınıfları bu çarpımla tanımlıdır ve aradaki kuşak farkı tek bakışta okunur.
| sınıf | 850 nm | 1.300 nm |
|---|---|---|
| OM1 | 200 MHz·km | 500 MHz·km |
| OM2 | 500 MHz·km | 500 MHz·km |
| OM3 | 1.500 MHz·km | 500 MHz·km |
| OM4 | 3.500 MHz·km | 500 MHz·km |
Dört sınıfın da 1.300 nm değeri 500 MHz·km’de kalır. Kuşak farkı dalga boyunda değil, camın kendisindedir. Bu sayı sahada ölçülmez; üreticinin veri sayfasından okunur. Sahada ölçebildiğin şey uzunluk ve optik kayıptır.
Darbenin yol boyunca nasıl yayıldığını görelim:
- Kaynak keskin bir darbe basıyor. Elektrik işareti lazer diyotta ışığa çevriliyor. Fibere giren şey zamanda dar, kenarları keskin bir ışık darbesi.
- Çok modlu nüvede yol tek değil. Nüve 62,5 mikron olduğu için ışık aynı anda birden çok doğrultuda ilerliyor. Eksende giden ışın en kısa, kabuğa çarparak giden en uzun yolu izliyor.
- Işınlar alıcıya ayrı anda varıyor. Aynı anda yola çıkan ışık uzak uçta zaman farkıyla toplanıyor. Darbe zamanda genişliyor; modal dispersiyon budur ve mesafe uzadıkça büyüyor.
- Tek modlu nüvede yol tektir. Nüve 9 mikrona indiğinde ışığa tek doğrultu kalıyor. Modal dispersiyon burada oluşmuyor, çünkü uzunluğu farklı ikinci bir yol yok.
- Renkler aynı hızda gitmiyor. Kaynağın ışığı tek bir dalga boyundan ibaret değil. Camda her dalga boyu biraz farklı hızda ilerlediği için darbe yine yayılıyor; buna kromatik dispersiyon deniyor.
Tek modlu fiberde yol tek olduğu için modal dispersiyon oluşmaz. Yayılma yine de bitmez. Kaynağın ışığı tek bir dalga boyundan ibaret değildir ve camda her dalga boyu biraz farklı hızda ilerler. Buna kromatik dispersiyon denir.
ITU-T G.652 bunu iki parametreyle sınırlar: sıfır dispersiyon dalga boyu 1300-1324 nm arasındadır, eğimin üst sınırı ise 0,092 ps/(nm²·km). Bağıntı 1310 nm’de yaklaşık 0,9 ps/(nm·km) çıkarır, 1550 nm’de 17-18 ps/(nm·km).
Fiberin bütün ödünleşimi bu iki kusurun arasında duruyor. Zayıflamanın en düşük olduğu pencerede kromatik dispersiyon en yüksektir; dispersiyonun sıfırlandığı pencerede zayıflama daha yüksek kalır. Dalga boyu seçmek, hangi kusuru ödeyeceğini seçmektir.
Pencerelerin adı da vardır ve ITU altısını sırayla dizer: O 1260-1360, E 1360-1460, S 1460-1530, C 1530-1565, L 1565-1625, U 1625-1675 nm. Eğrinin dibi C bandına düşer; uzun mesafe çoklamasının neden tam oraya yerleştiğini biliyorsun. Tepesi ise E bandındadır: 1383 nm’deki su tepesini G.652.D 0,4 dB/km’ye çekerek o bandı da kullanılabilir kıldı. Altısı da kızılötesindedir; görünür ışık 400-700 nm arasında kaldığı için fiberin içinde akan ışığı gözünle göremezsin.
Bütçeyi cam değil, uçlar bitiriyor
Zayıflama logaritmik ölçekte, desibelle ölçülüyordu. Optik tarafta işaret önem kazanır: 10·log(Pçıkış/Pgiriş) negatif çıkıyorsa kayıp var demektir. 3 dB kayıp gücün %50’sini götürür; 12,5 dB kaybın sonunda elinde %5,6 kalır.
Fiberin kaybı belli bir dalga boyunda dB/km olarak verilir. Birimin içinde mesafe olduğu için kaybı bulmak çarpmaktan ibarettir. G.652.D’nin tavanı 1310-1625 nm aralığında 0,4 dB/km, 1550 nm’de 0,3 dB/km. Modern fiber sahada tipik olarak 0,2 dB/km civarında ölçülür.
Peki neden tam olarak bu sayılar, ve neden uzun dalga boyunda daha az? Camın kaybı üç ayrı mekanizmadan toplanıyor ve üçü de dalga boyuna farklı tepki veriyor.
Rayleigh saçılması. Cam sıvı hâldeyken donduruldu; içindeki yoğunluk dalgalanmaları dalga boyundan çok daha küçük ölçekte kaldı ve donup kaldı. Işık bu mikroskobik düzensizliklerden saçılır. Saçılmanın şiddeti dalga boyunun dördüncü kuvvetiyle ters orantılıdır:
αRayleigh ∝ 1 / λ⁴Dördüncü kuvvet acımasız bir çarpandır. 1550 nm, 850 nm’nin 1,82 katı; dördüncü kuvvette bu 11 kat daha az saçılma demek. Eğrinin sağa doğru inmesinin asıl sebebi budur ve bu bir üretim kusuru değil, camın doğasıdır — daha temiz üreterek aşağı çekemezsin. Uzun mesafe iletiminin neden 1550 nm’de yapıldığının tek cümlelik cevabı bu üstel.
Kızılötesi soğurma. Ters yönden bir duvar geliyor. 1600 nm’den sonra silikanın moleküler titreşimleri ışığı doğrudan yutmaya başlar ve kayıp hızla tırmanır. Rayleigh sola doğru, kızılötesi soğurma sağa doğru yükselttiği için eğrinin dibi ikisinin kesiştiği yerde, yaklaşık 1550 nm’de oluşur. C bandının konumu bir tercih değil, iki fizik eğrisinin kesişimi.
Hidroksil soğurması. Üretim sırasında cama karışan su, yani OH⁻ iyonu, 1383 nm’de keskin bir tepe yapar. Eski fiberlerde bu tepe 2 dB/km’ye çıkıp E bandını kullanılamaz kılıyordu. G.652.D’nin getirdiği yenilik tam olarak bu tepeyi 0,4 dB/km’ye indirmek oldu; sınıfın piyasadaki adı da bu yüzden düşük su tepeli fiberdir.
Dördüncü bir kalem daha var ama bu camın değil senin hatan: az önce gördüğün kıvrım kaybı. Ve o, dalga boyu uzadıkça artar — 1550 nm’lik ışık kıvrımda 1310 nm’lik ışıktan daha kolay kaçar. Sahada bunun çok pratik bir karşılığı var: bir bağ 1310 nm’de geçip 1550 nm’de düşüyorsa, aramaya kablo güzergâhındaki keskin dönüşlerden başlarsın.
Her optik bağlantı noktası, işçiliğin kalitesine göre 0,5 dB ile 2,0 dB arasında kayıp getirir. 10 km’lik tek modlu bir hattı hesapla: 0,3 dB/km cam kaybı 3,0 dB eder, iki iyi konnektör 1,0 dB. Toplam 4,0 dB. 10GBASE-L’in 6,2 dB’lik kanal ekleme kaybı bütçesine 2,2 dB pay kalır.
Aynı hatta konnektörler 2,0 dB’lik olursa toplam 7,0 dB’ye çıkar ve bağ bütçeyi aşar. İki uç, on kilometre camdan daha belirleyici. Kötü yapılmış bir ek, parmak yağı ya da toz aynı hesaba girer.

Kaybın nerede olduğunu bulmak için OTDR kullanılır. Süreksizliklerden yansıyan ışığı ölçer ve toplam zayıflamanın yanında kaybın yerini de gösterir: bir ekte mi, bir konnektörde mi, aşırı sıkı bir kıvrımda mı.
Bir yanlış anlamayı burada kapatmak gerekiyor. Fiber, tek yön yayılım gecikmesinde bakırdan belirgin hızlı değildir: 1.000 km’de 4,9 ms’ye karşı 5,0 ms. Kazanç gecikmede değil, taşınabilen kapasitede ve gidilebilen mesafede. 10GBASE-L 1310 nm’de 10 km’ye çıkarken 10GBASE-E 1550 nm’de 10,9 dB’lik bütçesiyle 30 km’ye gider.
Her fiber bağ segmenti iki damar ister; biri gönderme, biri alma. Çaprazlama kablo tarafında yapılır, anahtarın içinde değil. Alt sınır da tanımlıdır: standardın izin verdiği en kısa fiber segment 2 metredir.
Bugün en yaygın iki konnektör SC ve LC. LC’nin ferrülü 1,25 mm ve gövdesi SC’nin yarısı kadar yer kaplar. Anahtarın ön paneline bu yüzden daha çok port sığar. Sunucudaki optik modülü ethtool -m enp3s0 ile okuyabilirsin. Çıktıda modülün türü, lazerin dalga boyu ve o an alınan ışık gücü dBm cinsinden yazar.
Renk kodu da bilgi taşır. TIA kodunda tek modlu fiber sarı, OM1 ile OM2 turuncu, OM3 ile OM4 su yeşilidir. Konnektör gövdesi çok modluda bej, tek modluda mavi, APC uçlarda yeşildir. Bina içi omurga kabloları genelde 12 ya da 24 damar taşır. Masaüstüne inen yatay kablolama ise hâlâ ezici çoğunlukla twisted pair’dir.
Bir uyarı: Fiberin ucuna bakmak hiçbir koşulda güvenli değildir. Retinada ağrı alıcısı yoktur; yeterince güçlü lazer ışığı acı hissi vermeden zarar verir.
Taşıyıcı sınıfı bir metro Ethernet devresinin altında çoğu zaman tam olarak bu cam lif yatıyor.
Özet
Peki, ne öğrendik?
- Kritik açı bir hesap sonucudur:
θc = arcsin(n₂/n₁). Cam-hava sınırında 42 derece çıkar, core-kabuk sınırında 83,3; fiberde ışının eksenden sapma payı bu yüzden 6,7 derecedir.- Sayısal açıklık girişi ölçer:
NA = √(n₁²−n₂²)kabul konisinin yarı açısını verir ve tek modlu fiberde bu koni 10 dereceye kadar daralır.- Core çapı: 8-10 mikronluk core tek modlu, 50 ya da 62,5 mikronluk core çok modlu fiberi tanımlar; kabuk iki sınıfta da 125, birincil kaplama 250, sıkı tampon 900 mikrondur.
- Zayıflamanın dibi bir tercih değil: Rayleigh saçılması
1/λ⁴ile düşer, kızılötesi soğurma karşıdan yükselir; ikisinin kesiştiği yer 1550 nm, yani C bandıdır.- Modal dispersiyon: çok modlu fiberde yollar farklı uzunlukta olduğu için darbe genişler, ölçü de bu yüzden MHz·km ile yazılır.
- Kromatik dispersiyon: tek modlu fiberde bile dalga boyları farklı hızda gider ve G.652 bu yayılmayı iki parametreyle sınırlar.
- Kayıp bütçesi: bir bağın bütçesini çoğu zaman camın kilometreleri değil, uçlardaki konnektörler ve ekler bitirir.
Cam lif kıtayı geçiyor ve mesafeyi artık ışığın hızıyla ölçüyorsun. Ama evlerin çoğuna inen kablo hâlâ cam değil bakır, üstelik o bakır internet için çekilmedi. Peki yalnızca ses taşısın diye döşenmiş iki tel, bugün nasıl oluyor da onlarca megabit veriyor?
Bölüm 53: Bakır Erişim Ağı: DSL
Camın içinde ışığı tutan fiziği kurduk ve fiber artık şehirlere kadar iniyor. Ama dünyadaki evlerin çoğuna hâlâ bakır giriyor, üstelik o bakır internet için çekilmedi.
Duvarındaki telefon prizinin arkasındaki iki tel, belki senden yıllarca önce, yalnızca ses taşısın diye döşendi. Bugün aynı iki tel sana onlarca megabit veriyor. Peki ses için çekilmiş bir tel bunu nasıl yapıyor — ve komşunun hızı neden seninkinden farklı?
Ses için çekilmiş bir tel
Evinden çıkan bakır çiftin adı abone hattıdır; sahada son mil, düzenleme metinlerinde yerel ağ diye de geçer. Tek başına ilerlemiyor: sokaktaki ek kutularında yüzlerce kardeşiyle aynı demetin içine giriyor, saha dolabından geçiyor ve santral denen binada bitiyor. Santral, o mahalledeki bütün bakır çiftlerin toplandığı yer; içeride binlerce, büyük şehirlerde on binlerce çift, dev bir dağıtım çerçevesinde uçları görünecek şekilde sonlanır.
Bu hattın taşıması gereken tek şey uzun süre insan sesiydi. Konuşmanın anlaşılırlığı için 300 ile 3.400 hertz arası yeter; telefon şebekesi de her hatta 4 kilohertzlik bir kanal ayırdı. Bakır çiftin fiziksel olarak taşıyabildiği bant ise bundan yüzlerce kat geniş; telefon şebekesi elindeki kapasitenin küçük bir dilimini kullanıyordu. Yani hattın üstünde, ilk dört kilohertzin bittiği yerden başlayan, onlarca yıl boş duran kocaman bir frekans alanı vardı.

DSL’in tek fikri budur: sesi yerinde bırak, üstündeki boşluğu veriye ver.
Boş bandı kullanmak
Boşluğu kullanmanın yolu bandı tek parça hâlinde sürmek değil, ince dilimlere bölmek. DSL, kullanılabilir bandı 4.312,5 hertzlik dar şeritlere ayırır. Her şerit kendi taşıyıcısını taşır ve saniyede 4.000 sembol gönderir. Bir şeride kaç bit yükleneceğine ise o şeridin kendi durumu karar verir.
Karar mekanizması işin can damarı. Modem hattı açarken bütün şeritleri tek tek yoklar, her birinde sinyalin gürültüye oranını ölçer ve o şeride kaç bitlik bir takımyıldız sığacağını belirler. Temiz bir şerit on beş bit taşır, gürültülü bir şerit iki bit taşır, umutsuz bir şerit hiç kullanılmaz. Hattın toplam hızı, bütün şeritlerin taşıdığı bitlerin toplamıdır.
Bu yüzden DSL’de hız basamaklı değil süreklidir. Hattın bir bölgesi bozulduğunda bağlantı kopmaz; yalnızca o bölgedeki şeritler daha az bit taşır ve senkron hızı birkaç yüz kilobit düşer. Radyo tarafında bilinen aynı fikir burada bakır üstünde çalışıyor: bandı ince şeritlere böl, her şeride kendi kapasitesince yükle.
Ses ile veriyi ayıran şey bir filtredir. Abone tarafında bu iş küçük bir ayırıcı ya da her telefonun önüne takılan mikrofiltre ile yapılır: telefona yalnızca ilk dört kilohertz geçer, modeme yalnızca üstü. Filtresiz takılan bir telefon, konuştuğun sürece üst banda gürültü basar ve hattın senkronunu düşürür. Santral tarafında aynı ayrımı yapan cihazın adı DSLAM’dır; sesi telefon anahtarına, veriyi işletmecinin veri ağına yollar.
| kuşak | üst frekans sınırı | tipik en yüksek downstream |
|---|---|---|
| ADSL | 1,1 MHz | 8 Mbit/s |
| ADSL2+ | 2,2 MHz | 24 Mbit/s |
| VDSL2 profil 17a | 17,7 MHz | 100 Mbit/s |
| VDSL2 profil 35b | 35,3 MHz | 300 Mbit/s |
| G.fast | 106 / 212 MHz | 1 Gbit/s |
Tablonun anlattığı tek şey var: her kuşak bir öncekinden daha yükseğe çıkıyor. Hız artışı yeni bir buluştan değil, daha geniş bir banttan geliyor.
Adlardaki A harfi de bir tercihtir. ADSL’de downstream’e ayrılan şerit sayısı upstream’e ayrılandan çok fazladır. Asimetri kastidir, çünkü ev kullanıcısı indirdiğinden çok daha azını gönderiyordu. Bu tercihin bedelini yıllar sonra video görüşmesi ve bulut yedeklemesi ödedi.
DerinleşmeHız neden şerit sayısıyla bit sayısının çarpımı?
Bir şerit saniyede 4.000 sembol taşıyor ve her sembolde o şeride yüklenmiş bit sayısı kadar bit gidiyor. Yani tek bir şeridin hızı, taşıdığı bit sayısının 4.000 katı: on beş bit taşıyan bir şerit saniyede 60 kilobit veriyor.
ADSL2+ downstream’de yaklaşık 512 şerit kullanır. Hepsi on beşer bit taşısa toplam 30 megabitin biraz üstü çıkardı; standardın 24 megabitlik tavanı da buradan gelir, çünkü şeritlerin bir kısmı kontrol bilgisine ayrılır ve üst uçtaki şeritler zaten hiçbir zaman dolu taşımaz.
Buradan doğrudan bir sonuç çıkıyor: bir DSL hattının hızını artırmanın iki yolu var. Ya şerit sayısını artıracaksın — daha geniş bant, yani daha yüksek frekans — ya da şerit başına bit sayısını, yani daha temiz hat. İkincisinin tavanı düşüktür ve hattı yenilemek gerekir. Bütün DSL kuşakları bu yüzden birinci yolu seçti.
Uzaklık neden bu kadar belirleyici
Bakırda sinyal ilerledikçe zayıflar. Kritik olan şu: zayıflama frekansla birlikte artar. Aynı telde 100 kilohertzlik bir sinyal kilometrelerce gidebilirken 17 megahertzlik bir sinyal birkaç yüz metrede tanınmaz hâle gelir.
İkisini birleştir. Uzun bir hatta önce üst şeritler ölür, sonra ortadakiler; hattın alt ucu en son teslim olur. Bu yüzden santralden uzaklaşmak hızı doğrusal düşürmez. Önce en çok bit taşıyan şeritleri, yani hızın büyük kısmını götürür.
Sonuç, aynı sokakta oturan iki kişinin bambaşka hız görmesidir. Kabaca sayılarla:
| santrale kablo uzunluğu | ADSL2+ | VDSL2 profil 17a |
|---|---|---|
| 300 m | 24 Mbit/s | ~100 Mbit/s |
| 500 m | 24 Mbit/s | ~80 Mbit/s |
| 1 km | ~20 Mbit/s | ~45 Mbit/s |
| 1,5 km | ~16 Mbit/s | ~25 Mbit/s |
| 2 km | ~12 Mbit/s | ~12 Mbit/s |
| 3 km | ~7 Mbit/s | pratikte kullanılmaz |
| 4 km | ~3 Mbit/s | pratikte kullanılmaz |
| 5 km | ~1,5 Mbit/s | pratikte kullanılmaz |
Sayılar kablo kalınlığına, ek sayısına ve demetteki komşu hatlara göre oynar; oran oynamaz. Tablonun asıl haberi son sütunda duruyor: VDSL2, ADSL2+‘a olan bütün üstünlüğünü ilk bir kilometrede kazanıyor. İki kilometrede ikisi eşitleniyor, sonrasında VDSL2 daha da kötü hâle geliyor — çünkü bel bağladığı yüksek şeritler çoktan ölmüş oluyor ve elinde ADSL2+‘ın zaten kullandığı alt banttan fazlası kalmıyor.
Bir de kuş uçuşu ile kablo uzunluğu aynı şey değildir. Santral pencerenden görünüyor olabilir ama kablo o mahalleyi dolaşıp geliyorsa hattın boyu üç katı olur. Hızı belirleyen, haritadaki mesafe değil telin kendi uzunluğudur.
Eski şebekede iki de tuzak vardır. Uzun ses hatlarının kalitesini artırmak için araya takılan yükleme bobinleri üst frekansları tamamen keser; bobinli bir hatta DSL hiç açılmaz. Bir de vaktiyle başka bir aboneye çekilip sökülmeden bırakılmış paralel uçlar bulunur; bunlar sinyali yansıtır ve belirli şeritleri çukura düşürür.
Modemin sana söyledikleri
Modem arayüzündeki hat sayfası, yukarıda anlatılan her şeyin ölçülmüş hâlidir. Dört sayı işine yarar.
Senkron hızı. Modem ile DSLAM’ın anlaştığı hat hızıdır ve tarifenle aynı olmak zorunda değildir. Tarifen 100 megabitse ama senkron 43 megabitte kalıyorsa mesele işletmecinin kısıtlaması değil, hattın fiziğidir.
Hat zayıflaması. Sinyalin yolda kaybettiği desibeldir ve neredeyse doğrudan uzaklık demektir.
| hat zayıflaması | anlamı |
|---|---|
| 20 dB altı | mükemmel, santral çok yakın |
| 20 – 30 dB | çok iyi |
| 30 – 40 dB | iyi |
| 40 – 50 dB | sınırda, hız belirgin düşük |
| 50 – 60 dB | kötü, kopmalar beklenir |
| 60 dB üstü | hat büyük ihtimalle senkron olmaz |
Gürültü payı. Sinyalin gürültünün ne kadar üstünde kaldığını söyler; hattın stok marjı gibidir. 6 desibelin altına indiğinde küçük bir parazit bile senkronu düşürür, 10 ile 20 arası sağlıklıdır, 20’nin üstü ise hattın daha yüksek hızı kaldırabileceğinin işaretidir. Akşam saatlerinde bu payın düşmesi normaldir; demetteki komşu hatlar çalıştıkça birbirlerine diyafoni basar.
Hata sayaçları. Düzeltilmiş hatalar, hattın sessizce onardığı bozulmalardır. Düzeltilemeyen hatalar ise kaybedilmiş veridir; ikincisi sürekli artıyorsa hatta fiziksel bir sorun var demektir.
Bir de arayüzde görünmeyen ama hissedilen bir ayar vardır. Hat, gönderilecek bitleri araya serpiştirecek şekilde ayarlanabilir. Böylece ani bir gürültü darbesi veriyi tek bir yerden değil dağınık noktalardan bozar ve düzeltme kodunun onarması kolaylaşır. Bedeli sabit bir gecikmedir, tipik olarak 8 ile 16 milisaniye. Oyun oynayanların işletmeciden “hızlı yol” istemesinin sebebi budur: serpiştirme kapanır, gecikme düşer, gürültüye dayanıklılık azalır.
Bakırı kısaltmak
Uzaklık hızı öldürüyorsa çözüm bellidir: bakırı kısalt. Bunun sahadaki karşılığı, DSLAM’ı santral binasından çıkarıp sokaktaki dolaba taşımaktır. Dolaba kadar fiber gider, dolaptan eve birkaç yüz metrelik bakır kalır. Aynı ev, aynı tel, aynı modem — ama artık santrale değil sokaktaki kutuya bağlı, yani tablodaki ilk satırda yaşıyor.

İkinci hamle diyafoniyle ilgilidir. Aynı demetteki bakır çiftler birbirine sinyal sızdırır ve VDSL2 hızlarında bu sızıntı gürültünün baskın kaynağı hâline gelir. Vektörleme denen yöntem, aynı DSLAM’a bağlı bütün hatların sinyallerini birlikte hesaplar ve her hatta komşularından geleceğini bildiği bozulmanın tersini ekleyerek gönderir; bozulma hedefte sönümlenir. Karşılığında bir şart koşar: demetteki hatların hepsi aynı DSLAM’ın denetiminde olmalıdır. Aynı demette başka bir işletmecinin kendi DSLAM’ına bağlı tek bir hat kalırsa, o hat hesaba katılamadığı için herkesin kazancı düşer. Teknik bir yöntemin doğrudan düzenleme sorununa dönüştüğü ender yerlerden biridir.
Üçüncüsü bandı sonuna kadar zorlar. G.fast 106, sonraki sürümünde 212 megahertze çıkar ve gigabit mertebesine ulaşır — ama ancak yüz metre civarındaki hatlarda. Artık santralden bile değil, apartmanın bodrumundaki kutudan konuşuyoruzdur. Bu noktada bakırın rolü, fiberin son birkaç on metresini tamamlamaktan ibarettir.
Sıralamaya dikkat et. Üç hamlenin üçü de aynı şeyi yapıyor: bakırın boyunu kısaltıyor. Fiber her adımda eve biraz daha yaklaşıyor.
Duvardaki bakır kimin?
Buraya kadar anlatılan her şey fizik. Faturandaki isim ise başka bir hikâye ve Türkiye’de kafa karıştıran kısım tam burası.
Bakır erişim şebekesi ülkenin tamamında tek bir işletmecinin, Türk Telekom’un elindedir. Bu şebeke devlet tekeli döneminden devralınmış altyapıdır ve ikincisini kurmak ekonomik olarak gerçekçi değildir; her rakibin her sokağa kendi bakırını çekmesi beklenemez. Böyle bir konumdaki işletmeciye düzenleyici kurum — Türkiye’de BTK — altyapısını rakiplerine belirlenmiş tarifelerle açma yükümlülüğü getirir. Yükümlülüğün adı toptan erişimtir ve birden fazla biçimi vardır:
| toptan model | işletmeci ne kiralıyor | kendi donanımı nerede |
|---|---|---|
| yeniden satış (al-sat) | hazır hizmetin kendisi | hiçbir yerde |
| IP seviyesinde veri akış erişimi | abonenin trafiği | ülke çapında birkaç on teslim noktasında |
| YAPA | çıplak bakır çiftin kendisi | santralde, kendi DSLAM’ı |
| SAYE | fiber erişimin sanal eşdeğeri | fiber şebekede, YAPA’nın karşılığı |
Liste yukarıdan aşağıya derinleşiyor. En üstte işletmeci yalnızca bir satıcıdır; en altta santral binasının içinde kendi donanımı vardır ve hattın nasıl çalışacağına kendisi karar verir. Alternatif işletmecilerin abonelerinin büyük çoğunluğu pratikte ortadaki modelle, yani veri akış erişimiyle bağlanır. Her santrale kendi DSLAM’ını koymak çok pahalıdır ve ancak abone yoğunluğu yüksek yerlerde geri döner.
YAPA’nın bakırla sınırlı olması da tesadüf değil. Model, bakır çiftin fiziksel olarak kiralanması üzerine kurulu. Fiber şebekede kiralanacak öyle bir çift yok, çünkü tek bir lifi onlarca abone paylaşıyor. SAYE tam bu boşluk için tanımlandı: fiziksel damarı değil, onun üstünde tanımlanmış sanal bir erişimi kiralıyor.
Bunun sana yansıması şudur: internetini hangi şirketten alırsan al, duvarındaki bakır ve sokaktaki kutu Türk Telekom’undur. Hattında fiziksel bir arıza varsa — su almış bir ek kutusu, kopmuş bir çift — onu onaracak olan, faturanı ödediğin şirket olmayabilir. Buna karşılık hızının tavanı fizikten, tarifen sözleşmeden gelir ve ikisi birbirine karışmaz.
Modemine bir kullanıcı adı ile parola girmenin sebebi de bu ayrımdır. Bakır ve DSLAM bir şirkete, aboneliğin başka bir şirkete ait. Modem hattın üstünden bir oturum açar, o oturum kendi işletmecinin ağındaki bir toplayıcıda sonlanır ve adres, hız sınırı ile muhasebe oradan verilir. Kimliğini bu yüzden hat değil sen taşırsın.
Son bir ayrım: modem ile yönlendirici aynı şey değildir. Modemin işi bitleri hattın taşıyabileceği sinyale çevirmek ve geri okumaktır. Yönlendiricinin işi paketleri ağlar arasında iletmektir. Evindeki kutu bugün ikisini, üstüne bir anahtar ile bir access point’i de tek kasada topluyor — ama fiber aboneliğe geçtiğinde değişen yalnızca birinci parçadır.
Özet
Peki, ne öğrendik?
- Boş bant: telefon hattı yalnızca ilk 4 kilohertzi kullanıyordu; DSL’in tek fikri sesi yerinde bırakıp üstündeki boşluğu veriye vermektir.
- Şerit şerit taşıma: bant 4,3 kilohertzlik şeritlere bölünür, her şeride kendi temizliği kadar bit yüklenir ve hat hızı bu bitlerin toplamıdır.
- Uzaklık üstten öldürür: zayıflama frekansla arttığı için uzun hatta önce en çok bit taşıyan üst şeritler ölür; VDSL2 üstünlüğünü ilk bir kilometrede kazanır, iki kilometrede ADSL2+ ile eşitlenir.
- Dört sayı yeter: senkron hızı hattın gerçek tavanını, zayıflama uzaklığı, gürültü payı marjı, hata sayaçları da fiziksel sorunu gösterir.
- Her çözüm aynı çözüm: dolaba taşımak, vektörleme ve G.fast farklı yöntemler gibi görünse de üçü de bakırın boyunu kısaltıyor.
- Bakır bir şirketin, abonelik başkasının: erişim şebekesi yerleşik işletmecide kalır, rakipler onu düzenlenmiş toptan modellerle kiralar, sen de oturumunu kendi işletmecinde açarsın.
Bakır fiziğin izin verdiği son noktaya kadar zorlandı ve her hamlede aynı yere varıldı: teli kısalt. Peki teli tamamen ortadan kaldırıp fiberi kapıya kadar getirdiğinde, o lif yalnızca sana mı ait oluyor?
Bölüm 54: Pasif Optik Ağlar
Bakır kısaldıkça fiber eve yaklaştı ve sonunda kapıya dayandı. Ama eve giren o lif yalnızca senin değildir.
Sokaktaki bir kutuda ışığın otuz iki komşununkiyle aynı damarı paylaşıyor. Peki otuz iki ev birbirinin sözünü nasıl kesmiyor?
Arada hiçbir cihaz elektrik istemiyor
Bir pasif optik ağı üç parçaya ayırabilirsin. Santralde OLT durur, yani optik hat sonlandırıcı. Abone tarafında ONT durur, yani abone ağ terminali. İkisinin arasında da ODN, yani pasif optik dağıtım ağı uzanır.
Adın içindeki pasif sözcüğünü bir övgü olarak okuma; orada bir kısıt duruyor. O iki uç arasında elektrikle çalışan hiçbir cihaz bulamazsın. Standart ODN’i bir ağaç olarak tanımlar: lifler, ışığı kollara bölen ayırıcılar (optical splitter), dalga boylarını ayıran filtreler, konnektörler.
OLT ile ONT’ler arasındaki ilişki birden çoğa ilişkisidir. Noktadan noktaya Ethernet ile pasif optik ağın bütün farkı bu tek cümlede; aklında tutman gereken cümle de bu.
ONT ile ONU’yu da karıştırmamak gerekiyor. ONU genel terim ve çok aboneli cihazı da içine alıyor; ONT ise onun tek aboneli özel hâli. Apartman girişindeki kutu ONU, dairenin duvarındaki kutu ONT olur. İkisini karıştırmak sahada sık görülüyor; ayrım kaç aboneye baktıklarında.
Fiberin nerede bittiğine göre değişen bir aile adlandırması da var ve kısaltmaları sık sık karşına çıkacak. FTTH eve kadar, FTTB binaya kadar, FTTC kaldırıma kadar, FTTCab sokak dolabına kadar gider. Kalan yolu bakır tamamlar ve dördü de aynı optik erişim ağını kullanır.
Twisted pair’in sonlandırmasını ve kanal testini kendin yapmıştın; FTTC’de o son yüz metre hâlâ aynı bakırdır.
ONT’nin işi ışığı elektriğe çevirmekle de bitmiyor. Standart, içine yönlendirme, NAT ve güvenlik duvarı giren bir konut geçidi senaryosunu ayrıca sayar. Evdeki tek kutunun aynı anda yönlendirici olması bir üretici tercihi değil, standardın kendi senaryosudur.
Aynı camda üç yön birden yaşıyor
GPON tek bir tek modlu damarla yetiniyor; gidiş ile dönüş için ayrı lif çekmene gerek kalmıyor.
Downstream 1480-1500 nm bandını kullanıyor, upstream ise 1300-1320 nm bandını. İki yönü ayıran şeyi zaman ya da lif sanma; ayıran şey dalga boyu.
XGS-PON’un temel kümesinde downstream 1575-1580 nm, upstream 1260-1280 nm’dir. Bantlar GPON’unkilerle üst üste binmiyor. İki kuşağı bu yüzden aynı life birlikte koyabiliyorsun ve işletmeci aboneleri teker teker taşıyabiliyor.
Üçüncü bir yön daha var. Radyo frekanslı video yayını downstream’de 1550-1560 nm bandından geçer.
Dalga boyu bölmeli çoklama kanalları ayırıyordu; erişim ağı aynı numarayı tek bir abone lifinde çeviriyor.
Hız tarafında GPON iki birleşim tanımlıyor ama sahada kurulanların neredeyse tamamı tek birleşime dayanıyor: downstream 2488,32 Mbit/s, upstream 1244,16 Mbit/s. Asimetriyi burada bir istisna olarak değil, kuralın kendisi olarak göreceksin.
XGS-PON iki yönde de nominal 10 Gbit/s taşır ve o asimetriyi kapatır. Sonraki kuşak ise ITU-T G.9804.3 ile 50 Gbit/s’e çıkıyor.
Bu sayıları bir abonenin payı olarak okuma; bütün ağacın toplam kapasitesini veriyorlar. Otuz iki abone aynı anda etkinken GPON’da abone başına taban 77,76 Mbit/s’ye iniyor; XGS-PON’da 1:64 bölmeyle aynı hesap 156,25 Mbit/s verir.
Downstream fiziksel çerçevesi her kuşakta 125 µs sürer. Değişen, içine sığan bayt sayısıdır:
downstream çerçevesi 125 µs
9,95328 Gbit/s hatta 155 520 bayt
2488,32 Mbit/s hatta 38 880 baytHer çerçeve 24 baytlık bir fiziksel eşitleme bloğuyla (PSBd) başlıyor. ONT önce o blokla saatini oturtuyor, sonra yükü okumaya geçiyor.
Upstream rekabetle değil tarifeyle çalışıyor
Aynı PON üzerindeki bütün ONU’lar downstream verisinin tamamını alıyor. Bunu bir kusur olarak görme; mimarinin tanımı bu. Kusura dönüşmesini engelleyen şey şifreleme.
Standart güvenliği doğrudan çoklu yayın doğasının sonucu olarak kurar ve iki şart sayar: komşunun downstream verisini çözememen, ve bir ONT’nin başka bir ONT gibi davranamaması.
Downstream’de giden tekil trafiği bu yüzden şifresiz bırakamıyorsun; standart örnek algoritma olarak AES’i gösteriyor. Upstream’de ise şifreleme seçmeli kalıyor, çünkü bir ONT’nin ışığı komşularına değil yalnızca OLT’ye ulaşıyor.
Upstream’in asıl sorununu gizlilikte de arama. Otuz iki cihaz aynı damara aynı anda ışık yakarsa hiçbiri okunamıyor.
Çözümü tarifede buluyorsun. OLT her çerçevenin içine bir bant genişliği haritası koyuyor ve downstream’de herkese gönderiyor. Harita her ONU’ya ayrı bir sıra veriyor ve iki sıra asla çakışmıyor.
Sıralar sabit dilimler hâlinde de dondurulmaz. Dinamik bant genişliği tahsisi, upstream kapasitesini trafik göstergesine ve sözleşmeye göre dağıtır. Boş geçen dilim başkasına verilir; senkron zaman bölmesinin bilinen kusuru böyle kapatılır.
Tarifenin tutması için OLT’nin her cihazın ne kadar uzakta olduğunu bilmesi gerekir. Mesafe ölçümü tam olarak bunu yapar: OLT ile her ONU arasındaki gidiş-dönüş gecikmesini ölçer ve uygun bir denkleştirme gecikmesi atar. Yakındaki cihaz daha çok bekler, uzaktaki daha az. Böylece ikisinin ışığı OLT’ye aynı çerçeve referansında varır.
Ölçümün bir bedeli var. Yeni bir ONT ağa katılırken OLT çalışan bütün ONU’lara tahsisi keser; bu aralığa sessiz pencere denir. Ağa abone eklemenin bedeli, o an bütün ağacın susmasıdır.
Fişe takmakla hizmet almak arasındaki fark da üç aşamadır: parametre öğrenme, seri numarası edinme ve mesafe ölçümü.
Santralden eve uzanan ağacın hangi noktada bölündüğünü izleyelim:
- Santralden tek bir lif çıkıyor. OLT santralde duruyor. Besleme lifi sokaktaki kutuya kadar tek damar hâlinde gidiyor ve aşağı yön 1490 nm dolayında bir dalga boyunda ilerliyor.
- Ayırıcı ışığı otuz ikiye bölüyor. Kutunun içinde elektrikle çalışan hiçbir şey yok. Pasif ayırıcı gelen ışığı otuz iki çıkışa dağıtıyor; bedeli güçte, çünkü her ikiye bölme 3 dB götürüyor.
- Aşağı yön hepsine birden iniyor. Ayırıcı adrese bakmaz; aynı çerçeve otuz iki ONT’nin hepsine varır. Komşunun verisini okuyamamanı sağlayan şey mimari değil, aşağı yöndeki şifrelemedir.
- Yukarı yön aynı camdan dönüyor. Dönüş için ikinci bir lif çekilmiyor. Yukarı yön 1310 nm dolayında ayrı bir dalga boyundan geçiyor ve ayırıcıda yine tek besleme lifine birleşiyor.
- Sırayı OLT önceden dağıtıyor. Her ONT yalnızca kendi diliminde ışık yakar. OLT dilimleri bant genişliği haritasıyla ilan eder, mesafe ölçümüyle her cihaza ayrı bir denkleştirme gecikmesi atar.
Bölme oranıyla mesafe aynı bütçeden besleniyor
Bölme oranını büyütmek işletmeci için caziptir. Aynı besleme lifi daha çok abone taşırsa abone başına maliyet düşer. Bedeli optik güç bütçesinden çıkar.
Her ikiye bölmenin bedeli sabit 3 dB, yani gücün yarısıdır. 1:32 bölmenin ideal kaybı 15,05 dB, 1:64’ünki 18,06 dB olur.
Bunun üstüne lifin kendi kaybı biner. Yirmi kilometrelik bir G.652 lifi 1310 nm’de en çok 8 dB kaybeder. 1:32 ile birlikte 23,05 dB eder, ve B+ sınıfının 28 dB’lik bütçesinde konnektörlere, eklere ve yaşlanma payına yaklaşık 5 dB kalır.
Kayıp bütçesi bu yüzden sınıflara ayrılmıştır:
| sınıf | ODN kayıp bütçesi |
|---|---|
| GPON B+ | 28 dB |
| XG-PON N1 | 29 dB |
| XG-PON N2 | 31 dB |
| GPON C+ | 32 dB |
| E1 | 33 dB |
| E2 | 35 dB |
Fiziksel katmanda gerçekçi bölme 1:64’e kadardır; iletim yakınsama katmanı ise 1:128’e kadar bölmeyi hesaba katar. Protokol, optiğin henüz yetişemediği bir geleceğe yer açmıştır.
Sahadaki ODN altyapıları çoğunlukla 1:32 ile 1:64 arasında kuruldu. XGS-PON’un asgari şartı 1:64’ü desteklemektir, çünkü yeni kuşak döşeli camı değiştirmeden gelmek zorundadır. Aynı sebeple G.652 üzerine kurulur ve bükülme kaybına duyarsız G.657 lifleriyle de uyumludur.
Zayıflama penceresini ve konnektör kaybını kendin hesaplamıştın; erişim ağında aynı bütçeye bir de bölme kaybı ekleniyor.
Mesafe tarafında GPON’un temel fiziksel erişimi 20 km, ikinci seçeneği 10 km’dir. Mantıksal erişimi 60 km’ye çıkar. Aradaki farkı kapatan erişim uzatma cihazı ise artık pasif değildir.
Asıl kısıt mutlak mesafe de sayılmaz. En yakın ve en uzak ONT arasındaki farktır; GPON’da bu diferansiyel lif mesafesi en çok 20 km olabilir. Sessiz pencerenin genişliğini doğrudan o sayı belirler.
Sebebi ışığın hızıyla hesaplanır. Fiber core’unda ışık 204.082 km/s ile ilerlediği için yirmi kilometrelik lifte tek yön 98 µs, gidiş-dönüş 196 µs sürer. Pencerenin örtmek zorunda olduğu belirsizlik tam olarak budur.
Ayırıcıya çok yakın ve çok uzak aboneler aynı ağaçta bulunduğu için alıcının doymaması gerekir. Optik zayıflatıcı bu yüzden gücü artırmak için değil düşürmek için konur ve 0-25 dB aralığında ayarlanır.
Erişim ağı, taşıyıcı omurganın en ucudur ve kuralları başkadır.
Ağaç topolojisinin bilinen zayıflığı da burada duruyor. Santral ile ayırıcı arasında tek bir besleme lifi uzanıyor. Koptuğunda otuz iki abone birden düşer.
ODN elektriksiz çalışır ama ONT çalışmaz. Bazı işletmeciler şebeke kesildikten sonra can hattı arayüzün 4 ila 8 saat ayakta kalmasını şart koşar. Çalışan bir ağda arızayı bulmanın yolu da kabloyu sökmek değil, gücü yerinde ölçmektir; fiber tanımlayıcı hattı kesmeden optik gücü okur.
Özet
Peki, ne öğrendik?
- Pasif optik ağ: santraldeki OLT ile abonedeki ONT arasında elektrikle çalışan hiçbir cihaz yoktur; arada yalnızca cam, ayırıcı ve filtre kalır.
- Bir aile, dört durak: FTTH, FTTB, FTTC ve FTTCab fiberin nerede bittiğini söyler; kalan yolu bakır tamamlar ve dördü de aynı optik erişim ağına bağlanır.
- Tek damar, üç yön: downstream, upstream ve video aynı lifte ayrı dalga boylarında taşınır, iki PON kuşağı da bu yüzden aynı camda birlikte yaşayabilir.
- Tarifeli upstream: ONT’ler sırayı kendileri kapmaz; OLT bant genişliği haritasıyla dağıtır ve mesafe ölçümüyle her cihaza ayrı bir denkleştirme gecikmesi atar.
- Ortak bütçe: bölme oranı ile mesafe aynı optik güç bütçesinden beslenir, o yüzden daha çok abone her zaman daha kısa mesafe demektir.
Fiber artık duvarındaki kutuda bitiyor ve o son metreyi de ışık taşıyor. Peki fiberi hâlâ sokağına inmemiş evlere, çoktan döşenmiş başka bir kablo aynı işi yapabilir mi?
Bölüm 55: Kablo Erişim Ağları
Fiber eve kadar geldi, ama her eve gelmedi. Çoğu evde yıllardır duran başka bir kablo var: televizyonu besleyen anten kablosu.
O kablo veri için döşenmemişti. Peki yayın taşımak üzere kurulmuş bir tesisat, isteğini nereye sığdırıyor?
Eve giren kablo aslında iki kablo
Kablo erişiminin tam adı melez fiber koaksiyeldir (hybrid fiber coax, HFC). Melez, çünkü ortam tek değil. Sağlayıcı tarafında omurga fiberdir ve ışık mahalleye kadar iner. Son adım koaksiyeldir; evin duvarına o girer.
Karışımın sebebi fizikte yatıyor. Uzun mesafeli analog iletimde birkaç kilometrede bir yükselteç gerekiyor; daha yüksek frekans kullanıldıkça bu aralık daha da daralır. Yükselteç sayısını düşürmenin tek yolu bakır parçasını kısaltmaktır. Fiberi mahalleye indirirsin, koaksiyele yalnızca son parçayı bırakırsın.

Koaksiyeli bir kablo ailesi olarak tanımıştın; o ailenin en kalabalık kolu bugün hâlâ evlerin duvarında duruyor. RG-6’yı aynı 75 ohm’luk ailenin öbür üyelerinden ayıran şey iç iletkenin çapıdır: RG-59’da 0,81 mm, RG-6’da 1 mm, RG-11’de 1,63 mm. Kalın iletken daha az zayıflama ve daha uzun mesafe demek; duvarındaki kablonun üstünde yazan o üç harfli kod tam olarak bunu söylüyor. Koaksiyelin kendisi 1950’lerde AT&T Bell Laboratuvarları’nda geliştirildi; duvardaki priz, yerel ağların doğuşundan bile eski bir teknolojiye bağlanıyor.
Tesisatın kendisi veri için kurulmadı. Kablo TV, uzak bölgelere yayın götürmek için kurulan ortak anten sistemlerinden doğdu; adı da oradan gelir: Community Antenna Television. Şehir ölçeğine yayılmış bu tesisat, kentsel alan ağının (metropolitan area network) en bilinen örneğidir. Kablo interneti yeni bir hat döşemek değil; döşenmiş bir hattaki boş bandı değerlendirmek.
Aynı bakırın yerel ağ kariyerinde bir segment birkaç yüz metrede sonlanıyordu, yayın dağıtımında ise onlarca kilometre gidiyor. Farkı kablonun kendisi yaratmıyor; üstünde çalışan sistem yaratıyor.
Aynı bakırda veriye yer nereden çıktı?
Taşıyıcı fikir frekans bölmeli çoklama. Televizyon kanalları, internet verisi ve kontrol trafiği aynı bakırda ayrı frekans bantlarında ilerliyor. Frekans bölmeli çoklama bir telin bandını şeritlere ayırıyordu; kablo TV tesisatı aynı işi onlarca kilometrelik bir dağıtım ağının üstünde yapıyor.
Bandın gerçekte ne kadar geniş olduğunu iki sayıdan görebilirsin. Koaksiyelde analog işaretleme için kullanılabilir tayf yaklaşık 500 MHz’e kadar uzanıyor; geniş bant video kanalları ise 862 MHz’e kadar çalışıyor, bu, analog tavanın kabaca 1,7 katı. Bu bakırın çoklama iştahı yeni de değil: tek bir koaksiyel, frekansta bölünerek aynı anda 10.000’den fazla ses kanalı taşıyabiliyordu. Sayının bant karşılığı da hesaplanabilir: tek bir ses kanalı 4,2 kHz kaplar, on bin kanal toplamda 42 MHz eder.
Bu genişlemenin bedelini gürültü olarak ödüyorsun. Ara modülasyon gürültüsünü tek bantlı bir hatta hiç göremezsin; kanallar çoğaldıkça doğuyor ve birbirine bulaşıyor. Zayıflama da frekansa bağlı değişiyor: bandın üst ucundaki kanallar en çok kaybedenler oluyor ve sokaktaki yükselteçler asıl onların hatırına konuyor.
Yine de hız kazanmanın ucuz yolu sinyali güçlendirmek değil, daha çok frekans açmaktır. Sebebi Shannon biçiminde yazılı. Hesabı bu bakıra sok: 30 dB’lik sinyal-gürültü oranı doğrusal ölçekte 1000 eder ve hertz başına yaklaşık 9,97 bit/s’lik bir tavan verir. Tek bir kanaldan 1,6 Gbit/s almak için kuramsal olarak 160 MHz’lik bant gerekiyor. Gürültüyü bastırmak bu tavanı ancak logaritmik oynatır.
Aynı kanalda oturan iki ev aynı verimi almıyor. Baş uca yakın evin işareti temiz geliyor; sokağın ucundakinin işareti yükselteçlerden ve eklerden yıpranmış geliyor. Aynı bölümde tanıştığın uyarlamalı modülasyon bu farkı yönetir: koşul değiştikçe modülasyon şeması anında değişiyor ve kabul edilebilir hata oranında alınabilecek en yüksek hız seçiliyor. Segmentin kapasitesini bu yüzden evden eve farklı bulacaksın.
Veriyi kablo TV tesisatına bindirme fikri de yeni değil. Ethernet’in unutulmuş bir sürümü olan 10BROAD36, 10 Mbit/s’i geniş bant kablo sistemi üzerinden taşıyordu. İki istasyon arası 3.600 metreye kadar çıkabiliyordu.
Downstream neden upstream’den hızlı?
Kablo erişimini baştan asimetrik kuruyorlar. Downstream 40 Mbit/s ile 1,2 Gbit/s arasında değişiyor, upstream ise 30 Mbit/s ile 100 Mbit/s arasında kalıyor. Bandın alt ucunda iki yön arasındaki fark yalnızca 1,33 kat. Üst ucunda 12 kata çıkıyor.
Farkın kaynağı kanalın hızı değil. Downstream birden çok kanaldır ve kanal başına 1,6 Gbit/s’e çıkabilir. Upstream de çoklu kanaldır; kanal başına tavanı 1 Gbit/s. Kanal başına asimetri yalnızca 1,6 kat. Aradaki uçurumu açan tek değişken, her yöne ayrılan kanal sayısıdır. Kuşaktan kuşağa artan şey de budur: aynı bakırda daha çok kanal, daha çok frekans.
Peki kanal sayısını kim belirliyor? Cevap tesisatın en sıkıcı parçasında: band split (bölüşüm). Spektrumun neresine kadar upstream’in, neresinden sonra downstream’in oturacağı en baştan sabitlendi ve o karar bugün hâlâ evindeki hızı yazıyor.
| band split | upstream | downstream | upstream’e düşen bant |
|---|---|---|---|
| alt band split (klasik) | 5-42 MHz | 54-1002 MHz | 37 MHz |
| Avrupa band split’i | 5-65 MHz | 88 MHz üstü | 60 MHz |
| orta band split | 5-85 MHz | 108 MHz üstü | 80 MHz |
| yüksek band split | 5-204 MHz | 258-1218 MHz | 199 MHz |
| genişletilmiş (DOCSIS 4.0) | 5-396/492/684 MHz | 108-1794 MHz | 684 MHz’e kadar |
Klasik band split’teki (bölüşümdeki) oran çıplak: upstream’e 37 MHz, downstream’e 948 MHz — yaklaşık 25’e 1. Yükleme hızının indirme hızının yanında bu kadar cılız kalmasının asıl sebebi bir mühendislik sınırı değil, kırk yıl önce verilmiş bir spektrum kararı. Kablo TV yayın taşımak için kuruldu ve geri yön ilk tasarımda neredeyse hiç düşünülmedi; 5-42 MHz’lik şerit, bandın alt ucunda artan yerdi.
Band split’i (bölüşümü) değiştirmek bir yazılım güncellemesi de değil. Her yükseltecin içinde iki yönü birbirinden ayıran bir diplekser filtre var ve o filtre fiziksel bir parça. Orta ya da yüksek band split’e (bölüşüme) geçmek, sokaktaki her yükselteç kutusunu açıp o filtreyi elle değiştirmek demek — üstelik zincirdeki her birini, çünkü tek bir eski filtre kalırsa bütün segment eski band split’te (bölüşümde) kalıyor. Kablo operatörlerinin yükleme hızını yıllarca artıramamasının nedeni budur; indirme tarafında bir yazılım kuşağı yeterken, upstream için kamyon çıkması gerekiyor.
Kuşakların ne getirdiğini de tek tabloda görebilirsin:
| sürüm | yıl | downstream | upstream | getirdiği |
|---|---|---|---|---|
| DOCSIS 1.0 | 1997 | 40 Mbit/s | 10 Mbit/s | ilk standart |
| DOCSIS 2.0 | 2002 | 40 Mbit/s | 30 Mbit/s | upstream’de daha güçlü modülasyon |
| DOCSIS 3.0 | 2006 | ~1,2 Gbit/s | ~200 Mbit/s | kanal birleştirme |
| DOCSIS 3.1 | 2013 | ~5-9 Gbit/s | ~1-1,7 Gbit/s | OFDM/OFDMA, LDPC, 4096-QAM |
| DOCSIS 4.0 | 2017 | 10 Gbit/s üstü | 6 Gbit/s’e kadar | genişletilmiş spektrum, tam çift yönlü |
Sıçramayı yapan tek fikir 3.0’da: kanal birleştirme. Tek bir 6 MHz’lik kanala sıkışmak yerine 32 kanalı aynı modeme birlikte verirsin ve hızlar toplanır. 32 × 6 MHz = 192 MHz’lik bir bant, 256-QAM ile yaklaşık 1,2 Gbit/s eder. 3.1 ise kanal kavramını değiştirdi: tek tek 6 MHz’lik taşıyıcılar yerine 192 MHz genişliğinde tek bir OFDM bloğu koydu. Wi-Fi’ın aynı yıllarda geçtiği dönüşümün kablodaki karşılığı bu.
DSL ses ile veriyi aynı bakırda farklı frekanslara koyuyordu; kablonun downstream tavanı onun yaklaşık 23 katı. Ama iki hattın etiketi başka: telefon hattı santrale kadar o aboneye tahsislidir, kabloda ise evler baş uca giden erişim ağını paylaşır. Aynı frekans hilesi ikisinde de var; ayıran şey paylaşım modelidir.
Paylaşım bir kusur değil, mimarinin kendisi. Koaksiyel zaten twisted pair’den uzağa giden ve aynı hatta daha çok istasyon taşıyan kablo olarak seçilmişti; ortak hat sonradan eklenmedi. Sonucunu akşam saatlerinde görürsün. Downstream’deki 1,2 Gbit/s’i aynı segmentteki 200 hane aynı anda çekmeye kalkarsa haneye 6 Mbit/s düşer. Darboğaz yolun en dar halkasıydı; kablo erişiminde o halka çoğu zaman kendi sokağının içindedir.
Pasif optik ağda tek bir lif komşularla bölüşülüyordu; kabloda bölüşme fiberin bittiği yerde, bakırın üstünde sürüyor.
Segmentteki sırayı kim dağıtıyor?
Evdeki kablo modemin karşı ucunda, baş uçta duran bir cihaz var: kablo modem sonlandırma sistemi (Cable Modem Termination System, CMTS). Segmentteki bütün modemleri o zamanlar.
Modemin bu zincirdeki yeri veri iletişimi terminolojisinde adlandırılmıştır: bilgisayarlar DTE, modem DCE’dir. Bakırın frekans planını, dilim takvimini ve modülasyonu modem taşır; ona bağlanan makineler bunların hiçbirini bilmez.
Aralarındaki pazarlığı tanımlayan belirtimin adı DOCSIS, açılımıyla Data Over Cable Service Interface Specification. IEEE 802 ailesinde kablo modemlere ayrılan numara da 802.14’tür.
DOCSIS iki kez böler. Önce frekansı böler: upstream ile downstream ayrı kanallara düşer. Sonra zamanı böler: upstream dilimlere kesilir.
Downstream’de tek bir konuşmacı var, o da CMTS. Bu yüzden downstream’de çarpışma diye bir sorun yok. Bütün sorun upstream’in sorunudur. Kablo erişiminin upstream’i paylaşılan bir yayın ortamıdır. Eski Ethernet ve 802.11 ile aynı kutuda durur. Collision domain’i anahtar bölmüştü; kablo upstream’i o alanın sokak ölçeğinde geri gelmiş hâlidir.
Upstream’deki o dilimlerin adı mini dilimdir (minislot). Veri dilimi büyük, istek dilimi küçüktür. Dilimlerin bir kısmı belirli modemlere atanmıştır, bir kısmı yarışmaya açıktır; iki rejim aynı kanalda aynı anda çalışır. Takvimi downstream’den inen MAP çerçevesi taşır. Hangi modemin hangi upstream dilimini kullanacağını o söyler.
Bir modem dilim istemek için önce yarışır. İstek çerçevesini yarışmaya açık mini dilimlerde rastgele erişimle gönderir; çarpışırsa ikili geri çekilmeyle bekler ve yeniden dener. Sürenin rastgele olması şarttır. Sabit bir bekleme süresi kilidi açmaz. Aynı anda çarpışan iki modem, aynı süre sonunda yine aynı anda konuşur.
Ortam erişim protokolleri üç sınıfa ayrılır: kanal bölme, rastgele erişim ve sıra alma. DOCSIS üçünü de aynı kanalda kullanıyor. Saf kanal bölmenin kusuru düşük yükte ortaya çıkar: tek modem etkinken bile ona bandın 1/N’i düşer, gerisi boşa gider. Upstream’de bu yüzden seçilmedi.
Özet
Peki, ne öğrendik?
- Melez fiber koaksiyel: kablo erişimi tek ortam üstünde durmaz; omurga fiberdir, son adım koaksiyeldir ve ikisi tek bir dağıtım ağı olarak çalışır.
- Frekans bölmeli çoklama: televizyon kanalları, internet verisi ve kontrol trafiği aynı bakırda ayrı bantlarda ilerler; kablo interneti boş kalan banda sonradan yerleşti.
- Asimetri: downstream kanal başına 1,6 Gbit/s’e, upstream 1 Gbit/s’e çıktığına göre yönler arasındaki uçurumu kanalın hızı değil, kanal sayısı açıyor.
- Paylaşılan segment: evler baş uca giden erişim ağını ortak kullanır; tahsisli telefon hattında görülmeyen akşam yavaşlaması buradan doğar.
- DOCSIS: kablo modem ile CMTS arasındaki pazarlığı tanımlar ve iki kez böler, önce frekansı sonra upstream zamanını.
- Mini dilim: upstream kanalı atanmış ve yarışmaya açık dilimlere kesilir, istek çerçeveleri rastgele erişimle gönderilir, çarpışma ikili geri çekilmeyle çözülür.
Televizyona döşenmiş bir tesisat, paylaşılan bir yayın ortamı olarak veri taşımayı böyle öğrendi. İstek artık şehri de ülkeyi de geçti; peki okyanusun altından neyle geçecek?
Bölüm 56: Denizaltı Kabloları
Diyelim ki isteğin karşı kıyıdaki bir sunucuya gidiyor. Arada okyanus var.
Geçiş yine camın içinden olacak. Ama o camı okyanus tabanına döşemek, sokağa çekmekle aynı iş değildir. Altı bin kilometre boyunca sinyali ayakta tutan ne, ve bu geçiş sana kaç milisaniyeye mal oluyor?
Okyanusun altında ne var?
Dünya ölçeğindeki bağlantılar ağırlıkla denizaltı kablolarıyla kuruluyor ve bunu seçen kimse yok; başka bir yolu bulunmuyor. Denizaltı kablosu her kıtaya ve ada ülkelerinin çoğuna değiyor. Listenin dışında kalan tek kıta Antarktika.
Ölçeği sayıyla görmek gerekiyor. TeleGeography’nin 2026 haritasında 694 kablo sistemi sayılıyor. Aynı kaynak 1.893 karaya çıkış noktası listeliyor. Çıkış sayısının sistem sayısından büyük olmasının sebebi basit: bir kablo yol boyunca birden çok kıyıya birden değiyor. Döşenmiş kablonun toplam uzunluğu 1,5 milyon kilometreyi aşıyor. En uzun sistem 2Africa ve tek başına 45.000 km çekiyor.
Karadaki fiber iki biçimde gider. Ya gömülü bir kanalın içindedir ya da direkler arasında havai olarak asılıdır. Hangisinin seçileceğini coğrafya ve yerel mevzuat belirler. Denize giren hat bu iki seçeneğin de dışında kalır.
Suyun altındaki hattın iskeleti ise şaşırtıcı biçimde sadedir. Bir uçta gönderici, öteki uçta alıcı var. Kablonun karaya bağlandığı binaya kara istasyonu denir ve o binanın işi bu iki uçtan ibarettir. Arası camdır.
Tek bir lif genelde tek yön taşır. Çift yönlü çalışmak için ters yöne ayrı bir lif gerekir. Bu yüzden denizaltı hatları tek telle değil, fiber çifti sayısıyla anılır. Bir sistemin kapasitesi konuşulurken sayılan şey çift adedidir.
Bu ağın bir anda ortaya çıktığını da sanma. Denizaltı fiberi, telefon omurgası uzun mesafede fibere geçtikçe yayıldı. Uzun mesafe her zaman önce fiberleşir; yatırımın karşılığı en hızlı orada çıkar.
Gecikmeyi ışık hızı yazıyor
Işık hızı bir tavandır ve pazarlığa kapalıdır. Ama camın içinde ışık boşluktaki hızıyla ilerlemez. Core’un kırılma indisinden çıkardığın sayı burada da geçerli: cam içinde ışık 204.082 km/s gider, yani boşluktaki hızın kabaca üçte ikisi.
Bu ayrım sık sık kayboluyor. Fiberin hızı için saniyede 300 bin km yazılıyor. O rakam camın değil, boşluğun hızıdır. Fark sınav kâğıdında görünmez. Okyanus ölçeğinde milisaniyeye dönüşür.
Gecikmenin dört bileşeni içinde okyanus geçişinde baskın olan kuyruk değil yayılımdır. Yayılım gecikmesinin tek girdisi mesafe ile hızdır. İşlem yükü ya da hattın doluluğu bu sayıya karışmaz.
Somut bir geçiş kuralım. Uzunluğu 6.000 km olsun. Bölme işlemi tek yön için 29,4 ms veriyor. Gidiş-dönüş 58,8 ms eder ve bu sayı hiçbir donanım yükseltmesiyle küçülmez.
Aynı mesafeyi boşluktan geçirebilseydin tek yön 20 ms olurdu. Camın bedeli tek yönde 9,4 ms. Sonucu ikinci bir yoldan da doğrulayabilirsin: fiberde gecikme km başına 5 µs olarak verilir ve 6.000 km bunu 30 ms’e çıkarır. Stallings tek modlu fiber için 2,04x10^8 m/s veriyor ve aynı yere düşüyor. Üç yol da aynı büyüklükte buluşuyor.
Bu sayının bedelini zaten ödedin. üç el sıkışma bir gidiş-dönüş ister ve RTT bedeli okyanusun ötesinde 58,8 ms’ten başlar. Veri henüz akmamıştır. Bağlantı daha yeni kurulmuştur.
Sayı hesapta kalmıyor, çıktıda da görünüyor. Gerçek bir traceroute çıktısında ABD içindeki yedinci atlama 22 ms ölçüyor. Sekizinci atlamada ölçüm 104 ms’e sıçrıyor. Tek bir hat 82 ms ekliyor; kendinden önceki bütün atlamaların toplamından fazlasını. O sıçramayı yazan tek bir şey var: okyanus aşan hat.
Kendi makinende de deneyebilirsin.
traceroute -n example.com # Windows: tracert -d example.comHer satırda solda atlamanın sırası, sağda üç ayrı ölçüm durur; traceroute her atlamaya üç paket gönderir. Çıktıda bazı atlamaların bir öncekinden düşük gecikme göstermesi seni yanıltmasın. Her satırın ölçümü ayrı anlarda yapılır. Sıranın artarak gitme zorunluluğu yoktur.
Tek bir sayı istiyorsan yolun tamamı yerine doğrudan gidiş-dönüşü ölçersin.
ping -c 10 example.com # Windows: ping -n 10 example.comÇıktının son satırı en küçük, ortalama ve en büyük gidiş-dönüşü birlikte verir. Altı bin kilometrelik bir yolda en küçük değer 58,8 ms’in altına inemez; inerse yol o kadar uzun değildir.
Alternatifi de sayıyla duruyor. Geniş alan ağlarında ağlar arası bağlantı fiberle kurulabildiği gibi uydu üzerinden de sağlanabiliyor. Yer sabit uydu bağlantısında uçtan uca gecikme 270 ms. Kabloyla aynı geçişin gidiş-dönüşü 58,8 ms olduğuna göre uydu yaklaşık 4,6 kat pahalıdır. Bedelini yazan şey bant genişliği değil, yükseklik.
Sinyali altı bin kilometre boyunca kim ayakta tutuyor?
Kılavuzlu bir ortamda sinyal gücü mesafeyle üstel azalır ve alıcının okuyabileceği bir alt eşik var. Kayıp bütçesini dB/km ile kendin hesaplamıştın; okyanus geçişi aynı hesabı o eşiğin çok ötesine taşıyor.
Rakama dökelim. Sahada tipik değer 0,2 dB/km ve hesabı o alt uçtan kuruyorum. Altı bin kilometrelik bir hat hiç güçlendirilmezse 1.200 dB kaybeder. 3 dB’nin gücün yarısını götürdüğünü orada hesaplamıştın. 1.200 dB, sinyalden geriye hiçbir şey kalmaması demektir.
Çözüm hattı bölmektir. Fiberde tipik tekrarlayıcı aralığı 40 km. İki güçlendirme noktası arasında kayıp 8 dB’de kalır. 6.000 km’lik geçiş de yaklaşık 150 güçlendirme noktası ister. İki nokta arasındaki bu mesafeye güçlendirme aralığı denir ve bir ortamı ötekinden ayıran şey büyük ölçüde budur.
| Ortam | Güçlendirme aralığı |
|---|---|
| Twisted pair, sayısal iletim | 2-3 km |
| Twisted pair, analog taşıma | 5-6 km |
| Koaksiyel, sayısal işaretleşme | 1 km |
| Koaksiyel, analog iletim | 9 km |
| Fiber | 40 km |
Aynı karşılaştırmayı ortam ortam görmüştün; buradaki iş o satırları okyanus ölçeğine koymak.
Aradaki kutunun ne yaptığı da ayrı bir konudur. Yükselteç sinyali büyütür, ama gürültüyü de birlikte büyütür. Art arda dizilen yükselteçlerde bozulma birikir ve sayısal veride hataya dönüşür. Sayısal tekrarlayıcı başka bir iş yapar. Gelen sinyalden bir ve sıfır örüntüsünü geri kazanır, sonra yepyeni bir sinyal üretir. Gürültü böylece taşınmaz.
Tekrarlayıcı birinci katman cihazıydı; okyanus tabanındaki kutunun verecek bir kararı yoktur, işi sinyali ayağa kaldırmaktan ibarettir.

Evine gelen fiberin sokaktaki ayırıcısı pasifti, hiç elektrik istemiyordu. Deniz tabanındaki kutu bunun tersidir: elektrik ister, çünkü içinde bir optik yükselteç durur. Lifin taşıdığı bant 186 THz ile 370 THz arasında uzanır ve yükselteç o bandın tamamını tek seferde kaldırır; kanalları tek tek ayırmak gerekmez.
Fiberin uzun mesafedeki asıl üstünlüğü de burada. Her güçlendirme noktası bir maliyet kalemi ve bir arıza adresidir. Fiberde açıklık 40 km’den başlıyor ve 100 km’yi aşan sistemler gösterilmiş durumda. Bakır aynı yolda birkaç kilometrede bir güçlendirme ister. Okyanusu bakırla geçmenin bedeli budur.
Kablo koptuğunda ne oluyor?
Okyanus tabanındaki bir kablo kopmaz sanılıyor. Kopuyor, hem de düzenli olarak: dünya genelinde yılda ortalama iki yüz civarında arıza kaydediliyor ve bu sayı on yılı aşkın süredir şaşırtıcı biçimde sabit — oysa aynı dönemde döşeli kablo uzunluğu 1,5 milyon kilometreden 2,7 milyon kilometreye çıktı. Sayının artmamasının sebebi daha iyi haritalama, daha ağır zırh ve daha derine gömme.
Arızanın sebebi neredeyse hiç köpekbalığı değil. Arızaların üçte ikisi ile beşte dördü arasındaki bir pay insan kaynaklı ve kazara: dip trolü yapan balıkçı tekneleri ve sürüklenen çapalar. Tek başına çapa sürüklemesi arızaların yaklaşık üçte birini üretiyor. Sabotaj ve deniz canlıları listenin en altında kalıyor.
Coğrafyası da bunu doğruluyor. Arızaların ezici çoğunluğu sığ sularda, kıyıya yakın kesimlerde oluyor — çünkü gemiler orada demirliyor ve ağlar orada dibe değiyor. Kablo tasarımı buna göre yapılıyor: derin okyanus kesimi zırhsız ve ince, kıta sahanlığındaki kesim kat kat çelik zırhlı ve çoğu zaman deniz tabanına gömülü.
Onarım deniz işi olduğu için yavaş. Bir kablo gemisi bölgeye gidiyor, arızanın yerini elektriksel olarak ölçüp buluyor, çapalı bir kanca ile kabloyu dipten yakalıyor, kesiyor, iki ucu ayrı ayrı yüzeye çıkarıyor, aradaki hasarlı parçanın yerine yeni bir kablo ekliyor ve bütün hattı geri indiriyor. Telekom kablolarında tipik onarım süresi 10 ile 20 gün arasında; hava, izin ve gemi bulunabilirliği bunu aylara çıkarabiliyor. Dünyada bu işi yapabilen gemi sayısı altmış civarında.
Buradan tek bir mühendislik sonucu çıkıyor ve internetin şeklini doğrudan belirliyor: hiçbir ciddi trafik tek bir kabloya bağlanmaz. Operatörler aynı iki nokta arasında birden çok kablo üstünde kapasite satın alır ve bir kablo koptuğunda trafik ötekilere kayar. Yol seçimini yapan protokol, o kayışı saniyeler içinde yapan mekanizmadır. Yedeklilik burada bir konfor değil, tek çare.
Kablo karaya çıkınca kime bağlanıyor?
Kablonun bir ucu senin taşıyıcına, öteki ucu başka bir ülkenin taşıyıcısına bağlanır. Tek bir küresel taşıyıcı olsaydı iş kolaydı. Ama o fikir kendi kendini bozar. İş modeli tutuyorsa rakipler çıkar, rakipler de birbirine bağlanmak zorunda kalır.
Bağlanmanın iki yolu var. Taşıyıcılar ortak bir internet değişim noktasına girip orada buluşur. Ya da aralarına doğrudan bir eşleme hattı çekerler. İkisi de aynı soruyu cevaplar: senin paketin başka bir şirketin ağına tam olarak nerede geçiyor?
Arada bir kat daha var. Erişim ağlarını büyük taşıyıcılara bağlamak için bölgesel ağlar oluştu. Bu hiyerarşiyi kimse masa başında tasarlamadı; ticari ihtiyaç kendi şeklini buldu. Merkezde az sayıda ve birbirine çok bağlı büyük ağ duruyor. Ulusal ile uluslararası kapsamayı onlar taşıyor.
Otonom sistemler birbirine eşleme ve geçiş anlaşmalarıyla bağlanıyordu ve bu karar politika taşıyordu. O anlaşmaların fiziksel karşılığı kablonun karaya çıktığı binadır. Coğrafya yönlendirme kararına da giriyor: bir hattın maliyeti fiziksel uzunluğunu yansıtabilir ve okyanus aşan hat kısa karasal hattan pahalı sayılır.

Son kat en yenisidir. İçerik sağlayıcılar veri merkezlerini kendi özel ağlarıyla internete bağlıyor. Bu ağlar çoğu zaman hem birinci kademeyi hem bölgesel taşıyıcıyı atlıyor. Okyanusu kendi kablosuyla geçen şirket işte burada doğdu.
Özet
Peki, ne öğrendik?
- Okyanusu cam geçiyor: dünya ölçeğindeki bağlantılar ağırlıkla denizaltı kablolarıyla kuruluyor ve Antarktika dışındaki her kıta bu ağa bağlı.
- Gecikmeyi mesafe belirliyor: 6.000 km’lik bir geçiş 204.082 km/s ile tek yönde 29,4 ms, gidiş-dönüşte 58,8 ms tutar ve bu sayı donanımla küçülmez.
- Zayıflama hattı bölüyor: 0,2 dB/km ile 6.000 km hiç güçlendirilmezse 1.200 dB kaybeder; 40 km aralıkla aynı hat yaklaşık 150 noktada güçlendirilir.
- Yükselteç ile tekrarlayıcı aynı iş değildir: yükselteç gürültüyü de büyütür, sayısal tekrarlayıcı örüntüyü geri kazanıp yepyeni bir sinyal üretir.
- Kablo karada ağlara bağlanır: taşıyıcılar internet değişim noktalarında ve doğrudan eşleme hatlarında buluşur, içerik sağlayıcılar ise kendi ağlarıyla bu katları atlar.
Okyanusu geçtin. Kablo hedef şehirde karaya çıktı ve isteğin seni bekleyen binaya girdi. Peki o binanın içindeki ağ, dışarıda geçtiğin ağa benziyor mu?
Bölüm 57: Veri Merkezi Ağları
Okyanusu geçen istek bir binanın kapısından girdi. O binanın içini şimdiye kadar tek bir kutu gibi çizdim; perdeyi kaldırıyorum.
İçerideki ağ dışarıdakine benzemiyor. Tek bir isteği karşılamak için makineler yan odadaki komşularıyla konuşuyor. Bu ağ neye göre kuruluyor?
Rafın tepesindeki kutu oraya kabloyla kondu
Veri merkezi, on binlerce makineyi aynı çatı altında ve birbirine yakın çalıştıran bir tesistir. Bu yakınlık tesisin en temel tasarım kararı. Makineler birbirine bağımlı çalışıyor ve aralarındaki her metre gecikmeye yazılıyor.
Fiziksel birim raftır. Bir rafa kaç sunucu gireceğini tepedeki anahtarın port sayısı belirliyor; 48 portluk bir kutunun altında kırk sunucu rahat durur. Bir rafı kalabalık bir mahalle gibi düşünebilirsin. Bu mahallenin ağa açılan kapısı tepedeki raf üstü anahtardır, kısaca TOR. Adı yerinden geliyor. Altındaki sunuculara 100 Gbit/s ile 400 Gbit/s arasında Ethernet bağlantılarıyla iner.
Kutuyu tepeye koymanın sebebi kabloda. 42 birimlik bir kabinet 44,45 mm’lik kırk iki dilim, yani yaklaşık 1,87 metre yükselir. Doğrudan bağlantı bakır kablosu ise 1 ile 7 metre arasında satılır. Tepeden inen 3 metrelik pasif bir kablo kabinetin her sunucusuna yetişiyor; 7 metrelik olanı bile komşu sıraya geçemiyor. Anahtarın neden ortada değil de tepede durduğunu bu iki sayı açıklıyor.
Structured cabling’in (yapısal kablolamanın) yatay ve dikey dağıtımı tanıdık; veri merkezinde o dikey dağıtımın tamamı tek bir kabinetin içine sığıyor.
O kablonun kendisi de bu tesise özgüdür. Fiberdeki SFP+ modülünün aynısını takar ama içindeki pahalı lazerleri bırakır. İki ucundaki modüllerle birlikte sabit boyda satılır; ucundan kesip uzatamazsın. Kısaltması 10GSFP+Cu’dur ve 802.3’te tanımlı değildir. Adı kabloyu geliştiren üreticilerden kalmıştır.

Bir portun dörde bölündüğü de oluyor. Tek bir QSFP+ portu ya 40 Gbit/s’lik tek bir arayüz olur ya da dört bağımsız 10 Gbit/s arayüze ayrılır. Sebebi şeritlerdir. 40 Gbit/s sinyalinin her şeridi zaten tek başına 10 Gbit/s standardının aynısıdır. Ayırmayı bir ucu tek, öbür ucu dört modüllü breakout kablosu yapar.
Üç kat neden ikiye indi
Rafların üstündeki düzen uzun süre üç katlıydı. Her toplama anahtarı altındaki yaklaşık on altı raf üstü anahtarı topluyordu. Her çekirdek anahtarı da yaklaşık on altı toplama anahtarını topluyordu. Dışarıya çıkış sınır yönlendiricilerinden oluyordu.
Bu miras kampüs ağından geldi: çekirdek, dağıtım ve erişim. Kampüsün sert kuralı da beraberinde geldi. En alttaki anahtarlar yalnızca dağıtım katmanına bağlanır, birbirine bağlanmaz. Yatay yollar açmak dokuyu karmaşık bir örgüye çevirir.
Modern doku iki katlıdır. Aşağıda aynı raf üstü anahtarlar duruyor; iki katlı düzende onların adı yaprak oluyor. Yukarıda ise yalnızca yaprakları birbirine bağlayan omurga anahtarları var. Kaybolan kat, gecikmenin ve karmaşıklığın büyük kısmını da götürüyor.
Kazancı saymak kolay. İki katlı dokuda en uzun yol yaprak, omurga, yaprak eder: üç anahtar. Üç katlı hiyerarşide aynı yol erişim, toplama, çekirdek, toplama, erişim eder: beş anahtar. Üstelik yaprak-omurgada bu sayı her sunucu çifti için aynıdır.
Bağlantı derecesi de küçük kalmıyor. F16 adlı gerçek bir dokuda her yaprak on altı doku anahtarına bağlanır. Her doku anahtarı da on altı omurga anahtarına bağlıdır. Yaprak tek bir üst kata değil, on altı ayrı kutuya birden asılıdır.
Bütün bunların sebebi trafiğin yön değiştirmesidir. Bir sayfa isteği içeride onlarca servise dağılıyor ve o servisler birbirini çağırıyor. Baskın akış dışarıya inen dikey trafik olmaktan çıkıp raflar arasında yatay akan doğu-batı trafiğine dönüşüyor. Yerleştirme de bu yüzden bir ağ kararıdır. İlişkili servisler ve veriler aynı rafa ya da komşu rafa konur. Üst kata çıkan yük böyle azalır.
Dikeyde kalan kısım sınır yönlendiricilerinden binayı terk ediyor. Ağlar internet değişim noktalarında birbirine dokunuyordu; bu tesisin dış kapısı da oraya açılıyor.
Bir yönlendiricinin içindeki anahtarlama dokusunu açmıştık; burada aynı fikir kutu ölçeğinden bina ölçeğine büyütülmüş durumda.
Aynı çift arasında altı yol açık
Zengin ara bağlantının iki ayrı kazancı var. Raflar arası throughput artıyor, çünkü aynı iki raf arasında birden çok yönlendirme yolu var. İkincisi yedekliliktir: o yolların ortak hiçbir bağlantısı yoktur. Bir omurga ya da bir kablo ölünce trafik komşu yola kayıyor.
Yol sayısını omurga sayısı belirler. Yaprağında altı upstream bağlantısı taşıyan bir dokuda altı omurga vardır. Her yaprak hepsine birden bağlıdır. İki yaprak arasında da altı eşit maliyetli yol açık kalır.
Dokunun büyüklüğünü omurganın port sayısı belirler. 32 portlu omurgalar 32 yaprak taşır. Her yaprakta 48 sunucu portu varsa doku 1.536 sunucuya çıkar.
Yaprak ile omurga katlarının nasıl örüldüğünü görelim:
- Her yaprak her omurgaya bağlı. Şemada doku üçe küçültüldü: üç omurga, üç yaprak. Yaprak yalnızca sunucuları taşır, omurga yalnızca yaprakları bağlar. İki yaprak arasında yatay kablo yoktur.
- A ile C arasında ilk yol. Soldaki yapraktan çıkan trafik ortadaki omurgaya çıkıyor ve sağdaki yaprağa iniyor. Uçtan uca üç anahtar geçiliyor ve bu sayı her yaprak çifti için aynı.
- Aynı çift arasında üç yol. Diğer iki omurga da aynı iki yaprağa bağlı olduğundan üç eşit maliyetli yol var. Yolların ortak hiçbir bağlantısı yok; gerçek dokuda sayıları omurga sayısı kadar.
- Ortadaki omurga ölüyor. Bir kutu ya da bir kablo ölünce o omurgadan geçen bütün bağlantılar birden gider. Üçte bir kapasite kayboluyor, ama iki yaprak arasındaki bağ kopmuyor.
- Trafik komşu yola kayıyor. Kalan yollardan biri devralıyor ve akış sürüyor. Yayılan ağaç bu dokuda çalışsaydı yolların ikisi zaten kapalı olurdu ve tek yolun ölümü rafı ağdan koparırdı.
Yolların hepsinin aynı anda açık kalması kendiliğinden olmuyor. Spanning Tree Protocol (yayılan ağaç protokolü) döngüyü şöyle kesiyordu: paralel bağlantılardan yalnızca biri etkin bırakılır, gerisi mantıksal olarak kapanır. Veri merkezinde bu, satın alınan kapasitenin çoğunu ölü tutmak demektir. Klasik kaçış yolu Katman 3’e çıkmaktır. Yönlendiriciler spanning tree çalıştırmaz ve paralel bağlantıların hepsini birden etkin tutar.
İkinci yol bağlantıları birleştirmektir. IEEE 802.1AX bağlantı toplama standardı paralel bağlantıları tek bir sanal kanal gibi kullanır. Gigabit bağlantılar 2, 4 ve 8 gigabit/s kanallara toplanır. 10 gigabit bağlantılarda tavan 80 gigabit/s olur. Standart önce 802.3ad adıyla yayımlanmıştı.
Aynı numaranın dayanıklılık sürümü de var. Sunucu aynı sıradaki iki ayrı anahtara birden bağlanır. İki kutunun üstündeki yazılım ona tek anahtar gibi görünür. Sunucu standart bağlantı toplama yaptığını sanır. Bir port, hatta bütün bir anahtar ölse bile ağdan kopmaz.
Darboğaz nereye kurulur, kayıp nasıl karşılanır
Bir yaprağın iki yüzü vardır. Aşağı yüzünde 48 sunucu portu duruyor; her biri 100 Gbit/s ise downstream 4.800 Gbit/s eder. Üst yüzünde altı upstream bağlantısı var; her biri 400 Gbit/s ise toplam 2.400 Gbit/s eder. Oran iki katına bir. Bu kasıtlı bir eksikliktir ve adı aşırı aboneliktir.
Aynı yaprağı bloklamayan yapmak zor sayılmaz. Yukarıya 400 Gbit/s’lik on iki bağlantı koyarsın ve iki yön eşitlenir. Bedeli altı ek porttur — hem yaprakta hem omurgada. Bloklamayan tasarımın tanımı da budur: bütün portların aynı anda azami başarımda çalışabilmesi. Yüzlerce yüksek hızlı portta bunu sağlamak pahalıya patlar.
Aşırı aboneliği ayakta tutan gözlem şudur: Ethernet bağlantıları ortalamada düşük hızda çalışır, aralara yüksek hızlı patlamalar serpiştirilir. Bütün sunucular aynı anda tam hızda konuşursa yukarıda her birine ancak %50 düşer. Anahtarın kendi iç dokusu yine de bloklamayan üretilir. Darboğaz kutunun içinde aranmaz, upstream’e kasten bırakılır.
Darboğazın yeri bilindiği için kayıp da başka türlü karşılanıyor. Tampon dolduğunda etkin kuyruk yönetiminin iki kolu vardı: düşürme ve işaretleme. Veri merkezi ikinci kolu seçiyor. Tıkanıklık denetimi açık tıkanıklık bildirimi üzerine kuruluyor ve bu ailenin adları DCTCP ile DCQCN; sekme sekme geri baskı üzerinde de deneme yapılıyor.
Sebebi bağ katmanının kendi buluşundadır. RoCE ile uzak doğrudan bellek erişimi yakınsanmış Ethernet üzerinde taşınır. Bir makine karşı makinenin belleğine işletim sistemini araya sokmadan yazar. Böyle bir aktarımda tek bir kayıp paket çok pahalıya mal olur.
En sert fren bağ katmanındadır. PAUSE çerçevesi karşı tarafa bir süre susmasını söyler ve o süre quanta biriminde ölçülür.
hedef 01-80-C2-00-00-01 PAUSE için ayrılmış çoklu yayın adresi
tip 0x8808 MAC denetim çerçevesi
işlem 0x0001 PAUSE
süre 0 - 65.535 quanta her quanta 512 bit süresiAdres 48 bitliktir. 802.1D uyumlu bir anahtar onu diğer portlara iletmez; çerçevenin kendi içinde işleneceğini anlar. PAUSE yalnızca çift yönlü çalışan istasyonlardan gönderilir. Sürenin karşılığı bağlantı hızına bağlıdır: 100 Gbit/s’te bir quanta 5,12 ns, azami duraklama 335,5 µs olur. Aynı istek 10 Gbit/s’te 3,36 ms tutar; hız düştükçe aynı quanta sayısı daha uzun bir sessizliğe karşılık gelir.
Bir de çerçeve boyu var. Bir anahtarın veri sayfasında jumbo çerçeve desteği 9.720 bayta kadar yazar. İnternetin tamamı ise 1.500 baytlık standart sınırla çalışır. Aradaki oran altı buçuk kat, yani aynı veri için başlık işleme sayısı o kadar seyreliyor. Jumbo çerçeve de yalnızca iki ucunu senin yönettiğin bir küme içinde işe yarar.
Özet
Peki, ne öğrendik?
- Raf üstü anahtar. Rafın tepesindeki kutu oraya bakır kablonun bir ile yedi metrelik boyu yüzünden konur.
- Yaprak-omurga. İki katlı doku üç katlı hiyerarşinin yerini aldı ve iki sunucu arasındaki mesafeyi her çift için üç anahtara sabitledi.
- Doğu-batı trafiği. Veri merkezinde baskın akış raflar arasında yatay akar, bu yüzden ilişkili servisler bilerek komşu raflara yerleştirilir.
- Aşırı abonelik. Downstream ile upstream arasındaki oran kasten eşitlenmez, çünkü bağlantılar ortalamada düşük hızda çalışıp aralara patlama serpiştirir.
- Kayıpsız taşıma. Tıkanıklık işaretlemeyle bildirilir ve gerektiğinde PAUSE çerçevesi bağı doğrudan durdurur.
Doku kuruldu, yol seçildi ve paket rafın içindeki sunucuya kadar geldi. Peki üstüne katman katman sarılmış bu zarfı o makine nasıl açıp okuyacak?
Bölüm 58: Kapsülleme Çözme
Paket rafın tepesindeki anahtardan geçip içerideki sunucunun kartına düştü. Makine onu henüz okumadı; okumak için önce soyması gerekiyor.
Gidişte takılan her zarf, gelişte ters sırayla açılıyor. Kartın elinde şimdilik bir bit dizisi var. Senin yazdığın satır oradan nasıl çıkacak?
Kart çerçeveyi neye bakarak kabul ediyor?
Kablodan gelen bitler karta sırayla düşüyor. Çerçeveyi baştan okumaya kalksan ilk göreceğin şey veri olmaz: önde 7 baytlık bir önsöz ve 1 baytlık SFD duruyor. Bu 8 bayt çerçeve uzunluğu hesabına girmiyor; işleri tek, alıcının saatini gelen bitlerin ritmine oturtmak.
Kart kablodaki her çerçeveyi en azından hedef adres alanına kadar okuyor, adres kendisine ait değilse gerisini okumadan bırakıyordu.
Çerçevenin sonunda ise 4 baytlık bir FCS alanı buluyorsun; gönderen onu yola çıkmadan önce yazmış oluyor. Döngüsel artıklık denetimi sezme ile düzeltme arasına bir sınır çekiyordu; alıcı burada aynı hesabı tekrarlayıp sonucu alandaki değerle karşılaştırıyor.
Sıraya dikkat et, çünkü bağlayıcı. Çerçeve alındığında önce FCS sınanıyor; sonuç tutmuyorsa hedef MAC adresine hiç bakılmadan çerçeve atılıyor. Adres elemesini bitler akarken yapılan bir hızlandırma olarak düşün; kabul kararını asıl veren şey sağlama.
Gönderene haber vermenin de bir yolu yok, ve sebebi düşündüğünden basit: hasar görmüş olabilecek alanlardan biri Kaynak Adres alanının kendisi. Haberin gideceği adres de şüphelilerin arasında. Çerçeve bu yüzden sessizce düşüyor.
İki sınamadan da geçen çerçeve karta ait tampona yazılıyor; ancak ondan sonra üst katmanların gündemine girebiliyor. Ağ kartı kablonun ucunda duran ayrı bir işlemciydi; halka tampona düşenler işte bunlar. Elenen çerçeve ise hiçbir yere yazılmıyor; makinenin geri kalanı onun geldiğini bile duymuyor. Sayaç tutmasan varlığından haberin olmaz. Bu kabul kararı, ters kapsülleme zincirinin ilk halkası.
Her zarf açılırken aynı soruyu cevaplıyor
Kart zarfı atmadan önce bir alanı daha okuyor. Ethernet adreslerinin hemen ardından gelen 16 bitlik tür alanına bakıyor ve içeride hangi üst katman protokolünün durduğunu oradan öğreniyor. Alıcı paketi hangi yığına vereceğini buradan öğreniyor.
Port numarasıyla tanıdığın çoklama çözmenin burada her katmanda bir kez tekrarlandığını göreceksin. Sorulan şey her seferinde aynı kalıyor: içindeki nedir? Zarfların bu sırayla açılmasına ters kapsülleme deniyor.
Kargo benzetmesinde her görevli yalnızca kendi etiketine bakıyordu; soyulmada da her katman kendi etiketini okuyup içindekini bir üstüne uzatıyor. Benzetme yine aynı yerde bitiyor: kimse üsttekinin etiketini yorumlamıyor.
Kapsülleme merdivenini inerken saydığın 18 baytlık sabit zarf burada ters yönde açılıyor; kartın kabul aralığı da o tablodan çıkıyor, 64 ile 1.518 bayt. Soyma bittiğinde kenara atılan başlık toplamı 58 bayt eder: 18 baytlık çerçeve zarfı ve 20’şer baytlık IP ile TCP başlıkları. Tam boy bir çerçevenin %3,8’i. En küçük çerçevede aynı hesap acımasız çalışıyor: 46 baytlık veri alanının 40 baytını iki başlık yiyor, uygulamaya 6 bayt kalıyor. Küçük paket göndermenin neden pahalı olduğunu bir kez bu sayının üstünde gör; bir daha unutmazsın.
IP başlığında aynı soruyu 8 bitlik Protokol alanı cevaplıyor. Süzme kuralları yazarken kullandığın numaralar — TCP 6, UDP 17 — burada ikinci zarfı kimin açacağını söylüyor. Alan bir sayı taşıyor, protokolün adını değil.
Aynı soruyu üçüncü kez taşıma başlığında soruyorsun ve cevabı hedef port veriyor. Bu üçüncü cevap artık bir protokolü değil, o makinede çalışan tek bir uygulamayı gösteriyor.
Hedef uç sistem de tıpkı bir yönlendirici gibi datagramı ağ sargısından çıkarıyor. Fark tek bir adımda: yönlendirici onu yeniden sarıyor, hedef makine sarmıyor.
IPv4 başlığının kendi sağlaması 16 bit ve yalnızca başlığa uygulanıyor; veri alanı bu hesaba hiç girmiyor. TTL ile parçalanma alanları yolda değiştiği için sağlamayı her yönlendirici yeniden doğrulayıp yeniden hesaplıyor. Yani hedefe varan sağlama değerini gönderen yazmamış oluyor; onu yolun son yönlendiricisi yazıyor.
Şimdi iki sağlamayı yan yana koyalım, çünkü güçleri hiç aynı değil. FCS 32 bitlik olduğu için 4.294.967.296 farklı sonuç üretiyor; bozulmuş bir çerçevenin doğru değeri rastgele tutturma olasılığı kabaca %0,000000023 kalıyor. Başlıktaki 16 bitlik alanda aynı olasılık %0,0015’e çıkıyor. Ucuz olan alan, kabloyu değil yolda değişen başlığı korumak için seçilmiş.
Datagram parçalanmışsa birleştirmeyi yalnızca burada göreceksin; ara yönlendiriciler parçaları taşıyor ama toplamıyor. Aynı kimlik değerini taşıyan parçalar geldikçe veri alanları tampondaki doğru konuma yerleşiyor. Birleşme, ofset sıfırdan başlayan kesintisiz bir dizi oluştuğunda ve More bayrağı sıfır olan parça geldiğinde tamamlanıyor. Bir parça hiç gelmezse zamanlayıcı doluyor ve eldeki bütün parçalar atılıyor; sekiz parçadan yedisi elinde olsa bile hiçbir işine yaramıyor.
Bir datagramı yolun sonuna getirmeyen üç sebep var ve üçü de bu bölümde geçti: ömrünün dolması, tıkanıklık, ve sağlamanın tutmaması.
Segment doğru sürece nasıl teslim ediliyor?
Taşıma katmanı makineleri değil süreçleri birbirine bağlıyor. Süreç, bir makinede çalışmakta olan bir program örneği; şu anda kendi makinende yüzlercesi birden koşuyor.
Yığındaki her katmanın kendi kimlik kavramı var ve üçünü de tanıyorsun: kart MAC adresiyle, düğüm IP adresiyle, uygulama da port numarasıyla anılıyor. Katmanlı mimarinin arayüz sözleşmesi gereği her kimlik kendi katmanının başlığında taşınıyor.
Soket bu kimliklerin üçünü tek adda topluyor: taşıma katmanı protokolü, IP adresi ve port numarası. MAC adresini o üçlünün içinde arama; çerçeve çoktan soyuldu.
Konuşmayı tanıyan four-tuple burada bir değer daha kazanıyor. Taşıma protokolü de kimliğin parçası; TCP’nin protokol numarası 6 ve four-tuple’ı five-tuple’a (beşli) çıkaran değer o. Somut vakada sunucu 203.0.113.10 üzerinde 443 numaralı portu dinliyor, istemci ise 198.51.100.7 üzerinden 51844 numaralı portla bağlanıyor.
UDP tarafında alıcının üç işi var: IP’den segmenti almak, sağlama alanını denetlemek ve mesajı soket üzerinden uygulamaya çıkarmak. Sağlamanın kapsamı taşıma başlığıyla sınırlı kalmıyor; UDP başlık alanlarının yanında IP adreslerini de içine katıyor.
Teslim noktasında bir tampon buluyorsun. TCP alıcı tamponunun boyutunu soket seçenekleriyle ayarlayabiliyorsun; tipik varsayılanı 4.096 bayt. Bunun ne kadar dar olduğunu görmek için böl: 1.460 baytlık tam boy bir segmentten oraya yalnızca 2,8 tanesi sığıyor. Birçok işletim sistemi bu değeri kendiliğinden büyütüyor.
Tamponu iki uç birden işletiyor: ağ katmanı içine yazıyor, uygulama da okuyarak boşaltıyor. Uygulaman yavaş okursa boş yer eriyor ve alıcı kalanı TCP başlığındaki rwnd alanıyla karşıya bildiriyor.
Erimeyi çıplak gözle de görebilirsin. netstat -tan çıktısındaki Recv-Q sütunu, uygulamanın henüz almadığı veriyi bayt olarak gösteriyor:
$ netstat -tan
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 32120 0 203.0.113.10:443 198.51.100.7:51844 ESTABLISHEDSunucu yavaşladıkça o sütun büyüyor. Senin isteğin de bu satırın kuyruğunda bekliyor ve sunucu süreci onu oradan okuyor.
Aynı anda yüz bin kişi varsa?
Buraya kadar tek bir bağlantıyı izledik. Gerçek bir sunucuda o satırın yanında on binlerce satır daha var ve bu, kitabın şimdiye kadar sormadığı bir soruyu doğuruyor: tek bir makine bu kadar soketi nasıl taşıyor?
Kapıda iki kuyruk var, ikisi de çekirdekte. Gelen SYN paketleri yarı açık kuyruğa düşüyor; bu kuyruğun taşırılması bir saldırı yöntemiydi. El sıkışma tamamlanınca bağlantı ikinci kuyruğa, kabul kuyruğuna geçiyor ve orada uygulamanın onu almasını bekliyor. Bu kuyruğun derinliğini uygulama kendisi bildiriyor. Uygulama almakta geri kalırsa kuyruk dolar ve yeni bağlantılar sessizce düşer — istemci tarafında bu, “sunucu var ama cevap vermiyor” diye görünür.
Asıl soru kabul edildikten sonra başlıyor. En sade tasarım her bağlantıya bir iş parçacığı vermek: kod okunaklı olur, çünkü her parçacık kendi bağlantısını baştan sona takip eder. On bin bağlantıda çöküyor. Her parçacığın kendi yığını var, ve çekirdeğin on bin parçacık arasında sıra dağıtması işin kendisinden pahalıya geliyor. Bu duvarın literatürdeki adı C10K problemi.
Çıkış yolu tasarımı tersine çevirmekten geçti: her bağlantıya bir parçacık verme, tek bir parçacığa bütün bağlantıları sor. Uygulama çekirdeğe “şu soketlerden hangisinde okunacak veri var?” diye soruyor ve yalnızca hazır olanlarla ilgileniyor. Buna olay döngüsü deniyor.
Sorunun nasıl sorulduğu ise otuz yıllık bir iyileştirme hikâyesi ve tek bir kusurun etrafında dönüyor.
İlk yöntemler her turda bütün listeyi çekirdeğe veriyor ve çekirdek onu baştan sona tarıyordu. Yüz bin soketin durumunu sormak, yüz bin soketi tek tek yoklamak demekti — oysa o an belki üçünde veri vardı. Maliyet soket sayısıyla büyüyordu.
Bugünkü yöntem listeyi bir kez kaydediyor ve her turda yalnızca hazır olanları döndürüyor. İş artık soket sayısıyla değil olay sayısıyla orantılı: doksan dokuz bin dokuz yüz doksan yedi sessiz soket hiçbir maliyet üretmiyor. Bugün bildiğin her yüksek başarımlı sunucu bu kapıdan geçiyor.
Tek bir olay döngüsü de tek bir işlemci çekirdeğini doldurabiliyor. İkinci hamle aynı kapıya birden çok bekleyen koymak: çekirdek gelen bağlantıları bunlar arasında kendisi dağıtıyor ve her işlemci çekirdeğine ayrı bir kabul kuyruğu düşüyor.
Kalan darboğaz veriyi kopyalamakta. Bir dosyayı ağa göndermek klasik yolla dört kopya istiyor: diskten çekirdeğe, çekirdekten uygulamaya, uygulamadan çekirdeğe, çekirdekten karta. Ortadaki iki kopya tamamen gereksiz — uygulama veriye bakmıyor bile. Modern işletim sistemleri onları atlayıp veriyi çekirdeğin içinden doğrudan karta geçirebiliyor; yöntemin adı sıfır kopya. Statik dosya sunucularının bu kadar az işlemci harcamasının sebebi bu.
Son darboğaz ağ kartının kendisinde. Kart bütün gelen trafiği tek bir kesme hattından bildirirse, o kesmeyi işleyen tek bir çekirdek dolar ve makinenin geri kalanı boş kalır. Modern kartlar bu yüzden çok kuyruklu: gelen her paketin soket four-tuple’ından bir özet çıkarıp paketi o özete karşılık gelen kuyruğa koyuyorlar ve her kuyruk ayrı bir çekirdeğe bağlanıyor. Yöntemin adı alış tarafı ölçekleme. Aynı akışın bütün paketleri hep aynı çekirdeğe düşüyor, böylece hem önbellek ısınıyor hem de sıra bozulmuyor.
Dördü birlikte okunduğunda ortaya tek bir cümle çıkıyor: ölçek, işi hızlandırarak değil gereksiz işi kaldırarak geliyor. Taranmayan liste, kopyalanmayan bayt, beklemeyen parçacık.
Özet
Peki, ne öğrendik?
- Adres elemesi. Elemeden geçen çerçeve karta ait tampona yazılıyor, elenen çerçeve ise hiçbir yere yazılmıyor.
- Sağlama önceliği. FCS tutmayan çerçeve hedef MAC adresine hiç bakılmadan atılıyor; kabul kararının sahibi adres değil, sağlama.
- Sessiz düşüş. Bozuk çerçeve için gönderene haber gitmiyor, çünkü hasarlı olabilecek alanlardan biri Kaynak Adres alanının kendisi.
- Çoklama çözme. Tür alanı, Protokol alanı ve hedef portu aynı soruyu üç kez cevaplıyor: bu zarfın içindekini kim alacak?
- Teslim kimliği. Segmenti doğru sürece ulaştıran şey adreslerle portların birleşimi, ve protokolle birlikte bu kimlik beş değere çıkıyor.
- Ölçek gereksiz işi kaldırmaktan geliyor. Bağlantı başına bir iş parçacığı on binde çöküyor; olay bildirimi soket sayısı yerine olay sayısıyla çalışıyor, sıfır kopya ara kopyaları atlıyor, çok kuyruklu kart kesmeyi çekirdeklere dağıtıyor.
Sunucu süreci ilk satırı okudu ve yanıtı hazırladı. Bu sefer geri dönecek olan küçük bir istek değil, iki yüz parçaya bölünecek koca bir dosya. Parçalardan biri yolda kaybolursa gönderen bunu kimden öğrenecek?
Bölüm 59: Güvenilir Aktarım
Sunucu yanıtı hazırladı ve geri gelen şey artık küçük bir istek değil. Karşıya geçecek gövde 292.000 bayt, yani 1.460 baytlık iki yüz parça. Değişen tek şey boyut gibi duruyor.
Değişen şey boyutun getirdiği sorun. Parçalardan biri yolda kayboluyor. Gönderen bunu kimden öğrenecek?
Her oktetin bir numarası var
TCP’nin verdiği söz üç parçalı: güvenilir, sırası bozulmamış ve mesaj sınırı olmayan bir bayt akışı. Bu sözün altındaki mekanizma tek bir fikirden çıkıyor. Bağlantı üzerinden giden her oktetin bir sıra numarası var. Standardın en temel tasarım kararı bu, ve bölümün geri kalanındaki her mekanizma ondan türüyor.
Numara segmentleri saymıyor, baytları sayıyor. Başlıktaki alan, o segmentin ilk baytının akış içindeki numarasını taşır. Yanıtın ilk segmenti 7.000 ile çıkıyorsa ikincisi 8.460, üçüncüsü 9.920, dördüncüsü 11.380 olur. Aradaki fark hep 1.460.
O 1.460 sayısı da havadan gelmiyor. MTU’dan iki başlığı düşünce kalan tam boy segment bu; kapsülleme merdiveninin taşımaya bıraktığı yer.
Onay numarasını okurken sık yapılan bir hata var: onu alınan son bayt sanmak. Gösterdiği şey bir sonraki beklenen bayt. Üstelik birikimli çalışıyor; 9.920 onayı, 9.920 hariç ondan öncekilerin tamamının alındığını söylüyor. Bu kural kopya saptamayı bedavaya getirir, çünkü yeniden gönderim varken aynı baytı ikinci kez alan taraf onu numarasından tanır.
Telefonda birine uzun bir adres yazdırdığını düşün. Karşı taraf her satırın sonunda “kapı numarasına kadar aldım, devamı?” der. Söylediği şey aldığının sonu değil, beklediğinin başıdır. Haritalama şurada: o cümle onay numarasıdır, “devamı” dediği yer beklenen bayttır, aynı cümleyi ikinci kez duyman aradan bir şey düştüğünün işaretidir. Benzetme şurada biter: karşındaki insan söylediğini anlar, TCP yalnızca sayar.
Sıra uzayı 0 ile 2^32 - 1 arasındadır ve bütün aritmetik 2^32 modunda yürür. Havuzda 4.294.967.296 numara var. Sonuncudan sonra sayaç başa döner. Başlıktaki alan genişlikleri de bu muhasebeyi doğruluyor:
sıra numarası 32 bit (4 bayt) segmentin ilk baytının numarası
onay numarası 32 bit (4 bayt) beklenen bir sonraki bayt
pencere 16 bit (2 bayt) alıcının o an kabul edebileceği baytHavuzun sonlu olması gerçek bir sınır koyar. Sayaç başa dönmeden önce eski bir kopyanın ağda ölmüş olması gerekir. Hızı bilince süre çıkar. 1 Gbit/s’lik bir akışta saniyede 125 MB gider; havuz 34,4 saniyede başa döner. Numaranın bir sonraki tura kalan ömrü, segmentin ağda yaşayabileceği en uzun süreden kısa olamaz.
Başlangıç sıra numarası her bağlantıda yeniden üretiliyordu; o numaranın neyi saydığı burada çalışıyor.
Dur ve bekle hattı boş bırakıyor
Güvenilirlik tek başına hattı verimli kullanmaya yetmiyor. Dur ve bekle protokolü doğru çalışır: gönderen bir segment yollar, onayı bekler, sonra bir tane daha yollar. Boruda aynı anda tek segment olur.
Bedeli hesaplanabilir. 1.460 baytlık bir segment 100 Mbit/s’lik bir hatta 116,8 µs’de çıkar. Gidiş-dönüş 30 ms ise gönderen her segment için o kadar bekler. Hat zamanının yalnızca %0,39’unda çalışır.
Çözüm boru hattıdır: gönderen onay beklemeden birden çok segmenti havada tutar. Üç paketlik bir boru hat kullanımını üç katına çıkarır. Bedeli de var. Sıra numarası aralığı genişlemek ve iki uçta da tampon açılmak zorundadır.
Havada tutulabilen o aralığın adı kayan penceredir. Gönderenin sıra uzayı dört bölgeye ayrılır: onaylanmış baytlar, gönderilmiş ama onaylanmamış baytlar, pencerede olup henüz gönderilmemiş baytlar ve pencere dışı. Sol kenarı tutan değişkenin adı SND.UNA’dır; alıcı tarafta alma penceresinin sol kenarı RCV.NXT’tir.
Gönderen uçuştaki segmentlerin kopyalarını bir yeniden gönderim kuyruğunda saklar. Onay geldiği anda kopya atılır ve sol kenar sağa kayar. Pencereyi kaydıran şey onaydır. Atma kuralı da kesindir: bir segmentin sıra numarası ile uzunluğunun toplamı gelen onayı geçmiyorsa o segment kuyruktan düşer.
Sunucu 203.0.113.10, istemci 198.51.100.20 olsun. SND.UNA 7.000’de duruyor ve alıcı 11.680 baytlık pencere ilan etti. Gönderen 18.680’e kadar yeni bayt yollayabilir, yani sekiz tam boy segment. 8.460 onayı gelince sol kenar oraya kayar. Sağ uç 20.140’a çıkar; ilan değişmese bile pencere sağa yürüdü.
Pencerenin iki kenarının onay geldikçe nasıl yürüdüğünü izleyelim:
- Akış baytlara numaralanıyor. Yanıt gövdesi 1.460 baytlık segmentlere bölünüyor ve her segmentin ilk baytı bir sıra numarası taşıyor. Numara segmenti değil, baytı sayıyor; aradaki fark her seferinde segmentin yükü kadar.
- Pencere üç segmenti kapsıyor. Gönderen akışın tamamını bir anda yollayamıyor. Alıcının ilan ettiği pencere, o an gönderilmesine izin verilen aralığı işaretliyor; buradaki örnekte üç segment genişliğinde.
- Uzay dört bölgeye ayrılıyor. Solda onayı gelmiş baytlar duruyor. Pencerenin içinde gönderilmiş ama onaylanmamış segmentlerle henüz gönderilmemiş bir segment var; sağda ise izin sınırının ötesi kalıyor.
- Onay sol kenarı ileri itiyor. 9.920 onayı geliyor ve ondan önceki bütün baytları tek seferde kapatıyor. Uçuştaki ilk segment onaylanmış bölgeye düşüyor, sol kenar da onun bittiği yere taşınıyor.
- Pencere sağa kayıyor. Sol kenar ilerleyince sağ kenar da aynı miktarda ilerliyor ve daha önce sınırın dışında kalan segment gönderilebilir hâle geliyor. Pencereyi kaydıran şey onayın kendisi.
Gelen çerçevenin sağlamasına bakılıyor ve veri soket kuyruğuna bırakılıyordu; buradaki eksik bayt o denetimin yakaladığı bir bozulma değildir.
Sayaç ne kadar bekleyecek?
Kaybı saptamanın ilk yolu gönderendeki bir sayaçtır; süresinin adı yeniden gönderim zaman aşımıdır. Süre gidiş-dönüşten uzun olmalı. Ama gidiş-dönüş sabit değildir. Kısa seçersen ortada kayıp yokken gereksiz kopyalar üretirsin; uzun seçersen gerçek kayba geç tepki verirsin.
Ölçümün kendisi basit. Örnek gidiş-dönüş süresi, bir segmentin gönderilmesiyle onayının gelmesi arasında geçen süredir. Kestirim tek ölçümden çıkmaz. Üstel ağırlıklı hareketli ortalama kullanılır ve eski örneklerin etkisi hızla söner. Ağırlıklar sabittir: kestirim için 1/8, sapma için 1/4.
Üstüne bir güvenlik payı biner. RFC 6298 payı sapmanın dört katı olarak tanımlar. İlk ölçümün kendine ait bir kuralı var. Kestirim doğrudan ölçümün kendisi olur, sapma da onun yarısı. Hiç ölçüm yokken gönderen 1 saniyelik başlangıç değeriyle çalışır.
İlk ölçümün 32 ms geldiğini varsay: kestirim 32 ms, sapma 16 ms, pay da 64 ms olur. Ham zaman aşımı 96 ms çıkar. Ama taban 1 saniyedir ve her hesaba uygulanır: değer onun altına düşerse yukarı yuvarlanır. İkinci ölçüm 30 ms gelsin. Kestirim 31,75 ms’ye, sapma 12,5 ms’ye iner, ham değer 81,75 ms olur ve taban onu yine 1 saniyeye çeker. Zaman aşımına üst sınır konabilir, ama o sınır 60 saniyenin altına inemez.
Bir tuzak var. Karn kuralı yeniden gönderilmiş bir segmentten örnek almayı yasaklar; gelen onayın hangi kopyaya ait olduğu belirsizdir. Üstel geri çekilme de buradan gelir: sayaç her dolduğunda değer ikiye katlanır ve ardışık denemeler 1, 2, 4, 8, 16, 32 saniye olur.
Gönderen her segmente ayrı sayaç kurmaz. Tek sayaç en eski onaylanmamış segment için işler ve dolunca yalnızca o segment yeniden gider. Bekleyen bütün veri onaylandığında zamanlayıcı kapanır, yeni veri çıkınca yeniden kurulur.
Kuyruk gecikmesi trafikle birlikte oynuyordu; zaman aşımının sabit bir sayı olamamasının sebebi tam olarak o oynama.
Onay yinelenince beklemenin anlamı kalmıyor
Sayaç, kaybı yakalamanın tek yolu olarak kalmıyor. İkinci yol alıcının kendi davranışından çıkar.
Sırayla gelen ilk segment hemen onaylanmaz. Alıcı bir sonrakini bekler ve ikisini tek onayla kapatmayı dener; bu beklemenin adı gecikmeli onaydır. Sırada bir boşluk açılınca o bekleme hemen düşer.
| alıcıya gelen | alıcının yaptığı |
|---|---|
| sırayla gelen ilk segment | onayı en fazla 500 ms geciktirir |
| sırayla gelen ikinci segment | ikisini tek onayla kapatır |
| sırası atlanmış segment | beklediği baytın onayını hemen yineler |
| boşluğu dolduran segment | boşluğun ötesini de kapatan onayı yollar |
Boşluk kapanana kadar alıcı hep aynı onayı yollar; gönderen o numarayı üst üste görür. Üç yinelenen onay geldiğinde sayacı beklemez. Hızlı yeniden gönderim en küçük sıra numaralı onaylanmamış segmenti hemen yola çıkarır. Eşiğin üç seçilmesinin sebebi ağın segmentleri yeniden sıralamasıdır; yinelenen onay her zaman kayıp anlamına gelmez ve daha düşük bir eşik yöntemi boşuna tetiklerdi.
Kazanç ölçülebilir. 30 ms’lik bir yolda 1 saniyelik zaman aşımını beklemek yerine yaklaşık 33 kat erken tepki verirsin. Ayrı bir olumsuz onay mesajına da gerek kalmaz; yinelenen onay gönderende aynı işi görür.
Her eksik onay yeniden gönderim doğurmaz. 8.460 onayının kaybolduğunu düşün. 9.920 onayı sayaç dolmadan gelirse boşluk kapanır ve hiçbir segment tekrar gitmez.
Onay, karşıya akan bir veri segmentinin başlığına da binebilir; bu birleştirmenin adı piggybacking. Kopya bir segment vardığında alıcı onu sessizce atmaz. Kendi onayının kaybolduğunu varsayıp kopyayı da onaylar.
Gecikmeli onayın bedeli de var. Her segmenti anında onaylamak ağa veri taşımayan segmentler ekler. Beklemek o yükü kısar ama gönderenin kestirimini bozar; ölçülen süreye alıcının bekleyişi de karışır.
Derinleşmeİki iyi niyetli optimizasyon çarpışırsa ne olur?
Alıcı tarafındaki gecikmeli onayın gönderen tarafında bir kardeşi var: Nagle algoritması. İkisi de aynı derdi çözüyor — küçük segmentlerin ağa gereksiz yük bindirmesi. Hesapladığımız uç vakayı hatırla: tek bir baytlık veri telde 84 bayt yer kaplıyor, yani zarfın payı %98,8.
Nagle’ın kuralı tek cümle: onaylanmamış veri varken küçük bir segment gönderme, biriktir. Elde bir tam segment birikirse ya da bekleyen bütün onaylar gelirse gönder. Uzak bir makinede metin düzenlerken her tuş vuruşunun ayrı bir pakete binmesini böyle engelliyor.
Şimdi ikisini yan yana koy. Gönderen küçük bir parça yolladı ve Nagle yüzünden ikinciyi göndermek için onay bekliyor. Alıcı ise gecikmeli onay yüzünden, ikinci segmenti bekleyerek onayı geciktiriyor. İki taraf birbirini bekliyor.
Kilidi kıran şey alıcının zamanlayıcısı: gecikmeli onay en fazla beklediği kadar bekleyip onayı yolluyor. Linux’ta bu genellikle 40 ms. Yani hiçbir kayıp, hiçbir tıkanıklık olmadan, tamamen boş bir hatta, iki iyi niyetli optimizasyon yüzünden 40 milisaniyelik bir duraklama doğuyor. Küçük istek-cevap çiftleriyle çalışan bir uygulamada bu, saniyede 25 işlem demek.
Çare uygulamanın elinde: tek bir soket ayarıyla Nagle kapatılabiliyor ve gecikmeye duyarlı hemen her kütüphane bunu varsayılan olarak yapıyor. Doğru hamle de bu, çünkü bugün küçük segment yükü 1980’lerdeki kadar önemli değil; gecikme ise daha önemli.
Birikimli onay bir şeyi söyleyemiyor
Yeniden gönderimin kapsamı ayrı bir karardır ve iki uçtaki klasik yaklaşımın adları var. N geri git’te bir zaman aşımı penceredeki bütün üst numaralı segmentleri de geri yollar; alıcı sırası bozuk geleni hiç tamponlamaz, bu yüzden alıcı basit ama hat israf edilir. Seçici tekrarda yalnızca eksik olan gider ve alıcı sırasızları tamponunda tutar; hat verimli ama alıcı karmaşıklaşır.
TCP ikisinin arasında bir yerde duruyor ve sıkıntısı birikimli onaydan geliyor. Onay numarası yalnızca “şu bayta kadar geldi” diyebiliyor; ötesinde neyin geldiğini söyleyemiyor. Somut bir örnek: gönderen 1.000, 2.000, 3.000, 4.000 ve 5.000 numaralı beş segment yolladı ve yalnızca 2.000 kayboldu. Alıcı elinde dördü var ama söyleyebildiği tek şey “2.000 bekliyorum”. Gönderen dört sağlam segmenti de yeniden yollamak ile yalnızca birini yollayıp riske girmek arasında kalıyor.
Çözüm bir seçenek. Seçici onay (SACK), onay numarasının yanına “şu aralıklar da elimde” listesini ekliyor. El sıkışmadaki SACK izinli seçeneği tanıdık; bu, o iznin karşılığı.
onay = 2.000 SACK: 3.000-6.460İki satır birlikte okununca resim tamamlanıyor: 2.000 eksik, ondan sonrası tamam. Gönderen tek bir segment yolluyor ve boşluk kapanıyor. Seçenek alanı 40 baytla sınırlı olduğu için tek seferde en fazla dört blok bildirilebiliyor — zaman damgası seçeneği de açıksa üçe iniyor.
Kazanç, kayıpların tek tek değil kümeler hâlinde olduğu durumlarda büyüyor. Bir tıkanıklık anında bir pencerede birkaç segment birden düşer; SACK olmadan gönderen bunları ancak arka arkaya zaman aşımlarıyla, tur tur keşfeder. SACK ile hepsini tek turda görür.
Direksiyon alıcıda
Kayıp toparlandı. Geriye tek bir soru kalıyor: alıcı yetişemezse ne olacak?
Flow control bu soruyu alıcının eline veriyor. Gönderen uçuştaki veri miktarını alıcının ilan ettiği pencereyle sınırlar. İlan edilen sayı alma penceresidir: alıcının tamponunda o an kalan boş yer.
Tamponun dolma sebebi ağ kartı değil. IP kodu gelen yükü soket tamponuna bırakır, uygulama da oradan okur. Uygulama okumakta geri kalırsa boş yer erir ve ilan edilen sayı küçülür. Pencereyi olduğundan büyük göstermek işi düzeltmez. Kabul edilemeyen veri atılır ve gereksiz yeniden gönderim doğar.
Onay ile izin de ayrı şeylerdir. Alıcı bir baytı onaylayıp yeni gönderime izin vermeyebilir. TCP ikisini tek başlıkta taşır; onay numarası ile pencere yan yana durur.
Pencere alanı 16 bit olduğu için ölçeklemesiz en büyük ilan 65.535 bayttır. 100 ms gidiş-dönüşte bu, yaklaşık 5,24 Mbit/s’lik bir tavan demektir. Pencere ölçekleme uzantısı alandaki değeri kaydırarak o tavanı kaldırır. Tavanın ne kadar alçakta kaldığını bir hesap gösterir: 10 Gbit/s’i 100 ms gidiş-dönüşte tutturmak için 1.500 baytlık 83.333 paketin, yani yaklaşık 125 MB verinin aynı anda havada olması gerekir.
Pencere sıfırlandığında gönderen büsbütün durmak zorunda kalır. Pencereyi yeniden açan segment kaybolursa iki taraf birbirini bekler. Kilidi ısrar zamanlayıcısı kırar: dolduğunda gönderen, öncekinin kopyası olsa bile en az bir oktetlik bir yoklama yollar. Ardışık yoklamalar arasındaki süre üstel olarak açılır.
Flow control’ün koruduğu şey yalnızca alıcının kapasitesi. Ağın ortasındaki kuyrukları koruyan mekanizmayı bir sonraki durakta açacağım; pencere boyunu ikisi birlikte belirler.
Bunları kendi makinende görebilirsin. Linux’ta ss -ti çıktısı açık bir bağlantı için rtt ve rto alanlarını basar; rtt değerinin yanındaki ikinci sayı sapmadır. netstat -s ise TCP sayaçlarını döker; yeniden gönderilen segment sayısı orada durur.
Omurga sorusu: Kaybolabilen bir yolun üstünde kaybolmayan bir aktarım nasıl kuruluyor?
Numaralayarak. Her oktet numaralanır, her onay beklenen numarayı söyler, bir sayaç ile üç yinelenen onay kaybı iki ayrı yoldan yakalar, pencere de gönderenin ne kadar ileri gidebileceğini sınırlar. Yol hiçbir zaman güvenilir olmadı; güvenilirlik iki uçtaki muhasebeden çıktı.
Özet
Peki, ne öğrendik?
- Sıra numarası. Alan segmentleri değil baytları sayar ve segmentin ilk baytının akış içindeki yerini taşır.
- Birikimli onay. Onay numarası beklenen bir sonraki baytı gösterir ve kendinden öncekilerin hepsini tek seferde kapatır.
- Zaman aşımı. Süre ölçülen tek bir gidiş-dönüşten değil, düzleştirilmiş kestirime eklenen sapma payından çıkar.
- Hızlı yeniden gönderim. Üç yinelenen onay, sayacın dolmasını beklemeden eksik segmenti yola çıkarır.
- Seçici onay birikimli onayın körlüğünü kapatır.
SACKseçeneği “şu aralıklar da elimde” diyerek gönderenin yalnızca gerçekten eksik olanı yollamasını sağlar.- Flow control. Alıcının ilan ettiği pencere, gönderenin uçuşta tutabileceği veri miktarına tavan koyar.
Kayıp artık kendi kendine toparlanıyor ve alıcı gönderene ne kadar yer kaldığını söylüyor. Ama yolun ortasındaki kuyruklar kimseye bir şey ilan etmiyor. Gönderen ne kadar hızlı göndereceğine neye bakarak karar veriyor?
Bölüm 60: Tıkanıklık Denetimi
Kayıp toparlandı ve yanıt akmayı sürdürüyor. Peki gönderen saniyede kaç bayt basacağına nasıl karar veriyor?
Ağ ona bir hız söylemiyor. Gönderen kendi hızını, ağdan dolaylı yoldan sızan işaretlere bakarak seçiyor.
Elinde yalnızca iki belirti var
Tıkanıklığın gayriresmî bir tanımı var. Çok sayıda kaynak, ağın kaldırabileceğinden fazla veriyi, kaldırabileceğinden hızlı gönderiyor. Sorun tek bir kutuda durmuyor; paylaşılan kapasitede duruyor.
Bu sorun uca yalnızca iki belirtiyle iniyor. Birincisi gecikmenin uzaması. Paketler yönlendirici tamponlarında kuyruklanıyor ve orada geçen bekleme senin gidiş-dönüş süreni uzatıyor. İkincisi paket kaybı olarak görünüyor: tampon taşınca gelen paket düşüyor. Gönderenin elindeki bütün kanıt bu ikisi.
Düğüm gecikmesini ayırırken kuyruğun dolup paketin silindiğini söylemiş, gerisini bu durağa bırakmıştım; borcu burada ödüyorum. İşleme, iletim ve yayılım yükle bu kadar oynamıyor; trafikle birlikte oynayan tek bileşen kuyruk oluyor.
Sık karıştırılan bir ayrım daha var. Tıkanıklık denetimi çok sayıda göndericinin toplu olarak fazla hızlı göndermesini çözüyor. Flow control tek bir alıcıyı koruyordu ve alıcının ilan ettiği pencereyle çalışıyordu. İki mekanizma aynı bağlantıda, birbirinden habersiz ve aynı anda çalışıyor.
TCP’de gönderilebilir miktar iki pencerenin küçüğü. Biri ağın izin verdiği tıkanıklık penceresi. Öteki alıcının başlıkta ilan ettiği kredi; o alan 16 bit ve sekizli sayıyor. Tıkanıklık penceresinin başlıkta hiçbir karşılığı yok. Yalnızca gönderenin belleğinde yaşıyor.
Bu yüzden onu telde göremezsin. Kuralları da TCP’nin ana belgesinde değil, ayrı bir metinde yazılı: RFC 5681.
Pencere katlanarak büyüyor, bir anda çöküyor
Bağlantı açıldığında tıkanıklık penceresi tek bir maksimum segment boyu. TCP ağ hakkında hiçbir şey bilmediği için en küçük değerden başlıyor.
Sonra yavaş başlangıç devreye giriyor. Gelen her onayda pencere bir segment artıyor, dolayısıyla her gidiş-dönüşte ikiye katlanıyor. Adı yavaş ama artış üstel ilerliyor; yavaş olan yalnızca başlangıç değeri.
Üstel artışın nerede duracağını bir eşik tutuyor. Durum makinesi açılışta bu eşiği 64 KB’ye, yinelenen onay sayacını da sıfıra kuruyor. Eşiğe varınca artış doğrusala dönüyor, TCP tıkanıklıktan kaçınma durumuna geçiyor ve her gidiş-dönüşte bir segment ekliyor. Testere dişi bu asimetriden doğuyor.
Kayıp görüldüğünde eşik, kayıptan hemen önceki pencerenin yarısına çekiliyor. Kuralın adı bu iki hareketten geliyor: toplamsal artış, çarpımsal azalış. Ağ bir kez ölçüldükten sonra bir daha sıfırdan yoklanmıyor. Pencerenin ne kadar düşeceğini ise kaybın nasıl saptandığı belirliyor.
Üç yinelenen onayla saptanan kayıpta pencere yarıya iniyor; Reno’nun katkısı bu. Zaman aşımıyla saptanan kayıpta tek segmente düşüyor. Tahoe ise kaybın türüne hiç bakmıyor, her seferinde tek segmente iniyordu.
Hızlı toparlanmaya girerken pencere eşiğin üç segment üstüne kuruluyor ve her ek yinelenen onay onu bir segment daha şişiriyor ve bunun sağlam bir gerekçesi var. Yinelenen onay, ağdan bir paketin çıktığının kanıtı.
| durum | pencere her gidiş-dönüşte | çıkış |
|---|---|---|
| yavaş başlangıç | ikiye katlanıyor | eşiğe varınca ya da kayıpta |
| tıkanıklıktan kaçınma | bir segment artıyor | kayıpta |
| hızlı toparlanma | yinelenen onay başına bir segment | yeni ACK gelince |
Testere dişinin faturası
Somut bir hat kur. Darboğaz 10 Mbit/s, en küçük gidiş-dönüş süresi 40 ms. Tam boy segment 1.460 bayt.
Bir bağlantının hatta tutması gereken ideal veri miktarı, darboğazdan aldığı pay ile en küçük gidiş-dönüş süresinin çarpımı. Burada 50.000 bayt eder, yani yaklaşık 34 segment. Pencere birden ikiye katlanarak bu boruyu altı gidiş-dönüşte, yani 240 ms’de dolduruyor.
Şimdi kayıp tam orada olsun. Pencere 17 segmente iniyor. Toplamsal artış her gidiş-dönüşte bir segment eklediği için eski değerine dönmesi 680 ms sürüyor. Yükselen kenar, düşen kenardan on yedi kat uzun.
Gönderim hızının kaba karşılığı, pencerenin gidiş-dönüş süresine bölümü. Bu dişin altında ortalama pencere, kaybın oluştuğu pencerenin dörtte üçü: 25,5 segment. Saniyelik karşılığı 930.750 bayt, yani 7,4 Mbit/s ediyor; darboğazın %74,5’ini kullanmış oluyorsun. Kalan dörtte bir, kayba dayalı denetimin faturası.
Throughput hiçbir koşulda kapasiteyi aşamıyor. Uçtan uca hızı yol üstündeki en yavaş bağlantı belirliyor ve o bağlantı pratikte çoğu zaman omurgada değil, uçlardan birinde. Düşen paketin bedeli de bir paketten büyük: onu darboğaza kadar taşıyan her bağlantı, harcadığı kapasiteyi geri alamıyor.
Pencereyi ve eşiği kendi makinende de görebilirsin; gönderenin kaydı oradadır:
$ ss -ti
ESTAB 0 0 198.51.100.7:51844 203.0.113.10:443
cubic wscale:7,7 rtt:40.1/1.2 mss:1460
cwnd:34 ssthresh:17 bytes_retrans:5840Çıktıdaki bytes_retrans hattın yaptığı fazladan işi gösteriyor. Taşımanın hatta koyduğu veri uygulamanın verdiğinden büyük, çünkü girdiye yeniden gönderimler de dahil. Erken bir zaman aşımı bu farkı boşuna büyütüyor: alıcının gördüğü throughput değişmiyor, hattın yaptığı iş artıyor.
Pencerenin büyüyüp yarılanma döngüsünü grafiğin üstünde görelim:
- Pencere tek segment. Eğri en soldan, tek segmentlik pencereden başlıyor. Ağ hakkında hiçbir ölçüm elde yokken seçilebilecek en küçük değer bu.
- Yavaş başlangıç. Eğri altı adımda 1, 2, 4, 8, 16, 32 basamaklarını geçiyor. Katlanma boruyu altıncı gidiş-dönüşte, yani 240 milisaniyede dolduruyor.
- Kayıp: pencere yarılanıyor. 34 segmentte görülen kayıp pencereyi 17 segmente indiriyor ve eşiği aynı değere çekiyor. Düşüş tek bir gidiş-dönüşte bitiyor.
- Toplamsal artış. Tıkanıklıktan kaçınmada pencere her gidiş-dönüşte yalnızca bir segment kazanıyor. Eski değerine dönmesi 17 gidiş-dönüş, yani 680 ms sürüyor.
- Testere dişi ve ortalaması. Aynı döngü tekrarlanıyor. Ortalama pencere, kaybın oluştuğu pencerenin dörtte üçü: 25,5 segment. Darboğazın %74,5'i.
Kuyruk hiç boşalmıyor
Kayba dayalı denetimin kör noktası burada. Darboğaz kuyruğu neredeyse hiç boşalmıyor ve ara sıra taşıyor. Kayıp bir kaza sayılmıyor; algoritmanın çalışma noktası.
Otoyol benzetmesinde yolun en dar kesiti darboğaz hattıydı, giriş rampasındaki bekleme de kuyruk gecikmesi. Benzetme yine aynı yerde bitiyor: taşan rampada araç beklemiyor, düşüyor.
Bant genişliği-gecikme çarpımının altında kalırken hattaki veriyi artırmak gidiş-dönüş süresini yükseltmiyor. Üstüne çıkınca fazlalık kuyruğa yazılıyor, throughput’a değil.
O çarpımın kendisi tek satır ve her kapasite hesabının çıpası:
BDP = bant genişliği × gidiş-dönüş süresiAnlamı fiziksel: hattı tam dolu tutmak için aynı anda havada olması gereken veri miktarı. 1 Gbit/s’lik bir yol 40 ms gidiş-dönüşle çalışıyorsa BDP = 5 MB. Gönderen bu kadar veriyi onaysız yolda tutamıyorsa hat asla dolmuyor — kablonun hızı ne olursa olsun.
Buradan sınır kendiliğinden çıkıyor. Pencere alanı 16 bit ve ölçeklemesiz en büyük ilan 65.535 bayt. Aynı 40 ms’lik yolda bu, 65.535 × 8 / 0,040 = 13,1 Mbit/s demek. Yani ölçekleme seçeneği olmadan, gigabitlik bir hattın yüzde biri bile kullanılamıyor. Pencere ölçeklemesi bir iyileştirme değil, zorunluluk.
Kayıp oranı hızı nasıl yazıyor?
Testere dişinin ortalama hızı da kestirilebiliyor ve sonuç şaşırtıcı derecede kısıtlayıcı. İki şeye bağlı, ikisi de ters yönde çalışıyor.
Gidiş-dönüş süresine ters orantılı. Uzak sunucu yalnızca geç cevap vermiyor, aynı zamanda daha yavaş: turu iki katına çıkarmak hızı yarıya indiriyor.
Kayıp oranına ise karekökle ters orantılı. Bu ikincisi acımasız bir tarafta acımasız. Kaybı dört kat azaltmak hızı yalnızca iki katına çıkarıyor; hızı on katına çıkarmak istiyorsan kaybı yüz kat azaltman gerekiyor.
Sayılara dökülünce ne demek olduğu görünüyor. 1.460 baytlık segmentler ve 40 ms’lik bir turla:
| kayıp oranı | ortalama hız |
|---|---|
| on binde bir | yaklaşık 36 Mbit/s |
| yüz binde bir | yaklaşık 113 Mbit/s |
| milyonda bir | yaklaşık 356 Mbit/s |
Şimdi ters soruyu sor: aynı yolda 1 Gbit/s sürdürmek için kayıp ne kadar seyrek olmalı? Cevap sekiz milyon pakette bir. Bu, kayba dayalı denetimin uzun ve hızlı yollarda niçin zorlandığının tek cümlelik cevabı: talep edilen hata oranı, fiziğin verdiğinin sınırında.
Buna iki farklı cevap var. CUBIC’in dayandığı sezgi şu: kayıp anındaki pencere darboğaz kapasitesinin taze bir ölçümü ve darboğaz o ölçümden bu yana muhtemelen çok değişmedi. Pencereyi yarıladıktan sonra o değere hızla tırmanıyor, yaklaştıkça yavaşlıyor. Artış, dönüm noktasına olan uzaklığın küpüne bağlı ve o nokta ayarlanabilir. CUBIC Linux’un varsayılanı; kaynağın kaydına göre yaklaşık 2024’e kadar yaygın web sunucularında en çok kullanılan TCP sürümüydü.
BBR başka bir noktayı hedefliyor: borunun tam dolduğu ama kuyruğun birikmediği yer. Üç evrede çalışıyor. Hızlanma, throughput platoya oturana kadar gönderim hızını artırıyor. Seyir, ağın gerçekten teslim ettiği hızda gönderiyor ve kanıtı geri dönen onaylar. Yavaşlama, hattaki veriyi kasten azaltıp yeni bir en küçük gidiş-dönüş süresi ölçüyor.
İkisi de darboğazı doyuruyor. Biri gecikme bedelini ödüyor.
Yönlendirici de konuşabilir
Buraya kadar anlattığım her şey uçtan uca denetim; TCP’nin seçtiği yol bu. Ağ destekli denetimde ise yönlendiriciler akışların uçlarına doğrudan haber veriyor; ECN, ATM ve DECbit bu aileden. Açık bildirimin ilk denemesi daha eskiydi: ICMP’nin Source Quench mesajı göndereni yavaşlatmak için doğrudan ona yollanıyordu.
Yönlendiricinin elinde iki araç var: düşürmek ve işaretlemek. En basit düşürme biçimi kuyruk sonundan atmak; işaretlemenin iki bilinen adı ise RED ve ECN. Tampon boyutu bir doğa yasası değil, bir tasarım kararıydı. 100 Mbit/s’lik bir darboğazda 1.000 paketlik dolu bir kuyruk 12 Mbit taşıyor. Boşalması 120 ms sürüyor ve senin gidiş-dönüş süren tam o kadar uzuyor.
Fazla tampon gecikmeyi büyütüyor ve bu en çok ev yönlendiricilerinde görülüyor. RFC 3439’un pratik kuralı ortalama tamponu tipik gidiş-dönüş süresiyle hat kapasitesinin çarpımı kadar tutuyor ve tipik değer olarak 250 ms anıyor. 10 Gbit/s’lik bir hatta bu 2,5 Gbit tampon demek. Daha yeni öneri, hattı paylaşan akış sayısı arttıkça tamponu küçültmek.

İşaretlemenin künyesi ayrı. IP başlığındaki hizmet türü baytının 6-7 bitlerini yönlendirici işaretliyor, 0-5 bitleri diffserv’in ve işaretleme politikasını ağ işletmecisi seçiyor. İşaret hedefe kadar IP’de gidiyor, hedef onayda ECE bitini kaldırıyor, gönderen de CWR bayrağıyla pencereyi küçülttüğünü bildiriyor. Döngü iki katmanı birden kullanıyor. İki bayrak RFC 3168’de tanımlı ve TCP başlığının sekiz bitlik bayraklar alanının ikisini kaplıyor.
Adalet hedefi sade. Aynı darboğazı paylaşan oturumların her biri kapasitenin eşit payını alsın. Ama bu ancak idealleştirilmiş varsayımlar altında doğru: aynı gidiş-dönüş süresi, hepsi tıkanıklıktan kaçınmada ve sayıları sabit. Üstelik adalet akış başına tanımlı, uygulama başına değil. 60 Mbit/s’lik bir darboğazda beş akış varken gelen ve tek bağlantı açan uygulama 10 Mbit/s alıyor, beş bağlantı açan 30 Mbit/s alıyor. Bu da kapasitenin %50’si. Tıkanıklık denetimini kullanmaya zorlayan bir merci de yok; uyum gönüllü. Sabit hızda ses ve video gönderen uygulamaların bir kısmı bu yüzden UDP’ye geçip kayba katlanıyor.
Zaman aşımı kestirimi ölçülen gidiş-dönüş süresine değil onun tahminine dayanıyordu. Kablosuzda o tahminin altındaki varsayım büsbütün çöküyor: kayıp gürültüden ve hareketlilikten doğuyor ama TCP onu tıkanıklık sayıp gereksiz yere yavaşlıyor. Kaybı sinyal saymanın bedeli en açık burada görülüyor.
Özet
Peki, ne öğrendik?
- Tıkanıklık. Ağın kaldırabileceğinden fazla veri gönderiliyor ve uca yalnızca uzayan gecikme ile paket kaybı olarak iniyor.
- İki pencere. Gönderilebilir miktar, ağın izin verdiği tıkanıklık penceresiyle alıcının başlıkta ilan ettiği kredinin küçüğü.
- Testere dişi. Yavaş başlangıç pencereyi katlıyor, tıkanıklıktan kaçınma birer segment ekliyor, kayıp bir anda yarılıyor.
- Çalışma noktası. Kayba dayalı denetimde kuyruk hiç boşalmıyor; CUBIC kapasiteyi son ölçümden, BBR boruyu doyma noktasından kestiriyor.
- Pay. Adalet akış başına tanımlı, bu yüzden paralel bağlantı açan bir uygulama darboğazdan daha büyük dilim alıyor.
Gönderen hızını ayarladı, kayıp toparlandı ve dosya indi. Ama bu anlatının tamamı çıkarım; kimse sana o pencereyi göstermedi. Olup biteni sonradan tek tek nasıl kanıtlarsın?
Bölüm 61: Trafik Çözümleme
60. bölümde gönderenin tıkanıklık penceresini yavaş başlangıçla büyütüp kayıpta yarıya indirdiğini anlattım, ama o anlatının kanıtını vermedim.
Kanıt paketlerin kendisinde duruyor. Yeniden gönderim de, alıcının ilan ettiği pencere de yakalanmış bir dosyada satır satır görünür. Peki o dosyaya hangi soruyu sorarsın?
Işığa bakarak ölçemezsin
Bir anahtarın önünde durup portların ışığına bakmak ölçüm sayılmaz. 10 Mbit/s’lik bir kanalda 64 baytlık tek bir çerçeve telde 51,2 µs kalıyor. Göz bunu göremez.
Cihaz da bunu bildiği için etkinlik ışığını yaklaşık 50 ms boyunca yanık tutuyor. Yanma süresi gerçek iletim süresinin yaklaşık 976 katı. Işık sana bir şeyin geçtiğini söylüyor, ne kadar geçtiğini değil.
Ölçmek için çerçevelerin kendisi gerekiyor, ve anahtarlı bir ağda kopya kendiliğinden eline geçmiyor. Trafiği kopyalamanın üç yolu vardı: ayna port, pasif optik ayırıcı, sürekli takılı prob. Hangisini seçeceğini arızanın huyu belirliyor.
Arıza aralıklıysa üçüncüsü tek çare. Kesintili hata anlık bakışla yakalanmaz; cihazın günlerce takılı kalması ve durmadan yazması gerekir. Bilgi toplama listesinin son sorusu zaten budur: sorun güvenilir biçimde yeniden üretilebiliyor mu?
Günlerce yazan bir kayıt diski de doldurur. İki filtreden ilki, yani yakalama filtresi, o günlerde diski ayakta tutan tek şey oluyor:
sudo tcpdump -i eth0 -w kanit.pcap 'tcp port 443 and host 192.0.2.10'Dosya eline geçtikten sonrası artık bir yöntem işi oluyor. Hipotez kurar, sınarsın. En bariz olanı önce denersin ve her turda tek bir şeyi değiştirirsin. Aramayı ortadan bölmek de aynı disiplinin parçası: ikili arama 1.048.576 bileşenli bir sistemde tek arızalı bileşeni yirmi sınamayla buluyor ama şartı ağır: arızanın kararlı olması gerekiyor.
Yeniden gönderim kayıtta neye benziyor?
Üst düzey çözümleyicilerin uzman analiz kipi, performansı düşüren aşırı yeniden gönderimi kendisi bulup işaretliyor. Bulduğunu da filtrelenebilir bir alana çeviriyor. ARP’taki çifte adres uyarısı bu yüzden arp.duplicate-address-detected adıyla aranabiliyor; alan protokolde değil, aracın kendi tespitinde doğuyor.
Onay kümülatifti: tek bir onay kendinden öncekileri kapsıyordu. Kayıtta bunun iki ayrı izi var.
Birincisi üç yinelenen ACK. Aynı onay numarasının üç kez tekrarlanması, eksik bir segmentten sonra üçünün daha ulaştığını söylüyor.
Somut bir kayıtta bu şöyle duruyor. 198.51.100.20 numaralı istemci, 203.0.113.9 adresindeki sunucudan bir sayfa çekiyor. Yanıtın altıncı segmenti listede hiç yok, ama yedincisi ve sekizincisi yerinde. İstemcinin ardından yolladığı üç satır aynı onay numarasını taşıyor. Dördüncü satırda eksik segment geri geliyor ve numarası öncekilerin arasına oturuyor. Zaman damgaları arasındaki fark gidiş-dönüş süresinin altında. Gönderen beklememiş.
İkinci iz daha sinsi. Kaybolan bir onay ile erken tetiklenmiş bir zaman aşımı kayıtta neredeyse aynı görünüyor: ikisinde de gönderen aynı segmenti ikinci kez yolluyor.
Ayıran şey tekrarın önünde ne durduğu. Aynı sıra numarasının önünde üç yinelenen onay varsa hızlı yeniden gönderim çalışmış demektir. Hiç yinelenen onay yokken tekrar geldiyse sayaç dolmuştur. İki gönderim arasındaki süreyi gidiş-dönüş süresiyle karşılaştırmak da aynı ayrımı verir: altındaysa onaylar tetiklemiştir, üstündeyse zaman aşımı.
Bir de hiç tekrarın olmadığı durum var. Alıcının onayı yolda kaybolduysa gönderen bekliyor, ama kümülatiflik yüzünden bir sonraki onay o boşluğu kapatabiliyor. Kayıtta o kayıp hiç iz bırakmıyor.
İki grafik, tek zaman ekseni
Akış grafiği aynı bağlantının iki ucunu tek zaman eksenine diziyor. Başlangıç sıra numarasını takas eden SYN, SYN-ACK ve ACK burada üç ayrı satır oluyor; aynı anda soket durumu LISTEN’dan ESTABLISHED’a geçiyor. Kaybolan segment de, ardından gelen yinelenen onaylar da aynı eksende sıralanıyor.
Bağlantının bütün ömrünü tek bir eksende görelim:
- El sıkışma üç satır. Kaydın ilk üç satırı bağlantının kurulduğu andır: istemciden SYN, sunucudan SYN ve ACK birlikte, sonra istemciden ACK. Aynı anda sunucudaki soket LISTEN durumundan ESTABLISHED durumuna geçer.
- Ortadaki segment kayboluyor. Sunucu yanıtı segment segment gönderiyor. İkincisi yolda düşüyor ve istemcinin listesinde hiç görünmüyor; ardından gelen üç segment ise yerinde duruyor.
- Alıcı aynı onayı yineliyor. Onay numarası kümülatif olduğu için istemci boşluğun ötesini onaylayamıyor. Gelen her segmente aynı onay numarasıyla karşılık veriyor ve kayıtta üç yinelenen ACK birikiyor.
- Gönderen beklemeden yolluyor. Üçüncü yinelenen onay hızlı yeniden gönderimi tetikliyor. Eksik segment zaman aşımı dolmadan tekrar gidiyor ve numarası kayıtta öncekilerin arasına oturuyor.
- Pencere ilanı daralıyor. Boşluk kapandıktan sonraki onay, pencere alanında daha küçük bir değer taşıyor. Aynı eksende çizilen pencere eğrisinin düştüğü nokta bu satırdır.
Pencere grafiği ise tek bir başlık alanının zaman içindeki değeri. Alıcının ilan ettiği alma penceresi tanıdık; bu eğri tam olarak o alanın her ölçümdeki değeri. Eğri dibe yaklaşıyorsa frene basan taraf ağ değil, alıcının kendisi.
Eğrinin sıfıra değdiği an ayrı bir olay. Alıcı orada kabul edebileceği bayt kalmadığını ilan etmiş oluyor. Gönderen o noktada elindeki veriyle birlikte bekliyor, çünkü izin tükenmiş durumda.
İki grafiğin asıl değeri üst üste konduklarında çıkıyor. Yeniden gönderimin akış grafiğindeki satırı ile pencere eğrisinin düştüğü nokta aynı ana denk geliyorsa yavaşlamanın kaynağı alıcıdır. Denk gelmiyorsa kayıp yolda olmuş ve alıcı buna hiç tepki vermemiştir. Tek eksenin işi bu ayrımı görünür kılmak.
Grafikleri okurken elindeki birim tam boy segment, yani 1.460 bayt. Basamaklar bu birimin katları hâlinde çıkıyor.
Çözünürlüğü örnekleme aralığı belirliyor ve çözümleyicilerin varsayılanı bir saniye. Aynı aralığı komut satırında da alabilirsin:
tshark -r kanit.pcap -q -z io,stat,1Çıktı her saniye için paket ve bayt sayısını ayrı satırda döküyor.
Şifreli akışta ne okunur?
Yakalama arayüzünü kurarken şifreli bir akışın içeriğini açmayı buraya bırakmıştım. Borcu şimdi ödüyorum.
Açık anahtarlı kripto veriyi taşımıyor, yalnızca kanalı kuruyor. El sıkışmada karşıya geçirilen master secret, o oturumun bütün diğer anahtarlarının üretildiği kök. Bir anahtar türetme fonksiyonu bu kökten dört anahtar çıkarıyor: her yön için ayrı bir şifreleme anahtarı, her yön için ayrı bir MAC anahtarı.
Çözümleyiciye verdiğin şey bu türetilmiş malzeme, uzun ömürlü özel anahtar değil. O anahtar sunucuda kalıyor ve hiçbir yere kopyalanmıyor. Elindeki malzeme yalnızca tek bir oturumu açıyor, bir sonraki oturumun kökü baştan üretiliyor. Kaydı çözebilmen sunucuyu taklit edebilmen anlamına gelmiyor.
Anahtar elinde olmasa bile kayıt susmuyor. TCP başlığı şifrelenmiyor. Sıra numarası, onay numarası ve pencere alanı açıkta akıyor; bir SSH oturumunun içeriğini okuyamasan da yeniden gönderimlerini ve pencere eğrisini çizebiliyorsun. Aynı açıklığın okura yaramayan bir öbür yüzü de var. Sıra numaraları görünür olduğu için ortadaki bir saldırgan segmentleri yeniden sıralayabiliyor.
Port numarası da açıkta duruyor. Telnet TCP 23’ten, SSH TCP 22’den, HTTPS ise varsayılan olarak 443’ten bağlanıyor. Telnet şifresiz aktığı için dinlemedeki veri doğrudan ele geçiyor. İkisini aynı düzenekte yan yana kaydettiğinde fark tek bakışta görünüyor.
Kablosuzda da kalıp değişmiyor. Paylaşılan sır doğrudan kullanılmıyor; her oturum için tek kullanımlık yeni bir AES oturum anahtarı üretiliyor.
Özet
Peki, ne öğrendik?
- Işık bir ölçüm aleti değil. Etkinlik LED’i gerçek iletim süresinin yaklaşık bin katı kadar yanık kalır; ölçmek isteyen çerçevenin kendisini yakalar.
- Dinleme noktası kurulur. Anahtarlı bir ağda kopya kendiliğinden gelmez, aralıklı arızada tek çare günlerce takılı kalan bir cihazdır.
- Üç yinelenen ACK bir sayımdır. Eksik segmentten sonra üçünün ulaştığını ilan eder ve göndereni zaman aşımından önce harekete geçirir.
- Kümülatif onay iz siler. Kaybolan bir onayın yerini sonraki onay doldurabildiği için her kayıp yeniden gönderime dönüşmez.
- Pencere grafiği tek bir alanı çizer. Eğrinin dibe inmesi, frene basanın ağ değil alıcının kendisi olduğunu söyler.
- Şifre içeriği kapatır, başlığı bırakır. TCP başlığı açıkta aktığı için sıra numarası, onay ve pencere şifreli akışta da okunur.
Kayıt elinde, grafikler çizili, hangi segmentin ne zaman kaybolduğu belli. Geriye tek bir soru kalıyor: tuşa bastığın andan ilk baytın ekrana düştüğü ana kadar bütün bu yolculuk kaç milisaniye sürdü?
Bölüm 62: Gecikme Bütçesi
Kayıt elinde ve hangi segmentin ne zaman kaybolduğunu görüyorsun. Tek bir sayı hâlâ eksik: ilk bayt sandığından geç düşüyor.
Bu gecikmenin nerede biriktiğini tahmin etmek yerine ölçebilirsin. Peki o süre tam olarak hangi kalemlerden toplanıyor?
Fatura hangi kalemlerden çıkıyor?
Ölçünün adı ilk bayta kadar geçen süre. Tuşa bastığın an başlar. Yanıtın ilk baytı geldiğinde durur. İçinde tek bir mekanizma yoktur; yolculuğun her durağı bu sayıya bir şey yazar.
Sayma birimi gidiş-dönüş süresidir. Küçük bir paket sunucuya gidip geri dönene kadar ne kadar geçiyorsa, kalemlerin hepsi o birimin katları olarak yazılır.
Tek bir nesnenin yanıt süresi de üç parçadan oluşuyor. Bağlantıyı kurmak bir gidiş-dönüş, isteği gönderip ilk baytları geri almak bir gidiş-dönüş, dosyanın akması ise ayrı bir süre. İlk bayt bu formülün ikinci turunun sonunda düşüyor. Üçüncü parça ondan sonra başlıyor. Bu yüzden ilk bayt ile sayfanın tamamlanması ayrı iki ölçüdür ve biri iyileşirken öteki bozulabilir.
Somut bir yol kuralım ve sayıları oraya oturtalım. Tek yön uzunluğu 2.000 km olsun. Yayılım hızını 200.000 km/sn alalım. Bölme işlemi tek yön için 10 ms veriyor. Gidiş-dönüş 20 ms eder.
Şimdi turları sayalım. Adı adrese çevirmek bir tur ister; kök sunucudan yetkili sunucuya inen zincirin bedeli tam burada faturaya yazılıyor. Bağlantıyı kurmak ikinci turdur ve o tur bittiğinde henüz tek bir uygulama baytı yola çıkmamıştır. üç el sıkışmanın RTT bedeli bu kalemin ta kendisidir. Kilidi kurmak üçüncü turdur. İsteği gönderip ilk baytları geri almak dördüncüdür.
Dört tur, 20 ms’lik birimle 80 ms yapıyor. Buna bir de sunucu düşünme süresi ekleniyor; isteği alıp yanıtı hazırlamak için 25 ms koyalım.
| kalem | süre | bütçedeki payı |
|---|---|---|
| ad çözme | 20 ms | %19 |
| TCP el sıkışması | 20 ms | %19 |
| TLS anlaşması | 20 ms | %19 |
| istek turu | 20 ms | %19 |
| sunucunun kendi işi | 25 ms | %24 |
| ilk bayta kadar toplam | 105 ms | %100 |
Dağılım asıl dersi veriyor. Dört kurulum turu gecikme bütçesinin %76’sını yiyor. Sunucunun payı %24’te kalıyor. Tek başına ad çözme kalemi %19 tutuyor. Sunucu kodunu iki katına hızlandırmak, tek bir turu silmekten daha az kazandırır.
Bu turların hangisi silinebilir?
Sabit sanılan kalem aslında en oynak olanı. Ad çözme kalemi soğukken var, sıcakken yok. Bir ad sunucusu öğrendiği eşlemeyi önbelleğine alır ve sonraki sorguyu doğrudan yanıtlar. Girdi, yaşam süresi dolunca silinir. Aynı siteye ikinci girişte o 20 ms çoğu zaman ortadan kalkar.
Bağlantı kalemi de her nesne için yeniden ödenmiyor. Her nesneye ayrı bağlantı kurmak nesne başına iki gidiş-dönüş ve her bağlantı için ayrı bir işletim sistemi yükü demek. Tarayıcılar bu yüzden paralel bağlantı açıyor. Kalıcı bağlantı ise aynı sayfadaki nesnelerin toplam maliyetini tek bir tura indiriyor.
Kurulumun sırası bedeli açıklıyor. Önce TCP bağlantısı kuruluyor. Sonra karşı tarafın kimliği doğrulanıyor. En sonda oturum anahtarlarını türeten ana sır taşınıyor. Üçü aynı anda yapılamıyor ve her biri öncekinin bitmesini bekliyor; bütçenin en büyük sabit kalemi tam olarak bu sıralılıktan çıkıyor.
Bir adım daha var: QUIC güvenilirliği, tıkanıklık denetimini, kimlik doğrulamayı ve şifreleme durumunu tek el sıkışmada kuruyor. Ardışık iki kurulum turu tek tura iniyor ve bütçeden bir 20 ms siliniyor. Önceki oturumdan saklanan bilet ise el sıkışma gecikmesini sıfıra indiriyor; ilk istek verisi el sıkışmanın ilk paketiyle birlikte yola çıkıyor.
Aynı yolu iki uçtan hesaplamak bütçenin ne kadar oynadığını gösteriyor. Kilit iki tur sürdüğünde toplam 125 ms’e çıkıyor. Ad önbellekteyse ve bilet elindeyse aynı yolculuk 45 ms’e iniyor. Arada tam 80 ms var. Yol aynı yol, mesafe aynı mesafe. Değişen tek şey kaç kez gidip geldiğin.
Milisaniyeyi kim yazıyor?
Bir durakta biriken gecikmeyi dört bileşene ayırmıştık; bu bütçede o dördünün ağırlıkları birbirine hiç benzemiyor.
İşleme kalemi görünmez. Başlığı okumak, bit hatasına bakmak ve çıkış hattını seçmek bugünün donanımında mikrosaniyenin altında kalıyor.
İletim kalemi de şaşırtacak kadar küçük. 1.500 baytlık bir paket 100 Mbit/s hatta 120 µs sürüyor. Aynı paket 1 Gbit/s hatta 12 µs sürüyor. İkisi de 20 ms’lik turun yanında yuvarlama hatası kadar kalıyor.
Geriye iki kalem kalıyor. Yayılım pazarlığa kapalıdır: mesafeyi hıza bölersin, sonuç neyse odur. Sinyalin ışık hızında gittiğini de sanma. Bir ölçüm koaksiyel kabloda yayılım hızını 209.214 km/sn veriyor; aynı kablonun teorik üst sınırı 299.337 km/sn.
Kuyruk ise bütçenin tek gerçekten değişken kalemi. Çıkış hattında beklemek yönlendiricinin o anki yüküne bağlıdır ve o yük saniye saniye oynar. Yayılım her ölçümde aynı sayıyı verir; kuyruk vermez. Bu yüzden tek bir koşu sana bir sayı vermez, bir örnek verir: aynı adresi arka arkaya ölçtüğünde farklı süreler görürsün ve aradaki fark bu kalemden gelir.
Kalemler tek bir durakta da bitmiyor. Aynı dört bileşen yol üstündeki her kutuda yeniden birikiyor, dolayısıyla iki uç arasındaki cihaz sayısı arttıkça toplam da büyüyor. Bir atlama eklemek bir kablonun boyunu uzatmakla aynı kapıya çıkmıyor; eklenen şey mesafe değil, bir kuyruk ile bir iletim daha.
İlk bayt düştükten sonra hesap el değiştiriyor. Aktarım süresini artık turlar belirlemiyor, yol üzerindeki darboğaz hattı belirliyor. Tıkanıklık penceresinin tavanını çizen bant genişliği-gecikme çarpımı bu bütçeden çıkıyor: 100 Mbit/s’lik darboğazı 20 ms’lik turla çarpınca 2.000.000 bit, yani 250.000 bayt. İlan edilen kayan pencere bu sayının altında kalırsa gönderen boruyu hiç dolduramaz.
Süreyi kendin nasıl ölçersin?
Traceroute yol üzerindeki her yönlendiriciye kadar olan gecikmeyi ölçer. Ölçtüğü şey uçtan uca süre değil, o ara noktaya kadar geçen süredir.
Yöntemi tek bir alana yaslanıyor. Paket süzme kurallarını yazarken ayırdığın iki ICMP mesajı burada yöntemin kendisi oluyor. İlk set TTL=1 ile gider, ikinci set TTL=2 ile. Sıradaki yönlendirici datagramı atar ve kaynağa tür 11 kod 0 zaman aşımı mesajı döner. Her atlama için üç yoklama paketi gönderilir. Yolculuk hedefe varınca durur: kapalı bir porta düşen segmente tür 3 kod 3 cevabı gelir.
Çıktı bir merdivene benziyor.
$ traceroute -n 203.0.113.7 # Windows: tracert -d 203.0.113.7
1 192.0.2.1 1 ms 1 ms 1 ms
2 198.51.100.9 6 ms 6 ms 6 ms
3 * * *
4 198.51.100.42 14 ms 14 ms 14 ms
5 203.0.113.7 21 ms 21 ms 20 msMerdivenin asıl işi satırların farkını okumaktır. İkinci satır 6 ms, dördüncü satır 14 ms gösteriyor; aradaki 8 ms o iki nokta arasına giren hattın payıdır. Son satırdaki 21 ms ise bütçeye 20 ms diye yazdığımız turun ölçülmüş hâlidir.
Üçüncü satırdaki yıldızlar yolun koptuğu anlamına gelmiyor. Ya o yoklama kayboldu ya da yönlendirici yanıt vermemeyi seçti. Paket yoluna devam etti; kanıtı dördüncü satırın dolu gelmesi.
Ters yönde şaşırtan bir durum daha var. İleri bir atlamanın süresi bir öncekinden küçük çıkabilir. Her satır ayrı bir paketin ayrı bir yolculuğudur; merdiven kümülatif bir sayaç değildir.
Aynı mesajları yakalama aracında da görebilirsin. ip.ttl süzgeci gelen paketin kaç atlama harcadığını gösterir. icmp.type ve icmp.code süzgeçleri traceroute’un ürettiklerini ayıklar. Aynı yakalamada bütçeyi doğrudan da okuyabilirsin: isteği taşıyan çerçevenin zaman damgasıyla yanıtın ilk baytını getiren çerçevenin zaman damgası arasındaki fark, ilk bayta kadar geçen sürenin ta kendisidir.

En kaba ölçüm hâlâ ping. ICMP üzerinden bir echo isteği gider, karşı taraf cevabını döner, arada geçen zaman hesaplanıp ekrana yazılır. Windows tarafında pathping aynı yolu daha uzun örneklemeyle ölçer.
Faturayı kalem kalem görmek istiyorsan tek satır yetiyor.
curl -o /dev/null -s \
-w 'ad: %{time_namelookup} tcp: %{time_connect} tls: %{time_appconnect} ilk bayt: %{time_starttransfer}\n' \
https://example.comSon sütun ilk bayta kadar geçen süredir ve örneğimizde 0,105 saniye yazar. Aradaki farklar kalemleri veriyor. Ad ile TCP arasındaki fark kurulumun ilk turu, TLS ile ilk bayt arasındaki fark ise isteğin turu artı sunucunun düşünme süresidir.
Özet
Peki, ne öğrendik?
- İlk bayta kadar geçen süre bir toplamdır. Yolculuğun her durağı ona bir kalem yazar ve sayma birimi tek bir gidiş-dönüştür.
- Ağırlık kurulumdadır. 2.000 km’lik bir yolda dört tur 80 ms, sunucu 25 ms tutar ve 105 ms’lik bütçenin %76’sı turlara gider.
- Turlar silinebilir. Önbellek ad çözmeyi, kalıcı bağlantı ile tek el sıkışma kurulumu, saklanan bilet ise el sıkışma gecikmesini düşürür.
- Mikrosaniye ile milisaniye karışmaz. İşleme ve iletim mikrosaniye mertebesinde kalır, faturayı yayılım ile kuyruk yazar.
- traceroute merdiveni kümülatif değildir. Her satır ayrı bir paketin ölçümüdür, yıldız da kopukluk değil yanıtsızlık demektir.
Yolculuk bitti. Tuşa bastığın andan ilk baytın düştüğü ana kadar her durağın faturaya ne yazdığını artık sayıyla biliyorsun. Geriye tek bir soru kalıyor: bunca durak, bunca zarf ve bunca tur neden tam olarak böyle kurulmuş?
Bölüm 63: Son Söz
Bitirdin.
Altmış bir durak önce adres çubuğuna bir şey yazmıştın ve ilk bayt geri döndü. Aradaki yolun her metresini gördün: ismin sayıya çevrildiği masayı, kapının numarasını, el sıkışan üç mesajı, kilidin kurulduğu anı, zarfın içine giren zarfı, kartın verdiği kararı, anahtarın öğrendiği tabloyu, yönlendiricinin en uzun öneki, kimsenin haritasını tutmadığı otonom sistemleri, camın içindeki ışığı ve karşı tarafta katman katman soyulan paketi.
Artık ağa “çalışan bir şey” diye bakamazsın. Baktığın şey, kimsenin tamamını bilmediği, hiçbir merkezin yönetmediği, her durağında yerel karar verilen ve buna rağmen çalışan bir düzen.
Bu kitabı okumadan önce de bu sayfaları açabiliyordun. Değişen şey erişim olmadı; görüş oldu. Artık bir sayfa geç açıldığında sorunun nerede olabileceğini biliyorsun: isim çözümlemesi mi uzadı, el sıkışma mı fazla tur harcadı, kuyruk mu doldu, yoksa darboğaz senin hattında değil karşı tarafın çıkışında mı. Aynı belirtiyi dört ayrı katmana ayırabilmek, bu kitabın verdiği asıl beceri.
Bu bölümde neyi kapatıyoruz?
- Yolculuğun tamamını tek bir zincir hâlinde yerine oturtacağız.
- Girişte sorduğum üç omurga sorusunu yan yana koyup birbirine bağlayacağız.
- Kitabın neleri kasten dışarıda bıraktığını netleştireceğiz.
- Katmanlı tasarımın kime neyi ödettiğini göstereceğiz.
Büyük Resim
Yolculuğun tamamı tek bir zincir. Her halka bir bölüme çözülüyor:
- Metin adres çubuğunda parçalarına ayrılıyor ve tarayıcı ağa çıkmadan önce ceplerini yokluyor — 1. bölüm. 2. Yolun paket anahtarlamayla çalıştığı, hiçbir kutunun yolun tamamını bilmediği ortaya çıkıyor — 2. bölüm. 3. İsim, kökten yetkiliye uzanan bir zincirle sayıya çevriliyor — 3. bölüm. 4. Gelen cevabın çoğu zaman hiyerarşiden değil bir depodan geldiği anlaşılıyor — 4. bölüm.
- Adres makineyi gösteriyor, süreci gösteren ikinci sayı devreye giriyor — 5. bölüm. 6. Üç mesajla bir bağlantı kuruluyor ve iki taraf başlangıç numaralarını değiş tokuş ediyor — 7. bölüm. 7. Kilit taşımanın üstüne takılıyor; tek gidiş-dönüşte anahtar kuruluyor — 10. bölüm. 8. İstek nihayet yazılıyor ve sunucu onu hangi siteye ait olduğunu başlıktan öğreniyor — 12. bölüm. 9. Aynı veri her katmanda bir zarf daha giyiyor — 18. bölüm. 10. Kart çerçeveyi okuyor ve adres eşleşmezse gerisini hiç okumadan bırakıyor — 21. bölüm. 11. Anahtar hangi adresin hangi kabloda olduğunu kendi öğreniyor — 24. bölüm. 12. Yönlendirici en uzun öneki seçiyor ve paketi bir sonraki durağa itiyor — 36. bölüm. 13. Otonom sistemler birbirine yol ilan ediyor; kimse haritanın tamamını tutmuyor — 42. bölüm. 14. Bitler cama giriyor, kıtayı geçiyor, karşı tarafta soyuluyor ve ilk bayt geri dönüyor — 52. bölüm ve 62. bölüm.
Üç soru, birlikte
Girişte üç soru sormuştum ve üçünü ayrı bölümlerde kapattık. Şimdi yan yana koyalım, çünkü üçü aynı fikrin üç yüzü.
Bir isim nasıl adrese dönüşüyor ve bunu sana kim söylüyor? Sorumluluk bölünerek. Kimse bütün adları bilmiyor; her basamak yalnızca bir sonraki basamağı gösteriyor. Sana söyleyen ise hiyerarşinin kendisi değil, onun müşterisi olan resolver.
Kaybolabilen bir yolun üstünde kaybolmayan bir aktarım nasıl kuruluyor? Zekâyı uçlara koyarak. Ağ teslim sözü vermiyor; sözü veren, iki uçtaki yazılım.
Kimsenin yolun tamamını bilmediği bir ağda paket yolunu nasıl buluyor? Yerel kararla. Her kutu yalnızca bir sonraki durağı seçiyor ve doğru yol bu seçimlerin toplamından çıkıyor.
Üçünün ortak cevabı tek cümlede duruyor: internet, merkezî bilgiyi yerel karara çevirerek ölçekleniyor. Ölçeklenmesinin sebebi budur, ve kırılganlıklarının da.
Kitabın kasten dışarıda bıraktıkları
Dürüst olmak gerekiyor: bu kitap her şeyi anlatmadı ve anlatmadıklarının bir kısmı bilinçli seçimdi.
Türetmeleri geçtim. Kitap boyunca formül kullandım ve hesap yaptım: Shannon kanal kapasitesini, Snell yasasından kritik açıyı, Hamming uzaklığının sezme ve düzeltme eşiklerini, kayıp oranıyla hızın ters karekök ilişkisini, hücre kümesinin neden yalnızca belli sayılarda kurulabildiğini. Ama hiçbirini kanıtlamadım. Shannon’ın sınırı nereden çıkıyor, ALOHA’nın veriminin niçin tam olarak 1/(2e) olduğu, testere dişinin ortalamasının niçin karekökle ölçüldüğü — üçünün de arkasında bu kitapta açmadığım bir olasılık ve bilgi kuramı katmanı var.
Ayrım şu: formülü kullanmak için ne söylediğini bilmek yeter, ve o kadarını verdim. Türetmek için başka bir kitap gerekiyor. Burada tek bir isteğin yolculuğunu izledik, her durağın altındaki teoriyi değil.
İşletim ve tasarım da dışarıda. Bir ağı nasıl boyutlandıracağın, hangi topolojiyi neye göre seçeceğin, kapasite planlamasının nasıl yapıldığı ayrı bir kitabın konusu. Aynı şekilde saldırı ve savunma tarafına yalnızca yolun üstünde denk geldiğimiz kadarıyla değdik.
Bir de zamanın kendisi var. Bu kitaptaki güncel sayılar 2026 ölçümleridir ve bir kısmı birkaç yıl içinde eskiyecek. Mekanizmalar eskimeyecek; oranlar eskiyecek. Hangisinin hangisi olduğunu ayırt edebilmen için her sayının yanına kaynağını ve tarihini yazdım.
Katmanlı tasarımın bedeli
Kitap boyunca katmanların işi kolaylaştırdığını gördük. Kolaylaştırmayan taraflarını da gördük ve toplamak gerekiyor.
Her katman kendi başlığını ekliyor; küçük paketlerde taşınan verinin yarısı başlık olabiliyor. Her katman bir üstündekinden habersiz çalıştığı için aynı iş iki kez yapılabiliyor — sağlama toplamı üç ayrı katmanda hesaplanıyor. Ve bir katmanın verdiği söz üstündekinin ihtiyacına tam oturmayınca, aradaki fark yeni bir katmanla kapatılıyor.
Buna rağmen kimse katmanları kaldırmadı. Sebep şu: katman bir performans tercihi değil, bir değiştirilebilirlik tercihi. Kablonun bakırdan cama geçmesi üstteki hiçbir şeyi bozmadıysa, bedeli ödemeye değmiş demektir.
Bunun bir de teknik olmayan yüzü var. İnterneti ayakta tutan şey yalnızca protokoller değildir; aynı zamanda anlaşmalardır. İki operatörün trafiği karşılıklı taşımayı kabul etmesi, bir kayıt kuruluşunun alan adını devretmesi, bir standart kuruluşunun bir sayıyı tahsis etmesi — bunların hiçbiri kodda yazmıyor. Kitap boyunca birkaç kez, teknik olarak mümkün olan bir şeyin ticari olarak yapılmadığını gördük. Ağın şeklini belirleyen şey çoğu zaman mühendisliğin sınırı olmuyor; kimin kiminle anlaştığı oluyor.
Buradan Sonra Nereye?
Dört somut yol var.
Kendi ağını ölç. Elindeki komutlar artık yabancı değil: dig, ss, ip route, traceroute, tcpdump. Kendi makinenden bir sayfa açıp trafiği baştan sona izle; bu kitabın tamamı o çıktının içinde duruyor.
Standardı kaynağından oku. Bir protokolü gerçekten bilmek, RFC’sini açmakla başlıyor. RFC 9293 (TCP), RFC 8446 (TLS 1.3), RFC 9110 (HTTP) ve RFC 1035 (DNS) iyi bir başlangıç. Metinlerin dili kuru ama tuzağı yok: her belge kendinden önceki numarayı hangi noktada geçersiz kıldığını başında söylüyor. Sayı ararken de aynı yere bak — bir alanın kaç bit olduğunu ikinci elden okumak yerine tanımlandığı satırdan okumak, bu kitabın da yöntemiydi.
Bir laboratuvar kur. Sanal makinelerle iki alt ağ ve bir yönlendirici, kitaptaki bölümlerin yarısını elle tekrarlatır. Maskeyi bir bit kaydır ve iki makinenin birbirini görmez olmasını izle; varsayılan yolu sil ve yerel ağın hâlâ çalıştığını gör. Yanlış yapılandırdığında öğrendiğin şey, doğru yapılandırdığında öğrendiğinden fazla.
Klasiklere geç. Kurose ve Ross’un Computer Networking: A Top-Down Approach kitabı bu kitabın da omurgasıydı. Yanına Tanenbaum’un Computer Networks’ü, derinlik için Stevens’ın TCP/IP Illustrated serisi ve tasarım gerekçesi için Peterson ile Davie’nin Computer Networks: A Systems Approach kitabı konabilir.
Bonus: Küçük Notlar
Kitapta yeri gelmeyen birkaç şey.
Ethernet’in adı, ışığı taşıdığı varsayılan ve sonradan var olmadığı anlaşılan “eter”den geliyor. ping komutunun adını yazan mühendis, denizaltı sonarının sesinden esinlendiğini söylemişti. Ve internet üzerinden geçen trafiğin büyük kısmı, kıtaları birbirine bağlayan ve bir bahçe hortumundan kalın olmayan kablolardan geçiyor.
Bir de teşekkür. Bu kitap ders kitaplarına, Türkçe ders serilerine ve onlarca standart metnine dayanıyor; bu alanı yazanların emeği olmasa hiçbiri yazılamazdı. Bir hata bulursan ya da bir bölüm sende oturmadıysa, söylemen bu kitabı düzeltir.
Bitirirken bir şey daha söylemek istiyorum. Bu yolculuk boyunca en çok tekrarlanan fikir, hiçbir parçanın bütünü bilmemesiydi. Tarayıcı ağı bilmiyordu, kart yolu bilmiyordu, anahtar hedefi bilmiyordu, yönlendirici yolun tamamını bilmiyordu, otonom sistem komşusunun içini hiç görmüyordu. Her biri yalnızca kendi bir adımını doğru yaptı.
Bu, mühendislikte pek rastlanmayan bir başarı. Milyarlarca makine, tek bir merkez olmadan, kimsenin izin vermesini beklemeden, birbirine yalnızca sınırda anlaşarak çalışıyor. İşin zor tarafı da bu: kimse tamamından sorumlu olmadığı için, kimse tamamını da düzeltemiyor.
Adres çubuğu hâlâ orada. Bir dahaki sefere Enter’a bastığında, arada ne olduğunu biliyor olacaksın.