Ağlar'a “Sen”i Katmak

Sürümler
Standart · Tek sayfa

Giriş: 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, transport layer’ında, bir switch’in MAC tablosunda, bir router’ın 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 yetmiş 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, kitabın farklı yerlerinde tek tek kapatacağız; son sözde de üçünü birlikte toparlayacağız.

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?

Okumadan önce

Bölümler birbirine sorularla bağlı: her biri bir öncekinin sonunda sorulan soruyla açılıyor, o yüzden sıra bozulmadan okumak en kolayı. Konuyu zaten biliyorsan yol haritasından istediğin durağa atlayabilirsin; bir bölüm önceki bir durağa dayanıyorsa oraya bağlantı veriyor.

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.

Bazı terimleri İngilizce bıraktım: switch, router, frame, flow ve OSI katmanlarının adları (application layer, transport layer gibi). Komut çıktılarında, belgelerde ve iş ilanlarında karşına bu adlarla çıkacaklar. Her birini ilk ele aldığım yerde Türkçe açıklıyorum; Türkçesi yerleşmiş olanlarda (adres, bağlantı, önbellek) Türkçeyi kullanıyorum.

Kod bloklarındaki komutları çalıştırmak zorunda değilsin; çıktılarını metnin içinde gösteriyorum. Denemek istersen komutların çoğu Linux ve macOS’ta olduğu gibi çalışıyor; Windows’ta farklı olanların bir kısmının karşılığını da yanlarına yazdım.

Her bölümün başlığının altında okuma süresi yazılı. Klavyede j bir sonraki, k bir önceki bölüme geçiriyor.

Yolun haritası

Bölümleri on iki kısma ayırdım. İlk dokuz kısım yolculuğun kendisi; her birinin adı isteğin o sırada nerede olduğunu söylüyor. Yolculuk 70. bölümde bitiyor, kitap bitmiyor. Son üç kısım aynı fikirleri yolun kenarındaki başka ağlarda sürdürüyor: isteği tarayıcı olmadan kendi kodunla göndermek ve bir protokol tasarlamak, ses ve görüntünün ağdan nasıl aktığı, pille yaşayan kablosuz sensör ağları. En sonda da bütün kitabı toparlayan bir kapanış bölümü var.

BölümBaşlıkNe öğreneceksin?Süre
Kısım 1 Yola Çıkmadan Önce
1Adres Çubuğundan İsteğeURL ayrıştırma, şema ve yetkili alan, tarayıcı önbellekleri, isteğin doğuşu10 dk
2Paket Anahtarlamalı Yolpaket anahtarlama ve store-and-forward, iletme tablosu, devre anahtarlama ve garantili bant genişliği, FDM ile TDM, gecikmenin dört bileşeni, kuyruk ve kayıp, darboğaz ve throughput formülü12 dk
3İsimden Adresetek listenin sınırı, kök ve üst düzey alan, yetkili sunucu, resolver, özyinelemeli ve yinelemeli sorgu, DNS mesaj başlığı ve bayrakları, RCODE, tutkal kaydı ve kök ipuçları11 dk
4DNS Kayıtlarıkaynak kaydı ve dört alanı, kayıt türleri, SRV ile port, CAA ile sertifika izni, HTTPS kaydı, ters çözümleme ve in-addr.arpa, bölge ve SOA, bölge aktarımı6 dk
5Önbellek, Tazelik ve Güvenyaşam süresi ve isabet oranı hesabı, önbellek katmanları, DNSSEC imzası, DoH ve DoT, merkezileşme tartışması11 dk
Kısım 2 Bağlantı Kuruluyor
6Port Numarası ve Soketport numarası, soket four-tuple'ı, dinleme, iyi bilinen portlar, geçici port havuzu ve tükenmesi, demultiplexing12 dk
7Bağlantısız Taşıma: UDPUDP başlığı, bağlantısız gönderim, checksum ve pseudo-header, mesaj sınırı, ne zaman tercih edilir7 dk
8Üç Adımlı El SıkışmaSYN, SYN-ACK, ACK, başlangıç sıra numarası, yarı açık bağlantı, RTT bedeli12 dk
9Simetrik Şifrelemetehdit modeli, dinleme ve sahtecilik, simetrik şifreleme, AES, blok kipleri, anahtar dağıtımı sorunu10 dk
10Açık Anahtarlı Kriptografiaçık anahtar fikri, Diffie-Hellman anahtar uzlaşması, RSA, özet fonksiyonu, sayısal imza8 dk
11TLS El SıkışmasıClientHello, anahtar değişimi, oturum anahtarı, 1-RTT, 0-RTT ödünleşimi9 dk
12Sertifika Zincirisertifika zinciri, kök deposu, iptal listesi ve OCSP, OCSP stapling, Certificate Transparency, ad doğrulama11 dk
Kısım 3 İstek Yazılıyor
13HTTP Mesajının Anatomisiistek satırı, metotlar, başlıklar, içerik pazarlığı, bayt aralığı istekleri, gövde, durum kodları, koşullu istek9 dk
14Durum, Çerez ve Oturumdurumsuz protokolde durum, çerez ve öznitelikleri, SameSite ile CSRF, çerez adı önekleri, oturum, web önbelleği, proxy, koşullu istek11 dk
15HTTP/2'den HTTP/3'ekalıcı bağlantı, multiplexing, baş engelleme, QUIC, HTTP/3, bağlantı göçü9 dk
16İçerik Dağıtım Ağlarıiçerik dağıtım ağı, kenar sunucu, anycast, coğrafi routing, önbellek isabeti9 dk
17Diğer Uygulama Protokollerie-posta zinciri, SMTP ve IMAP, MIME, SPF ve DKIM ile DMARC, video akışı ve DASH, eşler arası dağıtım10 dk
Kısım 4 Makineden Yerel Ağa
18Katmanlı Mimarikatman ve modülerlik, OSI yedilisi ve iki eksik kat, TCP/IP dörtlüsü, beş katmanlı yığın, fiziksel katmanın dört başlığı, cihazların katmanı, router ile switch ayrımı10 dk
19Hizmet ve Protokolhizmet ile protokol ayrımı, bağlantı yönelimli ve bağlantısız hizmet, interface, SDU ve PDU, MAC ile LLC, hizmet ilkelleri, kum saati, katmanlamanın faturası9 dk
20Encapsulation ve Başlıklarencapsulation, IPv4 başlığının bütün alanları, IHL ve DSCP, DF ile yol MTU keşfi, Ethernet frame'i, MTU, parçalama, yük ve başlık oranı11 dk
21Paket Yakalama ve Çözümlemeyakalama interface'i, karışık mod, yakalama ve gösterim filtreleri, akış takibi, kayıt biçimi8 dk
22Ağ Interface Kartıağ kartı, frame sınırlandırma ve bit doldurma, halka tampon, DMA, kesme birleştirme, boşaltma motorları10 dk
23Fiziksel AdreslemeMAC adresi, OUI blok boyutları, frame yapısı, Ethernet II ile 802.3 ayrımı, multicast eşlemesi, EUI-64, adres rastgeleleştirme12 dk
24Hata Sezme ve CRCeşlik biti, Hamming uzaklığı, internet sağlaması, CRC, sezme ile düzeltme farkı, ileri hata düzeltme9 dk
25Adres Çözümleme: ARPARP isteği, broadcast domain, ARP tablosu, bedava ARP, proxy ARP, zehirleme8 dk
26Ortam Erişimi: CSMA/CDpaylaşılan ortam ve collision domain, hub, çoklu erişimin üç ailesi, ALOHA ve dilimli ALOHA, CSMA ve CSMA/CD, ikili üstel geri çekilme, dilim süresi ve 64 bayt, tam çift yönlü kip6 dk
27Switch'lerMAC öğrenme tablosu, flooding (taşkın), aynı ağdaki bir konuşmanın adımları, collision domain ile broadcast domain, bridge'den switch'e, store-and-forward ile cut-through, MAC flooding, döngü ve Spanning Tree12 dk
28Ağ Topolojileriyıldız, veri yolu, halka, örgü topolojileri, structured cabling (yapısal kablolama), yatay ve dikey dağıtım10 dk
29Sanal Yerel AğlarVLAN, 802.1Q etiketi, access port ve trunk, yerel VLAN, VLAN atlama, VLAN'lar arası routing, 3. katman switch9 dk
Kısım 5 Havada ve Evde
30Kablosuz Erişim: 802.11CSMA/CA, SIFS ile DIFS, gizli terminal ve RTS/CTS, keşif ve ilişkilendirme, BSS ile ESS, 802.11 frame'i ve üç adres, 2,4 GHz kanalları11 dk
31Radyo Kanalı ve KapasiteShannon kapasitesi, SNR ve dBm, modülasyon derinliği ve MCS, kanal genişliği, OFDM ve OFDMA, MIMO ve MU-MIMO, Wi-Fi kuşakları13 dk
32Kablosuz Ağ GüvenliğiWEP'ten WPA3'e, korumalı yönetim frame'leri, dört adımlı el sıkışma ve KRACK, PMKID, SAE ve forward secrecy, geçiş kipi ve Dragonblood, 802.1X ile EAP11 dk
33Hücresel Ağlarhücre kavramı, frekans tekrar kullanımı ve küme boyu, sektörleme, baz istasyonu, çekirdek ağ, SIM ile kimlik, aktarma, taşıyıcı toplama11 dk
34Spektrum ve Kuşaklarspektrum tahsisi, kanal ve alt kanal, FDD ile TDD çift yönlülüğü, FR1 ve FR2 ve FR3, mmWave ödünleşimi, kuşak takvimi11 dk
35Hareketlilik ve Aktarmahücreler arası aktarma, ölçüm raporu ve histerezis, sert ve soft handover, X2 ile Xn hazırlığı, DAPS ve koşullu aktarma, UPF çapası ve dolaşım, Wi-Fi dolaşımı, mobil IP, QUIC bağlantı göçü11 dk
36Adres Kiralama: DHCPDHCP dörtlüsü, kira süresi, statik ve dinamik adres, rezervasyon, default gateway, ev router'ının dört işi, WAN adresini operatörün kiralaması14 dk
Kısım 6 Router'dan Router'a
37Adresin AnatomisiIPv4 adresi, ağ ve makine parçası, maske ve bitsel VE, CIDR, alt ağ formülleri, önek merdiveni, VLSM tasarımı, ayrılmış bloklar13 dk
38Adres Tükenmesi ve IPv6IPv6 başlığı, adres türleri ve kapsam, adres gösterimi, SLAAC ve DAD, komşu keşfi, çift yığın, NAT64 ile 464XLAT11 dk
39Router Mimarisien uzun önek eşleşmesi, routing tablosunun okunması, administrative distance ve metrik, özyinelemeli arama, IP sabit MAC değişken, RIB ve FIB (iletme tablosu), anahtarlama dokusu, kuyruğun yeri13 dk
40Kuyruk Yönetimitrafik yoğunluğu, tampon boyutu ve bufferbloat, RED, ECN ve FQ-CoDel, paket zamanlama, öncelik ve WFQ, jeton kovası, hizmet kalitesi, ağ tarafsızlığı9 dk
41Cihaz Yapılandırmakonsol ve SSH, komut satırı kipleri, interface yapılandırma, statik yol ve sessiz arıza, çalışan ve başlangıç yapılandırması, şifre kurtarma11 dk
42Routing Protokolleriuzaklık vektörü, link state (bağlantı durumu), RIP, OSPF, yakınsama, sayarak sonsuza gitme11 dk
43Kontrol Düzlemi ve SDNveri düzlemi ve kontrol düzlemi ayrımı, yazılım tanımlı ağ, denetleyici, flow kuralları ve on iki eşleşme alanı, trafik mühendisliği9 dk
44Ağ İzleme ve YönetimiSNMP ve MIB, sürümler ve topluluk dizesi sorunu, NETCONF ve YANG, akış telemetrisi, NetFlow, IPFIX ve sFlow, sayacın başa dönmesi, eşik ve alarm10 dk
Kısım 7 Ağlar Arasında
45Alanlar Arası Routingotonom sistem, ISP kademeleri (Tier 1 ve Tier 2), geçiş (transit) ve eşleme (peering), BGP oturumu ve zamanlayıcılar, path vector, yol seçimi ve sıcak patates, rota kaçırma, RPKI ile kaynak doğrulaması12 dk
46Adres ÇevirisiNAT tablosu, alan alan çeviri, port çevirisi, NAT davranış türleri, STUN ve delik açma, ALG, CGNAT, end-to-end argument'ın bedeli12 dk
47Ara Kutularara kutu kavramı, load balancer, reverse proxy, TLS sonlandırma, ağ işlev sanallaştırma, end-to-end argument'ın aşınması10 dk
48Tünelleme ve IPsectünelleme fikri, GRE ve VXLAN, IPsec kipleri, AH ve ESP, IKE, NAT-T, VPN türleri, WireGuard, bölünmüş tünel, MTU bedeli ve kara delik11 dk
49Firewall'larsınır politikası, paket süzme ve ACL, ilk eşleşme ve örtük ret, durum takipli firewall, uygulama geçidi, kaynak adres sahteciliği, saldırı tespit ve önleme, DMZ ve port taraması10 dk
50Ağ SaldırılarıDoS ve DDoS, botnet, SYN çerezi, kök sunucuların dayanıklılığı, aradaki adam, SSL stripping, zero trust, erişim kısıtlamasının katmanları7 dk
51Operatör ve Metro Ağlarımetro Ethernet, taşıyıcı sınıfı, E-Line ve E-LAN servisleri, hizmet seviyesi, Q-in-Q, MPLS etiketi ve L3VPN, segment routing11 dk
Kısım 8 Kabloda ve Camda
52Bitten Sinyalesinyalin üç biçimi, seri ile paralel iletim, saat kayması ve sapması, baseline wander, hat kodlama, NRZ ve NRZI, bipolar-AMI, Manchester, asenkron seri ve RS-23210 dk
53Sembol Hızı ve Kanal Kapasitesibaud ile bit hızı, blok kodlama, 4B/5B ve 8B/10B, MLT-3 ve PAM, bant genişliği ve Fourier, Nyquist ve Shannon sınırı, termal gürültü, bozulmanın kaynakları, desibel10 dk
54Multiplexing Tekniklerifrekans bölmeli multiplexing, zaman bölmeli multiplexing, darbe kod modülasyonu ve 64 kbit/s, T1 ve E1, istatistiksel multiplexing, çoklu erişim, dalga boyu multiplexing11 dk
55İletim Ortamlarıtwisted pair ve farksal iletim, koaksiyel, ekranlama aileleri, yangın sınıfı, Ethernet adlandırması, kategori ve sınıf, konnektör aileleri, twinax ve DAC11 dk
56Bakır Kablo SonlandırmaUTP kategorileri, büküm ve diyafoni, zayıflama-diyafoni oranı, T568A ve T568B, düz ve çapraz kablo, MDI/MDI-X, sonlandırma, tel haritası ve TDR, Power over Ethernet12 dk
57Fiber Sonlandırmasoyma kırma ve birleştirme, kırım açısı, Fresnel yansıması, kaynaştırma ile mekanik ek, pigtail, ferrül ve cila, APC ile UPC, SC LC ve MPO, temizlik, güç ölçer ve OTDR5 dk
58Fiber Optik İletimSnell yasası ve kritik açı, sayısal açıklık, lazer ve VCSEL, katman çapları, tek modlu ve çok modlu sınıflar, bükülme, dispersiyon, Rayleigh saçılması ve zayıflama penceresi, kayıp bütçesi, içi boş fiber15 dk
59Bakır Erişim Ağı: DSLerişim ağı ve kenar router, abone hattı ve saha dolabı, çevirmeli modem ve 56 kilobit, boş bandı kullanmak, frekans planı, şerit şerit taşıma, ayırıcı ve DSLAM, DSL kuşakları9 dk
60DSL'de Hız ve Mesafezayıflama ve frekans, santral uzaklığı ve hız, yükleme bobini ve köprü uç, modemin açılışı ve senkron, modemin gösterdiği sayılar, serpiştirme, bakırı kısaltmak ve vektörleme, toptan erişim ve PPPoE8 dk
61Pasif Optik AğlarFTTx aileleri, pasif optik ağ, OLT ve ONT, ayırıcı, dalga boyu planı, zaman bölmeli erişim ve mesafe ölçümü, GPON ve XGS-PON, kayıp bütçesi7 dk
62Kablo Erişim Ağlarımelez fiber koaksiyel ağ, frekans bölmeli multiplexing, kablo modemin işi, kanal hesabı ve DOCSIS hızları, channel bonding, band split ve asimetri, DOCSIS kuşakları9 dk
63Kablo Modem ve CMTSCMTS ve baş uç, modemin açılışı, ranging, yapılandırma dosyası, BPI+ şifrelemesi, mini dilim ve MAP frame'i, paylaşılan segment ve akşam yavaşlaması, segment bölme, DSL ile kablonun farkı7 dk
64Denizaltı Kablolarıdenizaltı kabloları, fiber çifti, yayılım gecikmesi ve uydu, optik yükselteç ve güç besleme, arıza sebepleri ve onarım, kara istasyonu, eşleme ve içerik şirketlerinin kabloları10 dk
Kısım 9 Karşı Tarafta ve Dönüşte
65Veri Merkezi Ağlarıtop-of-rack ve DAC, leaf-spine topolojisi, doğu-batı trafiği, ECMP ve bağlantı toplama, aşırı abonelik oranı, RoCE ve kayıpsız taşıma, PFC8 dk
66Encapsulation Çözmeters encapsulation, frame kontrolü ve sağlama, demultiplexing, five-tuple ve soket, alıcı tamponu, kabul kuyruğu, olay döngüsü ve epoll, sıfır kopya, alış tarafı ölçekleme9 dk
67Güvenilir Aktarımsıra numarası, birikimli ACK, zaman aşımı kestirimi, hızlı yeniden gönderim, seçici onay, Nagle ile gecikmeli onay, sliding window, flow control11 dk
68Tıkanıklık Denetimitıkanıklık penceresi, slow start, 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 bildirim9 dk
69Trafik Çözümlemedinleme noktası, tcpdump ve BPF, yeniden gönderim tespiti, flow grafiği ve pencere grafiği, oturum sırlarıyla TLS çözme, şifreli trafikte açık kalan başlık6 dk
70Gecikme Bütçesiilk bayta kadar geçen süre, gecikme bütçesi, silinebilen turlar ve 0-RTT, gecikmenin dört bileşeni, traceroute okuma, curl ile ölçme8 dk
Kısım 10 Uygulamayı Kendin Kurmak
71Soket Programlamagetaddrinfo ve connect, sendall ile recv, akış ve mesaj sınırı, çerçeveleme, bind listen accept, eşzamanlılık modelleri, UDP soketi, hata kodları13 dk
72Eşten Eşe ve Protokol Tasarımıistemci-sunucu ve eşten eşe, dağıtım süresi hesabı, BitTorrent parçaları ve karşılıklılık, Kademlia DHT, NAT arkasındaki eş, protokol tasarım kararları10 dk
Kısım 11 Ses ve Görüntü
73Uyarlanır Video Akışıkare türleri ve GOP, bit hızı merdiveni, HLS listesinin içi, oynatma tamponu, ABR algoritmaları, canlı yayın gecikmesi, QUIC ile video9 dk
74Gerçek Zamanlı Ses ve Görüntügecikme bütçesi, paketleme hesabı, jitter ve oynatma tamponu, kayıp gizleme ve FEC, RTP ve RTCP, SIP ve SDP, WebRTC ve ICE, SFU, VoLTE10 dk
Kısım 12 Kablosuz Sensör Ağları
75Kablosuz Sensör Ağlarının Mimarisisensör düğümünün parçaları, pil hesabı, iletimin ve hesaplamanın enerjisi, sink ve çok sekme, düz ve kümeli yapı, veri merkezli ağ, IEEE 802.15.4, Zigbee Thread ve IP9 dk
76Sensör Ağlarında Ortam Erişimienerji israfının dört kaynağı, 802.15.4 CSMA-CA, superframe ve GTS, eşzamanlı uyku, düşük güçlü dinleme, B-MAC X-MAC ve ContikiMAC, TSCH9 dk
77Sensör Ağlarında Yönlendirme ve IPbağlantı kalitesi ve ETX, SPIN ve yönlendirilmiş yayılım, LEACH, coğrafi yönlendirme, CTP, 6LoWPAN başlık sıkıştırma, RPL ve Trickle, CoAP ve MQTT11 dk
78Zaman Eşitleme ve Konum Bulmasaat kayması, gecikmenin bileşenleri, iki yönlü eşitleme, RBS, TPSN, FTSP, RSSI, varış zamanı, trilaterasyon, DV-Hop9 dk
79Sensör Ağı Uygulamalarıhabitat izleme, mikro iklim, yanardağ ve köprü izleme, hassas tarım, veri verimi, LoRaWAN, NB-IoT, Sigfox, anahtar ön dağıtımı, yönlendirme saldırıları, IoT mevzuatı14 dk
80Mobil Kablosuz Sensör Ağlarıhareketli sink, veri katırları, ZebraNet, gecikmeye dayanıklı ağlar, epidemic ve spray-and-wait, MANET, AODV, DSR, OLSR, rastgele ara nokta modeli, araçlar arası iletişim, telefonla deprem uyarısı12 dk
Kapanış
81Son Sözüç omurga sorunun birlikte mühürlenmesi, katmanlı tasarımın bedeli, buradan sonrası8 dk

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ça

Bu biçimi RFC 3986 tanımlıyor ve belgenin kendisi de “adres” demiyor: URI, açılımıyla Uniform Resource Identifier, tekbiçimli kaynak tanımlayıcısı. Gündelik dilde aynı şeye URL deniyor; standart URL’yi, kaynağın yerini de söyleyen URI alt kümesi olarak tanımlıyor ve adres çubuğuna yazdığın her şey o alt kümeye giriyor.

Ş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 (authority) makineyi gösteriyor ve yanında isteğe bağlı bir port taşıyabiliyor: aynı makinede çalışan programlardan hangisine gidileceğini söyleyen bir sayı. Portu 6. bölümde ayrıntısıyla açacağız. 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.

şemavarsayılan portne için
http80şifresiz web
https443şifreli web
ws / wss80 / 443çift yönlü web bağlantısı
ftp21eski dosya aktarımı
ssh22ş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 bedeli, bağlantıların uyarı vermeden kırılması. 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ı sunucunun 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ümekarakterlerkural
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 şeyboşluk, <, ", ASCII dışıkodlanmadan yazılamaz

Tablodaki 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 proxy’ler daha erken kesebiliyor; 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 ve her satırı yolun başka bir durağı kullanır: şehri ayırma merkezi, sokağı dağıtım şubesi, kapı numarasını postacı. Adres de böyle katmanlı. Şemayı tarayıcı okuyor, makine adını resolver (ad çözümleyici), yolu karşıdaki sunucu. Benzerlik gizlilikte kırılıyor: zarfın her satırını eline alan herkes okuyabilir, oysa https ile giden bir istekte yol ve sorgu şifreli taşınıyor. Aradaki cihazlar en fazla makine adını görebiliyor.

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ı (IDN). Tarayıcı böyle bir adı Punycode adlı bir kodlamayla ASCII’ye çeviriyor 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.com

Numaranı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. Alan adlarında büyük-küçük harf farkı olmadığı için ad kodlanmadan önce küçük harfe indiriliyor. Unicode’un dile bakmayan kuralında noktalı büyük İ’nin küçüğü düz i değil, i ile üstüne binen ayrı bir nokta işareti. Kodlama o noktayı da taşıyor, bu yüzden İstanbul.com ile istanbul.com iki ayrı alan adı: ikincisi olduğu gibi ASCII kalıyor, birincisi xn-- ile başlıyor. Yoldaki büyük-küçük harf tuzağında gördüğün Türkçe i, burada alan adının içine taşınmış oluyor.

Unicode’un zenginliği bir güvenlik sorunu da 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 alfabeleri karıştırıyorsa ya da tanınmış bir adı taklit ediyorsa, adres çubuğunda okunur hâli yerine xn-- hâli gösteriliyor. Çirkin görünmesi de kasıtlı.

Tarayıcı önce kendi cebine bakıyor

Tarayıcının ilk işi ağa çıkmak değil. Önce bu yolculuğu hiç yapmadan kurtulup kurtulamayacağına, kurtulamıyorsa yolu nasıl kısaltacağına bakıyor. Dört cebi var ve biri Enter’a basmadan önce bile devrede.

İlki 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. Enter’a bastığında yolun bir kısmı çoktan yürünmüş oluyor. Tahmin yanlışsa gitmek istemediğin bir sunucu senin geldiğini görmüş oluyor.

İkincisi 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. Mekanizmanın adı HSTS (HTTP Strict Transport Security): site bu isteği bir yanıt başlığıyla bildiriyor, tarayıcı da onu süresi dolana kadar hatırlıyor. Kuralın bir kör noktası var: siteye ilk kez gidiyorsan o başlığı henüz hiç görmedin. İlk isteği de korumak için tarayıcılar, kendi içlerine gömülü bir ön yükleme listesiyle (preload list) geliyor.

Adres kesinleşince sıra kopyalara geliyor. 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 kopyayı çöpe atmıyor: isteğe elindeki kopyanın tarihini ekleyip “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ı 14. bölümde web önbelleğini kurarken açacağız.

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; her birinin de kendi adresi var.

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. Etikete async ya da defer ekleyen geliştirici bu beklemeyi kaldırmış oluyor: betik arka planda iniyor, ayrıştırma durmuyor.

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

Aradaki 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 round-trip time (gidiş-dönüş süresi) istiyor; kısaca RTT.

İ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 metinden ibaret:

GET /bolum/yol?dil=tr HTTP/1.1
Host: aglar.emircandemir.com
Accept: text/html
Accept-Language: tr
If-Modified-Since: Thu, 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 burada.

Aynı sorun şifreli bağlantılarda bir kez daha çıkıyor. Sunucu, kimliğini kanıtlayan bir belge sunuyor; adı sertifika ve her site için ayrı. Hangi sertifikayı sunacağına karar verebilmesi için siteyi bilmesi gerekiyor, ama sertifika gelmeden istek de şifrelenemiyor. Bu düğümü 11. bölümde şifreli bağlantıyı kurarken çözeceğiz.

Metin bir sokete yazılacak. Soket, işletim sisteminin uygulamaya verdiği bir tutamak; uygulama oraya yazıyor, gerisini işletim sisteminin çekirdeği, yani kernel hallediyor. Bu tutamağın kernel 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

  • 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: tahmin, güvenli bağlantı listesi, bellek ve disk. Yolculuğun en hızlısı, hiç yapılmayanıdır.
  • İstek birkaç satır okunabilir metinden ibaret ve Host satı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 bir ihmal değil, ölçek. Yolu baştan sona bilen bir merkez yok; her kutu yalnızca paketi hangi komşusuna vereceğini biliyor. İsimle çalışan bir ağda her kutunun dünyadaki bütün isimlerin nerede durduğunu bilmesi gerekirdi.

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 bina kablo dolabı: rafa monte yama panelleri ve bir switch, önlerinden yüzlerce mavi ve gri kablo sarkıyor. Kutuların ve kabloların gerçekte nasıl göründüğü.

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 (forwarding) diyoruz. İletirken bakılan tabloya da iletme tablosu (forwarding table) deniyor; Türkçede çoğu zaman yönlendirme tablosu diye de geçiyor. O tabloyu doldurmak ise küresel bir iştir, yavaştır, kutuların birbiriyle konuşmasıyla yürür; buna da routing diyoruz. İletmeyi 39., routing’i 42. bölümde ayrı ayrı açacağız. Kutuların adını da burada verelim. Bunlara router (yönlendirici) deniyor; kitabın geri kalanında o adla anacağım.

İki çizim. Üstte paketler kaynaktan hedefe router'lar üstünden düz bir yol izliyor. Altta yoldaki bir düğüm kırmızı çarpıyla devre dışı bırakılmış ve paketler alttaki düğümlerden dolaşarak aynı hedefe varıyor.

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. 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ü hız; onu görmek için önce yoldaki kutunun nasıl çalıştığına bakmak gerekiyor.

Kutu, paketin tamamı kendisine ulaşmadan onu bir sonraki kabloya itmeye başlamıyor; paketin sonuna eklenen hata denetimini ancak paket bütünüyle gelince yapabiliyor. Bu çalışma biçiminin adı store-and-forward, yani sakla ve ilet: her durakta paketin tamamı bir kez daha kabloya itiliyor.

Mesaj bölünmeseydi bu bedel ağır olurdu. 10 megabitlik bir mesajı, saniyede 10 megabit taşıyan üç hattan geçirdiğini düşün. Bütün hâlinde gönderilen mesaj her durakta bir saniye bekliyor ve varış üç saniye sürüyor. Bin pakete bölündüğünde ise ilk paket üçüncü milisaniyede varıyor, arkadakiler onu boşluk bırakmadan izliyor ve son paket bir saniyeyi iki milisaniye geçe varıyor. Aynı hatlar, aynı mesaj, neredeyse üç kat hızlı varış. Sebep, bölünmüş mesajın aynı anda birden fazla kabloda bulunabilmesi: baştaki paket üçüncü hattayken sondaki hâlâ birincide ilerliyor.

Mesajı paketlere bölüp her paketi durak durak sakla ve ilet kuralıyla taşıyan bu düzenin adı paket anahtarlama (packet switching). Router, bu düzenle çalışan kutudur: paketin tamamı gelmeden onu bir sonraki kabloya itmez, çıkış kablosunu da iletme tablosundan seçer.

Ö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. Bu yüzden devre anahtarlama garantili bant genişliği veriyor: hatta başkaları ne yaparsa yapsın senin hızın değişmiyor. Garanti bağlantı kurulurken veriliyor; yolda ayrılacak pay kalmadıysa bağlantı hiç kurulmuyor.

Manuel telefon santralinde çalışan operatörler. Öndeki operatör elindeki kırmızı kordonu jak alanındaki bir deliğe takıyor; sıra boyunca panellerde takılı duran onlarca kordon görünüyor. Her kordon, konuşma boyunca ayrılmış bir devre.

Payı ayırmanın iki klasik yolu var ve ikisi de tek bir hattı birden çok devreye bölüyor. Frekans bölmede (FDM) 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 (TDM) 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. İkisini 54. bölümde ayrıntısıyla göreceksin.

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. Şerit hattın kapasitesine, ayrılmış şerit devreye, giriş rampasındaki bekleme kuyruk gecikmesine, yolun en dar kesiti ise darboğaza karşılık geliyor. Benzetmenin tutmadığı yer taşma anı: 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 multiplexing. 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 multiplexing’in 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ş 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ı kuruşu kuruşuna 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:

gecikmeneye bağlıtipik mertebehattı hızlandırınca
işlemekutunun donanımımikrosaniyenin altıdeğişmez
iletimpaket boyu / hat hızı1 Gbit/s’te 12 µsküçülür
yayılımmesafe / ortamdaki hız1.000 km’de 5 msdeğişmez
kuyrukbaşkalarının trafiği0’dan onlarca ms’yedolaylı olarak küçülür

İletimle yayılım arasındaki 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.

İletimle yayılımın farkını zaman ekseninde görmek istersen:

İletim ile yayılım, zaman ekseninde
zamangönderen1.000 km fiberalıcıson bit 17 ms'deilk bityayılım5 msson bitiletim12 ms1,2 ms10 kat hızlı hat
İki uç ve zaman. Soldaki dikey çizgi gönderen, sağdaki alıcı; aralarında 1.000 km fiber var. Zaman yukarıdan aşağı akıyor. İki kalemi aynı çizime ölçekli sığdırmak için yavaş bir hat seçtik: 1 Mbit/s.
  1. İki uç ve zaman. Soldaki dikey çizgi gönderen, sağdaki alıcı; aralarında 1.000 km fiber var. Zaman yukarıdan aşağı akıyor. İki kalemi aynı çizime ölçekli sığdırmak için yavaş bir hat seçtik: 1 Mbit/s.
  2. İlk bit yola çıkıyor. İlk bit sıfır anında gönderenden çıkıyor ve camda saniyede yaklaşık 200.000 km ilerleyip alıcıya 5 ms sonra varıyor. Çizginin eğimi yalnızca mesafeye ve ortama bağlı: yayılım gecikmesi.
  3. Son bit 12 ms sonra çıkıyor. 1.500 baytı, yani 12.000 biti saniyede bir milyon bitle kabloya itmek 12 ms sürüyor. Son bit ancak o zaman yola çıkabiliyor. Gönderen tarafta biriken bu süre iletim gecikmesi.
  4. Paket bir şerit gibi akıyor. İki çizgi arasındaki şerit paketin bitleri. Son bit alıcıya 12 + 5 = 17 ms sonra varıyor: paketin tamamını almak iletimle yayılımın toplamı kadar sürüyor.
  5. Hat on kat hızlanınca. 10 Mbit/s hatta son bit 1,2 ms sonra çıkıyor ve şerit on kat inceliyor. Eğim ise hiç değişmiyor, yayılım yine 5 ms. Gigabitlik bir hatta şerit çizgiye döner; geriye yalnızca yayılım kalır.

Kuyruk neden birden büyü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 bilerek basitleştiriyorum: tıkanıklığı “kuyruk dolar, paket silinir” diye geçiyorum. Uçların buna nasıl tepki verdiği ayrı bir konu; 68. bölümde 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.

Evindeki hattı yükselttiğin hâlde hiçbir şeyin hızlanmaması çoğu zaman bununla açıklanıyor. 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 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 ilk durakta gördüğün 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

  • Yol, iki ucu olan bir tel değil; bağımsız kararlar veren kutuların ağı. Karar paket başına, iletme tablosuna bakılarak verildiği için sıra bile garanti değil.
  • Mesaj paketlere bölünüyor: kablo paylaşılabiliyor, bozulan parça tek başına yeniden gönderiliyor ve store-and-forward’ın her durakta ödettiği bekleme, paketler art arda aktıkça neredeyse kayboluyor.
  • Devre anahtarlama garantili bant genişliği veriyor, karşılığında boş kapasite tutuyor ve payı frekansta (FDM) ya da zamanda (TDM) bölüyor. Paket anahtarlamanın kazancı istatistiksel multiplexing, bedeli garantisizlik.
  • Dört gecikme üst üste biniyor: işleme, kuyruk, iletim ve yayılım. İletim paket boyu bölü hat hızı, yayılım mesafe bölü ortamdaki hız; hattı hızlandırmak yalnızca iletimi 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.

Bu çözüm gerçekten denendi ve birkaç yüz makine için işe yaradı. 1980’lerin ortasına kadar ağdaki bütün makinelerin adı HOSTS.TXT adlı tek bir dosyada duruyordu. Dosyayı Kaliforniya’daki SRI’ın ağ bilgi merkezi tutuyordu ve herkes onu düzenli aralıklarla oradan indiriyordu. Bugün her işletim sisteminde duran hosts dosyası o düzenin kalıntısı. Milyarlarca kayıt için ise işe 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. Ortaya çıkan sisteme DNS (Domain Name System, alan adı sistemi) deniyor. 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. Telde her etiketin önünde uzunluğunu söyleyen tek bir bayt duruyor ve o baytın en üst iki biti başka bir işe, adların tekrarını kısaltan bir sıkıştırma işaretine ayrılmış. Geriye kalan altı bit en fazla 63 sayabiliyor. 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: posta da adresi genelden özele, şehirden kapıya doğru okur; alan adı da sağdan sola, en genel parçadan başlayarak okunuyor. Fark şu: zarftaki bütün durakları tek bir kurum işletir, burada her durağın sahibi ayrı.

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 çoğu sitede 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; 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 stub resolver denen ç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; bu bilgiyi kimin dağıttığını 36. bölümde göreceğiz. 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ı porta, bağlantısız taşımayla, yani UDP ile 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 7. 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. EDNS(0) adlı bir uzantıyla bu sınır pazarlıkla büyütülebiliyor; 5. bölümde göreceğimiz imzalı cevaplar 512 bayta sığmadığı için o uzantı olmadan imzalama pratikte çalışmıyor. Bugün yaygın değer 1.232 bayt. 2020’de resolver ve sunucu yazılımlarının ortak kararıyla seçildi, çünkü bu boydaki bir cevap IPv6’nın en küçük paket boyuna bile bölünmeden sığı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:

bitalanboyne yapıyor
0Kimlik16 bitcevabın hangi soruya ait olduğunu eşleştirir
16Bayraklar16 bitaşağıda tek tek açılıyor
32QDCOUNT16 bitsoru bölmesindeki kayıt sayısı
48ANCOUNT16 bitcevap bölmesindeki kayıt sayısı
64NSCOUNT16 bityetki bölmesindeki kayıt sayısı
80ARCOUNT16 bitek 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 parçası bir soruyu cevaplıyor:

bitadne demek
QRsoru mu cevap mı0 soru, 1 cevap
Opcodeişlem türü0 sıradan sorgu, 5 dinamik güncelleme
AAyetkili cevapcevabı veren, alanın sahibi mi
TCkesildimesaj sığmadı, aynı soruyu bağlantı kurarak sor
RDözyineleme isteniyor“sen benim adıma yürü”
RAözyineleme var“yürüyebilirim”
RCODEsonuç koduiş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:

kodadne demek
0NOERRORsorun yok; cevap bölmesi boş olsa bile ad vardır
2SERVFAILsunucu cevaplayamadı; sık görülen sebep imza doğrulamasının çökmesi
3NXDOMAINböyle bir ad yok; bu kesin bir cevap
5REFUSEDsunucu 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 yukarıdaki tablonun kendisi: qr cevap olduğunu, rd özyineleme istendiğini, ra resolver’ın bunu yapabildiğini söylüyor. aa yok, demek ki cevabı alanın sahibi değil, aradaki resolver verdi. Resolver cevabı ister önbelleğinden bulsun ister o an zinciri yürüyerek, bu işareti hiçbir zaman koymuyor.

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, cevabın ek bölmesine, ns1.ornek.com için bir de A kaydı koyuyor ve döngü kırılıyor. Yetkili sunucu alanın dışında, mesela ns1.baskadns.net olsaydı, 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:

Bir ad çözülürken kim kaç kez konuşuyor
senin makinençözümleyicikökcom sunucusuornek.com yetkiliA? · RD=1A? www.ornek.comcom NS + tutkalA? www.ornek.comornek.com NSA? www.ornek.comA 203.0.113.9 · AA=1A 203.0.113.9
Makinen tek bir soru soruyor ve bekliyor. Sorunun içinde 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.
  1. Makinen tek bir soru soruyor ve bekliyor. Sorunun içinde 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.
  2. Kök adresi vermiyor, kapıyı gösteriyor. Çözümleyici köke sorduğunda cevap bölmesi boş dönüyor. Yetki bölmesinde com alanının NS kayıtları, ek bölmede o sunucuların adresleri, yani tutkal kayıtları var.
  3. Üst düzey alan da yalnızca yön veriyor. com sunucusu ornek.com alanı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.
  4. Yetkili sunucu cevabı veriyor. Üçüncü durakta AA biti açık geliyor: bu cevap önbellekten değil, kaydın sahibinden. Zincir burada bitiyor çünkü aşağıya devredilmiş bir yetki kalmadı.
  5. 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; TTL alanı 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.

Peki bir ad bu sisteme nasıl giriyor? Kaydettirdiğinde kayıt kuruluşuna (registrar) yetkili sunucularının adlarını ve adreslerini veriyorsun. Kuruluş da bu bilgileri üst düzey alan sunucusuna yazıyor. Zincirin sana çıkan halkası o an kuruluyor.

Bu yüzden yeni kaydedilen bir ad bir süre çalışmayabiliyor; kimi resolver’lar adı bilir, kimileri bilmez. Sebebini 5. bölümde açacağız.

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ı 5. bölümde ölçeceğiz.

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ı 45. bölümde göreceğiz.

Sonuç şu: on üç ad, dünyaya yayılmış bini aşkın kopyaya 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

  • 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.
  • Mesajın başlığı 12 bayt ve dört bölme sayacı taşıyor. Bayraklardaki AA cevabın sahibinden mi geldiğini, RCODE ise işin nasıl bittiğini söylüyor; NXDOMAIN ile SERVFAIL arasındaki fark arızanın yerini de ayırıyor.
  • Zincir kendi kendini kilitlemiyor: sunucu adının yanına iliştirilen tutkal kaydı ile yazılıma gömülü kök ipuçları, bir adı çözmek için önce başka bir adı çözme zorunluluğunu ortadan kaldırıyor.

Resolver zinciri yürüdü ve cevabı sana getirdi. Getirdiği şey çıplak bir sayı değil, türü ve ömrü olan bir satırdı. Peki aynı ada adresten başka neler yazılabiliyor?

Bölüm 4: DNS Kayıtları

Resolver’ın getirdiği şey çıplak bir sayı değildi, bir satırdı. O satırın bir türü vardı ve adres, türlerden yalnızca biri.

Aynı ada posta sunucusu da yazılıyor, takma ad da, port numarası da, hatta kimin sertifika verebileceği de. Peki bir ada kaç çeşit cevap asılabiliyor ve her biri kime ne söylüyor?

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 (TTL, saniye cinsinden), sınıf, tür, değer. Adın sonundaki nokta önceki bölümde 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ı. Kalıntısı hâlâ duruyor: 1970’lerin Chaosnet ağından kalan CH sınıfı bugün yalnızca bir sunucuya hangi yazılımı çalıştırdığını sormak için kullanılıyor (dig CH TXT version.bind). 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 NS ya da Windows’ta nslookup -type=MX ornek.com bu satırların türe göre süzülmüş hâlini döküyor. Eskiden hepsini tek seferde getiren ANY sorgusunu çoğu sunucu artık cevaplamıyor; RFC 8482 onu fiilen emekliye ayırdı, çünkü küçük bir soruya kocaman bir cevap döndürmek yükseltme saldırısının en sevdiği şeydi.

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ürnone söylüyor
A1adın IPv4 karşılığı
AAAA28adın IPv6 karşılığı
NS2bu alanın yetkili sunucusu; zincirin halkalarını bu tür kuruyor
CNAME5bu ad aslında şu addır (kanonik ad)
SOA6alanın künyesi: sahibi, seri numarası, zamanlayıcıları
PTR12adresten ada, yani ters yön
MX15bu alana gelen postanın teslim edileceği makine ve önceliği
TXT16serbest metin; posta doğrulama kayıtları burada durur
SRV33bir hizmetin hangi makinede ve hangi portta olduğu
CAA257bu alana kimin sertifika verebileceği
HTTPS65bağlantı daha kurulmadan hizmet parametreleri

Son üçü ötekilere göre 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; 6. 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. Sitenin kimliğini kanıtlayan sertifikaları sertifika makamları basıyor; zincirin nasıl işlediğini 12. bölümde göreceğiz. Her 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 kullanılıyor, varsa şifreli istemci merhabası için hangi açık anahtar gerekiyor. 15. bölümde 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ı 38. 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. Sondaki /24, adresin ilk 24 bitinin, yani ilk üç sayısının sabit olduğunu söylüyor; blok, son sayısı 0 ile 255 arasında değişen 256 adresten oluşuyor. Bu yazımı 37. bölümde açacağız.

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öndericiye şüpheyle bakılır ve postası çoğu zaman spam klasörüne düşer.

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, 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; 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 budur; doğru yapılandırma, transferi yalnızca bilinen ikincil sunuculara açmaktır.

Özet

  • Her cevap bir kaynak kaydıdır: adı, yaşam süresi, türü ve değeri olan bir satır; sınıf alanı bugün pratikte hep IN.
  • Cevap tek çeşit değil. Adres, sunucu, posta ve takma ad kayıtlarının yanında SRV portu, CAA sertifika iznini, HTTPS ise bağlantı parametrelerini taşıyor.
  • Ters yön ayrı bir ağaçta yürüyor: adres ters çevrilip in-addr.arpa altına asılıyor; iki yönün uyuşması zorunlu değil, çünkü sahipleri farklı.
  • Yetki bölgeye aittir: bölgenin künyesi SOA kaydıdır ve ikincil sunucular kopyayı ancak seri numarası büyüdüğünde çeker.

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 5: Ö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.

NeredeNe saklıyorKim yönetiyor
Tarayıcıson baktığın adların karşılığıtarayıcı
İşletim sistemiuygulamaların paylaştığı ortak depomakinen
Resolverbinlerce kullanıcının sorduğu adlarağını işleten kurum
Yetkili sunucukaydın kendisialanı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ı. Tarayıcının ya da işletim sisteminin deposundan gelen cevap sıfır tur harcıyor, resolver’ın deposundan gelen bir tur. 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 (TTL, time to live).

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 pencerenin süresi 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 kullanıcıya hiçbir bedel ödetmeden kullanabiliyor; faturayı kendi yetkili sunucuları ödüyor ve karşılığında hızlı taşınma esnekliği 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 aktığına da bakmak gerekiyor. 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, iki sorgu arasında geçen yedi saniye. 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ç olarak 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 ucuz bir hile daha eklendi: resolver sorulan adın harflerini rastgele büyük-küçük yazıyor ve cevapta aynı yazımı birebir geri bekliyor. Yönteme 0x20 deniyor, çünkü ASCII’de büyük ve küçük harf arasındaki fark tam bu değer, tek bir bit. Üçü birlikte 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. Buradaki imza kâğıttakine benziyor ama ondan güçlü: yalnızca alan sahibinin elindeki gizli bir anahtarla üretilebiliyor, herkesin görebildiği bir açık anahtarla ise doğrulanabiliyor. Kaydın tek bir harfi değişirse imza tutmuyor. Bunun matematiğini 10. bölümde göreceksin; burada ne işe yaradığı yetiyor. İ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. APNIC’in ölçümüne göre kullanıcıların yaklaşık %36’sı imzayı doğrulayan bir resolver’ın arkasında. Öteki uçta tablo tersine dönüyor. Cloudflare’in 1.1.1.1 resolver’ının verdiği cevapların yalnızca %8 kadarı imzalı bir bölgeden geliyor ve bu oran yıllardır yerinde sayıyor. Hem alanın imzalı olduğu hem de istemcinin cevabı korumalı istediği sorguların payı ise aynı resolver’da Temmuz 2026’da %0,62’ydi.

İ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, yani o anahtardan hesaplanan kısa ve pratikte taklit edilemeyen bir parmak izini 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ı. İkinci değişim 11 Ekim 2026’da: Ocak 2025’ten beri kök bölgesinde yayımlanan yeni anahtar o gün tek imzalayan anahtar oluyor. Yeni anahtarı tanımayan doğrulayıcı bir resolver o günden sonra hiçbir adı çözemiyor.

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

Sızıntının bir kısmını resolver kendi başına küçültebiliyor. Zinciri yürürken köke www.ornek.com adının tamamını sormak zorunda değil; köke yalnızca com alanını, com sunucusuna yalnızca ornek.com’u soruyor. Her basamak yalnızca kendi işini yapmaya yetecek kadarını görüyor. Yönteme QNAME minimization deniyor ve bugün yaygın resolver’ların çoğunda varsayılan olarak açık.

Sorguyu yoldaki gözlemciden gizlemek içinse onu şifrelemek gerekiyor. Bunun için birkaç taşıma önerildi ve hepsine birden şifreli DNS diyoruz.

adkısaltmabelirtimportağdan bakan ne görür
DNS over TLSDoTRFC 7858853sorgu yaptığını görür, ne sorduğunu görmez
DNS over HTTPSDoHRFC 8484443sıradan bir web isteğinden ayırt edemez
DNS over QUICDoQRFC 9250853DoT ile aynı, ama el sıkışma bir tur kısa

Fark son sütunda. İlkinin kendi portu 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; 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 11. 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ı. Cloudflare’in 1.1.1.1 resolver’ına gelen sorgularda 2026’nın ikinci çeyreğinde DoT’un payı %6,33, DoH’unki %5,75’ti; DoH bir yılda yaklaşık üçe katlandıktan sonra tırmanışı duraksadı. Şifreli sorguyu en baştan destekleyen bir resolver’da bile sorguların sekizde yedisi hâlâ açık gidiyor.

Özet

  • 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. İsabet oranını ise sürenin kendisi değil, süre içinde gelen soru sayısı belirliyor.
  • Cevap varsayılan hâlde imzasız. İmzalama kaynağı doğruluyor ama gizlemiyor; imzalayan taraf da 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 6: 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. Bina makinenin adresine, daire numarası porta, dairede oturan kişi ise o portu dinleyen sürece karşılık geliyor.

1919’da yapılmış bir New Orleans apartmanının girişinde sıra sıra posta kutuları; her kutunun yanında o daireye çıkan mekanik konuşma borusu var. Adres binaya kadar getiriyor, sonrasını numara belirliyor.

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.

Port numarasını taşıyan katmanın adı transport layer (taşıma katmanı): veriyi bir makineden ötekine değil, bir programdan ötekine ulaştıran katman. Ağın bütün katmanlarını 18. bölümde sırayla göreceğiz; şimdilik adını bilmek yetiyor.

Programın bu katmana açılan ucuna soket deniyor: işletim sisteminin bir program için açtığı, adresi ve portu olan bir uç. Bir konuşmanın iki ucunda iki soket durur. Soket iki cihazı değil iki programı birbirine bağlar; uçlar çoğu zaman iki ayrı makinede olur, ama aynı makinedeki iki program da birbirine soketle bağlanabilir. 71. bölümde yazacağın örneklerin çoğu tam da böyle, tek bir makinenin içinde konuşuyor.

Numaranın kaç basamak olabileceği de bu katmanın başlığındaki alanın genişliğine bağlı. Her parçanı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ı port.

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ıkAdıKim kullanıyor
0-1.023iyi bilinenyaygın hizmetler; çoğu sistemde yönetici yetkisi ister
1.024-49.151kayıtlıbelirli bir uygulama için kayıt ettirilmiş numaralar
49.152-65.535dinamikkimseye 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 portta oturduğunu bilmek, bir firewall (güvenlik duvarı, 49. bölüm) kuralına ya da bir bağlantı hatasına bakarken tek başına yön verir.

numarahizmetne yapar
20 / 21FTPeski dosya aktarımı; veri ile denetim ayrı portlarda
22SSHşifreli uzak kabuk, dosya kopyalama ve tünel
23Telnetşifresiz uzak kabuk; bugün yalnızca eski cihazlarda
25SMTPposta sunucuları arası teslim
53DNSad çözme; hem UDP hem TCP
67 / 68DHCPadres kiralama; sunucu 67, istemci 68
80HTTPşifresiz web
110 / 143POP3 / IMAPposta kutusunu okuma
123NTPsaat eşitleme
161 / 162SNMPcihaz izleme ve tuzak bildirimi
389 / 636LDAP / LDAPSdizin sorgulama
443HTTPSşifreli web; QUIC de aynı numarayı UDP’de kullanır
445SMBWindows dosya paylaşımı
465 / 587SMTPS / gönderimistemcinin postayı sunucuya bırakması
3306MySQLveritabanı
3389RDPWindows uzak masaüstü
5432PostgreSQLveritabanı
6379Redisbellek içi veri deposu
8080HTTP (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.

Kural, çok kullanıcılı eski Unix makinelerinden kalma. O dönemde bazı hizmetler, düşük numaralı bir porttan gelen bağlantının karşı makinenin yöneticisi tarafından açıldığını varsayıp ona parola sormadan güveniyordu. O güven çoktan geçersiz; bugün sınır bir ayar hâline geldi. Linux’ta aşağı çekilebiliyor, macOS ise 2018’den beri çoğu durumda bu kısıtı uygulamıyor.

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 portun açık olması orada beklediğin hizmetin çalıştığını kanıtlamıyor; yalnızca bir şeyin dinlediğini gösteriyor.

Aynı porttan 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 router port numarasına bakmak zorunda değil. Port, yalnızca iki uçta anlam taşıyor.

Cevap, transport layer’ı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 adresKaynak portHedef adresHedef port
192.0.2.1451322203.0.113.9443
192.0.2.1451323203.0.113.9443
198.51.100.749930203.0.113.9443

Üçü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 demultiplexing deniyor. Gönderen taraftaki karşılığı, pek çok soketin verisini aynı kablodan çıkarmak, yani multiplexing.

Dörtlü ayrım, bağlantı kuran taşımanın kuralı. Bağlantısız taşımada kernel, parçayı teslim edeceği soketi çoğu zaman yalnızca hedef adres ile hedef porta bakarak seçiyor; farklı istemcilerden gelen parçalar aynı sokete düşüyor ve kimden geldiklerini uygulama kendisi ayıklıyor. İki taşımanın farkını 7. bölümde açacağız.

Four-tuple’da görünmeyen gizli bir beşinci sütun daha var: protokol. Port numarası transport layer’a ait ve her taşıma protokolünün kendi numara uzayı var. Yani TCP’nin 443’ü ile UDP’nin 443’ü aynı port değil, birbirinden tamamen bağımsız iki port. Aynı makinede biri açık öbürü kapalı olabilir; ikisini iki ayrı süreç dinleyebilir. “53 açık” cümlesi bu yüzden eksik: hangi protokolde açık olduğunu söylemeden bir şey ifade etmiyor. HTTPS’in hem TCP hem UDP 443’te yaşayabilmesi de bu sayede 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 firewall’da 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                    socket()
2. yerel adres ve porta bağla          bind()     -> 203.0.113.9:443
3. gelen bağlantıları beklemeye başla  listen()
4. bekleyeni kabul et                  accept()   -> YENİ bir soket doğar

Asıl nokta son adımda. 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; port numarası ise hâlâ tek. Bu dört çağrıyı 71. bölümde kendi yazdığın bir sunucuda çalıştıracaksın.

Kendi 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 interface’ler (ağ arayüzleri)” 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 interface’lere açılan bir yönetim paneli, olması gerekenden çok daha geniş bir kitleye görünür oluyor.

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. Kernel gelen bağlantıları bu süreçler arasında dağıtıyor. Seçeneğin Linux’taki adı SO_REUSEPORT.

Neden istenir? Çünkü tek iş parçacığıyla çalışan bir süreç, 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 kernel 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. Doğru yapıldığında arada hiçbir bağlantı reddedilmiyor; eski sürümün kabul sırasında bekleyen bağlantıları unutulursa ise onlar kopuyor.

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 demeknasıl anlaşılıyor
açıkorada dinleyen bir süreç varbağlantı isteği kabul ediliyor
kapalımakine ayakta ama o portu dinleyen yokmakine “burada kimse yok” diye açıkça reddediyor
filtrelenmişarada bir firewall varhiç 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. Firewall’ları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 kernel 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   60999

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

Tavan yalnızca açık bağlantıları saymıyor. Yukarıdaki çıktıda görünen TIME-WAIT durumu, kapanan bir bağlantının four-tuple’ının hemen serbest bırakılmadığını, bir süre beklemede tutulduğunu gösteriyor. 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. Standardın öngördüğü sürenin neden dört dakika olduğunu 8. bölümde el sıkışmayı kurarken hesaplayacağız; Linux bu süreyi 60 saniyede tutuyor.

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 proxy düşün. Linux’taki 60 saniyelik beklemeyle aynı anda beklemede duran four-tuple sayısı 500 × 60 = 30.000 eder; havuzda ise 28.232 numara var. Havuz bir dakika dolmadan tükenir ve yeni bağlantı açılamaz. Hata iletisi “Cannot assign requested address” olur, oysa hedef sunucu turp gibi ayaktadır. Sıradan bir kullanıcı bunu hiç görmez; tek bir arka uca saniyede yüzlerce bağlantı açan bir proxy görür.

Soketin kernel tarafını burada kapalı kutu bırakıyorum: tamponların nerede durduğunu ve kopyalamanın maliyetini 22. bölümde ağ kartına indiğimizde, gelen verinin hangi kuyruklardan geçip uygulamaya vardığını da 66. bölümde açacağız.

Özet

  • 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 port var.
  • Numara ile hizmet arasındaki bağ gelenek. Standart üç aralık tanımlıyor ama açık bir port, 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 kernel seçiyor, dinamik aralıktan ve tahmin edilemez biçimde; havuzun sonu, beklemedeki bağlantılar da sayıldığı için, tek bir hedefe açılan bağlantı sayısına sınır koyuyor.

Four-tuple tamam, port belli, soket açılmaya hazır. Ama şu ana kadar hep “transport layer” deyip geçtim; adını andım, ne vaat ettiğini hiç açmadım. Portu buldun; peki oradan geçen her şey aynı sözü mü veriyor?

Bölüm 7: Bağlantısız Taşıma: UDP

Vermiyor. Taşıma protokollerinin kimi teslimi, sırayı ve hızı üstleniyor, kimi hiçbirini. En kolayı hiçbir vaatte bulunmayanı: isim sorgusunun 53 numaralı porta “bağlantısız taşımayla”, yani UDP ile gittiğini söyleyip geçmiştim.

UDP’nin tanımı 1980 tarihli RFC 768’de duruyor ve belgenin tamamı üç 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. IPv4’te tavan biraz daha aşağıda, 65.507 bayt, çünkü IP paketinin kendi uzunluk alanı da 16 bit ve kendi başlığını da aynı sayının içine sığdırmak zorunda. Pratikte bu sınıra hiç yaklaşılmıyor: yol üstündeki en küçük frame’e (ç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 (Türkçesiyle sağlama toplamı) ve ilginç olan o. Kitabın geri kalanında iki adı da göreceksin; ikisi aynı şey.

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ı pseudo-header 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 router’ın belleğinde hedef adres bozulursa paket yanlış makineye düşer; o makinenin UDP katmanı, kendi adresini pseudo-header’a koyup hesapladığında checksum tutmaz ve paketi atar. Adresi hesaba katmayan bir checksum bu hatayı hiç göremezdi.

Bunun bir bedeli var ve adını koymak gerekiyor: transport layer, 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 transport layer checksum’ı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.

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; IPv6 üstünde ise checksum zorunlu, çünkü orada IP başlığının kendi sağlaması yok.

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 frame’in kendi ve çok daha güçlü bir denetimi var; bozulmuş bir frame’in transport layer’ına kadar gelmesi zaten beklenmiyor. Taşımadaki hesap, o denetimin kapsamadığı yeri kolluyor: router’ın 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. 2000’de yayımlanan bir ölçüm, bağlantı düzeyindeki güçlü denetime rağmen her 1.100 ile 32.000 paketten birinin taşıma checksum’ına takıldığını gösterdi. Hatalar kablo denetiminden sonra, cihazların içinde doğuyordu ve checksum’ın göremediği kadarı da uçlara varıyordu. 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: 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. Stream 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: kernel artık o sokete hangi hataların ait olduğunu bilebiliyor ve karşı makinenin “bu portta kimse yok” cevabını sana iletebiliyor. Sabitlemezsen o cevap Linux’ta ve BSD ailesinde sessizce düşüyor. Windows bu konuda ayrışıyor ve hatayı sabitlenmemiş sokete de iletiyor; 71. bölümde bunu çalışan bir kodda göreceksin.

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 kernel’da değil uygulamada. Sebebini 15. 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

  • 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; mesaj sınırları da 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 8: Üç Adımlı El Sıkışma

Portu 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. Bu işi bağlantı kuran taşıma yapıyor ve adı TCP (Transmission Control Protocol).

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

MesajKalkık bayraklarİstemci durumuSunucu durumu
birinciSYNSYN-SENTLISTEN
ikinciSYN + ACKSYN-SENTSYN-RECEIVED
üçüncüACKESTABLISHEDESTABLISHED

Üç mesajı ve iki tarafın durumlarını birlikte izlemek istersen:

Üç mesaj, iki durum makinesi
istemcisunucuCLOSEDLISTENSYN · seq=xSYN-SENTSYN+ACK · seq=y · ack=x+1SYN-RECEIVEDACK · ack=y+1ESTABLISHEDESTABLISHEDilk uygulama verisiveri ancak buradan sonra akıyor — peşin ödenen bedel: bir gidiş-dönüş
İstemci ilk mesajı yolluyor ve bekliyor. 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.
  1. İstemci ilk mesajı yolluyor ve bekliyor. 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.
  2. Sunucu tek segmentte hem cevaplıyor hem soruyor. Aynı segmentte SYN ve ACK birlikte kalkık. Onay numarası x+1, çünkü SYN bayrağı sıra uzayında bir bayt yer kaplıyor. Sunucu henüz bağlanmış değil, yalnızca yer ayırdı.
  3. Üçü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.
  4. İki uç aynı anda kurulmuyor. İstemci üçüncü mesajı yollar yollamaz ESTABLISHED oluyor. 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.
  5. 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. El sıkışmayı güvenlikle birleştiren protokollerin kazanmaya çalıştığı tur da bu.

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 bunun karşılığı. İ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ı adres ve 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 67. bölümde çalıştıracağız; burada yalnızca ilan ediyorum.

DerinleşmeNumarayı tahmin edilemez yapan 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. Ardından gelen dört bit ayrılmış (reserved) ve bugün kullanılmıyor. 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:

bayrakne demek
SYNbağlantı kur; başlangıç numaram bu
FINbenden yollanacak veri kalmadı
RSTbu bağlantı yok, iptal et
ACKonay numarası alanı geçerli
PSHbiriktirme, uygulamaya hemen ver
URGacil işaretçi alanı geçerli
ECEkarşı taraftan tıkanıklık bildirimi geldi
CWRbildirimi 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 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 router tarafından da bildirilebiliyor. Mekanizmanın adı ECN ve 40. bölümde kuyrukları yönetirken açılıyor; ECE ile CWR o bildirimin transport layer’daki 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ürseçenekboyne pazarlık ediliyor
2En büyük segment boyu (MSS)4 bayttek seferde kaç bayt veri kabul ediyorum
3Pencere ölçekleme3 baytpencere alanını kaç bitlik kaydırmayla çarpayım
4SACK izinli2 baytseçici onayı destekliyorum
8Zaman damgası10 bayther segmente saat vur; gidiş-dönüşü ölç
1Dolgu (NOP)1 baytsonraki seçeneği 4 baytlık hizaya getir
0Seçenek sonu1 baytliste 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 67. bölümde kayan pencereyi kurarken, zaman damgası ise 69. 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. Eski sistemlerde bu kuyruk yalnızca birkaç düzine kayıt tutabiliyordu. Bugün yüzlerle binler arasında ama saldırganın saniyede gönderebildiği SYN sayısının yanında yine küçük. Saldırının ucuzluğu buradan geliyor.

Kayıt sonsuza kadar durmuyor. Linux, cevapsız kalan SYN-ACK’i beş kez yeniden gönderiyor ve her seferinde bekleme süresini ikiye katlıyor; kayıt ancak bir dakika kadar sonra düşüyor. Ama o süre 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ı. Linux bu yüzden SYN cookie’yi varsayılan olarak yalnızca kuyruk taştığında devreye sokuyor. 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 14. bölümde yeniden göreceğiz.

Bu üç mesajın faturası ne kadar?

Bedeli ölçmenin birimi belli: 1. bölümde tanıştığın RTT, yani gidiş-dönüş süresi. El sıkışmanın maliyeti bir 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 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 QUIC gibi protokoller ve oturum biletiyle kurulumu sıfır gidiş-dönüşe indiren yöntemler bu bedeli hedef alıyor; ikisini de 15. bölümde göreceğiz.

İ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 router’dan router’a 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:

tarafsıradurumlar
kapatanFIN gönderir → ACK alır → FIN alır → ACK gönderirFIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED
kapatılanFIN alır → ACK gönderir → uygulama kapatır → FIN gönderirCLOSE-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ı, kernel 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 (MSL) iki katı kadar bekliyor. RFC 9293 o ömrü 2 dakika sayıyor, yani bekleme 4 dakika. Linux bu süreyi pratikte fazla uzun bulup 60 saniyeye sabitlemiş.

Bu beklemenin 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. 6. bölümdeki geçici port tükenmesinin arkasında da bu bekleme duruyor.

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

  • Üçü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 9: 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.

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ğ interface’i, yanından geçen bütün paketleri okuyup kaydediyor; parolalar dahil. Herkesin aynı ortamı paylaştığı yerlerde bu doğrudan çalışıyor: bir kablodan gelen sinyali bütün kablolara tekrarlayan hub’lı eski Ethernet’te ve şifresiz kablosuz ağda. Bugün kabloların birleştiği yerde bir switch duruyor ve frame’i yalnızca alıcısının kablosuna iletiyor; bunu nasıl öğrendiğini 27. bölümde göreceğiz. Switch’li bir ağda kart çoğu zaman yalnızca kendisine ve herkese gönderilenleri görüyor; saldırganın önce trafiği kendine çekmesi gerekiyor.

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. TLS’i bu bölümde ve sonraki üç bölümde parça parça kuracağız.

Ş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. Kasanın mekanizması algoritmaya, kombinasyon anahtara, içine koyduğun belge açık metne, kilitli kasa ise şifreli metne karşılık geliyor. Benzetmenin çöktüğü yer kombinasyonun yolculuğu: 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ı kısa: 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, her seferinde 128 bitlik tek 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. Yayma (diffusion), açık metnin tek bir bitindeki değişikliğin çıktının her bitine dağılması; karıştırma (confusion) ise anahtar ile şifreli metin arasındaki ilişkinin istatistiksel olarak izlenemez olması. Tek bir tur zayıf; on turdan sonra girdiyle çıktı arasındaki bağı izlemek 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.

Aşağıdaki tabloda geçen 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.

kipnasıl çalışıyorsorunu / gücü
ECBher blok bağımsız şifreleniraynı açık blok hep aynı şifreli bloğu verir; desen sızar
CBCher blok, önceki şifreli blokla XOR’lanıp şifrelenirdeseni kırar; sıralı çalışır, paralelleşmez
CTRbir sayaç şifrelenip açık metinle XOR’lanırblok şifreyi akış şifresine çevirir; paralelleşir
GCMCTR + bütünlük etiketihem gizler hem kurcalanmayı yakalar

ECB’nin kusuru soyut değil, gözle görülür. Aşağıdaki üç kare aynı resmin piksel baytları: solda özgün hâli, ortada AES-128 ile ECB kipinde şifrelenip yeniden resim olarak okunmuş hâli, sağda aynı işlemin CBC kipindeki sonucu.

Aynı asma kilit resmi üç kez yan yana. Solda özgün hâli: açık gri zemin, koyu gri halka, turkuaz gövde ve beyaz anahtar deliği. Ortada ECB ile şifrelenmiş hâli: renkler dikey çizgili gürültüye dönmüş ama zemin, halka, gövde ve anahtar deliği ayrı desenlerle seçiliyor; kilidin biçimi açıkça okunuyor. Sağda CBC ile şifrelenmiş hâli: düz gürültü, hiçbir biçim seçilmiyor.

Ortadaki karede renkler gitti ama kilit yerinde duruyor. Aynı renkteki bölgede aynı 16 baytlık bloklar tekrar ediyor ve ECB her birini hep aynı şifreli bloğa çeviriyor; zemin, halka ve gövde birer desene dönüşüyor ve resmin hatları şifreli çıktıda okunmaya devam ediyor. Şifreleme yapıldı ama içerik hâlâ tanınıyor. CBC her bloğu şifrelemeden önce bir öncekinin şifreli hâliyle karıştırdığı için tekrar eden şifreli blok kalmıyor ve çıktı düz gürültüye dönüyor.

Deney sıkıştırılmamış piksellerle yapılıyor. Sıkıştırılmış bir PNG ya da JPEG’de tekrar eden bayt dizileri zaten ayıklandığı için sızacak desen de çok azalır. Gerçek mesajlar ise tekrarla dolu: aynı başlıklar, aynı alan adları, aynı dolgu. Bu yüzden ECB mesaj şifrelemek için hiçbir güncel protokolde yer almı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 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; üstelik 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 havada ne parola ne de oturum anahtarı dolaşıyor: iki taraf taze AES anahtarını, paroladan ve havada açıkça takas edilen rastgele sayılardan kendi başına türetiyor. O türetmenin adımlarını 32. bölümde açacağım. Uzaktaki bir sunucu için cevabı 10. 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: 1977’de FIPS 46 olarak yayımlanan bir ABD federal standardı. NIST onu son kez 1999’da yeniden onayladı ve 2005’te geri çekti. 56 bitlik bir anahtar kullanıyor ve girdiyi 64 bitlik açık metin blokları hâlinde alıyor.

DES de bir blok şifresi ve o da çıplak kullanılmıyor; yukarıdaki tablodan tanıdığın CBC kipi ilk kez onun etrafına sarıldı.

1999’da RSA şirketinin açtığı bir yarışmada (DES Challenge III), 56 bitlik anahtarla şifrelenmiş bir cümle kaba kuvvetle 22 saatte çözüldü. Bilinen iyi bir analitik saldırı yoktu. Şemayı düşüren şey zekâ değil, anahtarın kısalığıydı.

EFF’in DES Cracker makinesinden tek bir devre kartı; üzerinde anahtar uzayını paralel tarayan onlarca özel üretim Deep Crack yongası sıralı duruyor. Metindeki ’şemayı düşüren şey anahtarın kısalığıydı’ cümlesinin donanım karşılığı bu kart.

Ayakta tutma çabası 3DES oldu: üç farklı anahtarla üç kez şifreleme. Kalıcı cevap Kasım 2001’de geldi. NIST yeni standardı kapalı kapılar ardında yazmadı; 1997’de dünyaya açık bir yarışma düzenledi ve üç yıllık elemenin sonunda Belçikalı iki kriptografın Rijndael adlı tasarımını seçti. AES adını alan bu şifre DES’in yerini aldı ve bugün hâlâ orada. Blok boyu iki katına, anahtar ise en az 128 bite çıktı; 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:

DESAES
Standart1977Kasım 2001
Anahtar56 bit128, 192 ya da 256 bit
Blok64 bit128 bit (16 bayt)
Anahtar uzayı2^56, yaklaşık 72 katrilyon2^128
Tüm anahtarları denemek1 saniye varsayarsak149 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ı anahtar altında aynı başlangıç değerini iki kez kullanmamak. Bunun aracı nonce, yani ömür boyu yalnızca bir kez kullanılan sayı. Yukarıda CTR kipinde tekrarlanan sayacın içeriği nasıl açığa çıkardığını gördün; nonce o kazayı imkânsız kılıyor. Nonce kaydın sıra numarasına bağlandığında bir kazanç daha doğuyor: kaydedilip sonra yeniden gönderilen bir kayıt, alıcının beklediği numarayla eşleşmediği için doğrulamadan geçemiyor. Tekrar oynatma (replay) saldırısını kıran şey bu.

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 aynı anahtar altında yaklaşık 24 milyon tam boy kayıt şifrelenebiliyor; sonrasında anahtarın tazelenmesi gerekiyor ve TLS 1.3 bunu bağlantıyı kesmeden yapabiliyor. 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. Dikkatli bakarsan şifreli çıktının başında yine de bir ad seçeceksin: example.com. O ad bağlantı kurulurken düz metin gidiyor; sebebini 11. bölümde göreceğiz.

Özet

  • 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; paylaşılan bir ortamda onu okumak için karışık moda alınmış bir interface 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 aynı anahtarla ş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 10: 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. Benzetmenin tutmadığı yer ters yön: kasada açan kombinasyonla kilitlemek anlamsızdır, burada ise özel anahtarla kilitlenen şeyi herkes açık anahtarla açabiliyor. Bu tuhaflık bölümün sonunda imzayı doğuracak.

Ş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 birkaç yıl önce Birleşik Krallık’ın istihbarat kurumu GCHQ’da da bulunmuştu ama 1997’ye kadar 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 443 numaralı porta 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 2048 bitlik bir anahtar için asalların her biri 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 = 9

Dokuzun yedinci kuvveti 4.782.969 ediyor ve 143’e bölündüğünde kalan 48. Şifreleme yalnızca n’den küçük m için tanımlı; RSA’nın uzun veriyi doğrudan şifrelemek için kullanılmamasının sebeplerinden biri bu.

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. Açık yarışmalarda bugüne kadar çarpanlarına ayrılabilen en büyük RSA sayısı 829 bit; o da 2020’de, binlerce işlemci yılı harcanarak çözüldü.

Varsayımı sarsabilecek tek aday kuantum bilgisayar. Yeterince büyük bir kuantum bilgisayar, Shor algoritmasıyla hem çarpanlara ayırmayı hem de birazdan göreceğin Diffie-Hellman’ın dayandığı problemi çözebilir. Böyle bir makine henüz yok ama bugün kaydedilen trafik yarın çözülebilir; bu yüzden anahtar uzlaşması şimdiden kuantuma dayanıklı algoritmalarla eşleniyor.

İ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 = 29

Aynı sayıya iki ucun ayrı ayrı nasıl vardığını adım adım izleyelim:

Açıkta konuşup aynı sayıda buluşmak
senkarşı tarafp = 97 · g = 5gizli a = 17gizli b = 295^17 mod 97 = 835^29 mod 97 = 7474^17 mod 97 = 2983^29 mod 97 = 29dinleyenin gördüğü her şey: 97 · 5 · 83 · 7417, 29 ve ortak sır 29 hattan hiç geçmedi
İki sayı baştan herkese açık. Büyük bir asal 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.
  1. İki sayı baştan herkese açık. Büyük bir asal 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.
  2. 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.
  3. Hatta yalnızca sonuçlar gidiyor. Her taraf gnin kendi gizli kuvvetini p modülünde hesaplayıp gönderiyor. Ters işlemin, yani çıkan sayıdan üssü bulmanın adı ayrık logaritma problemi; büyük p için pratikte çözülemiyor.
  4. İkisi de aynı sayıya varıyor. Her taraf karşıdan gelen değeri kendi gizli üssüyle yeniden yükseltiyor. (g^a)^b ile (g^b)^a aynı şey olduğu için sonuç eşit çıkıyor. Ortak sır hiç gönderilmedi, iki yerde ayrı ayrı üretildi.
  5. 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; 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ü 11. 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ğunu anlatıyor. Listeye sonradan hibrit gruplar eklendi: X25519MLKEM768 (0x11EC), x25519’u kuantuma dayanıklı ML-KEM algoritmasıyla aynı el sıkışmada birleştiriyor. Saldırganın ikisini birden kırması gerekiyor; bunun el sıkışmaya kaç bayt eklediğini 11. bölümde hesaplayacağız.

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 -E 'Temp Key|group'

Çıkan satır uzlaşılan grubun adını taşır. Güncel bir OpenSSL ile büyük ihtimalle Negotiated TLS1.3 group: X25519MLKEM768 göreceksin; kuantum sonrası hibrit grup çoktan gündelik trafiğe girmiş durumda. Eski sürümler aynı bilgiyi Server Temp Key satırında x25519 olarak veriyor.

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.

İkisi de bugün kırık: aynı özeti veren iki ayrı girdi üretmek MD5’te saniyeler, SHA-1’de büyük ama satın alınabilir bir hesap gücü istiyor. Bugünkü imzalar ve sertifikalar bu yüzden 256 bitlik SHA-256 ile atılıyor; iki eski ad burada yalnızca fikri anlatmak için duruyor.

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 şartlarda. Checksum’da aynı değeri veren ikinci bir mesaj üretmek kolaydır; kriptografik özette ise bu hesap açısından yapılamaz olmalıdır. Aynı özeti veren herhangi iki mesajı bulmak da öyle; MD5 ile SHA-1’i emekliye ayıran şey bu ikinci şartın çökmesiydi. 16 bitlik bir toplam iki şartı da 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. “Özeti özel anahtarla şifrelemek” anlatımı RSA’ya özgü; eliptik eğri imzaları aynı sonuca başka bir hesapla varıyor ama sözleşme aynı kalıyor: imzayı yalnızca özel anahtar üretebilir, herkes açık anahtarla doğrulayabilir.

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 MITM 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 12. bölümde kuracağız.

Özet

  • 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 11: 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 neyi pazarlıyor?

Kilit nereye takılıyor?

Kilidin adı TLS (Transport Layer Security) ve adındaki “transport layer” yanıltıcı: kilit transport layer’ın içine takılmıyor, onun bir üstünde, programların kendi dilini konuştuğu application layer’da (uygulama katmanı) kuruluyor. Uygulama bir TLS kitaplığı çağırıyor, kitaplık da TCP’yi çağırıyor; sıra 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 router’lar 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 MITM 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.

ClientHello’nun bir uzantısı daha var ve ilk durakta bıraktığım düğümü o çözüyor: SNI (Server Name Indication, server_name uzantısı). Aynı adres ve portta yüzlerce siteyi barındıran bir sunucu hangi sertifikayı sunacağına ancak istenen adı görerek karar verebilir; ama sertifika gelmeden şifreleme de kurulamaz. Çözüm, adı ilk mesajda, henüz şifresizken göndermek. Bedeli şu: ClientHello açıkta gittiği için yolun üstündeki herkes hangi siteye bağlandığını görüyor. Şifreli ad çözmenin kapatamadığı sızıntı buydu. Onu da kapatan uzantının adı ECH (Encrypted Client Hello): sunucunun açık anahtarı DNS’teki HTTPS kaydından alınıyor ve ad o anahtarla şifrelenip gönderiliyor. Yol üstündeki kutu artık yalnızca barındırma sağlayıcısının herkese açık ön adını görüyor, asıl adı değil.

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:

Bir gidiş-dönüşte kilit
istemcisunucuClientHello · key_share · supported_versionsServerHello · key_shareşifreliEncryptedExtensions · CertificateCertificateVerify · FinishedFinishedilk uygulama verisitoplam iki gidiş-dönüş: biri taşımanın el sıkışması, biri bu — TLS 1.2'de üç tuttu
İstemci selamla birlikte bir tahmin yolluyor. 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.
  1. İstemci selamla birlikte bir tahmin yolluyor. 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.
  2. Tahmin tuttuysa ortak sır ikinci mesajda hazır. ServerHello seç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.
  3. 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 sertifikayı okuyamıyor. Sitenin adı ise ECH kullanılmıyorsa ClientHello içindeki SNI alanından hâlâ görünüyor.
  4. İki taraf da el sıkışmayı mühürlüyor. Finished mesajı 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.
  5. 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 12. 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. 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ımDurum
TLS_AES_128_GCM_SHA256zorunlu
TLS_AES_256_GCM_SHA384önerilen
TLS_CHACHA20_POLY1305_SHA256önerilen
TLS_AES_128_CCM_SHA256tanımlı
TLS_AES_128_CCM_8_SHA256tanımlı

Takım adındaki sayı anahtar uzunluğunu veriyor: ilk satırda 128 bit, ikincisinde 256 bit. Seçenek sayısı, TLS 1.2 standardının kendi metninde tanımladığı 37 takımdan 5’e indi; sonradan eklenenlerle o sürümün kayıt defteri yüzlerce takımı buluyordu. 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 (forward secrecy) 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 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; POODLE ve Lucky Thirteen o sınıfın en bilinen örnekleri.

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 o kuralı 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 encapsulation 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 frame’in 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 encapsulation 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. 10. bölümdeki openssl s_client komutunu grep olmadan çalıştır ve tam çıktıda üç satıra bak: Protocol, Cipher ve Negotiated TLS1.3 group (eski OpenSSL sürümlerinde sonuncusunun adı Server Temp Key). Sırasıyla pazarlıkla seçilen sürümü, şifre takımını ve anahtar uzlaşma grubunu gösteriyorlar.

Özet

  • Kilit application layer’ı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 HelloRetryRequest bir 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ı stream’i parçalara bölüyor: her kayıt kendi başına doğrulanıyor ve kapanış close_notify ile 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 12: 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 router 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ıyla sertifikanın imzasını doğruluyor; imza tutuyorsa belgede açıkça yazan açık anahtarın gerçekten o varlığa ait olduğuna güvenebiliyor. Kazancı 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 çakışmaya dayanıklı olmasını şart koşuyordu ve bu şartın sertifikada neden hayati olduğu 2008’de görüldü. Araştırmacılar aynı MD5 özetini veren iki belge üretti, zararsız olanını bir otoriteye imzalattı ve imzayı ötekine, kendi yazdıkları sahte bir ara otorite sertifikasına taşıdı. 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.

MITM saldırısında matematik doğru çalışıyordu; yanlış olan, açık anahtarın sahibiydi. Sertifikanın kapattığı boşluk 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 çıpaları 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:

bitadne yetkilendiriyor
0digitalSignaturesıradan imza
5keyCertSignbaşka sertifikaları imzalamak
6cRLSigniptal 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 çıpalarını kim koyuyor? Somut bir liste var. Mozilla’nın CCADB üstünden yayımladığı kök deposu raporunda Ağustos 2026 itibarıyla 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. Firefox ve bu listeyi kullanan pek çok Linux dağıtımı, senin adına kırk yedi kuruluşa güveniyor. Chrome, Apple ve Microsoft kendi depolarını tutuyor ama listeler büyük ölçüde örtüşüyor. 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 çıpası 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. Yine de verildiği oluyor: Hollandalı DigiNotar 2011’de sahte Google sertifikaları yüzünden depolardan düştü ve birkaç hafta içinde iflas etti. Symantec’in ve Entrust’ın sertifikaları da yıllar içinde aynı yoldan geçti.

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
signatureValue

Seri 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 adadres çubuğundaki adsonuç
*.example.comfoo.example.comeşleşir
*.example.combar.foo.example.comeşleşmez
*.example.comexample.comeş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 (Online Certificate Status Protocol). Üç 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; geçerlilik süresi de cevabın içinde yazılı olduğu için eskisini sonsuza kadar süremiyor. 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. Saldırgan da bunu kullanabilirdi: zımbayı yutması yeterliydi. OCSP Must-Staple uzantısı bu açığı kapatmak için sertifikaya “benim cevabım her zaman zımbalanmış gelecek” diye yazıyordu; cevap gelmezse tarayıcı bağlantıyı reddediyordu.

İ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. Chrome 2018’den beri günlüğe yazıldığını kanıtlamayan bir sertifikayı hiç kabul etmiyor. Kendi alan adını crt.sh gibi bir arama sitesinde sorgularsan o ada verilmiş her sertifikayı listelenmiş görürsün.

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.

İkili hash ağacının şeması: alttaki veri bloklarının özetleri ikişer ikişer birleşerek tepedeki tek köke çıkıyor. Yaprak olmayan her düğümün çocuklarının hash’i olması, günlüğün geçmişi sessizce değiştirememesini sağlayan yapıdır.

OCSP’nin hikâyesinin sonu beklenmedik oldu: emekliye ayrılıyor. Otoritelerin ortak kurallarını yazan CA/Browser Forum 2023’te kararı tersine çevirdi; Mart 2024’ten beri iptal listesi yayımlamak zorunlu, OCSP ise isteğe bağlı. En çok sertifika veren otorite olan Let’s Encrypt, zirvede ayda 340 milyar sorgu karşılayan OCSP hizmetini Ağustos 2025’te tamamen kapattı ve Must-Staple taşıyan sertifika vermeyi bıraktı. Gerekçe ikinci kusurdu: sorguyu kim işletirse işletsin, kimin hangi siteye girdiğini görüyor.

İptali tarayıcılar kendi üstüne aldı. Firefox, CT günlüklerindeki bütün sertifikaların iptal durumunu sıkıştırılmış tek bir yapıda (CRLite) kullanıcıya indiriyor; günde ortalama 300 kilobayt. Tarayıcı artık kimseye soru sormadan, kendi elindeki tabloya bakarak karar veriyor. Chrome da seçtiği iptalleri benzer bir listeyle (CRLSet) dağıtıyor.

İptalin yavaş ve güvenilmez olduğu kabul edilmiş durumda; asıl çözüm başka yerden geliyor. Sertifika ömrü hızla kısalıyor. 15 Mart 2026’dan önce azami ömür 398 gündü, bugün 200 gün. Takvim 15 Mart 2027’den sonra 100 güne, 15 Mart 2029’dan 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.

Bu takvim elle yenilenen sertifikayla yaşanamaz; onu mümkün kılan şey yenilemenin protokolleşmesi. ACME (RFC 8555) sertifika istemeyi, alan adının sahipliğini kanıtlamayı ve süresi dolmadan yenilemeyi bir istemcinin kendi başına yürüttüğü bir akışa çevirdi. Let’s Encrypt’in ücretsiz sertifikaları bu protokolle veriliyor ve web’in büyük bölümü bugün o zincirin altında; kısa ömür, insan eli değmeyen bir yenileme varsa sorun olmaktan çıkıyor.

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 subjectAltName

Dönen birkaç satır bu bölümün özeti: belge kime verildi, kim imzaladı, hangi tarihler arası geçerli, hangi adları taahhüt ediyor.

Özet

  • 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 çıpalarını 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.
  • Anlık iptal sorgusu emekliye ayrılıyor: OCSP’nin mahremiyet bedeli ağır bulundu; iptal bilgisini tarayıcılar toplu hâlde kendileri dağıtıyor.
  • İ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 ne göndereceksin?

Bölüm 13: 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 application layer 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 stream’i, 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, boşluk, sürüm ve satırı kapatan CR LF, yani 13 ve 10 numaralı iki satır sonu baytı. Hedef çoğu zaman adresin yalnızca yolu; 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 6. bölümde 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ı 15. bölümde 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. Küme genişletilebilir: sonradan eklenen PATCH ya da WebDAV’ın dosya işlemleri için tanımladığı metotlar IANA’nın metot defterinde kayıtlı. Yine de yeni metot nadiren icat ediliyor, çünkü anlamı herkesçe bilinmeyen bir metodu yoldaki proxy’ler ve önbellekler tanımıyor. 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.

MetotNe istiyorGüvenliYinelemeye dayanıklı
GETkaynağın güncel gösteriminin aktarılmasınıevetevet
HEADaynı isteğin yalnızca başlıklarınıevetevet
OPTIONSkaynağın kabul ettiği seçeneklerin bildirilmesinievetevet
TRACEmesajın yolda ne hâle geldiğinin yansıtılmasınıevetevet
PUThedefte duranın gövdeyle değiştirilmesinihayırevet
DELETEkaynağın güncel gösterimlerinin kaldırılmasınıhayırevet
POSTgövdenin kaynağa özgü kurallarla işlenmesinihayırhayır
CONNECThedefe uçtan uca bir tünel kurulmasınıhayırhayı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 proxy, 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ı. Bu bir kurgu da değil: 2005’te Google’ın Web Accelerator adlı hızlandırıcısı sayfadaki bağlantıları önceden gezince, “sil” bağlantısını GET ile yapan web uygulamalarında kullanıcıların verisini tam böyle sildi.

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 pseudo-header’ı 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+dunya

Gö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: stream 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, br

Virgü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 bu bilgi önbelleğin anahtarını (cache key) 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-2097151

Sunucu 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. Bir dosyayı birden çok bağlantıyla paralel indiren araçlar da her bağlantıya farklı bir aralık veriyor.

18. bölümde katmanları sayarken, ağın yedi katmanlı klasik modeli olan OSI’nin session layer’ı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 RTT 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ıfAnlamıBu bölümde geçenler
1xxbilgi—
2xxbaşarı200, 201
3xxyönlendirme (redirection)301, 304
4xxistemci hatası400, 404, 405, 410
5xxsunucu 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 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 ile kaynağın sürüm etiketini (ETag) taşıyorsa alıcı tarihi yok saymak zorunda. Etiket üzerinden kurulan koşul daha doğru kabul ediliyor. Koşullu isteğin amacı şu: 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 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ı.

Terminalden telnet ile açılan 80. port bağlantısı: üstte elle yazılan istek satırı ve Host başlığı, altında sunucunun durum satırı, yanıt başlıkları ve gövdesi ayrı ayrı işaretlenmiş. Metindeki nc denemesinin ekrandaki karşılığı.

Özet

  • İ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 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 14: 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; 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ş bu. Durumu sunucunun belleğinde tutmak yerine senin makinene yazıyor ve her istekte onu geri getirtiyor. Fikir yeni değil: 8. bölümdeki SYN cookie, yarı açık bağlantı durumunu ikinci mesajın sıra numarasına kodlayıp kuyruğu tümden ortadan kaldırıyordu. Çerez aynı işi bir kat yukarıda, application layer’da 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=7c1a94e0b3f582d6a4e71b09

Sonraki isteklerin hepsi o değeri taşıyor. Sunucunun seni tanıması şu: gelen satırdaki değeri okumak ve veritabanındaki kaydı bulmak. Tanıdığı şey sen değilsin, taşıdığın numara. Temel mekanizmayı tanımlayan belge RFC 6265, Nisan 2011 tarihli ve tam adı HTTP State Management Mechanism. Aşağıda göreceğin SameSite ve ad önekleri o belgede yok; tarayıcıların çoktan uyguladığı ama yıllardır taslak olarak bekleyen yenisinden (6265bis) geliyor.

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

ÖznitelikNe yapıyor
Max-Ageçerezin en fazla kaç saniye yaşayacağını söylüyor
Expiresaynı ş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 bu.

Secure yazan çerez yalnızca şifreli kanaldan, yani HTTPS üstünden 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ğerbaşka siteden gelen isteğe çerez eklenir mi
Stricthiçbir durumda eklenmez
Laxyalnızca üst düzey gezinmede ve güvenli metotlarda eklenir
Noneher zaman eklenir; Secure ile birlikte yazılması zorunlu

Lax bir ödünleşim ve Chrome’da 2020’den beri, öznitelik hiç yazılmamışsa varsayılan: başka bir siteden gelen bir bağlantıya tıkladığında oturumun açık kalıyor, ama başka bir 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 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.

Güzelliği ş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; izleme dediğimiz şey de 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.

İki farklı sitenin sayfası yan yana; ikisinin de üstünde aynı üçüncü siteden gelen bir reklam şeridi duruyor ve oklar iki sayfadan da o tek kaynağa iniyor. Gömülü nesnenin aynı çerezi iki sitede birden görünür kılması.

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; 11. 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 ise yıllarca ertelediği kapatma planından 2024’te vazgeçti ve yerine koymayı düşündüğü teknolojileri 2025’te tümden emekliye ayırdı; üçüncü taraf çerezleri orada hâlâ varsayılan olarak açık. Hukuk da aynı yerden giriyor. AB’nin ePrivacy yönergesi, cihaza zorunlu olmayan bir şey yazmak için kullanıcıdan izin istiyor ve sitelerde karşına çıkan onay kutularının dayanağı bu. GDPR ise kişiyi teşhis edebilen bir çerezi kişisel veri sayıyor ve iznin nasıl alınacağını tarif ediyor; Türkiye’de KVKK da aynı yaklaşımı izliyor.

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ı proxy.

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; 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; Age başlığı bu tahmini saniye olarak taşıyor.

Süreye sunucu karar veriyor, kararını da yanıt başlığında bildiriyor.

YönergeNe diyor
max-ageyaş belirtilen saniyeyi geçince yanıt bayat sayılıyor
no-storeyanıtın hiçbir parçası saklanmıyor
no-cachesaklanabiliyor, ama doğrulanmadan kullanılamıyor
privateyanı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, 5. bölümdeki ad önbelleklerinde de 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 -sI https://example.com/
curl -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

  • 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 15: 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 RTT’yle ölçebilirsin. Kalıcı olmayan kipte her nesne iki tur yiyor: biri bağlantı kurulumu, biri istek ve yanıtın ilk baytları. 8. bölümde üç adımlı el sıkışmanın 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 RTT 40 ms olsun. Bağlantılar teker teker açılırsa 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ı kurulum turunu bir kereye indiriyor: aynı sayfa bir kurulum artı altmış istek, yani 61 tur ve 2.440 ms sürüyor. Süre yarıya indi ama her nesne hâlâ kendi turunu bekliyor, çünkü istemci bir yanıtı almadan sıradaki isteği göndermiyor.

Sıra zorunluluğu kimi bekletiyor?

HTTP/1.1 bu yüzden bir de boru hattını (pipelining) getirdi. İstemci yanıtı beklemeden istekleri arka arkaya gönderebiliyor. Altmış isteğin hepsi aynı turda yola çıkarsa sayfa iki gidiş-dönüşe, yani 80 ms’ye iniyor: biri kurulum, öbürü bütün nesneler için. İlk hesaba göre fark 60 kat. 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, application layer’daki baş engellemesi. Boru hattı standartta yer aldığı hâlde tarayıcıların hiçbiri onu varsayılan olarak açmadı; bu engelleme ve yoldaki hatalı proxy’ler kazancından fazla sorun çıkarıyordu.

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 bekledi

2. 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ümü paralel bağlantı sayısını ikiyle sınırlıyordu. O tavan kaldırıldı, çünkü pek çok uygulama için pratik değildi; yerine ölçülü olma öğüdü kaldı. Tarayıcılar bugün aynı sunucuya en fazla altı bağlantı açıyor.

Ö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ından fazlası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.

Frame’e 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 framing geldi. Nesneler frame’lere bölünüyor ve frame’ler 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 HPACK adlı bir yöntemle sıkıştırılarak kodlanıyor.

HTTP/2 bir yenilik daha getirmişti: sunucu itmesi (server push). Sunucu, tarayıcının birazdan isteyeceğini tahmin ettiği nesneleri istenmeden gönderebiliyordu. Pratikte tarayıcının önbelleğinde zaten duran nesneleri de yeniden yolladığı için kazançtan çok israf üretti ve Chrome 2022’de desteği kaldırdı.

Paralellik sayıyla korunuyor. SETTINGS_MAX_CONCURRENT_STREAMS için önerilen alt sınır 100 eşzamanlı stream ve gerekçesi açık: paralelliği gereksiz yere kısmamak. Her stream 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 application layer’daki baş engellemesini çözüyor, transport layer’dakini çö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.

Multiplexing’i application layer’a 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 stream multiplexing’i ve stream başına flow control taşıma protokolünün kendi işi. Güvenilir aktarım stream başına ayrı tutuluyor, tıkanıklık denetimi ise ortak: bütün stream’ler tek bir bütçeyi paylaşıyor. Paket kaybında yalnızca o pakette verisi bulunan stream’ler yeniden gönderimi bekliyor. Ötekiler yoluna devam ediyor.

Üç kuşağı aynı kayıp üstünde karşılaştırmak istersen:

Aynı kayıp, üç kuşakta üç sonuç
HTTP/1.1HTTP/2HTTP/3ABCAABBCCAABBCCB ve C, A bitene kadar bekliyor — engelleme uygulamadakayıpkayıp segment üçünü birden durduruyor — engelleme taşımadakayıpyalnızca C bekliyor; A ve B akmaya devam ediyor
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. B hazır olsa bile A bitene kadar bekliyor.
  1. 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. B hazır olsa bile A bitene kadar bekliyor.
  2. HTTP/2: aynı bağlantıda üç akış birden. Her nesne kendi akış kimliğini taşıyan frame'lere bölünüyor ve frame'ler karışık akabiliyor. Application layer'ındaki engelleme kalkıyor: B artık Ayı beklemiyor.
  3. 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ışları bekletiyor; kaybolan frame Cye ait olsa bile A ve B de duruyor. Transport layer akışların varlığından habersiz.
  4. HTTP/3: sıra her akışta ayrı tutuluyor. QUIC akış kavramını transport layer'ına indiriyor ve her akış kendi sıra numarasını taşıyor. Kaybolan paket yalnızca kendi akışını bekletiyor; A ile B akmayı sürdürüyor.

Ayrım paket sınırında duruyor. Multiplexing, farklı stream’lerin STREAM frame’lerini aynı QUIC paketlerine iç içe koyuyor. Tek pakete birden çok stream’in verisi konabiliyor. O paketin kaybı hepsini birden durduruyor. Gerçekleştirimlere pakete gereğinden fazla stream koymamaları öğütleniyor.

DerinleşmeQUIC neden kernel'a değil, UDP üstüne kuruldu?

Cevap teknik olmaktan çok dağıtımla ilgili.

Klasik bir taşıma protokolü kernel’ın içinde yaşar. Yeni bir taşıma yazmak, dünyadaki bütün işletim sistemlerinin onu göndermesini beklemek demek. Üstelik yoldaki kutular, yani adres çeviren NAT’lar (46. bölüm) ve firewall’lar, tanımadıkları bir protokol numarasını geçirmiyor; 2000’de standartlaşan SCTP’nin geniş internete hiç yayılamamasının sebebi buydu. İ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ı kernel’ın dışına çıkardı. Altta kalan tek şey UDP ve UDP her yerde zaten var: yeni bir kernel 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 kernel üstünden yapmak yıllar alırdı.

Bedeli de var. Uygulama tarafında çalışan bir taşıma, kernel’ın 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’ü transport layer’ı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; 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 stream’inde gidiyor ve bir stream’de yalnızca tek bir istek gönderilebiliyor. İkinci istek yeni stream demek. Stream kimliği 62 bitlik bir tam sayı; en düşük bit stream’i kimin açtığını, ikinci bit tek yönlü mü çift yönlü mü olduğunu söylüyor. İki bit dört stream türü üretiyor.

HTTP/3 mesajının parçaları        frame      tür kodu
  başlık bölümü                   HEADERS      0x01
  gövde                           DATA         0x00
  kuyruk alanları (trailers)      HEADERS      0x01
  bağlantı ayarları               SETTINGS     0x04
  kapanış duyurusu                GOAWAY       0x07

Gövdesi olmayan bir yanıtta DATA frame’i hiç gönderilmiyor; gövde 0 bayt ise ortada frame de yok. Her uç ayrıca en az 3 tek yönlü stream’e izin vermek zorunda: bir HTTP denetim stream’i ve başlıkları sıkıştıran QPACK’in iki stream’i. Bu stream’lere 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.

Alt-Svc’nin kusuru ilk bağlantıda görünüyor: duyuru bir yanıt başlığında geldiği için tarayıcı onu ancak eski protokolle bir tur attıktan sonra öğreniyor. 4. bölümde DNS kayıtlarını sayarken andığım HTTPS kaydı o turu siliyor. Kayıt, DNS cevabının içinde “bu sunucu h3 konuşuyor” diyor ve tarayıcı daha ilk bağlantısını QUIC ile açıyor.

curl -sI https://cloudflare-quic.com/ | grep -i '^alt-svc'
# alt-svc: h3=":443"; ma=86400

Sonra trafiği dinle. İlk QUIC datagramı en az 1.200 bayt olmak zorunda ve gerekirse PADDING frame’leriyle ş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ünce her yolda taşınacağı garanti edilen UDP yükü 1.232 bayt çıkıyor. IPv4 başlığı daha kısa olduğu için orada bu sayı 1.252 bayt.

sudo tcpdump -n -c 5 'udp port 443'

QUIC de 443’ü kullanıyor, ama UDP üstünde. UDP’nin engellendiği 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

  • 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 veriyi frame’lere böldü ama taşımayı değiştirmedi: iç içe geçen frame’ler application layer’ı kurtarıyor, kaybolan tek paket yine hepsini durduruyor.
  • QUIC güvenilirliği stream başına ayırdı: kayıp yalnızca o pakette verisi olan stream’leri 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 16: İç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 (Content Delivery Network) 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; application layer’da 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 gibi 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: Netflix, YouTube ve Amazon Prime. 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.

CNAME kaydını 4. bölümde görmüştün: ad takma addır, değer ise o adın kanonik karşılığı. Devir birkaç kez tekrarlanabiliyor ama zincirin sonunda mutlaka bir A ya da AAAA kaydı duruyor. CNAME tek başına adres vermiyor.

Asıl seçimi en sonda CDN’in kendi yetkili sunucusu yapıyor. Zinciri kendi makinende görebilirsin; dig www.microsoft.com (Windows’ta Resolve-DnsName www.microsoft.com) Eylül 2026’da şunu döndürüyordu:

www.microsoft.com.                  870  IN  CNAME  www.microsoft.com-c-3.edgekey.net.
www.microsoft.com-c-3.edgekey.net.  870  IN  CNAME  e13678.dscb.akamaiedge.net.
e13678.dscb.akamaiedge.net.          16  IN  A      184.29.240.90

Ad iki kez devrediliyor ve üçüncü basamakta Akamai’nin makine üretimi bir adına varıyor. İçeriğin gerçekte hangi makinede durduğunu bu zincirden anlamıyorsun; seçim her sorguda yeniden yapılabildiği için sabit bir cevabı da yok. Asıl haber ikinci sütunda. İlk iki satırın yaşam süresi 870 saniye, son satırınki 16 saniye. Takma adlar nadiren değişiyor, kenar seçimi ise saniyeler içinde tazelenebiliyor: CDN bir kenarı kapatmak ya da yükü kaydırmak istediğinde eski cevabın dünyadaki önbelleklerden düşmesini yalnızca birkaç saniye bekliyor. 5. bölümdeki hesap burada işe yarıyor; çok sorulan bir ad için kısa yaşam süresinin bedeli kullanıcıya değil, CDN’in kendi sunucularına yazılı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, resolver’ın adresini görüyor; merkezî bir resolver 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 oktet

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

Resolver da 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. Resolver’lara 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. Açık resolver’lar da bu yüzden ikiye ayrılıyor: Google’ın 8.8.8.8’i seçeneği destekleyen yetkili sunuculara gönderiyor, Cloudflare’in 1.1.1.1’i mahremiyet gerekçesiyle hiç göndermiyor. 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ı routing ç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; 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 routing tarafında nasıl yapıldığını burada açmıyorum; 45. 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 (origin) 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 ms

Menş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-Encoding

Vary 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 (redirect) kuralı, bir oturum denetimi, kullanıcının ülkesine göre farklı bir sayfa. Kazanç aynı yerden geliyor: kararı veren makine yaklaştıkça yayılım gecikmesi küçülüyor.

Şimdi kendi makinene bak. Bir CDN’in sunduğu herhangi bir nesnenin başlıklarını iste:

curl -sI https://cdn.jsdelivr.net/npm/react@18.2.0/package.json

Eylül 2026’da dönen satırların arasında şunlar vardı:

Cache-Control: public, max-age=31536000, s-maxage=31536000, immutable
Age: 4014434
x-cache: HIT, HIT

Tarayıcıya da kenara da bir yıl ömür verilmiş. immutable işareti “bu adresin içeriği hiç değişmeyecek” diyor; sürüm numarası adresin içinde yazılı olduğu için doğru bir söz. Ömürler ayrı da verilebiliyor: max-age=86400, s-maxage=604800 tarayıcıya bir gün, kenara bir hafta demek. Age başlığı, cevabın menşede üretilmesinin ya da doğrulanmasının üstünden geçen saniye sayısını taşıyor. Buradaki dört milyon saniye, aynı kopyanın kenarda kırk altı gündür durduğunu söylüyor. Sıfırdan büyük bir değer cevabın önbellekten geldiğinin kanıtı, x-cache satırındaki HIT de aynı şeyi CDN’in kendi diliyle söylüyor.

Seni yönlendiren resolver’ı da görebilirsin. Windows’ta ipconfig /all çıktısındaki DNS Servers satırı, Linux’ta resolvectl status, macOS’ta scutil --dns senin adına soran makineyi veriyor. EDNS Client Subnet kapalıyken bütün bu seçim onun adresine bakılarak yapılıyor.

Özet

  • 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: zincir sonunda mutlaka bir adres kaydına düşüyor ve o son kaydın yaşam süresi saniyelerle ölçülecek kadar kısa olabiliyor.
  • EDNS Client Subnet tahmini düzeltirken adresini açıyor: IPv4 için 24 bitlik kırpma öneriliyor; 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 17: 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?

Application layer’da bir protokolün tanımlaması gereken dört şey var. Birincisi hangi ileti türlerinin değiş tokuş edileceğ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. Bu ölçeklenmenin hesabını ve BitTorrent’in içini 72. bölümde göreceksin.

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. Özgün SMTP hem başlığın hem gövdenin 7 bitlik ASCII olmasını şart koşuyordu. Sonradan eklenen uzantılar sekiz bitlik gövdeye ve UTF-8 adreslere izin veriyor ama ekler hâlâ eski kurala göre hazırlanıyor: 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ü 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önlendirmeden sağ çıkı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. İsteğe bağlı başlayan bu katmanlar artık fiilen zorunlu: Gmail ile Yahoo, 2024’ten beri günde binlerce ileti gönderen alanlardan üçünü birden istiyor ve eksik olanın postasını teslim etmiyor.

İ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; bugünkü tanımı RFC 9051’de, eski numarası 3501. 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. Tarayıcıya HTTP ile sunduğu arayüzün arkasında göndermek için SMTP’yi, almak için IMAP ya da POP’u kullanıyor.

Video akışı neden bir indirme sayılmıyor?

16. bölümde konut trafiğinin büyük kısmının üç akış hizmetine gittiğini görmüştün. 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, MPEG-2 için 3 ile 6 Mbit/s, MPEG-4 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: Dynamic Adaptive Streaming over HTTP, HTTP üzerinden dinamik, uyarlanır akış. O parçaların hangi makinede durduğu ise 16. bölümde kenar sunucularında çözülmüştü. İstemcinin hızı nasıl seçtiği, tamponun hesabı ve canlı yayının gecikmesi 73. bölümün konusu.

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 firewall’lar, adres çeviricileri ve kurumsal proxy’ler 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ı transport layer’ı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:

UygulamaUygulama protokolüTaşıma
e-postaSMTP (RFC 5321)TCP
dosya aktarımıFTP (RFC 959)TCP
internet telefonuSIP (RFC 3261), RTP (RFC 3550) ya da tescilliTCP veya UDP
akan videoHTTP, DASHTCP ya da QUIC (UDP)
uzaktan oturumTelnet (RFC 854), SSHTCP

Telefonun UDP tarafına düşebilmesi tesadüf sayılmaz: 7. bölümde bağlantısız gönderimi anlatırken geç gelen verinin hiç gelmemiş sayıldığını söylemiştim. Jitter’dan RTP’ye gerçek zamanlı sesin geri kalanı 74. bölümde.

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/services

Her 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

  • 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 neye dönüşüyor?

Bölüm 18: 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 bilerek 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ı kısa. 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. 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 router’lara 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. Kutu uygulamanın mesajına, barkod transport layer başlığına, şehir etiketi network layer başlığına, sefer listesi ise data link layer’ın frame’ine karşılık geliyor. Benzerlik arıza anında bozuluyor: 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 Network Interface katmanı, OSI’nin data link ve physical layer’larının işini tek başına görüyor; ona host-to-network ya da network access da deniyor. Ders kitaplarının çoğu ise ikisinin arasında duran beş katmanlı bir yığın öğretiyor. Türkçe kaynaklarda veri bağı katmanı diye geçen kata bu kitap boyunca data link layer diyeceğim; tablolarda yer darlığından kısaca bağ olarak geçecek.

KatmanİşiÖrnek
Application (uygulama)iki uçtaki programın konuştuğu dili kurarHTTP, IMAP, SMTP, DNS
Transport (taşıma)veriyi bir süreçten karşıdaki sürece teslim ederTCP, UDP
Network (ağ)datagrama yol seçer ve varışa kadar iletirIP, routing protokolleri
Data link (veri bağı)veriyi yalnızca komşu düğüme kadar götürürEthernet, 802.11, PPP
Physical (fiziksel)biti elektriğe, ışığa ya da dalgaya çevirirbakı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:

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

Presentation layer 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. Presentation layer ö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; OSI’nin diliyle o çevirme presentation layer’ı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ı presentation layer örneği.

Session layer 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 session layer’ı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 connection ID’si: üçü 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. Model bir reçete değil, bir betimleme: hangi işin hangi kata düştüğünü sıralar; o işi kimin, hangi kutuda, hangi koddan gerçekleyeceğine karışmaz.

Modelin yanında bir OSI protokol yığını da yazıldı ve bazı hükümetler 1980’lerin sonunda satın alımlarda onu şart bile koştu. Ama TCP/IP daha önce, çalışan koduyla geldi ve sahayı aldı. OSI yığınından bugüne birkaç parça kaldı: sertifikaların X.509 biçimi, dizin protokolü LDAP’ın atası X.500 ve operatör omurgalarında hâlâ çalışan routing protokolü IS-IS. Session ile presentation için yazılan OSI protokolleri ise Internet yığınında hiç karşılık bulmadı.

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 switch’i dediğinde herkes routing yapan bir kutuyu anlıyor. Yedinci katmanda çalışan firewall 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 routing 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.

KatmanVeri parçasının adıBu katta duran cihazlarKarar verirken neye bakar
Applicationileti / veriproxy, reverse proxy, uygulama firewall, 7. katman load balanceristek satırı, başlıklar, alan adı, yol
Presentationverişifreleme sonlandıran kutulargösterim ve kodlama
Sessionveriayrı bir kutusu yokkonuşma düzeni
Transportsegment (TCP) / datagram (UDP)durum bilgili firewall, NAT, 4. katman load balancerport numaraları ve bağlantı durumu
Networkpaket (datagram)router, 3. katman switch, temel firewallhedef IP adresi
Data linkframeswitch, bridge, kablosuz access point (erişim noktası), ağ kartıhedef MAC adresi
Physicalbithub, repeater, medya dönüştürücü, kablo, konnektör, prizin kendisihiç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: proxy istemcinin isteğini onun adına ileten kutu, reverse proxy aynı işi sunucunun önünde yapan ve istemcinin gerçekte konuştuğu kutu, load balancer 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. Medya dönüştürücü de yalnızca sinyalin taşındığı ortamı değiştirir; bakırdan gelen biti fibere, fiberden geleni bakıra aktarır. İkisi de içeride ne olduğunu bilmez, bilmesi de beklenmez. Bir üste çıktığında cihaz ilk kez bir alana bakıp bir karar veriyor: switch hedef MAC adresini okur ve frame’i yalnızca o adresin öğrenildiği porta yollar. Aynı satırdaki bridge switch’in atasıdır ve o kararı ilk veren cihazdır; ikisinin arasındaki farkı switch’i tanıdıktan sonra ayrı ayrı sereceğim. Bir üste daha çıktığında karar yerelden çıkar; router hedef IP adresine bakar ve paketi başka bir ağa iletir.

Ders kitaplarındaki kısa tanım da buradan çıkıyor: switch aynı ağın içindeki makineleri birbirine bağlar, router ise ayrı ağları birbirine bağlar. Başka kaynaklardaki şemalarda ikisini adından önce şeklinden tanırsın. Cisco’nun simgelerinde ve ders kitaplarının çoğunda router yuvarlak çizilir, üstten bakılmış yassı bir silindir gibi; switch ise köşeli bir kutudur ve ikisinin de üstünde oklar çizilidir. Bu kitabın şemaları kutunun adını üstüne yazıyor, ama bir ders slaytında yalnızca bir daire ile bir kare görürsen hangisinin hangisi olduğunu artık biliyorsun.

Bu tırmanışın somut bir bedeli var: cihaz ne kadar yukarı çıkarsa paket başına o kadar çok iş yapar. Hub’ın gecikmesi nanosaniyeler, switch’inki mikrosaniyeler mertebesinde; routing’i donanımda yapan bir kutu da mikrosaniyelerde kalıyor. İstek başlıklarını yazılımda ayrıştıran bir proxy’ninki ise milisaniyeye çıkabiliyor. Kutuyu yukarı taşımak çoğu 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. Router üçüncü katman cihazıdır ama frame’i çö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 switch, switch donanımının hızıyla routing yapan bir kutudur; ismi ikinci katmanı, işi üçüncüyü anlatır. Ev kutun ise tek kasada modem, router, switch 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, 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.

Özet

  • 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; presentation ile session katlarının işini Internet yığınında application layer üstlenir. Sertifikanın ASN.1 kodlaması ve HTTP’nin Range başlığı bunun iki canlı örneğidir.
  • Fiziksel katman dört başlıkta anlaşmaktır: mekanik, elektriksel, işlevsel ve yordamsal; biri tutmazsa sapasağlam bir kablodan bile tek bit geçmez.
  • Bir cihazın katmanı okuduğu en derin başlıktır: hub hiçbir alana bakmaz, switch hedef MAC adresine, router hedef IP adresine bakar; kutu yukarı çıktıkça paket başına daha çok iş yapar.
  • Switch aynı ağın içini, router ağları birbirine bağlar: şemalarda switch köşeli bir kutu, router yuvarlak bir silindir olarak çizilir.

Katmanları saydık ve her kutuyu kendi katına oturttuk. İki katın arasındaki anlaşmayı ise henüz adlandırmadım. Peki bir kat altındakinden ne alıyor ve karşı makinedeki eşine ne söz veriyor?

Bölüm 19: Hizmet ve Protokol

Katlar sayıldı, kutular yerine oturdu. Geriye aralarındaki anlaşma kalıyor ve o anlaşma iki ayrı yöne uzanıyor: biri aşağıya ve yukarıya, öteki karşıdaki makineye.

Peki bu iki yön neden ayrı adlar taşıyor ve ayrımı bilmek sana ne kazandırıyor?

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: transport layer’ı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 HTTP’yi TCP’den QUIC’e taşımak, 15. bölümde gördüğün gibi, HTTP’nin anlamlarına hiç dokunmadı.

İki ilişkiyi ve aradaki kutuların kaç kat çıktığını tek figürde görelim:

Yol boyunca katmanlar: kim kaça kadar çıkıyor
istemcisunucuapplicationtransportnetworkdata linkphysicalapplicationtransportnetworkdata linkphysicalswitchrouterdata linkphysicalnetworkdata linkphysicalHTTPTCPIPIPEthernetEthernetEthernetyatay çizgi: protokol — iki eş aynı dili konuşuyordikey geçiş: hizmet — her kat altındakine yaslanıyor
İki uçta beşer kat. İstemci de sunucu da yığının tamamını gerçekliyor: application, transport, network, data link ve physical. İstek en üstte doğuyor, en altta tele iniyor; karşı tarafta aynı merdiven ters yönde çıkılıyor.
  1. İki uçta beşer kat. İstemci de sunucu da yığının tamamını gerçekliyor: application, transport, network, data link ve physical. İstek en üstte doğuyor, en altta tele iniyor; karşı tarafta aynı merdiven ters yönde çıkılıyor.
  2. Aradaki kutular yalnızca gerektiği kadar çıkıyor. Switch frame'i okuyup iletmek için data link layer'a kadar çıkıyor, daha yukarısını hiç görmüyor. Router hedef IP adresine bakmak zorunda olduğu için bir kat daha, network layer'a çıkıyor. Kimse taşıma ve uygulama başlıklarını açmıyor.
  3. Yatay ilişki protokol. Aynı kattaki iki eş birbirine kendi diliyle sesleniyor: HTTP uygulamadan uygulamaya, TCP taşımadan taşımaya. IP ile Ethernet ise atlama atlama konuşuyor, çünkü o katların eşi yolun üstündeki kutularda da var.
  4. Dikey ilişki hizmet. Bitler yalnızca telden geçiyor; kesik çizgilerin hiçbiri gerçek bir yol değil. Her kat altındakinin hizmetine yaslanıyor, aradaki kutu da paketi okuyabildiği en derin başlığa kadar çıkarıp yeniden aşağı indiriyor.
  5. Katman numarası kutunun tavanını söylüyor. Switch 2. katman, router 3. katman cihazı; ikisi de altındaki her katı gerçeklemek zorunda. Uygulama ile taşıma başlıkları yol boyunca kimseye görünmüyor, bu yüzden uçtan uca güvenilirlik ancak uçlarda kurulabiliyor.

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, tıpkı telefon gibi. Bağlantısız hizmette kurulum yoktur; her birim kendi başına, kendi adresiyle yollanır, tıpkı mektup gibi. 8. bölümde üç mesajlık el sıkışmayı kuran TCP birincisi, 7. bölümde hiçbir söz vermeyen UDP ikincisidir. IP de bağlantısızdır; güvenilir bir transport layer’ının bağlantısız bir network layer ü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 interface (arayüz) port numarasıdır; iyi bilinen iki örnek HTTP’nin 80 ve FTP’nin 21 numarasıdır. 6. bölümdeki demultiplexing bu interface’in sözleşmesi üstünde duruyor. Data link ile network layer arasındaki interface ise Ethernet frame’inin 2 baytlık tür alanı. O alan, frame’in içindekinin üstteki hangi protokole teslim edileceğini söylüyor; data link layer’ın demultiplexing’i tek bir alana sığmış durumda. Aynı işi LLC katmanında Service Access Point yapıyor.

Taşınan şeyin adının katman katman değiştiğini önceki bölümdeki tabloda gördün: segment, datagram, frame, bit. Bu birimlerin ortak adına Protocol Data Unit deniyor; network layer’ı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. Data link layer 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 encapsulation’ın 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 network layer’ın SDU’su, network layer’ın ürettiği datagram data link layer’ın SDU’sudur. Zarfın içinde zarf 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. Data link layer 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: network layer, altında bakır mı radyo mu olduğunu umursamak zorunda kalmıyor. Ağ kartı denetleyicisinin çipte gerçeklediği şey de 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.

ilkelkim çağırırne demek
requestüstteki kat, gönderen uçta“şu hizmeti başlat”
indicationkatman, alan uçtaki üstüne“karşıdan böyle bir istek geldi”
responseüstteki kat, alan uçta“kabul ediyorum / şu cevabı ver”
confirmkatman, 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; çekirdek ağın interface 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 interface’i OSI’nin sözlüğünü kullanmıyor ama aynı dört anı üretiyor.

Ayrımın en somut 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 router’lar 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. Data link layer çipte ya da ağ interface 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. Network layer’ı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; ş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, firewall’lar, önbellekler. İstek 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 frame’ini say: 14 bayt Ethernet başlığı, 20 bayt IP, 20 bayt TCP, 4 bayt frame sağlaması, telde ayrıca 8 bayt önsöz ve 12 bayt frame 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: şifresiz bir uzak oturumda, Telnet’te bastığın bir harf. Veri 1 bayt. IP datagramı 41 bayta çıkıyor, frame 59 bayt ediyor ve Ethernet’in 64 baytlık asgari frame ş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: data link layer frame’in 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; sebebi de 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 router’ın belleğinde de olabilir. Alttaki ikisi zorunlu değil, erken. Bozuk bir frame’i 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 frame girişimden bozulmuş olabilir, yani ortada tıkanıklık yoktur. Data link layer iki durumu ayırt edebilir ama TCP’ye söyleyecek bir kanalı yoktur; sözleşmede öyle bir alan yok. TCP hattı dolu sanı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 segmentleri işletim sistemi yerine kendisinin bölmesi, router’ın trafiği transport layer portlarına bakarak yollara dağıtması, tıkanıklığın kayıp yerine bir bit ile bildirilmesi: üçü de bilerek 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:443

Aynı 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: data link layer ü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

  • 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.
  • Hizmet ya bağlantı yönelimlidir ya bağlantısız: TCP önce kurulum yapar, UDP ile IP her birimi kendi adresiyle yollar; güvenilir bir taşıma bağlantısız bir ağın üstünde durabilir.
  • Encapsulation tek satırlık bir denklemdir: (N)-PDU = (N)-PCI + (N)-SDU ve bir katın ürettiği paket, bir alttakinin gözünde ham veridir.
  • Data link layer iki alt kattan oluşur: MAC hattı kimin ne zaman kullanacağına karar verir, LLC üst kata tek tip bir yüz gösterir.
  • 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 ne veriyor?

Bölüm 20: Encapsulation ve Başlıklar

Katmanların birbirine ne sözü verdiğini kurduk. Söylemediğim şey, komşuya 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

Application layer 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.

Network layer 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 data link layer; o da datagramı olduğu gibi alıp sarıyor ve ortaya frame (çerçeve) çıkıyor.

application  [ mesaj ]
transport    [ TCP | mesaj ]                       ->  segment
network      [ IP  | TCP | mesaj ]                 ->  datagram
data link    [ ETH | IP  | TCP | mesaj | FCS ]     ->  frame

Kargo ş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:

Aynı yük, dört kat zarf
applicationtransportnetworkdata linkmesaj · 1.460 bayt1.460 baytTCPmesaj · değişmedisegment · 1.480 baytIPTCPmesaj · değişmedidatagram · 1.500 baytETHIPTCPmesaj · değişmediFCSframe · 1.518 bayttelde 8 bayt önsöz + 12 bayt boşluk → 1.538 bayt · verinin payı %94,9
Application layer 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.
  1. Application layer 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.
  2. Transport layer 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.
  3. Network layer 20 bayt daha ekliyor: datagram. IP başlığı bu kez TCP başlığını da yük sayıyor. (N)-PDU = (N−1)-SDU denklemi tam burada işliyor: bir üstün paketi, bir altın ham verisi. Toplam 1.500 bayt.
  4. Data link layer hem baştan hem sondan sarıyor: frame. Ethernet 14 baytlık başlığı öne, 4 baytlık FCS sağlamasını sona koyuyor. Sondan yazan tek katman bu. Toplam 1.518 bayt.
  5. Telde fatura biraz daha kabarıyor. Frame'in ö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 TCP başlığı bu genişliğin yedide biri kadar olurdu.

Son satırdaki FCS dikkatini çekmiş olmalı. Frame hem başlıkla hem kuyrukla sarılıyor; sondan yazan tek katman data link layer.

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. Encapsulation dediğimiz şey bu.

Başlıkta ne var?

Seçenek taşımayan bir TCP başlığı 20 bayt. Başlık sabit değil; içinde başlık uzunluğu (data offset) 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:

bitalanboyne yapıyor
0Sürüm4 bitIPv4 için değeri 4; alıcı başlığı okumadan önce buna bakar
4IHL4 bitbaşlığın kendi uzunluğu, 32 bitlik kelime cinsinden
8DSCP6 bitpaketin hangi hizmet sınıfına ait olduğu
14ECN2 bityol üstünde tıkanıklık görülüp görülmediği
16Toplam Uzunluk16 bitbaşlık dahil bütün datagram
32Kimlik16 bitaynı datagramdan doğan parçaları eşleştirir
48Bayraklar3 bitayrılmış · DF (bölme) · MF (arkadan parça var)
51Parça Ofseti13 bitparçanın özgün yükteki yeri, 8 baytlık birimle
64TTL8 bither router’da bir azalır, sıfırlanınca paket ölür
72Protokol8 bityükün sahibi: 1 ICMP, 6 TCP, 17 UDP
80Başlık Sağlaması16 bityalnızca başlığı korur, yükü değil
96Kaynak Adres32 bitgönderenin IP adresi
128Hedef Adres32 bitalıcının IP adresi
160Seçenekler0-40 baytyalnızca IHL beşten büyükse vardır

Birkaç alan ilk okumada kolayca kayıyor, oysa hepsi 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 router 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 firewall tarafından susturulursa yöntem sessizce çöker; sahadaki hâlini 48. bölümde 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 router’da yeniden hesaplanması gerekiyor; 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.

Frame’in alanları da sırayla belli; boyları toplandığında zarfın maliyeti çıkıyor:

alanboyne yapıyor
önsöz + SFD8 baytframe’in kendisine dahil değil; alıcıyı başlangıca kilitler
hedef adres6 baytframe’i kimin alacağını söyler
kaynak adres6 baytgönderenin aynı biçimdeki adresi
tür alanı2 baytiçerideki protokolü söyler
veri46-1.500 baytdatagram buraya girer
FCS4 baytframe’in kuyruğu

Bu iki adresin nasıl kurulduğunu burada boş bırakıyorum. Alanların genişliğini biliyorsun; içlerindeki değerin ne anlama geldiğini 23. bölümde dolduracağız.

Adresler, tür alanı ve FCS birlikte 18 bayt tutuyor. Önsöz (preamble) hariç azami sade frame 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 frame’i bilinmeyen tür sanıp atar.

Ethernet Type II frame'inin alan şeridi: 6 baytlık hedef ve kaynak adres, 2 baytlık EtherType alanı, 46-1500 baytlık veri alanı ve 4 baytlık CRC; şeridin toplamı 64 ile 1518 bayt arasında.

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 24. bölümün işi.

Her zarf bir sonrakini nasıl gösteriyor?

Encapsulation’ın 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ıkişaretçi alanıdeğersonraki başlık
Ethernettür alanı0x0800IPv4
Ethernettür alanı0x0806ARP
Ethernettür alanı0x86DDIPv6
Ethernettür alanı0x8100VLAN etiketi, sonra yeniden tür alanı
IPv4 / IPv6protokol1 / 58ICMP
IPv4 / IPv6protokol6TCP
IPv4 / IPv6protokol17UDP
IPv4 / IPv6protokol47GRE tüneli
IPv4 / IPv6protokol50IPsec ESP
TCP / UDPhedef port443TLS, ardından HTTP
TCP / UDPhedef port53DNS

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ı encapsulation çözme (decapsulation) ve sarmanın tam tersi sırayla yürüyor. Alıcı kartı frame’i alıyor, FCS’yi yeniden hesaplayıp yazandan farklı çıkarsa frame’i 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.

Encapsulation’ın özeti: 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 frame’in veri alanına MTU deniyor. Ethernet’te 1.500 bayt. Bu bir network layer kararı değil, data link layer 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. Switch’lerin çoğu bugün 9.000 bayt veri taşıyan jumbo frame’leri kabul ediyor; aynı veriyi altı kat daha az frame’le göndermek, frame 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; yol üstündeki tek bir port jumbo frame’i 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 router 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 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   568

Parç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ç router’da 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 frame 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 frame 64 bayta çıkıyor. Telden geçen her şey zarf.

O dolgu baytları network layer’ına kadar çıkıyor. Onları ayıklayan şey IP başlığındaki uzunluk alanı.

Kanalın ödediği fatura frame boyuyla değil toplamla ölçülüyor. 1.500 baytlık veri taşıyan bir frame’in kanal maliyeti, önsöz ve frame’ler arası boşluk dahil, 1.538 bayt. Yükün payı %97,5. 10 Mbit/s’lik bir hatta bu saniyede 812 frame demek. Aynı hatta asgari boy frame’ler saniyede 14.880 adet geçiyor ve yalnızca 5.475.840 bit veri taşıyor: kanalın %54,8’i.

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 frame’ler arası boşluk 9,6 µs, yani 96 bit süresi. Toplamı 304 bit süresi.

Küçük frame’in bir yararı da var. Bozulan bir frame’de yeniden gönderilecek bit sayısı daha az. Multiplexing 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 interface’in yanına mtu 1500 yazacak. İkincisi her satırın başında frame’in kaynak ve hedef adresini, ethertype IPv4 (0x0800) etiketini ve frame’in bayt cinsinden boyunu dökecek. Windows tarafında aynı değeri netsh interface ipv4 show subinterfaces komutu veriyor.

Özet

  • Encapsulation dört basamaklı bir merdiven: mesaj segmente, segment datagrama, datagram frame’e 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; sondan kuyruk ekleyen tek katman da data link layer.
  • IPv4 başlığı beş satır, on üç alandır: IHL başlığın tavanını 60 bayta kilitler, DSCP ile ECN aynı bayttan bölünmüştür, DF biti yol MTU keşfini başlatır ve checksum yalnızca başlığı korur.
  • Bağlayıcı alanlar zinciri kuruyor: frame’deki 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 21: Paket Yakalama ve Çözümleme

Diyelim ki bir yakalama aracı kurdun ve açılış ekranındaki kart listesinden kendi interface’ini seçtin. Satırlar akmaya başlıyor; her satır bir frame. Encapsulation 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 ne?

Trafiği kim kopyalıyor?

Bu işin en yaygın aracı Wireshark ve bölüm boyunca ondan söz edeceğim. Ekranda gördüğün program yakalamayı kendisi yapmıyor. Altta, işletim sistemiyle konuşan bir paket yakalama kütüphanesi var: Linux ve macOS’ta libpcap, Windows’ta Npcap. Üstünde de senin tıkladığın çözümleyici arayüz duruyor ve onun işi baytları adlandırmak.

Alt katman, kartın gönderdiği ve aldığı bütün Ethernet frame’lerinin 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.

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 ya da enp3s0, kablosuz için wlan0 ya da wlp3s0 gibi adlar; macOS’ta en0 ile lo0; Windows’ta üreticinin verdiği uzun ad. Fiziksel kartların yanında sanal geri döngü interface’i de listede duruyor; makinenin kendi kendine konuşmasını oradan yakalıyorsun.

Wi-Fi kartıyla yakalayacaksan bir adım daha var: kartı monitor mode’a (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 broadcast ortamı olması: paylaşılan Ethernet ve kablosuz bağlantı. Herkesin duyduğu bir yerde kartı susturmayı bırakmak yetiyor.

Switch’li bir yerel ağda hesap değişiyor. 192.0.2.10 numaralı makineden 192.0.2.11’e giden bir frame, kartın karışık modda olsa bile 192.0.2.12’ye ulaşmıyor. Switch onu yalnızca hedefin bağlı olduğu porta gönderiyor.

İşin ters yüzü de var. Switch’in kendi portları karışık modda çalışıyor; adres öğrenmesinin yolu bu. Öğrendiklerini tuttuğu tablo ise sınırlı; tablo sahte adreslerle taşırılırsa (MAC flooding) switch frame’leri yeniden herkese dağıtmaya başlıyor ve dinleme geri geliyor. Kurumsal ağlarda dinlemenin meşru yolu da switch’in kendisinde: bir portun trafiğini başka bir porta kopyalayan port yansıtma (port mirroring, SPAN) ayarı.

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 frame’de ilk 14 bayt Ethernet başlığı, sonraki 20 bayt IPv4, sonraki 20 bayt TCP. İlk 54 bayt zarf, gerisi uygulamanın yükü.

Paket yakalama interface'inin üç bölmesi tek ekranda: üstte satır satır yakalanmış paketler, ortada seçilen paketin katman katman açılmış ağacı, altta aynı paketin ham bayt dökümü. Ağaçtaki alan ile bayt aralığının eşleşmesi burada görünüyor.

Ağacın dalları ile bayt aralıkları birebir örtüşüyor:

ağaçtaki dalbayt aralığıuzunluk
frame’in tamamı0 – 533534 bayt
Ethernet II0 – 1314 bayt
Internet Protocol v414 – 3320 bayt
Transmission Control Protocol34 – 5320 bayt
Transport Layer Security54 – 533480 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 yakalanan toplam paketi, o an gösterilen paket sayısını ve etkin profilin adını taşıyor. İlk iki sayı 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ığı 23. bölümün işi.

Son bir ayrıntı: kayıt ekranında azami frame 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. Kendi gönderdiğin trafikte 1.514’ü çok aşan “frame”ler görürsen de şaşırma. Kart segmentleri bölme işini üstlendiği için, 19. bölümdeki katman ihlali yüzünden, yakalama o parçayı bölünmeden önceki büyük hâliyle görüyor.

Kayda soru sormak

Filtre kutusu bir tane değil, iki tane. Açılış ekranındakine yazdığın filtre, frame’ler 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: dhcp.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 kernel’a gitmiyor; önce küçük bir sanal makinenin komutlarına derleniyor. O sanal makinenin adı BPF ve programı doğrudan kernel’ın içinde, paket kullanıcı alanına kopyalanmadan önce koşuyor. Her frame 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 frame önce kopyalanacak, sonra atılacaktı; yani en pahalı iş, atılacak paket için de yapılacaktı. Kernel’da 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ü kernel 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. Fikir o kadar iyi çalıştı ki Linux’ta büyüyüp eBPF adını aldı: bugün kernel’ın içinde güvenli küçük programlar çalıştırmanın genel yolu, paket süzmekten performans ölçmeye kadar.

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 frame’ler hiç yazılmadı. Elenen frame 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 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: 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 frame yalnızca başlıktan ibaret. Uçlardaki durumları, yani CLOSE-WAIT ya da TIME-WAIT’i yakalamada göremezsin, çünkü telden geçmiyorlar; onlar 8. bölümdeki ss çıktısında, makinenin kendi tablosunda duruyor.

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 69. 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. 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 frame’i 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ı, paketleri zaman sırasına dizerek tek dosyada birleştiriyor.

Özet

  • Yakalama işini ekrandaki program yapmıyor: trafiği kopyalayan katman işletim sisteminin yanında 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 broadcast ortamı olması; switch’li bir ağda frame 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: frame’i tele koyacak olan ne?

Bölüm 22: Ağ Interface Kartı

Yakalama aracında her satırı bayt bayt sayıp zarfları tek tek gördün. Frame’i 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ı nerede başlıyor?

Kart nerede duruyor?

Ağ kartı, bilgisayarı ağa fiziksel olarak bağlayan parça. Tam adı ağ interface kartı (network interface card); Türkçe kaynaklarda ağ arayüz kartı, ağ adaptörü ya da ağ bağdaştırıcısı 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ı PCI, bugünkü karşılığı PCI Express. 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 yongasını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, data link layer’ı ve physical layer’ı; üstündeki her şey yazılımda kalıyor. 19. bölümde 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ç interface.

Soket four-tuple’ını kurarken kernel’ın altında ne olduğunu kapalı kutu bırakmıştım. Kutuyu şimdi açıyorum. Soket katmanını kullanıcı alanı ile kernel 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ü.

Frame’i kim kuruyor?

Kartın kalbinde, MAC protokolünü de taşıyan tek bir özel amaçlı denetleyici yonga var. Framing, hatta erişim ve hata sezme bu yonganın işi. Üçünü de donanımda yapıyor.

Ucuz bir Ethernet kartının devre kartı: yüzeydeki en büyük kare parça, MAC ile physical layer'ı birlikte taşıyan denetleyici yonga. Frame'i kurmak, hatta ne zaman gönderileceğine karar vermek ve hatayı sezmek işletim sistemine hiç uğramadan orada biter.

Yonganın içi de ikiye bölünmüş durumda. MAC bölümü frame’le ilgileniyor, physical layer bölümü sinyalle. İşte o iç interface’in adı hıza göre değişiyor: 100 Mbit/s’te MII, gigabitte GMII, on gigabitte XGMII. Physical layer tarafı kendi içinde ayrıca katmanlı. Orada bir kodlama alt katmanı ile ortama bağlanan ve ortama bağımlı alt katmanlar duruyor; standarttaki adları PCS, PMA ve PMD.

Framing, datagramın önüne başlık arkasına kuyruk eklemek demek. Encapsulation 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 frame’i kendisi kuruyor.

Ama framing’in asıl zorluğu ekleme değil, ayırma. Physical layer’ı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 stream’de bir frame’in nerede başlayıp nerede bittiğini bilmek zorunda, yoksa elindeki baytların hangisinin adres hangisinin veri olduğunu söyleyemez. Sorunun adı frame sınırlandırma ve tarih boyunca dört ayrı çözümü denendi.

Bayt sayısı. Frame’in 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 frame’ler kayar. Tek bir bit hatası kalıcı bir hizasızlık üretiyor.

Bayrak baytı ve bayt doldurma. Frame’in 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 frame 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 0

Köş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ı.

Physical layer ihlali. Dördüncüsü 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. 53. bölümde blok kodlamaya indiğimizde göreceksin: 4B/5B, 32 desenden yalnızca 16’sını veriye ayırıyor ve artan desenlerin bir kısmı bunun için duruyor.

Ethernet aslında üç yöntemi birden kullanıyor. Önsöz ile frame başlangıç sınırlayıcısı başlangıcı işaretliyor, uzunluk alanı ile taşıyıcının kesilmesi sonu; frame’ler arası boşluk da iki frame’in 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 frame aldığında işlemciyi kesiyor. Kesmeye yanıt veren sürücü yazılımı hata durumlarını ele alıyor ve datagramı network layer’a yukarı veriyor. Donanımın bittiği çizgi orası.

Frame’in üstündeki adres de kartın kendi adresi ve kart bu kimliği üstündeki ROM’da taşıyor. Kartın hem birinci hem ikinci katmanın aygıtı sayılması bu yüzden: sinyali o üretiyor, frame’in adresini de o taşıyor. Bu adresin nasıl kurulduğunu, yani MAC adresinin biçimini 23. bölümde tek tek açacağız.

Kernel işi karta nasıl devrediyor?

Paket stream’i interface’e girip çıkarken doğrudan bellek erişimiyle yönetiliyor; kısaltması DMA (Direct Memory Access). 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. Kernel 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 kernel arasında nasıl el değiştirdiğini izleyelim:

Kernel ile kartın paylaştığı gönderme halkası
kernel · sürücüağ kartı · link denetleyicisiframe'i kuran ve hatayı sezen yongapaket tamponuana bellek · gönderme halkasıdoludoludoluboştanımlayıcıDMAtelekesme
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.
  1. 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.
  2. Kernel tanımlayıcıyı yazar. Kernel sıradaki boş girişi dolduruyor ve sahiplik bitini karta çeviriyor. Devretme bundan ibaret: paketin kendisi kopyalanmıyor, yalnızca adresi yazılıyor.
  3. 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.
  4. 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.
  5. Frame çıkar, kesme döner. Denetleyici frame'i kurup tele veriyor ve sahipliği kernel'a 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 frame’lerle 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 kernel’a 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 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 frame 64 bayt, ama telde 84 bayt yer kaplıyor. Yanına 7 baytlık önsöz, 1 baytlık ayraç ve 12 baytlık frame’ler arası boşluk ekleniyor. Toplamı 672 bit eder. Tam yükte saniyede 1.488.095 frame geçiyor. Her frame için bir kesme, saniyede 1,49 milyon kesme demek. Tek bir işlemci çekirdeği zamanının çoğunu yalnızca kesmeye cevap vermekle geçirirdi.

Kartlar bu yüzden kesme birleştirme yapıyor: sürücü ya da kart, işlemciyi kesmeden önce birkaç frame biriktiriyor. 32 frame’de bir kesme verildiğinde aynı yük saniyede 46.503 kesmeye iniyor. Frame’ler yine aynı halkada birikiyor. Değişen tek şey, kernel’ın kaç kez rahatsız edildiği.

Bedeli de aynı bölme işleminden çıkıyor. 32 frame’de bir kesme veren kart, gruptaki ilk frame’i en kötü durumda 31 frame süresi bekletiyor. Boş bir hatta durum daha kötü: grup hiç dolmazsa kesme de hiç gelmiyor. Yalnızca frame sayan bir politika bu yüzden tek başına kullanılamıyor.

Kartlar ikinci bir politika daha taşıyor. İlk frame 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 bunlar: biri frame sayıyor, biri mikrosaniye. 200 µs’ye ayarlanmış bir zamanlayıcı, boş bir hatta gelen tek frame’e 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ı.

Linux bunun üstüne bir adım daha atıyor. Yük yükseldiğinde kesmeleri tümden kapatıp halkayı kendisi yokluyor ve bir turda onlarca frame topluyor; yük düşünce kesmelere geri dönüyor. Bu karma düzenin adı NAPI. Kesme, trafik seyrekken tepki hızı veriyor; yoklama, trafik yoğunken verim.

Darboğaz gerçekten kartta mı?

Her Ethernet interface yongası, desteklediği ortamın tam frame 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 frame’ler interface’te düşürülüyor ya da yok sayılıyor; 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 frame’lik tavan en küçük frame’lere aitti. Aynı hatta en büyük frame’lerle tavan saniyede 81.274 frame’e iniyor. Frame sayısı on sekiz kat azalıyor, taşınan veri artıyor.

Bir frame’in 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 frame için bu, gigabitlik hatta 12,1 µs. On kat hızlı bir hatta aynı iş 1,21 µs’ye iniyor. 2. bölümde 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 frame 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 interface’ler satıyor. Boşaltma motorlarının (offload) çıkış noktası bu. Somut bir örnek, TCP segmentasyon boşaltması (TSO): kernel 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 ethtool bu işin aracı.

ethtool eth0
ethtool -g eth0
ethtool -c eth0
ethtool -k eth0
ip -s link show eth0

İlk komut interface’in 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 frame sayacı sıfırdan büyükse bu çoğu zaman makinenin kartın hızına yetişemediğini gösteriyor.

İ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:

kipveri yönüörnek
tek yönlü (simplex)yalnızca tek yön, hiç dönüş yokradyo yayını, klavyeden bilgisayara
yarım çift yönlü (half duplex)iki yön de mümkün ama aynı anda değiltelsiz, hub’a bağlı Ethernet
tam çift yönlü (full duplex)iki yön aynı andaswitch’e 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şmaya kalkabildiği için collision 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 yalnızca iki istasyon bulunması. Koşullar sağlanınca collision 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

  • Ağ kartı iki katmanı birden gerçekliyor: data link layer ile physical layer kartın üstünde, geri kalan her şey yazılımda; yığının donanımla buluştuğu çizgi orası.
  • Frame’i denetleyici yonga kuruyor: framing, hatta erişim ve hata sezme donanımda bitiyor ve ana işlemciye hiç uğramıyor.
  • Halka tampon ile DMA işi devrediyor: kernel tanımlayıcıyı dolduruyor, kart veriyi bellekten kendisi çekiyor; halkanın derinliği de aslında kernel’a tanınan süredir.
  • Kesme birleştirme çekirdeği kurtarıyor: frame başına bir kesme tam yükte ulaşılamaz bir sayıya çıktığı için kart birkaç frame’i biriktirip tek kesme veriyor.

Kart hazır. Halkayı okuyor, frame’i kuruyor, hatayı donanımda seziyor. Ama frame’in üstünde iki alan hâlâ boş duruyor. Kart oraya kimin adını yazacak?

Bölüm 23: Fiziksel Adresleme

Frame 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 interface’inin 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 oktet, yani sekizer bitlik 6 grup çıkıyor; adresi kısa çizgilerle ya da iki noktayla 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, frame’in 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 ücretli bir blok satın alı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 (Organizationally Unique Identifier). 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ı:

blokayrılan bitüreticiye kalanadres sayısı
MA-L2424 bit16.777.216
MA-M2820 bit1.048.576
MA-S3612 bit4.096

Bunun pratik bir sonucu var ve arıza ararken tökezletiyor: ilk üç oktet artık tek başına üreticiyi vermeyebilir. MA-S bloğunda ilk 36 bit, yani dört buçuk oktet IEEE’nin dağıttığı önek; aynı ilk üç okteti 4.096 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; routing tablosunda karşına çıkacak mantığın aynısı, başka bir uzayda.

Yine de çoğu durumda ilk üç oktete bakarak interface 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.

Bir router'ın alt yüzündeki fabrika etiketi: seri numarasının yanında LAN ve WLAN interface'leri için ayrı ayrı basılmış iki MAC adresi. Adresin üretim hattında verildiğini ve her interface'in kendi adını taşıdığını gösteriyor.

Neden kartın kendi adı var?

Interface sözleşmesi her katmana kendi adlandırma düzenini bırakıyor ve üç katman üç ayrı ad kullanıyor. Application layer’da makinenin adı, network layer’da IP adresi, data link layer’da 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; frame’i bir interface’ten, ona fiziksel olarak bağlı başka bir interface’e ulaştırmaktan ibaret. Kart nereye giderse gitsin adresi değişmiyor. 802.11 interface’i 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; 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 network layer protokollerini desteklemek zorlaşırdı; MAC bilerek tarafsız bırakıldı. Kart network layer 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. Ethernet paylaşılan bir kablo olarak doğdu; ortamdaki veriyi herkes alıyordu. Adres olmasaydı makine yerel ağdaki her frame için kesmeye uğrardı. Adres, işletim sistemini rahatsız etmemek için var.

Kart hangi frame’i açar?

20. bölümde encapsulation merdivenini çıkarken bu iki alanın genişliğini vermiş, içini bilerek boş bırakmıştım. Frame’de 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 interface’i kablodaki her frame’i 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 broadcast adresiyse yükü network layer’a çıkarıyor. Eşleşme yoksa frame’i atıyor ve datagramı yukarı hiç vermiyor.

Bu filtre kapatılabiliyor. Yakalamayı karışık modda yaparken kart eşleşmeyen frame’leri 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 frame 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ı frame’i gönderen cihazın MAC adresini taşıyor. Bu alan her zaman tek bir interface’i gösteren adres olmak zorunda, oraya broadcast adresi yazılamıyor. Ethernet MAC protokolü kaynak adresi hiçbir şekilde yorumlamıyor. Alan üst katman yazılımı, arıza takibi ve switch’ler için duruyor. Switch, kaynak adresleri kendi portlarıyla eşleyen tabloyu bu alandan kuruyor; switch’in her portunun da fabrikada atanmış kendi adresi var.

Adreslerden sonra gelen tür alanı içerideki üst katman protokolünü bildiriyor. Frame’in sonundaki CRC ise bozulmayı sezmek için duruyor.

DerinleşmeAynı iki bayt hem "uzunluk" hem "tür" olabilir mi?

Ethernet’in iki ayrı frame biçimi var ve ikisi bugün aynı kabloda yan yana yaşıyor.

Ethernet II (piyasadaki adıyla DIX; onu tanımlayan Digital, Intel ve Xerox’un baş harfleri) 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ğeralıcı ne anlıyor
1.500 ve altıbu bir uzunluk → frame IEEE 802.3
1.536 ve üstübu bir tür → frame 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 erişim noktası (SAP) 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 frame Ethernet II. 802.3 biçimi ölmedi ama daraldı: switch’ler 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:

Frame tele geldikçe kartın verdiği karar
önce gelensonra gelenönsöz + SFDsaat kilidihedef adres6 baytkaynak adres6 bayttürprotokolyükdatagramFCSkuyrukkart karşılaştırıyorkendi adresim mi, broadcast mi?eşleşme yokgerisini okumadan atarMAC bu alanı yorumlamazswitch tablosunu kurareşleşme ya da broadcastyükü network layer'ına çıkarır
Ö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.
  1. Ö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.
  2. Hedef adres okunuyor. Tele ilk giren adres alanı hedef adres. Kart onu kendi fabrika adresiyle karşılaştırıyor; broadcast adresi de eşleşme sayılıyor.
  3. Eşleşme yoksa bırakıyor. Frame'in geri kalanı okunmuyor ve işletim sistemi hiç rahatsız edilmiyor. Kartın her frame'i en azından bu alana kadar okumasının sebebi bu.
  4. Kaynak adres geçiyor. Ethernet MAC protokolü bu alanı yorumlamıyor. Switch port tablosunu buradan kuruyor; arıza takibi de frame'i kimin gönderdiğini buradan okuyor.
  5. Yük yukarı çıkıyor. Tür alanı içerideki protokolü söylüyor, yük network layer'ı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 interface’in MAC adresi, birse bir gruba gönderim. Fabrikada atanan adresin teknik adı bu yüzden unicast 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? Oktetler soldan sağa gönderiliyor ama bir oktetin 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 oktet    :  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: unicast        ·  1: multicast

Kural bu yüzden tek bir haneye bakarak okunabiliyor:

ikinci haneadres ne anlama geliyor
tek sayı: 1, 3, 5, 7, 9, B, D, Fmulticast
2, 6, A, Eyerel yönetilen unicast
0, 4, 8, Cfabrikadan gelen küresel unicast

Yerel yönetilen unicast için 16 haneden yalnızca 4’ü uygun, yani %25.

Şu adres üstünde yürüyelim: 06-4B-7C-D2-05-9A. İlk oktet 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 unicast; 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 broadcast 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. Broadcast adresine gönderilen bir frame’i yerel ağdaki her istasyon alıyor ve işlemek zorunda kalıyor. Bedeli herkese dağılıyor.

Broadcast adresi aslında multicast’in ö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 multicast. Multicast adresi tek bir frame’in bir istasyon grubu tarafından alınmasını sağlıyor. Interface, bir ya da daha fazla grup adresine gelen frame’leri alacak şekilde programlanabiliyor.

Ethernet’te broadcast adresi tek bir sabit değer. IP’deki broadcast 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?

Network layer bir gruba paket yollamak istediğinde elinde bir multicast IP adresi var, ama kart yalnızca MAC adresi tanıyor. Aradaki dönüşüm bir tablo değil, doğrudan bir hesap.

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 oktet 01, yani ilk bit bir: adres tanımı gereği multicast. Hesap hiçbir sunucuya sormadan, hiçbir tablo tutmadan yapılabiliyor.

Bir kusuru var ve bilerek kabul edilmiş. Multicast IP adresinin grup 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 frame’lerini de yukarı veriyor ve ayıklamayı işletim sistemi yapıyor. Donanım filtresinin kaçırdığını yazılım filtresi topluyor. Anlatılana göre sebep bütçeydi: 28 bitin hepsini karşılayacak on altı OUI yerine tek bir blok alınabildi ve onun da yalnızca yarısı IP multicast’e ayrıldı.

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:

  1. 48 bitlik adresi ortadan ikiye böl.
  2. Araya FF:FE oktetlerini sok; 48 bit 64 bite çıkar.
  3. İlk oktetteki 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      ->   interface kimliği 21b:44ff:fe11:3ab7

Üçüncü adım ilk bakışta keyfî görünüyor. Değil: IPv6, EUI-64’ün değiştirilmiş bir sürümünü kullanıyor ve o sürümde bitin anlamı ters çevrilmiş; 1 “küresel”, 0 “yerel” demek. Sebebi pratik: elle yazılan ::1 gibi kısa kimliklerin bu biti sıfırda kalıyor ve böylece kendiliğinden “yerel” sayılıyorlar. Aynı bit iki standartta zıt anlamlar taşıyor, dönüşüm de bunu düzeltiyor.

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. Kalıcı adres için de çoğu sistem artık MAC’i kullanmıyor; ağdan ağa değişen ama aynı ağda sabit kalan bir sayı üretiyor (RFC 7217). Makinenin kendi IPv6 adresini nasıl bulduğunu 38. bölümde anlatırken buraya geri döneceğiz.

MAC adresi yazılımla değiştirilebiliyor. Bugün kullanılan Ethernet interface’lerinin 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 interface zaten fabrikada tek bir adres alıyordu. Adres rastgeleleştirmesi 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; Android 2019’dan, iOS 2020’den beri her Wi-Fi ağına varsayılan olarak ayrı, rastgele bir adresle bağlanıyor.

Kendi kartının adını görmek istersen Windows’ta:

getmac /v /fo list

Komut 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ı. Linux’ta aynı bilgi ip link çıktısındaki link/ether satırında, macOS’ta ifconfig çıktısındaki ether satırında duruyor. O 12 haneye bak ve ikinci haneyi oku: 0, 4, 8 ya da C ise elindeki ad gerçekten fabrikadan geliyor; 2, 6, A ya da E ise kart o ağa rastgele bir adla bağlanmış.

Özet

  • 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 frame’i hedef adrese kadar okuyor: eşleşme ya da broadcast 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 multicast; 2, 6, A ve E yerelde verilmiş, 0, 4, 8 ve C ise küresel unicast anlamına geliyor.
  • Multicast 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:FE sokup yerel yönetim bitini ters çevirir, çünkü o bitin anlamı iki standartta zıttır.

Frame’in iki adresi de yerinde: kimin gönderdiği ve kimin alacağı yazılı. Ama bu frame ş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 24: Hata Sezme ve CRC

Frame 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. Frame’in 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 55. bölümde 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 frame’de 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 kodu ile Reed-Solomon kodu. İlki tek bitlik hatayı düzeltir; ikincisi bit yerine sembol düzeltir ve bu yüzden patlama hatalarına dayanır. CD’nin çiziğini, QR kodunun kirlenmiş köşesini ve eski uydu yayınlarını ayakta tutan kod odur.

Asıl kazanç hızda. Alıcı hatayı yerinde düzelttiği için bir RTT 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. Physical layer’ın çözümü, denetim bitlerini ekledikten sonra bitleri karıştırmak (interleaving). 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. Bunun için alıcının geri bildirim göndermesi, göndericinin de paketleri numaralayıp birer kopyasını tutması gerekiyor; TCP’nin bunu nasıl yaptığını 67. bölümde göreceğiz. 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 hatanın yaptığı da bu: 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ç:

koddminsezerdüzeltir
tek eşlik biti21 bit—
Hamming (7,4)32 bit1 bit
genişletilmiş Hamming (8,4)43 bit1 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 frame’de 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 frame’de 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, birler tümleyeni toplamını alıyor ve sonucun tersini 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. Birler tümleyeni toplamları D40C, tersi olan checksum da 2BF3 çıkıyor. Şimdi birinci kelimeyi bir artır, ikinciyi bir azalt. İkisi de değişti, checksum 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: transport layer yazılımda çalışıyor ve ucuz bir hesap seçiyor. IPv6 başlığında bu alan hiç yok; router’da işlemeyi hızlandırmak için kaldırılmış ve koruma alt ile üst katmanlara bırakılmış.

Frame’in sonundaki dört bayt

Data link layer 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 data link layer’daki IEEE protokollerinde ortak. r bitlik bir CRC, r+1 bitten kısa bütün patlamaları kesin yakalıyor. Daha uzun patlamalar da yüksek olasılıkla seziliyor: 32 bitlik artıklıkta kaçırma olasılığı %0,0000000233’e iniyor. Ethernet’in deseni ayrıca en büyük frame boyuna kadar, frame’in neresine düşerse düşsün üç bite kadar her hatayı yakalıyor.

Üç yöntemi aynı hata patlaması üstünde karşılaştıralım:

Aynı patlama, üç ayrı sezme yöntemi
frame'in bitleridört bit ters döndütek eşlik biti1 bitçift dönüşü kaçırırinternet sağlaması16 bittelafiyi kaçırırCRC-3232 bitpatlamayı yakalarkör nokta %50’den milyarda bire
Frame 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.
  1. Frame 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.
  2. 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.
  3. 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.
  4. İ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.
  5. 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, desen neden bu?

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 frame’de ayrılan alanın bir kısmı boşa gider. Bir desen (x+1) çarpanını taşıyorsa tek sayıda bit hatasının hepsini de yakalar, çünkü tek sayıda terimli hiçbir hata deseni ona tam bölünmüyor. Ethernet’in CRC-32’si bu çarpanı taşımıyor; 15 terimli deseni x = 1 için 1 veriyor. O desen gücünü başka yerden, frame boyundaki asgari uzaklıktan alıyor. Ders kitaplarında sık geçen “CRC tek sayıdaki bütün hataları yakalar” cümlesi bu yüzden her CRC için doğru değil.

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 frame’inin son alanı FCS (frame check sequence, frame denetim dizisi). 32 bit, yani 4 bayt; 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 frame başlangıç sınırlayıcısı, hesaba katılmıyor. 20. bölümde encapsulation merdiveninde bu alanı adlandırmış ama içini boş bırakmıştım.

Bu dört baytın bedeli frame boyuna göre değişiyor. 1.518 baytlık dolu bir frame’de FCS’nin yükü %0,26 kalıyor. 64 baytlık en küçük frame’de aynı alan %6,25’e çıkıyor. Aradaki fark kabaca yirmi dört kat.

Hesap tutmazsa frame düşürülüyor ve interface’in 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 frame’deki veri ancak üst katmanda güvenilir bir protokol varsa kurtarılıyor. Data link layer hatayı tespit ediyor, telafi etmiyor.

Yol üstünde iki tuzak var. Bir switch frame’i tamponuna alıp CRC’sini denetledikten sonra iletiyorsa bozuk frame orada duruyor; hedef adresi okur okumaz iletiyorsa CRC’ye hiç bakılmadan bozuk frame yayılabiliyor. Bu tercihin adını 27. bölümde switch’i açtığımızda koyacağız. İkinci tuzak da switch’in elinde: frame’e bir etiket eklendiğinde FCS baştan hesaplanıyor. Frame o anda zaten bozuksa ve switch onu denetlemeden etiketliyorsa, yeni ve kusursuz bir FCS bozuk içeriği aklamış oluyor.

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

  • 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 RTT’yi 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 frame’e ekleniyor ve alıcıda kalanın sıfırdan farklı çıkması hatayı ele veriyor.

Frame’in 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 25: Adres Çözümleme: ARP

Frame’in 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 frame’i yazmadan önce sessiz bir hesap yapıyor. Hedef IP adresini ve kendi adresini alt ağ maskesinden geçiriyor. Maske, adresin hangi kısmının ağı, hangi kısmının makineyi gösterdiğini söyleyen bir sayı; ayrıntısını 37. bölümde açacağız. İ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. Frame’in hedef MAC adresi router’ın interface’i 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 tablosuna, ad IP adresine, kapı numarası MAC adresine karşılık geliyor. Sınırları da aynı: 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 frame için router’ın MAC adresi gerekiyor. İstek, sen farkına varmadan bir soruya bağlı bekliyor.

Neden broadcast’le soruluyor?

Tabloda kayıt yoksa makine soruyu ağa broadcast ediyor. Frame’in hedef MAC alanına FF-FF-FF-FF-FF-FF yazılıyor. Sebep sade: sorunun kime gideceği bilinmiyor.

Broadcast’i yerel ağdaki bütün düğümler alıyor. Standart, hedefi tümü bir olan her frame’i her istasyonun alıp işlemesini şart koşuyor. Hedef olmayan cihazlar, örneğin router, 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 frame’i halka tampona alıp kernel’a 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 broadcast’le dönmüyor, tek bir frame’le 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.

Sorunun kaç kapıya çarptığını ve cevabın kaç kapıdan döndüğünü görelim:

ARP: soru herkese, cevap tek kişiye
A · senin makinen192.0.2.10paylaşılan segment · 192.0.2.0/24 · broadcast domainB192.0.2.20C192.0.2.30router192.0.2.1D192.0.2.40192.0.2.40 kimde? · hedef FF-FF-FF-FF-FF-FFaldı, işledi, attıaldı, işledi, attıaldı, işledi, attıbenim adresim, cevap hazırla192.0.2.40 bende: 00-1B-44-11-3A-B7 · yalnızca A'yaA'nın tablosu: 192.0.2.40 → 00-1B-44-11-3A-B7D'nin tablosu: 192.0.2.10 → 3C-52-82-90-0F-21bir soru, iki tablo satırı · sonraki frame'ler sormadan gidiyor
Tablo boş, soru herkese gidiyor. A hedef MAC alanına FF-FF-FF-FF-FF-FF yazıyor, çünkü sorunun kime gideceğini bilmiyor. Frame segmentteki her karta ulaşıyor: B, C, router ve D aynı frame'i aynı anda alıyor.
  1. Tablo boş, soru herkese gidiyor. A hedef MAC alanına FF-FF-FF-FF-FF-FF yazıyor, çünkü sorunun kime gideceğini bilmiyor. Frame segmentteki her karta ulaşıyor: B, C, router ve D aynı frame'i aynı anda alıyor.
  2. Herkes alıyor, üçü atıyor. Dört kart da frame'i halka tampona alıp kernel'a taşıyor; bedel ödendikten sonra üçü sorudaki adresin kendisine ait olmadığını görüp paketi atıyor. Yalnızca 192.0.2.40'ın sahibi cevap hazırlıyor.
  3. Cevap tek bir frame'le dönüyor. D cevabı broadcast'le değil, doğrudan A'nın MAC adresine gönderiyor. Asimetri kasıtlı: cevabı yalnızca soranın duyması yeter; öteki kartlar bu frame'i hedef adreste eleyip hiç işlemiyor.
  4. İki taraf da deftere yazıyor. A cevaptaki eşlemeyi tablosuna yazıyor ve bir daha sormuyor. D de soranın adresini yazıyor, çünkü istek A'nın kendi IP ve MAC adresini taşıyordu. Bir soru, iki satır; gerçek bir /24 blokta aynı soru 253 kartı uyandırıyor.

Birbirinin broadcast frame’lerini alan düğümlerin tamamına broadcast domain (yayın alanı) deniyor. Broadcast yerine multicast kullanmak daha iyi bir fikirdi; ilk biti bir olan adresler multicast’ti ve IPv6’nın adres çözümlemesi, Neighbor Discovery, oraya yaslanıyor. Bu bağırışın nereye kadar gittiğini açık bırakıyorum; sınırını bir sonraki durakta çizeceğiz.

Bir yana: RARP ters yönü çözüyordu, MAC adresinden IP adresini öğreniyordu. Bu işi bugün 36. bölümde göreceğin DHCP yapıyor.

Paketin içinde 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 bayt

Alanları 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 frame’i 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ş
               frame   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
               frame   hedef MAC  00-00-5E-00-53-2A

Ethernet’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 frame olarak gidiyor. Sorduğun soru, kablodaki en küçük frame.

Frame’in tür alanı 0x0806. Alıcı bu değere bakıp yükü ARP modülüne veriyor. Encapsulation merdiveninde bu tür alanını zaten görmüş ve değerini not etmiştin. ARP paketi bir data link layer frame’inin içinde taşınıyor ama network layer 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 ama ne kadar olduğu sistemden sisteme çok değişiyor. Eski BSD sistemleri eşlemeyi 20 dakika hatırlıyordu, Cisco router’lar varsayılan olarak 4 saat hatırlıyor. Linux ve bugünkü Windows ise kaydı yalnızca yarım dakika kadar “erişilebilir” sayıyor; sonra onu bayat işaretleyip ilk kullanımda sessizce yeniden doğruluyor. Aynı protokolde ömür yüzlerce kat 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. Ağdan kopan bir makinenin kaydı da süresi dolunca 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 (gratuitous 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ı 10. bölümde koyduğumuz MITM saldırısı; bu kez yerel ağın içinde. Switch üstündeki dinamik ARP denetimi (Dynamic ARP Inspection), MAC adresi ile IP eşleşmelerini bilinen kayıtlarla karşılaştırıp bunu kesiyor.

Başkasının adresine cevap vermek her zaman saldırı sayılmıyor. Router aynı şeyi bilerek ve açıkça yapabiliyor: kendi ağında olmayan bir adres için sorulan ARP isteğine kendi MAC adresiyle cevap veriyor, yani “onu bana ver, ben iletirim” demiş oluyor. Adı proxy ARP. Soran makine hedefi komşusu sanıyor, frame’i router’a yazıyor ve paketi farkında olmadan geçitten geçiriyor.

Fikir, maskesi yanlış ayarlanmış ya da alt ağ kavramını hiç tanımayan eski makineleri kurtarmak için doğdu. Bugün açık bırakılması tavsiye edilmiyor ve sebebi öğretici: proxy ARP ile zehirleme aynı hamleyi yapıyor. Biri meşru, öteki saldırı, ama kabloda ikisi de “benim değil ama bana yolla” diyen bir cevap. Açık bırakılan bir proxy, gerçek bir zehirlemeyi de göze normal gösteriyor.

Bunların hepsini kendi makinende görebilirsin. Windows’ta tablo arp -a ile geliyor, Linux’ta ip neigh ile, Cisco router’da 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.

Interface: 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     dinamik

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

21. bölümde 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: soruyu soran bir router’sa kaynağa ICMP Hedef Bilgisayara Ulaşılamıyor (Destination Host Unreachable) mesajı gönderiyor, senin makinense aynı hatayı sana kendisi veriyor.

Özet

  • 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 broadcast’le gidiyor, cevap unicast 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; bu süreyi RFC 826 zorunlu kılmaz, sistemler yüzlerce kat farklı süreler seçer.
  • Proxy ARP zehirlemenin meşru ikizidir: ikisi de başkasının adresine cevap verir; bu yüzden açık bırakılan bir proxy gerçek bir saldırıyı da göze normal gösterir.
  • 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” kim?

Bölüm 26: Ortam Erişimi: CSMA/CD

Ethernet’in ilk yıllarında “herkes” kelimenin tam anlamıyla herkesti. Bütün kartlar aynı kabloya bağlıydı ve kabloya konan her frame, o kablodaki her kartın önünden geçiyordu.

Herkesin her şeyi duyduğu bir kabloda asıl sorun duymak değil, konuşmak. İki kart aynı anda konuşmaya başlarsa ne oluyor ve sıra kime, nasıl veriliyor?

Aynı kabloyu paylaşmak

Klasik Ethernet’te kartlar tek bir koaksiyel kabloya boncuk gibi dizilirdi. Bir kart gönderdiğinde sinyal kablonun iki ucuna doğru yayılıyor ve yol üstündeki her karta ulaşıyordu; her kart frame’in hedef adresine bakıp kendisine ait olmayanı atıyordu. 25. bölümdeki ARP isteğinin herkese ulaşması bu yüzden özel bir çaba istemiyordu. Kablonun doğası buydu.

Kablo sonradan bükümlü çifte geçtiğinde görünüş değişti, öz değişmedi. Kartlar artık ortadaki bir hub’a bağlanıyordu. Hub bir porttan aldığı sinyali, o port hariç bütün portlara güçlendirerek kopyalar. Tablosu yoktur, kararı yoktur, seçeneği yoktur. Kablolar yıldız biçimini aldı ama ortam hâlâ tek parçaydı.

Tek parça ortamın kuralı basit: aynı anda yalnızca bir kart konuşabilir. İki kartın sinyali kabloda üst üste binerse ikisi de bozulur; bu olaya collision (çarpışma) deniyor. Aynı collision’a düşebilecek kartların oluşturduğu alanın adı collision domain. Koaksiyel Ethernet’te kablonun tamamı, hub’lı bir ağda hub’a bağlı bütün kartlar tek bir collision domain’dir.

Tek bir kanalı paylaşmanın üç ailesi

Paylaşılan kabloda çözülmesi gereken problem şu: 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; 54. bölümde multiplexing’e indiğimizde ikisini de ayrıntısıyla göreceğiz. Adil ve collision olmadan; 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; collision 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 collision’lar ç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. 28. bölümde 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 frame 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 (Carrier Sense Multiple Access) bir adım daha atıyor: konuşmadan önce dinle. Adındaki carrier sense, hatta başka birinin sinyali olup olmadığını dinlemek demek; insan sohbetinin kuralı. Yine de collision bitmiyor, çünkü sinyalin kabloda yol alması zaman alıyor: uzaktaki bir düğüm konuşmaya başlamış olabilir ve sen henüz duymamış olabilirsin. Collision penceresi, iki uç arasındaki yayılım gecikmesi kadar.

CSMA/CD son adımı atıyor: konuşurken de dinle. Sondaki CD, collision detection; collision’u fark ettiğin anda sus. ALOHA bütün frame’i 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 frame’den ancak 16 ardışık collision olmadan sonra vazgeçiyor.

64 baytlık asgari frame nereden çıktı?

Kitap boyunca Ethernet’in en küçük frame’ini 64 bayt diye kullandık ve bu sayıyı hiç gerekçelendirmedim. Gerekçesi burada, collision sezmede.

Bir kartın collision’u fark edebilmesi için, collision haberi kendisine döndüğünde hâlâ gönderiyor olması gerekiyor. Aksi hâlde frame’i bitirip işine döner, collision olmadan 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 gecikmesi

Sağdaki değere dilim süresi deniyor. 10 Mbit/s’lik klasik Ethernet’te, repeater’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 frame boyu bir veri kararı değil, sinyalin 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: frame’in arkasına, collision penceresi dolana kadar anlamsız bit eklemek. Yöntemin adı taşıyıcı uzatma (carrier extension) 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 collision diye bir olay olmayınca CSMA/CD standartta durmayı sürdürdü ama fiilen devre dışı kaldı.

DerinleşmeHub neden öldü, öldüğü gün collision'a 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, 1990’da bükümlü çifte geçen Ethernet’te aynı paylaşımı sürdüren cihazdı ve kendi başına hiçbir suç işlemiyordu.

Collision’un 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: repeater’la 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ı.

Özet

  • Paylaşılan ortamda herkes her şeyi duyar: koaksiyel Ethernet’te kablo, hub’lı ağda hub tek bir collision domain’dir ve aynı anda yalnızca bir kart konuşabilir.
  • Çoklu erişimin üç ailesi var: kanalı bölmek, rastgele erişim ve sıra alma; Ethernet ikinci aileden gelir.
  • Her adım bir israfı kapattı: ALOHA %18, dilimli ALOHA %37 verim verirken CSMA dinlemeyi, CSMA/CD ise konuşurken dinlemeyi ekledi.
  • 64 bayt bir veri kararı değil: collision’u sezebilmek için frame’in, haberi geri dönene kadar sürmesi gerekiyordu ve 10 Mbit/s × 51,2 µs = 512 bit eder.
  • Tam çift yönlü kip collision’u bitirdi: kart aynı anda gönderip alabilince CSMA/CD standartta kaldı ama fiilen devre dışı kaldı.

Paylaşılan kabloda sıra bir kuralla dağıtılıyordu ve her collision bir bekleme demekti. Bugün kabloların çoğunun öbür ucunda hub değil, frame’i yalnızca gereken kabloya veren bir kutu duruyor. Peki o kutu hangi frame’i nereye göndereceğini nereden biliyor?

Bölüm 27: Switch'ler

Kimse ona söylemiyor. Kutu, üstünden geçen frame’leri dinleyerek öğreniyor ve öğrendikçe herkese bağırmayı bırakıyor.

Kutunun adı switch ve bir yerel ağda kimin neyi duyacağını bugün artık kablo değil, onun tablosu belirliyor. Peki o tabloyu kim, ne zaman yazıyor?

Tabloyu kim yazıyor?

Switch bir data link layer cihazı ve hiç de edilgen bir kutu değil. Frame’i alıyor, saklıyor, sonra iletiyor; kararını verirken de frame’in başına bakıyor.

Makinen frame’i switch’e adreslemiyor; karşı makinenin fabrika adresini yazıyor ve arada bir cihaz durduğundan haberi bile olmuyor. Switch 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 interface ve kaydın zaman damgası. Standart metnindeki adı iletme veritabanı, sahadaki adı MAC adres tablosu ya da, tutulduğu hızlı bellek türünden, CAM tablosu.

Asıl numara satırın nereden geldiğinde. Switch hedef adresten hiçbir şey öğrenmez, kaynak adresten öğrenir. Gelen frame’in göndericisini alır, frame’in 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. 21. bölümde yakalama yaparken kartı bu moda almıştın; switch’in portları zaten hep öyle durur. Kendisine gelmeyen frame’leri de alır, çünkü öğrenmesi gereken onlardır.

Mahalle bakkalı defterini nasıl tutuyorsa switch de tablosunu öyle tutuyor. Benzetme burada bir adım öteye gidiyor: bakkal sorup öğreniyordu, switch sormuyor bile.

Ölçek de dikkat ister. Adres alanı 48 bit, yani iki üzeri kırk sekiz kadar olası ad var. Bir switch’in tablosu ise ev tipinde birkaç bin, büyük kurumsal modellerde birkaç yüz bin satır. Switch adres uzayını tutmuyor, yalnızca duyduklarını tutuyor.

Hedefi tanımıyorsa ne oluyor?

Frame içeri girdiğinde sıra sabit: kaynak kaydı önce, hedef araması sonra. Aramanın üç sonucu var ve üçü de ayrı bir davranış üretiyor.

Hedef, frame’in geldiği portta görünüyorsa switch frame’i hiç iletmez. Düşürür. İki makine aynı kabloda oturuyorsa birbirlerini zaten duymuşlardır; bu davranışın adı filtreleme.

Hedefin yeri biliniyorsa frame tek bir kablodan çıkar. Ağın geri kalanı o trafiği hiç görmez. Switch’in bütün değeri bu cümlede.

Hedef tabloda yoksa switch bilmediğini itiraf eder. Frame’i 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 frame’ini geri almaz.

Bilinmeyen makine cevap verdiği anda frame’i switch’e girer, switch onun portunu öğrenir ve o adrese bir daha flooding yapmaz. Bilgisizlik tek bir frame boyunca sürüyor.

Tablonun ilk frame’den başlayarak nasıl dolduğunu izleyelim:

Switch tablosunu tek bir frame'de nasıl dolduruyor
makinelerswitchiletmeveritabanıABCDE12345port numaralarıMAC adresiportkayıt00-00-5e-00-53-1c3dinamikaranan adres yoktaşkın: dört kopya00-00-5e-00-53-7b5dinamiktek kablodan
Önce gönderen yazılıyor. C frame'ini 3. porttan veriyor. Switch hedefe bakmadan önce kaynak adresi alıp geldiği port numarasıyla eşliyor ve tablonun ilk satırını kendi yazıyor.
  1. Önce gönderen yazılıyor. C frame'ini 3. porttan veriyor. Switch hedefe bakmadan önce kaynak adresi alıp geldiği port numarasıyla eşliyor ve tablonun ilk satırını kendi yazıyor.
  2. Hedef tabloda yok. Sıra aramaya geliyor. Aranan adres tabloda karşılık bulmuyor, çünkü o makine henüz tek bir frame göndermedi; switch duymadığı kimseyi tanımıyor.
  3. Taşkın başlıyor. Frame, 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.
  4. Cevap kayda dönüşüyor. E cevabını 5. porttan veriyor. Aynı kural yine işliyor: kaynak adres tabloya yazılıyor ve switch artık o adresin hangi kabloda olduğunu biliyor.
  5. Artık tek kablo yetiyor. Aynı hedefe giden sonraki frame 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 frame türü bu kuralın dışında kalıyor. Tümü bir olan FF-FF-FF-FF-FF-FF dizisi broadcast adresiydi; o adrese giden frame, tablo ne kadar dolu olursa olsun bütün portlarda kopyalanır. Switch broadcast’i kesmez. ARP, switch’in ardında da bağırarak çalışmayı sürdürür.

Açık bıraktığım broadcast domain sınırının cevabı burada duruyor. Ağda yalnızca hub, bridge ve switch varsa ortaya tek bir broadcast domain çıkıyor. O duvarı ancak router örüyor.

Kayıtların bir de ömrü var. Bir adresten belli bir süre frame gelmezse satır silinir; bu süreye yaşlanma süresi deniyor ve tipik değeri 5 dakika, yani 300 saniye. Süre ayarlanabiliyor. Tablodaki satırların çoğu dinamik, yani switch’in kendi öğrendikleri; yaşlanma yalnızca onlara işler. Yönetici elle statik satır da ekleyebilir. Statik satır yaşlanmaz, silinene kadar tabloda kalır.

Neden beş dakika? Süre kısa olursa switch sessiz duran makineleri unutur ve onlar için gereksiz yere flooding yapar. Uzun olursa, yeri değişip henüz hiç konuşmamış bir makineye giden frame’ler eski portuna gönderilmeye devam eder. Makine konuştuğu anda switch satırı hemen düzeltir; yaşlanmayı beklemez.

Bir Cisco switch’in konsoluna girersen tabloyu tek komutla görebilirsin:

Switch# show mac address-table
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    0000.5e00.531c    DYNAMIC     Gi0/3
   1    0000.5e00.537b    DYNAMIC     Gi0/5
   1    0000.5e00.53a4    STATIC      Gi0/1
Total Mac Addresses for this criterion: 3

Cisco adresi noktayla ayrılmış dörtlü gruplar hâlinde yazar; 0000.5e00.531c, tireli yazımla 00-00-5e-00-53-1c. İlk sütundaki VLAN’ı 29. bölümde açacağız: switch bir adresi VLAN’ıyla birlikte öğrenir ve aynı MAC iki VLAN’da iki ayrı satır olabilir.

İki makine aynı ağda nasıl konuşuyor?

Parçalar tamamlandı. Kartın kendi adı, komşunun sorulması ve switch’in öğrenmesi ayrı ayrı duruyordu; şimdi üçünü tek bir konuşmada birden yürütelim.

Sahneyi sade tutalım. Aynı switch’e bağlı iki makine var: A’nın adresi 192.0.2.10, B’ninki 192.0.2.40, maske ikisinde de 255.255.255.0. Switch yeni açılmış, yani tablosu boş. A, B’ye bir istek gönderecek.

Karar. A hedef adresi kendi maskesinden geçiriyor ve iki sonucun aynı çıktığını görüyor; B komşu olduğuna göre frame geçide değil, doğrudan B’ye yazılacak.

Komşunun donanım adresi. A’nın ARP tablosunda B’nin satırı yok. A bir ARP isteğini broadcast ediyor; frame’in hedef MAC alanında FF-FF-FF-FF-FF-FF, sorusu “192.0.2.40 kimde?”.

Switch’in ilk öğrenmesi. Frame switch’e giriyor. Switch kaynak MAC alanına bakıp A’yı geldiği portla eşliyor; tablonun ilk satırı böyle yazılıyor. Hedef broadcast adresi olduğu için frame’i giriş portu dışındaki bütün portlara kopyalıyor.

Cevap. Soruyu ağdaki herkes duyuyor, yalnızca B cevaplıyor. Cevabı broadcast’le değil, doğrudan A’ya yazıyor. Bu frame switch’e girdiğinde tabloya ikinci satır düşüyor ve cevap yalnızca A’nın portundan çıkıyor.

Asıl veri. A artık B’nin MAC adresini biliyor. İsteği yazıyor, frame’in hedefine B’nin adresini koyuyor. Switch tablosuna bakıp tek bir porta iletiyor. Ağdaki üçüncü bir makine bu frame’i hiç görmüyor.

adımkaynak MAChedef MACswitch ne yaptı
ARP isteğiAbroadcastA’yı öğrendi, öbür portlara kopyaladı
ARP cevabıBAB’yi öğrendi, tek porta iletti
veriABtabloya baktı, tek porta iletti

Konuşmanın tamamında dikkat etmen gereken şey şu: switch paketin içindeki IP adresine bir kez bile bakmadı. Bütün kararlarını frame’in iki MAC alanıyla verdi. A ile B’nin gözünde aradaki switch yok gibi duruyor; ikisi de karşısındakiyle doğrudan konuştuğunu sanıyor.

Yerel ağın tanımını da buradan çıkarabilirsin: aynı ağda olmak, frame’in araya bir router girmeden karşı tarafa varabilmesi demek. Peki hedef başka bir ağdaysa? Bu beş adımın yalnızca ilki değişiyor, ama sonrası tamamen başka bir hikâyeye dönüşüyor.

Switch ağı neye böldü?

Switch’e giden her kablo kendi başına bir collision domain. Bağlantı tam çift yönlü çalışıyor ve o kabloda collision olmuyor. 24 portlu bir switch 24 collision domain ve tek broadcast domain demek.

Yerini aldığı cihaza bakınca fark keskinleşiyor. Önceki bölümdeki hub her sinyali bütün portlara kopyalıyordu: 24 portlu bir hub’da tek frame 23 gereksiz kopya üretir ve kutunun tamamı tek kocaman collision domain’e dönüşür.

Aynı frame öğrenmiş bir switch’te portların yalnızca %4,2’sini meşgul ediyor. Kalan yirmi üç kablo aynı anda başka konuşmalar taşıyor.

Switch ile hub arasındaki farkın altında özel donanım var. Switch frame’i genel amaçlı bir işlemcide değil, ASIC denen özel bir yongada yönlendiriyor; gecikmenin mikrosaniyeyle ölçülmesinin sebebi bu. Yongaya frame’in ne kadarını okutacağın ise ayrı bir tercih ve onu birazdan göreceğiz.

Küçük bir ev switch’inin 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 frame telde 84 bayt, yani 672 bit yer kaplıyordu; aynı kanal maliyeti 100 Mbit/s’de saniyede 148.809 frame veriyor. Veri sayfasındaki 148.800 bu sayının yuvarlanmış hâli: switch en küçük frame’lerle bile hattın tamamını taşıyabiliyor.

Bütün portlar aynı anda tam yüklenirse iç elektronik yetişemeyip frame düşürebilir; buna bloklama, yetişebilene bloklamayan switch deniyor.

Bridge ile switch arasındaki fark ne?

Peki switch nereden çıktı? Birdenbire ortaya çıkmadı: ondan önce üç cihaz vardı ve her biri bir öncekinin tek bir eksiğini kapattı. Sırayı bir kez görürsen switch’in ne olduğunu da kendiliğinden anlıyorsun.

Repeater en basiti ve en dürüstü. İki portu var, tek işi de zayıflamış sinyali tazeleyip öbür tarafa geçirmek. İçinden ne geçtiğini bilmiyor; frame diye bir kavramı da yok, adres diye bir kavramı da. Kablonun boyunu uzatıyor, başka hiçbir şey yapmıyor.

Hub çok portlu bir repeater’dan ibaret. Aynı işi ikiden fazla kabloya yayıyor: bir porttan aldığı elektriği kalan bütün portlara kopyalıyor. Tablosu yok, kararı yok; bütün portlar tek bir collision domain’in içinde kalıyor.

Bridge zincirin kırıldığı yer. İlk kez bir cihaz frame’i okuyor: hedef MAC adresine bakıyor, kendi öğrendiği tabloya danışıyor ve frame’i ancak gerekiyorsa öbür tarafa geçiriyor. Bu bölümün başında anlattığım üç karar, yani öğrenme, flooding ve iletme, bridge’le doğdu. İki kablo parçasını tek bir broadcast domain’de birleştirirken collision alanlarını ayrı tutuyor.

Switch ise çok portlu bir bridge. Kavram olarak yeni bir şey getirmiyor; getirdiği şey ölçek ve hız.

cihazkatmanneye bakarkaç collision domainkaç broadcast domain
repeaterphysicalhiçbir şeye11
hubphysicalhiçbir şeye11
bridgedata linkhedef MACport sayısı kadar1
switchdata linkhedef MACport sayısı kadar1
routernetworkhedef IPinterface sayısı kadarinterface sayısı kadar

Peki ikisi aynı işi yapıyorsa neden iki ad taşıyorlar? Dürüst cevap şaşırtıcı: standart hâlâ ikisine birden bridge diyor. Bu işi ilk tarif eden IEEE 802.1D’nin başlığı “MAC Bridges”, bugün onun yerini alan 802.1Q’nunki “Bridges and Bridged Networks”; switch’in yaptığı iş bu belgelerde bridging diye tanımlı. Bölümün sonunda göreceğin Spanning Tree Protocol’ün mesajlarına BPDU, seçtiği cihaza da kök bridge denmesinin sebebi budur; kutunun üstünde switch yazsa bile standart onu bridge sayıyor.

Yine de aradaki farkı önemsiz sayma, çünkü aynı işi başka türlü yapıyorlar. Bridge’in iki ile on altı arası portu olurdu; switch’te yirmi dördü, kırk sekizi geçtiğini görürsün. Bridge kararını genel amaçlı bir işlemcide yazılımla verirdi, switch özel bir yongada veriyor. Sonuç da buradan çıkıyor: bridge frame’leri sırayla işlerken switch bütün portlarda aynı anda hat hızında çalışabiliyor.

Switch frame’i ne zaman iletmeye başlıyor?

Hızın ikinci kaynağını da kararın ne kadar erken verildiğinde bulacaksın. Üç ayrı davranış var, ama aralarındaki bütün farkı tek bir soruda toplayabilirsin: iletmeye başlamadan önce frame’in ne kadarını okuyorsun?

Store-and-forward (sakla ve ilet) frame’in tamamını bekliyor. Sonunda FCS’yi hesaplayıp kuyruktaki değerle karşılaştırıyor, tutmuyorsa frame’i atıyor. 64 bayttan kısa ve 1.518 bayttan uzun frame’ler de burada eleniyor. Bedeli gecikme: frame uzadıkça bekleme de uzuyor. Buna karşılık giriş ile çıkış portunun hızı farklı olduğunda tek çalışan kip bu, çünkü frame zaten baştan sona tamponda duruyor.

Cut-through (kes ve geç) hedef MAC adresini okur okumaz iletmeye başlıyor. Adres frame’in ilk altı baytı olduğu için karar neredeyse anında veriliyor ve gecikme frame’in boyundan bağımsız hâle geliyor. Karşılığında FCS hiç kontrol edilmiyor: bozuk frame de aynı hızla öbür tarafa geçiyor ve ancak varış makinesinde eleniyor. Switch burada hatayı gidermiyor, yalnızca taşıyor.

Fragment-free (parçasız) ikisinin ortasında duruyor. İlk 64 baytı okuyup öyle başlıyor. O sayı sana tanıdık gelmeli: önceki bölümde dilim süresinden türettiğimiz asgari frame boyu. Collision’ların bıraktığı bozuk parçalar o pencerenin içinde kaldığı için, 64 baytı bekleyen bir switch onların hemen hepsini yakalıyor.

kipokuduğuFCS denetimigecikmebozuk frame
store-and-forwardtamamıvarframe boyuyla artaratılır
fragment-freeilk 64 baytyoksabitçoğu atılır
cut-throughilk 6 baytyoken düşükgeçer

Bugün karşına çıkan switch’lerin neredeyse hepsinde varsayılan kipi store-and-forward olarak bulacaksın. Çünkü hatalı frame’i ağa hiç salmamak, kazanılan birkaç mikrosaniyeden değerli sayılıyor; üstelik hızlar arttıkça o birkaç mikrosaniye zaten küçülüyor. Cut-through ise gecikmenin paraya çevrildiği yerlerde yaşamaya devam ediyor: yüksek başarımlı hesaplama kümeleri ve borsa işlem sistemleri.

Flooding ne zaman kusura dönüşür?

Tablonun bir sınırı olduğunu söylemiştim; saldırgan da bunu biliyor. MAC flooding saldırısı sahte kaynak adresli çok sayıda frame’le tabloyu doldurur, gerçek adreslere yer bırakmaz. O noktadan sonra switch her şeyi flooding’e verir. Switch’li ağda dinleme zorlaşıyor ama bitmiyor. Tabloda kaydı olmayan hedefler ile broadcast frame’leri 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 switch arasına yedek olsun diye ikinci bir bağlantı çekmek makul bir fikir gibi durur. Sonucu döngü yolu oluyor. Döngüye giren frame sonsuza dek dolaşır, trafik hattın azami hızına tırmanır ve ağ doyar.

Kapalı bir makineye yollanan tek bir frame bunu başlatmaya yetiyor. Adres hiçbir switch’in tablosunda karşılık bulmaz, her switch onu flooding’le çoğaltır ve döngü varsa kopyalar birikmeye başlar. Frame’lerde, IP’deki TTL gibi bir ömür alanı yok; döngüdeki bir kopya kendi kendine hiç ölmüyor.

IEEE 802.1D bu yüzden Spanning Tree Protocol’ü (STP, yayılan ağaç protokolü) tanımladı. Yedekli bağlantılar fiziksel olarak yerinde durur ama bazı portlar bloklanır, geriye tek bir etkin yol kalır. Bridge’ler birbirlerine BPDU adı verilen küçük mesajlar yolluyor; kimliği en küçük olan kök bridge 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ı, bazen daha fazlasını buluyordu. Hızlı sürümü (RSTP) zamanlayıcı beklemek yerine komşularla doğrudan el sıkışıyor ve yol koptuğunda bloklu portu çoğu zaman bir saniyenin altında açıyor.

Buraya kadar ayrı ayrı gördüğün şeyler tek bir interface çıktısında yan yana duruyor. MTU paketin üst sınırını çiziyordu; switch’in portunda o sınır da, spanning tree durumu da, flooding ayarı da ayrı birer satır:

Switch# show interface fastethernet 0/2

  MTU 1500 bayt
  Spanning tree durumu: gönderme
  Bilinmeyen unicast flooding'i: açık

Özet

  • Switch kendi öğreniyor: tablosunu kaynak adreslerden kurar, tak-çalıştır çalışır ve her satırında bir adres, bir interface, bir zaman damgası tutar.
  • Üç karar veriyor: hedef aynı porttaysa frame’i düşürür, yeri biliniyorsa tek kablodan yollar, bilinmiyorsa bütün portlara kopyalar.
  • Flooding bilgisizliğin bedeli: yalnızca bir frame sürer, ama broadcast adresine giden frame’lerde hiç bitmez.
  • Aynı ağda konuşmak tek frame’dir: hedef komşuysa frame doğrudan ona yazılır ve switch paketin içindeki IP adresine hiç bakmadan iletir.
  • Switch collision’u böler, broadcast’i bölmez: port sayısı kadar collision domain üretir ve hepsini tek bir broadcast domain’in içinde bırakır.
  • Switch çok portlu bir bridge’dir: repeater sinyali tazeler, hub onu bütün portlara yayar, bridge ilk kez frame’i okur; switch’in eklediği şey kavram değil, ölçek ve hız.
  • İletme kipi ne kadar okunduğuyla belirlenir: store-and-forward frame’in tamamını alıp FCS’yi denetler, cut-through ilk altı bayttan sonra başlar, fragment-free ise collision penceresi olan 64 baytı bekler.
  • Yedeklilik denetimsiz kurulmuyor: ikinci bir kablo döngü demektir ve Spanning Tree Protocol olmadan ağ kendi kopyalarında boğulur.

Switch 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 28: Ağ Topolojileri

Switch’in 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 switch’e 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 physical layer’a düşüyor. Mantıksal topoloji sinyalin hangi yoldan aktığını anlatıyor; onun yeri data link layer. 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. Hub’lı 10BASE-T 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ısaltmaaçılımıtipik menzilörnek
PANkişisel alan ağıbirkaç metrekulaklık, akıllı saat, kablosuz klavye
LANyerel alan ağıoda, kat, binaofis switch’i, ev kablosuz ağı
CANyerleşke ağıkomşu birkaç binaüniversite kampüsü, hastane yerleşkesi
MANmetropol alan ağıbir şehiroperatörün şehir halkası, kablo şebekesi
WANgeniş alan ağışehirler, ülkelerkiralı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ğı (SAN). 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; 23. bölümde kartın hedef adrese bakıp gerisini okumadan attığını görmüştün.

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.

Koaksiyel hat donanımının yakın çekimi: BNC T-konnektörler ve uçlarına takılan sonlandırıcı dirençler yan yana duruyor. Metindeki her istasyona takılan T ile hattın iki ucundaki 50 ohm’luk sonlandırıcı bu parçalar.

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. Repeater, 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 (baseband)
 +----------- 10 Mbit/s

10BASE2’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.

IBM 8228 MSAU kutusunun önden çekimi: gövde boyunca dizilmiş veri konnektörü yuvaları ve iki uçtaki halka giriş-çıkış ağızları. Halkanın kablo tarafında neden yıldız olduğunu gösteren kutu budur; halka bu gövdenin içinde kuruluyor.

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 switch’e 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 repeater; kopyalama davranışını ve yerini switch’e 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, sayılar neden bunlardı?

Repeater 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 repeater koymak zorundaydı.

Sinyali sonsuza kadar tazeleyemezsin. Her repeater 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 repeater 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ı 10BASE-T’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.

grupkonusubugünkü durumu
802.1bridging, VLAN, ağaç protokolleri, port tabanlı kimlik doğrulamacanlı
802.2mantıksal bağ denetimidonduruldu
802.3Ethernetcanlı; ailenin en kalabalık grubu
802.4jetonlu veri yolukapandı
802.5Token Ringkapandı
802.11kablosuz yerel ağcanlı
802.15kişisel alan ağı; Bluetooth ve düşük güçlü telsizlercanlı
802.16kablosuz geniş bant erişim (WiMAX)kapandı

Sahada bu numaraların kendisinden çok harfli uzantıları konuşuluyor; 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: physical ve data link. 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 data link layer’ı 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: .0 genel kablolama, .1 ticari bina, .2 bakır twisted pair, .3 fiber; numaranın sonundaki harf revizyonu gösteriyor. 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 switch 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 -> switch        6 m
-----------------------------------
kanal                        99 m   sınır 100 m

TIA 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:

Bir masadan bina omurgasına: yüz metrelik kanalın parçaları
bina omurgasıekipman odasıana çapraz bağlantıbina giriş odasıdış hatkanal = 3 + 90 + 699 m · sınır 100 mkat dolabıpatch panelsonlandırma6 mswitchkat dolabında90 m · sabit kabloiş alanıbilgisayarmasa üstü3 mduvar priziiş alanı çıkışı
İş 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ı.
  1. İş 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ı.
  2. 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.
  3. Dolapta panele iniyor. Sabit kablo kat dolabında patch panelde sonlanıyor. Panelden switch'e giden ekipman ve patch kabloları toplam 6 metreyi geçemiyor.
  4. 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.
  5. 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ı; 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 56. bölümde elimize alacağız.

Özet

  • Topoloji iki ayrı sorunun cevabı: kabloların dizilişi fiziksel topoloji, sinyalin izlediği yol mantıksal topoloji; 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, switch de kat dolabında yerinde duruyor. Aynı switch’e bağlı iki bilgisayar aynı ağda olmak zorunda mı?

Bölüm 29: Sanal Yerel Ağlar

Structured cabling’in (yapısal kablolamanın) yıldız düzeninde her priz kat dolabındaki switch’e bağlanıyordu. Geriye bir soru kalıyor: aynı switch’e takılı iki bilgisayar aynı ağda olmak zorunda mı?

Zorunda değil. Tek bir switch, 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. Broadcast yalnızca ARP değil. DHCP de, hedefi henüz öğrenilmemiş her frame 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ğ (virtual LAN, kısaca VLAN), 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ç switch’e de yayılabiliyor. Çizgiyi donanım çekmiyor; switch’in frame’i 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 interface’leri 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 frame yalnızca aynı gruptaki portlara ulaşıyor. Yirmi dört portlu bir switch’i ikiye bölmek, onu iki bağımsız on iki portlu switch’e 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 switch 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 switch’in içinde bir port-VLAN eşleme tablosu birikiyor. Bildirilmemiş portlar varsayılan VLAN’a düşüyor; çoğu cihazda bu VLAN 1. Orası ölü bir alan değil. Switch fabrika ayarında 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ı switch 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.

portVLANne takılı
1-810muhasebe masaüstleri
9-1630laboratuvar makineleri
24trunküst kattaki switch

Bu tabloda muhasebe masası laboratuvar makinesini hiç görmüyor. Aynı kutuya takılı olmaları bir şey değiştirmiyor.

İki switch’i nasıl bağlarsın?

Ağ tek kutuda bitmiyor. İki switch’te de 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 switch’i birbirine bağlamak için her switch’te N port yiyor.

Ölçeklenen çözümün adı trunk portu. İki switch’te birer port trunk olarak ayarlanıyor ve aralarına tek bir hat çekiliyor. Trunk’ta VLAN ayrımı yok; hangi VLAN’ın frame’i 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 access port (erişim portu) deniyor. İkisi arasındaki fark frame’in üstünde görünüyor.

Trunk’tan geçen frame sıradan bir Ethernet frame’i olamaz. Üstünde hangi VLAN’a ait olduğu yazmak zorunda. Switch, frame’i hatta vermeden önce ona küçük bir alan basıyor; karşı uçtaki switch o alanı okuyup söküyor. Etiketi ekleyen de söken de switch. Uç cihaz onu hiç görmüyor. Bu işin standart adı IEEE 802.1Q. Trunk’ta bir VLAN’ın frame’leri istisna olarak etiketsiz taşınıyor; o VLAN’a yerel VLAN (native VLAN) deniyor ve fabrika ayarında o da çoğu zaman VLAN 1.

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 switch’ler arasında dolaşabiliyor; Cisco’nun VTP’si bunu yapıyor. 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 VLAN atlama saldırısı (VLAN hopping) dediği şey buradan besleniyor: saldırgan kendini komşu bir switch gibi tanıtan bir pazarlık mesajı yolluyor, takılı olduğu access port’u trunk’a çevirtiyor, sonra istediği VLAN kimliğini kendi frame’ine yazıp o broadcast domain’in içine düşüyor. Saldırının ikinci türü frame’e iki etiketi üst üste koyuyor: ilk switch yerel VLAN’ın etiketini söküp frame’i trunk’a etiketsiz veriyor, bir sonraki switch de alttaki ikinci etiketi okuyup frame’i hedef VLAN’a teslim ediyor.

Saldırı iki ihmalin üstünde yürüyor: portun pazarlığa açık bırakılması ve yerel VLAN’ın fabrika ayarında 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: switch’i 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 switch’in 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 frame 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ı. Aynı düzeni 32. bölümde kurumsal Wi-Fi’ın içinde yeniden göreceksin.

Dört bayt nereye giriyor?

Etiket 4 bayt ve frame’in başına girmiyor. İki adres alanının ardından, tür alanının önüne sokuluyor. Encapsulation’da 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 frame’in etiketli olduğunu anlıyor.

Wireshark ekranında etiketli bir frame: paket ayrıntı bölmesinde 802.1Q alanları vurgulu, TPID değeri 8100 ve VLAN kimliği 100 okunuyor. Metinde bayt bayt sayılan dört baytlık etiketin gerçek bir yakalamadaki karşılığı.

Sonraki iki bayt etiket denetim bilgisi. O 16 bitin 12 biti VLAN kimliği, 3 biti öncelik; kalan 1 bit (DEI) tıkanma anında önce atılabilecek frame’i işaretliyor. On iki bitlik alan 4.096 farklı değer ayırt ediyor. Kullanılabilir numara sayısı 4.094, çünkü iki değer ayrılmış: 0 “yalnızca öncelik taşıyorum” demek, 4.095 ise kullanılmıyor. Cisco’nun eski cihazlarında normal aralık 1 ile 1005 arasındaydı ve 1002-1005 de FDDI ile Token Ring mirasına ayrılmıştı. O sınır standardın 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ş frame’ler düşürülüyor.

Etiket eklendikten sonra frame’in sonundaki FCS yeniden hesaplanıyor; sebebi CRC’nin frame’in tamamını kapsaması. Boy da değişiyor: etiketsiz azami frame ö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 frame azami boya 482 bayt daha ekliyor.

Etiketin asıl bedeli en küçük frame’de görünüyor; dört baytın küçük frame’de neden ağır bastığını 24. bölümde FCS’nin payını hesaplarken görmüştün.

Etiketli bir frame, etiket bilmeyen bir istasyona düşerse ne oluyor? O istasyon başlıkta tanımadığı bir tür değeri buluyor ve frame’i sessizce düşürüyor. Böyle bir frame’in oraya varması da pek olmuyor, çünkü etiketi yalnızca bunun için ayarlanmış cihazlar basıyor.

Switch’in MAC öğrenme tablosunu doldurması ve döngüyü kesen spanning tree tanıdık. Klasik spanning tree bütün VLAN’lar için tek bir ağaç kuruyor ve bazı VLAN’ların trafiğini gereksiz yere uzun yollara itiyor. Çoklu spanning tree (MSTP) 802.1s ekiyle 2003’te tanımlandı, 802.1Q’nun 2005 baskısına girdi ve VLAN gruplarına ayrı ağaçlar kurabiliyor; 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 switch var.

Router’da her VLAN için ayrı bir fiziksel interface tutmak pahalı. Tek interface’in üstünde alt interface 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.

Router frame’i 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. Sahada bu düzene, tek bir kabloya asılı router anlamında router on a stick deniyor.

Üreticiler ikisini tek kutuda da birleştiriyor ve o kutunun bir adı var: 3. katman switch. Dışarıdan sıradan bir switch gibi duruyor, portları da öyle; farkı, VLAN’lar arası kararı kendi içinde verip trafiği hiç dışarı çıkarmaması. Router’dan ayrıldığı yer ise interface çeşitliliği: 3. katman switch Ethernet portlarıyla ve kendi bacakları arasında çalışır, farklı türden hatları birbirine bağlamak hâlâ router’ın işidir.

Bunu kendi makinende de görebilirsin. Linux’ta bir interface’in üstüne etiketli bir alt interface 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.10

Son komutun çıktısında vlan protocol 802.1Q id 10 satırını görüyorsun. O interface’ten çıkan her frame artık etiketli.

Özet

  • Sanal yerel ağ bir port kümesidir: switch’in 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 switch’ler görür.
  • 3. katman switch ikisini tek kutuda toplar: VLAN’lar arası kararı kendi içinde verir, ama farklı türden hatları bağlamak hâlâ router’ın işidir.
  • VLAN’lar arası geçiş routing’dir: 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 interface, switch’in 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 switch’in iletim kararı yapıyor. Kablosuz bağlıysan ortada kablo yok; frame o boşlukta nasıl gidiyor?

Bölüm 30: Kablosuz Erişim: 802.11

Dizüstünü toplayıp bahçeye çıktın. Frame hâlâ aynı frame, 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 collision’u göremediği bir ortamda collision 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 physical layer’ı ile data link layer’ının bir kısmı kablosuzlaştırılmıştır. IP ve üstü hiç değişmez. Değişen yalnızca 19. bölümde ayırdığımız MAC alt katmanı ile onun altındaki physical layer’dır; LLC yerinde kalır. Yani encapsulation 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: data link layer ile physical layer. Ailede 802.3 Ethernet’e ayrılmış, 802.11 kablosuz ağa. IEEE bu işe 1990’da başladı ve ilk sürümü 1997’de yayımladı; 2,4 GHz’de 1 ve 2 Mbit/s için tasarlanmıştı. Aynı yıllarda kablolu Ethernet 10 ve 100 Mbit/s hızındaydı; kablosuz ağ yarışa çok geriden başladı.

Kablosuz, ortamı paylaşan broadcast bağlantılarının en saf örneği. Paylaşılan ortamın temel kuralını 26. bölümde CSMA adıyla görmüştük: göndermeden önce hattı dinle, boşsa gönder, doluysa boşalmasını bekle.

Dinlemek tek başına yetmiyor. Birkaç makine aynı anda hattı boş görüp aynı anda gönderebilir. Üstelik collision 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.

Switch her kabloyu ayrı bir collision domain’e çeviriyordu; paylaşılan kabloda ise CSMA/CD göndericiye kendi collision’unu sezdiriyordu. Telsizde o adım yok. Vericinin kendi anteninden çıkan sinyal, uzaktan gelen bir sinyalden milyonlarca kat güçlüdür; gönderirken başkasını duymaya çalışmak, bağırırken fısıltı dinlemeye benzer. Aynı anda hem gönderip hem dinleyemeyen bir gönderici collision’u kendisi göremez, göremediğini de ortasında kesemez.

Ethernet CSMA/CD kullanır, 802.11 ise CSMA/CA. Sondaki iki harf farkı özetliyor: CD collision detection, yani collision’u sezmek; CA collision avoidance, yani ondan kaçınmak.

Duymadığın komşu seni nasıl bozuyor?

Havada sinyal gittikçe zayıflar. Bu zayıflamanın adı path loss: elektromanyetik dalganın vericiden alıcıya giderken güç yoğunluğunun düşmesi. Düşüşün hızı ortama bağlı. Path loss üssü boş uzayda 2, şehir içinde 2,7 ile 3,5 arasında, duvarların araya girdiği bina içinde 3 ile 6 arasında. Duvarlar sinyali mesafeden daha hızlı yiyor. Tersine bir istisna da var: düz bir koridor dalgayı bir kılavuz gibi taşıdığı için orada üs 2’nin altına, 1,6 ile 1,8’e iner.

Ş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 path loss’u 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 path loss’un hesabını 34. bölüme 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 frame’in tamamı gönderilir. Gönderim yarıda kesilmez.

Alıcı frame’i sağlam aldıysa SIFS kadar bekler ve bir ACK döner. Bu onay gizli terminal yüzünden zorunlu; gönderici frame’inin vardığını başka türlü bilemez.

İki sürenin boyu bilerek farklı seçilmiş. SIFS 10 ile 16 mikrosaniye, DIFS ise 28 ile 50 mikrosaniye arasında. Onay gönderecek alıcı kanalı herkesten önce boş görür; yeni bir gönderime hazırlanan cihazlar ise daha uzun beklemek zorundadır. Böylece bir veri frame’i ile onun ACK’i arasına kimse giremez. Öncelik bir kuralla değil, beklemenin uzunluğuyla verilmiş. Aynı fikir sonra ses ve görüntüye öncelik tanımak için de kullanıldı: 802.11e ile gelen düzende ses trafiği daha kısa, arka plan trafiği daha uzun bekler.

Kanal doluysa gönderici, kanal boşaldığı an atılmaz. Bekleyen herkes o an atılsaydı hepsi birden çarpışırdı. Bunun yerine her biri rastgele bir geri çekilme sayacı çeker. 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 uzun süredir bekleyen, sayacı donduğu için sırasını kaybetmez.

ACK gelmezse gönderici collision varsayar. Geri çekilme aralığını ikiye katlar ve baştan dener. Pencere 15 ya da 31 dilimden başlar, en fazla 1.023 dilime çıkar. Bir dilim physical layer’a göre 9 ya da 20 mikrosaniye; en kötü durumda bu, 9 ile 20 milisaniyelik bir bekleme demek.

Burada kabul edilmiş bir körlük var. 802.11’de kayıp ile collision aynı belirtiyi verir ve ikisi birbirinden ayrılamaz. Körlüğün bir bedeli de var: gönderim hızını sinyale göre ayarlayan algoritmalar, collision yüzünden kaybolan frame’i zayıf sinyale yorup hızı gereksiz yere düşürebilir.

Gizli terminali asıl çözen mekanizma rezervasyon. Gönderici önce küçük bir RTS (Request to Send) frame’iyle kanalı ayırtmak ister. Access point CTS (Clear to Send) ile cevap verir; cevap göndericiye adreslidir ama havada herkes onu duyar. 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; onu duyan her cihaz kendi içinde bir sayaç (NAV) kurup o süre boyunca kanalı dolu sayar. RTS frame’leri de çarpışabilir; kısa oldukları için kaybedilen zaman küçük kalır. Aynı hesap ters yönde de işliyor: küçük bir veri frame’i için rezervasyon, verinin kendisinden pahalıya gelir. Bu yüzden RTS/CTS her gönderimde kullanılmaz; cihazlar onu bir boyut eşiğinin üstündeki gönderimlere saklar.

Veri frame’i gidip ACK döndüğünde cihaz frame’i kendi kuyruğundan siler. Access point de aldığı frame’i kablolu tarafa, router’a doğru iletir.

Kanalı dinlemekten onaya kadar giden sırayı adım adım izleyelim:

Bir gönderimin CSMA/CA ile işleyen sırası
zamangönderenaccesspointkanalı dinleDIFS boyuncageri çekilmesayaç donarRTSCTSveri frame'iACKACK gelmezsepencere ikiye katlanır
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 frame havaya çıkmaz.
  1. 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 frame havaya çıkmaz.
  2. Kanal doluysa sayaç donuyor. Kanal doluysa gönderici, kanal boşaldığı an atılmaz; bekleyen herkes o an atılsa hepsi çarpışırdı. Rastgele bir geri çekilme sayacı çeker. Sayaç yalnızca kanal boşken geri sayar; kanal dolduğunda durur ve boşalınca kaldığı yerden devam eder.
  3. RTS kanalı ayırtıyor. Gönderici küçük bir RTS frame'i yollar. Access point SIFS kadar sonra CTS ile cevap verir; cevap göndericiye adreslidir ama havada herkes onu duyar. CTS'i duyan herkes, gönderici dışında, ilan edilen süre boyunca susar.
  4. Veri frame'i havaya çıkıyor. RTS ve CTS içinde ilan edilen süre boyunca kanal bu gönderime ayrılmıştır. Gönderici CTS'ten SIFS kadar sonra frame'in tamamını gönderir; gönderim yarıda kesilmez.
  5. SIFS kadar sonra ACK dönüyor. Alıcı frame'i sağlam aldıysa SIFS kadar bekleyip onay yollar. ACK gelmezse gönderici collision 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 36. bölümde göreceğimiz 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 frame’lerini toplar; access point’ler beacon’ı varsayılan olarak 102,4 ms’de bir, yani saniyede yaklaşık on kez yayınlar. Aktif yolda cihaz kendisi bir yoklama isteğini (probe request) broadcast eder; menzildeki access point’lerin hepsi yoklama cevabı gönderir. Uygulamada ikisi birden kullanılır.

Aktif yoklamanın bir gizlilik geçmişi var. Cihazlar eskiden daha önce bağlandıkları ağları adlarıyla tek tek sorardı. Havayı dinleyen biri bu listeden sahibinin evini, işini ve kaldığı otelleri çıkarabiliyordu. Bugünkü telefonların yoklamada ağ adı vermemesi ve 23. bölümde gördüğümüz rastgele MAC adresini kullanması bu yüzden.

Seçim yapıldıktan sonra cihaz seçtiği access point’e bir ilişkilendirme (association) isteği yollar ve karşılığında ilişkilendirme cevabı alır. Sorulan şey, konuşup konuşamayacakları: iki taraf ortak destekledikleri hızlarda ve özelliklerde burada anlaşır. İlişkilendirmeden hemen önce iki frame’lik bir authentication adımı da geçer; adına rağmen WPA2’de hiçbir sırrı doğrulamaz. Parolanın gerçekten nerede sınandığını 32. bölümde açacağız.

Kablosuz ağlar iki yapıda kurulur. Access point üzerinden yürüyene altyapı kipi denir. Bir access point ile ona bağlı cihazların oluşturduğu kümenin teknik adı temel hizmet kümesi (BSS); evdeki kablosuz modem ile ona bağlı cihazlar bir BSS’tir. Access point olmadan, cihazların doğrudan birbirine bağlandığı yapıya ad-hoc kipi denir; teknik adı IBSS, yani bağımsız BSS.

Bir BSS’i ötekilerden ayıran kimlik BSSID’dir ve çoğu zaman access point’in MAC adresidir. Ağın insanların gördüğü adı ise SSID. Aynı SSID’yi aynı alt ağda yayınlayan birden çok BSS birleşince genişletilmiş hizmet kümesi (ESS) çıkar ortaya. Bir okulda ya da ofiste aynı adı taşıyan onlarca access point bu yüzden tek bir ağ gibi görünür. Koridorda yürürken cihaz bir BSS’ten ötekine geçer ve ağın adı değişmez; bu geçişin nasıl işlediğini 35. bölümde göreceğiz.

Altyapı kipinde istemciler birbirleriyle doğrudan konuştuklarını sanır; oysa aynı odadaki iki cihaz arasındaki frame bile access point’ten geçer ve havayı iki kez meşgul eder. Ortam açısından access point bir hub’a benzer: havaya konan her frame’i menzildeki herkes duyar. Tek bir switch, VLAN etiketiyle birbirini hiç görmeyen ağları taşıyabiliyordu; burada tersi oluyor ve tek bir access point herkesi aynı ortama basıyor.

İlişkilendirme bittiğinde artık havaya frame koyabilirsin. O frame’in zarfı Ethernet’inkinden geniş duruyor. İçinde dört adres alanına kadar yer var ve her biri 6 bayt.

frame denetimi     2 bayt        sürüm, tür, alt tür, sekiz bayrak
süre               2 bayt        kanalın ardından ne kadar dolu kalacağı
adres 1            6 bayt        frame'i havadan alacak cihaz
adres 2            6 bayt        frame'i havaya koyan cihaz
adres 3            6 bayt        kablolu taraftaki uç; internete giden trafikte router
sıra denetimi      2 bayt        frame sıra numarası
adres 4            6 bayt        yalnızca iki access point arasında köprü kurulunca
yük                0-2312 bayt   LLC/SNAP başlığı ve IP datagramı
CRC                4 bayt        bozulma denetimi

Üçüncü adres bu listenin kilidi. Kabloda iki MAC adresi alanı yetiyordu; havada üçüncüsü gerekir, çünkü havadaki alıcı ile asıl hedef artık farklı cihazlar. Dizüstünden internete giden bir frame’de birinci adres access point’tir, ikinci adres dizüstünün kendisi, üçüncü adres de frame’in kablolu tarafta varacağı router. Access point frame’i Ethernet’e geçirirken üçüncü adresi hedef, ikinciyi kaynak yapar; kendi adresi frame’den düşer.

Frame 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ı pratikte üç değer alır: 0 yönetim, 1 denetim, 2 veri. Wi-Fi’da veri frame’i türlerden yalnızca biri. Alt tür alanı beacon ile ACK’i birbirinden ayırır. Denetim ve yönetim frame’leri ağın kendi işleyişini taşır ve kullanıcıya hiç görünmez.

Bayrakların ilk ikisi, To DS ve From DS, adres alanlarının nasıl okunacağını söyler. DS, access point’leri birbirine bağlayan dağıtım sistemi; çoğu zaman kablolu ağın kendisi. İstemciden access point’e giden frame’de ilk bayrak, access point’ten istemciye gelende ikincisi 1’dir. İkisi birden 1 olduğunda frame iki access point arasında taşınıyordur; dördüncü adres alanı ancak o zaman frame’e eklenir. Tek access point’li bir evde bu alan hiç görünmez; mesh sistemlerinde ise access point’ler arasındaki trafik tam bu biçimle taşınır.

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 alanı frame’e hiç konmadığı 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 frame 2.346 bayt eder. Zarfın payı yüzde bir buçuk civarında kalır.

Hesabın dışında kalan iki kalem var. Listede Ethernet’teki tür alanının karşılığı yok; 802.11 yükün başına 23. bölümde gördüğümüz 8 baytlık LLC/SNAP başlığını koyar ve IP taşıdığını orada söyler. Bugünkü ağlarda veri frame’lerine 2 baytlık bir öncelik alanı (QoS Control) da eklenir.

Asıl bedel ise zarfta değil beklemede. Her frame için DIFS, geri çekilme, SIFS ve ACK harcanıyor; hızlı bir bağlantıda bunlar frame’in kendisinden uzun sürebilir. 802.11n’den bu yana birçok frame tek seferde art arda gönderilir (A-MPDU) ve tek bir toplu onayla (Block Ack) karşılanır. Hızlı Wi-Fi’ın sırrının önemli bir kısmı daha hızlı bit göndermekte değil, daha az beklemekte.

Peki bu frame 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; Türkiye, Avrupa gibi 13 kanal kullanır. Kanal merkezleri 5 MHz arayla dizilmiş ama her kanal 20 ile 22 MHz genişliğinde. Bu yüzden birbirine hiç değmeyen yalnızca üç kanal seçilebilir: 1, 6 ve 11. 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. Sensör ağlarının 802.15.4 radyosu da bu bandı paylaşıyor; Wi-Fi’ın 1, 6 ve 11 kanallarının arasında kalan boşlukları 75. bölümde göreceksin.

2,4 GHz bandının kanal haritası: on dört kanalın 22 MHz genişliğindeki spektrum eğrileri üst üste biniyor; birbirine değmeyen üçlü olarak 1, 6 ve 11 ayrı renkle işaretli. Örtüşmeyen kanal sayısının neden üç olduğunu gösteriyor.

Havadaki frame’i 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 32. bölümde göreceğiz.

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; arayüzün adı sende wlp2s0 gibi farklı olabilir, iw dev hepsini listeler. 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 BSSID, yani havaya koyduğun frame’lerin birinci adres alanına yazdığın değer. 2437 MHz, 6. kanalın merkez frekansı.

Özet

  • Değişen tek şey ortam: kablosuz LAN yeni bir ağ kurmaz; var olan LAN’ın physical layer’ını ve MAC alt katmanını kablosuzlaştırır, IP ve üstü aynen kalır.
  • Collision alıcıda olur: gönderici aynı anda gönderip dinleyemediği için kendi collision’unu göremez; 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, collision sezmenin yerini alır. SIFS’in DIFS’ten kısa olması onaya öncelik tanı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.
  • Üçüncü adres zarfı genişletir: altyapı kipinde 28 bayta çıkan zarfın Ethernet’ten farkının çoğu, frame’in kablolu tarafta nereye çıkacağını taşıyan üçüncü adresten gelir.
  • Asıl bedel beklemedir: her frame’in DIFS, geri çekilme ve ACK maliyeti var; 802.11n’den beri frame’ler toplu gönderilip toplu onaylanır.

Kanalın boşalmasını bekledin, sıranı aldın, frame’i havaya bıraktın ve onayını geri aldın. Sıra kanalın kendisinde: oraya kaç bit sığıyor ve bunu ne belirliyor?

Bölüm 31: Radyo Kanalı ve Kapasite

Kanal boşaldı, frame’i 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. Formül tek satır:

C = B × log2(1 + SNR)

B hertz cinsinden bant genişliği, SNR ise desibele çevrilmemiş düz oran. Denklemin nereden geldiğini 53. bölümde açacağım; burada ne söylediğine bakalı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; bir 4G ya da 5G telefonunun izin verilen en yüksek gönderme gücü 200 mW, yani 23 dBm. 30. bölümdeki iw çıktısında gördüğün -58 dBm ise yaklaşık 1,6 nanowatt: access point’in gönderdiği gücün on milyonlarca kat zayıflamış hâli.

İ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 burası. Verici gücü düzenleyici sınır yüzünden çoğu bantta toplam olarak sabit, gürültü gücü ise bant genişliğiyle doğru orantılı. Kanalı genişletmek aynı sinyali daha geniş bir alana yayıyor, içeri giren gürültüyü de büyütüyor. Bandı ikiye katlamanın SNR maliyeti 3 dB; desibel ölçeğinde 3 dB 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’ın 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. Hangisinin değiştirildiğine göre üç temel yöntemin adı ASK, FSK ve PSK: genlik, frekans ve faz kaydırmalı modülasyon. Faz yönteminin en sade hâli BPSK iki faz kullanır ve her sembolde bir bit taşır. 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, genliğe ve faza birden yayan biçimin adı QAM (quadrature amplitude modulation). m-QAM, 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.

şemabileşim sayısısembol başına
4-QAM42 bit
16-QAM164 bit
64-QAM646 bit
256-QAM2568 bit
1024-QAM1.02410 bit
4096-QAM4.09612 bit

Bir sembol pratikte 1 ile 12 bit arasında taşıyor; en alt basamak BPSK, en üstteki Wi-Fi 7’nin 4096-QAM’i. 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ı 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. Kural yukarıda da sürüyor: Wi-Fi 6’nın getirdiği 1024-QAM en az 30, Wi-Fi 7’nin 4096-QAM’i en az 36 desibel istiyor. İkisi de pratikte yalnızca access point’le aynı odadayken devreye giriyor.

Gray kodlu 16-QAM takımyıldızı: genlik-faz düzleminde on altı nokta, her birinin yanında taşıdığı dört bit yazılı. Alıcının en yakın noktaya yuvarladığı ızgara budur; noktalar sıklaştıkça yanlış komşuya düşmenin neden kolaylaştığı buradan görülüyor.

Derinlik bu yüzden sabit seçilmiyor. Uyarlamalı modülasyon, SNR değiştikçe şemayı uçuş sırasında değiştiriyor ve kabul edilebilir hata oranındaki en yüksek hızı arıyor. Değişen yalnızca derinlik de değil. 24. bölümde gördüğümüz ileri hata düzeltme, gönderilen bitlerin bir kısmını yedeğe ayırıyor; bu oranın adı kodlama oranı. 3/4 kodlama, her dört bitin üçünün veri, birinin yedek olduğu anlamına geliyor.

Wi-Fi’da ikisi birlikte seçiliyor ve bileşimin adı MCS (modulation and coding scheme). 20 MHz’lik bir kanalda tek akışla 16-QAM ve 1/2 kodlama 26 Mbit/s veriyor, 64-QAM ve 5/6 kodlama 65 Mbit/s. Sembol başına bit 1,5 kat arttı ama hız 2,5 kat; farkın geri kalanı, temiz kanalda yedeğe daha az bit ayrılmasından geliyor.

Rahat bir Wi-Fi bağlantısı için genellikle en az 20 dB SNR öneriliyor; bu değer 64-QAM’in faturasını karşılıyor, 256-QAM’inkini karşılamıyor. En yavaş MCS ise birkaç desibelde bile çalışıyor. Hücresel radyolar daha da aşağı inebiliyor: gürültünün sinyalden güçlü olduğu -6 ile -10 dB’de bile bağlantı sürüyor, karşılığında hız çok düşüyor. Tavan da kuşakla yükseldi: 802.11n’de 64-QAM olan üst sınır 802.11ac’de 256-QAM’e, 802.11ax’te 1024-QAM’e, 802.11be’de 4096-QAM’e çıkarıldı. Modülasyonun matematiğini burada kesiyorum; dalga biçimlerini 52. bölümde, kanalın tavanını 53. 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ı 30. bölümde saymıştık; çıkış yolu yukarı taşınmak. 5 GHz bandında birbiriyle örtüşmeyen 20 MHz’lik kanal sayısı ülkeye göre değişiyor: Türkiye’nin de uyduğu Avrupa kurallarında 19, ABD’de 25’i aşıyor. 2020’den beri açılan 6 GHz bandı Avrupa’da 24, ABD’de 59 kanal daha ekledi. Bunun bedeli menzilden ödeniyor; hesabını 34. bölümde spektrumu açtığımızda yapacağım.

Switch her portu ayrı bir collision domain’e çevirip ortamı bölüyordu. Havada böyle bir bölme yok. İkinci bir access point eklemek ancak başka bir kanaldaysa kapasite katıyor. Aynı kanaldaki iki access point birbirini duyduğu sürece aynı havayı sırayla kullanıyor; ikinci cihaz kapsamayı genişletiyor, hızı değil. Kalabalık binalarda access point’lerin gücü bu yüzden bilerek kısılıyor ve kanallar komşusununkiyle çakışmayacak biçimde dağıtılıyor.

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 multiplexing’de 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 (orthogonal frequency-division multiplexing) o boşluğu kaldırıyor. Alt taşıyıcılar birbirine dik, yani ortogonal seçiliyor: spektrumları yarı yarıya üst üste binse de her alt taşıyıcının tam merkezinde komşularının katkısı sıfıra iniyor. Koruma bandına gerek kalmıyor.

Izgarayı en açık hâliyle 4G’de görmek mümkün; telefon şebekesinin kendisini 33. bölümde açacağız, burada yalnızca kanalın nasıl bölündüğüne bakıyoruz. Ş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,7 µs sürüyor; iki sayı birbirinin tersi.

Bu terslik bir tasarım kolu. Her sembolün başına, bir önceki sembolün yansımaları üstüne taşmasın diye kısa bir koruma aralığı ekleniyor ve bu aralık boşa geçen zaman. Wi-Fi 6 kolu kendi lehine çevirdi: alt taşıyıcı aralığını dörtte birine indirip sembolü dört kat uzattı. Koruma aralığı aynı kalınca onun toplam süredeki payı küçüldü ve verim arttı.

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.

Gerçek şebekede bu ham sayıdan iki düzeltme geçiyor. Kontrol kanalları ve referans sinyalleri ızgaranın yaklaşık dörtte birini yiyor; iki antenli MIMO ise kalanı ikiye katlıyor. 4G’nin 20 MHz’deki bilinen 150 Mbit/s’lik tepe hızı bu iki düzeltmenin sonucu: 100 × 0,75 × 2 = 150.

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; atama, zamanda art arda gelen iki bloklu çiftler hâlinde yapılıyor. Kanal tek bir kullanıcıya sonuna kadar bırakılmıyor. 2. bölümde gördüğümüz 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 adı OFDMA (orthogonal frequency-division multiple access). OFDM’den farkı, alt taşıyıcıların kime verildiğinde. OFDM de kanalı alt taşıyıcılara bölüyor ama bir anda bütün alt taşıyıcılar tek bir cihaza gidiyor. OFDMA alt taşıyıcı gruplarını aynı anda farklı cihazlara dağıtıyor. Kanalın boşalmasını bekleyen CSMA/CA, sırayı tek bir gönderene veriyordu; OFDMA aynı anda birden çoğuna veriyor.

4G onu baz istasyonundan telefona giden yönde kullanıyor, 5G ve Wi-Fi 6 iki yönde. 4G’de telefondan baz istasyonuna giden yön, pili daha az yoran bir akrabasını (SC-FDMA) seçti.

Wi-Fi 6’da en küçük parça 26 alt taşıyıcı, yani yaklaşık 2 MHz; 20 MHz’lik bir kanal aynı anda dokuz cihaza bölünebiliyor. Access point’ten cihazlara giden yönde iş kolay: access point tek bir gönderimin içine her cihaza ayrı bir parça koyuyor ve hangi parçanın kime ait olduğunu gönderimin başına yazıyor. Ters yön daha zor, çünkü cihazlar birbirinden habersiz. Wi-Fi 6 bunu bir tetik frame’iyle (Trigger frame) çözdü: access point hangi cihazın hangi parçada göndereceğini ilan ediyor, cihazlar da aynı anda kendi parçalarında gönderiyor. O gönderim için bekleme de collision da ortadan kalkıyor.

Wi-Fi 6 ve 7 access point’leri eski cihazlarla konuşurken yine OFDM’e dönmek 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:

Bir kanalın frekans-zaman ızgarası ve bölüşümü
Bir kanalın iki boyutufrekans: 10 MHzher satır 180 kHzbir kaynak bloğu12 alt taşıyıcı x 7 sembol64-QAM: 504 bit256-QAM: 672 bitkanal 20 MHzsatır iki kataynı sürede iki kat blokABCBAACBCher 1 ms'deyeniden dağıtım kararızaman · her sütun 0,5 ms
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.
  1. 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.
  2. 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.
  3. 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.
  4. Kanalı genişletmek. Kanal 10 MHz'den 20 MHz'e çıkınca alt taşıyıcı sayısı, dolayısıyla satır sayısı ikiye katlanıyor: 50 bloktan 100 bloğa. Aynı sürede iki kat blok geçiyor.
  5. Bölüşüm. Baz istasyonu blokları 1 ms'lik aralıklarla, zamanda art arda gelen iki bloklu çiftler hâlinde 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 (multiple-input multiple-output), aynı anda birden çok anten üzerinden gönderip birden çok antenle almak 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: iki antenli gönderici ile iki antenli alıcı arasında dört anten çifti var ve her çiftin sinyali duvarlardan yansıyarak birden çok yoldan geliyor. Alıcı bu kopyaları birleştirince SNR yükseliyor; buna çeşitleme kazancı deniyor.

Uzamsal multiplexing ise aynı kanalda, aynı anda, her antenden ayrı bir veri akışı gönderiyor. Hızı gerçekten katlayan bu. Çok yollu yayılım burada da kusur değil: akışları alıcıda birbirinden ayırmayı mümkün kılan, her birinin başka yollardan gelmesi. Yansımasız, dümdüz bir hatta uzamsal multiplexing çalışmaz. 64-QAM ile dört akış, her alt taşıyıcıda sembol başına 24 bit taşıyor. Tavanı zorla: 802.11ac’nin sekiz akışı 256-QAM ile 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 (MU-MIMO) 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 (beamforming) dayanıyor: access point her antenden çıkan sinyalin fazını, sinyaller hedef cihazda güçlenip öbür cihazda birbirini söndürecek biçimde ayarlıyor. Bunun için cihazların access point’e göre farklı yönlerde durması gerekiyor; aynı masada oturan iki telefonda kazanç kayboluyor. Anten sayıları da kuşakla arttı: 802.11n 4x4’e, 802.11ac 8x8’e kadar destekliyor. MU-MIMO 802.11ac’de yalnızca access point’ten cihazlara giden yönde geldi, ters yön 802.11ax’i bekledi.

kuşakstandartyılteorik tepe hızgetirdiği
—802.11b199911 Mbit/s2,4 GHz’de ilk yaygın Wi-Fi
—802.11a199954 Mbit/s5 GHz, OFDM
—802.11g200354 Mbit/sOFDM’i 2,4 GHz’e taşıdı
Wi-Fi 4802.11n2009600 Mbit/s40 MHz, MIMO, frame toplama
Wi-Fi 5802.11ac20136,9 Gbit/s160 MHz, 256-QAM, MU-MIMO
Wi-Fi 6802.11ax20219,6 Gbit/sOFDMA, 1024-QAM, 6 GHz (6E)
Wi-Fi 7802.11be202423 Gbit/s320 MHz, 4096-QAM, çok bantlı bağlantı (MLO)

Kuşak numaralarını Wi-Fi Alliance 2018’de koydu ve geriye doğru yalnızca 802.11n’e kadar uyguladı. Yirmi beş yılda teorik tepe hız 11 Mbit/s’den 23 Gbit/s’e, yaklaşık 2.100 kat arttı. Wi-Fi 7 için sık rastlanan 46 Gbit/s sayısı 16 akış varsayıyordu; o özellik 2024’te standarttan çıkarıldı ve tavan sekiz akışla 23 Gbit/s’te kaldı.

Ders kitaplarında 802.11n için 450 Mbit/s yazdığını da görürsün. Çelişki yok: 450, 40 MHz’lik kanalda üç akışın tavanı ve piyasadaki hızlı 802.11n cihazların çoğu üç akışlıydı; tablodaki 600 ise standardın izin verdiği dört akışla çıkıyor.

Tablodaki sayılar teorik tavan; gündelik hız hep altında. Telefonların çoğu iki akışlı, kanalı başkalarıyla paylaşıyor ve 30. bölümde saydığımız bekleme bedelini her frame’de ödüyor. Wi-Fi 7’nin standart adı IEEE 802.11be ve 26 Eylül 2024’te onaylandı. Sıradaki kuşak Wi-Fi 8, yani IEEE 802.11bn; 2028’de tamamlanması hedefleniyor. Kuşakların standarttaki adları yönü gösteriyor: 802.11ax High Efficiency, 802.11be Extremely High Throughput, 802.11bn ise Ultra High Reliability. Hedef bu kez tepe hız değil, kalabalık ortamlarda gecikmeyi ve kaybı azaltmak.

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.

    Band                   : 5 GHz
    Channel                : 44
    ...
    Radio type             : 802.11ac
    ...
    Receive rate (Mbps)    : 866.7
    Transmit rate (Mbps)   : 866.7
    Signal                 : 84%

Linux’ta iw dev wlan0 link daha açık konuşuyor; hızın yanına o hızı üreten ayarları da yazıyor:

tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2

Satırdaki alanlar bu bölümün soruları. 80MHz kanal genişliği. VHT-MCS 9, modülasyon derinliği ile kodlama oranının birlikte adı; burada 256-QAM ve 5/6. VHT-NSS 2 akış sayısı. VHT, 802.11ac’nin standarttaki adı (Very High Throughput). short GI ise koruma aralığının 800 nanosaniyeden 400’e kısaltıldığını söylüyor; hızın yüzde 11’i oradan geliyor. 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

  • Kapasitenin iki girdisi var: Shannon bant genişliğini ve SNR’yi alır; 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 1 ile 12 bit arasında taşır; uyarlamalı modülasyon bu sayıyı ve kodlama oranını, yani MCS’i, 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.
  • Tavan kuşakla, gündelik hız paylaşımla belirlenir: 802.11be’nin teorik tavanı 23 Gbit/s; iki akışlı telefonlar ve paylaşılan hava gerçek hızı bunun çok altında tutar.

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 32: Kablosuz Ağ Güvenliği

Menzildeki her radyo o frame’i 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ı?

Havada ne şifreleniyor, ne açık kalıyor?

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, frame’lerini şifreleyecek. Üçüncüsü sanıldığından geniş. Koruma yalnızca kullanıcı verisini kapsamıyor. Bağlantıyı koparan deauthentication frame’ini eskiden menzildeki herkes sahte olarak üretebiliyordu; tek bir komutla komşunun bağlantısını düşürmek mümkündü. WPA3’ün zorunlu kıldığı korumalı yönetim frame’leri (PMF) bu tür frame’leri de doğrulamaya bağladı.

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. 30. bölümde bu iki yol ağı bulup ilişkilendirmeye kadar götürüyordu; aynı frame’ler 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ı monitor mode’a alıp yanından geçen her frame’i kaydetmeyi 21. bölümde görmüştük. Menzilde duran bir yabancı da aynı şeyi senden izin almadan yapar; kaydedilen trafik şifreliyse eldeki dosya anlaşılmaz kalır.

Kablosuz dinleme aracı Kismet’in terminal ekranı: menzilde yakalanan ağlar satır satır listelenmiş, her satırda ağın adı ve toplanan paket sayısı duruyor. Ağa hiç katılmadan, yalnızca monitor mode ile çalışan bir kartla toplanmış bir liste.

Şifrelemenin açık olup olmadığını frame denetim alanındaki tek bitlik Protected Frame bayrağından okuyabilirsin; bitin eski adı, doğduğu protokolden kalma, WEP biti. Başlığın kendisi şifrelenmiyor: adres alanları açıkta gidiyor, şifrelenen kısım yalnızca yük. Dinleyen biri içeriği okuyamaz, kimin kiminle konuştuğunu yine de görür.

Başlık yine de korumasız değil. WPA2’nin şifreleme düzeni CCMP, yani AES’in sayaç kipiyle bir bütünlük kodunun birleşimi; başlığın yolda değişmeyen alanlarını da bu koda katıyor. Biri yolda adresi değiştirirse alıcı frame’i atar. Şifreleme kanalın hızına dokunmaz, yalnızca her frame’e 16 baytlık bir ek getirir: 8 baytlık bir şifreleme başlığı ve 8 baytlık bir bütünlük kodu.

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: Wired Equivalent Privacy, yani kablolu ortamla eşdeğer bir mahremiyet. Eski access point kataloglarında güvenlik satırı 64, 128 ve 152 bitlik WEP seçenekleriyle reklam ediliyordu. Bu sayıların 24 biti anahtar değildi; her frame’de açıkta giden bir başlangıç vektörüydü. 64 bitlik WEP’in gerçek anahtarı 40 bitti. WEP’in yapısal kusurları 2001’de yayımlandı, 2007’de anahtar bir dakikadan kısa sürede çıkarılır hâle geldi.

WPA 2003’te, eski donanımda çalışsın diye aceleyle hazırlanmış bir ara çözüm olarak geldi; WPA2 2004’te, WPA3 ise 2018’de. Aradaki on dört yıl boyunca WPA2 el sıkışması sahadaki tek ciddi 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 (pre-shared key, PSK).

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 frame’i 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 yalnızca o bağlantıya ait taze bir AES anahtarı üretir. Adı dört adımlı el sıkışma (4-way handshake); mesajları EAPOL frame’leriyle taşınır. EAPOL, genişletilebilir kimlik doğrulama protokolünün (EAP) yerel ağ üstünde taşınan biçimi ve adını kurumsal kipte göreceğimiz 802.1X’ten alıyor.

Sırayı adım adım izleyelim. Birinci mesajda access point rastgele bir sayı, bir nonce gönderiyor. İstemci kendi nonce’unu üretiyor; paroladan türeyen ortak sırrı, iki nonce’u ve iki MAC adresini birleştirip oturum anahtarını hesaplıyor. İkinci mesajda kendi nonce’unu, bu anahtarla hesaplanmış bir MIC (bütünlük kodu) ile birlikte gönderiyor. Access point artık aynı hesabı yapabiliyor; MIC tutuyorsa karşı tarafın parolayı bildiğini anlıyor. Üçüncü mesajda kendi MIC’ini ve broadcast frame’lerinde herkesin ortak kullanacağı grup anahtarını şifreli olarak yolluyor. Dördüncü mesaj istemcinin onayı; iki taraf da anahtarı kuruyor.

Nonce’lar kaydedilmiş bir mesajın yeniden oynatılmasını engelliyor ve her bağlantının anahtarını farklı kılıyor. El sıkışma bittiğinde anahtarı iki tarafta hazır buluyorsun, ama parola hiçbir zaman hatta çıkmamış oluyor. 9. bölümde simetrik şifrelemenin anahtar dağıtımı sorununu görmüştük; burada o anahtarı elden veren bir merci yok, iki tarafın ortak parolası var.

Bu düzenin bir zaafı da var. Nonce’lar ve MAC adresleri açıkta gidiyor; eksik olan tek parça parola. Parolayı bilen biri, yani aynı kafenin ağına bağlı herhangi biri, başka bir cihazın el sıkışmasını kaydederse o cihazın oturum anahtarını hesaplayıp trafiğini çözebilir. WPA2-PSK’da aynı parolayı paylaşanlar birbirine karşı korunmaz.

Bağlanma izini frame frame sayabilirsin: bir beacon, iki authentication, iki ilişkilendirme ve dört EAPOL frame’i, toplam dokuz; her birinin ardından dönen ACK’ler bu sayıya dahil değil. Adres alma sırası ondan sonra geliyor, çünkü el sıkışma bitip anahtar kurulmadan access point cihazın veri frame’lerini geçirmiyor; 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ı; 2005’te matematiksel bir güvenlik kanıtı bile yayımlanmıştı. Mathy Vanhoef’un 2017’de bulduğu kusur şifrede değil, sıralamadaydı. Kanıt anahtarın gizli kaldığını gösteriyordu, ama anahtarın ne zaman ve kaç kez kurulacağını hiç modellemiyordu.

Üçü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. Anahtarı yeniden kurmak, yanındaki sayacı da sıfırlamak demek: nonce olarak kullanılan paket numarası başa dönüyor.

9. bölümde sayaç kipinin en tehlikeli hatasını görmüştü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 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ı, kısaltmasıyla KRACK (Key Reinstallation Attack). En çarpıcı durum Linux ve Android 6’daki istemci yazılımındaydı: yeniden kurulan anahtar tamamen sıfırlanıyor, trafik sıfırlardan oluşan bir anahtarla şifreleniyordu.

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.

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ı. 2018’de bulunan bir yöntemle tam el sıkışmaya bile gerek kalmadı: access point’in ilk mesajına eklediği tek bir alan (PMKID) denemeye yetiyordu, ortada bağlanan bir istemci olmasa bile.

WPA3’ün kullandığı SAE (Simultaneous Authentication of Equals), 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. Her taraf birer skaler ile eleman üretip değiş tokuş eder ve ortak sırrı hesaplar; skaler büyük bir sayı, eleman ise eliptik eğri üzerinde bir nokta. 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 frame eder. Diziliş WPA2’nin dört adımına benziyor, üretilen şey benzemiyor.

Ortak sır tek parça da bırakılmaz; ondan iki anahtar türetilir. Biri Confirm adımındaki kanıtı üretir (KCK), öteki bağlantının ana anahtarı olur (PMK). 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.

SAE bittiğinde dört adımlı el sıkışma yine koşar; ama bu kez paroladan değil, SAE’nin ürettiği ve her bağlantıda farklı olan ana anahtardan başlar. İki kazanç buradan çıkıyor. Parolayı bilen biri bile, kaydettiği başka bir cihazın trafiğini artık çözemez. Parola ileride sızsa bile eski kayıtlar açılmaz; 11. bölümde TLS için gördüğümüz forward secrecy havaya da gelmiş olur.

İki tarafın parolayı hiç göndermeden nasıl anlaştığını izleyelim:

SAE: dört frame'de kurulan ve parolayı ele vermeyen anahtar
istemciaccess pointparolaya bağlantek tahminparolaya bağlantek tahminCommit: skaler ve elemanortak sırKCK ve PMKara değer silinirortak sırKCK ve PMKConfirm: aynı sırrı türettikPMK hazır: dört adımlı el sıkışma bunun üstünde koşar
İ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.
  1. İ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.
  2. 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.
  3. Ortak sırdan iki anahtar türetiliyor. Sır tek parça bırakılmaz: Confirm kanıtını üretecek bir anahtar (KCK) ile bağlantının ana anahtarı (PMK) türetilir. Skaler ve eleman üretildikten sonra ara değer geri dönülemez biçimde yok edilir.
  4. 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.
  5. Ana anahtar hazır. Dört frame bitince iki tarafta da yalnızca bu bağlantıya ait bir ana anahtar (PMK) durur. Ardından dört adımlı el sıkışma yine koşar, ama bu kez paroladan değil bu taze anahtardan başlar; parolayı bilen biri bile onu kayıttan hesaplayamaz.
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.

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. Aynı ağ adıyla yalnızca WPA2 sunan sahte bir access point açan biri, istemciyi WPA2 tarafına düşürebiliyor. Bu olduğunda az önce gördüğün WPA3 kazanımı kayboluyor: kaydedilmiş el sıkışmadan parolayı deneme imkânı geri geliyor. Vanhoef ile Ronen bunu 2019’da Dragonblood adıyla yayımladı. Bugünkü çözümlerden biri, WPA3’le bir kez bağlanan cihazın o ağ için WPA2’yi bir daha kabul etmemesi.

Aynı çalışma SAE’nin kendisinde de bir sızıntı buldu: parolayı eğri üzerindeki bir noktaya çeviren adımın süresi paroladan parolaya değişiyordu ve bu süre ölçülebiliyordu. Sonradan eklenen ve 6 GHz bandında zorunlu olan yöntem (hash-to-element) bu adımı her parola için aynı sürede yapıyor.

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. İlk hâli 2001’de kablolu Ethernet portları için yazıldı: port, kimlik doğrulanana kadar yalnızca doğrulama trafiğini geçirir. 802.11i aynı denetimi kablosuza taşıdı; burada kapı bekçisi access point’te duruyor.

Standart üç rol tanımlar: kimliğini kanıtlayan istemci (supplicant), kapıyı tutan kimlik denetleyici (authenticator) ve kararı veren sunucu. Kimlik denetleyici ayrı bir kutu değildir; switch’in ya da access point’in üstlendiği bir roldür. İstemciden gelen kimlik yanıtını alır, bir RADIUS Access-Request paketine koyup 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 frame’i 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. 11. bölümdeki TLS tüneli burada bir web sayfasını değil, tek bir parolayı taşımak için kuruluyor. Sahada en yaygın akrabası PEAP; üniversitelerin ortak ağı eduroam da bu tünelli yöntemlere dayanır.

Tünelin bir şartı var ve en sık atlanan ayar o. İstemci sunucunun sertifikasını denetlemezse, aynı ağ adını yayınlayan sahte bir access point kendi sunucusuyla tüneli kurar ve parolayı toplar. Kurumsal Wi-Fi’da en yaygın yapılandırma hatası bu: sertifika denetimi kapalı bırakılmış istemci.

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

  • Ş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. Ama WPA2-PSK’da parolayı bilen, kaydettiği el sıkışmadan o anahtarı hesaplayabilir.
  • KRACK anahtarı kırmadı, yeniden kurdurdu: yeniden gönderilen üçüncü mesaj sayacı sıfırlıyordu; düzeltme protokolde değil gerçeklemelerde yapıldı.
  • 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 ve her bağlantıya parolayı bilenin bile hesaplayamadığı bir ana anahtar verir.
  • 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 33: 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; hız 4G’de onlarca, 5G’de yüzlerce Mbit/s mertebesindedir.

Ders kitapları bu ikisini kablosuz erişimin iki ailesi olarak sayar: bina içinde kalan kablosuz yerel ağlar (WLAN) ve operatörün kurduğu geniş alan hücresel erişim. Türkçede ikincisine çoğu zaman GSM denir. GSM aslında ikinci kuşağın, 2G’nin standardının adı ve Türkiye’de 1994’te açıldı; bugün verini 4G ve 5G taşıyor, ad ise ilk sayısal kuşaktan kalma bir alışkanlık.

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ı. Hepsi i² + ij + j² biçiminde yazılabilen sayılar; i ve j, bir hücreden aynı frekansı kullanan en yakın hücreye gitmek için iki yönde atılan adım sayısı. Sahada en yaygın seçim yedi: i = 2, j = 1.

Küme büyüdükçe aynı frekansı kullanan iki hücre birbirinden uzaklaşıyor. Uzaklığın yarıçapa oranı √(3N); yedi hücrelik bir kümede bu, hücrenin yarıçapının kabaca dört buçuk katı ediyor. Yürüyerek söylersek: bir hücreden iki hücre ilerleyip 60 derece dönmek ve bir hücre daha gitmek, aynı frekansı kullanan en yakın hücreye varmaya yetiyor.

Ş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; tek bir kule üç ayrı hücre gibi davranır. Buna sektörleme deniyor. Yönlü bir panel yalnızca önündeki komşuları duyduğu için girişim azalıyor ve bu, daha küçük bir N’e izin veriyor. 4G ve 5G’de her sektör bütün spektrumu kullanan ayrı bir hücre; bir kulede farklı yönlere bakan üç panel gördüysen, o kule gerçekten üç hücrenin kapasitesini taşıyor.

Talep yine de aşarsa üçüncü hamle var: hücreyi 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 data link layer hizmetidir. Cihaz ile daha büyük ağ arasındaki ilk sıçrama orasıdır.

Hücresel standartları 3GPP adlı uluslararası ortaklık yazıyor; onun adlandırması sabit ve bu bölümde onu kullanacağım. Cihaz User Equipment (UE), 5G’nin radyo kanalı New Radio (NR), baz istasyonu gNodeB (gNB). 4G’de baz istasyonunun adı eNodeB idi.

Telefonun tarafında iş tek bir radyoya da düşmez. iPhone 16’da yaklaşık on bir ayrı radyo var; beşi hücresel, kalanı Wi-Fi, Bluetooth, UWB, uydu, NFC ve GPS için. 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, router’lardan ve sunuculardan oluşur, hem cihazlara hem baz istasyonlarına hizmet verir. Bir operatörün mantıken tek bir çekirdek ağı, ona bağlı binlerce baz istasyonu var.

5G çekirdeğinin en görünür tasarım kararı düzlem ayrımı; adı CUPS (Control and User Plane Separation). Fikir 4G’nin son sürümlerinde başladı, 5G’de temel ilke oldu. 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). Cihazın her veri oturumuna 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 interface’in adı N3. Trafik o interface’te tünellenir: cihazın IP datagramı önce kısa bir tünel başlığıyla sarılır, sonra bir UDP paketinin, o da bir başka IP paketinin içine girer. Encapsulation 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 ve UDP’de 2152 numaralı portu kullanır. Tünellerin genel mantığını 48. bölümde açacağız.

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 telefona gömülü eSIM 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 ve anahtar kartın dışına hiç çıkmaz; onunla yapılan hesap da kartın içindeki yongada yürür, telefonun işlemcisi bile anahtarı görmez. Ziyaret ettiğin ağda alacağın hizmet de ev ağındaki ücretli aboneliğine bağlıdır.

SIM kartın içindeki silikon yonganın makro çekimi: altın temas yüzeyinin arkasında duran asıl parça bu. Ev ağıyla paylaşılan kriptografik anahtar kartın plastiğinde değil, bu yongada saklanıyor.

5G’de 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. 4G’ye kadar kalıcı kimlik (IMSI) ilk bağlantıda açıkta gidebiliyordu; sahte baz istasyonu kurup çevredeki telefonların kimliğini toplayan IMSI catcher cihazları bu açığı kullanıyordu. Kartın fabrikadan gelen adını gizlemek için 23. bölümde 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ı, 32. bölümdeki 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ı, radyo kaynaklarını yöneten RRC (Radio Resource Control) protokolünün kurulum 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:

Bir telefonun hücresel ağa katılırken izlediği yol
cihaz (UE)SIMbaz istasyonugNBradyo bağlantısıAMF · SMFdenetim düzlemiev ağıAUSF · UDMTLS tünelikayıtUPFkullanıcı düzlemiIP adresiN3 · GTP-Uinternet
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.
  1. 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.
  2. 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.
  3. 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.
  4. N3 tüneli açılıyor. Baz istasyonu ile UPF arasındaki N3 interface'inde GTP-U tüneli kurulur: cihazın IP datagramı bir tünel başlığıyla sarılıp bir UDP paketinin, o da bir başka IP paketinin içine girer.
  5. 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. 31. bölümde 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 iki kenarda koruma bandı olarak boş kalır; denetim kanalları ise bu 9 MHz’in içinde, her dilimin ilk sembollerinde taşınır.

Dağıtım kararı sürekli yenilenir. 4G’de 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. Aralık büyüdükçe sembol kısalıyor ve karar sıklığı artıyor: 30 kHz’de her 0,5 ms’de, 120 kHz’de her 0,125 ms’de bir karar veriliyor. 5G’nin düşük gecikme iddiasının bir ayağı bu. Taşıyıcının kendi genişliğinin kuşakla nasıl büyüdüğünü 34. bölümde 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. Sonraki sürümler bu sınırı büyüttü; Release 13 32 taşıyıcıya kadar izin verdi.

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 kodlama oranını, yani 31. bölümdeki MCS seçimini besler.

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 frame’i parçalayıp ARQ ile güvenilir kılar. MAC tamponlar, çoklar ve o 1 ms’lik zamanlama kararını verir. Bugünkü baz istasyonları bu yığını üç parçaya bölüyor: Central Unit, Distributed Unit ve Radio Unit. O-RAN girişimi parçalar arasındaki interface’leri açık standart yaparak farklı üreticilerin parçalarını aynı istasyonda birleştirmeyi hedefliyor.

Standart yığının interface’lerini ve üst düzey işlevlerini sabitler. Kaynak bloğu atamasının ve frame zamanlamasının nasıl yapılacağını ise üreticiye ve 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 1.000 mW ile 3.500 mW arasında çeker. Kapalıyken tüketim 15 mW’ın altına iner, yani açık durumun yüzde birinin civarına: 70 ile 230 kat daha az.

Bu fark uykuyu zorunlu kılar. Cihaz DRX (discontinuous reception) uykusundayken gelen trafik, geçerli DRX döngüsü bitene kadar baz istasyonunda tamponlanır. Uzun uyku enerji kazandırır, gecikme ekler. 2. bölümde kuyruk gecikmesi, paketin sırada beklediği süreydi. DRX o kuyruğu kasten uzatıyor. Pille yıllarca çalışması beklenen sensör düğümleri aynı ödünleşimi çok daha uç bir noktada yaşıyor; radyonun zamanın %99’unda kapalı kaldığı protokoller 76. bölümde.

Ters yönde de bir tuzak var. Son paketten sonra radyo birkaç saniye daha açık bekler, çünkü hemen ardından yeni bir paket gelme ihtimali yüksektir. Arka planda sık sık küçük paket gönderen bir uygulama radyoyu hiç uyutmaz; pili büyük bir indirmeden daha hızlı bitirebilir.

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ü 35. bölümde 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
           |    access tech: lte
           | signal quality: 58% (recent)
  ...
  3GPP     |  operator name: ornek-operator
           |   registration: home

Son 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

  • 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 birinin civarı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 34: 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. Birleşmiş Milletler’in telekomünikasyon kuruluşu ITU’nun 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 ve dört yılda bir toplanan Dünya Radyokomünikasyon Konferansı’nda (WRC) veriliyor. Aralık 2023’teki WRC-23, 6,425 ile 7,125 GHz arasını Bölge 1’de hücresel kullanıma ayırdı. 2027’deki WRC-27’nin 1.7 numaralı gündem maddesi ise 4,4-4,8 GHz, 7,125-8,4 GHz ve 14,8-15,35 GHz aralıklarını tartışıyor.

Amerika’nın ulusal frekans tahsis çizelgesi: 3 kHz’ten 300 GHz’e uzanan spektrum, her dilimi ayrı bir hizmete verilmiş yüzlerce renkli şeride bölünmüş. Bandın boş bir yeri yok; her aralığın tahsis edilmiş bir sahibi var.

Ülke içinde dağıtımı düzenleyici kurum yapıyor; Türkiye’de bu işi BTK yürütüyor. 4.5G diye pazarlanan LTE ihalesi 26 Ağustos 2015’te sonuçlandı ve hizmet 1 Nisan 2016’da başladı. 5G ihalesi 16 Ekim 2025’te yapıldı: 700 MHz ve 3,5 GHz bantlarındaki paketler üç operatöre toplam 2,945 milyar dolara verildi ve 5G hizmeti yine bir 1 Nisan’da, 2026’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ımkim yayın yapabilirbedeli
lisanslıihaleyi kazanan tek sahipbant parayla alınır
paylaşımlıöncelikli kullanıcı yokken herkesöncelikli gelince çekilirsin
lisanssızgüç sınırına uyan herkesgiriş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. ABD’deki CBRS bandı (3,55-3,7 GHz) paylaşımlı kullanıma örnek: bir fabrika ihale kazanmadan kendi hücresel ağını burada kurabiliyor, ama bandın öncelikli kullanıcısı olan donanma radarı belirdiğinde çekilmek zorunda.

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. Klasik Bluetooth 2,4 ile 2,5 GHz arasını 1 MHz’lik 79 kanala bölüyor ve saniyede 1.600 kez kanal değiştiriyor. Girişim yapan cihaz tek bir kanalı tutuyorsa, atlama dizisinde o kanala ara sıra denk geliyorsun. Bozulan frame bir sonraki dilimde başka bir frekanstan gidiyor. 2003’ten beri Bluetooth dolu kanalları öğrenip atlama listesinden de çıkarıyor; kulaklığın, yanındaki Wi-Fi’ın oturduğu kanalların üstünden geçmemeyi böyle öğreniyor. Fabrikalardaki sensör ağları kanal atlamayı zaman dilimleriyle birleştiriyor: 76. bölümdeki TSCH.

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 2. bölümde 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 Avrupa’daki 19 kanalını 31. bölümde saymıştık. Yanlarına genişliklerini yazınca fark ortaya çıkıyor: üç kanal 60 MHz eder, on dokuz kanal 380 MHz. Aynı 20 MHz’lik kalıpla 5 GHz bandı 6,3 kat daha fazla yer veriyor; 6 GHz bandı Avrupa’da 480 MHz daha ekliyor.

İlan edilen genişliğin tamamı da veriye gitmiyor. Komşu kanallar birbirine karışmasın diye aralarına koruma bandı 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 koruma bandını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 list

FREQ 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 kullanmasına izin verilen bantları yazıyor. Wi-Fi’da kanalı access point’in sahibi seçiyor. 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 telefondan baz istasyonuna giden yön (uplink), öteki tersi (downlink). İ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 tek parça, eşleştirilmemiş bir dilim yetiyor; yüksek bantlarda bulunan da neredeyse hep budur. İkincisi ve daha önemlisi, bölüşüm ayarlanabilir: trafik indirme ağırlıklıysa zaman dilimlerinin dörtte üçünü downlink’e verirsin.

Bu ikinci nokta, 62. bölümde göreceğin kablo şebekesinin derdine başka bir dünyadan gelen cevap. Orada yukarı ve aşağı yön arasındaki bölüşüm spektrumun içine donanımla gömülü ve değiştirmek için her yükseltmede sahaya ekip çı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. Yüksek bantta aralarında boşluk bırakılmış iki geniş dilim bulmak zor; tek parça geniş bir dilim ise TDD’ye yetiyor.

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. Path loss frekans ile mesafenin çarpımına bağlı büyüyor. Kaybın formülünü aşağıdaki panele bıraktım; ana metinde yalnızca sonucunu kullanıyorum.

Sonuç şu. 3,5 GHz yerine 26 GHz kullanmak aynı mesafede yaklaşık 55 kat daha fazla path loss 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 telefonun izin verilen en yüksek gönderme gücü 31. bölümde gördüğümüz gibi 200 mW, yani 23 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.

DerinleşmePath loss formülü ve 55 katın hesabı

Boş uzayda yayılan bir dalganın kaybı tek satırda yazılıyor:

L = 20·log₁₀(d) + 20·log₁₀(f) + 32,44        d km, f MHz, L dB

İki logaritma aynı katsayıyı taşıyor: mesafeyi ikiye katlamakla frekansı ikiye katlamak kayba aynı 6 dB’yi ekliyor. Sabit terim fizikten değil, birimlerden geliyor.

Örneğe koy. 1 km’de 3,5 GHz için 20·log₁₀(3.500) + 32,44 = 103,3 dB, aynı mesafede 26 GHz için 120,7 dB. Fark 17,4 dB; desibelden orana çevirince 10^(17,4/10) ≈ 55. Aynı kaybı korumak istersen o 17,4 dB’yi mesafe terimi geri almak zorunda: 1 km / (26/3,5) ≈ 135 m. Metindeki iki sayı da bu tek satırdan çıkıyor.

Formül boş uzay için. Bina içinde ve şehirde path loss üssü 30. bölümde gördüğümüz gibi 2’den büyüktü; orada aynı frekans farkı daha da pahalıya geliyor.

Formüldeki frekans terimi yine de yanıltıcı. Boş uzay yüksek frekanslı dalgayı daha çok “yormuyor”; kayıp, alıcı antenin yakalama alanından geliyor. Aynı kazançtaki bir anten frekans arttıkça küçülüyor ve yayılan dalgadan daha küçük bir parça yakalıyor. Tersinden bakınca çare de ortada: aynı boyuttaki bir panele yüksek frekansta çok daha fazla küçük anten sığıyor ve bu anten dizisi sinyali tek yöne hüzmeleyerek kaybın büyük kısmını geri alıyor. Milimetre dalga baz istasyonlarının yüzlerce elemanlı anten panelleri bu yüzden var.

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ıffrekanstipik hücre yarıçapıtipik hız
düşük bant1 GHz altıkırsalda onlarca km50-250 Mbit/s
orta bant1-6 GHzşehirde bir iki km100-900 Mbit/s
yüksek bant24-71 GHzbirkaç yüz metre3 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; ticari şebekelerde en çok 26, 28 ve 39 GHz kullanılıyor, WRC-19 bunların yanında 40 GHz ve 66-71 GHz civarını da hücresel kullanıma ayırdı. 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 büyük ölçüde görüş hattına muhtaç: bina duvarından, ağaçtan, hatta insan bedeninden zor geçiyor. 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; 6 GHz bir basamak daha kısa. Modern access point’lerin üç bandı birden yayınlaması bu yüzden: yakındaki cihaz hızlı bantta, uzaktaki menzilli bantta 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’dan 7125 MHz’e, 24.250’den 71.000 MHz’e. Belgeyi okurken bu birimi aklında tut; 7125 MHz ile 7,125 GHz aynı sayıdır. İ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ı; WRC-27’nin tartışacağı 7,125-8,4 GHz ile 14,8-15,35 GHz aralıkları da bu dilimin içinde.

O sıfat bir hesabın kısaltması. Path loss 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:

3GPP frekans aralıkları: aynı cetvelde FR1, FR3 ve FR2
Aynı cetvelde üç aralıkartan frekans410 MHz7,125 GHz24,25 GHz71 GHzFR1 · 6,715 GHzFR3 · 17,125 GHzFR2 · 46,75 GHzFR2 tek başına FR1'in 6,96 katı.FR1 tarafı: kilometrelerce menzil, 50-900 Mbit/sFR2 tarafı: birkaç yüz metre, 3 Gbit/s'e yakın hız3,5 GHz yerine 26 GHz: 55 kat yol kaybı.1 km'lik menzil 135 m'ye iner; aynı alan 55 kat hücre ister.FR3 hücresele henüz kapalı; WRC-27 gündem 1.7 kapıyı zorluyor.FR1FR3FR2
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ı.
  1. 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ı.
  2. 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.
  3. 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.
  4. 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.
  5. Arada kalan boşluk. FR1 ile FR2 arasındaki FR3 hücresel hizmete henüz açık değil. WRC-27'nin 1.7 numaralı gündem maddesi bu boşluğun alt ucunu (7,125-8,4 GHz) ve 14,8-15,35 GHz aralığını 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 FR1’de 100 MHz, milimetre dalgada 400 MHz: radyoya verilen frekans dilimi en az 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ı. Yüksek frekansta osilatörün faz gürültüsü ve hareketin yarattığı Doppler kayması büyüyor; dar aralıklı alt taşıyıcılar orada birbirine karışır.

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’in ilk sürümü Release 18; ikincisi Release 19, Aralık 2025’te tamamlandı. 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

  • Spektrumun sahibi devlettir: bir bandı kullanmak ulusal bir izne bağlıdır; 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; aynı frekansta konuşan cihazları kimse birbirinden ayırmaz.
  • Yukarı çıkmak menzil yakar: 3,5 GHz yerine 26 GHz seçmek path loss’u 55 kat artırır ve aynı alanı örtmek 55 kat hücre ister.
  • Kuşak atlamak taşıyıcıyı genişletir: 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 35: 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ı.

kademene oluyorzorluk
yerinde duruyorsunhiçbir şey değişmiyoryok
kapanıp başka ağda açılıyorsuntaşınacak oturum yokdüşük
aynı sağlayıcının hücreleri arasında geziyorsunaçık oturum taşınıyororta
sağlayıcı ağları arasında geçiyorsunoturum ve kimlik birlikte taşınıyoryü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. Tablonun hiç kapsamadığı bir durum da var: ortada ne baz istasyonunun ne access point’in olduğu, her cihazın hem uç hem router olduğu ağlar. Onlara 80. bölümde döneceğiz.

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; ayrıntısını 37. bölümde açacağız. 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. 6. bölümde gördüğümüz gibi bir TCP bağlantısı 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 (handover), cihazın ağa bağlanma noktasının değişmesi. Cihaza giden veri flow’u, yani aynı konuşmaya ait paketlerin 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.

Bir hücresel baz istasyonu kulesinin tepesi: dikdörtgen panel antenler farklı yönlere bakacak biçimde direğe dizilmiş. Her panelin baktığı yön ayrı bir hücre demek; yürürken bağlantın bu panellerden biriyle diğeri arasında devrediliyor.

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. Ölçtüğü şey 33. bölümdeki CQI değil: CQI hangi modülasyonun seçileceğini söylüyordu. Aktarma için cihaz kendi hücresinin ve komşularının referans sinyali gücünü (RSRP) ölçüp raporluyor.

Rapor da basamaklı: LTE’de RSRP -140 ile -44 dBm arasında, 1 dB’lik adımlarla 98 seviyeye bölünüyor. Ölçmenin bir de bedeli var. Başka frekanstaki bir komşuyu ölçmek için cihaz kendi hücresini kısa aralıklarla dinlemeyi bırakıyor; şebeke bu ölçüm boşluklarını önceden planlıyor ve o sırada cihaza veri göndermiyor.

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. 3GPP bu kurala A3 olayı diyor. Aradaki paya histerezis, beklenen süreye time-to-trigger deniyor. İkisi olmasa iki hücrenin sınırında duran bir telefon aralarında gidip gelirdi ve her gidiş gelişte yeni bir aktarma yükü doğardı; sahadaki adı ping-pong aktarma.

Hedef baz istasyonu, cihaz daha oraya geçmeden radyo zaman dilimlerini ayırıyor ve cihazın yeni hücrede kullanacağı ayarları taşıyan bir Handover Request Acknowledge 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 ileri aktarım (data forwarding).

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:

Bir aktarmanın sırası: ölçümden çekirdekteki yol değişikliğine
cihazUEkaynakbaz istasyonuhedefbaz istasyonuçekirdekUPF ve SMFölçüm raporu · RSRPHandover RequestRequest Ack · yer ayrıldıayrıl ve hedefe tutunbiriken datagramlarkesinti yalnızca ayrıl-tutun aralığındatünelin ucu değişirtamamlandı, serbest bırak
Ölçüm raporu gider. Cihaz kendi hücresinin ve komşularının referans sinyali gücünü (RSRP) ölçüp kaynak baz istasyonuna raporluyor. Karar bu ölçümle besleniyor; modülasyonu seçen CQI bu işe karışmıyor.
  1. Ölçüm raporu gider. Cihaz kendi hücresinin ve komşularının referans sinyali gücünü (RSRP) ölçüp kaynak baz istasyonuna raporluyor. Karar bu ölçümle besleniyor; modülasyonu seçen CQI bu işe karışmıyor.
  2. 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.
  3. Hedef yeri hazırlar. Hedef, cihaz daha gelmeden radyo zaman dilimlerini ayırıyor ve cihazın yeni hücrede kullanacağı ayarları taşıyan bir Handover Request Acknowledge ile yanıt veriyor.
  4. 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.
  5. Ç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.

Soft handover (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 şebeke aynı veriyi iki hücreden göndermek için iki kat kaynak ayırır. Farklı frekanslardaki iki hücreyi aynı anda dinlemek cihaza iki ayrı radyo zinciri gerektirirdi. 3G’nin kod bölmeli tasarımında ise komşu hücreler aynı frekansı kullandığı için tek alıcı iki hücrenin sinyalini birleştirebiliyordu; soft handover orada ucuzdu.

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:

  1. Cihaz komşu hücrelerin sinyal gücünü sürekli ölçüp kaynak baz istasyonuna raporluyor.
  2. Kaynak, hedef baz istasyonuyla doğrudan konuşup yer ayırtıyor. İki baz istasyonu arasındaki bu interface’in adı LTE’de X2, 5G’de Xn; trafik çekirdek ağa hiç uğramıyor.
  3. Kaynak, cihaza “şu hücreye geç” komutunu yolluyor.
  4. 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. Üstelik en kritik anda, sinyal zayıfken, o komutun cihaza ulaşması gerekiyor. 3GPP’nin Release 16’sı buna iki cevap getirdi. Koşullu aktarmada şebeke hedefi ve tetikleyici koşulu önceden cihaza veriyor; cihaz koşul sağlandığında komut beklemeden kendisi geçiyor ve karar anındaki gidiş-dönüş ortadan kalkıyor. İkinci cevap soft handover’ın bir akrabası: cihaz yeni hücreye bağlanırken eskisinden veri almayı sürdürüyor ve kesinti sıfıra iniyor (DAPS). Bedeli yine iki bağlantıyı aynı anda taşıyabilen bir cihaz.

Çekirdek neden yerinde duruyor?

Radyo tarafı değişirken sabit duran bir taraf var. Cihazın her veri oturumuna bir UPF atanıyordu; o UPF cihazla internet arasında röle gibi çalışıyor ve trafiği N3 interface’inde 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 flow’un 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ı. 33. bölümde 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.

Dolaşımda trafiğin nereden internete çıktığı da çapa fikrinin bir sonucu. Varsayılan düzende trafik ziyaret edilen ağdan ev ağındaki UPF’ye kadar tünelleniyor ve internete oradan çıkıyor (home routing). Yurt dışında dolaşımdayken IP adresinin hâlâ Türkiye’de görünmesinin ve bazı yerli hizmetlerin çalışmayı sürdürmesinin sebebi bu.

Wi-Fi aynı sorunu neden ucuza çözüyor?

Hücresel tarafın bunca iş yapmasının sebebi, şehir ölçeğinde binlerce baz istasyonu arasında dolaşırken adresi sabit tutmak zorunda olması. 802.11 ise dolaşımı tek bir alt ağın içinde, data link layer’da ele alıyor. Üst katmanlar olan bitenden habersiz kalıyor.

30. bölümde gördüğümüz genişletilmiş hizmet kümesinin içinde access point değiştirirken IP adresi değişmiyor; komşuya geçmek ilişkilendirmeyi ve anahtarları yenilemek demek. Asıl yavaşlık kimlik doğrulamada: kurumsal ağda her geçişte 802.1X’i baştan koşturmak yüzlerce milisaniye sürebilir. Dolaşımı hızlandıran üç ek çalışma grubunun kendi tarihi var: 802.11k-2008 komşu ölçümünü, 802.11r-2008 önceden hazırlanmış anahtarlarla hızlı yeniden kimlik doğrulamayı, 802.11v-2011 ise ağın cihaza aday access point önermesini getirdi.

Hücreselden bir farkı daha var: Wi-Fi’da geçme kararını ağ değil cihaz veriyor. “Yapışkan istemci” denen dert buradan çıkıyor; cihaz yakındaki güçlü access point’e geçmek yerine uzaktaki zayıf sinyale tutunmayı sürdürebiliyor. 802.11k ve 802.11v kararı cihazın elinden almıyor, yalnızca ona bilgi veriyor.

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
    AP BSSID               : 00:00:5e:00:53:0b

Binanı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 data link layer’ın hilesi bitiyor.

Adres değişince bağlantı neden ölmüyor?

İkinci çıkış yolu bağlantıyı adresten koparmak. 15. bölümde 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 connection ID 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, 46. bölümde göreceğimiz adres çeviren kutunun flow’a yeni bir çıkış portu ya da yeni bir çıkış adresi vermesiyle oluyor. Uç, karşı tarafın adresinde herhangi bir değişiklik sezerse path validation yapmak zorunda.

Path validation, yeni adresten gelen paketlerin sahte kaynak taşımadığını sınıyor. Gönderen, tür kodu 0x1a olan PATH_CHALLENGE frame’inin 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 RTT 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ı connection ID’yi 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ü?

Network layer’ının bu soruya verdiği eski cevabın adı mobil IP; ilk hâli 1996’da RFC 2002 olarak yayımlandı 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ı (home agent), düğümün ev ağındaki bir router; düğüm evden uzaktayken datagramları ona tünelleyerek ulaştırıyor. Yabancı aracı (foreign agent) ise ziyaret edilen ağdaki router ve kayıtlı düğüme routing hizmeti veriyor. İkisi de altyapı demek: çözümün çalışması için yolun her iki ucundaki router’ların bu işi bilmesi gerekiyor.

Bedeli yolda da ödeniyor. Karşı taraftan gelen her paket önce ev aracısına, oradan düğüme gidiyor; düğüm sunucuyla aynı şehirde olsa bile trafik ev ağına uğrayıp dönüyor. Adı üçgen routing. Hücreselin UPF çapası da aslında aynı fikrin akrabası: sabit bir çapa ve ona giden bir tünel. Farkı, çapanın operatörün kendi ağında durması ve internetteki hiçbir router’ın bir şey bilmesinin gerekmemesi.

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üş; bağlantı göçü o bedeli de ödememeyi sağlıyor.

Özet

  • Hareketlilik bir yelpaze: kapalı cihazı taşımak bedava, açık oturumu taşımak pahalı; 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 komşuların sinyal gücünü ölçüp raporlar. Wi-Fi’da ise karar cihazındır.
  • 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.
  • Connection ID 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 36: 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 (Dynamic Host Configuration Protocol) bu dördünü tek cevapta dağıtır.

Dinamik adreslemenin üç tarihsel uygulaması var: 25. bölümde andığımız 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. Sondaki /24, adresin ilk 24 bitinin ağı gösterdiğini söylüyor; bu yazımı 37. bölümde açacağız. 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 broadcast’tir, çü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. İstemci tarafının da sabit bir portu olmasının sebebi, cevabın broadcast olarak dönebilmesi. Rastgele bir port seçilseydi broadcast’i alan öbür makinelerde o portu tesadüfen dinleyen bir programa yabancı bir paket düşerdi.

İ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 broadcast’tir. Aynı ağda teklif veren başka sunucular varsa reddedildiklerini duymak zorundadır. Dördüncü mesaj geldikten sonra adres kiralanmış olur.

Birden çok teklif geldiğinde istemcilerin çoğu ilk geleni seçiyor ve hiçbiri teklifi doğrulamıyor. Bunun bir güvenlik sonucu var: ağa kendi DHCP sunucusunu bağlayan herkes, gerçek sunucudan önce cevap verdiği anda istemcilere varsayılan geçit ve DNS sunucusu olarak kendi adresini bildirebilir. Kurumsal switch’lerdeki DHCP gözetimi (DHCP snooping) bu yüzden teklifleri yalnızca güvenilir diye işaretlenmiş portlardan, yani gerçek sunucuya giden porttan geçiriyor. Aynı arıza kazayla da çıkıyor: ev ağına LAN portundan bağlanan ikinci bir router, kendi DHCP sunucusuyla komşularına yanlış geçit dağıtmaya başlıyor.

Dört mesajın sırasını ve her birinin ne taşıdığını görelim:

Dört mesaj, iki broadcast
istemciDHCP sunucusuDHCPDISCOVERbroadcast · 0.0.0.0 → 255.255.255.255DHCPOFFERyiaddr = 192.168.42.117DHCPREQUESTbroadcast · reddedilenler de duysunDHCPACKkira süresi başladıilk iki adım atlanabiliyor: eski adresini hatırlayan istemci doğrudan üçüncüden başlıyor
Adresi olmayan makine herkese sesleniyor. İstemci sunucunun adresini bilmiyor, kendi adresi de yok. Kaynak alanına 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.
  1. Adresi olmayan makine herkese sesleniyor. İstemci sunucunun adresini bilmiyor, kendi adresi de yok. Kaynak alanına 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.
  2. Sunucu bir adres teklif ediyor. Havuzdan bir adres seçip "senin adresin" anlamına gelen yiaddr alanına 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.
  3. Kabul de broadcast gidiyor; sebebi var. İstemci hangi teklifi kabul ettiğini broadcast'le ilan ediyor. Aynı ağdaki öteki sunucuların, ayırdıkları adresi havuza geri koyabilmek için reddedildiklerini duymaları gerekiyor. Unicast bu haberi taşıyamazdı.
  4. 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. RFC 2131’in tanımladığı 8 tür, 53 numaralı seçenekte tek bayt olarak taşınır.

kodmesajne yapar
1DHCPDISCOVERistemci ağda sunucu arar
2DHCPOFFERsunucu bir adres teklif eder
3DHCPREQUESTistemci teklifi kabul eder
4DHCPDECLINEteklif edilen adres kullanımda çıktı
5DHCPACKkira onaylanır
6DHCPNAKsunucu isteği reddeder
7DHCPRELEASEistemci adresi geri bırakır
8DHCPINFORMadres 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.

numaraseçenektaşıdığı
1alt ağ maskesiağın sınırı
3routervarsayılan geçidin adresi
6DNS sunucusuad çözecek sunucunun adresi
51kira süresikiranın ömrü
53mesaj türüdörtlünün hangi adımı
54sunucu kimliğiteklifi kimin verdiği
55parametre isteğiistemcinin 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 router 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 data link layer adreslerinin hepsi altı oktet 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, ama veri merkezinde ağdan açılan sunucular (PXE) onları bugün de kullanıyor. Standart boşluğu değerlendirmenin bir yolunu da bıraktı: seçenekler sığmazsa bu iki alan seçenek taşımak için ödünç alınabiliyor.

Seçenekler başlamadan önce 4 baytlık sabit bir değer gelir: 99.130.83.99. Adı magic cookie; mesajın düz BOOTP değil, seçenek taşıyan bir DHCP mesajı olduğunu söyleyen işaret bu.

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 router’ın 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 broadcast 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. Standart, istemcinin ilk mesajı göndermeden önce 1 ile 10 saniye arasında rastgele beklemesini öneriyor. Elektrik geldiğinde evdeki bütün cihazların aynı saniyede konuşmasını engelleyen şey bu bekleme; bugünkü istemcilerin çoğu onu kısaltıyor.

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ğini broadcast eder; cevap gelirse adres kullanımdadır ve reddini göndermek zorundadır.

Adres kesinleşince istemcinin son bir işi kalır. 25. bölümdeki 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.

Sabit adres kime gerekiyor?

Havuzun dışında kalan adresleri hatırlıyorsun: örnek ağda .100 ile .199 arası dağıtıma ayrılmıştı, kalan 154 adres boş duruyordu. O boşluk israf değil, ayrılmış alan.

Sebebi basit: bazı makineleri başkaları arıyor. Kirası dolunca adresi değişen bir yazıcıya ertesi gün kimse ulaşamaz. Aynı şey ağdaki depolama kutusu, kamera, switch’in yönetim arayüzü ve router’ın kendisi için de geçerli. Bunlar hizmet veren taraf ve hizmetin adresi sabit olmak zorunda.

İstemci tarafında durum tersine dönüyor. Telefonunun, dizüstünün ve televizyonunun hangi adresi aldığı kimsenin umurunda değil; onlar arayan taraf, aranan değil. Kural buradan çıkıyor: arayanın adresi dinamik olabilir, arananınki olmamalı.

Elle yazmanın üç klasik arızası

Dört alanı doğru doldurmak yetmiyor; üç tuzağı da atlaman gerekiyor.

Havuzun içinden adres seçmek. Yazıcıya elle .150 verdin. Sunucu o adresi havuzda boş görüyor ve bir gün başka bir cihaza teklif ediyor. İki makine aynı adresi taşır hâle geliyor. Sunucunun ve istemcinin yaptığı çakışma sınamaları bu durumu ancak sonradan katılan cihaz üzerinden yakalar; yazıcı çoktan oradadır ve arıza kesikli göründüğü için geç anlaşılır.

Maskeyi yanlış girmek. Maske hangi adreslerin komşu sayılacağına karar veriyordu. Yanlış maske komşuyu uzak, uzağı komşu gösterir. İkincisinde makine paketi geçide hiç vermez ve olmayan bir komşuyu ARP ile boşuna arar.

Geçidi ya da DNS’i boş bırakmak. Geçitsiz makine yerel ağda çalışır, dışarı çıkamaz. DNS’siz makine dışarı çıkar ama hiçbir adı çözemez. İkincisinde kullanıcının gördüğü tablo “internet yok”tur, oysa IP adresi yazıldığında her yere ulaşılıyordur.

Üçüncü yol: adresi cihaza değil sunucuya yazmak

İki ucun arasında, sahada en çok kullanılan seçenek duruyor. Sunucuya “şu MAC adresli kart her istediğinde .50 alsın” dersin. Cihazın hiçbir ayarına dokunmazsın; o hâlâ sıradan bir DHCP istemcisi ve dört mesajı her seferinde aynı şekilde yürütüyor. Yalnızca cevabın içindeki adres artık sabit.

Adı rezervasyon; ev interface’lerinde çoğu zaman “statik DHCP” diye geçer. Kazandırdığı şey yönetim kolaylığı: adres sabit ama karar tek bir yerde duruyor. Yüz cihazlı bir ağda hangi adresin kimde olduğunu öğrenmek için yüz cihaza değil, tek bir tabloya bakıyorsun.

adresi kim tutuyordeğişir miyüz cihazda
dinamiksunucu, havuzdankira dolunca değişebilirsorunsuz
rezervasyonsunucu, MAC’e bağlıdeğişmeztek tablo
elle statikcihazın kendisiancak elleyüz ayrı ayar

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ındaki analog sinyali sayısal veriye, giden veriyi de hattın taşıyabileceği analog sinyale çevirir; adı bu iki işin, modülasyon ile demodülasyonun kısaltması. Fiber hatlarda aynı işi ONT denen kutu yapar. Router paketleri ağlar arasında iletir; firewall ve adres çevirisi de onun tarafındadır. Switch 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.

Ev tipi kablosuz router'ın arka yüzü: açma-kapama düğmesi, güç girişi, WAN yazılı tek port ve onu izleyen 1’den 4’e numaralı dört LAN portu. Dört ayrı işin tek kasada birleştiği yüzey burası.

Katman karşılıkları da farklıdır. Router network layer’da, switch data link layer’da çalışır; ağ kartı data link ile physical layer’ı birlikte taşır, repeater yalnızca physical layer’dadır. Ev kutusu en az üç katmanda birden iş görür; adres dağıtan sunucusu ve ayar sayfası da application layer’da çalışır. 28. bölümde 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. Router’ın içinde durur ve router’ın bağlı olduğu bütün alt ağlara hizmet eder.

Aynı kutu çoğu zaman kendini DNS sunucusu olarak da dağıtır: DHCP’nin verdiği DNS adresi kutunun kendi adresidir. Kutu gelen soruları kendisi çözmez, operatörün resolver’ına aktarır ve cevapları bir süre saklar. Yani 3. bölümdeki resolver değil, onun önünde duran bir aracıdır.

Büyük ağlarda iş tersine döner: tek bir DHCP sunucusu onlarca alt ağa hizmet eder. Broadcast router’ı geçemediği için her alt ağın router’ı istemcinin mesajını yakalayıp sunucuya tek hedefli olarak aktarır (DHCP relay). Sabit başlıktaki giaddr alanı bu aracının adresini taşır; sunucu hangi havuzdan adres vereceğine ona bakarak karar verir.

Geçit görevini de router üstlenir. Default gateway, bir bilgisayarın paketlerini başka bir alt ağa iletmek için kullandığı adrestir. Makinelerin de routing tablosu vardır ama ağa bağlı tek router varsa seçilecek bir şey yoktur; 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, Linux’ta ip route ile görürsün. Öteki satırların nereden geldiğini 39. bölümde router’ın 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.

RFC 1918 üç 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; 46. bölümde NAT 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ı link-local (bağ-yerel) adresleme, Windows’taki adı APIPA. Ekranda o adresi görmek, kiralamanın hiç gerçekleşmediğini söylemenin başka bir yoludur.

Kutunun kendi adresini kim veriyor?

Kutu içeriye adres dağıtıyor. Peki kendi adresini nereden alıyor?

Fotoğraftaki portlara dön: dördünde LAN yazıyor, birinde WAN. LAN portlarında kutu sunucu tarafında oturuyor. WAN portunda rolü tersine dönüyor; orada kendisi istemci. Kablo internetinde ve pek çok fiber hatta az önce izlediğin dört mesajı bu kez o gönderiyor. Cevabı veren sunucu operatörün ağında duruyor.

Yani evinde iki kiralama birden yürüyor. İçeride cihazların kutudan kiralıyor, dışarıda kutu operatörden kiralıyor. WAN portundaki adres, internetin geri kalanının seni gördüğü adres.

Operatörün verdiği adres de kiralık. Kira uzun tutulabilir ve çoğu abone yıllarca aynı adresi görür, ama bu bir garanti değil. Modem uzun süre kapalı kalırsa, hat yeniden kurulursa ya da operatör ağını yeniden düzenlerse adres değişir.

Bu değişkenlik çoğu kullanım için sorun çıkarmıyor. Bir siteye bağlanırken adresini karşı tarafa zaten paketin içinde taşıyorsun; kimsenin seni önceden biliyor olması gerekmiyor. Sorun ters yönde başlıyor. Dışarıdan sana bağlanılacaksa adresin dün ne olduğu bugün işe yaramaz: evdeki kameraya uzaktan bakmak, bir oyun sunucusu barındırmak ya da ofise VPN ile girmek bunu gerektiriyor.

Sabit adres bu yüzden ayrı bir ürün olarak satılıyor. Ev aboneliğinde varsayılan dinamiktir; sabit adres kurumsal pakete ya da ücretli bir eke bağlanır. Operatörün dinamiği tercih etmesinin sebebi de adres kıtlığı. Aynı anda bağlı olmayan abonelerin adreslerini havuzda tutmak, her aboneye kalıcı bir adres ayırmaktan daha az adresle çalışıyor.

Bazı erişim ağlarında adres verilmeden önce bir kimlik adımı var. Modeme kullanıcı adı ile parola girmenin sebebi bu: hattın üstünden önce bir oturum açılıyor (PPPoE) ve adres DHCP ile değil, o oturumun kendi pazarlığıyla veriliyor. Türkiye’deki DSL hatları ve pek çok fiber hat böyle çalışıyor. Bir adım ötesi de var: bazı operatörler WAN portuna bile genel adres vermeyip çeviriyi kendi ağlarında yapıyor; 46. bölümde göreceğimiz bu düzende dışarıdan sana hiç bağlanılamıyor. Erişim ağının nasıl kurulduğuna indiğimizde bu adımın neden orada durduğunu da açacağım.

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. Cisco bir router’da show ip dhcp binding dağıttığı kiraların tablosunu, show dhcp lease ise router’ın kendi aldığı kirayı gösterir. 21. bölümde yazdığımız dhcp filtresi bu dört mesajı ayırır; Wireshark 3.0’a kadar aynı filtrenin adı eski protokolden kalma bootp idi.

Aynı çıktıda genel adresini arama; orada yok. Gördüğün adres 192.168 ile başlıyorsa internetin seni onunla görmediği kesindir. Genel adresi ya router’ın WAN durumu sayfasından ya da dışarıdaki bir hizmete sorarak öğrenirsin.

Özet

  • Adres iki yoldan gelir: ya elle yazılır ya da ağa katılma anında bir sunucudan alınır; ikinci yol dört alanı birden doldurur.
  • Kiralama dört mesajdır: istemci broadcast’le arar, sunucu teklif eder, istemci yine broadcast’le 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.
  • Arananın adresi sabit olmalı: yazıcı, kamera ve sunucu gibi kendisine bağlanılan cihazlar sabit adres ister; en temizi adresi cihaza değil sunucuya yazmaktır.
  • Ev kutusu dört iştir: modem, router, switch ve access point aynı kasada birleşmiştir; default gateway olarak yazılan adres o kasanındır.
  • Kutu da kiracıdır: WAN portunda kendisi bir DHCP istemcisidir ve genel adresini operatörden kiralar; ev aboneliğinde o adres dinamiktir, sabiti ayrı bir ürü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 37: Adresin Anatomisi

Ev router’ı 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ı, 23. bölümde MAC adresinde de gördüğümüz gibi, 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 interface’e 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ı. Yalnız bir fark var: zarfta posta kodu ile kapı numarası ayrı satırlarda yazılıdır; IP adresinde ise tek bir sayı vardır ve sınırın nereye düştüğünü adresin kendisi söylemez.

Bir posta ayırma rafı: altı sıra, her sırada dört göz ve her gözün üstünde nereye ait olduğunu söyleyen bir etiket. Adresin ön kısmı gözü seçer, kalanı o gözün ardındaki tek kapıyı bulur.

Bu dört oktet, 20. bölümdeki encapsulation’da üçüncü zarfın, yani network layer başlığının 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   255

Adresle 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 belgeleme bloğuna 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 01000000

Hesabı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:

Aynı adres, iki maske, iki ağ
adres · 203.0.113.7011001011203000000000011100011130100011070maske /24 · 255.255.255.0111111112551111111125511111111255000000000ağ 203.0.113.0makine parçası 8 bitmaske /26 · 255.255.255.19211111111255111111112551111111125511000000192ağ 203.0.113.64makine parçası 6 bitadres aynı kaldı, sınır yer değiştirdi
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.
  1. 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.
  2. /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.
  3. 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.
  4. 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.
  5. 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 frame doğrudan ona yazılır. Eşit değilse paket varsayılan geçide çıkar. Gerçek işletim sistemleri bu karşılaştırmayı ayrı bir adım olarak yapmıyor: kendi ağı routing tablosunda bir satır olarak durur ve karar tablo aramasının içinde verilir. O aramayı 39. bölümde açacağız.

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. Paket bu yüzden geçide, yani 203.0.113.65’e gidiyor: frame’in hedef MAC alanına geçidin adresi yazılıyor, IP başlığındaki hedef ise 198.51.100.9 olarak kalıyor.

Aynı hesap daha eski bir borcu da kapatıyor. Makine 25. bölümde 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 broadcast adresidir. Atanabilir ilk adres ağ adresinden bir sonraki, son adres broadcast adresinden bir öncekidir.

Kartın fabrikadan gelen adresi ve bütün komşuları birden uyandıran broadcast adresi tanıdık. Buradaki broadcast adresi onun network layer’daki karşılığı. Bu adrese eskiden başka bir ağdan da paket gönderilebiliyordu; 1990’ların sonunda tek bir sahte paketi bir ağın bütün makinelerine çoğaltan Smurf saldırıları bununla yapıldı. RFC 2644’ten beri router’lar dışarıdan gelen bu tür broadcast’i varsayılan olarak geçirmiyor.

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 − 2

Sondaki iki, her alt ağın yuttuğu ağ adresi ile broadcast 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:

önekmaskeblok büyüklüğütoplamatanabilir
/24255.255.255.0256256254
/25255.255.255.128128128126
/26255.255.255.192646462
/27255.255.255.224323230
/28255.255.255.240161614
/29255.255.255.248886
/30255.255.255.252442
/31255.255.255.254222
/32255.255.255.255111

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ğ adresiatanabilir aralıkbroadcast adresi
1203.0.113.0.1 - .62203.0.113.63
2203.0.113.64.65 - .126203.0.113.127
3203.0.113.128.129 - .190203.0.113.191
4203.0.113.192.193 - .254203.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 router’ı 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 broadcast adresi ancak bir alt ağda “ötekiler” varken anlamlıdır. Bir hattın iki ucu varsa broadcast yapmaya gerek yok: karşı taraf zaten tek bir makine. Öyleyse iki adresi de interface’e 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; loopback interface’lerinde ve routing 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ümgereken makine
Satış50
Muhasebe25
Depo10
İki router arası hat2

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, broadcast .63.

Muhasebe, 25 makine. 2^5 − 2 = 30 ≥ 25, önek /27, blok 32. İlk boş adres .64; 64, 32’nin katı olduğu için hizalı. → 192.168.10.64/27, kullanılabilir .65-.94, broadcast .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, broadcast .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, broadcast .115.

Sonuç tabloya döküldüğünde:

bölümağaralıkbroadcastboşa giden
Satış192.168.10.0/26.1 - .62.6312
Muhasebe192.168.10.64/27.65 - .94.955
Depo192.168.10.96/28.97 - .110.1114
Hat192.168.10.112/30.113 - .114.1150

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. Boşa giden toplam yine 161 adres, VLSM’dekiyle birebir aynı. Fark, bu kez hepsinin dört bloğun içine hapsolmuş olması: 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 routing protokolünün maskeyi ilanla birlikte taşıması gerekiyor. Taşımayanlar, yani birazdan göreceğin sınıflı düzenin kalıntıları (RIP’in ilk sürümü gibi), aynı ağda iki farklı önek gördüklerinde yanlış karar veriyor. Routing 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 router olmadan birbirine ulaşabilen interface’ler 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, broadcast trafiği. Ağ büyüdükçe broadcast etki alanı büyür ve bütün makineler yoğun broadcast’in 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ı. 1993’e kadar internetin genelinde 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ı multicast 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ıfağ sayısıağ başına makine
A12616.777.214
B16.38265.534
C2.097.150254

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 routing protokollerinde açıkça taşınmasını şart koşuyor. Taşımayan eski protokoller kullanım dışı kaldı.

Bölmenin tersi de var. Komşu ağları tek bir kısa önekte birleştirmeye üst ağ oluşturma (supernetting, rota toplama) deniyor; öneki 3 bit kısaltmak sekiz komşu ağı tek satıra indiriyor. RFC 4632’ye göre paket anahtarlamalı bir ağda routing 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ı; bir adresin hangi bloğa düştüğünü tanımak arıza ararken ilk adımdır:

blokadıne demek
10.0.0.0/8 172.16.0.0/12 192.168.0.0/16özel kullanıminternete çıkmaz; evindeki adres bunlardan biri
127.0.0.0/8loopback (geri döngü)paketi makinenin kendisine gönderir, kabloya hiç çıkmaz
169.254.0.0/16link-localadres sunucusu bulunamayınca makinenin kendine seçtiği alan
100.64.0.0/10operatör NATabonelerin operatörün içindeki adresleri
224.0.0.0/4multicasttek bir makineyi değil, bir grubu adresler
192.0.2.0/24 198.51.100.0/24 203.0.113.0/24belgelemekitaplarda ve örneklerde kullanılmak üzere ayrıldı
255.255.255.255sınırlı broadcastyalnızca bu ağdaki herkes; router 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 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 broadcast: hedefi bilinmeyen ilk konuşmalarda kullanılıyor. Makine daha kendi adresi yokken 36. bölümde adres sunucusunu arıyordu; o mesajın hedefi 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

  • 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 broadcast 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^b alt ağ sayısını, 2^h − 2 alt 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 38: 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 3 Şubat 2011’de bitti. IANA elindeki son beş /8 bloğu beş bölgesel kayıt kuruluşuna birer birer verdi; o günden sonra yeni adres ancak geri kazanımdan ya da devirden geldi. Türkiye’nin de bağlı olduğu RIPE NCC’nin havuzu 25 Kasım 2019’da tamamen boşaldı. 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ı? 5 numarası, gerçek zamanlı ses ve görüntü için denenen Internet Stream Protocol’e (ST) verilmişti; o protokol deneysel 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. Network layer’ının flow kavramını tanıyıp farklı flow’lara farklı davranması istendi. Gerçek zamanlı uygulamalar için başarım yetersizdi, güvenlik protokole sonradan eklenmişti, routing 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 network layer oldu; uygulama ve physical layer 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. Router 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ı flow'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 bit

40 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. Flow etiketi aynı flow’a ait datagramları işaretliyor ama flow’un kesin tanımı yok. Bugün en yaygın kullanımı yük dengeleme: router’lar aynı flow’un paketlerini aynı yola koymak için bu alana bakıyor ve portları bulmak için başlık zincirinin içine inmek zorunda kalmıyor (RFC 6437).

Başlığın hikâyesi ekleme değil, çıkarma. Checksum, parçalama alanları ve seçenek alanı sabit başlıktan çıktı. Checksum’ın çıkmasının sebebi hız: IPv4’te her router TTL’i azalttığı için checksum’ı da her sıçramada yeniden hesaplamak zorundaydı. Link layer’ın CRC’si ve transport layer’ın checksum’ı zaten vardı; IPv6’da UDP checksum’ı bu yüzden isteğe bağlı olmaktan çıkıp zorunlu oldu. Parçalama da yol üstünden kalktı ve yalnızca kaynakta yapılıyor: fazla büyük bir paketle karşılaşan router onu atıp kaynağa “paket çok büyük” mesajı dönüyor. Çıkan alanların yerini bir zincir aldı.

Uzatma başlığı (extension header) altı türde sayılıyor: hop-by-hop seçenekleri, hedef seçenekleri, routing, parçalama, kimlik doğrulama ve şifreli yük. Hop-by-hop seçenekleri yol üstündeki her router 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.

Zincirin sahada bir bedeli var. Birçok firewall ve router uzun bir başlık zincirini sonuna kadar okumayı göze almıyor ve uzatma başlığı taşıyan paketi düşürüyor; RFC 7872’deki ölçüm bu kaybın küçümsenemeyecek boyutta olduğunu gösterdi. Tasarımın esnekliği, yol üstündeki kutuların temkini yüzünden pratikte daralıyor.

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 interface’i gösteriyor. Routing 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ı. Tek fark sınırın yeri: IPv4’te maske sınırı istediği yere çekebiliyordu, IPv6’da alt ağ ile interface arasındaki sınır neredeyse her zaman tam ortadan, 64. bitten geçiyor.

Klasik yöntemde interface kimliği, Modified EUI-64 biçimiyle 48 bitlik MAC adresinden türetiliyor. 23. bölümde kartın fabrikadan gelen adresini görmüştük; bu yöntemde makinenin IPv6 adresinin yarısı orada, kartın üstünde yazıyor. Bugünkü işletim sistemlerinin çoğu bunu artık yapmıyor, çünkü MAC’ten türeyen kimlik cihazı hangi ağa giderse gitsin ele veriyor. Kimlik ya rastgele ama ağa göre sabit bir sayıyla (RFC 7217) ya da düzenli aralıklarla değişen geçici bir sayıyla (RFC 8981) dolduruluyor.

Tek bir /64 alt ağ 2 üzeri 64 interface 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:

önektürne demek
2000::/3global unicastinternette yönlendirilen adres
fe80::/10link-localyalnızca bu kabloda geçerli; router geçirmez
fc00::/7benzersiz yerelkuruma özel, 10.0.0.0/8 bloğunun karşılığı
ff00::/8multicastbir grubu adresler; sonraki dört bit kapsamı verir
::1/128loopbackmakinenin kendisi
::/128belirsizhenüz adresi olmayan makinenin kaynak alanı
64:ff9b::/96NAT64 önekiiçine bir IPv4 adresi gömülür
2001:db8::/32belgelemebu kitaptaki örnekler bu bloktan

Multicast adresinin dördüncü onaltılık basamağı kapsamı taşıyor ve bu, IPv4’te olmayan bir denetim: ff02::1 bu bağdaki bütün düğümleri, ff05::2 bu sitedeki bütün router’ları, ff0e::101 ise küresel kapsamda saat sunucularını (NTP) adresliyor. Bir multicast’in 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 en az /32 verir, operatör bir kuruma /48, ev abonesine çoğu zaman /56 verir ve her alt ağ /64 olur. Ev kullanıcısının elinde 256 alt ağ bulunmasının sebebi budur.

IPv6’da broadcast adresi yok. Kartın adresinde broadcast’in aslında multicast’in özel hâli olduğunu görmüştük; IPv6 o özel hâli tümden attı. Broadcast’in işini multicast devraldı: herkesi uyandıran çağrı yerine yalnızca ilgili grubu uyandıran çağrı var. Bir de yeni bir tür geldi. 16. bölümde 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. Router öneki ilan ediyor, makine interface kimliğini kendi üretiyor, adres ikisinin birleşimi oluyor. Kısa adı SLAAC.

Link-local adres, fe80:: öneki ile interface kimliğinin birleştirilmesiyle üretiliyor ve başka bir bağa iletilmiyor. Router olmasa bile makine komşularıyla konuşabiliyor. 30. bölümde ilişkilendirme biter bitmez kart ağa katılıyordu; link-local adres tam o anda, kimseye sorulmadan hazır oluyor.

Adres kullanılmadan önce çakışma denetiminden geçmek zorunda. Kısa adı DAD (Duplicate Address Detection). Makine adresi önce deneme adresi (tentative) 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.

Adresin iki yarısının nereden geldiğini ve link-local adresle neyi paylaştığını görelim:

SLAAC: sol yarı router'dan, sağ yarı makineden
routeröneki bilen tek tarafsenin makinenMAC 00-1B-44-11-3A-B7Modified EUI-64: araya ff:fe, U/L biti ters21b:44ff:fe11:3ab7interface kimliği · 64 bit · makinedenfe80::link-local önek · router gerekmez21b:44ff:fe11:3ab7aynı interface kimliğirouter ilanı (ICMPv6 134): önek 2001:db8:1:2::/642001:db8:1:2önek · 64 bit · router'dan2001:db8:1:2:21b:44ff:fe11:3ab7kullanmadan önce DAD: komşu isteği (135) sorar, cevap gelmezse adres senin
Sağ yarıyı makine kendisi üretiyor. Interface kimliği 64 bit ve kimseye sorulmadan hazırlanıyor. Klasik yöntemde kartın 48 bitlik MAC adresinin ortasına ff:fe giriyor ve ilk baytın U/L biti ters çevriliyor. Bugünkü işletim sistemlerinin çoğu aynı yeri MAC yerine rastgele bir sayıyla dolduruyor.
  1. Sağ yarıyı makine kendisi üretiyor. Interface kimliği 64 bit ve kimseye sorulmadan hazırlanıyor. Klasik yöntemde kartın 48 bitlik MAC adresinin ortasına ff:fe giriyor ve ilk baytın U/L biti ters çevriliyor. Bugünkü işletim sistemlerinin çoğu aynı yeri MAC yerine rastgele bir sayıyla dolduruyor.
  2. Link-local adres hemen hazır. fe80:: önekine aynı kimlik ekleniyor ve makine daha router görmeden komşularıyla konuşabiliyor. Bu adres bağın dışına hiç çıkmıyor; router ilanını dinlemek için bile önce bu gerekiyor.
  3. Router öneki ilan ediyor. Router ilanı (ICMPv6 134) düzenli aralıklarla ve istek üzerine geliyor; içinde önek, sıçrama sınırı ve bağ parametreleri var. Sol yarının kaynağı bu ilan, bir DHCP sunucusu değil.
  4. İki yarım birleşiyor. Önek ile interface kimliği yan yana geliyor: 2001:db8:1:2:21b:44ff:fe11:3ab7. Sağ yarı link-local adrestekiyle aynı; makine hangi ağa giderse gitsin o yarıyı taşıyor, değişen yalnızca önek.
  5. Kullanmadan önce çakışma denetimi. Adres önce deneme adresi (tentative) sayılıyor. Makine kendi istenen düğüm multicast adresine bir komşu isteği (135) gönderip "bu adres başkasında mı?" diye soruyor; cevap gelmezse adres kesinleşiyor. Kural elle ayar ve DHCPv6 için de geçerli.

Komşu keşfi (Neighbor Discovery) beş ICMPv6 mesajı tanımlıyor: 133 router isteği, 134 router ilanı, 135 komşu isteği, 136 komşu ilanı ve 137 yeniden yönlendirme (redirect). 25. bölümdeki ARP tek bir istek-cevap çiftiydi; onun yerine geçen şey bu beşli.

Komşu isteği iki iş birden yapıyor. Komşunun data link layer adresini öğreniyor. Bellekteki eşlemenin hâlâ geçerli olduğunu da doğruluyor. İkinci iş ARP’ın tanımında yoktu; Linux onu sonradan ARP tablosuna da taşıdı.

Soru bütün ağa da gitmiyor. İstenen düğüm multicast adresi (solicited-node multicast), 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. Router 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. 1 Ocak 1983’te ARPANET bütün makinelerini tek günde eski protokolünden TCP/IP’ye geçirmişti; bugünün internetinde böyle bir gün imkânsız. Bütün router’lar 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. Üçüncü sürümün taslağı yarışa QUIC’i ve DNS’teki HTTPS kaydını da katıyor.

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. 33. bölümde ç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çindeki küçük bir çevirici, uygulamanın açtığı IPv4 soketini IPv6’ya çevirip NAT64’e gönderiyor. ABD’de T-Mobile gibi büyük mobil şebekeler böyle çalışıyor: şebeke IPv6-only, uygulamaların çoğu bunu hiç bilmiyor. Apple da 2016’dan beri App Store’a giren her uygulamanın böyle bir ağda çalışmasını şart koşuyor.

Sayı tarafında iş yavaş yürüdü. Google’ın ölçümünde IPv6 üzerinden erişen kullanıcı oranı 28 Mart 2026’da %50,10 oldu ve on sekiz yılda ilk kez yarı aşıldı. O gün bir cumartesiydi ve bu tesadüf değil: oran hafta sonları yükseliyor, hafta içi düşüyor. Evden ve telefondan bağlananlar büyük ölçüde IPv6’lı, şirket ağları hâlâ çoğunlukla IPv4’lü. Türkiye geriden geliyor: APNIC Labs’in Eylül 2026 ölçümünde kullanıcıların yaklaşık beşte biri IPv6 kullanabiliyor ve operatörler arasındaki fark çok büyük. Vodafone’da oran yarıyı aşarken Türk Telekom’un sabit ağında üçte bir, Turkcell’de yedide bir civarında. Yayılma 25 yılı aştı, hâlâ sürüyor. Aynı sürede application layer baştan aşağı değişti: web, sosyal medya, video akışı, oyun, uzaktan görüşme. Sebebi de bu farkta. Uygulama tek tarafta değişebiliyor, network layer sürümü herkesin birlikte değişmesini istiyor.

Kendi makinende bakabilirsin. Linux’ta ip -6 addr show fe80:: ile başlayan link-local 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

  • 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 interface’i gösterir.
  • Makine adresini kendi üretir: router öneki ilan eder, makine kimliği ekler, çakışma denetimi onaylar.
  • Geçiş yan yana yaşamaktır: çift yığın, tünel ve çeviri (NAT64, 464XLAT) iki sürümü aynı internette birlikte tutar; bayrak günü yoktur.

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 router, hedefe giden yolun tamamını biliyor mu?

Bölüm 39: Router Mimarisi

Yolun tamamını bilen bir makine yok. Paketi alan router (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?

Router içeride kaç iş yapıyor?

Network layer’ın iki ayrı işi var. Tek bir paketi doğru kabloya itmeye iletme (forwarding), o kabloyu söyleyen tabloyu doldurmaya routing demiştim; ikisi kutunun içinde ayrı yerlerde yaşıyor. İletme her kutuda ayrı koşan veri düzleminin (data plane) işi, routing ağ çapında çalışan kontrol düzleminin (control plane). 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 (switch fabric), çıkış portları ve bir routing 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; routing 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 frame’inin telde 84 bayt yer kapladığını 22. bölümde görmüştük. 10 Gbit/s’lik bir hatta bu frame’lerden tam yükte saniyede yaklaşık 14,9 milyon tanesi geçiyor. Paket başına işlem bütçesi 67 ns; bugünkü 400 Gbit/s’lik bir portta 1,7 ns’ye iniyor. Giriş portunun hedefi işini hat hızında bitirmektir; yetişemezse tampon dolar ve paket düşer. Router’ın 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 router’dan 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 yenilenmek zorunda. Router onu baştan hesaplamaz; RFC 1624’teki artımlı yöntemle yalnızca değişen alanın farkını ekler. 38. bölümde IPv6’nın başlık sağlamasını tümden atmasının sebebi de bu iş yüküydü.

Tablodaki bir satır ne söylüyor?

Routing tablosundaki her satır dört şey taşır: ağ hedefi, alt ağ maskesi, bir sonraki durak ve çıkış interface’i. 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ı router’a ulaştığında dağıtımı o yapar.

Tablonun ilk satırlarını ise kimse yazmamıştır. Router’ın bir ağa fiziksel olarak bağlı interface’i 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: RIP’te atlama sayısı, OSPF’te bağlantı hızından türetilen bir maliyet. 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 router’ının tablosundaki karşılığı bu satır.

Aslında ortada iki tablo var ve adları ayrı. Routing protokollerinin öğrendiği her şeyin toplandığı, aday yolların yan yana durduğu tabloya RIB (Routing Information Base) deniyor. Karar verilip donanıma indirilen, iletmenin gerçekten baktığı sadeleşmiş kopyaya ise FIB (Forwarding Information Base). 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. 2. bölümde iletme tablosu (forwarding table) demiştim; ders kitaplarının bu adla anlattığı şey FIB’dir. Türkçede ikisine de çoğu zaman yönlendirme tablosu denir, ayrım RIB’in yazılımın öğrendiği, FIB’in donanımın okuduğu tablo olmasında.

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 routing protokollerinden öğrenilmiş satırlardır. Bu satırların oraya nasıl geldiğini burada bırakıyorum; router’ların aynı haritada nasıl yakınsadığını 42. bölümde göreceğiz.

Gerçek bir tablo neye benziyor?

Şimdiye kadar tabloyu tarif ettim; artık bakma zamanı. Aşağıdaki çıktı bir kenar router’ın tablosu ve her satırı okumaya değer:

Gateway of last resort is 203.0.113.2 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 203.0.113.2
      10.0.0.0/16 is subnetted, 1 subnets
O        10.20.0.0 [110/65] via 203.0.113.2, 00:14:22, Serial0/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
S     198.51.100.0/24 [1/0] via 203.0.113.2
      203.0.113.0/24 is variably subnetted, 2 subnets, 2 masks
C        203.0.113.0/30 is directly connected, Serial0/0/0
L        203.0.113.1/32 is directly connected, Serial0/0/0

Baştaki harf satırın nereden geldiğini söylüyor:

harfkaynakadministrative distance
Cdoğrudan bağlı ağ0
Linterface’in kendi adresi, /32 yerel yol0
Selle yazılmış statik yol1
OOSPF ile öğrenilmiş110
RRIP ile öğrenilmiş120
BBGP ile öğrenilmiş20 / 200

Köşeli parantezin içindeki iki sayı da ayrı şeyler söylüyor: soldaki administrative distance, sağdaki metrik. İkisini karıştırmak yaygın bir hata. Administrative distance 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. OSPF satırındaki 65 de bir toplam: seri hattın maliyeti 64, arkadaki Ethernet’inki 1. OSPF maliyeti bağlantı hızından hesaplıyor; yavaş hat pahalı.

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 frame 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 bir Linux router’daki 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.1

proto 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 interface değil. Router o paketi kabloya koyabilmek için hangi interface’ten çı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 network layer’da değil. Çıkış interface’i ile bir sonraki durağın IP adresi belli; kabloya yazılacak frame’in hedef MAC adresi ise belli değil. Komşunun donanım adresini soran mekanizmayı 25. bölümde görmüştük. Tek bir paketin iletilmesi bu yüzden üç ayrı aramaya dayanıyor: hedef için önek eşleşmesi, bir sonraki durak için özyinelemeli arama ve komşu için adres çözümlemesi.

Gerçek router’lar bu üçünü her pakette yeniden yapmaz. FIB kurulurken özyineleme bir kez çözülür, komşunun MAC adresi de frame’e yazılacak hazır bir başlık olarak satıra iliştirilir. Paket başına tek bir arama kalır. RIB ile FIB’in ayrı tablolar olmasının asıl sebebi bu.

İki adres çifti, iki ayrı ömür

Üç aramanın sonucuna bir de paketin gözünden bakalım, çünkü ağ öğrenirken en çok karıştırılan yer burası.

Diyelim ki bir paket A’dan çıkıp iki router geçerek B’ye varıyor. Yolculuğun tamamında IP adresleri hiç değişmiyor: kaynak A, hedef B, ilk kabloda da son kabloda da. Değişen şey frame’in adresleri. Her kabloda frame baştan yazılıyor ve iki MAC alanı yalnızca o kablonun iki ucunu gösteriyor.

kablokaynak MAChedef MACkaynak IPhedef IP
A — Y1AY1AB
Y1 — Y2Y1Y2AB
Y2 — BY2BAB

Sağdaki iki sütun sabit, soldaki iki sütun her satırda değişiyor. Sebebi katmanların iş bölümü: IP adresi yolculuğun iki ucunu adlandırıyor, MAC adresi ise yalnızca içinde bulunduğu kablonun iki ucunu. Frame bir kablonun ötesine geçemiyor, paket geçiyor.

Bunun iki somut sonucu var. Hedefin donanım adresini yol boyunca hiçbir router bilmiyor ve bilmesi de gerekmiyor; her biri yalnızca bir sonraki komşusununkini biliyor. İkincisi, B’ye varan frame’in kaynak MAC alanında A değil son router yazıyor; B, A’nın donanım adresini hiçbir zaman görmüyor.

Tablo yalnızca router’lara 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 portların toplam yükünü aynı 67 ns’lik bütçenin içinde tek başına işlemek 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.

Bir taşıyıcı router'ın hat kartı: ön kenarında dört fiber port, kartın üstünde yongalar ve bellek modülleri. İletme tablosunun kopyası bu kartın üstünde durur ve çıkış portu merkeze sorulmadan burada bulunur.

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ı kısa. 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:

önekkapsadığı adresçıkış interface’i
203.0.113.0/242561
203.0.113.128/251282
203.0.113.160/27323
0.0.0.0/0hepsi0

Hedef 203.0.113.170 gelsin. Üç özgül satır da uyar. Son oktet 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ü interface’e gider.

Hedef 203.0.113.140 için sonuç değişir: son oktet /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:

Aynı adres üç satıra uyduğunda hangisi kazanıyor
iletme tablosuher adrese uyar203.0.113.170gelen datagramın hedef adresi203.0.113.0/24256 adresarayüz 1203.0.113.128/25128 adresarayüz 2203.0.113.160/2732 adresarayüz 30.0.0.0/0bütün adreslerarayüz 0üçüncü interfaceeşleştieşleştien uzun eşleşme
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.
  1. 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.
  2. İlk satır tutuyor. Adresin ilk üç okteti satırınkiyle aynı, yani /24 öneki eşleşiyor. Bu satır tek başına kalsaydı paket birinci interface'den çıkacaktı.
  3. İkinci satır da tutuyor. Son oktet 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.
  4. 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.
  5. Karar çıkışa dönüşüyor. Paket üçüncü interface'e 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 (TCAM) 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ığı 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. İnternetin tam tablosunu taşıyan büyük router’ların çoğu bu yüzden TCAM’i yalnızca bir kısım için kullanıyor, geri kalanını ağaç biçimli algoritmik aramalarla sıradan belleğe sığdırı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 43. bölümde, 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 router’da istenen değer hat hızının N katıdır. Dokunun üç ana türü var.

Birincisi bellek üzerinden anahtarlama. İlk kuşak router’lar 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 router’ında bu tavan 32 Gbit/s’lik bir veri yoludur.

Üçüncüsü ara bağlantı ağı. Büyük bir switch, daha küçük switch’lerin birkaç aşamasından kurulur; çapraz çubuk ve Clos ağları bu aileye girer. Fikir de yeni değildir. Clos ağının adı, 1953’te bu düzeni telefon santralleri için öneren Bell Labs mühendisi Charles Clos’tan geliyor; aynı fikir sonra çok işlemcili bilgisayarlarda işlemcileri bağlamak için kullanıldı. Bugünkü veri merkezlerinin leaf-spine ağları da onun bina ölçeğindeki hâli.

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ı router’ın 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 15. bölümde application layer’da 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. Bugünkü büyük router’lar bunu her giriş portunda her çıkış için ayrı bir kuyruk tutarak çözüyor (virtual output queue); öndeki paket beklerken başka çıkışa gidenler kendi kuyruklarından akabiliyor.

Çı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 40. bölümde açacağız.

2. bölümde 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

  • İ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.
  • Administrative distance 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.
  • IP sabit kalır, MAC her atlamada değişir: IP adresleri yolculuğun iki ucunu adlandırır, MAC adresleri ise yalnızca içinde bulunduğu kablonun iki ucunu.
  • 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.

Router 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 40: Kuyruk Yönetimi

Router çı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.

2. bölümde 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: router’da 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; adı trafik yoğunluğu. 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. Rastgele varışlar varsayan en basit modelde ortalama bekleme, tek paketin iletim süresinin oran / (1 − oran) katı. Oran 0,5’teyken bu bir paket süresi; 0,96’da 24 paket süresi, yani yaklaşık 2,9 ms. Kapasite planlamasında “yetiyor” ile “rahat” arasındaki fark 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; ama rampada 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 RTT (gidiş-dönüş süresi) ile hat kapasitesinin çarpımı kadar seçmeyi öneriyor. Kuralın örnek olarak aldığı RTT 250 ms; 10 Gbit/s’lik bir hat için bu 312,5 MB tampon demek. 2004’teki bir çalışma aynı çarpımın flow sayısının kareköküne bölünebileceğini gösterdi. Aynı hatta 100 flow varsa gereken tampon onda birine iniyor, çünkü flow’ların tepe noktaları aynı ana düşmüyor.

Fazla tamponu bir iyilik sanma. Hiç boşalmayan uzun bir kuyruk RTT’yi 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. Adı bufferbloat ve en çok ev router’larında göze çarpıyor. Evde büyük bir dosya yüklerken görüntülü görüşmenin donmasının sık rastlanan sebebi bu: yükleme, modemin şişkin tamponunu doldurup herkesin paketini yüzlerce milisaniye bekletiyor.

Kuyruk hesabının iki girdisi soyut da kalmıyor; bir router’ın interface 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,
  ...
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)

Çıkış kuyruğu 40 paketlik, giriş kuyruğu 75 paketlik. Hattın kapasitesi 1.544 Kbit/s ve interface’in MTU’su 1.500 bayt. MTU bir data link layer 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. Bu interface’te FIFO elle seçilmiş; Cisco bu hızdaki seri hatlarda varsayılan olarak birazdan göreceğimiz ağırlıklı adil kuyruğu açıyor.

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çenek kuyruk dolmadan davranmak. RED (Random Early Detection), kuyruk uzadıkça artan bir olasılıkla paketleri erkenden atıyor ya da ECN (Explicit Congestion Notification) açıksa atmak yerine işaretliyor. 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 (AQM) mekanizması uygulamasını istiyor.

Yaygın uygulamalarından biri RFC 8290’da tanımlı FQ-CoDel. Flow kuyruklamayı CoDel etkin kuyruk yönetimiyle birleştiriyor; varsayılan hedef gecikmesi 5 ms, ölçüm aralığı 100 ms. Farklı flow’ların paketlerini birbirine karıştırdığı için ani trafiğin ürettiği baş engellemesinin etkisini de azaltıyor. Linux dağıtımlarının çoğunda varsayılan kuyruk disiplini bugün bu. Daha yeni bir adım da atıldı: 2023’te yayımlanan L4S (RFC 9330-9332) ECN işaretini çok daha erken ve sık kullanarak kuyruk gecikmesini milisaniye düzeyine indirmeyi hedefliyor ve operatörler onu 2025’te sahada açmaya başladı.

İş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ı (DSCP), 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. Router 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 interface çı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:

Aynı altı paket, üç ayrı zamanlama politikası
çıkış sırasıvarışsırasıyedek 1yedek 2ses 1yedek 3ses 2yedek 4sınıfkuyruklarıses kuyruğuiki paket bekliyoryedekleme kuyruğudört paket bekliyorFIFOyedek 1yedek 2ses 1yedek 3ses 2yedek 4öncelikses 1ses 2yedek 1yedek 2yedek 3yedek 4ağırlıklıkuyruk 2:1yedek 1yedek 2ses 1yedek 3yedek 4ses 2
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?
  1. 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?
  2. 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.
  3. 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.
  4. Ö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.
  5. 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 flow saniyede kaç bit gönderebilir? Bu ikincisinin mekanizması ayrı ve adı jeton kovası.

Fikir tek bir resimle anlaşılıyor. Her flow 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ı flow’u boğmuyor, kısa süreli patlamalara izin veriyor. Sessiz kalan bir flow “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ı saniyelerde harcanan şey, kovada birikmiş b.

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 network layer servis modeli de hâlâ best effort. Datagramın hedefe ulaşacağına, sırasına, zamanlamasına ve flow’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, arabelleğe alınan video ile web gezinme için 300 ms azami gecikme hedefi tanımlıyor. 5G bu tabloya endüstriyel denetim ve araç haberleşmesi için 5 ms’ye kadar inen sınıflar ekledi. Ses sınıfının telefon görüşmesinde nasıl kullanıldığını 74. bölümdeki VoLTE’de göreceksin.

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ı 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ı; 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ı. Ocak 2025’te ise bir federal temyiz mahkemesi 2024 kuralını iptal etti ve geniş bant erişimin telekomünikasyon değil bilgi hizmeti olduğuna hükmetti. Hukuki çerçeve on yılda dört kez değişti. Avrupa Birliği ise tarafsızlığı 2016’dan beri yürürlükte olan bir tüzükle yasaya bağladı.

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

  • 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; taştığında hem gecikme hem kayıp üretiyor.
  • Tampon iki yönlü bir bedel: azı kayıp, fazlası gecikme demek; fazlasının faturası, bufferbloat, en çok ev router’larında ö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.
  • Hızı jeton kovası sınırlıyor: r uzun vadeli ortalamayı, b patlamayı belirliyor; tarifendeki hız çoğu zaman bir r değeri.

Çı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 41: Cihaz Yapılandırma

Masanın üstünde iki router 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 router’a klasik olarak üç yoldan bağlanılır: konsol portu, ağ üzerinden uzak oturum (eskiden telnet, bugün SSH) 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 interface’leri EIA-232 seri standardını kullanır. Bugünkü dizüstülerde seri port kalmadığı için araya bir USB-seri dönüştürücü giriyor; yeni cihazların çoğunda da doğrudan USB konsol portu var. EIA-232’nin neden hâlâ ayakta olduğunu ve bitleri tek telden nasıl dizdiğini 52. bölümde açacağım. 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.

Bir ucunda RJ-45 fişi, öbür ucunda seri konnektör bulunan açık mavi Cisco konsol kablosu. Ağ portuna değil cihazın yönetim yuvasına takılan, ağ tümüyle çöktüğünde ayakta kalan tek fiziksel yol.

Ş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 uzak oturumlar için. Ayrıcalıklı kipin iki şifresinden enable secret olanı geri çevrilemeyen bir özet (hash) olarak saklanır; ikisi birden tanımlıysa geçerli olan odur. Öteki, enable password, yapılandırmada düz metin durur. Onu gizleyen service password-encryption komutu yalnızca zayıf bir karıştırma uygular; bu “type 7” değeri saniyeler içinde geri çevrilebilir.

Konsol şifresi line console 0 kipine geçilip password ve login komutlarıyla konur. login önce yazılırsa cihaz, şifre konana kadar girişin kapalı olduğunu söyleyen bir uyarı verir. Uzak oturum ve yardımcı port şifresini koyabilmenin yolu ise önce konsoldan girmektir; küçük ağlarda ilk temas fiziksel olmak zorunda. Büyük ağlarda kutudan yeni çıkan cihaz yapılandırmasını bir sunucudan kendisi çekebiliyor (zero-touch provisioning); orada ilk temas bile fiziksel değil.

Uzak oturum tarafında akılda kalan bir sayı var: sahadaki alışkanlık beş sanal terminal. Şifre satırı bu yüzden çoğu örnekte line vty 0 4 diye yazılır ve sıfırdan dörde kadar beş terminali birden kapsar. Birçok cihazda ise 16 terminal vardır; yalnızca ilk beşini kilitleyip line vty 5 15 aralığını unutmak klasik bir güvenlik hatası. 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 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 (trust on first use). 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 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. Protokolü 1995’te, üniversitesinin ağında parolaları dinleyerek toplayan bir saldırıdan sonra Tatu Ylönen yazdı.

SSH kuantum sonrası döneme de erken hazırlandı. OpenSSH 2022’den beri klasik ile kuantuma dayanıklı bir yöntemi birleştiren hibrit anahtar değişimini varsayılan yapıyor; Nisan 2025’teki 10.0 sürümünde 10. bölümdeki TLS grubunun akrabası olan ML-KEM tabanlı yönteme geçti.

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.

Buradan çıkan güvenlik dersi açık: cihaza fiziksel olarak dokunabilen, ona sahip olur. Router’ların kilitli dolaplarda durmasının sebebi bu. Bazı modellerde bu kurtarma yolu no service password-recovery ile kapatılabiliyor; o zaman şifreyi unutanın elinde yalnızca yapılandırmayı tümden silmek kalıyor.

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?

Router’ın üstünde bir işletim sistemi çalışır ve bu sistem yalnızca paket iletmez; cihazdaki hafızayı, işlemciyi ve interface’leri (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. Arista gibi üreticiler bu sözdizimine çok yakın bir kabuk sunuyor; Juniper’ın Junos’u ise bambaşka, hiyerarşik bir dil konuşuyor.

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.

promptkiporadan 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ırmacihazın tamamını ilgilendiren ayar yazılır
Kenar(config-if)#interface yapılandırmatek bir interface’in ayarı yazılır

Kutudan çıkan her router’ın 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.

Interface neden kapalı geliyor?

Genel yapılandırma kipinden interface komutuyla tek bir interface’in kipine inilir; interface 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ı interface’e 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 sık unutulan satır geliyor. Router’da bütün interface’ler varsayılan hâliyle kapalı gelir ve açan komut no shutdown’dır. Switch’te tersi geçerli: portlar açık gelir, çünkü switch’in işi kutudan çıkar çıkmaz çalışmak. 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.

Interface durumu da tek değil çift sayıdır.

durumne demek
up/upçalışıyor
up/downkablo takılı ama data link layer anlaşamıyor: kapsülleme ya da saat uyuşmuyor
down/downphysical layer’da sorun var: kablo ya da karşı uç yok
administratively downsen kapatmışsın

Bir interface 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 interface’inde bir yük daha var. Saat işaretini taşıyan uç DCE’dir (data communications equipment) ve hız orada clock rate ile verilir; ders örneğinde bu değer 128000 bit/s. Karşı uç, yani DTE, saati dinler ve orada böyle bir komut yoktur. LAN interface’inde bu iş hiç çıkmaz. Seri hatlar bugün sahada azaldı; laboratuvar ve eski WAN bağlantıları dışında yerlerini Ethernet aldı.

Tabloya elle bir satır yazmak

Interface’e 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. Switch’in MAC öğrenme tablosunu kimse yapılandırmıyordu; tablo duyulan kaynak adreslerden kendiliğinden doluyordu. Burada öyle bir kendiliğindenlik yok. Statik routing 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 router’ın adresi. Üçüncünün yerine paketin çıkacağı interface’in 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 broadcast 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.1

Dış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.2

Routing 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 39. bölümde gördüğümüz administrative distance karar verir ve küçük olan kazanır. Doğrudan bağlı interface 0, statik yol 1, routing protokollerinden öğrenilmiş yollar 20 (dış BGP) ile 120 (RIP) 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. Hat tamamen koparsa, yani interface düşerse, bir sonraki durak çözülemez hâle gelir ve satır tablodan kendiliğinden çekilir. Asıl tehlike sessiz arıza: interface ayakta ama ötesindeki yol ölü. Araya bir switch girmiş ve karşıdaki router çökmüşse tablo bunu fark etmez, paketleri boşluğa yollamayı sürdürür. Statik yolların bir izleyiciye bağlanabilmesinin sebebi bu; Cisco’da bu izleyicinin adı IP SLA.

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 interface’lerin adreslerini kısaca, show interfaces interface istatistiklerini listeler.

Kenar# show ip route
...
Gateway of last resort is not set

      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
S     198.51.100.0/24 [1/0] via 203.0.113.2
      203.0.113.0/24 is variably subnetted, 2 subnets, 2 masks
C        203.0.113.0/30 is directly connected, Serial0/0/0
L        203.0.113.1/32 is directly connected, Serial0/0/0

Satır başındaki C ile S kaynağı ayırır, L satırları interface’lerin kendi adresleridir; köşeli parantezdeki çift ise administrative distance 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ı interface’i, 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 RTT 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 listesidir. copy running-config startup-config yazılmadan hiçbir düzenleme yeniden başlatmadan sağ çıkmaz. Aynı işin eski kısaltması write memory hâlâ çalışıyor ve sahada daha çok o yazılıyor.

Özet

  • 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.
  • Interface kapalı doğar: adresi verilmiş bir interface no shutdown yazı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 router’da bu satırları kim elle yazacak?

Bölüm 42: Routing 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.

Router’lar 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 router’lar (yönlendiriciler), kenarlar da aralarındaki hatlar oluyor. Her kenarın bir maliyeti var; o maliyeti ya ağı işleten kişi elle belirliyor ya da protokol bağlantı hızından bir formülle türetiyor. 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.

39. bölümde bir paketin çıkış portu, routing tablosundan en uzun önek eşleşmesiyle bulunuyordu. O tabloyu dolduran hesap her router’da ayrı ayrı dönüyor; ortada işi dağıtan merkezî bir beyin bulunmuyor.

Link state (bağlantı durumu) algoritmalarında her router 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 router 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: 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 router onu uygularken elinde iki sayı bulunur. Birini kendisi bilir: komşuya giden hattın maliyeti. Ötekini yalnızca duyar: komşunun aynı hedefe biçtiği bedel. İ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. Router 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 routing 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. Gerçek RIP değişiklikte beklemeden tetiklenmiş güncelleme yolladığı için bu süre pratikte kısalıyor; ama döngü kurulduğu sürece o hedefe giden paketler iki router arasında gidip geliyor ve TTL’leri bitince düşüyor.

İki savunma geliştirildi. Split horizon (bölünmüş ufuk) tek bir kuraldır: bir komşudan öğrenilen yol, o komşuya bakan interface’ten geri ilan edilmez. Poison reverse bir adım daha atar. Router 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 router’ların 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 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 seçimler de yapıldı. Cisco’nun IGRP’si çok daha geniş bir metrik kullandı ve saymayı ayrı bir atlama sınırıyla durdurdu; bu sınırın varsayılanı 100, üst değeri 255’ti. Halefi EIGRP ise sorunu kökten çözdü. DUAL adlı algoritması, döngü kurmayacağı kanıtlanmış bir yedek yol yoksa yolu kullanmayı bırakıp komşularına soruyor; sayarak sonsuza gitme orada hiç yaşanmıyor. Aynı denklem, başka bir bedel: yakınsama bu kez sorguların ağda dolaşmasını bekliyor.

Sonraki kuşaklar döngüyü başka kurallarla da yasakladı. Kablosuz sensör ağlarının RPL’i her düğüme köke uzaklığını anlatan bir sayı veriyor ve bu sayısı kendisininkinden küçük olmayan bir komşuyu ebeveyn seçmeyi yasaklıyor (77. bölüm). Altyapısız mobil ağların AODV’si ise her yola hedefin ürettiği bir sıra numarası ekliyor; eski haber yeni haberin yerini alamıyor (80. bölüm).

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. Bugün pek az ağda koşuyor; yine de algoritmanın en sade örneği olduğu için öğretmeye değer.

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 frame’inin üçte birinden azdır. RIP UDP tabanlıdır ve 520 numaralı portu kullanır. Protokolü kernel değil, uygulama düzeyinde koşan routed adlı sıradan bir süreç yürütür; süreç hesapladığı yolları kernel’daki tabloya yazar. Bugün Linux’ta aynı işi FRRouting ya da BIRD gibi süreçler yapıyor.

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 router’lar zamanla aynı anda güncelleme göndermeye başlar. Floyd ile Jacobson 1993’te bu kendiliğinden eşzamanlanmayı ölçtü; RFC 2453 bu yüzden ya yükten etkilenmeyen bir saat ya da her kurulumda 0-5 saniyelik rastgele bir kayma istiyor.

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

Sürüm farkı tek cümlede kapanıyor. RIPv1 güncellemelerde alt ağ maskesini taşımaz, RIPv2 taşır. 37. bölümde maske adresi ağ ve makine parçasına bölüyordu; maskesiz bir ilan, /27 gibi bir ağı komşusuna hiç anlatamaz. Tuzağı da burada: Cisco’da yukarıdaki üç satır RIPv1’i çalıştırır. İkinci sürüm için version 2 satırı, sınıflı özetlemeyi kapatmak için de no auto-summary gerekir.

Aynı harita, ayrı ağaçlar

Link state’te (bağlantı durumunda) her router kendi yerel durumunu bilir: hangi interface’leri açık, hangi komşulara erişebiliyor. Bu yerel durumu sel yayılımıyla (flooding) ağın tamamına dağıtır. Yayılan şey haritanın tamamı değil, router’ın kendi komşuluklarını anlatan küçük bir ilan. Haritayı her router bu ilanları birleştirerek kendisi kuruyor.

Yayılım bittiğinde herkesin elinde birebir aynı harita durur. Sonra herkes o haritadan kendi ağacını çıkarır. Edsger Dijkstra’nın 1956’da yirmi dakikada tasarladığını anlattığı döngü 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ş router’lı 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 router’ın kendi ağacını nasıl çıkardığını görelim:

Aynı veritabanından üç ayrı tablo nasıl çıkıyor
yerel durum · her düğüm yalnızca kendi hatlarını bilirAB'ye 2 · C'ye 5BA'ya 2 · C'ye 1CA'ya 5 · B'ye 1sel yayılımı · her ilan alandaki herkese ulaşırveritabanıA-B 2 · A-C 5 · B-C 1veritabanıA-B 2 · A-C 5 · B-C 1veritabanıA-B 2 · A-C 5 · B-C 1A'nın tablosuC'ye: B üzerinden 3B'nin tablosuC'ye: doğrudan 1C'nin tablosuA'ya: B üzerinden 3
Herkes kendi hattını bilir. Üç router'ın elinde yalnızca kendi interface'lerinin maliyeti var. A, C'ye giden 5 maliyetli hattını bilir; B ile C arasındaki 1 maliyetli hattan haberi yoktur.
  1. Herkes kendi hattını bilir. Üç router'ın elinde yalnızca kendi interface'lerinin maliyeti var. A, C'ye giden 5 maliyetli hattını bilir; B ile C arasındaki 1 maliyetli hattan haberi yoktur.
  2. İlan sel yayılımıyla dağılır. Her router kendi yerel durumunu alanın tamamına gönderir. Gönderilen şey tablonun tamamı değil, router'ın kendi komşuluklarını anlatan küçük bir ilan.
  3. Üç 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.
  4. Herkes kendini kök alır. Aynı haritadan her router ayrı bir en kısa yol ağacı hesaplar. Kök her seferinde hesabı yapan düğümün kendisidir.
  5. 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. IPv6 için yazılan sürüm 3 ise RFC 5340’ta. 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 router kümesidir. Büyük operatör omurgalarında aynı aileden IS-IS de sık koşuyor; 18. bölümde onu OSI yığınından sağ kalan parçalardan biri olarak anmıştık.

Taşıma tarafı RIP’ten ayrılıyor. OSPF doğrudan IP üzerinde koşar ve protokol numarası 89’dur. İki multicast adresi kullanır: 224.0.0.5’i OSPF koşan her router dinler, 224.0.0.6’yı yalnızca atanmış router 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 router 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. Sahada en sık görülen takılma MTU uyuşmazlığı: iki uç Hello’da anlaşır ama veritabanı alışverişinde, Exstart ya da Exchange aşamasında takılı kalır.

Yayın ağlarında bir atanmış router (designated router, DR) 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 router’ları kendi alanlarındaki uzaklıkları özetleyip omurgada ilan eder. Bir router 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 router’lı 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. Sahada ilk yapılan ayarlardan biri bu yüzden referans değeri büyütmek: auto-cost reference-bandwidth 100000 ile 100 Gbit/s’lik hat 1, gigabit hat 100 olur.

Şimdi aynı hedefe giden iki yolu yan yana koy.

yolatlamaRIP metriğiOSPF cost
iki adet 10 Mbit/s hat2220
üç adet 1 Gbit/s hat333

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 administrative distance’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
...
      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
R     198.51.100.0/24 [120/2] via 203.0.113.2, 00:00:11, Serial0/0/0
      203.0.113.0/24 is variably subnetted, 3 subnets, 3 masks
C        203.0.113.0/30 is directly connected, Serial0/0/0
L        203.0.113.1/32 is directly connected, Serial0/0/0
O        203.0.113.64/26 [110/65] via 203.0.113.2, 00:04:52, Serial0/0/0

show ip ospf database komutu ise haritanın kendisini listeler: Link ID, ilanı gönderen router, 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 router 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 router, bütün trafiği kendine çeker.

Link state de kusursuz değil. 27 Ekim 1980’de ARPANET, tek bir router’ın bozuk belleğinin ürettiği üç ilanın sıra numaraları birbirini sonsuza dek geçtiği için saatlerce çöktü; olay RFC 789’da ayrıntısıyla anlatılıyor. OSPF’teki yaş alanı ve sıra numarası kuralları o günün dersleri.

Özet

  • 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 router 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.

Router’lar 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 43: Kontrol Düzlemi ve SDN

Router’lar 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 routing algoritmasının bir parçasını kendi içinde koşturur; parçalar birbiriyle konuşarak tabloyu hesaplar. Adı router başına kontrol. 42. bölümde link state ilanları bütün otonom sisteme taşını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. Router 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 router 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: Cisco’da IOS, Juniper’da Junos.

Ayrımın kendisi yeni sayılmaz. İletme veri düzleminde, routing 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 39. bölümde duruyordu: o altı basamaklık hız farkı iki dünyayı aynı gövdede yan yana tutuyor. Kontrol düzlemini yeniden düşünme ilgisi 2005 civarında 4D ve RCP adlı araştırma projeleriyle canlandı; 2007’de Stanford’da Ethane geldi. 2008’de yayımlanan OpenFlow makalesi fikre bir protokol verdi ve yazılım tanımlı ağ (SDN) adı o yıllarda yerleşti.

Kararın kutunun içinde ve dışında durduğu iki düzeni yan yana koyalım:

Aynı ağ, iki kontrol mimarisi
router başına kontrolmantıksal olarak merkezî kontroliletmeiletmeiletmer1r2r3akış tablosuakış tablosuakış tablosus1s2s3routingroutingroutingdenetleyicitabloyu burada hesaplıyor
Aynı ağ, iki ayrı kuruluş. Solda üç router, sağda üç switch. Alt yarıları aynı işi yapıyor: gelen paketi bir tabloya bakarak çıkışa veriyorlar. Fark üst yarıda başlıyor.
  1. Aynı ağ, iki ayrı kuruluş. Solda üç router, sağda üç switch. Alt yarıları aynı işi yapıyor: gelen paketi bir tabloya bakarak çıkışa veriyorlar. Fark üst yarıda başlıyor.
  2. Solda karar kutunun içinde. Router başına kontrolde her kutu routing 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.
  3. 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.
  4. Sağda karar yukarı taşınıyor. Switch'lerin içinde routing yazılımı kalmıyor. Karar mercii tek: mantıksal olarak merkezî bir denetleyici. Kendisi fiziksel olarak birden çok sunucuya yayılabilir.
  5. Denetleyici tabloyu kuruyor. Hesap tek yerde bitiyor, sonuç aşağı iniyor. Denetleyici güneye bakan API üzerinden yalnızca güncellenmesi gereken switch'lere yeni flow 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: data link, network ve transport layer alanları aynı kuralda yan yana gelir.

Flow 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 switch’inin dört portu için:

öncelikeşleşmeeylem
200kaynak 198.51.100.0/24, hedef 203.0.113.0/24, TCP hedef portu 80forward(4)
200kaynak 198.51.100.0/24, hedef 203.0.113.0/24, TCP hedef portu 443forward(3)
100hedef 203.0.113.0/24forward(3)
0bütün alanlar jokerCONTROLLER

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 ve paket 4 numaralı porttan çıkıyor. Aynı adres çifti arasında hedef portu 22 olan bir paket ise yalnızca 100 önceliğindeki kayda uyar ve 3 numaralı porttan çıkar. Aynı hedefe giden iki paket, iki ayrı porttan çıktı.

Her flow 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. Router en uzun hedef önekine bakar, switch hedef MAC adresine. Firewall 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 switch 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:

katmanalanlar
—giriş portu
data linkkaynak MAC · hedef MAC · tür alanı · VLAN kimliği · VLAN önceliği
networkkaynak IP · hedef IP · protokol · hizmet türü
transportkaynak 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. Sonraki sürümlerde liste kırkı aştı; IPv6 adresleri, MPLS etiketi ve ARP alanları da eklendi.

Şimdi bunu routing tablosuyla karşılaştır. Orada tek bir alan, hedef IP vardı; eylem de tekti: bir sonraki durağa ilet. Burada on iki alan ve dört eylem ailesi var. Klasik routing, bu tablonun yalnızca hedef IP alanı doldurulmuş, geri kalanı jokerlenmiş özel hâli. Genelleştirilmiş iletme adı da 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 routing’de 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: eşit maliyetli iki yol trafiği yarı yarıya böler, eşit olmayanlarda ucuz olan hepsini alır. Klasik dünyada bu işi 51. bölümde göreceğimiz MPLS trafik mühendisliği ve segment routing yapıyor; ikisi de yolu kaynakta belirliyor.

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. Flow 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 flow’lara esnek yollar çizmek. İ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. 41. bölümde statik yolu elle yazmış, çalışan yapılandırma ile başlangıç yapılandırması arasındaki farkı görmüştün. 500 router’lı bir ağda cihaz başına 2 dakika iyimser bir tahmin. Toplamı yine de 1.000 dakika, yani yaklaşık 16,7 saat; hem de tek bir kural değişikliği için. Otomasyon araçları bu saatleri dakikalara indiriyor ama sorunun kökünü değiştirmiyor: beş yüz kutunun her biri kararı hâlâ kendi başına veriyor.

Bütün bunları toplayan tanım dört maddeli: genelleştirilmiş flow tabanlı iletme, kontrol ile veri düzleminin ayrılması, kontrol işlevlerinin switch’lerin dışında durması ve programlanabilir kontrol uygulamaları. Dördü birden yoksa ortada yazılım tanımlı ağ da yok.

Denetleyici switch’le nasıl konuşuyor?

Denetleyicinin içinde üç bileşen buluyorsun. En altta denetlenen switch’lerle mesajlaşan iletişim katmanı duruyor. Ortada bağlantıların ve switch’lerin durumunu dağıtık bir veritabanında tutan durum yönetimi var. En üstte kontrol uygulamalarına bakan interface katmanı oturuyor.

Yukarıdaki uygulamalarla kuzeye bakan API (northbound) üzerinden, aşağıdaki switch’lerle güneye bakan API (southbound) ü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 switch’leri 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 switch’e, switch’ten 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önmesajnumara
switch’ten denetleyiciyeOFPT_PACKET_IN10
switch’ten denetleyiciyeOFPT_FLOW_REMOVED11
switch’ten denetleyiciyeOFPT_PORT_STATUS12
denetleyiciden switch’eOFPT_PACKET_OUT13
denetleyiciden switch’eOFPT_FLOW_MOD14

Bu sayılar OpenFlow 1.5.1 sürümünden; o sürümün sürüm baytı 0x06. Denetleyici switch’e önce ne yapabildiğini sorar; buna features denir. Kural yazma işini modify-state ile yapar. Switch ise tanımadığı bir paketi packet-in ile hem paket hem denetim olarak denetleyiciye devreder.

Bir bağlantı koptuğunda dizi şöyle işliyor. Switch port-status ile denetleyiciyi uyarır. Denetleyici link state (bağlantı durumu) bilgisini günceller. Kayıtlı routing uygulaması çağrılır ve yeni yolları hesaplar. Sonra yalnızca güncellenmesi gereken switch’lere yeni tablolar kurulur.

Bu döngünün bir bedeli var, çünkü denetleyici ayakta olsa bile uzakta. Diyelim ki bir switch’ten 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. Gerçek kurulumlarda hızlı toparlanma bu yüzden switch’in içinde kalıyor: denetleyici yedek yolu önceden kuruyor, switch bağlantı koptuğu anda yedeğe kendisi geçiyor. OpenFlow’daki adı fast failover grubu.

Operatörler bu mesajları elle üretip göndermez. ONOS’un niyet çerçevesi (intent framework) gibi üst düzey soyutlamalar, ağa nasıl yerine ne istendiğini 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. Kilit 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 47. bölümde, yolun üstündeki kutuları açtığımızda 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. Pazar yine de acımasız: P4’ün en bilinen yongası Intel’in Tofino’suydu ve Intel 2023’te bu ailenin geliştirilmesini durdurdu.

Google kendi ağları için Orion adında bir kontrol düzlemi yazdı. Orada routing ile trafik mühendisliği protokol sayılmaz; Orion’un ortak altyapısının üstünde koşan birer uygulamadır. İç ağda klasik anlamda routing protokolü yok. Google’ın veri merkezlerini bağlayan B4 ağı daha 2013’te hatlarını yüzde yüze yakın doldurabildiğini yayımlamıştı; klasik geniş alan ağlarında bu oran yüzde 30 ile 40 arasında kalıyordu.

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ı, 33. bölümde çekirdek ağın denetim ve kullanıcı düzlemlerine bölünmesinde zaten görmüştün.

Merkezîleştirmenin routing’le 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ş flow tablosunu dolduran şey kontrol düzlemidir.

Özet

  • Kontrol düzlemi taşınabilir: routing hesabı ya her kutunun içinde koşar ya da uzaktaki bir denetleyicide; 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 switch 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 44: 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: switch, router, erişim sunucusu, bridge, 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. 41. bölümde komut satırından interface yapılandırmayı tek bir cihazda yaptın; aynı işi binlerce cihazda elle yapmak ölçeklenmiyor. İkinci yol, SNMP ile sayacı uzaktan sorgulamak ve değer yazmak. Üçüncüsü, NETCONF gibi protokollerle yapılandırmayı ağ genelinde yönetmek.

SNMP bir sayacı hangi adla sorar?

SNMP (Simple Network Management Protocol) bu mimarinin protokol karşılığıdır: ajan uygulama, yönetici uygulama ve ağ yönetim sistemi. Mesajları UDP taşır; ajan 161, trap dinleyen yönetici 162 numaralı portu kullanır. Ölçüm trafiğinin kendisi garantisiz bir taşımaya binmiş durumda ve bu bilinçli bir seçim: ağ sorunluyken TCP bağlantı kurmaya çalışırken takılabilir, tek bir UDP datagramı ise yine de gidebilir.

Bilgi iki kipte taşınır. İstek/yanıt kipinde sunucu sorar, cihaz cevaplar. Trap kipinde cihaz kimse sormadan kendi haber verir. Başlıca mesaj türleri şunlar:

mesajyönne yapar
GetRequestyöneticiden ajanatek bir değeri ister
GetNextRequestyöneticiden ajanasıradaki değeri ister
GetBulkRequestyöneticiden ajanabüyük bir bloğu tek seferde ister
SetRequestyöneticiden ajanadeğeri değiştirir
Responseajandan yöneticiyeistenen değeri döndürür
Trapajandan yöneticiyesorulmadan olayı bildirir
InformRequestajandan yöneticiyeolayı bildirir ve onay bekler

Bu listenin 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ı; 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ümkimlik doğrulamatelde
v1topluluk dizesidüz metin
v2ctopluluk dizesidüz metin
v3kullanı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 bu iki kelimedir; SetRequest yetkisi veren bir dizeyi bulmak cihazı yeniden yapılandırma yetkisi bulmak demektir. İnternete açık bırakılmış public cihazların bir zararı daha var: küçük bir toplu okuma isteği büyük bir cevap ürettiği için saldırganlar onları, sahte kaynak adresli isteklerle kurbanı boğan yükselticiler olarak kullanıyor.

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şır

Bir 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   →  udpInDatagrams

Bu 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. Dizinin başı tarihten geliyor: 1 ISO, 3 kuruluşlar, 6 ABD Savunma Bakanlığı, 1 internet. İnternetin bu ağaçtaki yeri hâlâ Savunma Bakanlığı’nın dalının altında.

RFC’lerde tanımlı 400’ü aşkın MIB modülü var ve üreticiye özgü olanların sayısı bundan çok daha fazla. Ethernet benzeri interface’lerin yönetilen nesneleri RFC 3635’te tanımlıdır. Switch’li 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 switch’lerinden 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 bir cihazın yapılandırma deposuna atomik commit yapabilir: ya değişikliğin tamamı uygulanır ya hiçbiri. Dikkat et, bu güvence tek cihazın içindedir; birden çok cihazı kapsayan dağıtık bir işlem NETCONF’un verdiği bir söz değil, üstteki düzenleme katmanının çözmesi gereken bir problem. 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.

Bugünkü büyük ağlarda yön de tersine döndü. Sunucu sormayı bırakıyor; cihaz sayaçlarını saniyenin altına inen aralıklarla, YANG modellerine göre kendisi akıtıyor. Adı akış telemetrisi (streaming telemetry), en yaygın protokolü gNMI.

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 flow kavramında. Bir flow; data link, network ve transport layer başlık alanlarının belli bir bileşimiyle tanımlanır. 43. bölümde flow 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. Routing kararının kendisi ölçümü üretiyor.

Flow 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. İkisinin felsefesi farklı: sFlow her N paketten birini örnekleyip başlığını hemen gönderiyor, NetFlow ise cihazın içinde flow’ları biriktirip flow bitince özetini yolluyor.

Flow izleme geçen paketleri flow kaydına çevirir. Kayıt paketin kendisini taşımaz, flow’un ö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.

Switch 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ı (TAP) ışığın kopyasını çıkarır ve dışarıdaki bir makineye verir. Üçüncüsü prob: bir switch 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 frame taşır. Gigabit Ethernet 1.488.000 frame’e çı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 interface sayaçlarını 60 saniyede bir toplar ve binlerce interface’li ağları bu tempoyla taşır; interface başına günde 1.440 örnek eder. Tempo yönetilebilir görünüyor. İzleme yazılımları tek bir başa dönüşü hesaba katabiliyor: yeni okuma eskisinden küçükse aradaki farka 2^32 ekliyor. Ama tam dolu bir gigabit hatta sayaç 60 saniyede iki kez başa dönebilir ve yazılım bunu tek dönüşten ayıramaz. İki okuma arasındaki fark gerçek trafiğin 4 GB kadar altında çıkar. Ölçüm hata vermez, sessizce küçük bir sayı söyler.

Kaçış yolu iki tane. Birincisi sayacı genişletmek: SNMPv2’den beri interface’ler için 64 bitlik sayaçlar da var (ifHCInOctets); 100 Gbit/s’te bile başa dönmeleri kırk yılı aşıyor. İkincisi yoklamayı sıklaştırmak; o da hem cihazın işlemcisini hem ölçüm trafiğini büyütür. Bugünkü sistemler ilkini seçiyor, yoklamanın yerine de akış telemetrisini koyuyor.

İzlenmesi gereken asgari küme üç kalemden ibaret: port kullanım oranı, broadcast ve multicast hızı, bir de CRC hatası gibi temel hata istatistikleri. Hata sayacı, sorun yaşayan cihazı adres vermeden işaret eder.

Klasik kılavuzlar aşırı yük eşiklerini şöyle koyar: sekiz saatlik iş günü ortalamasında %20, günün en yoğun saatinde %30, on beş dakikalık ortalamalarda %50. Bu sınırlar paylaşılan Ethernet günlerinden kalma ve bugünkü switch’li ağlar için temkinli; yine de mantıkları geçerli. Onları önce switch’leri çekirdeğe bağlayan upstream portlarında izlersin; darboğaz oradadır. 40. bölümde kuyruk trafiğin ortalamasıyla değil değişkenliğiyle büyüyordu; eşikler o değişkenliği yakalamak için farklı pencerelere konur.

Çok sayıda switch’ten 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ı, routing tablosunu ve interface istatistiklerini basar. Windows’ta netstat -e interface sayaçlarını verir:

C:\> netstat -e
Interface Statistics

                           Received            Sent

Bytes                    3176407056      1960446992
Unicast packets            15058536         4590630
Non-unicast packets           57006          134256
Discards                          0               0
Errors                            0               0
Unknown protocols                 0

Bu tablo bir switch portunun küçük kopyası. MRTG, aynı sayaçları SNMP ile yoklayıp tarayıcıda görülebilen grafiklere çeviren eski ve yaygın bir yazılım; bugün aynı işi çoğu zaman Prometheus ile Grafana ikilisi yapıyor. 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

  • 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 SetRequest protokolü okumanın yanında bir yazma aracına çevirir.
  • Flow izleme sayacın söyleyemediğini söyler: kayıt paketi taşımaz, flow’un ö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 45: Alanlar Arası Routing

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 routing iki varsayıma yaslanıyordu: bütün router’lar 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 router 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 routing’i kendi denetlemek ister ve kimseye hesap vermek istemez.

İnternetin cevabı router’ları 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 router’lar 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 routing planı gösterilir.

Eski tanım daha katıydı: bir otonom sistemin bütün router’ları 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. 42. bölümde link state 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 (Border Gateway Protocol). İlk sürümü 1989’da bir IETF toplantısında iki mühendisin öğle yemeğinde peçetelere çizdiği taslaktan doğdu; bu yüzden “iki peçete protokolü” diye de anılır. Dördüncü sürümü RFC 4271’de tanımlı ve otonom sistemler arası fiili standart.

Sınırda duran cihaza geçit router denir. Başka otonom sistemlerdeki router’lara doğrudan hattı vardır.

AMS-IX internet değişim noktasının optik bağlantı paneli: numaralandırılmış yuvalara takılı çok sayıda renkli fiber kordon. Ayrı otonom sistemlerin birbirine doğrudan hattı fiziksel olarak burada, tek bir panelde kuruluyor.

Kim kime para ödüyor?

Sınırdaki bir hat çoğu zaman bir sözleşmenin fiziksel karşılığı, internetin şeklini de o sözleşmeler çiziyor. Evine hat çeken şirkete kitapta operatör ya da servis sağlayıcı dedim; ders kitaplarında adı internet servis sağlayıcı (ISP). ISP’ler tek bir düzlemde durmuyor, basamak basamak dizilmiş bir merdiven oluşturuyorlar.

En alttaki erişim ISP’si dünyadaki her ağa kendi hattıyla ulaşamaz. Bir üstündeki sağlayıcıya müşteri olur ve ona para öder. Satın aldığı hizmetin adı geçiş (transit): üst sağlayıcı müşterisinin trafiğini internetin geri kalanına taşır ve oradan getirir. Aynı ilişki her basamakta tekrarlanıyor ve para çoğunlukla yukarı doğru akıyor.

kademekimpara akışı
erişim ISP’si (kaynaklarda çoğu zaman Tier 3)evlere ve iş yerlerine hat satan sağlayıcıüstündeki sağlayıcıya geçiş ücreti öder
ikinci kademe (Tier 2)erişim ISP’lerine geçiş satan bölgesel ya da ulusal sağlayıcıbir üst sağlayıcıya geçiş ücreti öder, kendi aralarında çoğu zaman bedelsiz eşleşir
birinci kademe (Tier 1)internetin tamamına geçiş ücreti ödemeden ulaşan büyük ağ; sayısı yirmiyi bulmuyorkimseye geçiş ücreti ödemez, öbür birinci kademelerle bedelsiz eşleşir

Kademe numaraları bir standarttan gelmiyor, bir ağa numarayı kimse vermiyor. Bir ağın hangi basamakta durduğunu kime para ödediği ve kimden para aldığı belirliyor.

Eşleme (peering), iki ağın birbirinin müşterilerine giden trafiği karşılıklı taşıması ve kimsenin kimseden para almaması demek. Birinci kademeler birbirine para ödemez, çünkü ikisi de internetin tamamına ulaşmak için öbürünün müşterilerine muhtaç ve kimse kimsenin müşterisi değil. Böyle bir eşleme koparsa, başka yolu olmayan müşteriler öbür ağın müşterilerine ulaşamaz. Eşleme iki ağın arasına doğrudan bir hat çekilerek ya da internet değişim noktasında (IXP) kuruluyor. Az önceki fotoğraf böyle bir noktanın içi: çok sayıda ağın hattı ortak bir switch altyapısına bağlanıyor ve her ağ tek bir bağlantıyla oradaki öbür ağlarla eşlenebiliyor.

Bu fatura düzeni BGP kararlarına da yansıyor. Bir sağlayıcı için müşteriden öğrenilen yol para getirir, eşten öğrenilen yol bedelsizdir, üst sağlayıcıdan öğrenilen yol para götürür. Birazdan göreceğin yerel tercih değerini yönetici çoğu zaman bu sıraya göre koyar.

Sınırda ne konuşuluyor?

BGP oturumu iki router 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.

mesajne yapar
OPENoturumu açar ve karşı tarafı doğrular
UPDATEyeni yol ilan eder ya da eskisini geri çeker
KEEPALIVEsessizlikte bağlantıyı canlı tutar
NOTIFICATIONhatayı 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; 2019’dan beri iki taraf anlaşırsa bu sınır 65.535 bayta çıkıyor (RFC 8654). En kısa UPDATE 23 bayt, KEEPALIVE ise yalnızca başlıktan ibaret: 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. 90 saniye bugünün gözüyle çok uzun; sahada BGP’nin yanına bu yüzden kopukluğu milisaniyeler içinde fark eden ayrı bir protokol (BFD) ekleniyor.

İ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 aynı sıklıkta 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 router’lar ikisini birlikte koşar.

Böyle bir router üç 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 routing tablosu. 39. bölümde routing 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 path vector protokolüdür ve adı 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 router kendi AS numarasını listenin başına ekler. Liste böylece yolun kendisi olur.

Döngü denetimi tek satırlık bir iş. Router gelen yolun listesini tarar ve kendi numarasını görürse o yolu eler. Path vector’ın uzaklık vektörüne üstünlüğü burası: sayarak sonsuza gitmenin yerini tek bir liste taraması alıyor. 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 router 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.

  1. Yerel tercih değeri: saf politika kararı, sayıyı yönetici koyar.
  2. En kısa AS_PATH: listedeki durak sayısı.
  3. En yakın NEXT_HOP: iç maliyeti en düşük çıkış.
  4. Kalan ölçütler: yukarıdakiler eşit çıkarsa bakılır; komşunun önerdiği giriş kapısı (MED), dış komşudan gelen yolun iç komşudan gelene tercihi ve en sonda router kimliği.

Gerçek router’lardaki liste daha uzun, ama ruhu bu dört satırda.

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:

Aynı öneke iki yol geldiğinde hangisi kazanıyor
aynı öneke gelen iki yolkarar veren geçitAS 64501AS 64502AS 64503AS 64500203.0.113.0/24AS_PATH: 64501 64500AS_PATH: 64502 64503 64500kısa liste kazanıryerel tercih kazanır
Ö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.
  1. Ö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.
  2. Ü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.
  3. 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.
  4. 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 routing tablosuna yazılmıyor, BGP tablosunda yedek olarak bekliyor.
  5. 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 routing’i 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. Bunun bir yan etkisi var: iki ağ da trafiği bir an önce komşuya atmak istediği için gidiş ile dönüş çoğu zaman farklı yollardan geçiyor. İnternette yolların asimetrik olması istisna değil, kural.

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ş (transit) 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.

Sağlayıcı ile otonom sistem 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ü. AS 7007 numaralı küçük bir servis sağlayıcıdaki arızalı bir router ulusal omurga router’larına hatalı routing 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. 2008’de Pakistan Telekom, ülke içinde YouTube’u engellemek için yazdığı daha özgül bir öneki yanlışlıkla dünyaya ilan etti; YouTube iki saat kadar bütün dünyada erişilemez oldu. Ekim 2021’de ise Facebook’un kendi yaptığı bir yapılandırma hatası, ağının ilanlarını geri çektirdi ve şirket altı saat kadar internetten silindi.

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ı. Kayıtların kaynağı RPKI: bölgesel kayıt kuruluşlarının imzaladığı, “bu öneki şu otonom sistem ilan edebilir” diyen belgeler (ROA). 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. 2020’lerde büyük operatörlerin çoğu Invalid yolları düşürmeye başladı.

Yöntemin sınırı da belli: yalnızca ilk halkayı, yani ilanı başlatanı denetliyor. Yolun ortasına sokulmuş bir yalanı yakalamak için tasarlanan ve yolun tamamını imzalayan BGPsec 2017’de standartlaştı ama sahada neredeyse hiç kullanılmıyor; daha hafif bir yöntem olan ASPA üzerinde çalışılıyor.

İş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 (GTSM): paketler TTL 255 ile gönderilir ve alıcı tam 255 bekler, çünkü birkaç router ötedeki biri bu değeri üretemez; her router TTL’i bir azaltıyordu.

Aynı öneki birden çok yerden ilan etmenin meşru bir kullanımı da var. 16. bölümde içerik dağıtım ağı aynı içeriği birden çok kenar sunucudan sunuyordu; anycast’in routing 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 routing 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 application layer’da 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, "holder": "CLOUDFLARENET - Cloudflare, Inc." } ]

Birincisi önekin şu anda ilan edildiğini, ikincisi ilan edenin kim olduğunu söylüyor. Aynı servisten ilanın kaynak doğrulamasından geçip geçmediğini de sorabilirsin:

curl -s 'https://stat.ripe.net/data/rpki-validation/data.json?resource=13335&prefix=1.1.1.0/24'

Cevaptaki "status": "valid", bu öneki 13335’in ilan etmesine izin veren imzalı bir kaydın bulunduğunu söylüyor.

Özet

  • Otonom sistem bir yönetim sınırıdır: tek bir kuruluşun elindeki router ve ağ kümesidir, kendi içinde bağlıdır ve dışarıya tek bir routing planı gösterir.
  • Para merdivenden yukarı akar: erişim ISP’si ikinci kademeye, ikinci kademe birinci kademeye geçiş ücreti öder; birinci kademeler kimseye ödemez ve birbirine bedelsiz eşlenir.
  • 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.
  • Path vector 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 46: 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. 36. bölümde gördüğümüz gibi RFC 1918 üç bloğu yerel ağlara ayırdı ve bu üç blok internette yönlendirilmiyor.

BlokUçlarAdres sayısı
10.0.0.0/810.0.0.0 – 10.255.255.25516.777.216
172.16.0.0/12172.16.0.0 – 172.31.255.2551.048.576
192.168.0.0/16192.168.0.0 – 192.168.255.25565.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 45. bölümde gördün; özel bloklar o ilanların hiçbirinde geçmiyor. Taşıyıcı router 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 interface’i 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 basit: 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 NAT tablosuna yazmasa dönüş paketini kime vereceğini bilemezdi. Tablonun iki sütunu var: WAN tarafı ve LAN tarafı. Bir satır bir flow’un kimliği.

ProtokolWAN tarafıLAN tarafı
TCP198.51.100.83:60117192.168.42.137:52310
TCP198.51.100.83:60118192.168.42.104:52310
UDP198.51.100.83:60119192.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 noktakaynak IPkaynak porthedef IPhedef port
giden · geçitten önce192.168.42.13752310203.0.113.9443
giden · geçitten sonra198.51.100.8360117203.0.113.9443
dönen · geçitten önce203.0.113.9443198.51.100.8360117
dönen · geçitten sonra203.0.113.9443192.168.42.13752310

Dört alanın geçitten önce ve sonra nasıl göründüğünü izleyelim:

Dört alandan ikisi değişiyor
geçitten öncekaynak 192.168.42.137:52310hedef 203.0.113.9:443geçitgeçitten sonrakaynak 198.51.100.83:60117hedef 203.0.113.9:443protokolWAN tarafıLAN tarafıTCP198.51.100.83:60117192.168.42.137:52310dönen pakette aynı satır ters okunuyor: hedef çifti LAN tarafına çevriliyoriki uç aynı bağlantıya farklı dörtlülerle bakıyor, ve ikisi de haklı
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.137 milyonlarca ağda birden var.
  1. 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.137 milyonlarca ağda birden var.
  2. 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.
  3. 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.
  4. Dönen paket aynı satırı ters okuyor. Cevap 198.51.100.83:60117 hedefine 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’ını hem de transport layer’ın sağlamasını yeniden hesaplamak zorunda. 7. bölümdeki sahte başlık yüzünden TCP ve UDP sağlaması IP adreslerini de kapsıyordu; adres değişince o da değişmek 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.

6. bölümde 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; TCP ile UDP’nin havuzları ayrı. 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. Tek fark: apartmanda daire numaralarını kimse yeniden dağıtmaz, geçitte ise numarayı her flow 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ürEşleme
Statik NATBir iç adres hep aynı dış adrese; kalıcı satır
Dinamik NATHavuzdan 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 iki türü birlikte tanımlıyor: yalnızca adrese dokunan temel NAT ve porta da dokunan NAPT. 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 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. TCP için RFC 5382 çok daha cömert: kurulmuş bir bağlantının eşlemesi iki saat dört dakikadan önce silinmemeli. Sahadaki kutuların çoğu bu kurala uymuyor; 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 (port forwarding), 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. Birçok ev kutusu bu satırı uygulamanın kendisine de açtırıyor (UPnP, daha yeni adıyla PCP); oyun konsollarının “NAT türü açık” demesinin arkasında çoğu zaman bu var.

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ış portiçeri kimi kabul ediyor
tam koniher hedefe aynıherkes
adres kısıtlı koniher hedefe aynıyalnızca daha önce paket yolladığın IP
port kısıtlı koniher hedefe aynıyalnızca daha önce paket yolladığın IP ve port
simetrikher 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 işi burada 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 (framework) adı ICE. Tarayıcındaki görüntülü görüşme başlarken saniyenin bir kısmını buna harcıyor: adayları topluyor, sırayla sınıyor, çalışan ilk yolu seçiyor. Eşler arası uygulamaların niçin bu kadar uğraştırdığının sebebi bu üç basamaklı merdiven. Görüşmenin bu adımdan sonrası 74. bölümde, eşler arası dosya dağıtımının NAT’la derdi 72. bölümde.

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 (application layer gateway, ALG) ve tanımı gereği application layer’a çıkan bir network layer cihazı. 19. bölümde katmanlamanın faturalarından biri 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ı interface’ten 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 sık rastlanan sebeplerinden biri 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önlendirmesi, 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ı 47. bölümde 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 network layer cihazı transport layer’ın port alanına dokunuyor; router’ın network layer’ı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.

38. bölümdeki 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ığı IPv4 adresi de büyük ihtimalle ç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.org

Birincisi içerideki özel adresi basıyor, ikincisi dışarıdan görünen adresi. İki farklı adres, tek makine. Bir adım daha at: router’ın WAN durum sayfasındaki adres 100.64 ile başlıyorsa ya da ikinci komutun söylediğinden farklıysa, arada operatörün çevirisi de var demektir.

Özet

  • Ö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: STUN dış adresi öğretir, delik açma iki kapıyı içeriden açar, TURN başarısızlıkta trafiği röleye alır; sırayı ICE yü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 router’ın işini aştı. Adres çevrildi; peki yol üstünde paketimize dokunan başka kim var?

Bölüm 47: 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. Router’ın 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 router olmaktan çıkıyor?

Bir kutu ne zaman router 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 router’ının 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 katmanla çekiliyor. Bir router’dan en fazla network layer’a kadar işlem yapması bekleniyor; transport layer’daki port numarasına uzanan bir kutu o çizginin dışına çıkmış oluyor. Adres çeviren kutuyu zaten tanıyorsun: 46. bölümde port çevirisinin end-to-end argument’a ödettiği bedeli saymıştık.

Katman eşlemesi eski bir tablodan geliyor: repeater physical layer’da, switch data link layer’da, router network layer’da durur. Adlandırma da burada karışıyor: IP dünyasında router’ın kendisine de geçit deniyor, oysa aynı ad transport layer’dan application layer’a kadar OSI’nin dört katmanını 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ıfeline aldığı şeydurduğu yer
adres çevirisi (NAT)başlıktaki adres ve portev, hücresel ağ, kurum ağı
firewall ve saldırı tespiti (IDS/IPS)geçme iznişirket, kurum, servis sağlayıcı, erişim ağı
load balancer (yük dengeleyici)isteğin kendisikurum, servis sağlayıcı, veri merkezi, mobil ağ
önbellek (cache)yanıtın kopyasıservis sağlayıcı, mobil ağ, içerik dağıtım ağı
uygulamaya özgü kutu (ALG)tek bir protokolün verisikonuştuğu uygulamanın yanı

Dağılımın kendisi de bir şey söylüyor. Firewall 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. Firewall IP adresleriyle taşıma portlarını eşleştirir, eylemi de izin vermek ya da reddetmektir. Router, switch 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?

16. bölümde proxy iki rolü aynı anda oynuyordu: isteği yapan istemciye karşı sunucu, origin sunucuya karşı istemci. Reverse proxy 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 proxy’nin bir bedeli var. İstemci yazılımının kutuya nasıl ulaşacağını bilmesi gerekir, örneğin tarayıcıya proxy’nin adresi elle girilir. Reverse proxy’de 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. 11. bölümdeki el sıkışmada sunucu sertifikasını ve özel anahtarını kullanarak kimliğini kanıtlar ve iki taraf paylaşılan bir sır üretir; istemcinin de sertifika göstermesi isteğe bağlıdır. Özel anahtarı elinde tutan kutu, o oturumun uç noktasıdır. Bu işe TLS sonlandırma deniyor. 12. bölümde sertifika zinciri bir adı doğruluyordu; TLS’i sonlandıran reverse proxy o adın sahibi olarak konuşur.

Vakayı kuralım. İstemci 198.51.100.25 adresinden çıkıyor. Reverse proxy 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. Bugünkü güvenlik anlayışında arka taraf da çoğu zaman yeniden şifreleniyor; kutunun trafiği içeride düz metin olarak görmesi ise değişmiyor.

Tek isteğin yolda kaç bağlantıya bölündüğünü görelim:

Tek bir isteğin arka arkaya eklenmiş iki oturumu
tek bir HTTPS isteğiarka uç havuzuistemci198.51.100.25reverse proxy203.0.113.10TCP 443 dinliyor192.0.2.11192.0.2.12192.0.2.13TLS oturumu 1TLS oturumu 2TLS burada bitiyorhavuzdan biri seçildi
İ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.
  1. İ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.
  2. TLS reverse proxy'de 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.
  3. 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.
  4. İ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.
  5. 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 reverse proxy’yi 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, proxy’nin hangi katmana kadar indiğine bağlı:

yöntemnereye yazılıyorkoşulu
X-Forwarded-ForHTTP başlığınaproxy HTTP’yi okuyabiliyor olmalı
Forwarded (RFC 7239)HTTP başlığına, standart biçimdeaynı; adresle birlikte protokol ve ana bilgisayarı da taşır
PROXY protokolüTCP bağlantısının ilk baytlarınaproxy HTTP’yi hiç okumasa da çalışır

İlk ikisi bir liste tutuyor: her proxy 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, transport layer’da çalışan bir 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 proxy’sinin eklediği son değere güven. Listede ondan öncesi istemciden gelmiş olabilir ve kanıtlanamaz.

Yükü dağıtan kutu neyi gizliyor?

Load balancer’ın 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. Application layer routing’i 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öntemkararı neye dayandırıyorne zaman doğru seçim
dönüşümlü (round robin)sıradaki arka uçistekler birbirine benzer, arka uçlar özdeş
ağırlıklı dönüşümlü (weighted round robin)her arka uca verilen payarka uçlar farklı güçte
en az bağlantı (least connections)o an en az açık bağlantısı olanistek süreleri çok değişken
en kısa yanıt süresi (least response time)ölçülen gecikmearka uçların yükü öngörülemez
özet tabanlı (hash-based)istemci adresinin ya da bir çerezin özetiaynı istemci hep aynı arka uca gitmeli

Son satırın bir adı var: oturum yapışkanlığı (session affinity, sahada sık sık sticky session). 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. 14. bölümde durumun sunucudan neden çıkarıldığını gördük; 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 öncesindeki dilim el değiştiriyor, geri kalan her şey yerinde kalıyor. Taşınan anahtar oranı 1/N’e iniyor. Fikri 1997’de MIT’de Karger ve arkadaşları yayımladı; bir yıl sonra kurulan Akamai’nin temelinde bu çalışma var. Aynı fikir bugün dağıtık önbelleklerde ve veritabanlarında da 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. Load balancer 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. Cisco’nun GLBP’si gibi ağ geçidi yedekliliği protokollerinde dengeleme tek bir sanal IP adresi ile birden çok sanal MAC adresi üzerinden, ARP cevaplarıyla ve data link layer’da yapılır. Yol üstündeki load balancer ise isteğin kendisine bakıyor. Aynı ad iki ayrı katmanda karşına çıkıyor.

16. bölümdeki iç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 router’ın 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ğ işlevi için ayrı bir kutu satın alınırdı: firewall bir kutu, load balancer başka bir kutu, adres çevirici üçüncü bir kutu. İşlev ile kasa aynı şeydi. Başlangıç noktası tescilli ve kapalı donanım çözümleriydi.

Router’ın 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 interface 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 (NFV) tanımı buradan çıkıyor: sade donanım üstündeki ağ, hesaplama ve depolama kaynakları üzerinde programlanabilir hizmetler. Load balancer artık bir kasa değil, bir sunucuda çalışan bir süreçtir.

Şimdi geri çekilip resmin tamamına bak. 19. bölümde gördüğümüz gibi internet mimarisinin bilinen adı kum saati modelidir: physical, data link, transport ve application layer’da çok sayıda protokol varken network layer’da 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, firewall’lar 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 oradan çıkıyor. Sav ağın içindeki işlevi yasaklamıyor; ona yalnızca son söz hakkı vermiyor.

Özet

  • Ara kutu bir cihaz adı taşımaz: tanımı, veri yolunda durup router’ın 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, firewall, load balancer, önbellek ve uygulamaya özgü kutu, hepsi eşleştir-uygula kalıbıyla çalışır.
  • Reverse proxy 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.
  • Load balancer 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 48: 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ünellemenin tanımı kısa: 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
41IPv6 paketi
47genel routing encapsulation’ı (GRE)
50şifrelenmiş yük (ESP)
51kimlik doğrulama başlığı (AH)
115Layer 2 tünelleme protokolü (L2TP)

Listedeki 47 numara bir ayrımı da netleştiriyor: GRE’nin tek işi encapsulation yapmak 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 frame’lerini IP datagramlarının içinde taşıyabiliyorsun; VXLAN’ın segment kimliği 24 bit, dış zarfı UDP ve tahsisli hedef portu 4789. 24 bit, 16 milyonu aşkın ayrı sanal ağ demek; 29. bölümdeki VLAN kimliği ise 12 bitte kalıp 4.094’te tıkanıyordu. Bulut veri merkezlerinin VXLAN’a geçmesinin sebebi bu sayı.

Tünellemenin doğuş sebebi gayet pratik. 38. bölümde gördüğümüz gibi internette bütün router’ların 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ü router sıralanıyor. 20. bölümde encapsulation 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:

Aynı paketin üstündeki iki adres çifti
tünel girişinde üretilen paketiki adres çifti, tek paketdış IP başlığı198.51.100.4→ 198.51.100.9ESP başlığıindeks + sıra8 baytiç paketiç IP başlığı192.0.2.7→ 203.0.113.9iç verikuyrukdolguyol üstündekiler ne okuyortünel girişi198.51.100.4routerroutertünel çıkışı198.51.100.9okunan tek adres çifti dıştakidış zarf soyulur
İç 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 router onları okumaz.
  1. İç 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 router onları okumaz.
  2. 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.
  3. 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.
  4. 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.
  5. Yol yalnızca dış zarfı görür. Aradaki router'lar 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.
  6. Çı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. Uygulamalar tek tek seçmek zorunda değil; hangi trafiğin korunacağına birazdan göreceğimiz politika karar veriyor.

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: tünel kipinde yalnızca tünelin iki ucu görünür.

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. AH’nin sahadan çekilmesinin bir sebebi de adres çevirisiyle geçinememesi: IP başlığındaki adresi de doğruladığı için yolda adresi değiştiren her çevirici doğrulamayı bozuyor.

ESP’nin de çeviriyle bir derdi var: portu yok, oysa 46. bölümdeki port çevirisi flow’ları portla ayırıyordu. İki uç arada bir çevirici olduğunu fark ederse ESP’yi bir UDP datagramının içine koyup 4500 numaralı portu kullanıyor (NAT-T). Tünelin içinde bir tünel daha.

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. Son adımda en öne, adresleri tünelin uçlarına yazılmış yeni bir IP başlığı eklenir. Bugün en yaygın seçim AES-GCM; o, 9. bölümde gördüğümüz gibi şifreleme ile doğrulama kodunu tek adımda üretiyor.

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; pencerenin önerilen boyu 64 paket. 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 IKE (Internet Key Exchange) adlı protokole devrediyorlar. İki taraf kimliğini ya önceden paylaşılmış bir sırla ya da sertifikayla kanıtlar. 10. bölümde 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. Bugünkü sürüm IKEv2 ikisini dört mesajda, iki gidiş-dönüşte bitiriyor; ilk sürümde bu sayı dokuz mesaja kadar çıkıyordu.

Tünelin iki ucunu üç ayrı biçimde eşleştirebilirsin: iki uç makine, iki router ya da bir router 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 encapsulate eder. El sıkışma Noise çerçevesinin (Noise Protocol Framework) IK kalıbını kullanır. UDP seçimi bilinçli. Tünel TCP’nin üstüne kurulsaydı, içerideki TCP ile dıştaki TCP aynı kaybı ayrı ayrı onarmaya çalışır, zamanlayıcıları birbirini kışkırtır ve bağlantı kilitlenirdi; bu olaya TCP meltdown deniyor. UDP ise kaybı gizlemez, onarmayı içerideki protokole bırakır. WireGuard Linux kernel’ına 2020’de girdi; kodunun birkaç bin satır olması, yüz binlerce satırlık IPsec uygulamalarının yanında başlı başına bir güvenlik özelliği sayıldı.

Ş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. Bedeli de var: bir algoritma kırılırsa pazarlıkla başkasına geçilemiyor, protokolün yeni bir sürümü gerekiyor. Kuantum sonrası döneme karşı ise el sıkışmaya isteğe bağlı bir önceden paylaşılan anahtar katılabiliyor; kayıt ileride kırılsa bile o anahtarı bilmeyen oturumu açamıyor.

Merkezdeki fikre kripto anahtarlı routing deniyor. Açık anahtarlarla izinli adres listelerinin basit bir eşleşmesidir. Aynı liste iki iş görür: gönderirken routing 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 iki dakikada bir tekrarlanır. Anahtarlar döner ve amaç 11. bölümdeki forward secrecy’dir. 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 interface için 25 saniyelik kalıcı canlı tutma aralığı önerir. Sebep açık: 46. bölümde gördüğümüz gibi çevirici boşta kalan UDP eşlemesini siliyor ve sahadaki kutuların çoğu bunu standardın önerdiğinden çok daha erken yapıyor. Eşleme unutulursa 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 interface’i de bir interface’tir ve kendi MTU değerini taşır. Bu değer altındaki bağdan hep daha dardır. Router, çıkış interface’inin MTU’sundan büyük bir paket alırsa onu daha küçük parçalara böler; tünel girişi de bir çıkış interface’idir.

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 ek yükü seçilen algoritmaya göre değişiyor. AES-GCM ile en az 54 bayt: 20 baytlık dış başlık, 8 baytlık ESP başlığı, 8 baytlık başlangıç vektörü, 2 baytlık kuyruk ve 16 baytlık doğrulama kodu. İç pakete 1.446 bayt kalır, pay %3,6. WireGuard’ın IPv4 dış zarflı ek yükü 60 bayt: 20 baytlık IP, 8 baytlık UDP ve 32 baytlık kendi başlığı ile doğrulama kodu. İç 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. WireGuard’ın varsayılan MTU’sunun 1.420 olmasının sebebi bu en kötü durum.

Aynı hesap, 20. bölümde çı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 interface’inin 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.

38. bölümde IPv6’nın her bağdan en az 1.280 baytlık MTU istediğini ve ayarlanabilir bağlar için 1.500 baytı, açıkça tünellere yer kalsın diye önerdiğini görmüştük. Tünel hesabı o önerinin neden yazıldığını gösteriyor.

Doğru boyu gönderenin kendisi ölçer: datagramlarını parçalama yasağı biti kurulu yollar, sığmayan paketi bir router 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. ICMP’ye güvenmeyen daha yeni bir yöntem de var: boyu, büyük paketlerin kaybolup kaybolmadığına bakarak kendisi buluyor (RFC 8899). QUIC bu yöntemi kullanıyor.

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 interface'inin MTU'su
ping -M do -s 1412 203.0.113.9        # 1.412 bayt yük + 28 bayt başlık = 1.440, DF kurulu

Windows’ta aynı denemenin karşılığı ping -f -l 1412 203.0.113.9.

Derinleş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 router 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ş. Firewall’lar 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 interface’inde TCP oturumlarının anlaştığı azami segment boyunu o sınıra sıkıştırmak (MSS clamping), yani sorunu el sıkışmada çözmektir.

Özet

  • 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.
  • Encapsulation 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 routing 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 %5,3 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 49: Firewall'lar

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. Firewall 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. Bu iş ayrı bir kutuda da, bir router’ın içinde de, dizüstü bilgisayarındaki işletim sisteminde de koşabiliyor; üçünde de firewall’ı firewall yapan şey, o sınırda uygulanan politika.

Politikanın varsayılanı kapalı: açık olan ne varsa, biri onu tek tek açmış demektir. Gerekçeyi üç maddede toplayabilirsin: hizmeti kullanılamaz hâle getirmeye çalışan saldırıları (denial of service, DoS) 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 (stateless) paket süzgeçleri, durum takipli (stateful) paket süzgeçleri, uygulama geçitleri (application gateway). Sıralamanın bir mantığı var: her tür, bir öncekinin göremediğini görmek için doğdu. Bugün “yeni nesil firewall” diye satılan kutular üçünü tek kasada birleştiriyor.

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 flow’unu kesiyor; DNS sorguları da QUIC üstünden giden HTTP/3 trafiği de buna dahil. 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, bağlantıyı hangi tarafın açabileceğini 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 router’da bir azalır ve sıfıra düşünce paket silinir; traceroute 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 broadcast adresine giden ICMP paketleri de düşürülür, çünkü ağının 37. bölümdeki Smurf türü bir saldırıda araç olmasını istemezsin.

Bunun bedeli de var. Bir ICMP hata mesajı tür ve kodun yanında, hataya yol açan datagramın IP başlığını ve yükünün en az ilk 8 baytını taşır. O 8 bayt kaynak ve hedef portları içerdiği için gönderen, hatanın hangi bağlantıya ait olduğunu bulabiliyor. 48. bölümde yol MTU keşfi, bu mesajlar 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.

6. bölümde port numarası, paketin makinedeki hangi programa gideceğini 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, çünkü 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 (access control list, ACL). 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.

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.

aksiyonkaynakhedefkoşul
izin198.51.100.0/24dışarısıTCP hedef port 443
izindışarısı198.51.100.0/24TCP kaynak port 443, ACK kurulu
izin198.51.100.0/24dışarısıUDP hedef port 53
izindışarısı198.51.100.20TCP hedef port 443
rether şeyher ş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 hedef portun, yani istemcinin geçici portunun 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 router’da iki ayrı noktaya bağlanabilir: routing kararından önce süzmek için paketin alındığı interface’e, karardan sonra süzmek için çıkış interface’ine. 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 interface’le 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. Eski sürümlerde hatalı bir satır yalnızca isimli listelerde tek başına silinebiliyordu; bugün iki türde de satırlara sıra numarası veriliyor, tek satır silinip araya yeni satır eklenebiliyor. Eski alışkanlığın tuzağı ise hâlâ yerinde: klasik biçimde no access-list 101 diye başlayan bir komut, arkasına hangi satırı yazarsan yaz, listenin tamamını siler. Adres kümesini kısa yazmak içinse joker maske kullanılır; bitleri alt ağ maskesinin tersi anlama gelir: 0 “bu bit tutmalı”, 1 “bu bit önemsiz” demek. 198.51.100.0 0.0.0.255 yazımı, /24’lük bloğun tamamını yakalar.

Tür, listenin nereye konacağını da belirliyor. Standart liste yalnızca kaynağı gördüğü için kaynağa yakın konursa o kaynağın her yere gidişini keser; bu yüzden hedefe yakın konur. Genişletilmiş liste hedefi de gördüğü için kaynağa yakın konur ve istenmeyen trafik ağı hiç dolaşmadan düşer.

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. Tarama araçları bu körlüğü ölçüme çeviriyor: yalnızca ACK biti kurulu paketler gönderip hangilerine RST cevabı geldiğine bakarak (nmap -sA) süzgecin durum tutup tutmadığını ve hangi portları süzdüğünü dışarıdan haritalıyorlar.

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. Fikri ticari ürüne ilk dönüştürenlerden biri, 1994’te FireWall-1 ile Check Point oldu.

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 8 bitlik protokol numarası da binince anahtara five-tuple deniyor; aynı port çifti TCP’de ve UDP’de iki ayrı bağlantıdır. 46. bölümdeki çeviri tablosu da aynı anahtarı tutuyordu ve buradaki tablo yapı olarak onun kardeşidir. Linux’ta ikisi zaten tek yapı: conntrack tablosu hem süzgecin hem çeviricinin hafızası.

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’de kurulum ve yıkım olmadığı için süzgeç bir sözde bağlantı uyduruyor: içeriden giden ilk datagram bir satır açıyor, cevaplar o satıra dayanarak içeri alınıyor ve satır bir süre sessiz kalınca siliniyor. Süreler protokolün doğasını yansıtıyor. Linux’ta kurulmuş bir TCP bağlantısı hiç paket geçmese de tabloda beş gün kalıyor. Cevapsız bir UDP flow’u 30 saniyede unutuluyor, iki yönde de süren bir akış ise 2 dakika sessiz kalınca.

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 saldırı yolu veriyor: tabloyu sahte bağlantılarla dolduran biri, gerçek bağlantılara yer bırakmıyor.

Kutunun ilk paketten sonra neyi hatırladığını izleyelim:

Aynı görünen iki paketi ayıran tek satır
kurum ağı 198.51.100.0/24internetiç makine198.51.100.41firewalldurum takiplidış sunucu203.0.113.7giden akışaynı four-tuplekarşılıksız paketbağlantı durum tablosuiç uç 198.51.100.41:51500dış uç 203.0.113.7:443tabloda satırı yok
İç 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.
  1. İç 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.
  2. 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 bu satırdır.
  3. 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.
  4. Dönen yanıt satırla eşleşiyor. Yanıt geldiğinde kutu önce tabloya bakıyor. Four-tuple orada yazılı olduğu için paket anlamlı sayılıyor ve iç makineye veriliyor.
  5. 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; 47. bölümdeki reverse proxy 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: router’daki 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 adres sahteciliği (IP spoofing), 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 switch üzerinde IP Source Guard gibi bir özellik açılır. Asıl ilaç ise kaynakta. Operatör, kendi müşterilerinden gelen ama kaynak adresi o müşterilere ait olmayan paketleri daha kendi ağından çıkmadan düşürebilir. Kuralın adı BCP 38 ve 2000’den beri öneriliyor. İnternetin hatırı sayılır bir kısmında hâlâ uygulanmadığı için 44. bölümdeki SNMP yükselticileri gibi sahte kaynaklı yansıtma saldırıları çalışmaya devam ediyor.

İ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 (IDS) bu iki eksik için kuruyorlar; saldırıyı görünce trafiği kendisi de kesene saldırı önleme sistemi (IPS) deniyor. İkisi de derin paket incelemesi (DPI) 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 DoS saldırısı ancak paketler birlikte bakıldığında görünür.

İmza veritabanı yalnızca bilineni yakalar. Hiç görülmemiş bir saldırıyı sistem ancak trafiğin olağan dışı davranmasından, yani anomali tespitiyle sezebilir; bedeli de meşru ama alışılmadık trafiğe verilen yanlış alarmlar. Açık kaynak dünyasının bilinen örnekleri 1998’de yazılan Snort ile Suricata. Şifreleme bu sistemlerin işini de değiştirdi: TLS’in içini göremeyen bir sensör ya kurumun kök sertifikasıyla trafiği açıyor ya da yalnızca üstveriye, yani adreslere, zamanlamaya ve el sıkışmanın açık alanlarına bakı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 ara bölgede, DMZ’de (demilitarized zone) duruyor.

Dışarıdan bakınca bütün bu düzeneği tek bir kelimede göreceksin. nmap gibi bir port tarayıcı üç cevap tanır. Açık portta SYN-ACK döner, kapalı portta RST döner; filtreli portta ise ya hiçbir şey dönmez ya da bir ICMP ulaşılamaz mesajı gelir. Kapalı ile filtreli arasındaki fark, reddi kimin verdiği: kapalıda makinenin kendisi, filtrelide aradaki süzgeç. 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.

Özet

  • Firewall 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 five-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 bu boşluğa girer.
  • Dışarıdan bakan üç cevap görür: açık portta SYN-ACK, kapalı portta RST, filtreli portta ise sessizlik ya da ICMP; susmak hiçbir şeyin kanıtı değildir.

Kutu kurallarını yazdı, bağlantıları hatırlıyor, şüpheli trafiği işaretliyor. Ama saldırgan her zaman bir kuralın arkasından dolanmaya uğraşmaz. Bazen kapıyı doldurur, bazen kapıyla hiç uğraşmayıp yolun ortasına oturur. Peki sınıra hangi saldırılar geliyor ve hangisi kutunun hiç göremediği yerden geliyor?

Bölüm 50: Ağ Saldırıları

Firewall kapıda duruyor ve her paketi kurala vuruyor. Saldırganın elinde ise iki yol daha var: kapıyı zorlamak ya da kapıyla hiç uğraşmayıp yolun ortasına oturmak.

İki yol da kuralın içeriğine takılmıyor; biri kutunun kapasitesine, öteki yolun kendisine saldırıyor. Peki kapasiteye yapılan saldırı nasıl işliyor ve yolun ortasına nasıl oturuluyor?

Kapıyı doldurmak

Önceki bölümün başında adı geçen DoS saldırısında 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. 8. bölümde yarı açık bağlantı kuyruğunu dolduran SYN selini görmüştük; durum tablosu aynı doldurma hamlesine firewall’da da açık. Dağıtık biçimini, yani DDoS’u, üç 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 five-tuple için tablosunda yer açar.

Ele geçirilmiş makinelerden oluşan bu orduya botnet deniyor ve bugün çoğu bilgisayar bile değil. 2016’da Mirai adlı botnet, varsayılan parolası değiştirilmemiş kameralar ve kayıt cihazlarıyla DNS sağlayıcısı Dyn’e saldırdı. Twitter, Netflix ve GitHub gibi siteler, adları çözülemediği için özellikle ABD’de pek çok kullanıcıya saatlerce ulaşılamaz oldu. Ölçek o günden beri büyüdü. Cloudflare 2025’in son çeyreğinde, büyük kısmı Android TV cihazlarından oluşan bir botnet’in 31,4 Tbit/s’lik saldırısını durdurdu. Saldırı 35 saniye sürdü ve hiçbir mühendis müdahale etmeden, otomatik savunmayla karşılandı. Bu hızda bir saldırıya insanın yetişmesi zaten mümkün değil. Bu cihazların güvenliğini yasaların artık nasıl zorladığını 79. bölümde göreceksin.

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 buna cevap veriyor: hiç yer ayırma.

Yöntemin adı SYN çerezi ve Daniel J. Bernstein 1996’da önerdi. 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. 32 bitin birkaçı da zaman sayacına ve istemcinin bildirdiği MSS’in sekiz kaba değerden hangisine düştüğüne ayrılıyor. Sunucunun hatırlaması gereken en önemli seçenek böylece numaranın içinde yolculuk ediyor.

Üçü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 MSS dışındaki el sıkışma seçeneklerini, yani pencere ölçeklemeyi ve seçici onayı hatırlayacak yeri de yok. Linux bu kaybın bir kısmını geri alıyor: zaman damgası seçeneği açıksa o seçenekleri kendi göndereceği zaman damgasının düşük bitlerine saklıyor. Yine de 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 kullanıcıların fark edeceği bir kesinti yaratamadı. Üç şey birlikte çalışıyor. 3. bölümde gördüğün on üç kök adın arkasında anycast ile dünyaya yayılmış bini aşkın kopya var ve saldırı trafiği bu kopyalara bölünüyor. Trafik ayrıca süzülüyor. Resolver’lar da üst düzey alan sunucularının adreslerini önbellekte tuttuğu için sorguların çoğu köke hiç uğramıyor.

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. Tablodaki yöntemlerin hepsini daha önce gördük: sahte access point’i 32. bölümde, ARP zehirlemesini 25. bölümde, sahte DHCP sunucusunu 36. bölümde, rota kaçırmayı 45. bölümde, DNS zehirlemesini 5. bölümde.

katmanyöntemsöylenen yalanne durdurur
data link (kablosuz)sahte access point“tanıdığın ağ benim”ağ adının değil sertifikanın doğrulanması
data linkARP zehirlemesi“o IP adresi benim kartımda”dinamik ARP denetimi, port güvenliği
data linksahte DHCP sunucusu“varsayılan geçidin benim”switch’te DHCP gözetimi
networkrota kaçırma“o öneke giden en iyi yol benden geçiyor”RPKI ile önek kaynağı doğrulaması, ilan süzme
application (DNS)DNS zehirlemesi“o adın adresi bu”DNSSEC, şifreli DNS

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, 12. bölümdeki 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 MITM saldırıları şifreyi kırarak değil, üç kestirmeden biriyle yürür:

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. Aynı fikir firewall’ın sınır modelini de sarsıyor. Sınırın içinde olmayı tek başına güven sebebi saymayan yaklaşıma zero trust deniyor. Google 2014’te BeyondCorp adıyla çalışanlarının iç ağ ayrıcalığını kaldırdığını anlattı: her istek, nereden gelirse gelsin, kullanıcının ve cihazın kimliğine göre yargılanı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öntemhangi katmandane yapıyoryan hasarı
ad çözme cevabını değiştirmeapplication (DNS)resolver sahte ya da boş cevap döndürüro adı kullanan her hizmet birden düşer
adres ya da önek düşürmenetworkhedefe giden paket iletilmezaynı adresi paylaşan bütün siteler kapanır
el sıkışmadaki alan adına bakma (SNI)TLSşifreli oturum kurulmadan önceki açık alan adı okunurçok az; yöntem hedefli çalışır
protokol parmak iziDPIiçeriğe değil trafiğin şekline bakarmeşru kullanım da yakalanır
hız kısmanetworkengellemez, 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ığı. 5. bölümdeki şifreli DNS birinci satırdaki yöntemi, el sıkışmanın açık kısmını da kapatan 11. bölümdeki ECH üçüncü satırdakini daraltıyor. Her hamlenin bir karşılığı var: hedefli süzme zorlaştıkça elde kalan kaba araca, adres engellemesine başvuruluyor ve yan hasar büyüyor.

Bunun canlı bir örneği İspanya’da görüldü. Şubat 2025’ten itibaren maç yayınlarının korsan kopyalarını engellemek için maç saatlerinde Cloudflare’in paylaşılan adresleri toptan engellendi. Aynı adresleri kullanan binlerce ilgisiz site de maç günlerinde ülkeden erişilemez hâle geldi; Docker Hub gibi geliştirici hizmetleri de bunlara dahildi.

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

  • DoS bozmaz, doldurur: bant genişliğini ya da sunucu kapasitesini sahte trafikle tüketir; dağıtık biçimi binlerce ele geçirilmiş cihazdan, bir botnet’ten gelir.
  • SYN çerezi durumu pakete taşır: sunucu yarı açık bağlantı için yer ayırmaz, bağlantının kimliğini kendi sıra numarasına gömer.
  • Dağıtmak da savunmadır: kök sunuculara yönelik saldırılar anycast kopyalara bölündüğü ve cevaplar önbellekte durduğu için kullanıcıya ulaşmadı.
  • Aradaki adam şifreyi kırmaz, yolun ortasına girer: her katmanda bir yalanla; son savunma, karşı tarafın kimliğini sertifikayla doğrulamaktır.
  • Erişim kısıtlaması bir süzme kararıdır: hangi katmanda uygulandığı hem ne kadar hedefli olabildiğini hem de yan hasarın büyüklüğünü belirler.

Liste kararını verdi. Sınırın iki yanındaki ağları kurumlar işletiyor; iki kurumun sınırı arasındaki uzun yolu ise operatörler. Peki paketin o yolda geçtiği ağ senin evdekine benziyor mu?

Bölüm 51: Operatör ve Metro Ağları

İki kurumun sınırı arasında kalan yol bir operatörün ağından geçiyor 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?

28. bölümde ağları menzillerine göre sıralamıştık ve ortadaki basamağın adı metropol alan ağıydı (MAN). Operatörün metro halkası 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. 45. bölümde 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 ve artık yalnızca yerel bir ağ teknolojisi sayılmıyor. Kıtalar arası hatlarda bile taşınan şey çoğunlukla Ethernet frame’leri; altta ise ışığı dalga boylarına bölen, 54. bölümde göreceğin DWDM katmanı duruyor. Operatör ağını kurum ağından ayıran şey bu yüzden protokolün adı olamıyor. Ayıran şey switch’ten istenen yetenek listesi oluyor ve kampüs tasarımında o listenin çoğuna hiç ihtiyacın olmuyor. Operatörlerin ortak kuruluşu MEF, taşıyıcı sınıfı Ethernet’i beş özellikle tarif ediyor: standart servisler, ölçeklenebilirlik, güvenilirlik, hizmet kalitesi ve hizmet yönetimi. Kuruluş 2001’de Metro Ethernet Forum adıyla doğdu ve Haziran 2025’ten beri Mplify adını taşıyor.

Mesafe de aynı yönde büyür. Standart, 1000BASE-LX için tekli mod fiberde 5 kilometre öngörür; 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 interface’lerdir. Bugün aynı işi 400 Gbit/s’le yapan takılabilir modüller (400ZR) router’ın portuna doğrudan takılıyor ve iki veri merkezini, arada ayrı bir optik taşıma cihazı olmadan, 80 kilometreye kadar bağlıyor.

Sorumluluk nerede bitiyor?

Operatörün ağı müşterinin binasında bir yerde biter. O bitiş noktasının adı demarkasyon noktasıdır (demarc) 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 (customer premises equipment, CPE). Demarkasyon noktasından operatörün binasına uzanan parçaya yerel döngü (local loop) denir. O binanın İngilizcedeki adı merkez ofis (central office), Türkiye’deki yaygın adı santral: operatörün switch’li ağı orada başlar ve şehirdeki abone hatları orada toplanır. Rakip operatörlerin bu hattı kiralamasının Türkiye’deki adını, YAPA’yı, 60. bölümde göreceksin.

Geniş alan bağlantısı çoğu zaman operatörden kiralanır. Router’ın WAN interface’i 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 tipik olarak 64 kbit/s ile 2 Mbit/s arasında satılıyordu: üst ucu ABD’de 24 kanallık T1 hattının 1,544 Mbit/s’i, Avrupa’da ve Türkiye’de 32 kanallık E1 hattının 2,048 Mbit/s’iydi. Kurumsal hız aralığı buradan başladı ve metro Ethernet o pazarı devraldı.

Servis tipini teknoloji belirlemez, sanal bağlantının şekli belirler. İki uçlu bir Ethernet sanal bağlantısı (Ethernet Virtual Connection, EVC) ü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 switch’in 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. Bir bankanın şubeleri merkeze ulaşmalı ama birbirini görmemeli; E-Tree bu tarif için var.

Her şekil iki sürümde satılır. Port tabanlı sürümde interface o servise adanmıştır ve aynı interface’te başka servis sonlanamaz. VLAN tabanlı sürümde aynı interface’te birden çok bağlantı sonlanır ve hangi frame’in hangi bağlantıya ait olduğunu 29. bölümdeki 802.1Q etiketi söyler. Altı abone servisinin künyesi MEF 6.3 belgesinde 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 (Ethernet Private Line) olur ve şubedeki interface o tek servise adanır. Aynı interface’ten veri merkezine, 192.0.2.0/24 ağına, ikinci bir bağlantı daha istersen port tabanlı sürüm yetmez. EVPL’ye (Ethernet Virtual Private Line) geçersin: iki bağlantı aynı fiziksel interface’te ayrı etiketlerle sonlanır.

bağlantı şekliport tabanlıVLAN tabanlı
noktadan noktaya (E-Line)EPLEVPL
çok noktadan çok noktaya (E-LAN)EP-LANEVP-LAN
köklü çok noktalı (E-Tree)EP-TreeEVP-Tree

Sözleşmenin sayısal çekirdeği tek bir hız rakamı değildir. Taahhüt edilen bilgi hızı (committed information rate, CIR), operatörün altına imza attığı taban hızdır. Onun üstünde bir de fazlalık hızı (excess information rate, EIR) tanımlanır: omurganın yükü uygunsa trafik sözün üstüne çıkabilir, ama o kısım garanti taşımaz. Operatör her frame’i girişte 40. bölümdeki jeton kovasına benzeyen, iki kovalı bir ölçerle renklendirir. Taahhüdün içinde kalanlar yeşil, fazlalığa düşenler sarı, ikisini de aşanlar kırmızıdır. Kırmızılar girişte atılır. Sarılar ise 802.1Q etiketindeki tek bitlik DEI bayrağıyla (drop eligible indicator) işaretlenir ve omurga tıkandığında ilk onlar atılır.

Hizmet seviyesi sözleşmesi başlıca dört ölçüyle yazılır: tek yön frame gecikmesi, 2. bölümdeki gecikme oynaması, frame 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. 40. bölümde internetin servis modelinin best effort olduğunu, garanti veren Intserv ile Diffserv’in varsayılan hâline gelemediğini görmüştük. Operatörün sattığı şey, o garantinin tek bir müşteri ve tek bir omurga için sözleşmeye geçmiş hâlidir. Söz yalnızca operatörün kendi ağının sınırına kadar geçerli.

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. Yönteme Q-in-Q deniyor ve IEEE onu 2005’te 802.1ad adıyla standartlaştırdı. 4 baytlık tek etiket azami frame’i 1.518 bayttan 1.522 bayta çıkarır. Operatör kendi dış etiketini eklerse frame 1.526 bayta gider. Zarf frame’i (envelope frame) bu işi resmileştirir: 1.500 baytlık veriye 482 bayta kadar etiket ve başlık alanı ekler ve azami frame 2.000 bayta çıkar. Tek etiketli frame’in asgari veri alanı ise 42 bayta düşer; etiketin 4 baytı eksik kalan yeri doldurduğu için 64 baytlık asgari frame boyu korunur.

Dış etiket operatöründür, iç etiket müşterinin. Müşteri kendi numaralarını serbestçe seçmeye devam eder ve omurgadaki switch’ler yalnızca dış etikete bakarak iletir.

Numara sorunu böyle çözülür, iki sorun ise yerinde durur. Birincisi tablo: omurgadaki switch’ler hâlâ müşterilerin MAC adreslerini öğrenmek zorunda ve bütün bir şehrin cihazları aynı tablolara doluyor. IEEE bu yüzden 2008’de 802.1ah standardını yayımladı: müşterinin frame’i bütünüyle operatörün kendi MAC başlığının içine konuyor (MAC-in-MAC). İkincisi çap: 27. bölümdeki spanning tree’nin standardı en fazla yedi switch’lik bir ağ çapı önermişti ve zamanlayıcılar bu çapa göre hesaplanmıştı. Data link layer’ı bir şehre yaymanın bedeli buradan görünüyor. Operatörler omurgada bu yüzden başka bir fikre döndü: etikete.

Etiket, adresin yerine geçmez

MPLS’in (Multiprotocol Label Switching) ilk vaadi hızdı. 39. bölümdeki en uzun önek eşlemesinin yerini sabit uzunlukta bir etiket alacak, router tek bir tablo satırına bakıp paketi geçirecekti. 1990’ların ortasında bu gerçek bir kazançtı. Birkaç yıl içinde en uzun önek eşlemesini de hat hızında yapan donanımlar çıkınca hız avantajı eridi. MPLS yine de kalıcı oldu, çünkü asıl değeri başka yerde çıktı: trafiği istenen yola sokmak ve aynı omurgada birbirinden yalıtılmış müşteri ağları taşımak. 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 2001

20 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şıdı ve RFC 5462 2009’da alanın adını buna uygun olarak Traffic Class yaptı. 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 (forwarding equivalence class, FEC) düştüğüne yalnızca ağa girerken karar verilir. Aynı sınıfa düşen paketlerin izlediği yolun adı etiket anahtarlamalı yol, kısaca LSP (label switched path). Operatörün sattığı sanal devrenin altındaki gerçek nesne budur.

Sonraki her atlamada iş sadeleşir. Etiket anahtarlamalı router, kısaca LSR, IP adresine hiç bakmaz. Gelen etiketi kendi tablosunda arar, yerine bir sonraki router’ın beklediği etiketi yazar ve paketi o çıkış interface’ine verir. İşlemin adı etiket değiştirme (swap). Etiketin anlamı yereldir: yalnızca iki komşunun üstünde anlaştığı bir sayıdır, bu yüzden 20 bitlik uzay her bağlantıda baştan kullanılabilir. MPLS iletim tablosu IP iletim tablosundan ayrıdır ve verdiği karar IP’nin vereceği karardan farklı olabilir.

Etiketin her durakta nasıl değiştiğini takip edelim:

Üç atlama boyunca değişen tek şey: şeridin üstündeki sayı
şube 198.51.100.0/24merkez 203.0.113.0/24girişşeridi takarLSRetikete bakarLSRetikete bakarçıkışşeridi alırşeritpaketin içindeki IP başlığı198.51.100.7 → 203.0.113.20471119023350etiketsizhiçbir atlamada okunmadı
Giriş router'ı 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.
  1. Giriş router'ı 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.
  2. İlk LSR etikete bakıyor. Gelen değer kendi iletim tablosunda aranıyor, çıkış interface'i bulunuyor ve şeride yeni bir değer yazılıyor. Hedef adres hiç sorulmuyor.
  3. İkinci LSR 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.
  4. Çıkış router'ı ş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.
  5. 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.

Şemadaki gibi etiketi çıkış router’ı da sökebilir. Çoğu ağda ise bu iş bir önceki router’a bırakılıyor (penultimate hop popping); çıkış router’ı böylece etikete hiç bakmadan doğrudan IP iletimi yapıyor ve her pakette bir tablo aramasından kurtuluyor.

IP ile MPLS’in farklı karar verebilmesi bir kusur sayılmaz, satılan özelliğin kendisidir. Aynı hedefe giden trafik, routing protokolünün seçtiği en kısa yol yerine kapasitesi boş olan başka yollara dağıtılabilir; bunun adı trafik mühendisliğidir. Hızlı yeniden yönlendirme (fast reroute) ise yedek yolları bağlantı kopmadan önce hesaplamaya dayanır. Kopuş anında hesap değil, seçim yapılır ve geçiş, SONET halkalarından miras kalan hedefle 50 milisaniyenin altında biter.

Bunun için routing protokolleri de genişletilir. 42. bölümdeki OSPF ve IS-IS’in link state ilanlarına her bağlantının toplam ve ayrılmış bant genişliği eklenir. Giriş router’ı bu bilgiyle kısıtları sağlayan bir yol hesaplar ve yolu RSVP-TE ile uçtan uca kurar; yol üstündeki her router hem etiketi hem ayrılan bant genişliğini kaydeder.

MPLS data link layer ile network layer’ın arasında çalıştığı için şaka yollu 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 frame’leri de etiketli omurgadan sanal bir kablo gibi geçebilir; bu tünellere pseudowire deniyor. Operatörlerin en çok sattığı kurumsal hizmet de buradan çıkıyor. MPLS L3VPN’de (RFC 4364) her müşterinin yol tablosu ayrı tutulur (VRF) ve iki müşteri aynı 10.0.0.0/8 bloğunu kullansa bile paketleri karışmaz. Paketin başında iki etiket vardır: dıştaki nereye gideceğini, içteki hangi müşteriye ait olduğunu söyler. S bayrağının neden var olduğunu en iyi bu yığın gösteriyor.

Bedeli yükten çıkar. 20. bölümde her zarf MTU’dan yer yiyordu; her MPLS etiketi de 4 bayt ekler. Operatör MTU’yu büyütmezse bu baytlar müşterinin yükünden çıkar ve iki etiketli bir VPN’de 1.500 bayt 1.492’ye iner. Operatörler bu yüzden omurgada MTU’yu çoğunlukla 9.000 baytın üstüne çıkarır ve müşteri 1.500’ünü korur.

Yolu ağa yazmak yerine pakete yazmak

MPLS’in bedeli kontrol düzleminde. RSVP-TE ile kurulan her yol için, yol üstündeki her router’ın bir satır tutması gerekiyor; etiketleri dağıtan LDP ve RSVP-TE de routing protokolünün yanında ayrıca kuruluyor, ayrıca işletiliyor. Bin tünelli bir omurgada yol üstündeki bir router bin ayrı durum tutabiliyor.

Bu yükü ortadan kaldıran fikrin adı segment routing. IETF’te 2013’te çalışılmaya başlandı ve 2018’de RFC 8402 ile standartlaştı. Tersine çeviriyor: yolu ağa dağıtmak yerine paketin başına yazıyor.

Gönderen kenar router, 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 router’a, en kısa yoldan git” diyor. Komşuluk segmenti ise “şu bağlantıdan çık” 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 router’ların 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.

Fikir yeni değil. IPv4 başlığı 1981’den beri aynı işi yapabilen bir seçenek taşıyor: kaynak yönlendirme (source routing), yani gönderenin yolu pakete yazması. Saldırganın paketleri süzgeçlerin etrafından dolaştırmasına izin verdiği için bugün ağların çoğu bu seçeneği taşıyan paketleri sınırda düşürüyor. IPv6’nın ilk kaynak yönlendirme başlığı da 2007’de kaldırıldı, çünkü bir paketi iki router arasında defalarca gidip geldirerek trafiği katlayan bir saldırıya imkân veriyordu. Segment routing’i güvenli kılan fark, listenin yalnızca tek bir operatörün kendi ağı içinde geçerli olması. Liste ağın sınırında eklenip siliniyor ve dışarıdan gelen bir liste içeride okunmuyor.

Aynı fikrin iki ayrı veri düzlemi karşılığı var. SR-MPLS listeyi az önce gördüğün etiket yığını olarak taşıyor: mevcut MPLS donanımı olduğu gibi çalışıyor, etiketleri ise artık LDP ya da RSVP-TE değil, IS-IS ya da OSPF’in kendisi ilan ediyor. SRv6 segmentleri IPv6 adresleri olarak taşıyor ve listeyi 38. bölümdeki uzatma başlıklarının yeni bir türüne koyuyor; böylece ayrı bir etiket kavramına hiç ihtiyaç kalmıyor. Bedeli boyda: her segment 16 bayt ve beş segmentlik bir liste tek başına 80 bayt tutuyor. Haziran 2025’te yayımlanan RFC 9800 bu yüzden tek bir adresin içine birden çok kısa segment sığdıran sıkıştırılmış bir biçim tanımladı.

Özet

  • Metro Ethernet bir ölçek kararıdır: aynı frame biçimi metropol 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ı santrale 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 ve onu değiştirir.
  • Segment routing durumu ağdan pakete taşır: yol, giriş router’ında paketin başına liste olarak yazılır; ara router’lar yol durumu tutmaz.

Etiket de adres de sonunda bitten ibaret ve o bitler kilometrelerce bakırdan ya da camdan geçiyor. Peki kablonun içinde bir bit neye benziyor?

Bölüm 52: 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 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, camın içinde yol alan ışık darbeleri, bir de havada yayılan radyo dalgası.

Paket 51. bölümde metro halkasında bir etiketle taşınıyordu; o etiket de sonunda bu üç biçimden birine iner. 31. bölümde ise frame havada bir kanal üzerinden veriliyordu; oradaki taşıyıcı elektromanyetik bir dalgadır. Işık da öyle, yalnızca frekansı çok daha yüksek. 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ı.

Physical layer 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ı, cihazlar açık, 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. Bir ucuna 1 Gbit/s’lik, öbür ucuna 10 Gbit/s’lik modül takılmış bir fiber tam böyle davranır: ışık karşıya ulaşıyor ama iki uç farklı hat kodu konuştuğu için hiçbir şey okunmuyor. 22. bölümdeki kip uyuşmazlığı ise bu arızanın sinsi akrabası: orada bağlantı kalkıyor, hat ancak yük binince bozuluyor.

En sade anlaşmanın adı NRZ (non-return-to-zero): sinyal bir bitin ortasında sıfıra dönmüyor, bit boyunca aynı seviyede kalıyor. Bakırda dijital 1’i tipik olarak +5 V ya da +3,3 V ile gösteriyorsun, dijital 0’ı ise 0 V ile. Bilgi doğrudan seviyenin kendisinde durduğu için bu biçime NRZ-L (level) deniyor. Optik ortamda aynı kural ışığa çevrilir: 1 parlak ışık, 0 çok daha sönük ışıktır. Lazeri her sıfırda tamamen söndürüp yeniden yakmak zaman aldığı için sıfır tam karanlık değildir. Işık kaynağının kendisi de bir tavan koyar: LED’ler yaklaşık 600 MHz’in üstünde açılıp kapanamıyor ve daha hızlı bağlantılar lazere geçiyor. 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 cam içinde iki santimetre kadar yol aldığı süre. Alıcı her kararını o pencerenin içinde vermek zorunda.

Bit tek telden mi gidiyor?

Şu ana kadar tek bir telden söz ettim ve bitleri arka arkaya dizdim. Akla gelen ilk itiraz da bu: sekiz tel çekip sekiz biti aynı anda göndersen sekiz kat hızlı olmaz mıydı?

Uzun süre öyle düşünüldü. Yazıcı kablosu, sabit disk kablosu ve bilgisayarın iç veri yolu paralel çalışıyordu; yan yana duran tellerin her biri bir bit taşıyordu. Bugün o kabloların hiçbiri kalmadı. Ağ tarafında paralel arayüz hep istisna oldu: süper bilgisayarları bağlamak için 1980’lerin sonunda tasarlanan HIPPI, 50 çiftli kalın kablosuyla en fazla 25 metreye gidebiliyordu.

Paralel hattı yıkan şey hızın kendisi oldu. Yan yana çekilen teller birbirinin tıpatıp aynısı değil: biri birkaç santimetre uzun, ötekinin yalıtımı biraz farklı, üçüncüsü kart üstünde daha sıcak bir bölgeden geçiyor. Aynı anda yola çıkan sekiz bit karşıya aynı anda varmıyor. Aradaki farkın adı saat kayması (clock skew). Sinyal bakırda nanosaniyede yaklaşık 20 santimetre yol alıyor; uzunluk farkı, sürücü devrelerinin kendi farklarıyla birleşince kayma yüzlerce pikosaniyeyi, uzun kablolarda nanosaniyeleri buluyor.

Hesabı kendin yapabilirsin. Kayma bit süresinden küçük kaldığı sürece kimse fark etmiyor. 1 Mbit/s’te bir bit bir mikrosaniye sürüyor ve birkaç nanosaniyelik fark görünmüyor bile. 1 Gbit/s’te aynı bit bir nanosaniyeye iniyor; artık kaymanın kendisi bitin boyundan büyük ve alıcı hangi bitin hangi kelimeye ait olduğunu söyleyemiyor. Hız arttıkça bit süresi kısalıyor ama tellerin fiziksel farkı olduğu yerde duruyor.

İkinci fatura komşuluktan geliyor. Yan yana duran teller birbirine sinyal indüklüyor ve bu girişim frekansla birlikte büyüyor; adını bir sonraki bölümde koyacağım.

Çözüm tel sayısını artırmak değil, azaltmak oldu. Tek bir çift üstünde bitleri sıraya dizip sembol hızını yükseltmek, sekiz teli senkron tutmaya çalışmaktan hem ucuza geldi hem daha güvenilir çıktı. Sektörün tamamı aynı yöne yürüdü.

eski, paralelyerini alan, seri
yazıcı portuUSB
PATA disk kablosuSATA
PCI veri yoluPCIe
paralel SCSISAS

Bugün paralel görünen hatlar da aslında seri. PCIe x16 on altı şeridi, 100 Gbit/s Ethernet’in yaygın biçimleri dört şeridi birden kullanıyor, ama her biri kendi başına seri bir hat. Veriyle birlikte giden bir saat teli yok; her şerit örnekleme saatini kendi sinyalinden çıkarıyor. Bunlara tel yerine şerit (lane) deniyor. Şeritler arasında kalan küçük kaymayı alıcı, akışa aralıklarla serpiştirilmiş hizalama işaretlerine bakarak tamponla düzeltiyor. Paralelden farkı şu: kayma tek tek bitleri değil, bağımsız akan şeritleri ilgilendiriyor ve düzeltmesi çok daha kolay.

Alıcı sembol sınırını nereden bilir?

Şu ana kadar alıcının bitleri saydığını söyledim ve nasıl saydığını hiç sormadım. Sorunun ne kadar ciddi olduğunu tek bir hesapla göreceksin.

Alıcının kendi saati var ve o saat göndericininkiyle tıpatıp aynı hızda çalışmıyor; aradaki farka saat sapması (clock drift) deniyor. Ethernet standardı her iki uçtaki kristale milyonda 100’e kadar sapma izni veriyor. İki uç ters yönlere saparsa fark milyonda 200’ü buluyor. Kulağa önemsiz geliyor. Şimdi çarp: milyonda 200, beş bin bitte tam bir bitlik kayma demek. 1.500 baytlık tek bir frame 12.000 bit tutuyor. Alıcı saatini hiç tazelemeseydi frame’in yarısına varmadan bir bit kaymış olurdu ve o noktadan sonra okuduğu her şey yanlış olurdu.

İkinci sorun elektriksel. Yolun üstünde trafo ve kondansatör var; ikisi de sabit gerilimi geçirmiyor, yalnızca değişimi geçiriyor. Hat uzun bir sıfır dizisi boyunca aynı seviyede kalırsa alıcının “yüksekle alçağın ortası neresi” kararı yavaşça sürükleniyor. Adı baseline wander (taban kayması) ve sonucu ağır: bir süre sonra alıcı yüksekle alçağı ayırt edemiyor.

İki sorunun tek bir ortak çaresi var. Sinyalin içinde düzenli geçişler bulunmasını garanti et; geçiş hem saati tazeliyor hem tabanı yerinde tutuyor. Aşağıdaki şemaların hepsi bu tek işi farklı bedellerle yapıyor.

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. Tek başına geçiş garantisi ise vermiyor: geçiş yalnızca bir değerde geliyor ve öteki değerin uzun bir dizisi hattı yine susturuyor. USB kuralı tersine çevirip geçişi 0’a koyuyor ve art arda altı 1’den sonra araya zorla bir 0 sıkıştırıyor (bit stuffing); böylece hat en geç yedi bitte bir kıpırdıyor.

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ü de işe yarıyor: kutup sırasının bozulması (bipolar violation) tek başına bir hata işareti sayılıyor, yani hat kodu basit bir hata sezme mekanizmasını bedavaya taşıyor.

AMI’nin de bir açığı var: uzun bir sıfır dizisinde hat susuyor ve saat yine kayboluyor. ABD’nin T1 hatları bunu B8ZS ile, Avrupa’nın ve Türkiye’nin E1 hatları HDB3 ile çözüyor. Çözüm kurnaz: sekiz ya da dört sıfırlık bir dizi, kutup kuralını bilerek çiğneyen bir desenle değiştiriliyor. Alıcı bu kasıtlı ihlali tanıyor ve yerine sıfırları koyuyor; hata işareti, saati kurtaran bir koda dönüşüyor.

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 başındaki 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ği şu: 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.

Beşini yan yana koyunca ödünleşim tek bakışta görünüyor:

kodgeçiş garantisiDC bileşenisembol/bitnerede
NRZyokvar1RS-232, kısa hatlar
NRZIyalnızca bir değerde (USB’de 0’da)var1USB, 4B/5B’nin altında
Bipolar-AMIyalnızca 1’lerdeyok1T1 ve E1 hatları
Manchesterher bitteyok210 Mbit/s Ethernet
Farksal Manchesterher bitteyok2Token Ring

Üçüncü sütun neden önemli, artık biliyorsun: DC bileşeni olan bir kod baseline wander’a açık kalıyor. Dördüncü sütun ise faturayı gösteriyor. Geçiş garantisi bedava değil; her bitte geçiş isteyen kod, aynı veri için iki kat sembol yakıyor.

Aynı bit dizisinin farklı kodlamalarda nasıl göründüğünü karşılaştıralım:

Aynı bit dizisi, üç hat kodlaması
Aynı sekiz bit, üç dalga biçimibit dizisi10110010NRZ-LNRZIManchesterGeçiş sayısı: NRZ-L 5 · NRZI 4 · Manchester 10Manchester her bit süresinde en az bir geçiş garanti eder; bedeli iki kat sembol hızıdır.
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.
  1. 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.
  2. 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.
  3. 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. Soldaki kısa çizgi önceki seviye: ilk bitin geçişi onunla görünüyor.
  4. 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.
  5. Faturayı baud ödüyor. Bu dizide NRZ-L beş, NRZI dört, 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.

Üçüncü cevap: baştan anlaşmak

Saati gömmek tek çıkar yol değil. En eski cevap çok daha sade: iki uç hızda baştan anlaşsın, alıcı da her karakterde yeniden hizalansın.

Hat boştayken sabit bir seviyede duruyor. Gönderici konuşmaya başlayacağı zaman önce o seviyeyi tersine çeviriyor ve tek bitlik bu işarete start biti deniyor. Alıcı o kenarı görünce kendi saatini sıfırlıyor, sonra bit sürelerinin ortasını sayarak veriyi okuyor. Karakterin sonunda hat boş seviyeye geri dönüyor: stop biti. Sekiz veri biti, eşlik biti (parity) yok, bir stop biti: sahada 8N1 diye anılan ayar bu. Router konsoluna bağlanırken girdiğin 9600 8N1 de bu anlaşmanın kendisi; ilk sayı saniyedeki bit.

Anlaşmanın bedeli tolerans. Alıcının saati göndericininkinden yüzde birkaç saparsa karakterin sonuna varıldığında hizalama kaymış oluyor ve stop biti beklenen yerde bulunamıyor; bu duruma çerçeveleme hatası (framing error) deniyor. Her karakterde yeniden hizalandığı için hasar o karakterle sınırlı kalıyor, hattın tamamı bozulmuyor. Gömülü saatin bedeli bant genişliğiydi; burada bedel senkron kalabildiğin süre. Bir bedel daha var: her sekiz veri bitine iki çerçeve biti eklendiği için yük %25.

RS-232 bu şemanın en tanıdık uygulaması ve 1960’tan beri ayakta. İlginç yanı gerilimi: mantıksal 1’i eksi 3 ile eksi 15 volt arasında, 0’ı ise artı 3 ile artı 15 volt arasında gösteriyor. Yani hem çift kutuplu hem ters mantıklı. Mikrodenetleyicilerin 0 V ile 3,3 ya da 5 V arasındaki mantık seviyelerine, eski adıyla TTL seviyelerine (IP’deki TTL ile ilgisi yok) doğrudan bağlanamıyor ve arada bir seviye çevirici istiyor. Geniş gerilim aralığı bir kusur değil, gürültüye karşı bilerek alınmış bir marj.

Peki bu kadar eski bir şey ağda neden hâlâ duruyor? Çünkü hiçbir şeye ihtiyacı yok. Sürücü yüklemiyorsun, adres almıyorsun, karşı tarafla hız pazarlığı yapmıyorsun, bir protokol yığını ayağa kalkmasını beklemiyorsun. Ağ çöktüğünde, cihaz açılışta takıldığında ya da yapılandırma bozulduğunda çalışan tek yol o kalıyor. Router ile switch’lerin konsol portunun hâlâ seri olmasının sebebi budur; 41. bölümde o porttan cihaza bağlanmıştık.

Özet

  • Sinyal fiziksel bir büyüklüktür: bilgi bir gerilimde, bir ışık darbesinde ya da bir radyo dalgasında taşınır ve bit diye bir nesne telde bulunmaz.
  • Seri hat paraleli hızla yendi: yan yana teller aynı anda varmıyor ve saat kayması bit süresinden büyüdüğü anda paralel hat okunamaz oluyor; çare tel sayısını azaltmak oldu.
  • Saat iki ayrı yoldan kaybediliyor: milyonda 200’lük saat sapması beş bin bitte bir bit kaydırıyor, uzun sabit diziler de baseline wander ile yüksekle alçağın sınırını sürüklüyor; hat kodlarının hepsi bu iki soruna karşı geçiş üretiyor.
  • 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.
  • Üçüncü yol baştan anlaşmaktır: asenkron seri hızda önceden uzlaşıp her karakteri start ve stop bitiyle çerçeveliyor; RS-232 hiçbir hazırlık istemediği için konsol portunda hâlâ ayakta.

Hat kodları her sembole tek bir bit koydu ve saati kurtarmanın faturasını geçişlerle ödedi. Peki bir sembol aynı anda birden çok bit taşıyabilir mi, taşıyabiliyorsa bunun bir tavanı var mı?

Bölüm 53: Sembol Hızı ve Kanal Kapasitesi

Taşıyabilir; bugünkü hızlı hatların hepsi bunu yapıyor. Ama her sembole eklenen bit alıcının işini zorlaştırıyor ve bir noktada fizik izin vermiyor.

O noktayı ne belirliyor: kablonun bandı mı, gürültü mü, yoksa ikisi birden mi?

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, böylece 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; birim adını telgraf mühendisi Émile Baudot’dan alıyor. 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.

Blok kodlama ise ters yönde bir bedel öder. 4B/5B her 4 bitlik bloğu 5 bitlik bir koda çevirir, yani 100 Mbit/s’lik veri akışı hatta 125 Mbaud’a dönüşür. Yük %25 olur; asenkron serideki 8N1 ile aynı oran. Aynı iş Manchester ile yapılsaydı 200 Mbaud gerekirdi; şema sembol hızından %37,5 tasarruf ediyor.

5 bitle 32 desen üretebiliyorsun ve bunların 16’sını veriye ayırıyorsun.

Peki o 16’sı hangi ölçütle seçildi? Cevap önceki bölümdeki saat sorununa dayanıyor: hiçbir kod uzun bir sabit dizi üretmeyecek. Seçilen desenler ardışık sıfır sayısını üçle sınırlıyor ve sınır iki sembolün birleştiği yerde de bozulmuyor. Yani 4B/5B rastgele bir eşleme değil; saat kaybını tasarımla imkânsız kılan bir seçim. Yüzde 25’lik yükün karşılığında aldığın şey bu garanti.

Kalan desenlerin bir kısmı IDLE gibi denetim sembollerine ayrılıyor, geri kalanı geçersiz sayılıyor ve hatta görülürse hata olarak yakalanıyor. 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. 2010’da gelen Energy-Efficient Ethernet (802.3az) bu sürekli akışı, trafik yokken hattı kısa uykulara sokarak kesiyor.

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. 100BASE-TX veriyi MLT-3’e vermeden önce bir de karıştırıcıdan (scrambler) geçiriyor: veri rastgeleleşiyor, yayılan enerji tek bir frekansta toplanmıyor ve geçiş yoğunluğu artıyor.

şemaeşlemeyüknerede
Manchester1 bit → 2 sembol%10010 Mbit/s Ethernet
4B/5B + MLT-34 bit → 5 sembol%25100BASE-TX
8B/10B8 bit → 10 bit%251000BASE-X (fiber)
64B/66B64 bit → 66 bit%3,12510 Gbit/s ve üstü fiber
64B/65B + PAM1664 bit → 65 bit%1,562510GBASE-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; IBM’de Widmer ile Franaszek 1983’te yayımladı. 10 bitle 1.024 desen yazılabiliyor. 256 veri baytının çoğu, bir ile sıfır sayısını dengede tutmak için iki ayrı desenle yazılıyor; bir düzine desen denetim karakterine ayrılıyor, geri kalanı geçersiz. 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. 64B/66B dengeyi ayrı bir tabloyla değil karıştırıcıyla sağlıyor ve her 64 bitlik bloğun önüne yalnızca iki bitlik bir eşzamanlama başlığı ekliyor.

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. Dahası her çift iki yönü aynı anda taşıyor: iki uç aynı telden aynı anda gönderiyor ve her alıcı, kendi gönderdiği sinyali duyduğu karışımdan çıkararak karşı tarafı ayırıyor (echo cancellation). Dört çiftin saati de ortak: uçlardan biri master olup saati belirliyor, öteki saatini ondan gelen sinyalden türetiyor.

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 iniyor. Sonra 16 seviyeli darbe genliği modülasyonuyla sembol hızını 800 Mbaud’da tutuyor. Çift başına 2,5 Gbit/s ve sembol başına 3,125 bit düşüyor; kalan hataları LDPC denen güçlü bir hata düzeltme kodu temizliyor.

Fiberde hız çıktıkça aynı çare yeniden geldi. 50 Gbit/s ve üstündeki şeritler iki seviyeli NRZ yerine dört seviyeli PAM4 kullanıyor, yani sembol başına 2 bit. Bedeli, seviyeler sıklaştığı için gürültüye karşı daha dar bir marj; bu hızlarda hata düzeltme artık seçenek değil, zorunluluk.

Faturayı kablo ödüyor: 10GBASE-T’nin sinyali 400 MHz’e kadar uzanıyor. 500 MHz’e kadar tanımlı Cat6A bu yüzden 100 metreyi taşıyor; 250 MHz’e kadar tanımlı Cat6 ile erişebildiğin mesafe ise yaklaşık 55 metreye iniyor. Belirtilen en kötü durum bit hata oranı 10⁻¹²: 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. 2. bölümde 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.

Bir kare dalga ve onun yalnızca ilk beş ile ilk on beş harmonikle kurulmuş iki yaklaşımı üst üste çizilmiş. Harmonik sayısı azaldıkça kenarlar yuvarlanıp dalgalanıyor; dar bantlı bir kanalın sinyale yaptığı da budur.

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
28.000 bit/s
416.000 bit/s
824.000 bit/s
1632.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/s 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ü.

31. bölümde 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. Sinyal-gürültü oranı aynı kaldığı sürece bandı iki katına çıkarmak kapasiteyi de iki katına çıkarıyor. Vericinin gücünü iki katına çıkarmak ise, sinyal zaten gürültünün epey üstündeyse, hertz başına yalnızca bir bit ekliyor; 20 dB’lik bir hatta bu, kapasiteyi yüzde 15 kadar artırıyor.

Bu tek gözlem, kablosuz kuşakların her seferinde daha geniş kanal peşinde koşmasını ve 34. bölümdeki spektrum ihalelerinin milyarlarca dolar tutmasını açıklıyor: bant doğrusal, güç logaritmik getiri veriyor.

İ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 bir bit kalıyor. Sinyal gürültünün altına bile inebilir: GPS uydularının sinyali yeryüzüne gürültünün altında ulaşıyor ve alıcı onu, geniş bir banda yayılmış hâlde ve saniyede yalnızca 50 bitlik bir hızla dinleyerek çıkarı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, iki olasılık arasındaki tek bir 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/s

Ana metindeki gözlemler doğrudan denklemin şeklinden çıkıyor. B çarpan olarak dışarıda duruyor, yani S/N sabitken 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.

Bir incelik daha var. Termal gürültünün gücü bantla birlikte büyüyor. Güç sabitken bandı açmak S/N’yi düşürüyor ve kapasite sonsuza değil, bir tavana yaklaşıyor. Bandın getirisi ancak güç de onunla birlikte artarsa doğrusal kalı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 1948’de o kodlamanın nasıl bulunacağını söylemedi, yalnızca var olduğunu kanıtladı. Sonraki yarım yüzyılın hata düzeltme kodları o kanıtın peşinden gitti. 1993’te turbo kodlar geldi. Gallager’ın 1960’ta bulup unutulan LDPC kodları da 1990’ların ortasında yeniden keşfedildi ve sınıra desibelin kesirleri kadar yaklaştı. Bugün 10GBASE-T, Wi-Fi’ın yeni kuşakları, 5G’nin veri kanalları ve 62. bölümdeki DOCSIS 3.1 LDPC kullanıyor.

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: oda sıcaklığında hertz başına -174 dBm. Her alıcı tasarımı hesabına bu sayıyla başlıyor.

24. bölümde 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. Gecikme bozulması, farklı frekansların hatta farklı hızla ilerlemesinden doğuyor: bir bitin bileşenleri karşıya dağınık varıyor ve komşu bitin üstüne taşıyor (intersymbol interference).

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. Fiziksel katmandaki bir sorunun ilk izi de çoğu zaman ethtool -S eth0 sayaçlarında, sürücüye göre adı değişen CRC hatası satırlarında belirir.

Windows’ta aynı bilgiyi PowerShell veriyor. Benim dizüstü bilgisayarımdaki çıktı şöyle:

PS> Get-NetAdapter | Format-Table Name, LinkSpeed, MediaType

Name                       LinkSpeed  MediaType
----                       ---------  ---------
Wi-Fi                      433.3 Mbps Native 802.11
Bluetooth Ağ Bağlantısı    3 Mbps     802.3
Ethernet                   0 bps      802.3
vEthernet (Default Switch) 10 Gbps    802.3

Dört satır dört ayrı hikâye anlatıyor. Kablosuz kartın 433,3 Mbit/s’i 31. bölümdeki MCS tablosundan çıkan bir satır: tek akış, 80 MHz, 256-QAM, kısa koruma aralığı. Bluetooth’un 3 Mbit/s’i, EDR denen kipinin ham hızı. Kablosu takılı olmayan Ethernet kartı 0 bps diyor, çünkü karşısında anlaşacağı kimse yok. Sanal switch’e bağlı kartın 10 Gbit/s’i ise hiçbir telden geçmiyor; ortada hat kodu olmadığı için o sayı yalnızca bir etiket.

Özet

  • Baud ile bit ayrı büyüklüklerdir: baud saniyedeki sembolü, bit hızı saniyedeki biti sayar; sembol birden çok bit taşıdığında bit hızı baud’un üstüne çıkar.
  • Blok kodlama faturayı ucuzlatır: 4B/5B ve 8B/10B yükü dörtte bire, 64B/66B ve 64B/65B yüzde birkaça indirir; çok seviyeli işaretleme de sembol başına bit sayısını büyütür.
  • Nyquist sembolü, Shannon biti sınırlar: gürültüsüz kanalın tavanını bant ve seviye sayısı, gürültülü kanalınkini bant ve sinyal-gürültü oranı belirler.
  • Bant doğrusal, güç logaritmik getiri verir: bandı ikiye katlamak kapasiteyi ikiye katlar, gücü ikiye katlamak hertz başına yalnızca bir bit ekler.
  • Termal gürültü yok edilemez: hattın tabiatındadır, gücü bantla büyür ve her alıcı tasarımı hertz başına -174 dBm ile başlar.

Ş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 54: Multiplexing 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ı multiplexing. 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. 2. bölümde devre anahtarlamayı ve bant genişliğini görmüştük; 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.

Multiplexing’in 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 multiplexer (MUX), öbür uçta onları yeniden ayıran demultiplexer (DEMUX) durur. 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 multiplexing, zaman bölmeli multiplexing ve dalga boyu bölmeli multiplexing. 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 multiplexing, 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. Otoyol benzetmesiyle söylersek herkesin kendi şeridi var.

En tanıdık örneği radyo: her istasyon havanın kendi frekans dilimini kullanıyor ve alıcıdaki düğme yalnızca hangi dilimi dinleyeceğini seçiyor. Kablolu televizyon aynı işi koaksiyel kablonun içinde yapıyor.

Aralıklar birbirine değmez. 33. bölümde hücresel kanalın kenarında bir koruma bandı 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. 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.

52. bölümde bit bakır üstünde bir gerilim eğrisine dönüşüyordu, 53. bölümde de 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 bir kez daha bindirir. Analog telefon şebekesinde 12 ses kanalı bir grup, beş grup bir süper grup, on süper grup da bir mastergroup ediyordu: 2,52 MHz’lik bir blokta 600 ses kanalı. Klasik uygulama alanı uzun mesafeydi. Koaksiyel kablo ve mikrodalga hatları binlerce ses kanalını bu yolla taşıdı; sayısal TDM ve fiber 1980’lerde bu hiyerarşinin yerini aldı.

Aynı fikri bugün de kullanıyorsun. 31. bölümde 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: ses birkaç kilohertzin altında, veri onun üstündeki geniş bantlarda. Evdeki ayırıcı ile santraldeki DSLAM ikisini birbirinden ayırıyor; ayrıntısını 59. bölümde göreceksin.

Zamanda bölmek: herkese kendi sırası

Zaman bölmeli multiplexing 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. Her dilimde bir girişten tipik olarak bir bit ya da bir bayt alınır; telefon şebekesinin T1 ve E1 hatları bayt bayt örer.

Dilimler tur tur akar ve turun da kendi adı var. Bir tura frame denir ve her kaynağa frame başına en az bir dilim düşer. Data link layer’ın frame’iyle aynı sözcük, ama 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, hattın 6 Mbit/s’e ek olarak frame hizası için küçük bir pay taşıması gerekir. TDM ağırlıkla sayısal işaretlerde kullanılır ve üstünlüğü gürültüde. Sayısal işaret her aktarma noktasında sıfırdan yeniden üretilebildiği için gürültü birikmez; analog FDM’de ise her yükseltici sinyalle birlikte gürültüyü de büyütüyordu. Telefon şebekesinin 1960’lardan itibaren TDM’e dönmesinin asıl sebebi bu.

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 (pulse code modulation, PCM) 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 ve ikisi aynı matematikten çıkıyor: B hertzlik bir bant saniyede en fazla 2B bağımsız değer taşıyabiliyor. Teoremi Sovyet mühendis Kotelnikov 1933’te bulmuştu; bugünkü biçimini Shannon 1949’da yazdı.

Telefon şebekesi insan sesini 4 kHz’lik bir banda sıkıştırmayı yeterli buldu, çünkü 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 örnek

Sayının yuvarlak olmasının bir sebebi daha var. 3.400 Hz’in iki katı 6.800 ediyor; 8.000 seçilince aradaki pay, örneklemeden önce yüksek frekansları kesen süzgece nefes alacak yer bırakıyor.

Nicemleme. 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 ve Türkiye’de A-yasası. İkisi de 1972’de, bugünkü ITU-T’nin G.711 belgesinde yazıya geçti.

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, anlaşılır konuşma için yeterli bulunan bandın ve 8 bitlik nicemlemenin çarpımı. İnsan kulağı 20 kHz’e kadar duyuyor; telefondaki sesin radyodakinden daha ince gelmesinin sebebi bu dar bant. VoLTE’nin “HD ses” dediği şey bandı 7 kHz’e genişletiyor ve örneklemeyi 16 kHz’e çıkarıyor; sesi sıkıştıran bir kodek sayesinde hatta yine de 64 kbit/s’in çok altında yer kaplıyor. Sayısal telefon hiyerarşisinin bütün basamakları 64 kbit/s’in katı olarak kuruldu ve bugün hâlâ öyle:

T1 = 24 kanal × 8 bit + 1 frame biti = 193 bit  →  193 × 8.000 = 1,544 Mbit/s
E1 = 32 zaman dilimi × 8 bit           = 256 bit  →  256 × 8.000 = 2,048 Mbit/s

E1’in 32 diliminin ikisi veri taşımıyor: biri frame hizası, biri sinyalleşme için ayrılmış. Geriye 30 kanal kalıyor; birazdan göreceğin sayı bu.

Adlarını hâlâ router kataloglarında görürsün. ISDN’in B kanalı veriyi taşır ve saniyede 64.000 bitlik kapasitesi vardır. Kuzey Amerika’da T1 diye anılan birincil hız interface’i (PRI) 23 B kanalı ile sinyalleşmeyi taşıyan, yine 64 kbit/s’lik 1 D kanalı taşır. Avrupa’da E1 diye anılan interface’te 30 B kanalı ve 1 D kanalı vardır. Veri kapasiteleri sırasıyla 1.472 ve 1.920 kbit/s eder. Evlere giden temel interface’te (BRI) ise 2 B kanalına 16 kbit/s’lik bir D kanalı eşlik ediyordu. Bir router’ın WAN interface’inde 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:

Aynı kapasiteyi frekansta ve zamanda kesmek
Aynı kapasiteyi iki yönde kesmekfrekansta bölmekzamanda bölmekfrekansfrekanszamanzamankanal 1kanal 2kanal 3kanal 4ABCABboşkoruma bandı boş kalırsusan kaynağın dilimi boş geçer
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.
  1. 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.
  2. Frekansta kesmek. Frekans bölmeli multiplexing'de her kanal kendi frekans aralığını alır ve orayı sürekli kullanır. Dalga boyu bölmeli multiplexing de bu kesimdir; ekseni ışığın rengidir.
  3. Zamanda kesmek. Zaman bölmeli multiplexing'de kesim dikeydir. Her kaynak sırası geldiğinde hattın tamamını alır; A, B ve C dilimleri tur tur devralır.
  4. İki kesimin de bedeli. Solda şeritler arasındaki koruma bandı 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: multiplexer göndermeden önce bütün giriş belleklerini tarar, frame dolana kadar veri toplar, sonra frame’i yollar. Asenkron ya da akıllı TDM diye de anılır. Otoyol benzetmesine dönersek FDM herkese kendi şeridini ayırıyor, senkron TDM herkese sabit bir geçiş sırası veriyor, istatistiksel dağıtım ise kim gelirse onu geçiriyor. Paket anahtarlama da aslında bunun bir biçimidir.

Bedeli de var. Dilim artık konumundan tanınmadığı için her veri parçası kime ait olduğunu söyleyen bir etiket taşımak zorunda; paketlerin başlık taşımasının kökü burada. Girişler aynı anda coşarsa hat yetmiyor ve fazlası tamponda sıra bekliyor. 40. bölümdeki kuyrukların kaynağı bu.

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; 63. bölümde kablo erişim ağını kurarken oraya geleceğiz.

Üçüncü bir eksen daha var: kod. Önce bir ayrımı yapalım. Multiplexing, tek bir noktanın hattı bölmesi; çoklu erişim (multiple access) ise birbirinden habersiz birçok göndericinin aynı ortamı paylaşması. Yerel ağdaki MAC protokolleri bu ikinci işin 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. GPS uyduları aynı frekansta, her biri kendi koduyla yayın yapıyor; 53. bölümde gürültünün altından çıkarılan sinyal bu.

Işıkta bölmek: aynı kesim, başka ölçek

Dalga boyu bölmeli multiplexing 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. Multiplexer onları tek fiberde birleştirir. Optik yükselteçler onlarca kilometre arayla bütün dalga boylarını birlikte yükseltir. Varışta demultiplexer hepsini yeniden ayırır.

Üçüncü parça bu yöntemi değiştiren buluş oldu. 1990’larda yaygınlaşan erbiyum katkılı fiber yükselteç (EDFA), ışığı elektriğe çevirmeden, bütün kanalları tek seferde güçlendiriyor. Daha önce her dalga boyu için ayrı bir aktarıcı gerekiyordu. C bandının uzun mesafenin evi olmasının iki sebebi var: fiberin zayıflaması en düşük değerine orada iniyor ve erbiyumun yükseltebildiği aralık tam orası.

Optik bir WDM birleştiricisi: küçük pasif gövdeden çıkan ince fiber kuyrukçuklar, ayrı dalga boylarındaki ışıkları tek bir lifte topluyor. Metnin multiplexer ve demultiplexer dediği parçanın avuç içine sığan gerçek hâli.

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. Bugünün 400 ve 800 Gbit/s’lik kanalları ise 50 GHz’e sığmıyor; ızgara bu yüzden esnek hâle geldi ve kanal genişliği 12,5 GHz’lik adımlarla ihtiyaca göre seçiliyor (flexgrid).

İ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 multiplexing (DWDM) deniyor; ızgarası yukarıdaki G.694.1. Aralığı çok geniş tutan, 20 nm adımlarla 1271-1611 nm arasına en fazla on sekiz kanal koyan biçime ise kaba dalga boyu multiplexing (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ı 58. bölümde açacağız; burada tek bir tanesi işimize yarıyor. C bandı 1530-1565 nm arasını kaplar ve DWDM’in ana bandıdı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üdü. 1996’da Fujitsu, NTT ve Bell Labs neredeyse aynı günlerde tek bir fiberde 1 Tbit/s eşiğini geçtiklerini duyurdu; üçü de oraya WDM ile varmıştı. 2024’te Japonya’daki NICT, ticari bir standart fiberin kullanılabilir bütün bantlarına 1.505 kanal yayarak 50 kilometrede 402 Tbit/s taşıdı. Aynı ekip Ekim 2025’te, O bandında ışığı üç ayrı modda taşıyarak 430 Tbit/s’e çıktı.

Kaba biçimi ise veri merkezindeki modüllerde görürsün. Kaba dalga boyu multiplexing birkaç şeridi tek fiber çiftine basar. 10GBASE-LX4 frame’i 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. Bugün 400GBASE-FR4 aynı dört rengin her birinde 100 Gbit/s taşıyor.

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

  • Multiplexing 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 koruma bandı 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.
  • 64 kbit/s ses kanalının ölçüsüdür: saniyede 8.000 örnek ve örnek başına 8 bit; T1 ve E1 bu sayının katları olarak kuruldu.
  • İstatistiksel dağıtım israfı kapatır: multiplexer giriş belleklerini tarar, frame’i doldurur ve yollar; paket anahtarlama bunun bir biçimidir ve başlık bu yüzden gerekir.
  • 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 55: İ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 saçılmadan, elektromanyetik dalga atmosferden kaybeder. Bakırda kayıp frekansla da büyüyor, çünkü yüksek frekansta akım telin yüzeyine sıkışıyor (skin effect); kablonun kategorisinin bir frekans sınırıyla yazılmasının sebebi bu.

Hız da ortamın verdiği bir sayıdır. 2. bölümde 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. Fiber de daha hızlı değil: camda ışık da aşağı yukarı aynı hıza iniyor. Fiberin üstünlüğü hızda değil, bantta ve mesafede. Havada ise sinyal ışık hızına çok yakın gidiyor; borsalar arasındaki mikrodalga hatları bu yüzden, aynı yolu fiberden milisaniyelerce önce bitiriyor.

Bakır kablo sesin birkaç kilohertzinden Cat8’in 2 GHz’ine kadar uzanan bir aralıkta kullanılır. Taşıdığı sinyal çevresinde bir elektromanyetik alan üretir ve o alan komşu tel üzerinde akım doğurur. 53. bölümde 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.

Twisted pair’in çaresi iki adımlı. Bir çiftin iki teli aynı sinyali zıt yönde taşır ve alıcı ikisi arasındaki farka bakar (differential signaling). Dışarıdan gelen bir parazit iki tele de eşit binerse fark değişmez ve parazit kendiliğinden düşer. Bunun için iki telin parazite eşit maruz kalması gerekir; büküm tam bunu sağlıyor. İki tel birbirinin etrafında döndükçe sırayla kaynağa yakın ve uzak tarafa geçiyor, iki telin arasında kalan küçük halkalarda indüklenen gerilimin işareti de her yarım turda tersine dönüyor. Toplam kendini götürür. Aynı kablodaki çiftlerin büküm adımları da bu yüzden birbirinden farklı tutuluyor; komşu iki çift aynı adımla bükülseydi birbirine karşı yine hizalanırdı. Fikir 1881’de Alexander Graham Bell’in bir patentine gidiyor: telefon hatlarını yanlarından geçen elektrik hatlarının gürültüsünden korumak için. İ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. ABD’nin TIA-569 kılavuzu, metal kanal içinde güç hattına 6,4 cm, açık güzergâhta 12,7 cm mesafe bırakılmasını ister. 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 (unshielded twisted pair) ailenin en sade üyesidir. Karakteristik empedansı 100 ohm, dış çapı yarım santimetre kadar. İç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 60603-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. İşin aslı, telefon kayıtlarındaki gerçek RJ45 başka bir şeydi: çentikli, yalnızca iki kontağı kullanılan bir modem jakı. Ethernet konnektörünün doğru adı 8P8C (sekiz konum, sekiz kontak); RJ-45 adı ona yanlışlıkla yapıştı ve kaldı. Sekiz teli o konnektöre hangi sırayla dizeceğin ayrı bir iş; sonlandırmayı 56. bölümde 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ımgenel ekrançift başına ekran
U/UTPyokyok
F/UTPfolyoyok
U/FTPyokfolyo
S/FTPörgüfolyo
SF/UTPörgü ve folyoyok

Ekran bedava gelmez. STP’nin ekranı ağ kartından duvar prizine ve oradan switch’e 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 Almanya başta olmak üzere Avrupa’nın bir kısmında tercih edilir. Aradaki fark teknik bir üstünlükten çok 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. ABD’nin yangın yönetmeliğinde 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 FEP gibi florlu plastikler kullanılır, çünkü yanarken çok daha az duman ve ısı üretirler. Avrupa Birliği’nde bu işi 2017’den beri yapı malzemeleri tüzüğünün (CPR) harf sınıfları yapıyor; kılıfta sık gördüğün LSZH ise yanarken az duman ve halojensiz gaz çıkaran malzeme demek. Sıcaklık da kablonun bütçesine giriyor. Zayıflama 20 °C’ye göre tanımlanıyor ve sıcaklık arttıkça büyüyor; 40 °C’nin üstünde artış belirginleşiyor. Aynı demetten elektrik de geçiren kablolarda (56. bölümdeki PoE) bu sınır çabuk aşılabiliyor.

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:

Kodu bir kez öğrenince aile tek bakışta okunuyor:

adhızortamazami mesafe
10BASE510 Mbit/skalın koaksiyel500 m
10BASE210 Mbit/since koaksiyel185 m
10BASE-T10 Mbit/stwisted pair, iki çift100 m
100BASE-TX100 Mbit/stwisted pair, iki çift100 m
100BASE-FX100 Mbit/sçok modlu fiber2 km
1000BASE-T1 Gbit/stwisted pair, dört çift100 m
1000BASE-SX1 Gbit/sçok modlu fiber550 m
1000BASE-LX1 Gbit/stek modlu fiber5 km
2.5GBASE-T2,5 Gbit/stwisted pair (Cat5e), dört çift100 m
5GBASE-T5 Gbit/stwisted pair (Cat6), dört çift100 m
10GBASE-T10 Gbit/stwisted pair (Cat6A), dört çift100 m
10GBASE-SR10 Gbit/sçok modlu fiber400 m
10GBASE-LR10 Gbit/stek modlu fiber10 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. Kural 25 ve 40 Gbit/s’te kırılıyor: Cat8 üstündeki 25GBASE-T ile 40GBASE-T yalnızca 30 metreye gidiyor, yani ancak bir veri merkezi sırasının içinde.

Aradaki iki satırın da bir hikâyesi var. 2016’da gelen 2.5GBASE-T ile 5GBASE-T’nin sebebi, Wi-Fi access point’lerinin gigabiti aşması oldu. Binalardaki milyonlarca metre Cat5e 10GBASE-T’yi taşıyamıyordu; ara hızlar kabloyu değiştirmeden işi kurtardı. Aynı kod bugün 400GBASE-DR4 gibi adlarda da işliyor ve sondaki sayı şerit sayısını veriyor.

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ı. Cat5 100 MHz’e çıktı ve yeni kurulumlar için artık önerilmiyor. Cat5e 2000 yılında geldi; 1000BASE-T’yi desteklemek için yakın uç diyafonisi (NEXT), uzak uç diyafonisi (ELFEXT) ve geri dönüş kaybı sınırlarını sıkılaştırdı.

Cat6 2002’de 250 MHz’e kadar tanımlandı ve geleceğe hazır olsun diye tasarlanmıştı. Ama 10GBASE-T onu da aştı ve 2008’de 500 MHz’lik Cat6A geldi. Merdiven bant genişliğiyle yazılır: Cat5e 100 MHz, Cat6 250 MHz, Cat6A 500 MHz, Cat7 600 MHz, Cat7A 1.000 MHz, Cat8 2.000 MHz. Cat6A, Cat5e’nin tam beş katı bant demektir.

28. bölümde gördüğün gibi iki 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. İlginç olan şu: Cat7 için yazılmış bir Ethernet standardı hiç çıkmadı. 10GBASE-T Cat6A ile yetindi, sonraki adım doğrudan Cat8’e atladı. TIA ve ISO komiteleri Cat8’i 25GBASE-T ile 40GBASE-T’yi dört çift bakır üzerinden, 30 metrelik bir kanalda taşımak için tanımladı.

Yapısal kablolamanın 90 metrelik temel bağlantısı ve 100 metrelik kanalı 28. bölümde ö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ı ince türlerde yarım santimetre kadar, kalın omurga kablolarında 2,5 santimetreye kadar çıkar. İçteki tek iletken, onu saran boş silindirik dış iletkenle eş eksenlidir. Aradaki dielektrik bu geometriyi kablo boyunca sabit tutar.

Kesilerek katmanları açılmış koaksiyel kablo: ortada tek bakır iletken, çevresinde beyaz dielektrik, onun üstünde örgülü ekran ve en dışta kılıf. Eş eksenli geometrinin ve empedansı sabit tutan dielektriğin fotoğrafı.

Karakteristik empedans uygulamaya göre sabitlenir. Video ve CATV’de 75 ohm, radyo vericilerinde 50 ohm, eski yerel ağlarda 50-93 ohm. Sayılar keyfi değil. Hava dielektrikli bir koaksiyelde kayıp 77 ohm civarında, taşınabilen güç ise 30 ohm civarında en iyi değerine ulaşıyor. Alıcı tarafındaki TV kabloları kaybı seçip 75’e, verici tarafındaki telsiz kabloları ikisinin ortasını seçip 50’ye yerleşti. Empedansın kablo boyunca düzensizleşmesi ise 53. bölümdeki yansımaya, dolayısıyla kayba 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,5 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.

28. bölümde hattın iki ucuna takılan 50 ohm’luk sonlandırıcıyı ve her istasyona geçirilen T konnektörü görmüştün. Bu ailenin adı BNC (Bayonet Neill-Concelman: süngü kilidi ve iki mucidinin adı). İç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, çünkü iki uçtaki 50 ohm’luk sonlandırıcı paralel bağlı. 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. Klasik koaksiyel 500 MHz’e kadar çalışır, 10 MHz’te kilometre başına 7 dB kaybeder ve repeater’ı 1-9 km’de bir ister. Twisted pair sayısal iletimde 2-3 km’de bir repeater, analog taşımada 5-6 km’de bir yükselteç ister. Fiberde yükselteç aralığı 80-100 km’yi buluyor.

Yine de yerel ağda kaybetti. Onu silen şey kablonun kendisi değil, veri yolu topolojisi ve montaj zahmetiydi: tek bir kötü konnektör bütün segmenti düşürüyordu. 1990’da gelen 10BASE-T, binalarda zaten döşeli telefon kablolarının yıldız düzenine oturdu ve arızayı tek bir kabloya hapsetti. Koaksiyel ise sahneden çekilmedi; kablo TV’nin ve 62. bölümdeki kablo internetin son kilometresinde hâlâ çalışıyor.

Kısa bakır bağlantı fikri de yaşadı. Twinaxial kablo koaksiyele benzer ama içte iki iletken taşır ve yüksek hızlı sinyali birkaç metreden 15 metreye kadar götürür. 1998’deki 802.3z’nin 1000BASE-CX’i 150 ohm’luk twinax kabloyla yalnızca 25 metreye gidiyordu; 10GBASE-CX4 standarda 2004’te, 802.3ak ekiyle girdi. Bugün veri merkezlerinde her yerde gördüğün DAC kabloları (direct attach copper) bu ailenin torunu: 25 ile 400 Gbit/s’i birkaç metrelik twinax üstünde, rafın içinde taşıyorlar. Twisted pair ise bugün 100 metrede 10 Gbit/s taşıyabiliyor. Ucuz aile, pahalı ailenin işini devraldı.

Özet

  • Büküm paraziti iki tele eşit dağıtır: çiftin iki teli aynı sinyali zıt yönde taşır, büküm dış parazitin ikisine eşit binmesini sağlar ve alıcı farka baktığı için parazit düşer.
  • Ekran süreklilik ister: ağ kartından switch’e kadar kesintisiz topraklanmayan folyo ya da örgü, kalkan olmaktan çıkıp çevredeki sinyalleri toplayan bir antene döner.
  • Standardın adı hızı, bandı ve ortamı söyler: 1000BASE-T’deki üç parça ezber yerine okuma sağlar; bakırda mesafe 100 metrede sabit kalır, 25 Gbit/s’ten sonra 30 metreye iner.
  • Kategori bir bant genişliği vaadidir: Cat5e’nin 100 MHz’inden Cat8’in 2.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 yerel ağda teknik yüzden kaybetmedi: daha geniş bantlı ve diyafoniye daha dirençli kabloyu 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 56: Bakır 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?

55. bölümde kablo ailelerini, ekranlama seçeneklerini ve bükümün paraziti iki tele nasıl eşit dağıttığını gö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.

Kılıfı soyulmuş UTP kablonun kesiti: dış kılıfın içinde dört twisted pair, sekiz tel. Her çiftin bir teli düz renkli, öbürü aynı renkte çizgili beyaz.

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ü giden sinyal orada en güçlü, karşıdan gelen sinyal ise en zayıftır. Adı yakın uç diyafonisi (near-end crosstalk, NEXT). 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. 53. bölümde 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ığı. Karşılaştırma adil olsun diye aşağıdaki kanal değerlerinin üçü de aynı frekansta, 100 MHz’te veriliyor.

kategoritanımlı bantekleme kaybı (100 MHz)yakın uç diyafonisi (100 MHz)ACR
5e100 MHz24 dB30,1 dB6,1 dB
6250 MHz21,3 dB39,9 dB18,6 dB
6A500 MHz20,9 dB39,9 dB19 dB

Tablodaki haber ekleme kaybı sütununda 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 (attenuation to crosstalk ratio, ACR). 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.

Kategori 8 kablonun kesiti: dört twisted pair ayrı ayrı folyo ekranla sarılmış, dördünün etrafında ortak örgülü ekran ve dış kılıf. Kategori yükseldikçe marjın nasıl kazanıldığının fiziksel karşılığı.

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: kablo aşağı sarkarken 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:

pinT568A rengiT568B rengiçift10/100’de işlevi
1yeşil-beyazturuncu-beyaz3 / 2gönderme +
2yeşilturuncu3 / 2gönderme −
3turuncu-beyazyeşil-beyaz2 / 3alma +
4mavimavi1kullanılmaz (analog ses)
5mavi-beyazmavi-beyaz1kullanılmaz (analog ses)
6turuncuyeşil2 / 3alma −
7kahverengi-beyazkahverengi-beyaz4kullanılmaz
8kahverengikahverengi4kullanılmaz

Dördüncü sütun asıl anlatandır. Bir sinyalin iki teli, yani + ile −, her zaman aynı çiftte olmak zorunda; 55. bölümdeki farksal iletim 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 budur. Birçok kart bu durumda kendiliğinden 100 Mbit/s’e iner (downshift): bağlantı kalkar ama hız hep 100’de kalır. Gigabit bir hattın 100 Mbit/s göstermesi, kopuk bir çiftin en sık rastlanan belirtisidir.

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, 41. bölümdeki konsol portu için yapılır. Bir uçtaki sıra 1-8 ise öteki uçta 8-1’dir.

Hangi cihaz çiftinde hangi kablo?

Çaprazın neden gerektiğini görmek için tek bir kuralı tutman yeterli: her interface gönderme işini sabit bir pin çiftinde, dinleme işini başka bir sabit çiftte yapar. Pin tablosunun son sütunu bunu zaten söylüyordu: bilgisayarın kartı 1 ile 2’den gönderiyor, 3 ile 6’dan dinliyor.

Şimdi iki bilgisayarı düz kabloyla birbirine bağladığını düşün. İkisi de 1 ile 2’den gönderiyor ve o teller karşı uçta yine 1 ile 2’ye, yani karşıdakinin gönderme pinlerine varıyor. İkisi de öbürünün ağzına konuşuyor, kimse dinlemiyor. Çaprazın yaptığı iş bu: bir uçtaki gönderme çiftini öteki uçtaki dinleme çiftine götürüyor.

Peki bilgisayarı switch’e takarken neden düz kablo yetiyor? Çünkü switch o takası kendi içinde yapıyor ve senin yapmana gerek kalmıyor. Interface’lerin adı bu yüzden ayrılıyor: uç cihazın portu MDI (medium dependent interface), ağ cihazının portu MDI-X’tir. Sondaki X zaten “içeride çaprazlanmış” demek. Bir MDI ile bir MDI-X karşılaştığında takas bir kez yapılmış oluyor, dolayısıyla kablonun düz olması gerekiyor. İki MDI ya da iki MDI-X karşılaştığında ise takas ya hiç yapılmıyor ya iki kez yapılıyor. İkisini de aynı kefeye koyabilirsin: sonuç değişmiyor ve kablonun çaprazlaması gerekiyor.

Kural şu: farklı türden iki cihaz düz kabloyla, aynı türden iki cihaz çapraz kabloyla bağlanır. Sayarken router’ın uç cihaz sayıldığına dikkat et; portu switch’inki gibi değil, bilgisayarınki gibi davranır.

cihaz çiftiport türlerikablo
bilgisayar ile switchMDI ile MDI-Xdüz
bilgisayar ile hubMDI ile MDI-Xdüz
router ile switchMDI ile MDI-Xdüz
bilgisayar ile bilgisayarMDI ile MDIçapraz
switch ile switchMDI-X ile MDI-Xçapraz
switch ile hubMDI-X ile MDI-Xçapraz
router ile routerMDI ile MDIçapraz
bilgisayar ile routerMDI ile MDIçapraz

Son satırda çoğu kişi yanılır, sen yanılma. Router’a doğrudan bilgisayar takıyorsan çapraz kablo gerekiyor. Oysa araya bir switch girdiği anda iki kablo da düz oluyor.

Eski switch’lerde bir kaçış kapısı vardı. Portlardan birinin yanında “uplink” yazar, çoğu zaman bir de düğme bulunurdu; düğme o portu MDI-X’ten MDI’ya çevirir ve iki switch düz kabloyla bağlanabilirdi. Yanındaki normal port genelde aynı devreyi paylaştığı için ikisini birden kullanamazdın.

Çapraz kabloyu bugün sahada zor bulursun. Otomatik MDI/MDI-X 1998’de geliştirildi ve 1000BASE-T ile yaygınlaştı. Interface iki düzen arasında gidip geliyor: yaklaşık 60 ms bir düzende durup karşıdan bağlantı darbesi bekliyor, gelmezse öbür düzene geçiyor. Bekleme rastgele başlatılır. Yoksa iki uç aynı anda takla atar, hiç anlaşamazlar.

Peki cihaz çifti tablosunu neden hâlâ öğreniyorsun? Çünkü o tablo artık bir kurulum zorunluluğu değil, interface’lerin birbirine nasıl baktığını gösteren bir kavrayış aracı. Standart metninde otomatik takas 1000BASE-T için zorunlu bile değil, seçimlik yazar. Yine de desteklemeyen bir interface bulmakta zorlanırsın. Gigabit’te ayrıca dört çiftin dördü birden iki yönlü çalışıyor, yani sabit bir gönderme çiftinden artık söz edemeyiz; otomatik takas orada çift sırasının karışmasını da düzeltiyor. Yukarıdaki A-B çaprazı bu yüzden yalnızca 10/100 içindi: gigabit bir çaprazda mavi ile kahverengi çiftin de yer değiştirmesi gerekirdi.

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 ve birkaç milimetrelik fazlalık bile yakın uç diyafonisi testinde kendini belli ediyor; ev yapımı kablonun testte düşmesinin en sık sebeplerinden biri bu.

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 (strain relief) 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.

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: tel boyunca bir darbe gönderip yansımanın dönme süresine bakar (time domain reflectometer, TDR). Bir sonraki bölümde göreceğin OTDR, aynı fikrin camdaki akrabası.

28. bölümde gördüğün gibi yüz metre tek bir kablonun boyu değil; kanal denen bütün, 90 metrelik kalıcı hat ile 10 metrelik patch payının toplamı. 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. 1000BASE-T ise sekizini birden kullanır. Gigabit’e geçiş kabloyu değiştirmedi, kullanılan tel sayısını ikiye katladı; 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, kısaca PoE, onların ikinci işidir.

DerinleşmeSwitch 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 switch ö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 (802.3af, 2003) kaynakta 15,4 W verir, cihazda 12,95 W bırakır. Aradaki 2,45 W kablonun ısıya çevirdiği güç: 350 mA akım 20 ohm’luk çevrim direncinden geçince kare çarpı direnç hesabı bu sayıyı verir. Tip 2 (802.3at, 2009) aynı hesabı 600 mA ile ve 12,5 ohm’luk daha iyi bir kablo varsayarak yapar: kaynakta 30 W, kabloda 4,5 W kayıp, cihazda 25,5 W.

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 switch 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ı. Tip 4 kaynakta 90 W’a, cihazda 71 W’a çıkıyor; bir ekranı ya da küçük bir bilgisayarı besleyebilecek kadar.

Özet

  • 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.
  • Çapraz kablo bir eşleştirme sorunudur: her interface sabit bir çiftten gönderir; farklı türden iki cihaz düz kabloyla, aynı türden iki cihaz çapraz kabloyla bağlanır.
  • 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.
  • 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.
  • Kullanılmayan dört tel kesilmez: gigabit sekizini birden kullanır; 10 ve 100 Mbit/s’te boştaki çiftler Power over Ethernet’in gücünü taşıyabilir.

Bakırda kablonun marjı sekiz telin sırasında ve birkaç milimetrede kazanılıyor. Camda sıraya dizilecek tel yok. Peki orada ne hizalanıyor ve iki cam lif birbirine nasıl ekleniyor?

Bölüm 57: Fiber Sonlandırma

Tek bir eksen hizalanıyor. O eksenin çapı tek modlu fiberde 9 mikron ve iki core’u (nüveyi) bir mikronluk kaçıklıkla buluşturmak gerekiyor. Pense bu işi yapamaz; tolerans mekanik değil optik.

Peki mikron ölçeğindeki bir ek sahada nasıl yapılıyor ve iyi yapıldığını nereden anlıyorsun?

Soy, kır, birleştir

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. İki yüzey arasında kalan mikron ölçekli hava boşluğu, ışığın iki kez cam-hava sınırından geçmesi demek ve her sınır ışığın yaklaşık yüzde 4’ünü geri yansıtıyor (Fresnel yansıması). Eğik bir yüzey de geçen ışığı karşı core’un kabul edebileceği açının dışına saptırı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öntemtipik kayıpyansımane zaman
kaynaştırma (fusion)0,02-0,05 dBçok düşükkalıcı hat, omurga, uzun mesafe
mekanik ek0,2-0,5 dBdaha yüksekonarı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ıdır ve pahalı bir cihaz gerektirmez, ama kaybı on 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, yani 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. Bugün en yaygın iki konnektör bu ikisi. LC’nin gövdesi SC’nin yarısı kadar yer kaplar; switch’in ön paneline bu yüzden daha çok port sığar. Paralel şeritli 100 ve 400 Gbit/s modüllerde ise 8, 12 ya da 16 lifi tek bir dikdörtgen gövdede toplayan MPO konnektörünü görürsün.

Fiber ferrülü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.

cilaalın açısıgeri yansımarenk
PC0° (küresel)−30 … −40 dByok
UPC0° (ince cila)−50 … −55 dBmavi
APC8°−60 dB ve daha iyiyeş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 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.

Işık karşıya ne kadar varıyor?

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 fiber boyunca geri saçılan ve süreksizliklerden yansıyan ışığı 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.

Her fiber bağ segmenti iki damar ister; biri gönderme, biri alma. Çaprazlama kablo tarafında yapılır, switch’in 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.

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.

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.

Özet

  • Camda tolerans mekanik değil optiktir: fiber kesilmez kırılır ve kırım açısı 0,5 dereceyi geçmemelidir; iki yüzey arasında kalan hava her sınırda ışığın yüzde 4’ünü geri yansıtır.
  • İki 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 kaybettirir; sahada en yaygını fabrika konnektörlü bir pigtail’i hatta kaynaştırmaktır.
  • Cila bir kilittir: APC’nin sekiz derecelik alnı geri yansıyan ışığı core’un dışına atar; yeşil APC ile mavi UPC birbirine takılmaz.
  • Arızaların çoğu tozdur: ferrül denetlenir, temizlenir ve yeniden denetlenir.
  • Fiberde iki ölçüm iki soruyu cevaplar: güç ölçer bağın bütçeye sığıp sığmadığını, OTDR ise kaybın nerede olduğunu söyler.

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 ne?

Bölüm 58: 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 (nüve) 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. Kabuk da 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. Örnekteki 1,47 ile 1,46 için bu değer 0,17 çıkıyor ve karşılığı şu: fiberin ucuna, eksenle en fazla 10 derecelik bir açı yapacak şekilde girebilirsin. İçeride 6,7 derece olan pay, havadan cama geçerken kırılma yüzünden dışarıda 10 dereceye genişliyor. Gerçek tek modlu fiberde indis farkı daha da küçük: NA 0,12 civarında ve yarı açı 7 dereceye iniyor. Işı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 bu dar koni.

İki ışını yan yana koyduğunda fark tek bakışta görünüyor:

Işığı core'da tutan şey geometri
kaplama · ışığı soğururkabukn₂ = 1,46coren₁ = 1,47hava n₀ = 1fark %0,68normalθ > 83,3° · tam yansımaθ < 83,3° · kabuğa kaçıyorkabul konisi ±9,9°
Core ile kabuk arasındaki fark yüzde bir bile değil. Core'un kırılma indisi 1,47, kabuğunki 1,46. Aradaki oran 0,9932; yani kabuk core'dan yalnızca %0,68 daha seyrek. Işığı içeride tutan bütün mekanizma bu küçük farkın üstünde duruyor.
  1. Core ile kabuk arasındaki fark yüzde bir bile değil. Core'un kırılma indisi 1,47, kabuğunki 1,46. Aradaki oran 0,9932; yani kabuk core'dan yalnızca %0,68 daha seyrek. Işığı içeride tutan bütün mekanizma bu küçük farkın üstünde duruyor.
  2. Açı sınıra dik doğrultudan ölçülüyor. Optikte geliş açısı yüzeyden değil, yüzeye dik olan normal doğrultusundan ölçülür. Eksene paralel giden bir ışın normalle 90 derece yapar; dikleştikçe bu açı küçülür.
  3. Yatık ışın core'da 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 core boyunca ilerliyor.
  4. 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.
  5. Girişte kabul edilen koni dar. Bu örnekte fibere ancak eksenle 9,9 dereceden az açı yapan ışık girebiliyor; sayısal açıklık NA = √(n₁²−n₂²) = 0,171 bunu söylüyor. Gerçek tek modlu fiberde indis farkı daha küçük ve yarı açı 7 dereceye iniyor; konnektör ve ek işçiliğinin mikron mertebesinde olmasının sebebi bu dar 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ığı, yani sınıra paralel yattığı anda 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 derece

Sayı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 bir sebebi bu: alanın kaplamaya ulaşmadan sönmesi için pay bırakılıyor. Kalanını elle tutulabilirlik, bükülme dayanımı ve standartlaşma belirliyor.

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

Kalın bir cam levhanın kenarından giren 405 nm’lik mor lazer, tam yansımayla zikzak çizerek ilerliyor ve geçtiği yeri yeşilimsi parlatıyor. Işığı içeride tutan şeyin ceket değil geliş açısı olduğunu doğrudan gösteriyor.

52. bölümde hat kodlamayı ve LED’in 600 MHz’lik tavanını, 53. bölümde bant genişliğinin fiziksel sınırını görmüştün; 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 100 kata kadar kuvvetlendirir. Kaynağın cinsi hızın tavanını da koyar. Eski çok modlu bağlarda ışığı LED üretiyordu; 1000BASE-SX’ten beri o işi VCSEL yapıyor ve 850 nm’de şerit başına 10, 25, bugün 100 Gbit/s’e çıkıyor. Tek modlu fiberin uzun mesafesinde ise dar spektrumlu DFB lazerler çalışıyor.

Core’un çapı sınıfı belirliyor

Tek modlu fiberde core 8-10 mikrondur ve ışık tek bir yoldan, tek bir modda 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, 9/125 tek modlu fiberi gösterir. İlk sayı core, ikinci sayı kabuk.

Bir mikron metrenin milyonda biridir. Bir insan saçı 50 ile 100 mikron arasında kalır; 125 mikronluk kabuk kalınca bir saç teli kadardır, 9 mikronluk core ise onun onda biri.

Elindeki kabloyu soyduğunda karşına çıkacak katmanların çapları standarttır ve sırayı bilmek sonlandırmanın yarısıdır:

katmançapişi
core9 / 50 / 62,5 µmışığın ilerlediği cam
kabuk125 µmtam yansımayı kuran ve sönümlü dalgayı sönümleyen cam
birincil kaplama250 µmakrilat; camın yüzeyindeki çatlakların büyümesini durdurur
sıkı tampon900 µmelle çalışılabilir kalınlık, renk kodu bu katmandadır
mukavemet elemanıiplik demetiaramid iplik; çekme kuvvetini cam yerine kendi taşır
dış kılıf2-3 mmmekanik 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. Kablonun veri sayfası iki çekme sınırı verir: kurulum sırasındaki kısa süreli yük ve kurulumdan sonraki kalıcı yük. Kalıcı olan çok daha düşüktür, çünkü cam sürekli gerilim altında zamanla yorulur.

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. Evlere giden kablolarda bu yüzden bükülmeye dayanıklı G.657 fiber kullanılıyor; duvar köşesinden dönen 7,5 hatta 5 milimetrelik yarıçaplarda bile kaybı düşük kalıyor.

Üçü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. Tek modlu fiber için yapılmış bir 1000BASE-LX modülünü çok modlu fibere bağlarsan lazer ışığı core’un tam merkezine düşer ve huzme bölünebilir. Çözüm, ışığı kasten eksenden kaydırarak veren mod şartlandırma patch kablosudur.

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ıf850 nm1.300 nm
OM1200 MHz·km500 MHz·km
OM2500 MHz·km500 MHz·km
OM31.500 MHz·km500 MHz·km
OM43.500 MHz·km500 MHz·km
OM53.500 MHz·km500 MHz·km

OM5 tabloya yeni bir sayı değil, yeni bir bant ekliyor: 2016’da tanımlandı ve bant genişliğini 953 nm’ye kadar garanti ediyor; kısa dalga boylarında birkaç rengi aynı çok modlu lifte taşımak için. Sınıfların hepsinde 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:

Aynı darbe, iki fiberde iki ayrı yayılma
çok modlu core · 62,5 mikrontek modlu core · 9 mikronkaynaklazer darbesialıcıdarbe genişledialıcıdarbe yine genişledikısa yoluzun yolikisi aynı anda varmıyortek doğrultugeç kalan dalga boyu
Kaynak keskin bir darbe basıyor. Elektrik işareti lazer diyotta ışığa çevriliyor. Fibere giren şey zamanda dar, kenarları keskin bir ışık darbesi.
  1. Kaynak keskin bir darbe basıyor. Elektrik işareti lazer diyotta ışığa çevriliyor. Fibere giren şey zamanda dar, kenarları keskin bir ışık darbesi.
  2. Çok modlu core'da yol tek değil. Core 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.
  3. 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.
  4. Tek modlu core'da yol tektir. Core 9 mikrona indiğinde ışığa tek doğrultu kalıyor. Modal dispersiyon burada oluşmuyor, çünkü uzunluğu farklı ikinci bir yol yok.
  5. 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). Uzun mesafede bu yayılmayı eskiden özel fiber makaralarıyla geri sarıyorlardı; bugünün koherent alıcıları aynı işi sayısal işlemciyle, hesapla yapıyor.

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 multiplexing’inin neden tam oraya yerleştiğini 54. bölümde görmüştün. 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

53. bölümde 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 1550 nm’de tipik olarak 0,2 dB/km civarında ölçülür.

Peki neden 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 dördüncü kuvvet.

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 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ı. 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 konnektör çifti iyi işçilikte 0,3 dB civarında kayıp getirir; TIA’nın izin verdiği üst sınır 0,75 dB, kirli ya da hasarlı bir uç ise 2 dB’yi bulabilir. 10 km’lik tek modlu bir hattı 1310 nm’de hesapla: 0,4 dB/km cam kaybı 4,0 dB eder, iki iyi konnektör çifti 0,6 dB. Toplam 4,6 dB. 10GBASE-LR’nin 6,2 dB’lik kanal ekleme kaybı bütçesine 1,6 dB pay kalır.

Aynı hatta iki kirli konnektör 2,0’şer dB getirirse toplam 8,0 dB’ye çıkar ve bağ bütçeyi aşar. İki kirli uç, on kilometre cam kadar kayıp getiriyor. Kötü yapılmış bir ek, parmak yağı ya da toz aynı hesaba girer.

Fiber optik konnektörün ucu: seramik kılavuz halkanın ortasında lifin parlatılmış yüzeyi. Bütçeyi bitiren yer bu yüzeydir; parmak yağı ya da toz doğrudan kayba yazılır.

Kaybın nerede olduğunu 57. bölümdeki OTDR gösteriyor: 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-LR 1310 nm’de 10 km’ye çıkarken 10GBASE-ER 1550 nm’de 10,9 dB’lik bütçesiyle 30 km’ye gider.

Bu kuralı bozan yeni bir fiber var. İçi boş fiberde (hollow-core) ışık camın içinden değil, cam bir kafesin ortasındaki havadan geçiyor ve yaklaşık yüzde 45 daha hızlı gidiyor; gecikme üçte bir kadar kısalıyor. Southampton Üniversitesi ile Microsoft’un Eylül 2025’te yayımladığı tasarım 1550 nm’de 0,091 dB/km’ye indi ve camın 0,14 dB/km civarındaki tabanını ilk kez geçti. Microsoft bu fiberden bin kilometreyi aşkın bir hattı bulut omurgasında canlı trafikle kullanıyor.

Renk kodu da bilgi taşır. TIA kodunda tek modlu fiber sarı, OM1 ile OM2 turuncu, OM3 ile OM4 su yeşili, OM5 ise açık yeşildir. 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.

51. bölümdeki taşıyıcı sınıfı bir metro Ethernet devresinin altında çoğu zaman bu cam lif yatıyor.

Özet

  • 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 gerçek tek modlu fiberde bu yarı açı 7 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.
  • Fiber hızlı değil geniştir: camda ışık bakırdaki sinyal kadar yavaş gider; gecikmeyi ancak ışığı havadan geçiren içi boş fiber kısaltıyor.

Cam lif kıtayı geçiyor ve mesafeyi artık ışığın hızıyla ölçüyorsun. Ama pek çok evde son kilometre 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 59: Bakır Erişim Ağı: DSL

Camın içinde ışığı tutan fiziği kurduk ve fiber artık şehirlere kadar iniyor. Ama pek çok eve hâlâ bakır giriyor, üstelik o bakır internet için çekilmedi. Türkiye’de denge daha yeni değişti: BTK’nin 2026 ilk çeyrek verilerine göre sabit genişbant aboneliklerinin yüzde 48,5’i fiber, yüzde 39,3’ü hâlâ bakır üstündeki DSL; eve kadar fiber tek başına DSL’i ilk kez geride bıraktı.

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?

Evden ilk router’a

İsteğin evden çıkıp operatörün ağına girdiği parçanın bir adı var: erişim ağı (access network). Tanımı kısa: bir uç sistemi, yani bilgisayarını ya da telefonunu, yolundaki ilk router’a bağlayan ağ. O ilk router operatörün sana en yakın router’ıdır ve adı kenar router (edge router). Evdeki kutu da bir router, ama o senin ağının kapısı; erişim ağı o kapıyı operatörün kenar router’ına bağlayan hat. 51. bölümdeki metro halkası ve omurga kenar router’ın arkasında başlıyor.

Bu hattı bugün dört yoldan biri kuruyor ve dördünün de iki ucunda aynı ikili duruyor: evde bir modem, karşıda operatörün onu sonlandıran cihazı.

erişim yoluevdeki uçoperatördeki uçhat
DSLDSL modemDSLAMtelefonun bakır çifti
kablokablo modemCMTSkablo TV’nin koaksiyeli
eve kadar fiberONTOLTcam lif
mobiltelefonun kendisibaz istasyonuradyo

Operatördeki uca sonlandırıcı denmesinin sebebi işinde: evden gelen fiziksel sinyal orada biter, içindeki veri operatörün ağına oradan girer. Mobil erişimi 33. bölümde görmüştün; bu bölüm ile bir sonraki bakırı, ardından gelen üç bölüm fiberi ve kabloyu açıyor. Evdeki Wi-Fi bu tabloda yok, çünkü o bilgisayarını operatöre değil evdeki kutuya bağlıyor; ders kitapları onu evin ve kurumun içindeki erişim ağı olarak ayrıca sayar.

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. 51. bölümde ona yerel döngü demiştik. 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, ana dağıtım çatısı denen dev bir çerçevede (main distribution frame, MDF) uçları görünecek şekilde sonlanır.

Bir apartmanı düşün. Her dairenin prizinden çıkan çift binanın girişindeki dağıtım kutusuna iniyor. Oradan sokağa çıkan kablonun içinde daire sayısı kadar, çoğu zaman yedekle birlikte daha fazla çift var: binanın tek bir hattı yok, her dairenin kendi hattı var. Kablo sokakta saha dolabına, gündelik dildeki adıyla kabine giriyor; dolaptan santrale giden daha kalın kablo pek çok binanın çiftlerini birlikte taşıyor. Yol boyunca demet kalınlaşıyor, ama içindeki her çift baştan sona tek bir aboneye ait. 63. bölümde göreceğin kablo TV tesisatıyla aradaki en büyük fark bu: orada bir sokaktaki evler aynı kabloyu paylaşıyor, burada her daire santrale kadar kendi telinde.

Bu hattın taşıması gereken tek şey uzun süre insan sesiydi. 54. bölümde gördüğün gibi 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ı.

Bir santral binasındaki ana dağıtım çatısı: tavana kadar yükselen sıralar boyunca binlerce bakır çiftin ucu tek tek sonlanmış, aralarına etiket kartları takılı. Soldaki merdiven ölçeği veriyor; mahalledeki her abone hattı bu duvarda bir uç.

Çevirmeli modem neden 56 kilobitte kaldı?

DSL’den önce de bu telden internete giriliyordu. Bilgisayarın yanındaki kutunun adı modemdi ve ad iki işinin kısaltmasıydı: modülatör ile demodülatör. Modülasyon giden bitleri hattın taşıyabileceği bir dalgaya bindirmek, demodülasyon da gelen dalgadan bitleri geri okumak demek. Yani modem sayısal veriyi analog bir sinyale çeviriyor, karşı uçtaki modem de o analog sinyalden sayısal veriyi geri çıkarıyor. Çevirmeli modemin bindirdiği dalga düpedüz sesti; bağlanırken duyduğun cızırtı, iki modemin hattı yoklayıp ortak bir hızda anlaşmasının sesiydi. Bugün evindeki kutuya da modem deniyor ama o kutu modemden fazlası: içinde bir router, bir switch, bir access point ve adres dağıtan bir sunucu da var (36. bölüm).

Çevirmeli modemler 1990’ların ortasında saniyede 33,6 kilobitte duvara dayandı ve duvarın yerini kendin hesaplayabilirsin. Santral her konuşmayı 4 kilohertzlik kanala süzüyordu; kanalın kullanılabilir kısmı 300 ile 3.400 hertz arası, yani 3.100 hertz civarıydı. İyi bir hatta sinyal gürültünün yaklaşık 35 desibel üstünde kalıyordu. İkisini 53. bölümdeki Shannon sınırına koy:

C = 3.100 × log₂(1 + 3.162) ≈ 3.100 × 11,6 ≈ 36.000 bit/s

33,6 kilobit bu tavanın yüzde 93’ü. Kalan payı kimse kapatamadı, çünkü duvar modemin içinde değil hattın bandındaydı.

Sonra 56 kilobit geldi ve sınırı aşmış gibi göründü. Aşmadı, yanından dolandı. Santralin içi çoktan sayısaldı: her ses hattı saniyede 8.000 kez örneklenip her örnek 8 bitle yazılıyordu, yani 54. bölümdeki darbe kod modülasyonuyla hat başına 64 kbit/s. İnternet servis sağlayıcısı santrale sayısal bağlandığında aşağı yöndeki yolun tek analog parçası santral ile evin arasındaki tel kalıyordu. Modem artık bir sesi değil, santraldeki dönüştürücünün üreteceği gerilim basamaklarını hedefliyordu ve örnek başına 8 bitin 7’sini güvenle taşıyabildi: 8.000 × 7 = 56.000. Yukarı yönde bu hile işlemiyordu; yükleme hızı 33,6’da kaldı.

İki sayının anlattığı ders DSL’in bütün fikri. Darboğaz tel değildi. Tel megahertzleri taşıyabiliyordu; sınırı santraldeki 4 kilohertzlik süzgeç ile 64 kilobitlik dönüştürücü koyuyordu. Çözüm de buradan çıkıyor: veriyi o süzgece hiç sokma.

DSL’in (digital subscriber line, sayısal abone hattı) 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; yöntemin adı DMT (discrete multitone). 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. Hat açıldıktan sonra bir bölge bozulursa modem bitleri o bölgeden daha temiz şeritlere kaydırabiliyor (bit swapping). Bozulma büyükse hat yeniden eğitiliyor ve birkaç yüz kilobit daha düşük bir hızda senkron oluyor. 31. bölümdeki OFDM’in fikri burada bakır üstünde çalışıyor: bandı ince şeritlere böl, her şeride kendi kapasitesince yükle.

Şeritler bandın içine gelişigüzel dağılmıyor. Bant üç bölgeye ayrılmış: en altta ses, onun üstünde yükleme yönü, en üstte indirme yönü.

bölgefrekanstaşıdığı
ses0 – 4 kHztelefon konuşması
upstream25 – 138 kHzevden santrale giden veri
downstream138 kHz – 1,1 MHz (ADSL2+‘ta 2,2 MHz)santralden eve gelen veri

Ders kitaplarında daha yuvarlak sınırlar görürsün: 0-4 kHz ses, 4-50 kHz upstream, 50 kHz-1 MHz downstream. Mantık aynı; yukarıdaki sınırlar ADSL standardının kendi şerit numaralarından geliyor. Sesle veri arasında bırakılan boşluk da boşa değil: iki bölgeyi birbirinden ayıracak süzgecin payı o.

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 da bir ayırıcı sesi telefon switch’ine yollar; veri ise DSLAM’a (DSL access multiplexer) gider. DSLAM yüzlerce hattın verisini toplayıp işletmecinin veri ağına verir.

Daireden santrale giden yolun tamamını ve ses ile verinin nerede ayrıldığını birlikte izleyelim:

Daireden santrale abone hatları
apartman3. daire2. daire1. dairesaha dolabıkabinsantralMDFayırıcıtelefonşebekesiDSLAMBNGkenar routerayrı çiftlerdemet0-4 kHz25 kHz üstüevde de bir ayırıcı var:ses telefona, üst bant modeme
Her dairenin kendi çifti var. Binanın tek bir telefon hattı yok. Her dairenin prizinden çıkan bakır çift ayrı ayrı iniyor ve sokaktaki saha dolabına aynı demetin içinde, ama birbirine karışmadan ulaşıyor.
  1. Her dairenin kendi çifti var. Binanın tek bir telefon hattı yok. Her dairenin prizinden çıkan bakır çift ayrı ayrı iniyor ve sokaktaki saha dolabına aynı demetin içinde, ama birbirine karışmadan ulaşıyor.
  2. Dolaptan santrale kalın bir kablo gidiyor. Saha dolabında pek çok binanın çiftleri santrale giden ana kabloya bağlanıyor. Demet kalınlaşıyor ama içindeki her çift hâlâ tek bir aboneye ait ve santraldeki ana dağıtım çatısında (MDF) sonlanıyor.
  3. Ayırıcı sesi veriden ayırıyor. Santraldeki ayırıcı ilk 4 kilohertzi telefon şebekesine, 25 kilohertzin üstünü DSLAM'a veriyor. Evde de aynı iş yapılıyor: ayırıcı ya da mikrofiltre sesi telefona, üst bandı modeme veriyor.
  4. Erişim ağı kenar router'da bitiyor. DSLAM yüzlerce hattın verisini toplayıp operatörün ağına veriyor. Modemin açtığı oturum BNG denen kenar router'da sonlanıyor; erişim ağı orada bitiyor, operatörün omurgası orada başlıyor.

Bandın ne kadarının veriye açıldığı kuşaktan kuşağa değişti:

kuşaküst frekans sınırıtipik en yüksek downstream
ADSL1,1 MHz8 Mbit/s
ADSL2+2,2 MHz24 Mbit/s
VDSL12 MHz52 Mbit/s
VDSL2 profil 17a17,7 MHz100 Mbit/s
VDSL2 profil 35b35,3 MHz300 Mbit/s
G.fast106 / 212 MHz1 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; 53. bölümdeki Shannon sınırının dediği gibi, bant doğrusal getiri veriyor.

Ders kitaplarının DSL için verdiği “24-52 Mbit/s indirme, 3,5-16 Mbit/s yükleme” aralığının iki ucu da bu tablodan çıkıyor. Alt uç ADSL2+: 24 megabit indirme, upstream bandını 276 kilohertze kadar genişleten Annex M kipiyle de 3,3 megabit yükleme. Üst uç ilk VDSL: 52 megabit indirme, 16 megabit yükleme. İkisi de standardın tavanı ve ancak santrale çok yakın bir hatta görülür; sebebini bir sonraki bölümde göreceksin.

Adlardaki A harfi (asymmetric) de bir tercihtir. ADSL’de downstream’e 224, upstream’e 26 şerit düşer. 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. Tarifeler bugün fizikten de keskin: Eylül 2026’da Türk Telekom altyapısı üzerinden satılan 100 megabitlik bir tarifede yükleme hızı 4 megabit, yani yirmi beşte bir. Bu oranı hat değil sözleşme koyuyor.

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 480 şerit kullanır. Hepsi on beşer bit taşısa toplam 28,8 megabit çıkardı; standardın 24 megabitlik tavanı buradan gelir, çünkü şeritlerin bir kısmı kontrol bilgisine ve hata düzeltmeye 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.

Özet

  • Erişim ağı evden ilk router’a uzanır: evdeki modemi operatörün sonlandırıcısına, oradan kenar router’a bağlar; DSL’de sonlandırıcı DSLAM’dır.
  • Her dairenin kendi çifti var: abone hattı binadan saha dolabına, oradan santrale kadar tek bir aboneye aittir; demet kalınlaşır ama çift paylaşılmaz.
  • Çevirmeli modem ses kanalında kaldı: 3.100 hertzlik bantta Shannon tavanı 36 kilobit civarındaydı; 56 kilobit santralin sayısal tarafından dolanarak geldi.
  • Boş bant: telefon hattı yalnızca ilk 4 kilohertzi kullanıyordu; DSL sesi yerinde bırakıp üstündeki boşluğu veriye veriyor, iki uçtaki ayırıcılar da ikisini ayırıyor.
  • Ş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.
  • Hız bantla geliyor: ADSL2+ 2,2 MHz ile 24, VDSL 12 MHz ile 52 megabite çıkıyor; her kuşak daha yüksek frekansa tırmanarak hızlandı.

Aynı standartla bağlanan iki komşudan biri 24 megabitte senkron olurken öteki 7 megabitte kalabiliyor. Tel aynı cins, modem aynı model, tarife aynı. Peki aradaki farkı ne açıyor?

Bölüm 60: DSL'de Hız ve Mesafe

Telin boyu açıyor. Santrale uzanan bakırın uzunluğu, hattın hangi şeritlerinin yaşayıp hangilerinin öleceğine karar veriyor ve hızın büyük kısmı en çabuk ölen şeritlerde duruyor.

Peki sinyal bakırda neden frekansa göre farklı hızla sönüyor ve modemin ekranındaki sayılar bunu nasıl ele veriyor?

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.

Bunu önceki bölümdeki şeritlerle 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ğuADSL2+VDSL2 profil 17a
300 m24 Mbit/s~100 Mbit/s
500 m24 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/spratikte kullanılmaz
4 km~3 Mbit/spratikte kullanılmaz
5 km~1,5 Mbit/spratikte 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. Bel bağladığı yüksek şeritler çoktan ölmüş oluyor, alt bantta ise ADSL2+‘tan daha düşük toplam güçle gönderiyor.

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 (bridged tap) bulunur; bunlar sinyali yansıtır ve belirli şeritleri çukura düşürür.

Modem hattı nasıl açıyor?

Modemi prize taktığında önündeki DSL ışığı bir süre yanıp söner, sonra sabitlenir. Aradaki yarım dakikada hattın bütün fiziği ölçülüyor.

Önce iki uç tanışıyor. Modem ile DSLAM hangi standartları (ADSL2+, VDSL2) ve hangi seçenekleri konuşabildiklerini birbirine sayıyor; bu el sıkışmanın kendi standardı var, G.994.1. Sonra eğitim başlıyor. Uçlar birbirine bilinen desenler gönderiyor, her şeritte sinyalin ne kadar zayıfladığını ve gürültünün ne kadar olduğunu ölçüyor. Ölçümden her şeride kaç bit yükleneceği çıkıyor ve bu tablo iki uç arasında değiş tokuş ediliyor. Hepsi bitince hat veri kipine geçiyor. Standartlar bu kipe gerçekten de gösteri zamanı diyor: showtime. DSL ışığının sabitlendiği an bu.

İnternet ışığı ancak ondan sonra yanıyor, çünkü o ışık fiziğin değil oturumun ışığı. Modem hattın üstünden kendi operatörüne kullanıcı adı ve parolayla bir oturum açıyor ve adresini oradan alıyor; bu oturumu bölümün sonunda göreceksin. Arıza ararken bu sıranın bir değeri var: DSL ışığı sabitlenmiyorsa sorun teldedir, sabit ama İnternet ışığı yanmıyorsa sorun oturumdadır.

Modemin sana söyledikleri

Modemin yönetim sayfasındaki hat bilgisi, 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 dBiyi
40 – 50 dBsınırda, hız belirgin düşük
50 – 60 dBkö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 ve iki sebebi var. Demetteki komşu hatlar çalıştıkça birbirlerine diyafoni basar. Orta dalga radyo yayınları da akşam iyonosferden yansıyıp çok daha uzağa ulaşır ve hattın alt şeritlerine parazit olarak biner.

Hata sayaçları. Düzeltilmiş hatalar (FEC), hattın sessizce onardığı bozulmalardır. Düzeltilemeyen hatalar (CRC) ise kaybedilmiş veridir; ikincisi sürekli artıyorsa hatta fiziksel bir sorun var demektir.

Bir de o sayfada görünmeyen ama hissedilen bir ayar vardır. Hat, gönderilecek bitleri 24. bölümdeki gibi 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. Yeni hatlarda G.INP denen yeniden gönderme mekanizması bu ödünleşimi yumuşatıyor: bozulan bloğu önceden dağıtmak yerine gerekince yeniden gönderiyor.

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; ama artık santrale değil sokaktaki kutuya bağlı, yani tablodaki ilk satırlarda yaşıyor.

Kaldırıma yeni kurulmuş iki gri saha dolabı; üst kenarlarında havalandırma ızgaraları, altlarında beton kaide ve henüz kapatılmamış kablo hendeği. Santralden çıkarılıp sokağa taşınan DSLAM bu kutuların içinde duruyor.

İ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 modelişletmeci ne kiralıyorkendi donanımı nerede
yeniden satış (al-sat)hazır hizmetin kendisihiçbir yerde
IP seviyesinde veri akış erişimiabonenin trafiğiülke çapında birkaç on teslim noktasında
YAPAçıplak bakır çiftin kendisisantralde, kendi DSLAM’ı
SAYEfiber erişimin sanal eşdeğerien yakın santralde, Ethernet üstünden teslim

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. Açılımı sanal ayrıştırılmış yerel erişim; BTK yükümlülüğü 1 Temmuz 2020’de yürürlüğe soktu.

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 36. bölümdeki PPPoE ile bir oturum açar, o oturum kendi işletmecinin ağındaki bir toplayıcıda (BNG) 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 router aynı şey değildir. Modemin işi bitleri hattın taşıyabileceği sinyale çevirmek ve geri okumaktır. Router’ın işi paketleri ağlar arasında iletmektir. Evindeki kutu bugün ikisini, üstüne bir switch 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

  • 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.
  • Hat açılırken ölçülür: modem ile DSLAM önce standartta anlaşır, sonra her şeridi ölçüp bit tablosunu kurar; DSL ışığı veri kipine geçildiğinde, İnternet ışığı oturum açıldığında sabitlenir.
  • 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 61: 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ğı (passive optical network, PON) üç parçaya ayırabilirsin. Santralde OLT (optical line terminal) durur, yani optik hat sonlandırıcısı. Abone tarafında ONT (optical network terminal) durur, yani evdeki optik ağ sonlandırıcısı. İkisinin arasında da ODN (optical distribution network), 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. FTTH dışındakilerde kalan yolu bakır tamamlar ve dördü de aynı optik erişim ağını kullanır.

FTTC’de o son birkaç yüz metreyi 60. bölümdeki telefon bakırı tamamlıyor; FTTB’de ise çoğu zaman binanın içindeki, 56. bölümde kendin sonlandırdığın türden Ethernet kablosu.

ONT’nin işi ışığı elektriğe çevirmekle de bitmiyor. Standart, içine routing, 46. bölümdeki NAT ve 49. bölümdeki firewall giren bir konut geçidi senaryosunu ayrıca sayar. Evdeki tek kutunun aynı anda router 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 1310 nm çevresini. Standardın upstream için ilk ayırdığı bant 1260-1360 nm’ydi; yeni kuşakla aynı camda yaşayabilmek için sahada 1290-1330 nm’ye, hatta 1300-1320 nm’ye daraltılıyor. İ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.

54. bölümde dalga boyu bölmeli multiplexing 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 155,52 Mbit/s verir. Hepsi aynı anda tam hızla çekmediği için her abone pratikte bunun çok üstünü görüyor; 54. bölümdeki istatistiksel multiplexing burada da çalışıyor.

Downstream fiziksel frame’i her kuşakta 125 µs sürer. Sayı tanıdık: saniyede 8.000 frame, 54. bölümde telefon sesinin saniyede 8.000 örneğinden kalan ritim. Değişen, içine sığan bayt sayısıdır:

downstream frame'i                       125 µs
  9,95328 Gbit/s hatta               155 520 bayt
  2488,32 Mbit/s hatta                38 880 bayt

XGS-PON’da her frame 24 baytlık bir fiziksel eşitleme bloğuyla (PSBd) başlıyor; GPON’da aynı işi 4 baytlık bir eşitleme deseni yapı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 multicast 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 9. bölümdeki 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 frame’in 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 (dynamic bandwidth allocation, DBA), upstream kapasitesini trafik göstergesine ve sözleşmeye göre dağıtır. Boş geçen dilim başkasına verilir; 54. bölümdeki 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ü 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ı frame 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:

Bir OLT, tek besleme lifi, otuz iki ONT
OLTsantralayırıcı1:32ONT · 1. evONT · 2. evONT · 3. evONT · 32. evtek besleme lifiarada aktif cihaz yokhepsi hepsini alıyorupstream aynı camdaüst üste binmeyen sıra1. ev2. ev3. ev32. ev
Santralden tek bir lif çıkıyor. OLT santralde duruyor. Besleme lifi sokaktaki kutuya kadar tek damar hâlinde gidiyor ve downstream 1490 nm dolayında bir dalga boyunda ilerliyor.
  1. Santralden tek bir lif çıkıyor. OLT santralde duruyor. Besleme lifi sokaktaki kutuya kadar tek damar hâlinde gidiyor ve downstream 1490 nm dolayında bir dalga boyunda ilerliyor.
  2. 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.
  3. Downstream hepsine birden iniyor. Ayırıcı adrese bakmaz; aynı frame otuz iki ONT’nin hepsine varır. Komşunun verisini okuyamamanı sağlayan şey mimari değil, downstream'deki şifrelemedir.
  4. Upstream aynı camdan dönüyor. Dönüş için ikinci bir lif çekilmiyor. Upstream 1310 nm dolayında ayrı bir dalga boyundan geçiyor ve ayırıcıda yine tek besleme lifine birleşiyor.
  5. 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. Gerçek bir 1:32 ayırıcı üretim kayıplarıyla birlikte 17 dB civarına çıkar.

Bunun üstüne lifin kendi kaybı biner. Yirmi kilometrelik bir G.652 lifi 1310 nm’de en çok 8 dB kaybeder. İdeal 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ıfODN kayıp bütçesi
GPON B+28 dB
XG-PON N129 dB
XG-PON N231 dB
GPON C+32 dB
E133 dB
E235 dB

Physical layer’da 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 58. bölümdeki bükülme kaybına duyarsız G.657 lifleriyle de uyumludur.

Zayıflama penceresini ve konnektör kaybını 58. bölümde 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 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.

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. Kritik abonelere bu yüzden iki ayrı güzergâhtan beslenen, korumalı bir ağaç kuruluyor.

ODN elektriksiz çalışır ama ONT çalışmaz. Bakır telefon hattı elektrik kesildiğinde de çalışırdı, çünkü akımını santral veriyordu. Fiberde bu yok; bazı ülkeler acil çağrı yapılabilsin diye ONT’nin pille 8, hatta 24 saat ayakta kalabilmesini şart koşuyor. Ç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ı, 58. bölümdeki kıvrım bağlaştırıcıyla aynı hileyi kullanıp hattı kesmeden optik gücü okur.

Özet

  • 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; FTTH dışındakilerde 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 62: Kablo Erişim Ağları

Fiber eve kadar geldi, ama her eve gelmedi. Pek çok evde yıllardır duran başka bir kablo var: televizyonu besleyen anten kablosu. Türkiye’de bu altyapının sahibi Türksat; şebeke 24 ilde duruyor ve üstündeki internet Kablonet adıyla satılıyor. BTK’nin 2026 ilk çeyrek verilerinde sabit genişbant aboneliklerinin yüzde 7,1’i kablo.

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.

Sokak dolabının içi: ortada koaksiyel hat yükselteci, arkasında üç dağıtım ayırıcısı ve onlardan evlere inen yeşil drop kabloları. Fiber bittikten sonra bakırın sokakta nasıl dallandığının fotoğrafı.

Koaksiyeli 55. bölümde 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 kod bunu söylüyor. Koaksiyelin fikri 1880’de Oliver Heaviside’a gidiyor, bugünkü biçimi ise 1929’da Bell Laboratuvarları’nda patentlendi; duvardaki priz, yerel ağların doğuşundan çok daha 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, 28. bölümdeki metropol alan ağının (MAN) 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 multiplexing. Televizyon kanalları, internet verisi ve kontrol trafiği aynı bakırda ayrı frekans bantlarında ilerliyor. 54. bölümde frekans bölmeli multiplexing 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. Klasik koaksiyelin kullanılabilir bandı bir zamanlar 500 MHz civarındaydı; kablo TV tesisatları bugün 1 GHz’i, DOCSIS 4.0 ile 1,8 GHz’i kullanıyor. Bu bakırın multiplexing 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 kHz kaplar, on bin kanal toplamda 40 MHz eder.

Bu genişlemenin bedelini gürültü olarak ödüyorsun. Ara modülasyon gürültüsünü (intermodulation) 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 53. bölümdeki Shannon sınırında 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. 31. 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.

Kablo modem ne yapıyor?

Koaksiyelde giden şey, 54. bölümde gördüğün gibi, analog bir bileşik sinyal: onlarca taşıyıcı, her biri kendi frekansında, aynı telde üst üste. Bir televizyon kanalı da bir veri kanalı da bu taşıyıcılardan biri. Kablo modem yığının içinden kendisine ayrılan kanalları seçiyor, taşıyıcının üstündeki bitleri söküp çıkarıyor, hataları düzeltiyor ve arkasındaki Ethernet portuna sayısal frame’ler olarak veriyor. Kablo modemin girişi analog, çıkışı sayısal derken kastedilen bu. Aynı iş ters yönde de yürüyor: bilgisayarından gelen frame’ler upstream kanalının taşıyıcısına bindiriliyor ve kabloya analog bir sinyal olarak çıkıyor.

Bindirmenin biçimi 31. bölümdeki takımyıldızın kendisi. Downstream kanalı 256-QAM kullanıyor: her sembol 256 noktadan birine oturuyor, yani sembol başına 8 bit taşıyor. Kanalın hızını buradan kendin hesaplayabilirsin:

Kuzey Amerika kanalı   6 MHz   5,36 milyon sembol/s × 8 bit ≈ 42,9 Mbit/s ham
Avrupa kanalı          8 MHz   6,95 milyon sembol/s × 8 bit ≈ 55,6 Mbit/s ham

Hata düzeltmenin ve çerçevelemenin payı düşülünce 6 MHz’lik kanalda yaklaşık 38 Mbit/s kullanılabilir hız kalıyor. Upstream kanalı daha dar ve daha temkinli: 6,4 MHz genişliğinde, saniyede 5,12 milyon sembol, 64-QAM ile sembol başına 6 bit. Ham hızı 30,72 Mbit/s, kullanılabilir hızı 27 civarı.

Ders kitaplarının kablo için verdiği aralık, 40 Mbit/s ile 1,2 Gbit/s arası indirme ve 30 ile 100 Mbit/s arası yükleme, bu iki kanalın katlarından ibaret. Alt uçlar tek kanal: DOCSIS 2.0 modem downstream’de tek bir kanal dinliyor, upstream’de tek bir kanala konuşuyordu. Üst uçlar kanal sayısından geliyor. DOCSIS 3.0 bir modeme birden çok kanalı aynı anda veriyor ve hızlar toplanıyor; buna channel bonding deniyor. 32 downstream kanalı × 38 Mbit/s ≈ 1,2 Gbit/s. Upstream’de standart en az dört kanalı birleştirmeyi şart koşuyor: 4 × 27 Mbit/s ≈ 100 Mbit/s, sekiz kanalla 200 civarı.

Türkiye’de bunun karşılığını bir modemin künyesinde görebilirsin. Kablonet’in abonelerine verdiği kablo modemlerden birinin veri sayfasında üç satır yan yana duruyor: EuroDOCSIS 3.0, 24x8 channel bonding ve BPI+. Modem aynı anda 24 downstream ve 8 upstream kanalına bağlanabiliyor; Avrupa’nın 8 MHz’lik kanallarıyla bu, kâğıt üstünde bir gigabitin üstünde bir downstream demek. Kablonet’in kablo tarifelerinden yalnızca en düşükleri tek kanallı DOCSIS 2.0 modemle verilebiliyor, üstü kanal birleştiren 3.0 modem istiyor. Üçüncü satırın, yani BPI+‘ın ne olduğunu bir sonraki bölümde açacağım.

Downstream neden upstream’den hızlı?

Kablo erişimini baştan asimetrik kuruyorlar: kablo aboneliklerinde indirme hızı çoğu zaman yükleme hızının on katı ya da daha fazlası. Eylül 2026’da Kablonet’in kablo tarifelerinde 100 megabitlik indirmenin yanında 10 megabitlik yükleme duruyor.

Farkın kaynağı kanalın hızı değil. Az önce hesapladığın gibi bir downstream kanalı 38, bir upstream kanalı 27 Mbit/s taşıyor; kanal başına fark yüzde kırk kadar. Uçurumu açan tek değişken, her yöne ayrılan kanal sayısı. 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: bant bölüşümü, yani band split. 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 splitupstreamdownstreamupstream’e düşen bant
alt band split (klasik)5-42 MHz54-1002 MHz37 MHz
Avrupa band split’i (EuroDOCSIS)5-65 MHz88 MHz üstü60 MHz
orta band split5-85 MHz108 MHz üstü80 MHz
yüksek band split5-204 MHz258-1218 MHz199 MHz
genişletilmiş (DOCSIS 4.0)5-396/492/684 MHz108-1794 MHz684 MHz’e kadar

Klasik band split’teki 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 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 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 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.

DOCSIS 4.0 bu duvarı ikinci bir yoldan da deliyor. Tam çift yönlü kipinde aynı frekans bandı iki yöne aynı anda kullanılıyor: 53. bölümdeki 1000BASE-T gibi, her uç kendi gönderdiğini duyduğu karışımdan çıkararak karşı tarafı ayırıyor.

Kuşakların ne getirdiğini de tek tabloda görebilirsin:

sürümyıldownstreamupstreamgetirdiği
DOCSIS 1.0199740 Mbit/s10 Mbit/silk standart
DOCSIS 2.0200240 Mbit/s30 Mbit/supstream’de daha güçlü modülasyon
DOCSIS 3.02006~1,2 Gbit/s100-200 Mbit/schannel bonding
DOCSIS 3.1201310 Gbit/s’e kadar1-2 Gbit/sOFDM/OFDMA, LDPC, 4096-QAM
DOCSIS 4.0202010 Gbit/s’e kadar6 Gbit/s’e kadargenişletilmiş spektrum, tam çift yönlü

Son satır artık kâğıtta değil. İlk ticari DOCSIS 4.0 hizmetini Ocak 2024’te ABD’de Comcast başlattı: evlere zaten döşeli koaksiyelden simetrik 2 Gbit/s.

Tabloda 3.0’dan 3.1’e geçerken kanal kavramı da değişti. 3.1, tek tek 6 ya da 8 MHz’lik taşıyıcılar yerine 192 MHz genişliğinde tek bir OFDM bloğu koydu ve takımyıldızı 4096-QAM’e, yani sembol başına 12 bite kadar büyüttü. 31. bölümdeki OFDM ve OFDMA’nın kablodaki karşılığı bu; DOCSIS 3.1 upstream’de OFDMA’ya Wi-Fi 6’dan altı yıl önce geçti.

Özet

  • 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 multiplexing: televizyon kanalları, internet verisi ve kontrol trafiği aynı bakırda ayrı bantlarda ilerler; kablo interneti boş kalan banda sonradan yerleşti.
  • Modem iki dünya arasında çevirmendir: koaksiyelden gelen analog taşıyıcıyı çözüp Ethernet frame’ine, ters yönde de frame’i taşıyıcıya çevirir.
  • Hız kanal sayısıyla ölçülür: bir downstream kanalı yaklaşık 38, bir upstream kanalı 27 Mbit/s taşır; 40 Mbit/s ile 1,2 Gbit/s arasındaki fark, bir kanal ile otuz iki kanalın farkıdır.
  • Asimetri bir spektrum kararıdır: upstream’e ayrılan bant kırk yıl önce dar tutuldu ve genişletmek sokaktaki her yükseltecin filtresini değiştirmeyi gerektiriyor.

Kablo sokaktan geçiyor ve o sokaktaki her modem aynı downstream’i duyuyor, aynı upstream’e konuşuyor. Peki kimin ne zaman konuşacağına kim karar veriyor ve komşun senin trafiğini neden okuyamıyor?

Bölüm 63: Kablo Modem ve CMTS

Kararı sokağın öbür ucundaki bir cihaz veriyor. Kablonun sonunda, operatörün binasında, segmentteki bütün modemleri tek başına yöneten bir kutu duruyor.

O kutu bir modemi ağa nasıl alıyor, kime ne zaman söz veriyor ve aynı kabloyu paylaşan komşuları birbirinden nasıl ayırıyor?

Kablonun öbür ucu: CMTS

Evdeki kablo modemin karşı ucundaki cihazın adı kablo modem sonlandırma sistemi (Cable Modem Termination System, CMTS). Operatörün baş ucunda (headend) ya da ona bağlı bir dağıtım merkezinde duruyor. 59. bölümdeki DSLAM’ın ve 61. bölümdeki OLT’nin kablodaki karşılığı bu.

Sonlandırma sözcüğü işini anlatıyor: modemden gelen radyo frekanslı sinyal orada biter, içindeki veri operatörün IP ağına orada girer. Bir CMTS’yi raf dolabında duran büyük bir router gibi düşünebilirsin. Bir yüzünde koaksiyel şebekeye bakan portlar var: downstream kanallarını üreten modülatörler ve upstream’den gelen kısa patlamaları dinleyen alıcılar. Öbür yüzünde operatörün omurgasına giden fiber portları duruyor. Aradaki iş bir router’ın işi; modemlerin ve arkalarındaki evlerin yolundaki ilk router, yani DSL’de gördüğün kenar router, çoğu zaman bizzat CMTS’dir. Her port grubu bir segmente, yani aynı kabloyu paylaşan birkaç yüz haneye bakıyor.

Son yıllarda bu kutu ikiye bölünmeye başladı. Radyo frekanslı kısım fiberin bittiği sokak düğümüne taşınıyor (Remote PHY), geri kalanı veri merkezindeki sunucularda yazılım olarak çalışıyor. Mantık DSL’dekinin aynısı: analog kısmı kısalt, gerisini sayısal tut.

Modemin bu zincirdeki yeri veri iletişimi terminolojisinde adlandırılmıştır: 41. bölümdeki gibi 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 802.14 numarası ayrılmıştı, ama o çalışma grubu 2000’de dağıldı; pazarı kablo şirketlerinin kendi konsorsiyumu CableLabs’in DOCSIS’i aldı.

Segmentteki sırayı kim dağıtıyor?

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 collision 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. 27. bölümde collision domain’i switch 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 frame’i taşır. Hangi modemin hangi upstream dilimini kullanacağını o söyler.

Bir modem dilim istemek için önce yarışır. İstek frame’ini 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.

54. bölümdeki çoklu 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.

Modemi fişe taktığın ilk dakikalar

Bir kablo modemi fişe taktığında önündeki ışıklar belli bir sırayla yanar. Çoğu modemde alım (DS ya da Receive), gönderim (US ya da Send) ve Online diye üç ışık vardır; her biri bir aşamanın bittiğini söyler.

aşamamodem ne yapıyorışık
kanaldownstream kanallarını tarıyor, kendisininkini bulunca kilitleniyor, upstream’in tarifini (kanal, modülasyon, dilim takvimi) oradan okuyoralım önce yanıp sönüyor, sonra sabitleniyor
rangingCMTS’ye kendini tanıtıyor, zamanlamasını ve gücünü ayarlatıyorgönderim önce yanıp sönüyor, sonra sabitleniyor
kayıtDHCP ile adres alıyor, yapılandırma dosyasını indiriyor, CMTS’ye kaydoluyorOnline yanıp sönüyor
şifrelemeanahtarlarını alıyor, trafiği şifrelemeye başlıyorOnline sabitleniyor

İkinci aşama kablo erişiminin en ilginç parçası. Upstream’de modemler sırayla konuşuyor ve sıra zaman dilimleriyle dağıtılıyor. Ama her modem CMTS’ye farklı uzaklıkta: biri fiber düğümünün dibinde, öteki kilometrelerce ötede. Aynı anda gönderilen iki patlama CMTS’ye farklı anlarda varıyor ve komşu dilime taşıyor. Fark küçük değil: fiberde ışık bir kilometreyi yaklaşık 5 mikrosaniyede geçiyor. Düğümü CMTS’den 2 kilometre uzakta olan bir modemle 12 kilometre uzakta olan bir modem arasında gidiş-dönüşte 100 mikrosaniye var; upstream’in en küçük dilimi ise on mikrosaniye mertebesinde.

Ranging bu farkı ölçüp kapatıyor. Yeni modem, CMTS’nin herkese açık bıraktığı bir tanışma dilimine kısa bir istek gönderiyor. CMTS isteğin beklenenden ne kadar geç geldiğini ölçüyor ve modeme bir zaman düzeltmesi yolluyor: bundan sonra şu kadar erken gönder. Aynı cevapta gücünü artırmasını ya da azaltmasını da söylüyor, çünkü bütün modemleri aynı güçte duymak istiyor. Sonuçta her modem kendi uzaklığı kadar erken konuşuyor ve bütün patlamalar CMTS’ye kendi dilimlerinin içinde varıyor. 61. bölümdeki mesafe ölçümü aynı fikrin camdaki hâliydi.

Üçüncü aşamada modem 36. bölümdeki DHCP’nin bir ayrıntısını kullanıyor: gelen teklifin içinde bir de dosya adı var. Modem o dosyayı basit bir dosya aktarım protokolüyle (TFTP) indiriyor ve dosyanın içinde tarifen yazıyor: iki yönde izin verilen en yüksek hız, öncelikler, filtreler. Tarifen değiştiğinde operatör eve teknisyen göndermiyor; modemine başka bir dosya veriyor ve modem yeniden kaydolunca yeni hıza oturuyor. Dosyayı değiştirip kendine daha yüksek bir hız yazmak eskiden denenen bir hileydi. Bugün dosya yalnızca operatörün bildiği bir anahtarla hesaplanmış bir doğrulama değeri taşıyor ve CMTS kayıt sırasında bu değeri kontrol ediyor.

Son aşamanın sebebi kablonun paylaşılan bir ortam olması. CMTS’nin downstream’e verdiği her şey segmentteki bütün modemlere varıyor; senin trafiğin komşunun modeminin de önünden geçiyor. Modem kendisine gelmeyeni atıyor, ama atmak bir tercih ve kurcalanmış bir modem atmayabilir. DOCSIS bu yüzden modem ile CMTS arasındaki trafiği şifreliyor; adı BPI+ (Baseline Privacy Interface Plus). Her modemin içinde üreticisinin imzaladığı bir sertifika var ve CMTS şifreleme anahtarını, o sertifikayı 12. bölümdeki zincir mantığıyla doğruladıktan sonra veriyor. Böylece komşunun trafiği okunamıyor, bir modem de başka bir modemin kimliğine bürünemiyor. PON’da downstream’in şifrelenmesinin sebebi de aynıydı: paylaşılan bir ortamda gizliliği fizik değil anahtar sağlıyor.

Baş uçtan sokağa uzanan ağacı ve iki yönün nasıl paylaşıldığını birlikte izleyelim:

Baş uçtan sokağa bir kablo segmenti
CMTSbaş uçdüğümışık → bakıryükselteçyükselteç1. ev2. ev3. ev4. ev5. ev6. evfiberhepsi hepsini alıyoryalnızca sahibi çözebiliyorupstream'de sıra önceden ilan ediliyor1. ev4. ev2. ev6. evistek dilimi
Fiber sokağın başına kadar geliyor. CMTS baş uçta duruyor. Fiber ışığı mahalledeki düğüme kadar taşıyor; düğüm ışığı koaksiyeldeki elektrik sinyaline, dönüşte de elektriği ışığa çeviriyor.
  1. Fiber sokağın başına kadar geliyor. CMTS baş uçta duruyor. Fiber ışığı mahalledeki düğüme kadar taşıyor; düğüm ışığı koaksiyeldeki elektrik sinyaline, dönüşte de elektriği ışığa çeviriyor.
  2. Sokakta tek bir koaksiyel dallanıyor. Düğümden çıkan koaksiyel, sinyal zayıfladıkça yükselteçlerden geçerek sokak boyunca uzanıyor ve her eve ondan bir dal iniyor. Segmentteki birkaç yüz hane aynı kablonun üstünde.
  3. Downstream herkese iniyor. CMTS'nin gönderdiği her şey segmentteki bütün modemlere varıyor. Her modem yalnızca kendi trafiğini çözebiliyor, çünkü trafik modem başına bir anahtarla şifreli (BPI+).
  4. Upstream sırayla konuşuyor. Modemler yalnızca CMTS'nin downstream'de ilan ettiği dilimlerde gönderiyor. Ranging her modemi uzaklığı kadar erken konuşturduğu için dilimler CMTS'ye üst üste binmeden varıyor; sıra istemek için ayrılan dilimde ise modemler yarışıyor.

Sokak aynı hattı paylaşıyor

59. bölümdeki DSL de ses ile veriyi aynı bakırda farklı frekanslara koyuyordu. Ama iki hattın etiketi başka: telefon hattı santrale kadar o aboneye tahsislidir ve paylaşım ancak DSLAM’dan sonra başlar; 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 mimarinin kendisinde var. 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.

Bunu satılan hızlarla karşılaştır. O 200 hanenin her biri 100 megabitlik tarife almışsa kâğıt üstündeki toplam 20 gigabit ediyor, segmentin downstream kapasitesi ise 1,2 gigabit civarında. Oran on altıya bir ve bu bir hile değil: 54. bölümdeki istatistiksel multiplexing, herkesin aynı anda indirmediğine güveniyor. Gündüz bu güven boşa çıkmıyor; akşam dokuzda, sokağın yarısı aynı anda film açtığında çıkabiliyor. Yükleme tarafında tablo daha da sıkı: 200 hane × 10 megabit 2 gigabit eder, sekiz upstream kanalının toplamı ise 200 megabit civarı.

Darboğaz yolun en dar halkasıydı; kablo erişiminde o halka çoğu zaman kendi sokağının içindedir. Operatörün çaresi segmenti bölmek (node split): fiberi bir sokak daha içeri sokup aynı kapasiteyi daha az haneye paylaştırmak. DSL’deki gibi burada da çare bakırı kısaltmak.

61. bölümdeki 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.

İki erişimi yan yana koyunca fark tek bakışta görünüyor:

DSLkablo
hattelefonun bakır çiftikablo TV’nin koaksiyeli
evden çıkan hather dairenin kendi çiftisokağın ortak kablosu
paylaşım nerede başlıyorDSLAM’dan sonraevin kapısında
operatördeki sonlandırıcıDSLAMCMTS
hızı en çok düşürensantrale olan uzaklıkaynı anda çeken komşular
operatörün çaresiDSLAM’ı saha dolabına indirmeksegmenti bölmek
gizliliği sağlayanhattın kendisi tek aboneye aitBPI+ şifrelemesi

Özet

  • CMTS kablonun sonlandırıcısıdır: modemlerin radyo sinyali orada biter, veri operatörün IP ağına orada girer; çoğu zaman evin yolundaki ilk router da odur.
  • Modem ağa adım adım girer: kanalı bulur, ranging ile zamanlamasını ayarlatır, DHCP ile adresini alır, tarifesini yapılandırma dosyasından okur, anahtarını alıp şifrelemeye başlar.
  • Ranging uzaklığı zamana çevirir: her modem CMTS’ye olan gecikmesi kadar erken konuşur; farklı uzaklıktaki modemlerin patlamaları böylece çakışmaz.
  • Paylaşılan downstream şifrelenir: her modem komşusunun trafiğini de alır; BPI+ ile okuyamaz, sertifikası sayesinde de başka bir modemin yerine geçemez.
  • Mini dilim: upstream kanalı atanmış ve yarışmaya açık dilimlere kesilir, istek frame’leri rastgele erişimle gönderilir, collision ikili geri çekilmeyle çözülür.
  • Akşam yavaşlaması istatistiğin bedelidir: segmentte satılan hızların toplamı kapasitenin katlarıdır; herkes aynı anda çektiğinde pay küçülür, çaresi segmenti bölmektir.

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 64: 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; kıtalar arası trafiğin yüzde 99’dan fazlası bu kablolardan geçiyor 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 (cable landing station) 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; 2Africa 16 çift taşıyor.

Yeni kablolar kapasiteyi çift başına daha çok veri sıkıştırarak değil, çift sayısını artırarak büyütüyor. Sebebi 53. bölümdeki Shannon dersi: okyanus tabanındaki yükselteçlere giden elektrik sınırlı ve gücü artırmak kapasiteye yalnızca logaritmik katkı yapıyor. Aynı gücü daha çok çifte bölmek toplamda daha çok bit veriyor.

Bu ağın bir anda ortaya çıktığını da sanma. Okyanusun altından ilk telgraf kablosu 1858’de geçti ve üç hafta dayandı. Atlantik’i geçen ilk fiber kablo TAT-8 ise 1988’de çalışmaya başladı; 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. 58. bölümde 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.

2. bölümdeki 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. İki yol aynı büyüklükte buluşuyor.

Bu sayının bedelini zaten ödedin. 8. bölümdeki üç 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; 11. bölümdeki TLS bir gidiş-dönüş daha ekler. 16. bölümdeki içerik dağıtım ağlarının varlık sebebi bu hesap: kopyayı okyanusun senin tarafına getirmek.

Sayı hesapta kalmıyor, çıktıda da görünüyor. Ders kitaplarında sık gösterilen 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.com

Her 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 karşındaki sunucu sandığından yakındır. 16. bölümdeki anycast ve içerik dağıtım ağları bunu sık yapar.

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 tek yön uçtan uca gecikme yaklaşık 270 ms, gidiş-dönüş 540 ms; kablonun 58,8 ms’lik gidiş-dönüşünün dokuz katından fazla. Bedelini yazan şey bant genişliği değil, yükseklik: uydu 36.000 kilometre yukarıda. Aynı hesap tersinden alçak yörünge uydu takımlarının neden yükseldiğini de açıklıyor. Birkaç yüz kilometrede dönen uydular gidiş-dönüşü birkaç on milisaniyeye indiriyor ve uydular arası lazer bağlantılarıyla uzun mesafede fiberle yarışabiliyor, çünkü boşlukta ışık camdakinden yaklaşık yüzde 47 hızlı gidiyor.

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. 58. bölümde 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. Denizaltı hatlarında güçlendirme noktaları tipik olarak 50 ile 100 kilometre arayla diziliyor. 70 kilometrelik bir aralıkta iki nokta arasındaki kayıp 14 dB civarında kalır ve 6.000 km’lik geçiş yaklaşık 85 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.

OrtamGüçlendirme aralığı
Twisted pair, sayısal iletim2-3 km
Twisted pair, analog taşıma5-6 km
Koaksiyel, sayısal işaretleşme1 km
Koaksiyel, analog iletim9 km
Fiber50-100 km

Aynı karşılaştırmayı 55. bölümde 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 repeater 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.

28. bölümde repeater bir physical layer cihazıydı; okyanus tabanındaki kutunun da verecek bir kararı yoktur, işi sinyali ayağa kaldırmaktan ibarettir. Adına repeater dense de o kutu 1990’lardan beri aslında bir yükselteç: TAT-8 gibi ilk fiber kabloların kutuları ışığı elektriğe çevirip yeniden üretiyordu, 1996’dan sonrakiler ise ışığı çevirmeden, 54. bölümdeki erbiyumla güçlendiriyor. Gürültü bu yüzden yolda birikiyor ve okyanusun öbür ucundaki sinyal-gürültü oranı, bir fiber çiftinin taşıyabileceği veriyi belirliyor.

Sergilenen bir denizaltı kablo repeater'ı: uçlarındaki koni biçimli kablo girişleriyle silindirik basınç gövdesi. Hattın kilometrelerce arayla dizilen ve tek işi sinyali ayağa kaldırmak olan kutusu budur.

61. bölümde 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. Elektriği kıyıdaki istasyonlar veriyor: kablonun ortasındaki bakır iletkenden binlerce kilometre boyunca on binlerce volt doğru akım basılıyor. Yükselteç C bandının tamamını, yani yaklaşık 4 THz’lik bir dilimde duran bütün kanalları 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 bu açıklık onlarca kilometreden başlıyor ve 100 kilometreyi aşabiliyor. 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 belirgin biçimde arttı. 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 yüzde 70 ile 80’i insan kaynaklı ve kazara: dip trolü yapan balıkçı tekneleri ve sürüklenen çapalar. Deprem ve deniz altı heyelanları onları izliyor; sabotaj ve deniz canlıları listenin en altında kalıyor. Çapanın gücünü Şubat 2024’te Kızıldeniz gördü: saldırıya uğrayıp batan Rubymar gemisinin sürüklenen çapası büyük olasılıkla üç kabloyu birden kopardı ve Asya ile Avrupa arasındaki trafiğin önemli bir kısmı başka yollara kaydı.

Coğrafyası da bunu doğruluyor. Arızaların ezici çoğunluğu birkaç yüz metreden 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 kablo döşeyen ve onaran gemilerin sayısı altmış civarında ve yalnızca onarıma ayrılmış olanlar yirmiyi bulmuyor.

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. 45. bölümdeki BGP, o kayışı saniyeler içinde yapan mekanizmadır. Eylül 2025’te Cidde açıklarında birkaç kablo birden koptuğunda internet kesilmedi, ama Orta Doğu üzerinden geçen trafik uzun yollara kaydı ve Microsoft bulut hizmetlerinde gecikmenin arttığını duyurdu. 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 nerede geçiyor?

45. bölümde otonom sistemler birbirine eşleme ve geçiş anlaşmalarıyla bağlanıyordu ve bu karar politika taşıyordu. Erişim ağlarını büyük taşıyıcılara bölgesel ağlar bağlıyordu; bu kademeli yapıyı kimse masa başında tasarlamadı, ticari ihtiyaç kendi şeklini buldu. O anlaşmaların fiziksel karşılığı kablonun karaya çıktığı binadır. Coğrafya routing 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.

Avrupa çevresindeki denizaltı kablo güzergâhlarının haritası: hatlar okyanusta dağınık ilerlerken belirli kıyı noktalarında demet hâline geliyor. Karaya çıkış noktaları birkaç tanedir ve trafiğin tamamı oralardan geçer.

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: bugün yeni döşenen kabloların çoğunun sahipleri ya da ortakları arasında Google, Meta, Microsoft ve Amazon var.

Özet

  • 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; 70 km aralıkla aynı hat yaklaşık 85 noktada güçlendirilir.
  • Yükselteç ile repeater aynı iş değildir: yükselteç gürültüyü de büyütür, sayısal repeater örüntüyü geri kazanıp yepyeni bir sinyal üretir; bugünkü denizaltı kutuları yükselteçtir ve biriken gürültü kapasiteyi belirler.
  • Kablolar düzenli kopar: yılda iki yüz civarındaki arızanın çoğu balıkçılık ve çapadan gelir; onarım haftalar sürdüğü için ciddi trafik hiçbir zaman tek bir kabloya bağlanmaz.
  • 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 65: 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 güç, soğutma ve 42 birimlik yükseklik belirliyor; tipik bir rafta 20 ile 40 sunucu durur. Bir rafı kalabalık bir mahalle gibi düşünebilirsin. Bu mahallenin ağa açılan kapısı tepedeki top-of-rack switch’tir, kısaca ToR. Adı yerinden geliyor: rafın üstü. Altındaki sunuculara 25 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. Switch’in neden ortada değil de tepede durduğunu bu iki sayı açıklıyor. Hız arttıkça bakırın boyu da kısalıyor: 55. bölümdeki skin effect yüzünden 400 Gbit/s’te pasif kablo birkaç metrede kalıyor.

28. bölümdeki 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: 55. bölümde gördüğün DAC. 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. 10 Gbit/s’lik sürümünün adı 10GSFP+Cu; IEEE 802.3’te değil, üreticilerin ortak belgelerinde (multi-source agreement, MSA) tanımlı.

İki ucunda sabit SFP+ modülleri bulunan doğrudan bağlantı bakır kablosu. Modüller kabloya fabrikada takılı olduğu için sabit boyda satılıyor, kesilip uzatılamıyor; içinde optik lazer bulunmuyor.

Bir portun dörde bölündüğü de oluyor. Tek bir QSFP+ portu ya 40 Gbit/s’lik tek bir interface olur ya da dört bağımsız 10 Gbit/s interface’e 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. Bugün aynı hile 400 Gbit/s’lik bir portu dört 100 Gbit/s’e bölüyor.

Üç kat neden ikiye indi

Rafların üstündeki düzen uzun süre üç katlıydı. Her toplama switch’i altındaki yaklaşık on altı ToR switch’i topluyordu. Her çekirdek switch’i de yaklaşık on altı toplama switch’ini topluyordu. Dışarıya çıkış sınır router’larından 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 switch’ler 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ı ToR switch’ler duruyor; iki katlı düzende onların adı leaf (yaprak) oluyor. Yukarıda ise yalnızca leaf’leri birbirine bağlayan spine (omurga) switch’leri var. Kaybolan kat, gecikmenin ve karmaşıklığın büyük kısmını da götürüyor. Fikir yeni değil: 39. bölümde Charles Clos’un 1953’te telefon santralleri için kurduğu çok katlı dokuyu görmüştün; leaf-spine onun Ethernet’teki hâli.

Kazancı saymak kolay. İki katlı dokuda en uzun yol leaf, spine, leaf eder: üç switch. Üç katlı hiyerarşide aynı yol erişim, toplama, çekirdek, toplama, erişim eder: beş switch. Üstelik leaf-spine’da bu sayı her sunucu çifti için aynıdır.

Bağlantı derecesi de küçük kalmıyor. Facebook’un (bugün Meta) 2019’da tanıttığı F16 dokusunda her leaf on altı doku switch’ine bağlanır. Her doku switch’i de on altı spine switch’ine bağlıdır. Leaf 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 router’larından binayı terk ediyor. 64. bölümde ağlar internet değişim noktalarında birbirine dokunuyordu; bu tesisin dış kapısı da oraya açılıyor.

  1. bölümde bir router’ın 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 routing yolu var. İkincisi yedekliliktir: o yolların ortak hiçbir bağlantısı yoktur. Bir spine ya da bir kablo ölünce trafik komşu yola kayıyor.

Yol sayısını spine sayısı belirler. Leaf’inde altı upstream bağlantısı taşıyan bir dokuda altı spine vardır. Her leaf hepsine birden bağlıdır. İki leaf arasında da altı eşit maliyetli yol açık kalır (43. bölümdeki ECMP). Trafik bu yollara flow flow dağıtılır: switch 49. bölümdeki five-tuple’ın özetini alır ve aynı flow’u hep aynı yola koyar, böylece bir flow’un paketleri sırasını kaybetmez.

Dokunun büyüklüğünü spine’ın port sayısı belirler. 32 portlu spine’lar 32 leaf taşır. Her leaf’te 48 sunucu portu varsa doku 1.536 sunucuya çıkar.

Leaf ile spine katlarının nasıl örüldüğünü görelim:

Üç spine'lı bir dokuda aynı çift arasındaki yollar
üç spine'a küçültülmüş bir dokuspine 1spine 2spine 3leaf Aleaf Bleaf C48 sunucu portu48 sunucu portu48 sunucu portuortadaki spine öldüyol hâlâ açık
Her leaf her spine'a bağlı. Şemada doku üçe küçültüldü: üç spine, üç leaf. Leaf yalnızca sunucuları taşır, spine yalnızca leaf'leri bağlar. İki leaf arasında yatay kablo yoktur.
  1. Her leaf her spine'a bağlı. Şemada doku üçe küçültüldü: üç spine, üç leaf. Leaf yalnızca sunucuları taşır, spine yalnızca leaf'leri bağlar. İki leaf arasında yatay kablo yoktur.
  2. A ile C arasında ilk yol. Soldaki leaf'ten çıkan trafik ortadaki spine'a çıkıyor ve sağdaki leaf'e iniyor. Uçtan uca üç switch geçiliyor ve bu sayı her leaf çifti için aynı.
  3. Aynı çift arasında üç yol. Diğer iki spine da aynı iki leaf'e bağlı olduğundan üç eşit maliyetli yol var. Yolların ortak hiçbir bağlantısı yok; gerçek dokuda sayıları spine sayısı kadar.
  4. Ortadaki spine ölüyor. Bir kutu ya da bir kablo ölünce o spine'dan geçen bütün bağlantılar birden gider. Üçte bir kapasite kayboluyor, ama iki leaf arasındaki bağ kopmuyor.
  5. Trafik komşu yola kayıyor. Kalan yollardan biri devralıyor ve akış sürüyor. Spanning tree bu dokuda çalışsaydı yolların ikisi zaten kapalı olurdu ve tek yolun ölümü, yeni bir yol açılana kadar rafı ağdan koparırdı.

Yolların hepsinin aynı anda açık kalması kendiliğinden olmuyor. 27. bölümdeki spanning tree 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 network layer’a çıkmaktır. Router’lar spanning tree çalıştırmaz ve paralel bağlantıların hepsini birden etkin tutar. Büyük veri merkezleri bu yüzden içeride de 45. bölümdeki BGP’yi konuşuyor: RFC 7938 her leaf’e ve spine’a ayrı bir otonom sistem numarası verip dokuyu internetin küçük bir kopyası gibi yönetmeyi anlatıyor.

İ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ı. Toplama tek bir flow’u hızlandırmaz: aynı özet hilesiyle her flow tek bir bağlantıya düşer ve kazanç ancak çok sayıda flow olduğunda görünür.

Aynı numaranın dayanıklılık sürümü de var (multi-chassis link aggregation, MLAG). Sunucu aynı sıradaki iki ayrı switch’e birden bağlanır. İki kutunun üstündeki yazılım ona tek switch gibi görünür. Sunucu standart bağlantı toplama yaptığını sanır. Bir port, hatta bütün bir switch ölse bile ağdan kopmaz.

Darboğaz nereye kurulur, kayıp nasıl karşılanır

Bir leaf’in 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ı leaf’i 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 leaf’te hem spine’da. 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. Switch’in 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. 40. bölümde 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 (ECN) üzerine kuruluyor ve bu ailenin adları DCTCP ile DCQCN; atlama atlama geri baskı üzerinde de deneme yapılıyor.

Sebebi veri merkezine özgü bir kullanımda. RoCE (RDMA over Converged Ethernet) ile uzak doğrudan bellek erişimi (RDMA) Ethernet üzerinde taşınır: bir makine karşı makinenin belleğine işletim sistemini araya sokmadan yazar. RoCE kaybı TCP kadar ustaca onaramaz ve tek bir kayıp paket çok pahalıya mal olur.

En sert fren data link layer’dadır. PAUSE frame’i 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ış multicast adresi
tip    0x8808              MAC denetim frame'i
işlem  0x0001              PAUSE
süre   0 - 65.535 quanta   her quanta 512 bit süresi

Adres 48 bitliktir. 802.1D uyumlu bir switch onu diğer portlara iletmez; frame’in 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.

Veri merkezinde kullanılan ise bu frenin sınıf sınıf çalışan sürümü: PFC (priority flow control, 802.1Qbb) yalnızca RoCE’nin öncelik sınıfını durdurup öbür trafiği akıtıyor. Bedeli de ünlü: bir switch’teki duraklama komşularına zincirleme yayılıp dokunun bir bölümünü kilitleyebiliyor. Yapay zekâ kümeleri bu sınırları yeniden zorluyor. Haziran 2025’te yayımlanan Ultra Ethernet belirtimi, bir aktarımın paketlerini tek yol yerine bütün yollara serpiştiriyor ve sırayı alıcıda topluyor.

Bir de frame boyu var. 20. bölümde gördüğün jumbo frame desteği switch’lerin veri sayfalarında 9.000 baytın biraz üstüne, örneğin 9.216 bayta kadar yazar. İnternetin tamamı ise 1.500 baytlık standart sınırla çalışır. Aradaki oran altı kat, yani aynı veri için başlık işleme sayısı o kadar seyreliyor. Jumbo frame de yalnızca iki ucunu senin yönettiğin bir küme içinde işe yarar.

Özet

  • Top-of-rack switch: rafın tepesindeki kutu oraya bakır kablonun bir ile yedi metrelik boyu yüzünden konur.
  • Leaf-spine: iki katlı doku üç katlı hiyerarşinin yerini aldı ve iki sunucu arasındaki mesafeyi her çift için üç switch’e 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.
  • Çok yol, tek flow: ECMP ve bağlantı toplama trafiği flow flow dağıtır; tek bir flow her zaman tek bir yolda kalır.
  • 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 ya da PFC frame’i 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 66: Encapsulation Çözme

Paket rafın tepesindeki switch’ten 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 frame’i neye bakarak kabul ediyor?

Kablodan gelen bitler karta sırayla düşüyor. Frame’i baştan okumaya kalksan ilk göreceğin şey veri olmaz: önde 7 baytlık bir önsöz (preamble) ve 1 baytlık başlangıç işareti (start frame delimiter, SFD) duruyor. Bu 8 bayt frame uzunluğu hesabına girmiyor; işleri tek, alıcının saatini gelen bitlerin ritmine oturtmak.

23. bölümde kart kablodaki her frame’i en azından hedef adres alanına kadar okuyor, adres kendisine ait değilse gerisini okumadan bırakıyordu.

Frame’in sonunda ise 4 baytlık bir FCS alanı buluyorsun; gönderen onu yola çıkmadan önce yazmış oluyor. 24. bölümde 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ı. Frame alındığında önce FCS sınanıyor; sonuç tutmuyorsa hedef MAC adresine hiç bakılmadan frame 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. Frame bu yüzden sessizce düşüyor.

İki sınamadan da geçen frame karta ait tampona yazılıyor; ancak ondan sonra üst katmanların gündemine girebiliyor. 22. bölümde ağ kartı kablonun ucunda duran ayrı bir işlemciydi; halka tampona düşenler işte bunlar. Elenen frame ise hiçbir yere yazılmıyor; makinenin geri kalanı onun geldiğini bile duymuyor. Sayaç tutmasan varlığından haberin olmaz: 53. bölümdeki ethtool -S çıktısının CRC hata satırları tam bu sessiz düşüşleri sayıyor. Bu kabul kararı, ters encapsulation 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: 0x0800 IPv4, 0x86DD IPv6, 0x0806 ARP. Alıcı paketi hangi yığına vereceğini buradan biliyor.

6. bölümde port numarasıyla tanıdığın demultiplexing’in 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 encapsulation deniyor.

18. bölümdeki 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 ve üsttekinin etiketini yorumlamıyor.

20. bölümde encapsulation 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 frame zarfı ve 20’şer baytlık IP ile TCP başlıkları. Tam boy bir frame’in %3,8’i. En küçük frame’de 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. Kablo tarafında buna 8 baytlık önsözle 12 baytlık frame arası boşluk da eklenince, 84 baytlık bir iş için uygulamaya yine 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. 49. bölümde süzme kuralları yazarken kullandığın numaralar, TCP için 6 ve UDP için 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 router gibi datagramı frame’in içinden çıkarıyor. Fark tek bir adımda: router 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 router yeniden doğrulayıp yeniden hesaplıyor (39. bölümdeki artımlı hesap). Yani hedefe varan sağlama değerini gönderen yazmamış oluyor; onu yolun son router’ı yazıyor. 38. bölümde IPv6’nın bu alanı neden hiç taşımadığını görmüştün.

Ş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 frame’in 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 router’lar 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 MF (More Fragments) 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 kitap boyunca karşına çıktı: ömrünün dolması, tıkanıklık ve sağlamanın tutmaması.

Segment doğru sürece nasıl teslim ediliyor?

Transport layer 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 interface sözleşmesi gereği her kimlik kendi katmanının başlığında taşınıyor.

Soket bu kimliklerin üçünü tek adda topluyor: transport layer protokolü, IP adresi ve port numarası. MAC adresini o üçlünün içinde arama; frame çoktan soyuldu.

49. bölümde firewall’ın durum tablosunda gördüğün five-tuple burada da karşına çıkıyor: taşıma protokolü de kimliğin parçası ve TCP’nin protokol numarası 6. 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; 7. bölümdeki sözde başlık sayesinde UDP başlık alanlarının yanında IP adreslerini de içine katıyor.

Teslim noktasında bir tampon buluyorsun. Linux’ta TCP alıcı tamponu en az 4 KiB; 4 KiB’a 1.460 baytlık tam boy segmentten yalnızca 2,8 tanesi sığardı. Varsayılan ise 128 KiB ile, yani yaklaşık 90 segmentle başlıyor ve bağlantı hızlandıkça kernel onu belleğe göre megabaytlara kadar kendiliğinden büyütüyor (autotuning). Tamponun neden bu kadar büyümesi gerektiğini 68. bölümde hesaplayacağız. Bir de tuzak var: tamponu SO_RCVBUF soket seçeneğiyle elle ayarlarsan kernel o soket için otomatik büyütmeyi kapatıyor.

Tamponu iki uç birden işletiyor: transport layer içine yazıyor, uygulama da okuyarak boşaltıyor. Uygulaman yavaş okursa boş yer eriyor ve alıcı kalanı TCP başlığındaki pencere alanıyla (rwnd) 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   ESTABLISHED

Sunucu 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. Bugünün Linux’unda aynı bilgiyi ss -tan veriyor.

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?

Girişte iki kuyruk var, ikisi de kernel’da. Gelen SYN paketleri yarı açık kuyruğa düşüyor; bu kuyruğun taşırılması 8. bölümde bir saldırı yöntemiydi, SYN çerezi de 50. bölümde onun ilacıydı. 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 listen() çağrısındaki değerle bildiriyor; Linux o değeri net.core.somaxconn ile sınırlıyor ve 5.4 sürümünden beri bu sınırın varsayılanı 4.096. 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 kernel’ın on bin parçacık arasında sıra dağıtması işin kendisinden pahalıya geliyor. Bu duvara Dan Kegel’in 1999’da koyduğu ad hâlâ kullanılıyor: 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 kernel’a “ş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ılı aşkın bir iyileştirme hikâyesi ve tek bir kusurun etrafında dönüyor.

İlk yöntemler, 1983’ten kalan select ve ardından gelen poll, her turda bütün listeyi kernel’a veriyor ve kernel 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, Linux’ta epoll (2002), BSD’de kqueue (2000), 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. nginx de Node.js de bu yöntemin üstünde çalışıyor. 2019’da gelen io_uring bir adım daha atıp sistem çağrılarının kendisini de kernel ile paylaşılan kuyruklara taşıyor.

Tek bir olay döngüsü de tek bir işlemci çekirdeğini doldurabiliyor. İkinci hamle aynı porta 6. bölümdeki SO_REUSEPORT ile birden çok bekleyen koymak: kernel 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 kernel’a, kernel’dan uygulamaya, uygulamadan kernel’a, kernel’dan karta. Ortadaki iki kopya tamamen gereksiz: uygulama veriye bakmıyor bile. Modern işletim sistemleri onları atlayıp veriyi kernel’ın içinden doğrudan karta geçirebiliyor; yöntemin adı sıfır kopya, Linux’taki çağrının adı sendfile(). 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 (receive side scaling, RSS). 65. bölümdeki ECMP’nin özet hilesi burada da çalışıyor: aynı flow’un bütün paketleri hep aynı çekirdeğe düşüyor, böylece hem önbellek ısınıyor hem de sıra bozulmuyor.

Dördünün ortak noktası aynı: hiçbiri işi hızlandırmıyor, gereksiz işi kaldırıyor. Taranmayan liste, kopyalanmayan bayt, beklemeyen parçacık.

Özet

  • Adres elemesi: elemeden geçen frame karta ait tampona yazılıyor, elenen frame ise hiçbir yere yazılmıyor.
  • Sağlama önceliği: FCS tutmayan frame hedef MAC adresine hiç bakılmadan atılıyor; kabul kararının sahibi adres değil, sağlama.
  • Sessiz düşüş: bozuk frame için gönderene haber gitmiyor, çünkü hasarlı olabilecek alanlardan biri Kaynak Adres alanının kendisi.
  • Demultiplexing: 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; protokolle birlikte bu kimlik beş değere, five-tuple’a çı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 67: 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 stream’i. 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 stream 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. 20. bölümde MTU’dan iki başlığı düşünce kalan tam boy segment bu; encapsulation 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; o cümle onay numarasıdır ve “devamı” dediği yer beklenen bayttır. Aynı cümleyi ikinci kez duyman da aradan bir şey düştüğünün işaretidir. Tek fark şu: 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 bayt

Havuzun 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 stream’de 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. 10 Gbit/s’te ise havuz 3,4 saniyede dönüyor; bu, standardın bir segmente tanıdığı en uzun ömürden (MSL, iki dakika) çok kısa. Hızlı hatlarda aynı numarayı taşıyan iki kopyayı ayırt etmeyi bu yüzden zaman damgası seçeneği üstleniyor (PAWS, RFC 7323).

8. bölümde 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ı sliding window’dur. 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.7 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:

Gönderenin sıra uzayı ve pencerenin kayması
sıra uzayısegment 1segment 2segment 3segment 4segment 5segment 67.0008.4609.92011.380……pencereonaylanmışgönderildi, onaylanmadıgönderilebilirpencere dışıyeni sol kenar: onay 9.920pencere bir segment sağa kaydı
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.
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

66. bölümde gelen frame’in 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 RTT, 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. Linux bu tabanı 200 ms’ye indiriyor; standart temkinli, işletim sistemleri daha cesur. İ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.

40. bölümde kuyruk gecikmesi trafikle birlikte oynuyordu; zaman aşımının sabit bir sayı olamamasının sebebi 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 gelenalıcının yaptığı
sırayla gelen ilk segmentonayı en fazla 500 ms geciktirir
sırayla gelen ikinci segmentikisini tek onayla kapatır
sırası atlanmış segmentbeklediği baytın onayını hemen yineler
boşluğu dolduran segmentboş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. Bugünün Linux’u kaybı artık onay saymakla değil, zamana bakarak saptıyor (RACK, RFC 8985): kendisinden sonra gönderilen bir segmentin onayı gelmiş ve üstünden yeterince zaman geçmişse, önceki segment kayıp sayılıyor.

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: John Nagle’ın 1984’te önerdiği Nagle algoritması. İkisi de aynı derdi çözüyor: küçük segmentlerin ağa gereksiz yük bindirmesi. 66. bölümde 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ı: 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 (TCP_NODELAY) 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 7.000, 8.460, 9.920, 11.380 ve 12.840 numaralı beş segment yolladı ve yalnızca 8.460 kayboldu. Alıcının elinde dördü var ama söyleyebildiği tek şey “8.460 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. 8. bölümdeki el sıkışmada gördüğün SACK izinli seçeneği tanıdık; bu, o iznin karşılığı.

onay = 8.460        SACK: 9.920-14.300

İki satır birlikte okununca resim tamamlanıyor: 8.460 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 bu sayı üç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. 66. bölümde gördüğün gibi TCP 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ı (RFC 7323) alandaki değeri en fazla 14 bit sola kaydırarak o tavanı 1 GiB’a 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.

Böylece omurga sorularından ikincisini kapatabiliriz.

Omurga sorusu 2: 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

  • Sıra numarası: alan segmentleri değil baytları sayar ve segmentin ilk baytının stream 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; Linux aynı işi bugün zamana bakarak yapıyor.
  • Seçici onay birikimli onayın körlüğünü kapatır: SACK seç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 68: 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 router 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.

2. bölümde 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. 67. bölümdeki 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 bayt 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 küçük bir değerle başlıyor, çünkü TCP ağ hakkında hiçbir şey bilmiyor. Ders kitaplarının klasik değeri tek segment; bugünkü Linux’un varsayılanı ise 2011’den beri 10 segment, yaklaşık 14,6 KB (RFC 6928).

Sonra slow start 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. Eşiğin başlangıç değeri ders kitaplarında 64 KB diye geçiyor; RFC 5681 onu keyfî olarak yüksek tutmayı öneriyor ve Linux sonsuz başlatıyor, yani ilk kayba kadar slow start sürüyor. CUBIC’le birlikte gelen HyStart ise slow start’ı kayıp beklemeden, gecikmenin artmaya başladığı anda bitiriyor. 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. Gerekçesi sağlam: yinelenen onay, ağdan bir paketin çıktığının kanıtı.

durumpencere her gidiş-dönüşteçıkış
slow startikiye katlanıyoreşiğe varınca ya da kayıpta
tıkanıklıktan kaçınmabir segment artıyorkayıpta
hızlı toparlanmayinelenen onay başına bir segmentyeni ACK gelince

Testere dişinin faturası

Somut bir hat kur. Darboğaz 10 Mbit/s, en küçük RTT 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 RTT’nin çarpımı. Burada 50.000 bayt eder, yani yaklaşık 34 segment. Pencere tek segmentten başlasaydı ikiye katlanarak bu boruyu altı gidiş-dönüşte, yani 240 ms’de doldururdu; bugünkü 10 segmentlik başlangıçla iki turda, 80 ms’de doluyor.

Ş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 RTT’ye 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ı. Hesap darboğazda hiç tampon olmadığını varsayıyor. En az bir BDP’lik tampon varsa pencere yarılansa da kuyruk boşalana kadar hat dolu kalıyor; o zaman fatura hızdan değil, kuyrukta geçen gecikmeden ödeniyor.

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 203.0.113.10:443 198.51.100.7:51844
      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:

Tıkanıklık penceresinin zaman içindeki testere dişi
cwnd (segment)gidiş-dönüş sayısı3417cwnd = 1 MSSslow startkayıp: 34 → 17ssthreshtoplamsal artış · 17 RTTortalama 25,5
Pencere tek segment. Eğri en soldan, ders kitaplarının klasik tek segmentlik penceresinden başlıyor. Bugünkü Linux 10 segmentle başladığı için aynı boruyu iki turda doldururdu.
  1. Pencere tek segment. Eğri en soldan, ders kitaplarının klasik tek segmentlik penceresinden başlıyor. Bugünkü Linux 10 segmentle başladığı için aynı boruyu iki turda doldururdu.
  2. Slow start. 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.
  3. 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.
  4. 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.
  5. 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ı.

54. bölümdeki otoyol benzetmesiyle yolun en dar kesiti darboğaz hattı, giriş rampasındaki bekleme de kuyruk gecikmesi. Yalnız ağda rampa taşınca araç beklemiyor, siliniyor.

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 × RTT

Anlamı 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, kablonun hızı ne olursa olsun hat asla dolmuyor. 66. bölümde alıcı tamponunun neden megabaytlara kadar büyüdüğünün cevabı da bu çarpım.

Buradan sınır kendiliğinden çıkıyor. 67. bölümde pencere alanı 16 bitti ve ölçeklemesiz en büyük ilan 65.535 bayttı. 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 ancak yüzde 1,3’ü kullanılabiliyor. 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ı. Formülü 1997’de Mathis ve arkadaşları yayımladı. Hız iki ş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: 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 biryaklaşık 36 Mbit/s
yüz binde biryaklaşık 113 Mbit/s
milyonda biryaklaşı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 2006’dan beri Linux’un varsayılanı, 2023’te RFC 9438 ile standartlaştı ve internette en yaygın tıkanıklık denetimi algoritmalarından biri.

BBR başka bir noktayı hedefliyor: borunun tam dolduğu ama kuyruğun birikmediği yer. Google 2016’da yayımladı ve dört evrede çalışıyor. Hızlanma, throughput platoya oturana kadar gönderim hızını artırıyor. Boşaltma, hızlanırken kuyrukta biriken fazlayı eritiyor. 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 RTT ölçüyor.

İkisi de darboğazı doyuruyor. CUBIC bunu kuyruğu doldurarak yapıyor ve bedeli gecikme; BBR ise kuyruğu boş tutmaya çalışıyor.

Router de konuşabilir

Buraya kadar anlattığım her şey uçtan uca denetim; TCP’nin seçtiği yol bu. Ağ destekli denetimde ise router’lar flow’ların uçlarına doğrudan haber veriyor; ECN, ATM’nin ABR hizmeti 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. İşe yaramadı ve RFC 6633 onu 2012’de resmen emekliye ayırdı.

Router’ın elinde iki araç var: düşürmek ve işaretlemek. En basit düşürme biçimi kuyruk sonundan atmak; 40. bölümde gördüğün RED erken düşürüyor, ECN ise düşürmek yerine işaretliyor. 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 router’larında görülüyor; 40. bölümdeki bufferbloat bu. Oradaki RFC 3439 kuralı tamponu tipik RTT’yle hat kapasitesinin çarpımı kadar tutuyordu ve 10 Gbit/s’lik bir hatta 2,5 Gbit tampon istiyordu. Daha yeni öneri, hattı paylaşan flow sayısı arttıkça tamponu küçültmek.

Kapağı açılmış bir ev router'ının içi: anakart ve üzerindeki yongalar görünüyor. Paketleri bekleten tampon soyut bir kavram değil, bu kartın belleğinde ayrılan ve gecikmeyi büyüten gerçek bir yer.

İşaretlemenin künyesi ayrı. IP başlığındaki hizmet türü baytının 6-7 bitlerini router işaretliyor, 0-5 bitleri 40. bölümdeki DSCP’nin 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ı RTT, hepsi tıkanıklıktan kaçınmada ve sayıları sabit. RTT’si kısa olan flow penceresini daha sık büyüttüğü için payın büyüğünü alıyor. Üstelik adalet flow başına tanımlı, uygulama başına değil; 40. bölümde paralel bağlantı açan uygulamanın payını nasıl büyüttüğünü görmüştün. 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.

Kayba dayalı denetimin varsayımı da tek: kayıp tıkanıklık demek. Kablosuzda bu varsayım zorlanıyor, çünkü kayıp gürültüden ve hareketlilikten de doğuyor. Wi-Fi ve hücresel ağ kayıpların çoğunu 30. bölümde gördüğün gibi kendi içinde yeniden göndererek gizliyor; gizleyemediği kaybı ise TCP tıkanıklık sayıp gereksiz yere yavaşlıyor. BBR’ın kaybı değil teslim hızını ölçmesinin cazibesi burada.

Özet

  • 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: slow start pencereyi katlıyor, tıkanıklıktan kaçınma birer segment ekliyor, kayıp bir anda yarılıyor.
  • BDP: hattı dolu tutmak için havada olması gereken veri bant genişliği ile RTT’nin çarpımı; pencere ondan küçükse hat hiç dolmuyor.
  • Kayıp hızı yazıyor: kayba dayalı denetimde hız RTT’yle ve kayıp oranının kareköküyle ters orantılı; gigabit için sekiz milyon pakette birden seyrek kayıp gerekiyor.
  • Çalışma noktası: kayba dayalı denetimde kuyruk hiç boşalmıyor; CUBIC kapasiteyi son ölçümden, BBR boruyu doyma noktasından kestiriyor.
  • Pay: adalet flow 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 69: Trafik Çözümleme

68. bölümde gönderenin tıkanıklık penceresini slow start ile 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 switch’in önünde durup portların ışığına bakmak ölçüm sayılmaz. 10 Mbit/s’lik bir kanalda 64 baytlık tek bir frame 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 frame’lerin kendisi gerekiyor ve switch’li bir ağda kopya kendiliğinden eline geçmiyor. Trafiği kopyalamanın üç yolu vardı: 21. bölümdeki ayna port (SPAN), 44. bölümdeki pasif ayırıcı (TAP) ve 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. Arıza ararken sorulacak ilk sorulardan biri de 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 şey oluyor:

sudo tcpdump -i eth0 -w kanit.pcap -C 100 -W 50 'tcp port 443 and host 203.0.113.10'

-C 100 -W 50 kaydı 100 MB’lık elli dosyaya böler ve dolunca en eskisinin üstüne yazar; disk hiç dolmaz. Filtre ise kernel’ın içinde çalışıyor. tcpdump tırnak içindeki ifadeyi BPF (Berkeley Packet Filter) adlı küçük bir sanal makinenin koduna derleyip kernel’a veriyor ve eşleşmeyen paket kullanıcı alanına hiç kopyalanmıyor; tcpdump -d o derlenmiş kodu gösteriyor. Fikir 1990’ların başında Berkeley’de doğdu, 21. bölümde adı geçen eBPF de onun torunu.

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?

Wireshark’ın uzman bilgisi (Expert Info), performansı düşüren aşırı yeniden gönderimi kendisi bulup işaretliyor. Bulduğunu da tcp.analysis.retransmission ya da tcp.analysis.duplicate_ack gibi filtrelenebilir alanlara çeviriyor. ARP’taki çifte adres uyarısı da bu yüzden arp.duplicate-address-detected adıyla aranabiliyor; alan protokolde değil, aracın kendi tespitinde doğuyor.

67. bölümde onay birikimliydi: 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.7 numaralı istemci, 203.0.113.10 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 RTT’nin 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 RTT’yle 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 onay birikimli olduğu için bir sonraki onay o boşluğu kapatabiliyor. Kayıtta o kayıp hiç iz bırakmıyor.

İki grafik, tek zaman ekseni

Flow grafiği (Wireshark’ta Flow Graph) 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:

Bir kaybın akış grafiğindeki izi
istemcisunucuSYNSYN, ACKACKsegment 1segment 3, 4 ve 5segment 2 kayboluyoraynı onay numarası, üç kezsegment 2 yenidenACK, pencere daralıyor
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.
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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; Wireshark onu TCP Stream Graphs altında çiziyor. Alıcının ilan ettiği alma penceresi 67. bölümden tanıdık; bu eğri 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. Hız düştüğünde pencere eğrisi de dibe iniyorsa frene basan alıcıdır. Eğri yüksekte dururken yeniden gönderimler sıklaşıyorsa sorun yolda, tıkanıklıkta ya da kayıptadır. 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.

Zaman içindeki hızı çizen I/O grafiğinde çözünürlüğü örnekleme aralığı belirliyor. Aynı ölçümü bir saniyelik aralıkla 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 flow’da ne okunur?

21. bölümde yakalama interface’ini kurarken şifreli bir flow’un içeriğini açmayı buraya bırakmıştım. Sıra geldi.

11. bölümde gördüğün gibi açık anahtarlı kripto veriyi taşımıyor, yalnızca kanalı kuruyor. El sıkışmanın ürettiği ortak sır, o oturumun bütün anahtarlarının türetildiği kök.

Kökten aşağısı sürüme göre değişiyor ve ikisini karıştırmamak gerekiyor. TLS 1.2 her yön için bir şifreleme anahtarı ve ayrı bir MAC anahtarı çıkarıyordu. TLS 1.3 ayrı MAC anahtarını tümden kaldırdı: HKDF tabanlı bir anahtar takvimi önce trafik sırlarını üretiyor, her trafik sırrından da bir AEAD anahtarı ile bir başlangıç vektörü çıkıyor. Şifreleme ile bütünlük tek bir işlemde birleştiği için ikinci bir anahtara gerek kalmıyor.

Çözümleyiciye verdiğin şey bu türetilmiş malzeme, uzun ömürlü özel anahtar değil. Pratikte yolu şu: tarayıcıyı SSLKEYLOGFILE ortam değişkeniyle başlatırsan Chrome da Firefox da her oturumun sırlarını o dosyaya yazar, Wireshark da dosyayı okuyup kaydı açar. Sunucunun özel 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 yolun ortasındaki biri, TLS içeriği korusa bile, doğru numaralı sahte bir RST segmenti uydurup bağlantıyı kesebiliyor. 15. bölümdeki QUIC’in taşıma başlığının çoğunu da şifrelemesinin bir sebebi bu: dışarıdan bakan onun pencere eğrisini çizemiyor.

Port numarası da açıkta duruyor. 41. bölümdeki 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. 32. bölümde gördüğün gibi WPA2-PSK’da parolayı bilen ve dört adımlı el sıkışmayı yakalayan Wireshark o oturumu açabiliyor; WPA3’te açamıyor.

Özet

  • 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 frame’in kendisini yakalar.
  • Dinleme noktası kurulur: switch’li bir ağda kopya kendiliğinden gelmez, aralıklı arızada tek çare günlerce takılı kalan bir cihazdır; BPF filtresi diski ayakta tutar.
  • Üç 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.
  • Birikimli 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, TCP başlığını bırakır: sıra numarası, onay ve pencere şifreli flow’da da okunur; QUIC bunları da gizler.

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 70: 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 hangi kalemlerden toplanıyor?

Fatura hangi kalemlerden çıkıyor?

Ölçünün adı ilk bayta kadar geçen süre (time to first byte, TTFB). Tarayıcının gezinme adımını başlattığı an başlıyor, yanıtın ilk baytı geldiğinde duruyor. Tuşa bastığın anla arasında küçük bir fark var: adres çubuğundaki yazım, öneri listesi ve tarayıcının kendi hazırlığı bu ölçünün dışında kalıyor. İç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/s 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, cevap resolver’ın önbelleğindeyse bir tur ister; değilse 3. bölümdeki kökten yetkili sunucuya inen zincir buna birkaç tur daha ekler. Hesabı sade tutmak için bir tur sayalım. Bağlantıyı kurmak ikinci turdur ve o tur bittiğinde henüz tek bir uygulama baytı yola çıkmamıştır; 8. bölümdeki üç el sıkışmanın RTT bedeli bu kalemin ta kendisidir. 11. bölümdeki 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.

kalemsürebütçedeki payı
ad çözme20 ms%19
TCP el sıkışması20 ms%19
TLS anlaşması20 ms%19
istek turu20 ms%19
sunucunun kendi işi25 ms%24
ilk bayta kadar toplam105 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 resolver öğ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 kurulum turunu bir kez ödetiyor; 15. bölümdeki HTTP/2 multiplexing de aynı bağlantıda nesneleri paralel isteyerek istek turlarını üst üste bindiriyor.

Kurulumun sırası bedeli açıklıyor. Önce TCP bağlantısı kuruluyor, ancak o bitince TLS anahtar paylaşımını ve kimlik doğrulamayı yapabiliyor. İkisi aynı anda yapılamıyor ve ikincisi birincinin bitmesini bekliyor; bütçenin en büyük sabit kalemi 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. 10. bölümde bedelini görmüştün: bu ilk paket tekrar oynatılabildiği için sunucular ona yalnızca yan etkisi olmayan istekler için, örneğin sayfa okuyan bir GET için güveniyor.

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?

2. bölümde 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; 55. bölümde gördüğün gibi bakırda da camda da sinyal ışık hızının üçte ikisi civarında ilerliyor.

Kuyruk ise bütçenin tek gerçekten değişken kalemi. Çıkış hattında beklemek router’ın 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ı şey değil; 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. 68. bölümde 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 sliding window bu sayının altında kalırsa gönderen boruyu hiç dolduramaz.

Süreyi kendin nasıl ölçersin?

Traceroute yol üzerindeki her router’a kadar olan gecikmeyi ölçer. Ölçtüğü şey uçtan uca süre değil, o ara noktaya kadar geçen süredir. Aracı 1987’de Van Jacobson yazdı.

Yöntemi tek bir alana yaslanıyor. 49. bölümde 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 router 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: Unix’teki traceroute yoklamaları yüksek numaralı, kapalı bir UDP portuna yolluyor ve hedef tür 3 kod 3 cevabıyla dönüyor. Windows’un tracert’i ise ICMP echo yolluyor ve hedef ona echo cevabıyla dönüyor.

Çı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 ms

Merdivenin 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 router 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 birikimli bir sayaç değildir. Üstelik router’lar ICMP cevabını düşük öncelikle, 43. bölümdeki kontrol düzleminde üretiyor. Ortadaki bir atlamanın büyük görünmesi o router’ın meşgul olduğunu gösterebilir, yolun yavaş olduğunu göstermez; sonraki satırlar küçükse gecikme yolda değil, cevabı üreten kutudadır.

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 frame’in zaman damgasıyla yanıtın ilk baytını getiren frame’in zaman damgası arasındaki fark, ilk bayta kadar geçen sürenin ta kendisidir.

Bir yakalama aracının interface'inde ICMP paketlerinin listesi: her satır tek bir paket, sütunlarda zaman damgası, kaynak, hedef ve protokol. traceroute ile ping’in ürettiği mesajlar kayıtta böyle görünüyor.

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, Linux tarafında mtr aynı yolu traceroute ile ping’i birleştirerek ve 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.com

Son sütun ilk bayta kadar geçen süredir ve örneğimizde 0,105 saniye yazar. curl’ün sayıları başlangıçtan itibaren birikerek ölçülüyor; aradaki farklar kalemleri veriyor. Ad ile TCP arasındaki fark bağlantı turu, TCP ile TLS arasındaki fark kilit turu, TLS ile ilk bayt arasındaki fark ise isteğin turu artı sunucunun düşünme süresidir.

Özet

  • İ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: işleme ve iletim mikrosaniye mertebesinde kalır, faturayı yayılım ile kuyruk yazar.
  • traceroute merdiveni birikimli 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. Bu yolculuğun tamamını tarayıcı senin yerine yaptı. Aynı isteği tarayıcı olmadan, birkaç satır kodla göndermek mümkün mü?

Bölüm 71: Soket Programlama

Mümkün. Tarayıcının yaptığı işin ağa dokunan kısmı, işletim sisteminin sunduğu bir avuç çağrıdan ibaret. Bu çağrılar 1983’te Berkeley’de yayımlanan 4.2BSD ile doğdu. Adları ve sırası o günden beri neredeyse hiç değişmedi; bugün Linux’ta, macOS’ta ve Windows’ta aynı mantıkla çalışıyorlar.

Bu bölümde yolculuğu bir kez de kendi kodunla yürüyeceksin. Örnekler Python’da, çünkü Python’un socket modülü C’deki çağrıların neredeyse birebir kopyası: adlar aynı, sıra aynı, hata kodları aynı. Kod bloklarını bir dosyaya yapıştırıp olduğu gibi çalıştırabilirsin. Aşağıdaki çıktıların hepsi 25 Eylül 2026’da gerçekten çalıştırılan kodlardan alındı.

İstemci tarafında kaç çağrı var ve her biri yolun hangi durağına denk geliyor?

Bir sayfa, beş çağrı

Adres çubuğuna http://example.com yazmanın kodla karşılığı şu:

import socket

bilgi = socket.getaddrinfo("example.com", 80, socket.AF_INET, socket.SOCK_STREAM)
aile, tur, proto, _, adres = bilgi[0]

s = socket.socket(aile, tur, proto)   # kernel'da boş bir uç aç
s.settimeout(5)
s.connect(adres)                      # SYN, SYN-ACK, ACK
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")

parcalar = []
while True:
    veri = s.recv(4096)               # tampondakini al, boşsa bekle
    if not veri:                      # boş bayt dizisi: karşı taraf FIN gönderdi
        break
    parcalar.append(veri)
s.close()                             # kendi FIN'ini gönder

yanit = b"".join(parcalar)
print(adres)
print(yanit.split(b"\r\n\r\n", 1)[0].decode("latin-1"))

Çıktının başı:

('172.66.147.243', 80)
HTTP/1.1 200 OK
Date: Fri, 25 Sep 2026 09:52:38 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Age: 4514
cf-cache-status: HIT
CF-RAY: a4092323bf39b64c-IST

Kodun her satırı kitaptaki bir durağa denk geliyor.

getaddrinfo, 3. bölümdeki stub resolver’ın ta kendisi. Adı sayıya çeviriyor ve bir liste döndürüyor, çünkü bir adın birden çok adresi olabilir. Tarayıcılar IPv6 ve IPv4 adreslerini 38. bölümdeki Happy Eyeballs ile yarıştırıyor; bu kod yalnızca IPv4 adreslerini istiyor ve listenin ilkini alıyor.

socket() henüz ağa tek bir paket göndermiyor. Kernel’da bir uç açıyor ve sana bir tutamak veriyor; 6. bölümde gördüğün four-tuple’ın yarısı bile henüz belli değil.

connect() iki şey yapıyor. Kaynak portu dinamik aralıktan kernel seçiyor, sonra 8. bölümdeki üç mesaj gidip geliyor. Çağrı, el sıkışma bitene kadar dönmüyor; yani connect()’in beklediği süre kabaca bir gidiş-dönüş süresi.

sendall() ile send() arasındaki fark ilk tuzak. send() verinin ancak bir kısmını kernel’ın gönderim tamponuna yazabilir ve kaç bayt yazdığını döndürür. sendall() kalanı bitene kadar tekrar dener. İkisinin de dönmesi, verinin karşıya ulaştığı anlamına gelmiyor; yalnızca kernel’ın veriyi teslim aldığı anlamına geliyor. Segmentlere bölmek, 67. ve 68. bölümdeki pencereleri gözetmek, kaybolanı yeniden göndermek artık kernel’ın işi.

recv(4096) en fazla 4.096 bayt döndürüyor, ama daha azını döndürebilir. Tamponda o anda ne varsa onu veriyor. Boş bir bayt dizisi döndürdüğünde karşı taraf FIN göndermiş demektir ve daha fazla veri gelmeyecek. Burada 868 baytlık cevap tek bir recv ile geldi; başka bir hatta ya da daha büyük bir sayfada aynı cevap onlarca parçaya bölünebilirdi.

close() kendi FIN’ini gönderiyor. Bağlantıyı önce kapatan taraf olduğun için 8. bölümdeki TIME-WAIT durumunu da sen üstleniyorsun.

Başlıklar da bir şey söylüyor. Server: cloudflare ve CF-RAY satırının sonundaki IST, cevabı Cloudflare’in İstanbul’daki kenar sunucusunun verdiğini gösteriyor. Age: 4514 ve cf-cache-status: HIT ise sayfanın o kenarda 75 dakikadır önbellekte durduğunu. Belgelerde örnek olsun diye ayrılmış example.com bile bugün 16. bölümdeki bir CDN’in arkasında duruyor.

Kilidi takmak

Aynı isteği 443 numaralı porta ve kilitli göndermek iki satır daha tutuyor:

import socket, ssl

baglam = ssl.create_default_context()      # güvenilen kökler ve ad denetimi açık
with socket.create_connection(("example.com", 443), timeout=5) as ham:
    with baglam.wrap_socket(ham, server_hostname="example.com") as s:
        print(s.version(), s.cipher()[0])
        sertifika = s.getpeercert()
        print(dict(x[0] for x in sertifika["issuer"])["commonName"])
        print(sertifika["notBefore"], "->", sertifika["notAfter"])
TLSv1.3 TLS_AES_256_GCM_SHA384
Cloudflare TLS Issuing ECC CA 3
Jul 29 22:10:08 2026 GMT -> Oct 27 22:17:21 2026 GMT

create_connection() ad çözmeyi, soket açmayı ve bağlanmayı tek çağrıda yapıyor; listedeki adresleri sırayla deniyor. Asıl iş wrap_socket() satırında. server_hostname 11. bölümdeki SNI olarak ClientHello’ya yazılıyor ve el sıkışma bu çağrının içinde tamamlanıyor. create_default_context() ise 12. bölümdeki iki denetimi açıyor: zincir işletim sisteminin güvendiği bir köke bağlanıyor mu, sertifika gerçekten bu ada mı verilmiş? Sertifikanın ömrü de yalnızca 90 gün. Azami ömrün Mart 2026’da 200 güne indiğini ve 2029’a kadar 47 güne ineceğini 12. bölümde görmüştün.

Denetim tutmadığında ne olduğunu, bu iş için kurulmuş badssl.com sunucularında görebilirsin:

wrong.host.badssl.com  -> Hostname mismatch, certificate is not valid for 'wrong.host.badssl.com'.
expired.badssl.com     -> certificate has expired
self-signed.badssl.com -> self-signed certificate

Bu hatalarla karşılaşan birinin internette bulacağı ilk “çözüm”, bağlamda check_hostname = False ve verify_mode = ssl.CERT_NONE satırlarını açmak. Hata susar, bağlantı da şifreli kalır, ama artık karşındakinin kim olduğunu doğrulayan hiçbir adım yoktur. 10. bölümdeki araya giren saldırgan tam da bu boşluğu bekliyor.

Akış mesaj tanımaz

Sıradaki tuzak, soket programlayan hemen herkesin bir kez düştüğü yer. Aynı makinede bir sunucu açıp ona iki ayrı ileti gönderelim:

istemci.sendall(b"merhaba")
istemci.sendall(b"dunya")

# karşı tarafta, kısa bir beklemeden sonra:
print(baglanti.recv(1024))
b'merhabadunya'

İki sendall, tek bir recv. Karşı tarafta iletilerin nerede ayrıldığını gösteren hiçbir iz yok. Sebebi 8. bölümde başlayan tanımda: TCP ileti değil, bayt akışı taşıyor. Tersi de aynı sıklıkla oluyor; tek bir sendall ile giden bir megabayt, karşı tarafa düzinelerce recv ile ulaşıyor. 7. bölümdeki UDP’de ise her gönderim alıcıya ayrı bir datagram olarak çıkıyor.

Bu yüzden akış üstünde konuşan her protokol, iletinin nerede bittiğini kendisi söylemek zorunda. Bunun üç yolu var ve üçünü de kitap boyunca gördün:

YöntemNasıl çalışıyorÖrnek
ayraçiletinin sonu belirli bir bayt dizisiyle işaretlenirHTTP başlıkları boş satırla, yani \r\n\r\n ile biter (13. bölüm)
uzunluk önekiher iletinin başında kaç bayt süreceği yazarTLS kaydında 2 bayt, HTTP/2 frame’inde 3 bayt uzunluk alanı (11. ve 15. bölüm)
kendini anlatan gövdebaşlık, gövdenin nasıl okunacağını söylerContent-Length ya da parça parça gelen chunked gövde

Yukarıdaki cevabın Transfer-Encoding: chunked taşıması bundan: sunucu gövdenin uzunluğunu baştan söylemedi, her parçanın başına kendi uzunluğunu yazdı. Kodumuz bunu hiç çözmedi, çünkü Connection: close istemişti ve bağlantının kapanması iletinin sonu yerine geçti. Bağlantıyı açık tutan gerçek bir istemci bu şansa sahip değil.

Kendi protokolünü yazıyorsan en sağlam yol uzunluk öneki:

import struct

def gonder(s, ileti):
    s.sendall(struct.pack("!I", len(ileti)) + ileti)   # 4 bayt uzunluk, sonra ileti

def tam_oku(s, n):
    tampon = b""
    while len(tampon) < n:                  # recv(n), n bayt döndürmek zorunda değil
        parca = s.recv(n - len(tampon))
        if not parca:
            raise ConnectionError("bağlantı ileti ortasında kapandı")
        tampon += parca
    return tampon

def al(s):
    (uzunluk,) = struct.unpack("!I", tam_oku(s, 4))
    return tam_oku(s, uzunluk)

Aynı iki ileti bu kez ayrı ayrı çıkıyor: [b'merhaba', b'dunya']. "!I" biçimindeki ünlem işareti ağ bayt sırası demek, yani en anlamlı bayt önce. 7 sayısı telde b'\x00\x00\x00\x07' olarak gidiyor. İki makinenin işlemcisi baytları farklı sırada tutabilir; ağda herkesin anlaştığı sıra bu.

Asıl ders tam_oku fonksiyonunda. recv(n) çağrısının n bayt döndürdüğünü varsayan kod yerel ağda yıllarca çalışır, sonra yavaş bir hatta ilk büyük iletide bozulur. Hata üretimde ortaya çıkar, test ortamında hiç görünmez.

Sunucu tarafı: bind, listen, accept

Karşı tarafın koduna geçelim. Gelen her baytı olduğu gibi geri gönderen bir yankı sunucusu:

import socket, threading

def hizmet_et(baglanti, adres):
    with baglanti:
        while veri := baglanti.recv(4096):
            baglanti.sendall(veri)

with socket.create_server(("0.0.0.0", 9000)) as sunucu:   # socket, bind, listen
    while True:
        baglanti, adres = sunucu.accept()                  # hazır bağlantıyı kuyruktan al
        threading.Thread(target=hizmet_et, args=(baglanti, adres), daemon=True).start()

Başka bir terminalden nc localhost 9000 ile bağlanıp yazdığın her satırın geri geldiğini görebilirsin.

create_server üç çağrıyı birden yapıyor. bind() soketi bir adrese ve porta bağlıyor. Buradaki 0.0.0.0 “bu makinenin bütün adresleri” demek; 127.0.0.1 yazsaydın sunucuya yalnızca aynı makineden ulaşılabilirdi. Geliştirme sunucusunu farkında olmadan 0.0.0.0’a bağlamak, onu kafedeki bütün ağa açmak demek.

listen() soketi pasif hâle getiriyor ve asıl sürpriz burada: el sıkışmayı senin kodun yapmıyor. SYN geldiğinde kernel SYN-ACK’i kendisi gönderiyor, üçüncü mesaj gelince bağlantıyı tamamlanmış sayıyor ve bir kuyruğa koyuyor. Kodun henüz accept() çağırmamış olsa bile istemci için bağlantı kurulmuştur. Kuyruğun boyu ve dolduğunda neler olduğu 66. bölümde duruyordu.

accept() kuyruktan tamamlanmış bir bağlantıyı alıyor ve sana yeni bir soket veriyor. Dinleyen soket yerinde kalıyor ve sıradaki bağlantıyı bekliyor. 6. bölümde aynı porta yüz binlerce konuşmanın nasıl sığdığını sormuştuk; cevabın kod tarafındaki hâli bu. Her konuşma, four-tuple’ı farklı ayrı bir soket.

Bir ayrıntı daha. Sunucuyu kapatıp hemen yeniden başlattığında bind() bazen “adres kullanımda” hatası verir, çünkü eski bağlantılar hâlâ TIME-WAIT’tedir. create_server, Linux ve macOS’ta bunu önlemek için SO_REUSEADDR seçeneğini kendiliğinden açıyor. Windows’ta açmıyor, çünkü orada aynı adlı seçenek başka bir şey yapıyor: başka bir sürecin dinlemekte olan bir portu ele geçirmesine izin veriyor.

Aynı anda birden çok istemci

Yukarıdaki sunucu her bağlantıya ayrı bir iş parçacığı açıyor. Açmasaydı ne olurdu? İlk istemciyle konuşurken ikinci istemcinin el sıkışması kernel’da yine tamamlanırdı, ama bağlantı kuyrukta bekler ve hiç cevap alamazdı. İstemci açısından sunucu “bağlandı ama konuşmuyor” gibi görünürdü.

Bu sorunun üç klasik çözümü var:

ModelNasılBedeli
bağlantı başına süreçher accept sonrası yeni süreçbellek ve süreç açma maliyeti yüksek; eski Apache böyleydi
bağlantı başına iş parçacığıyukarıdaki kodher iş parçacığının yığını ve bağlam değiştirme maliyeti; binlerce iyi, yüz binlerce zor
olay döngüsütek iş parçacığı, çok sayıda engellenmeyen soketkod “hazır olanı işle” biçiminde yazılmak zorunda

Üçüncüsünün altında kernel’ın “hangi soketlerde okunacak veri var?” sorusuna verdiği cevap duruyor: select, poll, Linux’ta epoll, BSD’lerde kqueue. Bunları 66. bölümde sunucunun gözünden görmüştün.

DerinleşmeTek iş parçacığıyla yüz bağlantı nasıl yürüyor?

Python’un asyncio modülü olay döngüsünü doğrudan kullanmanı sağlıyor. Aynı yankı sunucusu:

import asyncio

async def hizmet_et(okuyucu, yazici):
    while veri := await okuyucu.read(4096):
        yazici.write(veri)
        await yazici.drain()
    yazici.close()

async def main():
    sunucu = await asyncio.start_server(hizmet_et, "0.0.0.0", 9000)
    async with sunucu:
        await sunucu.serve_forever()

asyncio.run(main())

Bu sunucuya aynı anda yüz bağlantı açıp her birine ayrı bir sayı gönderdiğimde yüz cevabın hepsi doğru bağlantıdan döndü. Ortada tek bir iş parçacığı vardı.

İşin sırrı await sözcüklerinde. Her await, “burada bekleyebilirim, bu arada başkasına bak” demek. Döngü o noktada kernel’a hangi soketlerin hazır olduğunu soruyor ve sıradaki hazır bağlantının işini ilerletiyor. Hiçbir recv gerçekten beklemiyor; veri gelmemiş bir sokette okuma denenmiyor bile.

Bedeli iki tane. Birincisi, tek bir uzun hesap bütün sunucuyu durdurur, çünkü o sırada döngü başka kimseye bakamaz. İkincisi, engelleyen tek bir çağrı, örneğin asyncio dışından yapılan bir veritabanı sorgusu, aynı etkiyi yaratır. Bu yüzden olay döngüsüyle yazılan sunucularda ağır işler ayrı iş parçacıklarına ya da süreçlere havale edilir.

UDP soketi: bağlantı yok, sorumluluk sende

Datagram soketinde connect, listen ve accept yok. Her sendto tek bir datagram, her recvfrom tek bir datagram:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(1.0)
for deneme in range(3):
    s.sendto(b"saat kac?", ("127.0.0.1", 9999))
    try:
        veri, adres = s.recvfrom(2048)
        print(adres, veri)
        break
    except TimeoutError:
        print("yanıt yok, yeniden deneniyor")

Zaman aşımı ve yeniden deneme döngüsünü yazan sensin, çünkü 7. bölümde gördüğün gibi taşıma hiçbir söz vermiyor. 3. bölümdeki stub resolver da bunu yapıyor. Bir tuzak da var: cevap kaybolduysa, yeniden gönderdiğin istek sunucuda ikinci kez işlenir. “Saat kaç?” için sorun değil, “hesaptan 100 lira çek” için büyük sorun. Yeniden denenecek isteklerin iki kez işlenmesinin zararsız olması gerekiyor.

Aynı kodu 9999’da kimsenin dinlemediği bir makinede çalıştırınca işletim sistemleri ayrışıyor. Karşı makine kapalı porta gelen datagrama ICMP ile “port ulaşılamaz” diyor. Linux ve BSD ailesi bu hatayı yalnızca connect ile karşı ucu sabitlenmiş bir UDP soketine iletiyor; yukarıdaki kod orada üç kez zaman aşımına düşüyor. Windows ise hatayı bağlanmamış sokete de iletiyor. Bu kitabın yazıldığı makinede ilk recvfrom şununla döndü:

ConnectionResetError: [WinError 10054] Varolan bir bağlantı uzaktaki bir ana bilgisayar tarafından zorla kapatıldı

Ortada hiçbir bağlantı yokken “bağlantı sıfırlandı” demesi tuhaf. Hata aslında ICMP’nin cevabı; Windows onu TCP’nin sıfırlama hatasıyla aynı koda eşliyor. Aynı kodu iki işletim sisteminde deneyen öğrenciyi en çok şaşırtan fark bu.

Karşılaşacağın hatalar

Soketin döndürdüğü her hata, ağda olan somut bir şeyin adı:

DurumPython istisnasıLinuxWindowsAğda ne oldu
kimse dinlemiyorConnectionRefusedErrorECONNREFUSED (111)10061SYN’e RST döndü (8. bölüm)
cevap hiç gelmiyorTimeoutErrorETIMEDOUT (110)10060SYN’ler cevapsız kaldı: kapalı makine ya da paketi sessizce atan firewall (49. bölüm)
karşı taraf kestiConnectionResetErrorECONNRESET (104)10054ortada RST geldi
kapanmış bağlantıya yazıldıBrokenPipeError, Windows’ta ConnectionAbortedErrorEPIPE (32)10053karşı taraf kapatmıştı; ilk yazma başarılı görünür, cevap olarak RST gelir ve hata bir sonraki yazmada çıkar
adres kullanımdaOSErrorEADDRINUSE (98)10048port başka bir sokette ya da TIME-WAIT’te (6. bölüm)
ad çözülemedisocket.gaierrorEAI_NONAME (-2)11001NXDOMAIN ya da resolver’a ulaşılamadı (3. bölüm)

İlk iki satır arasındaki fark tanı koymada işe yarıyor. “Reddedildi” hızlı gelir: makine ayakta, yalnızca o portta kimse yok. “Zaman aşımı” yavaş gelir ve sessizliği anlatır. Kodda settimeout vermezsen bu sessizlik uzun sürebilir: Linux varsayılanında (net.ipv4.tcp_syn_retries = 6) kernel’ın pes etmesi iki dakikayı bulabiliyor.

BrokenPipeError satırının arkasında da bir tarih var. C’de kapanmış bir bağlantıya yazmak sürece SIGPIPE sinyali gönderir ve varsayılan davranış süreci öldürmektir. Python açılışta bu sinyali yok saydığı için sana süreç ölümü yerine yakalanabilir bir istisna düşüyor. C ile sunucu yazan birinin ilk öğrendiği şeylerden biri bu sinyali kapatmak.

Kitabın isteğini karşıdan görmek

Son bir deney. Aşağıdaki on beş satır, tek bir isteği karşılayıp kapanan bir web sunucusu:

import socket

with socket.create_server(("127.0.0.1", 8080)) as sunucu:
    baglanti, adres = sunucu.accept()
    with baglanti:
        istek = baglanti.recv(65536).decode("latin-1")   # yalnız deneme için: tek recv
        print(adres)
        print(istek)
        govde = "Merhaba, bu cevabı sen yazdın.\n".encode()
        baglanti.sendall(
            b"HTTP/1.1 200 OK\r\n"
            b"Content-Type: text/plain; charset=utf-8\r\n"
            + f"Content-Length: {len(govde)}\r\n".encode()
            + b"Connection: close\r\n\r\n"
            + govde
        )

Çalıştır ve tarayıcıda http://127.0.0.1:8080 adresini aç. Tarayıcı senin cümleni gösterecek, terminalde ise şuna benzer bir şey belirecek:

('127.0.0.1', 61182)
GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.7977.130 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: tr

Kitabın ilk bölümünde Enter’a bastığında doğan istek bu. Bu kez onu karşı taraftan, kendi kodunun içinden görüyorsun. İlk satırdaki 61182, 6. bölümde kernel’ın tarayıcı için seçtiği kaynak port. Accept-Language: tr tarayıcının dil ayarından geliyor. Connection: keep-alive ise tarayıcının bağlantıyı açık tutmak istediğini söylüyor; sunucumuz Connection: close diyerek bunu geri çeviriyor. (User-Agent satırı kısaltıldı.)

Kodun tek recv ile yetinmesi yalnızca deneme için kabul edilebilir. Gerçek bir sunucu başlıkların bittiği boş satırı görene kadar okumayı sürdürür, gövde varsa Content-Length kadar daha okur. Yukarıdaki çerçeveleme dersinin bir sunucudaki karşılığı bu.

DerinleşmeSoket neden bir dosya gibi davranıyor?

4.2BSD’yi tasarlayanlar ağ bağlantısını Unix’in en eski fikrine oturttular: her şey bir dosya tanıtıcısıdır. Bir soket açtığında elindeki sayı, bir dosya açtığında aldığın sayıyla aynı türden. Bu yüzden read ve write soketlerde de çalışır; bir kabuk betiği bir ağ bağlantısına, bir dosyaya yazar gibi yazabilir.

Bu karar bugün de hissediliyor. select ve epoll aynı anda hem dosyaları hem soketleri izleyebiliyor. Bir sürecin açabileceği tanıtıcı sayısına konan sınır (ulimit -n) açık bağlantı sayısını da sınırlıyor. Yoğun bir sunucunun “Too many open files” hatası vermesi bundan. Dosya açmayan ama çok bağlantı tutan bir sunucu da bu sınıra çarpabilir.

Windows bu noktada ayrışıyor. 1992’de yayımlanan Windows Sockets, 1993’teki 1.1 sürümüyle Berkeley arayüzüne kasıtlı olarak yakın tutuldu. Yine de soket orada bir dosya tanıtıcısı değil, ayrı bir türde tutamak. Kapatmak için close yerine closesocket çağrılıyor ve select yalnızca soketlerle çalışıyor. Python bu farkı senden saklıyor; C ile iki platforma birden yazan biri ise her gün karşılaşıyor.

Özet

  • İstemci beş çağrıdır: getaddrinfo ad çözer, socket uç açar, connect el sıkışır, sendall ile recv veri taşır, close FIN gönderir.
  • sendall’ın dönmesi teslim anlamına gelmez: yalnızca kernel’ın veriyi aldığını söyler.
  • TCP bayt akışıdır: iki gönderim tek okumada birleşebilir, tek gönderim onlarca okumaya bölünebilir. İletinin sınırını protokol kendisi çizer: ayraçla, uzunluk önekiyle ya da gövdeyi anlatan başlıkla.
  • El sıkışmayı kernel yapar: listen sonrası bağlantılar kuyruğa girer, accept her biri için yeni bir soket verir.
  • UDP’de güvenilirliği sen kurarsın: zaman aşımı, yeniden deneme ve iki kez işlenmesi zararsız istekler.
  • Her hata ağdaki bir olaydır: reddedilme RST’dir, zaman aşımı sessizliktir.

Kodunda bir istemci bir sunucuya bağlandı; kitap boyunca da hep böyleydi. Bir taraf sabit bir adreste bekliyordu ve bütün yük onun sırtındaydı. Aynı dosyayı milyonlarca kişi aynı anda isterse o tek sunucu ne yapacak? Ya ortada hiç sunucu olmasaydı?

Bölüm 72: Eşten Eşe ve Protokol Tasarımı

O zaman her istemci aynı zamanda sunucu olurdu. Bir dosyayı indiren makine, elindeki parçaları başkalarına dağıtmaya da başlardı. Bu fikrin adı eşten eşe (peer-to-peer, kısaca P2P) ve internetin trafiğinde bir dönem en büyük payı o taşıdı.

Bu bölüm iki soruyu birlikte ele alıyor. Birincisi mimari: yük bir merkezde mi durmalı, katılan herkese mi dağılmalı? İkincisi tasarım: kendi uygulamanın protokolünü yazacaksan hangi kararları vermen gerekiyor? İkisi aynı yerde buluşuyor, çünkü mimari de bir tasarım kararı.

Önce hesap. Aynı dosyayı bin kişiye göndermek, tek sunucuyla ne kadar sürer ve eşler yardım ederse ne kadar?

İki mimari

Kitap boyunca izlediğin yol istemci-sunucu mimarisiydi. Sunucu hep açık, adresi sabit ve bütün istekler ona geliyor. İstemciler birbirini tanımıyor ve birbirleriyle hiç konuşmuyor. Talep artınca sunucu tarafı büyüyor: 65. bölümdeki veri merkezleri ve 16. bölümdeki kenar sunucuları bu büyümenin hâli.

Eşten eşe mimaride sabit bir merkez yok ya da çok az iş yapıyor. Eşler sıradan uç makineler: evdeki bilgisayarlar, telefonlar. Açılıp kapanıyorlar, adresleri değişiyor, çoğu 46. bölümdeki bir adres çeviricinin arkasında. Buna karşılık bir güçleri var: sisteme katılan her yeni eş hem talep hem kapasite getiriyor. İndiren aynı zamanda yüklüyor.

İkisinin arasında karma çözümler de var ve bugün en yaygını onlar. 74. bölümde göreceğin görüntülü görüşmelerde iki tarayıcıyı birbirine bir sunucu tanıştırıyor, ses ve görüntü ise mümkünse doğrudan eşler arasında akıyor.

Dağıtım süresinin hesabı

Boyu F olan bir dosyayı N eşe dağıtmak istiyorsun. Sunucunun yükleme hızı U. Hesabı sade tutmak için bütün eşleri eş hızlı sayalım: her biri u hızında yüklüyor, d hızında indiriyor. Aşağıdaki iki alt sınır, Kurose ve Ross’un ders kitabındaki akışkan modelden geliyor.

Tek sunucuyla. Sunucu N kopyanın her birini kendisi göndermek zorunda: N·F bit, U hızında. Ayrıca hiçbir eş dosyayı kendi indirme hızından hızlı alamaz:

D(istemci-sunucu) ≥ max( N·F / U ,  F / d )

Eşler yardım ederse. Sunucu dosyayı en az bir kez göndermek zorunda, eşler yine kendi indirme hızıyla sınırlı. Ama toplam N·F bitlik yükü artık sunucu ile bütün eşlerin yükleme hızı birlikte taşıyor:

D(eşten eşe) ≥ max( F / U ,  F / d ,  N·F / (U + N·u) )

Somut sayılarla bakalım. Dosya 1 GB, yani 8 Gbit. Sunucunun yükleme hızı 1 Gbit/s. Her eş 20 Mbit/s yüklüyor, 100 Mbit/s indiriyor.

Eş sayısıTek sunucuylaEşler yardım ederse
1080 s80 s
100800 s267 s
1.0008.000 s (2 saat 13 dakika)381 s
10.00080.000 s (22 saat)398 s

İlk sütun eş sayısıyla doğrusal büyüyor: on kat izleyici, on kat bekleme. İkinci sütun ise neredeyse yerinde sayıyor ve eş sayısı ne kadar artarsa artsın 400 saniyenin altında kalıyor. O tavan, dosyanın bir eşin yükleme hızıyla gönderilme süresi: 8 Gbit bölü 20 Mbit/s. Sisteme katılan her eş kendi payını getirdiği için talep ile kapasite birlikte büyüyor. Buna kendiliğinden ölçeklenme deniyor.

Hesabın dayandığı varsayımlar iyimser: her eş tam hızla yüklüyor, kimse ortadan kaybolmuyor, parçalar kusursuz dağıtılıyor. Gerçek sistemler bu alt sınıra ulaşmıyor ama eğrinin şekli aynı kalıyor. Bir ayrıntı da önemli. Ev hatlarında yükleme hızı indirmeden çok daha küçük; 59. ve 62. bölümde bu asimetriyi görmüştün. Eşten eşe sistemin bütün kapasitesi tam da bu dar yönden geliyor.

BitTorrent: parça, nadirlik, karşılıklılık

Hesaptaki “kusursuz dağıtım” varsayımına pratikte yaklaşmak için tasarlanmış en bilinen protokol BitTorrent. Bram Cohen 2001’de yayımladı; 2003’te yazdığı kısa makale, protokolün neden çalıştığını bir iktisat problemi olarak anlatıyor.

Dosya eşit boyda parçalara bölünüyor. Cohen’in makalesinde tipik parça 250 KB, bugün birkaç megabayta kadar çıkabiliyor. Her parçanın özeti, indirmeye başlamadan önce alınan küçük bir üst veri dosyasında duruyor. Bir eşten gelen parça özetiyle tutmuyorsa atılıyor; bozuk ya da sahte parça dağıtan eş hemen fark ediliyor. İstekler ise parçanın kendisi için değil, 16 KB’lık alt parçalar için yapılıyor. Aynı anda birkaç istek yolda tutuluyor, böylece bir parçanın farklı alt parçaları farklı eşlerden gelebiliyor.

Hangi parçanın önce isteneceği, sistemin sağlığını belirleyen karar. Kural önce en nadiri: eş, komşularında en az kopyası bulunan parçayı öncelikle istiyor. Nadir parçalar böylece hızla çoğalıyor ve dosyanın tamamını taşıyan eşler ayrıldığında bile hiçbir parça kaybolmuyor. Yarım kalmış bir parçayı bitirmek her şeyden önce geliyor. Sonuna gelindiğinde ise kalan alt parçalar birden çok eşten aynı anda isteniyor ki son baytlar tek bir yavaş eşi beklemesin.

Geriye teşvik sorusu kalıyor: kimse yüklemek zorunda değilken herkes neden yüklesin? Cevap karşılıklılık (tit-for-tat). Her eş, kendisine en hızlı yükleyen dört komşusuna yükleme yapıyor ve bu seçimi her 10 saniyede yeniliyor. Geri kalanlara kapısı kapalı; bunun adı choke. Bir de her 30 saniyede bir, rastgele seçilen bir eşe karşılık beklemeden kapıyı açıyor. Bu iyimser açılış iki işe yarıyor: elinde henüz hiçbir parça olmayan yeni gelen başlayabiliyor, eş de daha iyi bir komşuyu tesadüfen keşfedebiliyor. Bir dakika boyunca tek parça göndermeyen komşu ise “beni yüzüstü bıraktı” sayılıyor ve sıradan yükleme listesinden çıkıyor.

DerinleşmeKarşılıklılık gerçekten herkesi dürüst tutuyor mu?

Tit-for-tat, oyun kuramındaki tutsak ikilemi deneylerinden geliyor: ilk hamlede iş birliği yap, sonra karşındakinin son hamlesini tekrarla. BitTorrent’teki iyimser açılış, “ilk hamlede iş birliği” kuralının ta kendisi.

2007’de yayımlanan bir çalışma, bu düzenin stratejik bir istemciye karşı sağlam olmadığını gösterdi. Araştırmacıların yazdığı BitTyrant, her komşuya karşılık almaya yetecek en düşük hızla yüklüyor ve artan kapasiteyi daha fazla komşuya dağıtıyordu. Gerçek sürülerde 1 Mbit/s hattaki bir istemci için ortanca hız kazancı %70 oldu. Aynı çalışma ikinci bir şey daha gösterdi: herkes böyle davranırsa sürünün ortalama performansı düşüyor.

Tasarım dersi şu: teşvik mekanizması herkesin dürüst olmasını değil, dürüst olmamanın pahalı olmasını hedefler. BitTorrent’in düzeni bunu çoğu zaman sağlıyor ama kusursuz sağlamıyor.

Merkezsiz dizin: DHT

Parçaları kimin taşıdığını nereden öğreniyorsun? İlk kuşak P2P sistemleri bu soruya iki uç cevap verdi. 1999’da açılan Napster, hangi kullanıcıda hangi şarkının olduğunu merkezi bir dizinde tutuyordu. Dosyalar kullanıcılar arasında gidiyordu ama arama merkezdeydi; mahkeme kararıyla o merkez kapanınca, Temmuz 2001’de, bütün sistem durdu. 2000’de çıkan Gnutella ise merkezi tamamen kaldırdı. Her arama komşulara, onlardan da onların komşularına yayılıyor ve bir yaşam süresi (TTL) dolunca duruyordu. Tek bir kapanma noktası yoktu ama her arama ağı sel gibi basıyordu.

Üçüncü yol dağıtık hash tablosu (distributed hash table, DHT). Bugün BitTorrent’in izleyicisiz çalışan hâli, 2002’de yayımlanan Kademlia tasarımını kullanıyor.

Fikir şu. Hem düğümlerin kimlikleri hem aranan anahtarlar aynı 160 bitlik sayı uzayında. Bir anahtar, kimliği o anahtara “en yakın” düğümlerde saklanıyor. Kademlia yakınlığı XOR ile ölçüyor: iki kimliği bit bit XOR’la, çıkan sayı aradaki uzaklık. Dört bitlik bir örnek:

Kimlik AKimlik BA XOR BUzaklık
0110011100011
0110010000102
0110111010008

Soldan ilk farklı bit, uzaklığın büyüklüğünü belirliyor. En anlamlı bitte ayrışan iki kimlik birbirine en uzak olanlar.

Her düğüm, uzaklığın her büyüklük basamağı için en fazla k tane komşu tutuyor; makalede k = 20. Bu listelere k-bucket deniyor. Bir düğüm bir anahtarı ararken elindeki en yakın üç düğüme aynı anda soruyor, her cevapla hedefe en az bir bit daha yaklaşıyor ve kimse daha yakın birini söyleyemeyince duruyor. Adım sayısı düğüm sayısının logaritmasıyla büyüyor: 16 milyon düğümlük bir ağda bile en kötü durumda 24 adım.

Bir tasarım ayrıntısı da çok şey anlatıyor. Kova dolduğunda Kademlia yeni geleni değil, eskiyi tutuyor; eski düğüm hâlâ cevap veriyorsa yeni aday reddediliyor. Gerekçe ölçüme dayanıyor: uzun süredir ayakta olan bir düğümün bir saat daha ayakta kalma olasılığı, yeni gelenden yüksek. Aynı kural saldırganın sahte düğümlerle bir kovayı doldurmasını da zorlaştırıyor.

Bu yapının BitTorrent’teki karşılığı Mainline DHT ve 2013’teki ölçümler aynı anda 16 ile 28 milyon arasında düğüm gösteriyordu. Bir magnet bağlantısının asıl taşıdığı şey dosyanın özeti; eşleri bulmak için bu ağa soruluyor. Artık “dosya nerede?” diye değil, “şu içeriği kim taşıyor?” diye aranıyor. Ad, içeriğin kendisinden türetiliyor.

NAT’ın arkasındaki eş

Eşlerin çoğu evden bağlanıyor ve 46. bölümdeki adres çeviricisi dışarıdan başlatılan bağlantıları içeri almıyor. Bu yüzden BitTorrent’te dışarıya bağlantı kurabilen ama içeriden bağlantı kabul edemeyen eşler de çalışıyor; yalnızca daha az komşu bulabiliyorlar. İki NAT’ın arkasındaki eşlerin birbirine nasıl ulaştığını, yani delik açmayı, 46. bölümde görmüştün.

Eşten eşe trafiğin ikinci bir sorunu daha vardı. Ev modemlerinin tamponları gönderim hızına göre çok büyük; birkaç saniyelik paketi tutabiliyorlar. Arka planda yükleme yapan bir istemci bu tamponu dolduruyor ve aynı hattaki bir görüntülü görüşme saniyelerce gecikmeye başlıyor. 40. bölümdeki bufferbloat bu durumun genel adı.

BitTorrent’in cevabı kendi taşımasını yazmak oldu. uTP, UDP üstünde çalışan ve tıkanıklığı kayıptan değil gecikmeden anlayan bir protokol. Tek yönlü gecikme artmaya başladığı anda hızını düşürüyor. Arkasındaki algoritma 2012’de LEDBAT adıyla RFC 6817 oldu ve hedefi, kendi yarattığı kuyruk gecikmesini 100 milisaniyenin altında tutmak. 68. bölümdeki tıkanıklık denetimleri adil payını almaya çalışıyordu. Bu ise kasten geri çekilen, yalnızca kimsenin kullanmadığı kapasiteyi alan bir taşıma.

Bir protokol tasarlarken verilen kararlar

Şimdi kendi uygulamanı tasarladığını düşün. Kitaptaki her protokol, şimdiye kadar gördüklerin de sonraki bölümlerde göreceklerin de, aşağıdaki kararları bir biçimde veriyor:

KararSeçeneklerKitaptaki örnekler
mimariistemci-sunucu, eşten eşe, karmaweb ile BitTorrent; görüntülü görüşme karma
taşımaTCP, UDP, QUICbütünlük, zamanlama ve hız istekleri (17. bölüm)
mesaj biçimimetin ya da ikiliHTTP/1.1 ve SMTP metin; DNS, TLS ve HTTP/2 ikili
çerçevelemeayraç, uzunluk öneki, kendini anlatan gövde71. bölüm
durumdurumsuz ya da oturumluHTTP durumsuz, oturumu çerez taşıyor (14. bölüm)
etkileşimistek-yanıt, sunucunun itmesi, yayın-aboneHTTP istek-yanıt; WebSocket iter; MQTT yayın-abone (77. bölüm)
adlandırmayere göre ya da içeriğe göreURL yer söyler, BitTorrent içeriğin özetini ad yapar
genişletmesürüm alanı, uzantı noktalarıTLS uzantıları, HTTP başlıkları
güvenlikbaştan mı sonradan mıTLS kendi başına bir katman; QUIC şifrelemeyi içine aldı (15. bölüm)

Bu kararların çoğu bir ödünleşim. Metin biçimli bir protokol okunaklı ve nc ile elle konuşulabilir; ikili biçim daha sıkı ve ayrıştırması daha az hataya açık. Durumsuz bir sunucu kolay ölçeklenir ama her isteğin kendini tanıtması gerekir. Sunucunun itmesi gecikmeyi düşürür ama açık bağlantı tutmanın bedelini sunucuya yükler. Web’de itmenin yaygın yolu WebSocket: sıradan bir HTTP isteğiyle başlayıp iki yönlü, açık kalan bir kanala dönüşen bağlantı.

Tabloda en çok hafife alınan satır genişletme. Bir protokolün ilk sürümü, ikincisinin nasıl ekleneceğini baştan düşünmediyse ikinci sürüm hiç gelmeyebilir. 15. bölümde yol üstündeki kutuların tanımadıkları alanları gördüklerinde bağlantıyı düşürdüğünü, bu yüzden yeni protokollerin eski protokol kılığına girmek zorunda kaldığını görmüştün. Bu kemikleşmeye karşı bulunan çare ilginç: GREASE (RFC 8701). İstemciler uzantı listelerine anlamsız, rastgele değerler ekliyor. Tanımadığı değeri görünce çöken bir sunucu, gerçek bir yeni uzantı gelmeden önce ortaya çıkıyor. Uzantı noktası kullanıldıkça paslanmıyor.

Derinleşme"Kabul ettiğinde hoşgörülü ol" ilkesi neden sorgulanıyor?

Jon Postel 1980’de IP ve TCP’nin erken belirtimlerine bir cümle koydu: gönderdiğinde tutucu, kabul ettiğinde hoşgörülü ol. Yani standarda harfiyen uyan paketler üret, ama karşıdan gelen kusurlu paketi anlamı açıksa kabul et. Bu sağlamlık ilkesi kırk yıl boyunca internet mühendisliğinin atasözü oldu.

2023’te internet mimarisini gözeten kurul IAB, RFC 9413 ile bu ilkenin bedelini yazdı. Belgenin ilk taslaklarının adı açık sözlüydü: sağlamlık ilkesinin zararlı sonuçları. Mekanizma şöyle işliyor. Hoşgörülü bir alıcı kusurlu bir göndericiyi sessizce kabul ediyor. Kusur hiç düzeltilmiyor, çünkü kimse şikâyet etmiyor. Zamanla o kusurlu davranış fiilî standarda dönüşüyor ve sonraki her yazılım onu da kabul etmek zorunda kalıyor. Belirtim ile gerçek davranış arasındaki mesafe açıldıkça güvenlik açıkları o mesafede yaşıyor. İki ayrıştırıcının aynı mesajı farklı okuması, istek kaçakçılığı gibi saldırıların kaynağı.

RFC 9413’ün önerisi hoşgörüyü tamamen bırakmak değil. Protokolü etkin biçimde bakımda tutmak: beklenmedik durumları gizlemek yerine görünür kılmak, geçici toleransları kalıcı hâle getirmemek. Kitabın bu sayfasına kadar gördüğün protokollerin çoğu da gerçekten böyle yaşıyor. Yayımlandıkları günden sonra onlarca yıl boyunca yeni RFC’lerle yamalanıyorlar.

Özet

  • Eşten eşe mimaride talep ile kapasite birlikte büyür: bin eşe 1 GB dağıtmak tek sunucuyla 2 saati aşarken eşlerin yardımıyla 7 dakikanın altına iner.
  • BitTorrent dosyayı özetli parçalara böler: önce en nadir parçayı ister, bozuk parçayı özetinden yakalar.
  • Teşvik karşılıklılıkla kurulur: en hızlı dört komşuya yükle, her 10 saniyede yenile, her 30 saniyede bir yabancıya şans ver.
  • DHT merkezi dizini ortadan kaldırır: Kademlia XOR uzaklığıyla her aramayı log N adımda bitirir ve ad olarak içeriğin özetini kullanır.
  • Protokol tasarımı bir kararlar dizisidir: mimari, taşıma, biçim, çerçeveleme, durum, etkileşim, adlandırma, genişletme ve güvenlik. En çok hafife alınanı genişletme.

BitTorrent’te parçaların hangi sırayla geldiği önemsizdi; dosya ancak tamamlanınca açılıyor. Film izlerken ise sıra her şey: şu an oynayan saniyenin ardından bir sonraki saniye gelmek zorunda. İnerken oynayan bir videonun kaç megabitle ineceğine kim karar veriyor?

Bölüm 73: Uyarlanır Video Akışı

İstemci. 17. bölümde DASH’in fikrini görmüştün: sunucu videoyu birkaç saniyelik parçalara bölüyor, her parçayı birkaç farklı hızda kodluyor ve bir listede yayımlıyor. Hangi parçanın hangi hızda ve ne zaman isteneceğine oynatıcı karar veriyor.

O kararın içine girmek için üç şeyi bilmek gerekiyor. Video neden bu kadar sıkıştırılabiliyor, oynatıcının elindeki tampon nasıl doluyor ve boşalıyor, karar veren algoritma neye bakıyor? Sonunda canlı yayının neden hep birkaç saniye geriden geldiğine de bakacağız.

Önce ölçek. Sıkıştırılmamış bir film saniyede kaç bit tutuyor?

Ham görüntü, sıkışmış görüntü

1920×1080 çözünürlükte, piksel başına 24 bit renk ve saniyede 60 kare: 1.920 × 1.080 × 24 × 60, yani saniyede yaklaşık 3 gigabit. Aşağıda göreceğin gerçek bir yayın listesi aynı görüntüyü saniyede 5 ile 8 megabit arasında gönderiyor. Arada yaklaşık 370 ile 600 katlık bir sıkıştırma var.

Bu oran iki tekrardan geliyor. Birincisi karenin içindeki tekrar: gökyüzünün bir parçası yanındaki parçaya benziyor ve kodlayıcı bu benzerliği bir dönüşümle birkaç sayıya indiriyor. İkincisi kareler arasındaki tekrar ve asıl kazanç orada. Saniyede 60 kare çekilen bir sahnede ardışık iki kare neredeyse aynı; değişen şey birkaç nesnenin konumu. Kodlayıcı ikinci kareyi baştan yazmak yerine “birinci karenin şu bloğu şu kadar sağa kaydı” diyor.

Bu yüzden kareler üç türe ayrılıyor:

TürNeye dayanıyorBoyu
I karesihiçbir şeye; kendi başına çözülürbüyük
P karesiönceki bir kareyeküçük
B karesihem önceki hem sonraki bir kareyeen küçük

B karesi sezgiye ters bir sonuç doğuruyor: bir kareyi çözmek için gelecekteki bir kareye ihtiyaç var. Bu yüzden kareler ekranda gösterildikleri sırayla değil, çözülecekleri sırayla gönderiliyor. Gelecekteki kare önce geliyor, arada kalan B kareleri sonra.

Bir I karesinden bir sonrakine kadarki kare grubuna GOP deniyor. Bir oynatıcı yayına ancak bir I karesinden katılabiliyor, çünkü ondan önceki her kare bir öncekine dayanıyor. Akış açısından bundan çıkan kural kesin: her parça, kendinden öncekilere hiç dayanmayan bir I karesiyle başlamak zorunda. Oynatıcı ancak böylece parça sınırında bir hızdan ötekine geçebiliyor.

Kodlayıcı kuşakları aynı işi giderek daha az bitle yapıyor. 2003’te çıkan H.264 bugün hâlâ en yaygını. 2013’te gelen H.265, yani HEVC, aynı kaliteyi yaklaşık yarı bit hızıyla veriyor ama patent lisansları karmaşık. 2018’de dondurulan AV1’i ise büyük teknoloji şirketlerinin kurduğu bir birlik telifsiz olsun diye tasarladı. Her yeni kuşak bit kazandırıyor, karşılığında kodlama tarafında çok daha fazla işlem istiyor.

Bir merdiven, birçok basamak

Apple’ın geliştiricilere örnek olarak yayımladığı bir yayının ana listesi şöyle başlıyor (satırlar kısaltıldı):

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=2177116,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=60.000
v5/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=8001098,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000
v9/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=6312875,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000
v8/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=4943747,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000
v7/prog_index.m3u8
...
#EXT-X-STREAM-INF:BANDWIDTH=541052,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=480x270,FRAME-RATE=30.000
v2/prog_index.m3u8

Her STREAM-INF satırı merdivenin bir basamağı. BANDWIDTH o basamağın tepe bit hızı, CODECS içindeki avc1 H.264 görüntüyü, mp4a.40.2 AAC sesi gösteriyor. Listede sekiz basamak var: 480×270’te 0,54 Mbit/s’den 1080p’de 8 Mbit/s’ye. Dikkat çeken ayrıntı, aynı 1920×1080 çözünürlüğün üç ayrı basamakta durması. Çözünürlük kalitenin tamamı değil; aynı piksel sayısı daha az bitle daha bulanık, daha çok bitle daha net kodlanabiliyor.

Basamaklardan birinin kendi listesine girince parçalar görünüyor (bazı satırlar çıkarıldı):

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="main.mp4",BYTERANGE="719@0"
#EXTINF:6.00000,
#EXT-X-BYTERANGE:1508000@719
main.mp4
#EXTINF:6.00000,
#EXT-X-BYTERANGE:1510244@1508719
main.mp4

Her parça 6 saniye; bu listede 100 tane var, yani on dakikalık bir video. Sürpriz şurada: parçalar ayrı dosyalar bile değil. Hepsi tek bir main.mp4 dosyasının içinde duruyor ve BYTERANGE satırı hangi bayt aralığının istenmesi gerektiğini söylüyor. Oynatıcı her parça için aynı dosyadan bir aralık isteği gönderiyor. İlk satırdaki 719 baytlık parça ise görüntüyü çözmeye yetecek ayarları taşıyan başlangıç bölümü. Parça başına yaklaşık 1,5 MB, 6 saniyeye bölünce saniyede 2 megabite yakın; ana listedeki 2,17 Mbit/s’lik basamakla tutarlı.

Merdivenin basamaklarını kim ve neye göre seçiyor? Netflix 2010’da bütün kataloğu için tek bir merdiven kullanıyordu: 235 kbit/s’den 5.800 kbit/s’ye on basamak, her birine sabit bir çözünürlük. 2015’te bunu bıraktı. Çizgi film gibi sade bir görüntü 1080p’de 1,5 Mbit/s ile iyi görünürken, film greniyle dolu bir sahne 5,8 Mbit/s’de bile bloklaşıyordu. Artık her yapımın merdiveni kendi karmaşıklığına göre çıkarılıyor. Doğru bit hızı içeriğe bağlı.

Tampon: ağ ile ekran arasındaki depo

Oynatıcı, parçaları indirdikçe bir tampona koyuyor ve tamponu gerçek zamanlı hızla boşaltarak oynatıyor. Ağın dalgalanmasını ekrandan saklayan şey bu depo.

Hesabı bir kez yapmak her şeyi açıklıyor. Parçalar 4 saniyelik ve oynatıcı 5 Mbit/s’lik basamağı seçmiş olsun. Bir parça 20 megabit.

Donmanın adı yeniden tamponlama ve izleyicinin en az affettiği şey o. 2011’de büyük video sağlayıcılarının milyonlarca oturumunu inceleyen bir çalışma, tamponda geçen süre oranının bütün içerik türlerinde izleme süresini en çok etkileyen ölçüt olduğunu gösterdi. En sert etki canlı yayındaydı: 90 dakikalık canlı bir etkinlikte tamponlama oranındaki %1’lik artış, izleme süresini üç dakikadan fazla kısaltıyordu.

Tamponun bir üst sınırı da var. Dolduğunda oynatıcı indirmeyi durduruyor, biraz boşalınca yeniden başlıyor. Bağlantı böylece bir açık bir kapalı çalışıyor ve 17. bölümün sonunda anlatılan sorun burada doğuyor: aynı hattaki iki oynatıcı birbirinin sessiz anlarını boş kapasite sanıyor.

Kararı veren algoritma

Oynatıcı her parçadan önce aynı soruyu soruyor: sıradaki parçayı hangi basamaktan isteyeyim? Bu kararı veren mantığa ABR (adaptive bitrate) deniyor ve üç ana yaklaşım var.

Hıza bakan. Son birkaç parçanın ne hızla indiğini ölç, bir güvenlik payı düş ve o hızın altındaki en yüksek basamağı seç. Sezgisel, ama ölçüm yanıltıcı olabiliyor. Açık-kapalı çalışan bir bağlantıda her parça bir sessizlikten sonra başlıyor. Linux varsayılan olarak (net.ipv4.tcp_slow_start_after_idle = 1) bir yeniden gönderim zaman aşımından uzun bekleyen bağlantının tıkanıklık penceresini küçültüyor. Her parçanın başında hız 68. bölümdeki yavaş başlangıçtan yeniden tırmanıyor. Kısa parçalarda ölçülen hız, hattın gerçek kapasitesinin altında kalıyor.

Tampona bakan. Netflix’in 2014’te yayımladığı çalışma soruyu tersine çevirdi: kapasiteyi tahmin etmek zorunda mıyız? Tampon doluysa yüksek basamak seç, boşalıyorsa düşük; aradaki bölgede tampon doluluğunu doğrudan bir bit hızına eşle. Mayıs ile Eylül 2013 arasında milyonlarca gerçek kullanıcıyla yapılan deneylerde yeniden tamponlama, şirketin o günkü algoritmasına göre %10 ile %20 azaldı; ortalama görüntü hızı ise aynı kaldı. Tek istisna açılış anı: tampon boşken bakılacak bir şey olmadığından orada hız tahmini hâlâ gerekiyor.

İkisini birlikte tartan. Birkaç parça sonrasını öngörüp en iyi planı seçen denetim kuramı yaklaşımları geliştirildi. 2016’da yayımlanan BOLA bunlardan biri; yalnızca tampona bakıyor ama seçimini kalite ile donma riskini tartan bir optimizasyonla yapıyor ve DASH’in açık kaynak başvuru oynatıcısına girdi. 2017’de ise karar mantığını pekiştirmeli öğrenmeyle kendisi öğrenen denemeler geldi.

Tampona bakan bir kuralın basit bir hâli, yukarıdaki merdivenle şöyle olabilir:

TamponSeçilen basamak
10 saniyeden azen düşük: 0,54 Mbit/s
10 ile 30 saniye arasıdoluluğa göre doğrusal olarak yukarı
30 saniyeden fazlaen yüksek: 8 Mbit/s

Alt bölge bir güvenlik deposu: orada tek amaç donmamak. Üst bölgede ise kaybedecek bir şey yok, en iyi görüntü isteniyor.

HLS, DASH ve ortak parça biçimi

Yukarıdaki listeler HLS biçiminde. Apple 2009’da başlattı ve 2017’de RFC 8216 olarak yayımlandı. DASH ise 2012’de ISO standardı oldu ve aynı bilgiyi XML biçimli bir tanım dosyasıyla veriyor. Uzun süre aynı video iki kez paketlenip iki kez saklandı: bir kez HLS için, bir kez DASH için. 2018’de standartlaşan CMAF parçaların biçimini ortaklaştırdı. Artık aynı parça dosyaları iki listeden de işaret edilebiliyor. Kenar sunucuları her parçayı bir kez önbelleğe alıyor.

DerinleşmeParçalar neden 2 ile 10 saniye arasında?

Parça süresi dört kuvvetin arasında sıkışmış bir sayı.

Kısa parça hızlı tepki demek. Hat düştüğünde oynatıcı bir sonraki parça sınırında hemen daha düşük basamağa geçebiliyor. Canlı yayında da gecikmeyi doğrudan kısaltıyor, çünkü bir parça tamamlanmadan yayımlanamıyor.

Uzun parça ise verim demek. Her parça bir HTTP isteği ve en az bir gidiş-dönüş. Daha önemlisi her parça bir I karesiyle başlamak zorunda ve I karesi pahalı. Parça kısaldıkça I kareleri sıklaşıyor, aynı kalite için gereken bit artıyor.

Apple’ın tavsiyesi zamanla değişti. Eskiden 10 saniyelik hedef süre öneriyordu. 2016’da bunu 6 saniyeye indirdi ve iki saniyede bir anahtar kare istedi. Belgesindeki gerekçe açık sözlü: eski içeriği yeniden bölmenizi beklemiyoruz, ama ileriye dönük olarak 6 saniye daha iyi bir ödünleşim.

Canlı yayın neden geriden gelir?

Golü ekranda görmeden önce komşunun sevinç çığlığını duyduysan sebebi bu bölümde. Canlı bir yayında görüntünün kameradan ekrana varması birkaç aşamadan geçiyor ve her biri bekletiyor:

  1. Kodlama ve paketleme. Kodlayıcı bir parçayı tamamlamadan yayımlayamıyor; 6 saniyelik parçada ilk kare en az 6 saniye bekliyor.
  2. Dağıtım. Parça kaynaktan kenar sunucularına yayılıyor.
  3. Oynatıcı tamponu. HLS belirtimi, oynatıcıya canlı listenin sonundan en az üç hedef süre geriden başlamasını söylüyor. 6 saniyelik parçalarla bu tek başına 18 saniye.

Toplamda klasik bir canlı yayın ekrana onlarca saniye geç varabiliyor. Apple’ın 2019’da duyurduğu düşük gecikmeli HLS bu zinciri kısaltıyor. Parçalar birer saniyenin altındaki alt parçalar hâlinde yayımlanıyor ve oynatıcı listenin yeni sürümünü sunucuda bekleyerek alıyor, tekrar tekrar sormuyor. Apple halka açık ağlarda iki saniyenin altında gecikme hedefliyor. Aynı fikrin DASH tarafındaki karşılığı da CMAF parçalarını, tamamlanmalarını beklemeden küçük parçalar hâlinde göndermek.

Bir saniyenin altına ise bu mimari inemiyor; orada 74. bölümdeki gerçek zamanlı protokoller devreye giriyor.

Taşıma: TCP’den QUIC’e

Video trafiği taşımanın değişiminden en çok etkilenenlerden biri. Google 2017’de yayımladığı ölçümlerde YouTube’u 15. bölümdeki QUIC üstüne taşımanın etkisini gösterdi. Yeniden tamponlama oranı masaüstünde %18,0, mobilde %15,3 düştü. Kazancın bir kısmı bağlantı kurulumundan, bir kısmı kayıp kurtarmadaki iyileştirmelerden geliyor. Masaüstü bağlantıların yaklaşık %88’i sıfır turla kuruluyordu.

Parçaların nereden geldiği de en az taşıma kadar önemli. 16. bölümde gördüğün kenar sunucuları video için özel bir biçim de aldı. Netflix 2012’den beri kendi önbellek cihazlarını doğrudan internet servis sağlayıcılarının ağlarına yerleştiriyor. Popüler bir dizinin parçaları, izleyicinin bağlı olduğu operatörün içinden, birkaç sekme öteden geliyor.

Özet

  • Sıkıştırma kareler arasındaki tekrardan gelir: I karesi kendi başına çözülür, P ve B kareleri başka karelere dayanır. Her parça, oynatıcının basamak değiştirebilmesi için bağımsız bir I karesiyle başlar.
  • Merdiven içeriğe göre kurulur: aynı çözünürlük farklı bit hızlarında durabilir, sade bir görüntü yüksek çözünürlüğü daha az bitle taşır.
  • Tampon ağın dalgasını emer: hat seçilen hızın altına düşerse tampon her parçada erir ve biterse görüntü donar. İzleyicinin en az affettiği şey donmadır.
  • ABR kararı iki şeye bakar: ölçülen hıza ya da tamponun doluluğuna. Tampona bakan yaklaşım Netflix’te donmaları %10 ile %20 azalttı.
  • Canlı yayının gecikmesi parçadan gelir: tamamlanmadan yayımlanamayan parçalar ve birkaç parçalık oynatıcı tamponu onlarca saniye tutar. Düşük gecikmeli HLS bunu iki saniyenin altına indirmeyi hedefliyor.

Canlı yayında bile birkaç saniyelik gecikmeye razı olabiliyorsun; golü geç görsen de maç aynı maç. Karşında konuşan biri varsa durum değişiyor. Sen sözünü bitirdiğinde cevabı yarım saniye gecikirse konuşma birbirinin üstüne biniyor. Gecikmenin yüz milisaniyeler içinde kalması gerekiyorsa ağ neden vazgeçiyor?

Bölüm 74: Gerçek Zamanlı Ses ve Görüntü

Güvenilirlikten. Kaybolan bir ses paketini yeniden istemek mümkün, ama yeniden gönderilen paket geldiğinde o sesin çalınması gereken an çoktan geçmiş oluyor. 7. bölümde bir cümleyle söylemiştim: geç gelen veri hiç gelmemiş sayılır. Bu bölüm o cümlenin mühendisliği.

Canlı görüşme, kitabın izlediği isteğin tam tersi. Sayfa bir bayt bile eksik gelse bozuktu ama birkaç saniye gecikmesi dert değildi. Görüşmede birkaç paketin kaybolması dert değil, yarım saniyelik gecikme ise konuşmayı bitiriyor.

Peki kaç milisaniye “çok” sayılıyor?

Gecikme bütçesi

Uluslararası Telekomünikasyon Birliği’nin G.114 tavsiyesi bu sorunun resmî cevabı. Tek yönlü gecikme 150 milisaniyenin altında kaldığında çoğu uygulama bundan belirgin biçimde etkilenmiyor. Genel ağ planlamasında 400 milisaniye aşılmaması gereken sınır. Çok etkileşimli işler ise 100 milisaniyenin altındaki gecikmelerden bile etkilenebiliyor.

Bu bütçe yalnızca ağa ait değil. Ağızdan kulağa giden yolun her aşaması ondan pay alıyor. Aşağıdaki dağılım bir örnek; sayılar kodeğe, cihaza ve yola göre değişiyor ama kalemler değişmiyor:

AşamaÖrnek süre
sesi toplamak: bir kodek çerçevesi20 ms
kodlamabirkaç ms
ağ: İstanbul’dan Frankfurt’a tek yön25 ms civarı
jitter tamponu40 ms
çözme ve çalmabirkaç ms
toplamyaklaşık 90 ms

Ağın payı, kalemlerden yalnızca biri. 2. bölümde yayılım gecikmesinin ışık hızıyla sınırlı olduğunu görmüştün. Kıtalar arası bir görüşmede yalnızca o kalem 150 milisaniyeyi zorlayabiliyor; 64. bölümdeki jeostatik uydu hattında ise tek başına aşıyor.

Yirmi milisaniyelik ses nasıl pakete dönüşür?

54. bölümdeki telefon sesi saniyede 8.000 örnek, örnek başına 8 bit: 64 kbit/s. Bu sesi 20 milisaniyelik dilimlere bölüp her dilimi bir pakete koyalım.

Konuşmanın kendisi 64 kbit/s, taşıması 80 kbit/s. IP katmanında her beş bayttan biri başlık. Daha verimli bir kodek bu oranı büyütüyor. Geniş bantlı konuşma için sık kullanılan Opus 20 kbit/s civarında çalışınca 20 ms’lik ses yaklaşık 50 bayta sığıyor, başlık ise yine 40 bayt. Burada başlık, taşınan sesin neredeyse kendisi kadar.

Neden daha büyük paketler kullanılmıyor? Çünkü her ek milisaniye doğrudan gecikme. 60 ms’lik bir paket başlık payını üçte birine indirir ama gönderen, ilk sesi yollamadan önce 60 ms beklemek zorunda kalır. Daha küçük paket ise başlık payını büyütür. 20 ms, telefonculuğun bu iki bedel arasında uzun süredir kabul ettiği orta nokta.

Jitter: paketler aynı aralıkla gelmez

Gönderen her 20 milisaniyede bir paket gönderiyor. Paketler ise alıcıya 20 milisaniye arayla gelmiyor. Biri boş bir kuyruktan geçiyor, biri 40. bölümdeki dolu bir kuyrukta bekliyor. Gecikmedeki bu oynamaya jitter deniyor.

Alıcı paketleri geldikleri anda çalsaydı ses kesik kesik çıkardı. Bunun yerine her paketi gönderilme anından sabit bir süre sonra çalıyor. Aradaki bekleme payı oynatma tamponu. Tampondan uzun süren paket çalma anını kaçırıyor ve atılıyor; oynatıcı için o paket kaybolmuştan farksız.

Jitter ve oynatma tamponu
zaman, ms020406080100120140160180gönderenvarış1234512345tampon60 msgönderim + 60 ms1235atıldıtampon80 msgönderim + 80 ms12345
Gönderen 20 ms'de bir paket yolluyor. Her paket 20 milisaniyelik ses taşıyor. Gönderen onları saat gibi düzenli aralıklarla, 0, 20, 40, 60 ve 80. milisaniyede yolluyor.
  1. Gönderen 20 ms'de bir paket yolluyor. Her paket 20 milisaniyelik ses taşıyor. Gönderen onları saat gibi düzenli aralıklarla, 0, 20, 40, 60 ve 80. milisaniyede yolluyor.
  2. Paketler farklı gecikmelerle geliyor. Her paket yolda başka kuyruklardan geçiyor ve gecikmeler 38 ile 66 ms arasında oynuyor. Okların eğimi bu yüzden farklı; gönderendeki düzenli 20 ms'lik aralık varışta bozuluyor.
  3. Tampon her paketi 60 ms sonra çalıyor. Alıcı paketi geldiği an çalmıyor, gönderilme anından sabit 60 ms sonra çalıyor. Çalma satırında 20 ms'lik dilimler boşluksuz arka arkaya diziliyor ve ses kesintisiz çıkıyor.
  4. 4. paket geç kalıyor. 4. paketin çalma anı 120. milisaniye ama paket 126. milisaniyede geliyor. Çalma anını kaçıran paket atılıyor; oynatıcı için kaybolmuş bir paketten farkı yok ve o 20 ms'lik boşluğu kayıp gizleme dolduruyor.
  5. Tampon 80 ms'ye uzarsa. Aynı paketler 80 ms'lik tamponla çalınınca 4. paketin çalma anı 140. milisaniyeye kayıyor ve paket yetişiyor. Bedeli, konuşmanın tamamının 20 ms daha geç duyulması.

Tampon uzadıkça geç kalan paket azalıyor ama konuşmanın gecikmesi artıyor. Bu yüzden iyi bir alıcı tamponun boyunu ağa göre ayarlıyor. Kurose ve Ross’un aktardığı klasik yöntemde alıcı ortalama gecikmeyi ve gecikmenin ortalamadan sapmasını yavaşça güncellenen iki ortalamayla izliyor. Çalma anını ortalamanın üstüne sapmanın birkaç katını ekleyerek seçiyor. Ayarı da iki konuşma arasındaki sessizliklerde değiştiriyor; sessizliği birkaç milisaniye uzatmayı kulak fark etmiyor, konuşmanın ortasındaki bir sıçramayı fark ediyor.

Jitter’ın kendisi de ölçülüyor ve karşı tarafa bildiriliyor. RTP’nin belirtimi alıcıya her paketle güncellenen tek bir formül veriyor. D, ardışık iki paketin geliş aralığı ile gönderiliş aralığı arasındaki fark:

J = J + ( |D| - J ) / 16

Her yeni ölçüm tahmini on altıda biri kadar kaydırıyor. Tek bir tuhaf paket sayıyı sarsmıyor, kalıcı bir değişim ise birkaç düzine paket içinde yerleşiyor.

Kaybı yeniden istemek yerine gizlemek

Kaybolan paketin yerine bir şey çalınmak zorunda. En basiti gizleme: bir önceki sesi tekrarlamak ya da iki komşu arasını doldurmak. Tek tük kayıplarda kulak bunu çoğu zaman fark etmiyor.

Daha güçlüsü, kaybı önceden hesaba katıp fazladan göndermek:

Görüntü farklı davranıyor. 73. bölümde karelerin birbirine dayandığını görmüştün. Kaybolan bir parça, bir sonraki bağımsız kareye kadar bütün kareleri bozabiliyor. Bu yüzden görüntüde iki yol daha kullanılıyor. Gidiş-dönüş süresi kısaysa kaybolan paket yeniden isteniyor. Değilse alıcı gönderenden hemen yeni bir bağımsız kare istiyor.

RTP ve RTCP

Ses ve görüntü paketlerinin ortak zarfı RTP (Real-time Transport Protocol). 2003’te RFC 3550 olarak son biçimini aldı. Adında “taşıma” geçse de UDP’nin üstünde, uygulamanın içinde yaşıyor. Sabit başlığı 12 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
+---+-+-+-------+-+-------------+-------------------------------+
|V=2|P|X|  CC   |M|     PT      |         sıra numarası         |
+---+-+-+-------+-+-------------+-------------------------------+
|                         zaman damgası                         |
+---------------------------------------------------------------+
|                    kaynak kimliği (SSRC)                      |
+---------------------------------------------------------------+

Alanların her biri yukarıdaki bir sorunu çözüyor:

Yanındaki RTCP denetim trafiğini taşıyor. Alıcılar düzenli raporlarla kayıp oranını, jitter’ı ve gidiş-dönüş süresini hesaplamaya yetecek zamanları geri bildiriyor. Gönderen de göndericinin kendi saatiyle RTP zaman damgası arasındaki eşlemeyi yayımlıyor. Ses ve görüntü iki ayrı akış olarak geldiği hâlde dudak hareketinin sesle aynı anda oynaması bu eşleme sayesinde. Denetim trafiğinin kendisi de sınırlı: belirtim ona oturumun bant genişliğinin %5’ini ayırmayı ve raporlar arasında en az 5 saniye bırakmayı öneriyor.

RTP’nin kendisi şifreleme yapmıyor. SRTP (RFC 3711) yükü şifreliyor ve paketin değiştirilmediğini doğruluyor. Aşağıda göreceğin WebRTC’de şifresiz medya diye bir seçenek yok.

Çağrıyı kurmak: SIP ve SDP

Ses paketleri akmaya başlamadan önce iki tarafın buluşması, hangi kodeği ve hangi portu kullanacaklarında anlaşması gerekiyor. İnternet telefonunun bu işi yapan protokolü SIP (RFC 3261, 2002). Metin tabanlı ve 13. bölümdeki HTTP’ye çok benziyor: INVITE bir arama başlatıyor, 180 Ringing karşı tarafın çaldığını, 200 OK açıldığını söylüyor, ACK bunu onaylıyor, BYE kapatıyor. Adres de bir URL’ye benziyor: sip:ali@example.com.

Bir kural önemli: SIP yalnızca buluşturuyor. Ses paketleri çoğu zaman SIP sunucusuna hiç uğramadan iki uç arasında doğrudan akıyor.

Anlaşmanın içeriğini SDP taşıyor. Örnek bir teklif:

v=0
o=- 4611731400430051336 2 IN IP4 198.51.100.7
s=-
t=0 0
m=audio 49170 RTP/AVP 0 8
c=IN IP4 198.51.100.7
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000

m= satırı “49170 numaralı porttan ses göndereceğim, yük türü 0 ya da 8 olabilir” diyor. 0, Kuzey Amerika’nın μ-yasası kodlaması; 8, Türkiye’nin de kullandığı A-yasası. Karşı taraf bunlardan birini seçip kendi portunu yazdığı bir cevap gönderiyor.

c= satırındaki IP adresi bir sorunun kaynağı. Adres, paketin başlığında değil yükün içinde yazıyor. 46. bölümde bunun adres çeviricileri için neden dert olduğunu görmüştün: çevirici başlıktaki adresi değiştiriyor ama yükteki adres eski, özel ağın adresi olarak kalıyor. Ev router’larındaki SIP’e özel düzeltme modüllerinin kötü ünü buradan.

Tarayıcıdan tarayıcıya: WebRTC

Bugün görüntülü görüşmelerin çoğu tarayıcıda, eklentisiz yapılıyor. Bunu sağlayan WebRTC, Ocak 2021’de hem W3C tavsiyesi hem de bir dizi IETF standardı oldu. İki yarısı var: tarayıcının JavaScript arayüzünü W3C, telden geçen protokolleri IETF tanımlıyor.

Protokol tarafı kitabın birçok durağını bir araya getiriyor:

Standartta tanımlanmayan tek parça, iki tarayıcının adaylarını ve SDP’lerini birbirine nasıl ileteceği. Buna sinyalleşme deniyor ve her uygulama kendi yolunu seçiyor. Çoğu zaman sıradan bir sunucuya açılan bir WebSocket bağlantısı bu işi görüyor. 72. bölümdeki karma mimari tam da bu: tanıştırma merkezde, konuşma eşler arasında.

Chrome’da chrome://webrtc-internals adresini açık tutarak bir görüşme yaparsan bu bölümdeki her şeyi canlı görürsün: seçilen aday çifti, gidiş-dönüş süresi, jitter, kaybolan paket sayısı ve anlık bit hızı.

DerinleşmeBeş kişilik bir toplantıda paketler kime gidiyor?

İki kişilik görüşmede soru basit. Beş kişi olunca üç mimari var.

Herkes herkese (mesh). Her katılımcı görüntüsünü öteki dördüne ayrı ayrı gönderiyor. Görüntü akışı 1,5 Mbit/s ise her katılımcının yükleme hızı 6 Mbit/s olmalı. Ev hatlarının dar yönü yükleme olduğu için bu mimari birkaç kişiden sonra tıkanıyor.

Karıştıran sunucu (MCU). Herkes tek akışını sunucuya gönderiyor. Sunucu bütün akışları çözüyor, tek bir mozaik görüntüde birleştirip yeniden kodluyor ve herkese tek akış gönderiyor. İstemcinin işi kolay, sunucunun işi çok ağır. Yeniden kodlama gecikme de ekliyor.

Yönlendiren sunucu (SFU). Herkes akışını sunucuya gönderiyor ama sunucu hiçbir şeyi çözmüyor; paketleri yalnızca ilgili alıcılara iletiyor. Gönderenler görüntülerini genellikle birkaç kalitede birden yolluyor. Sunucu her alıcıya, onun hattına ve ekranındaki kutunun boyuna uyan kaliteyi seçiyor. Konuşan kişi büyük kutuda yüksek kalitede, ötekiler küçük kutularda düşük kalitede. Sunucu kod çözmediği için ucuz, uçtan uca gecikmeye de neredeyse hiçbir şey eklemiyor. Bugünkü toplantı hizmetlerinde yaygın mimari bu.

Telefonda ses: VoLTE

Cep telefonundaki sıradan bir arama da bugün çoğu zaman aynı parçalarla yapılıyor. 33. bölümdeki 4G şebekesinde ses için ayrı bir devre yok; ses IP paketleriyle taşınıyor. Adı VoLTE. Çağrıyı kuran protokol yine SIP, onu işleten şebeke çekirdeği bileşeninin adı IMS.

Farkı, şebekenin sesi taşıyan paketlere verdiği söz. 40. bölümde gördüğün servis sınıflarından birincisi, QCI 1, konuşma için ayrılmış. Bant genişliği garanti ediliyor, paket gecikme bütçesi 100 ms ve izin verilen kayıp oranı yüzde bir. Radyo tarafında da 40 baytlık IP, UDP ve RTP başlıkları birkaç bayta sıkıştırılıyor; yukarıdaki hesapta başlığın neden bu kadar pahalı olduğunu görmüştün. Kodek de gelişti. 2014’te 3GPP’nin standartlaştırdığı EVS, 20 kHz’e kadar ses bandını taşıyabiliyor. Eski telefonun 4 kHz’lik bandıyla karşılaştırınca fark, bir radyo yayınını bir müzik kaydıyla karşılaştırmak gibi.

Özet

  • Gecikme bütçesi kısa: G.114’e göre tek yönde 150 ms’nin altı çoğu uygulama için rahat, 400 ms genel ağ planlamasında aşılmaması gereken sınır. Ağ bu bütçenin yalnızca bir kalemi.
  • Küçük paket, pahalı başlık: 20 ms’lik 64 kbit/s ses 160 bayt yük ve 40 bayt başlık taşır; 64 kbit/s’lik ses IP katmanında 80 kbit/s olur.
  • Oynatma tamponu jitter’ı emer: her paket sabit bir gecikmeyle çalınır, bundan geç gelen paket kaybolmuş sayılır. Tamponun boyu gecikme ile kayıp arasındaki ödünleşimdir.
  • Kayıp yeniden istenmez, gizlenir ya da önceden telafi edilir: tekrar, eşlik paketi, düşük hızlı kopya ve serpiştirme.
  • RTP sıra numarası, zaman damgası ve akış kimliği taşır: RTCP kaybı, jitter’ı ve ses ile görüntünün eşlemesini bildirir.
  • SIP buluşturur, SDP anlaştırır, ICE yolu bulur: medya çoğu zaman sunucuya uğramadan eşler arasında akar.

Canlı görüşme her milisaniyeyi sayıyor, pil ise dert değil; telefon her akşam şarja giriyor. Şimdi tam tersini düşün: bir tarlaya bırakılmış, yıllarca kimsenin dokunmayacağı, iki kalem pille çalışan ve dakikada bir sıcaklık ölçen yüzlerce küçük cihaz. Hız da gecikme de önemsiz, ömür ise her şey. Böyle bir ağ nasıl kurulur?

Bölüm 75: Kablosuz Sensör Ağlarının Mimarisi

Her kararı pile göre vererek. Kitap boyunca izlediğin ağda kıt olan kaynak hızdı: daha çok bit, daha kısa gecikme. Burada kıt olan kaynak enerji. Bir düğümün ömrü, içindeki iki kalem pilin ne kadar dayandığı kadar. Protokol yığınının her katmanı bu tek soruya göre yeniden düşünülüyor: bu iş kaç mikrojoule tutuyor?

Bu kısmın konusu kablosuz sensör ağları (wireless sensor networks, kısaca WSN). Birkaç tanımla başlayalım. Ağın elemanı, üstünde bir ya da birkaç algılayıcı, küçük bir işlemci, bir radyo ve bir pil taşıyan sensör düğümü. Düğümler ölçtüklerini birbirleri üzerinden, sekme sekme, verinin toplandığı sink düğümüne taşıyor. Sink çoğu zaman internete bağlı bir geçit.

Önce düğümü açalım: o küçük kutunun içinde ne var ve enerjiyi en çok ne yiyor?

Düğümün içinde ne var?

Bu alanın başlangıcında Berkeley’de bir proje duruyor. 1997’de DARPA’ya sunulan Smart Dust önerisi, algılayan ve haberleşen bir düğümü bir milimetreküpe sığdırmayı hedefliyordu. Proje 1998’de desteklendi ve 2001’de bitti. Asıl mirası, o hedefe giderken hazır parçalarla yapılan kibrit kutusu boyundaki düğümler ve onlar için yazılan TinyOS işletim sistemi oldu. Bu düğümlere İngilizcede mote deniyor. Alanın en çok atıf alan makalelerinden biri de aynı dönemden: Mart 2002’de yayımlanan ve yazarları arasında İan F. Akyıldız ile Erdal Çayırcı’nın da bulunduğu kapsamlı bir tarama.

Araştırma dünyasının uzun süre standart düğümü olan TelosB tipik bir örnek:

ParçaTelosB’deki karşılığı
işlemciTI MSP430F1611, 16 bit, 8 MHz
bellek10 KB RAM, 48 KB flash
radyoCC2420, IEEE 802.15.4, 2,4 GHz, 250 kbit/s
güçiki kalem pil

On kilobayt RAM, bu satırları okuduğun bilgisayarın belleğinin kabaca milyonda biri. Asıl ilginç sayılar ise akımlarda. MSP430 1 MHz’te çalışırken yaklaşık 0,33 miliamper çekiyor. CC2420 alırken 18,8, gönderirken 17,4 miliamper. Radyo, işlemciden onlarca kat fazla yakıyor.

Tabloda bir tuhaflık daha var: radyo dinlerken konuşurkenden fazla akım çekiyor. Radyoyu açık tutup gelecek bir mesajı beklemek, göndermek kadar pahalı. Sensör ağlarının ortam erişim problemi bu cümlenin üstüne kurulu; 76. bölümün konusu o.

Pilin hesabı

İki kalem pili yaklaşık 2.500 miliamper saat sayalım.

İki ders çıkıyor. Birincisi, ömrü belirleyen şey radyonun açık kaldığı süre ve onu yöneten protokol. İkincisi, radyo neredeyse hiç açılmayınca uyku akımı öne geçiyor. Bu yüzden düşük güçlü çiplerin veri sayfalarında mikroamperlik uyku akımı en öne yazılıyor.

DerinleşmeBir bit göndermek kaç talimat eder?

2000’de yayımlanan ve bu alanın yönünü belirleyen bir makalede Pottie ile Kaiser bir hesap verdi. Bir kilobiti 100 metre öteye göndermenin enerjisiyle, watt başına 100 milyon talimat işleyen bir işlemci yaklaşık 3 milyon talimat çalıştırabiliyordu. Hesabın varsayımları açıkça yazılı: 1 GHz taşıyıcı, BPSK modülasyonu, milyonda bir bit hatası ve mesafenin dördüncü kuvvetiyle düşen sinyal.

Sonuç bir tasarım ilkesine dönüştü: gönderme, hesapla. Bir düğüm on ölçümü tek tek yollamak yerine ortalamasını ya da en büyüğünü yollarsa, bekleyen işlemci döngüleri harcanmış olur ama radyo on kat daha az açılır. Ağ içinde işleme ve veri birleştirme fikri buradan geliyor.

Makaleyi dikkatle okuyan birinin takılacağı bir ayrıntı var. Aynı cümle bu enerjiyi yaklaşık 3 joule diye de veriyor. Oysa watt başına 100 milyon talimatla 3 milyon talimat 30 milijoule eder. İki sayıdan biri tutarsız ama oranın söylediği değişmiyor. Literatürde bu cümlenin “bir kilobit” yerine “bir bit” diye aktarıldığı da sık görülür. Kaynağın kendisine gitmenin değeri bu tür ayrıntılarda ortaya çıkıyor.

Sink, sekme ve yapı

Ölçümlerin varacağı yer sink. Tarladaki yüzlerce düğümün hepsi sink’in menzilinde olamayacağı için veri çok sekmeli taşınıyor: her düğüm hem kendi ölçümünü gönderiyor hem de komşularının ölçümlerini ileriye aktarıyor.

Çok sekmenin bir enerji gerekçesi de var. 34. bölümde sinyalin mesafeyle nasıl zayıfladığını görmüştün; yere yakın, engelli ortamda güç mesafenin kabaca üçüncü ya da dördüncü kuvvetiyle düşüyor. Mesafeyi dörde bölüp dört sekmede gitmek, verici gücünü dördüncü kuvvet için 64’te birine indiriyor. Ama her sekmede bir alıcı da uyanıp dinliyor ve radyonun sabit maliyeti ödeniyor. Bu yüzden çok sekme ancak mesafe uzadığında gerçekten kazançlı.

Düğümlerin nasıl örgütleneceği ikinci karar:

Çok sekmeli yapının bir de doğal kusuru var. Sink’in hemen yanındaki düğümler bütün ağın trafiğini taşıyor ve pilleri önce onların bitiyor. Onlar ölünce ağın geri kalanı sağlam olsa bile sink’le bağlantısı kopuyor. Buna enerji deliği deniyor ve 80. bölümdeki hareketli sink fikri bu sorundan doğdu.

Adres değil, veri

İnternette bir makineye adıyla ulaşıyorsun. Sensör ağında çoğu zaman hangi düğümün cevap verdiği önemsiz; önemli olan cevabın kendisi. Soru “17 numaralı düğümün sıcaklığı kaç?” değil, “sıcaklığın 30 dereceyi geçtiği yer neresi?” Buna veri merkezli ağ deniyor. Veri, düğümün adresiyle değil, taşıdığı özelliklerle adlandırılıyor.

Verinin sink’e hangi düzende aktığı da uygulamaya göre değişiyor:

Teslim biçimiNasılÖrnek
dönemselher düğüm belirli aralıkla ölçümünü gönderiron dakikada bir toprak nemi
olayla tetiklenendüğüm yalnızca bir eşik aşılınca konuşuryangın, sarsıntı, kapı açılması
sorguylasink bir soru yayar, yalnızca ilgili düğümler cevap verir“şu bölgedeki en yüksek sıcaklık?”

Veri merkezliliğin enerji tarafındaki karşılığı ağ içinde birleştirme. Yukarıdaki sorguda yol üstündeki her düğüm, altından gelen cevapları tek tek aktarmak yerine yalnızca en büyüğünü iletebilir. Yüz ölçüm yüz paket yerine bir paketle sink’e varır.

“Ağın ömrü” de tek bir tanım değil. İlk düğümün ölmesi, düğümlerin belli bir oranının ölmesi ya da izlenen alanın belli bir kısmının görünmez olması ayrı ayrı ölçülüyor. Hangisinin seçildiği, hangi protokolün “daha iyi” çıkacağını değiştirebiliyor.

IEEE 802.15.4: düşük hızlı kişisel alan ağı

Sensör ağlarının radyo ve ortam erişim katmanının büyük kısmını tek bir standart tanımlıyor: 2003’te onaylanan IEEE 802.15.4. Adındaki hedef açık: düşük hızlı, düşük güçlü kablosuz kişisel alan ağı. 30. bölümdeki Wi-Fi’ın hızı için tasarlanmadı; pilin yıllarca dayanması için tasarlandı.

İlk sürüm üç bant tanımlıyordu:

BantKanalHız
868 MHz (Avrupa)120 kbit/s
915 MHz (Amerika)1040 kbit/s
2,4 GHz (dünya geneli)16 (11-26 numaralı)250 kbit/s

2,4 GHz’te kanallar 5 MHz arayla diziliyor ve her biri yaklaşık 2 MHz genişliğinde. Bir frame’in tamamı en fazla 127 bayt. Adres başlıkları ve sağlama toplamından sonra yüke kalan yer bundan da az. 77. bölümde IPv6’nın bu küçük frame’e nasıl sığdırıldığını göreceksin.

Aynı bandı Wi-Fi de kullanıyor ve burada küçük bir hesap bir kural doğuruyor. 802.15.4’ün k numaralı kanalının merkezi 2405 + 5 × (k − 11) MHz. Wi-Fi’ın çakışmayan üç kanalı 1, 6 ve 11 ise kabaca 2401-2423, 2426-2448 ve 2451-2473 MHz aralıklarını kaplıyor.

802.15.4 kanalıMerkezWi-Fi’a göre yeri
152425 MHz1 ile 6 arasındaki boşluk
202450 MHz6 ile 11 arasındaki boşluk
252475 MHz11’in üstü
262480 MHz11’in üstü

Geri kalan on iki kanal, Wi-Fi kanallarından birinin içine düşüyor. Evinde hem Wi-Fi hem 802.15.4 tabanlı akıllı cihazlar varsa, sensör ağını bu dört kanaldan birine koymak girişimi belirgin biçimde azaltıyor.

Standart iki tür cihaz tanımlıyor. Tam işlevli cihaz başkalarının trafiğini aktarabiliyor ve ağı yönetebiliyor. İndirgenmiş işlevli cihaz yalnızca bir tam işlevli cihazla konuşuyor. Tipik bir pille çalışan sensör ikinci türden; zamanının çoğunu uykuda geçirmesi bu sayede mümkün. Ağı başlatan tam işlevli cihaza PAN koordinatörü deniyor.

Aynı radyo, farklı yığınlar

802.15.4 yalnızca alttaki iki katmanı tanımlıyor. Üstüne ne konacağı konusunda iki yol ayrıldı.

Kendine özgü yığın. 2004’te yayımlanan Zigbee kendi ağ ve uygulama katmanlarını getirdi. Akıllı ampuller, sayaçlar ve ev otomasyonu uzun süre bu yolla yapıldı. Zigbee Alliance 2021’de adını Connectivity Standards Alliance olarak değiştirdi.

İnternetin yığını. IETF, IP’nin bu küçük cihazlara kadar inmesi gerektiğini savundu. 2007’de IPv6’yı 802.15.4 frame’ine uyduran 6LoWPAN, 2012’de bu ağlara özel yönlendirme protokolü RPL, 2014’te küçük cihazlar için bir web protokolü olan CoAP geldi. Üçünün ayrıntısı 77. bölümde. Bu yolun ev tarafındaki ürünü Thread: 802.15.4 radyosu üstünde 6LoWPAN ve IPv6 örgü ağı. Ekim 2022’de yayımlanan Matter ise Thread, Wi-Fi ve Ethernet üstünde aynı dili konuşan cihazlar için ortak bir uygulama katmanı.

Sanayi tarafında aynı radyonun üstüne zaman bölmeli ve kanal atlamalı sistemler kuruldu: 2007’de WirelessHART, 2009’da ISA100.11a. 76. bölümde neden zaman bölmeli çalıştıklarını göreceksin.

Bir de bambaşka bir yaklaşım var: çok sekme yerine tek sekmede kilometrelerce gitmek. LoRaWAN ve NB-IoT gibi geniş alan teknolojileri çok düşük hızla çok uzağa konuşarak sink’e doğrudan ulaşıyor. Aralarındaki seçimi 79. bölümde sahadaki örneklerle tartacağız.

TeknolojiRadyoYapıIP taşıyor mu?
Zigbee802.15.4örgühayır, kendi ağ katmanı
Thread802.15.4örgüevet, IPv6
WirelessHART802.15.4zaman bölmeli örgühayır
LoRaWANLoRayıldızların yıldızıhayır
NB-IoThücreselhücreselevet

Düğümlerin üstünde çalışan yazılım da ayrı bir dünya. 2000’de Berkeley’de doğan TinyOS’u 2003’te Contiki izledi, bugün RIOT ve Zephyr gibi açık kaynak sistemler yaygın. Hepsinin ortak noktası, birkaç kilobayt RAM’le olay güdümlü çalışmak.

Özet

  • Kıt kaynak enerji: düğümün ömrü, radyonun açık kaldığı süreyle ölçülür. İki kalem pil sürekli dinleyen bir radyoya altı gün, %1 açık kalan bir radyoya yaklaşık 16 ay yeter.
  • Dinlemek konuşmak kadar pahalı: CC2420 alırken gönderirken olduğundan fazla akım çeker. Enerjiyi en çok, hiç gelmeyecek bir mesajı beklemek yer.
  • Gönderme, hesapla: bir kilobiti 100 metre göndermenin enerjisi milyonlarca talimata denk. Ağ içinde birleştirme radyo süresini doğrudan azaltır.
  • Veri merkezli ağ adres değil özellik sorar: dönemsel, olayla tetiklenen ve sorguyla gelen teslim biçimleri farklı protokoller ister.
  • 802.15.4 alttaki iki katmanı tanımlar: 2,4 GHz’te 16 kanal, 250 kbit/s, en fazla 127 baytlık frame. 15, 20, 25 ve 26 numaralı kanallar Wi-Fi’ın 1, 6 ve 11 kanallarının dışında kalır.

Radyo dinlerken bile konuşurken kadar yakıyor. Demek ki enerjinin çoğunu yiyen şey konuşmak değil, gelip gelmeyeceği belli olmayan bir mesajı beklemek. Radyoyu zamanın %99’unda kapalı tutarsan, komşun sana bir şey söylemek istediğinde seni nasıl uyandıracak?

Bölüm 76: Sensör Ağlarında Ortam Erişimi

İki yolu var. Ya herkes aynı anlarda uyanmayı önceden kararlaştırır, ya da gönderen, alıcı kendiliğinden uyanıp kulak verene kadar seslenip durur. Sensör ağlarının ortam erişim protokolleri, yani MAC’leri, bu iki fikrin ve ikisinin karışımlarının tarihi.

30. bölümdeki Wi-Fi’ın ortam erişimi başka bir soruyu cevaplıyordu: havayı paylaşanlar birbirinin üstüne konuşmasın. Burada o soru hâlâ var ama asıl soru şu: radyo ne zaman kapalı kalabilir?

Önce enerjinin nereye kaçtığını sayalım.

Enerji nereye gidiyor?

2002’de yayımlanan ve bu alandaki ilk etkili MAC protokollerinden birini, S-MAC’i tanıtan makale enerji israfının dört kaynağını saydı. Sonraki bütün tasarımlar bu listeye göre kendini tanımladı:

KaynakNe oluyor
boşta dinlemeradyo açık, ama gelen bir şey yok
çarpışmaiki paket üst üste bindi, ikisi de yeniden gönderilecek
kulak misafirliğiradyo, başkasına giden bir paketi baştan sona dinliyor
denetim yüküRTS, CTS, onay ve zamanlama paketleri veri taşımıyor ama enerji yiyor

Listenin başındaki kalem açık ara en pahalısı. 75. bölümde gördüğün CC2420 radyosu alırken 18,8 miliamper çekiyordu ve bu akım, gelen bir şey olsa da olmasa da ödeniyor. Trafiğin seyrek olduğu bir sensör ağında radyonun açık kaldığı sürenin neredeyse tamamı boşta dinlemeyle geçer. Bu yüzden bütün stratejiler aynı yere varıyor: radyoyu kapat. Zor olan, kapalıyken ulaşılabilir kalmak.

802.15.4’ün kendi erişim yöntemi

802.15.4’ün temel erişim kuralı Wi-Fi’ınkine benziyor ama enerji için iki yerde ayrışıyor. Koordinatörün işaret yaymadığı kipte, yani dilimsiz CSMA-CA’da kural şöyle:

  1. Gönderecek bir frame’i olan düğüm, 0 ile 2^BE − 1 arasında rastgele bir sayı çekiyor. BE başta 3. Her birim 20 sembol, 2,4 GHz’te 320 mikrosaniye.
  2. O kadar bekliyor. Beklerken radyoyu dinlemiyor; kapatabiliyor.
  3. Bekleme bitince kanala bir kez bakıyor. Bu bakış 8 sembol, yani 128 mikrosaniye sürüyor.
  4. Kanal boşsa gönderiyor. Doluysa BE’yi birer birer 5’e kadar artırıp baştan başlıyor. Beşinci denemede de kanal doluysa gönderim başarısız sayılıyor.

İlk denemede bekleme 0 ile 2,24 milisaniye arasında, en geniş pencerede 0 ile 9,92 milisaniye arasında. Onay istenmişse ve gelmezse frame en fazla üç kez daha deneniyor.

İlk fark ikinci adımda. 30. bölümde Wi-Fi’ın geri çekilme sayacının kanal dolunca donduğunu, boşalınca kaldığı yerden devam ettiğini görmüştün. Bunun için radyonun bekleme boyunca kanalı dinlemesi gerekiyor. 802.15.4 bu dinlemeyi kaldırdı: bekleme süresince radyo uyuyabiliyor ve kanala yalnızca sonunda bakıyor. Bedeli adalette. Donmayan sayaç, uzun süredir bekleyen düğüme öncelik tanımıyor. İkinci fark, RTS ve CTS’in hiç olmaması. Frame’ler zaten kısa; onları ayırtmak için ayrı bir konuşma, taşıdıkları veriye oranla fazla pahalı.

Standardın bir de işaretli kipi var. Koordinatör düzenli aralıklarla bir işaret frame’i yayıyor ve iki işaret arası bir süper çerçeveye bölünüyor. Süper çerçevenin başındaki etkin kısımda 16 dilim var. Bunların çoğu yarışmalı erişime açık, sondaki birkaçı ise tek tek cihazlara ayrılabiliyor; bu garantili zaman dilimleri en fazla yedi tane. Etkin kısım bitince herkes bir sonraki işarete kadar uyuyor.

Uyuma oranını iki sayı belirliyor. İşaret aralığı 15,36 ms × 2^BO, etkin kısım 15,36 ms × 2^SO. BO = 8 ve SO = 2 seçilirse işaretler 3,93 saniyede bir geliyor, etkin kısım 61,44 ms sürüyor ve radyo zamanın yalnızca 64’te birinde, yaklaşık %1,6’sında açık kalıyor.

Eşzamanlı uyku: S-MAC ve T-MAC

İşaretli kip tek bir koordinatörün çevresinde çalışıyor. Çok sekmeli bir ağda herkesin aynı programa uyması başka bir düzenek istiyor. S-MAC’in çözümü, komşuların uyku programlarını birbirine duyurması. Düğümler kısa zamanlama paketleriyle “ben şu anda uyanıyorum” diyor ve komşular aynı programa katılıyor. Herkes aynı anda uyanıyor, aynı anda uyuyor. Uyanık kısımda RTS ve CTS ile konuşuluyor; kendisine gelmeyen bir RTS ya da CTS duyan düğüm o konuşma bitene kadar hemen uyuyor ve kulak misafirliğinden kurtuluyor.

Sabit bir program, örneğin zamanın %10’unda uyanık kalmak, trafiğin olmadığı saatlerde bile aynı enerjiyi harcıyor. Bir de gecikme bedeli var. Bir paket bir sekmede ilerledikten sonra bir sonraki düğüm uyuyor olabilir. Paket onun uyanmasını bekliyor ve bu bekleme her sekmede tekrarlanıyor. Çok sekmeli bir yolda gecikme sekme sayısıyla birlikte uyku süresinin katlarına çıkıyor.

2003’teki T-MAC sabit programı esnetti. Uyanık kısmın sonunu bir zaman aşımı belirliyor: bir süre hiçbir şey duyulmazsa düğüm erkenden uyuyor. Trafik azken enerji kazancı büyük. Yeni bir sorun doğdu: bir düğüm, kendisine gönderilmek üzere olan bir paketi haber alamadan uykuya dalabiliyor. Adı erken uyuma.

Eşzamansız uyku: düşük güçlü dinleme

Programları eşleştirmek hem denetim trafiği hem saat hassasiyeti istiyor. İkinci yol eşleştirmeyi tamamen bırakıyor. Her düğüm kendi ritmiyle, örneğin her 100 milisaniyede bir, birkaç milisaniyeliğine uyanıyor ve kanalda bir enerji var mı diye bakıyor. Yoksa hemen uyuyor. Buna düşük güçlü dinleme deniyor.

Gönderen, alıcının ne zaman uyanacağını bilmediği için ona denk gelene kadar sesleniyor. 2004’teki B-MAC bunu en düz hâliyle yapıyor: verinin önüne, alıcının uyanma aralığından uzun bir önsöz koyuyor. Alıcı ne zaman uyanırsa uyansın önsözün bir kısmına denk geliyor, uyanık kalıyor ve arkasından gelen veriyi alıyor. B-MAC uzun süre TinyOS’un varsayılan MAC’iydi.

Bedelin üç kalemi var. Gönderen her paket için bir uyanma aralığı boyunca konuşuyor. Veri her sekmede bir aralık kadar gecikiyor, çünkü önsöz bitmeden gönderilmiyor. En pahalısı da kulak misafirliği: önsözü duyan her komşu uyanık kalıyor, çünkü paketin kime gittiği ancak önsözün sonundaki veri başlığında yazıyor.

2006’daki X-MAC bu üç kalemi birden küçülttü. Tek uzun önsöz yerine kısa önsözler art arda gönderiliyor ve her birinin içinde alıcının adresi yazıyor. Aralarında kısa boşluklar var. Uyanan bir komşu ilk önsözde adresin kendisine ait olmadığını görüp hemen uyuyor. Hedef düğüm ise uyandığında bir boşlukta erken onay gönderiyor ve gönderen önsözleri kesip veriyi hemen yolluyor. Ortalamada önsözün yarısı hiç gönderilmiyor.

Uzun önsöz ve kısa önsözler: B-MAC ile X-MAC
zamanB-MACX-MACgönderenhedefkomşugönderenhedefkomşuuyanma aralığıuzun önsöz: bütün aralık boyuncaveriönsözü dinleyip bekliyorkulak misafiri, boşuna uyanıkadres başkasının, uyuyorACKveriönsözün kalanı gönderilmedi
Düğümler aralıklarla kısa uyanıyor. Hedef ve komşu, radyolarını her uyanma aralığında bir kez kısa süre açıp kanala bakıyor; bir şey duymazlarsa yeniden uyuyor. İkisinin uyanma anları birbirinden bağımsız ve gönderen onları bilmiyor.
  1. Düğümler aralıklarla kısa uyanıyor. Hedef ve komşu, radyolarını her uyanma aralığında bir kez kısa süre açıp kanala bakıyor; bir şey duymazlarsa yeniden uyuyor. İkisinin uyanma anları birbirinden bağımsız ve gönderen onları bilmiyor.
  2. B-MAC: önsöz bütün aralığı kaplıyor. Hedef ne zaman uyanırsa uyansın onu yakalayabilmek için gönderen, bir uyanma aralığı boyunca kesintisiz önsöz gönderiyor. Veri ancak önsöz bitince gidiyor.
  3. B-MAC: uyanan herkes sona kadar bekliyor. Hedef önsözü duyunca uyanık kalıp veriyi bekliyor. Komşu da önsözü duyuyor ve paketin kime gittiği ancak verinin başlığında yazdığı için o da sonuna kadar uyanık kalıyor: kulak misafirliği.
  4. X-MAC: kısa ve adresli önsözler. Gönderen tek uzun önsöz yerine aralarında boşluk olan kısa önsözler gönderiyor; her birinde hedefin adresi var. Komşu uyandığında ilk tam önsözde adresin kendisine ait olmadığını görüp hemen uyuyor.
  5. X-MAC: erken onay, hemen veri. Hedef uyanınca bir sonraki önsözde adresini görüyor ve boşlukta erken onay gönderiyor. Gönderen önsözleri kesip veriyi hemen yolluyor. Önsözün kalanı hiç gönderilmiyor ve hedef de daha kısa süre uyanık kalıyor.

Contiki işletim sisteminin 2011’den beri varsayılanı olan ContikiMAC fikri bir adım daha ileri götürdü. Önsöz diye ayrı bir şey göndermiyor; veri frame’inin kendisini art arda yineliyor ve alıcı uyandığı anda doğrudan veriyi yakalıyor. İki numara daha ekledi. Uyanan düğüm kanalda bir enerji görür ama bir paket yakalayamazsa bunu gürültü sayıp hemen uyuyor. Gönderen de her komşunun uyanma zamanını öğreniyor ve bir sonraki paketi tam o andan az önce yollamaya başlıyor. Varsayılan ayarda düğümler saniyede 8 kez, yani 125 milisaniyede bir kanala bakıyor ve radyolar zamanın yaklaşık %99’unda kapalı kalıyor.

Tersini deneyen de oldu. 2008’deki RI-MAC’te gönderen susuyor, alıcı uyandığında “buradayım” diye kısa bir işaret yayıyor ve bekleyen gönderen ancak onu duyunca konuşuyor. Havayı uzun önsözler işgal etmediği için birçok gönderenin yarıştığı yoğun trafikte daha iyi davranıyor.

Uyanma aralığı neye göre seçilir?

Düşük güçlü dinlemenin tek ayarı uyanma aralığı ve doğru değeri trafik belirliyor. Bir örnek: her uyanış radyoyu açmak dahil 2 milisaniye sürsün ve düğüm dakikada bir paket göndersin. B-MAC gibi her paket için bir aralık boyunca konuşan bir gönderen düşünelim.

Uyanma aralığıBoşta dinleme payıGönderme payıToplam
100 ms%2,0%0,17%2,2
500 ms%0,4%0,83%1,2

Seyrek trafikte aralığı uzatmak kazandırıyor: dinleme payı düşüyor, gönderme payının artışı onu telafi etmiyor. Trafik yoğunlaştıkça denge tersine dönüyor, çünkü gönderme payı paket sayısıyla büyüyor. Aralığı uzatmanın gizli bir bedeli de gecikme: her sekmedeki bekleme aralıkla birlikte uzuyor.

Zaman bölmeli ve kanal atlamalı: TSCH

Sanayide başka bir şey isteniyor. Bir vana kontrol döngüsünün verisi hem kesin bir sürede gelmek hem de neredeyse hiç kaybolmamak zorunda. Rastgele bekleme ve önsözler bu garantiyi veremiyor. Cevap, 54. bölümdeki zaman bölmeli çoğullamanın ağ çapındaki hâli: TSCH (Time-Slotted Channel Hopping). 2012’de 802.15.4’e eklendi, 2015’te standardın ana metnine girdi.

Bütün ağ ortak bir saatle çalışıyor; düğümlerin saatlerini birbirine nasıl eşitlediğini 78. bölümde göreceksin. Zaman dilimlere bölünüyor; bir dilim, bir frame ile onun onayına yetecek kadar ve uygulamalarda tipik olarak 10 milisaniye. Dilimler tekrarlayan bir dilim çerçevesi oluşturuyor ve her bağlantıya bu çerçevede sabit bir yer ayrılıyor: hangi dilimde ve hangi kanal kaydırmasıyla konuşulacağı. Bir düğüm yalnızca kendi dilimlerinde uyanıyor, geri kalan her an uyuyor. Ayrılmış dilimde başka kimse konuşmadığı için çarpışma yok.

Adın ikinci yarısı en zekice kısım. Ağ, açıldığından beri geçen dilimleri sayıyor; bu sayıya mutlak dilim numarası (ASN) deniyor ve beş baytlık bir sayaç. Her iletimin kanalı şu formülle seçiliyor:

kanal = F[ (ASN + kanal kaydırması) mod kanal sayısı ]

Aynı bağlantı her tekrarında farklı bir frekansta konuşuyor. Bir kanaldaki Wi-Fi girişimi ya da 31. bölümde gördüğün çok yollu yayılımın yol açtığı sönümleme bir iletimi bozarsa, yeniden gönderim bambaşka bir frekansta yapılıyor ve aynı engele takılmıyor. Farklı kanal kaydırmaları sayesinde aynı dilimde birden çok bağlantı da aynı anda konuşabiliyor.

2007’de yayımlanan WirelessHART bu yaklaşımın sanayideki ilk büyük uygulamasıydı. IETF’in 6TiSCH çalışması da TSCH’nin üstüne IPv6’yı taşıyor. Zor soru, programı kimin yazacağı. Merkezi bir yönetici bütün ağın dilimlerini dağıtabiliyor; ya da her düğüm programını komşularının kimliklerinden kendisi türetebiliyor.

YaklaşımÖrneklerGücüZaafı
eşzamanlı uykuS-MAC, T-MACkulak misafirliğini keserprogram trafiğe uymaz, sekme başına bekleme
düşük güçlü dinlemeB-MAC, X-MAC, ContikiMACeşleştirme gerektirmez, basitgönderen öder, yoğun trafikte zorlanır
alıcı başlatmalıRI-MAChavayı meşgul etmezalıcının işaretleri de enerji yer
zaman bölmeliTSCH, WirelessHARTkesin gecikme, çarpışmasız, girişime dayanıklısaat eşitlemesi ve program gerekir
DerinleşmeWi-Fi da uyuyabiliyor mu?

Evet, ama farklı bir sözleşmeyle. 30. bölümdeki access point, bağlı cihazlardan birinin uyuduğunu biliyorsa ona gelen frame’leri tamponda tutuyor. Her işaret frame’inde bekleyen verisi olan cihazların listesini yayımlıyor. Telefon yalnızca işaret anlarında uyanıp bu listeye bakıyor; adını görürse veriyi istiyor. Wi-Fi 6 bunu bir adım ileri götürdü: cihaz ile access point, bir sonraki uyanma zamanını baştan pazarlık edebiliyor. Bu sayede uzun süre sessiz kalan bir cihaz, her işareti dinlemek zorunda kalmıyor.

Fark, iki dünyanın varsayımında. Wi-Fi’da hep uyanık, prize takılı bir access point var ve bütün yükü o taşıyor. Sensör ağında öyle bir merkez çoğu zaman yok; her düğüm hem uyuyan hem başkası için uyanık kalması gereken bir aktarıcı. Sensör ağı MAC’lerinin karmaşıklığı bu simetriden geliyor.

Özet

  • Enerjinin dört kaçağı: boşta dinleme, çarpışma, kulak misafirliği ve denetim yükü. Seyrek trafikte açık ara en büyüğü boşta dinleme.
  • 802.15.4 beklerken dinlemez: geri çekilme süresince radyo uyur, kanala yalnızca sonunda bakılır. İşaretli kipte süper çerçevenin etkin kısmı bitince herkes uyur.
  • Eşzamanlı uyku programı paylaşır: S-MAC herkesi aynı anda uyandırır, T-MAC trafik yoksa erken uyutur. İkisinin de bedeli sekme başına bekleme.
  • Düşük güçlü dinlemede gönderen seslenir: B-MAC uzun önsözle, X-MAC adresli kısa önsözler ve erken onayla, ContikiMAC verinin kendisini yineleyerek.
  • TSCH zamanı ve frekansı böler: her bağlantının dilimi belli, her yinelemede kanal değişiyor. Sanayi ağlarının kesin gecikme ve güvenilirliği buradan.

Komşunu uyandırmayı öğrendin. Ama veri tarladan binaya yirmi sekme ötede ve her düğüm yalnızca kendi komşularını tanıyor. Paketi hangi komşuya vereceğine düğüm neye bakarak karar veriyor? Ve bütün bu ağ, internete hangi dille bağlanıyor?

Bölüm 77: Sensör Ağlarında Yönlendirme ve IP

Komşunun seni ne kadar iyi duyduğuna bakarak. Bu bölümün ilk yarısı o bakışın nasıl bir yönlendirmeye dönüştüğünü, ikinci yarısı ise ağın internete hangi dille bağlandığını anlatıyor. İkinci sorunun cevabı kısa: internetin kendi diliyle, IPv6 ile.

42. bölümde OSPF gibi protokollerin her router’a bütün ağın haritasını dağıttığını görmüştün. On kilobayt RAM’li, zamanının %99’unu uykuda geçiren bir düğüm bütün haritayı tutamaz ve harita güncellemelerini dinlemek için uyanık da kalamaz. Sensör ağında yönlendirmenin başka ilkelere dayanması gerekiyor.

Önce kablolu ağda hiç düşünmediğin bir soru: iki komşu arasındaki bağlantı var mı, yok mu?

Bağlantı var ya da yok değil

Kabloda bir bağlantı ya çalışır ya çalışmaz. Kablosuz ağda ise iki düğüm arasındaki bağlantı bir olasılık. Paketlerin %95’ini taşıyan iyi bir bağlantı olabilir, %40’ını taşıyan kötü bir bağlantı da. Sekme sayısını en aza indiren bir yönlendirme, en uzaktaki ve en zayıf komşulara atlayarak bu yüzden kötü sonuç veriyor. İki sekme kısa görünür ama her paket defalarca yeniden gönderiliyorsa enerji ve zaman olarak üç iyi sekmeden pahalıya gelir.

2003’te önerilen ETX (expected transmission count) bu gözleme bir sayı verdi: bir paketin bir bağlantıdan başarıyla geçmesi için beklenen gönderim sayısı. İleri yöndeki teslim oranı d_i, geri yöndeki (onayların döndüğü yön) teslim oranı d_g ise:

ETX = 1 / (d_i × d_g)

Her iki yönde de kusursuz bir bağlantının ETX’i 1. İleri yönde paketlerin yarısını düşüren bir bağlantınınki 2. Bir yolun maliyeti, üstündeki bağlantıların ETX’lerinin toplamı. Sensör ağlarında sonradan gelen hemen her yönlendirme protokolü bu ölçüyü ya da bir türevini kullanıyor.

Veri merkezli ilk denemeler

En basit yöntem taşkın: her düğüm duyduğu her paketi bir kez daha yayar. Çalışır ama bedeli ağırdır. 1999’da SPIN’i tanıtan makale taşkının üç kusurunu adlandırdı: aynı paketin kopyalarının bir düğüme defalarca gelmesi, komşu düğümlerin aynı bölgeyi ölçtüğü için aynı veriyi göndermesi ve düğümlerin kendi enerjilerinden habersiz davranması. SPIN’in cevabı önce veriyi değil tanımını göndermek oldu. Düğüm “şu bölgenin şu saatteki sıcaklığı bende var” diye kısa bir duyuru yapıyor, isteyen komşu talep ediyor, veri yalnızca ona gidiyor.

2000’de yayımlanan yönlendirilmiş yayılım (directed diffusion) veri merkezli fikri en açık biçimde uyguladı. Sink ağa bir ilgi yayıyor: “şu bölgede hayvan hareketi görürsen saniyede bir bildir.” İlgi yayılırken her düğüm onu kimden duyduğunu not ediyor ve verinin geri akacağı yönleri, yani eğimleri, kuruyor. Veri bu eğimler boyunca sink’e doğru akıyor. Sink en iyi çalışan yolu “pekiştiriyor”, yani o yoldan daha sık veri istiyor; ötekiler kendiliğinden sönüyor. Hiçbir yerde düğüm adresi geçmiyor; yalnızca verinin özellikleri.

Kümeler ve dönen küme başı: LEACH

2000’de önerilen LEACH, 75. bölümdeki kümeli yapının en bilinen örneği. Zaman turlara bölünüyor. Her turun başında her düğüm, küme başı olup olmayacağına kendisi karar veriyor: 0 ile 1 arasında rastgele bir sayı çekiyor ve sayı bir eşiğin altındaysa o tur küme başı oluyor. Eşik, istenen küme başı oranı p ve tur numarası r ile:

T(n) = p / (1 − p × (r mod 1/p))     son 1/p turda küme başı olmamış düğümler için
T(n) = 0                              ötekiler için

Formülün zekâsı, eşiğin tur ilerledikçe büyümesinde. p = 0,05 ile her 20 tur bir dönem:

Dönemdeki turEşik
00,05
100,10
180,50
191,00

Dönemin sonunda eşik 1’e ulaşıyor. O döneme kadar hiç küme başı olmamış her düğüm son turda kesin olarak seçiliyor. Böylece küme başının pahalı işi düğümler arasında sırayla dönüyor ve hiçbir düğüm ötekilerden önce tükenmiyor.

Küme başı olan düğüm bunu duyuruyor; ötekiler sinyalini en güçlü duydukları küme başına katılıyor. Küme başı üyelerine birer zaman dilimi dağıtıyor. Her üye yalnızca kendi diliminde uyanıp ölçümünü veriyor. Küme başı ölçümleri birleştirip tek pakette doğrudan sink’e gönderiyor. Bu son adım LEACH’in sınırı: tek sekmede sink’e ulaşmak geniş bir alanda mümkün olmuyor ve sonraki türevler küme başları arasına çok sekme ekledi.

Konuma göre yönlendirme

Düğümler kendi konumlarını ve hedefin konumunu biliyorsa, bir yönlendirme tablosuna hiç gerek kalmayabilir. 2000’de yayımlanan GPSR’nin kuralı basit: paketi, hedefe coğrafi olarak en yakın komşuya ver. Buna açgözlü iletim deniyor ve tek bilinmesi gereken şey komşuların konumu.

Kuralın takıldığı yer, hedefe kendisinden daha yakın hiçbir komşusu olmayan bir düğüm. Örneğin arada bir göl ya da bir bina varsa. GPSR o noktada çevre kipine geçiyor: paket, engelin kenarı boyunca sağ el kuralıyla dolaştırılıyor. Labirentte eli duvardan ayırmadan yürümek gibi. Hedefe daha yakın bir düğüme varılınca açgözlü iletime dönülüyor. Kuralın doğru çalışması için bağlantı grafiğinin kesişen kenarları olmayan bir alt grafiğe indirgenmesi gerekiyor; yoksa sağ el kuralı döngüye girebilir. Düğümlerin konumlarını nereden bildiğini 78. bölümde göreceksin.

Toplama ağacı: CTP

Pratikte sensör ağlarının trafiği çok sade bir desene uyuyor: bütün düğümler sink’e doğru veri gönderiyor. Bu desene toplama deniyor ve en olgun cevabı bir ağaç. 2009’da yayımlanan CTP (Collection Tree Protocol) her düğüme sink’e giden yolun toplam ETX’ini en küçük yapan komşuyu ebeveyn seçtiriyor.

CTP’nin iki fikri sonradan yaygınlaştı. Birincisi, yönlendirme işaretlerinin sıklığını duruma göre ayarlamak: ağ sakinken işaretler seyrekleşiyor, bir tutarsızlık görülünce hemen sıklaşıyor. Aşağıdaki RPL’de aynı fikrin standartlaşmış hâlini göreceksin. İkincisi, veri paketlerini de yolun sağlamlığını denetlemek için kullanmak. Her veri paketi göndereninin sink’e olan maliyetini taşıyor. Bir düğüm, kendi maliyetinden düşük maliyet taşıyan bir paketi “çocuğundan” alırsa bir döngü oluştuğunu anlıyor ve onarımı başlatıyor.

Sonuçlar ikna ediciydi. 20 ile 310 düğüm arasında değişen, yedi farklı donanım ve altı farklı bağlantı katmanı içeren on iki deney ağının hepsinde CTP paketlerin %90’ından fazlasını teslim etti; birçok deneyde oran %99,9’du. Yönlendirme işaretleri eski yönteme göre %73 azaldı.

IP küçük cihaza iniyor: 6LoWPAN

Uzun süre sensör ağları kendi adresleme ve ağ katmanlarıyla kuruldu ve internete bir geçitte çevrilerek bağlandı. 2000’lerin ortasında IETF’te başka bir fikir güç kazandı: IP’yi düğümün kendisine kadar indirmek. Böylece bir sensöre, 71. bölümde yazdığın türden bir soketle uçtan uca konuşulabilecekti.

Önünde iki engel vardı. 38. bölümdeki IPv6, her bağlantının en az 1.280 baytlık paketleri taşıyabilmesini şart koşuyor. 75. bölümdeki 802.15.4 frame’i ise en fazla 127 bayt. Üstelik IPv6 başlığı 40, UDP başlığı 8 bayt; sıkıştırılmadan gönderilse küçük frame’in üçte biri daha veri taşımadan gidiyor.

2007’de yayımlanan 6LoWPAN (RFC 4944), 802.15.4 ile IPv6 arasına ince bir uyum katmanı koydu. 1.280 baytlık bir datagramı küçük frame’lere bölüp karşıda yeniden birleştiren bir parçalama başlığı getirdi. 2011’deki RFC 6282 ise asıl kazancı sağladı: başlıkları, iki tarafın zaten bildiği bilgiye dayanarak sıkıştırmak.

IPv6 başlığındaki alanNormaldeSıkıştırılmış hâlde
sürüm4 bitgönderilmiyor: her zaman 6
trafik sınıfı ve flow label28 bitçoğu zaman sıfır, gönderilmiyor
yük uzunluğu16 bitgönderilmiyor: frame’in boyundan çıkarılıyor
sonraki başlık8 bitUDP ise ayrıca sıkıştırılıyor
hop limit8 bityaygın değerlerden biriyse 2 bit
kaynak ve hedef adres2 × 128 bitlink-local önek ve MAC adresinden türeyen kısım gönderilmiyor

En iyi durumda 40 baytlık IPv6 başlığı 2 bayta iniyor. Adreslerin gönderilmemesi 23. bölümde gördüğün bir gerçeğe dayanıyor: arayüz kimliği MAC adresinden türetilmişse, alıcı onu zaten frame’in başlığında görüyor. UDP portları da sıkışabiliyor; 61616 ile 61631 arasındaki portlar dörder bitle yazılıyor.

RPL: kayıplı ağlar için yönlendirme

IP’li bir sensör ağının yönlendirme protokolü 2012’de yayımlanan RPL (RFC 6550). Adını yazan çalışma grubunun adı her şeyi anlatıyor: düşük güçlü ve kayıplı ağlar üzerinde yönlendirme.

RPL ağı, internete bağlanan sınır router’ında köklenen bir yapı olarak kuruyor. Bu yapı bir ağaçtan biraz fazlası: yönlü, döngüsüz ve kökü hedef alan bir çizge. Kısaltmasıyla DODAG. Her düğümün bir ebeveyn kümesi var ve bunlardan biri tercih edilen ebeveyn. Kuruluşu adım adım izlemek, kuralları tek tek okumaktan kolay:

Bir DODAG'ın kuruluşu ve onarımı
çizgideki sayı: bağlantının ETX'irank = ebeveynin rank'ı + 256 × ETXkökABCDrank 256DIODIO1,01,5rank 512rank 6401,01,0rank 7682,51,0rank 896koptuyeni rank 896
Kök DIO yayınlıyor. Sınır router'ı DODAG'ın kökü ve rank'ı 256. DIO mesajıyla kendini ve rank'ını komşularına duyuruyor. Bu örnekte bir düğümün rank'ı, ebeveyninin rank'ına 256 × ETX eklenerek hesaplanıyor.
  1. Kök DIO yayınlıyor. Sınır router'ı DODAG'ın kökü ve rank'ı 256. DIO mesajıyla kendini ve rank'ını komşularına duyuruyor. Bu örnekte bir düğümün rank'ı, ebeveyninin rank'ına 256 × ETX eklenerek hesaplanıyor.
  2. A ve B kökü ebeveyn seçiyor. A kökü kusursuz bir bağlantıyla duyuyor (ETX 1,0): rank'ı 256 + 256 = 512. B'nin bağlantısı biraz kayıplı (ETX 1,5): 256 + 384 = 640. İkisi de kökü ebeveyn seçiyor ve kendi DIO'larını yayınlamaya başlıyor.
  3. C, A'yı seçiyor. C hem A'yı hem B'yi duyuyor. A üzerinden rank'ı 512 + 256 = 768, B üzerinden 640 + 256 = 896 olurdu. C küçük olanı seçiyor; B yedek aday olarak kalıyor.
  4. D iki aday arasında seçiyor. D, A'yı zayıf (ETX 2,5), B'yi iyi (ETX 1,0) duyuyor. A üzerinden rank'ı 512 + 640 = 1.152, B üzerinden 640 + 256 = 896 olurdu. D, rank'ı daha büyük olan B'yi seçiyor: belirleyici olan ebeveynin rank'ı değil, yolun toplamı.
  5. Bağlantı kopuyor, C yeniden seçiyor. A ile C arasındaki bağlantı kopuyor. D aday olamaz: rank'ı 896, C'nin 768'inden küçük değil. C yedekteki B'ye geçiyor ve rank'ı 896 oluyor. Değişikliği gören düğümlerin Trickle aralığı en kısa değerine dönüyor; ağ birkaç saniye yoğun konuşup yatışıyor.

Kurulumun ortasında rank duruyor: bir düğümün köke uzaklığını anlatan bir sayı. Kökün rank’ı 256 ve köke uzaklaştıkça büyüyor. Rank’ın nasıl hesaplanacağını ağın seçtiği amaç fonksiyonu belirliyor. En basiti sekme sayısına bakıyor, yaygın olanı yukarıdaki ETX’e. Kuralın can alıcı kısmı şu: bir düğüm, rank’ı kendisininkinden küçük olmayan bir komşuyu ebeveyn seçemez. 42. bölümdeki uzaklık vektörü protokollerinin sayarak sonsuza gitme sorunu, iki düğümün birbirini yol olarak göstermesinden çıkıyordu. Rank kuralı bu döngüyü baştan yasaklıyor.

Kökten yayılan duyuru mesajının adı DIO. Asıl ustalık bu mesajların ne sıklıkla gönderildiğinde. RPL, 2011’de ayrıca standartlaşan Trickle zamanlayıcısını kullanıyor. Her düğümün bir aralığı var; aralık en kısa değerinden başlıyor, varsayılanda 8 milisaniye. Her aralıkta düğüm rastgele bir anda DIO göndermeye hazırlanıyor. Ama o aralıkta komşularından kendisininkiyle tutarlı yeterince DIO duymuşsa, varsayılanda 10 tane, göndermekten vazgeçiyor. Her aralığın sonunda aralık ikiye katlanıyor. Varsayılan ayarla 20 katlamadan sonra yaklaşık 2,3 saate ulaşıyor.

Sonuç iki uçlu bir davranış. Ağ sakinken DIO’lar saatte bir bile gönderilmiyor ve neredeyse hiç enerji harcanmıyor. Bir tutarsızlık görüldüğünde, örneğin bir düğüm ebeveynini kaybettiğinde, aralık hemen en kısa değerine dönüyor ve ağ birkaç saniye boyunca yoğun biçimde konuşup kendini onarıyor. Sessizlik ucuz, onarım hızlı.

DIO’lar yalnızca köke doğru giden yolu kuruyor. Kökten bir düğüme inmek, örneğin bir vanaya komut göndermek için ters yönde bilgi gerekiyor. Düğümler kendilerini DAO mesajıyla yukarıya bildiriyor. RPL burada iki kip sunuyor:

DerinleşmeTrickle neden bu kadar yaygınlaştı?

Trickle’ın çözdüğü problem sensör ağlarına özgü değil: bir ağdaki herkesin aynı bilgiye sahip olduğundan emin olmak, ama bunu yaparken susmayı bilmek. İlk kullanım alanı, sensör ağındaki bütün düğümlere yeni bir yazılım sürümü dağıtmaktı. Kimin eski sürümde kaldığını anlamak için herkesin sürekli “bende şu sürüm var” demesi gerekiyordu; bu da ağın enerjisini tüketiyordu.

Çözümün iki parçası birbirini tamamlıyor. Bastırma, yoğun bir bölgede aynı şeyi söyleyen on komşu varken on birincinin susmasını sağlıyor; yoğunluk ne olursa olsun bir bölgeden duyulan mesaj sayısı kabaca sabit kalıyor. Katlanan aralık da zamanda aynı işi görüyor: hiçbir şey değişmiyorsa konuşma üstel olarak seyrekleşiyor. Tutarsızlık görülünce her ikisi de sıfırlanıyor.

Bir ayrıntı daha dikkat çekici. Her aralıkta gönderim anı aralığın ikinci yarısından seçiliyor. Aralığın başında gönderen bir düğüm, henüz dinleme fırsatı bulamadığı komşularından habersiz konuşmuş olurdu. Önce dinle, sonra gerekiyorsa konuş.

Uygulama katmanı: CoAP ve MQTT

IP düğüme kadar indiyse, web de inebilir mi? HTTP bu küçük cihazlar için ağır: metin başlıkları uzun, altında bağlantı kuran ve durumu tutan bir TCP var. 2014’te yayımlanan CoAP (RFC 7252), HTTP’nin mimarisini koruyup yükünü attı. Aynı yöntemler var: GET, PUT, POST, DELETE. Aynı mantıkta yanıt kodları var: 2.05 “içerik”, 4.04 “bulunamadı”. Ama her şey ikili ve sıkıştırılmış, taşıma da UDP.

RFC’nin kendi örneği, bir sıcaklık sensörüne yapılan istek ve cevabı:

İstek (16 bayt):  40 01 7d 34 bb 74 65 6d 70 65 72 61 74 75 72 65
                  │  │  └─┬─┘ │  └─────── "temperature" ────────┘
                  │  │    │   └ seçenek: Uri-Path, 11 bayt
                  │  │    └ ileti kimliği 0x7d34
                  │  └ kod 0.01 = GET
                  └ sürüm 1, onaylı (CON), token yok

Cevap (11 bayt):  60 45 7d 34 ff 32 32 2e 33 20 43
                  │  │  └─┬─┘ │  └── "22.3 C" ───┘
                  │  │    │   └ yükün başladığını gösteren 0xFF
                  │  │    └ aynı ileti kimliği
                  │  └ kod 2.05 = içerik
                  └ sürüm 1, onay (ACK)

Başlığın sabit kısmı 4 bayt. Cevap, isteğin onayının içinde geldiği için ayrı bir gidiş-dönüş harcanmıyor. UDP’nin güvenilirlik vermediği yerde CoAP kendi basit mekanizmasını kuruyor: onaylı bir ileti, onayı gelmezse 2 ile 3 saniye arasında rastgele bir sürenin sonunda yeniden gönderiliyor, bekleme her denemede ikiye katlanıyor ve en fazla dört kez tekrarlanıyor. 71. bölümde UDP soketi için kendi yazdığın yeniden deneme döngüsünün standartlaşmış hâli. Bir de gözlem seçeneği var: istemci bir kaynağa bir kez abone oluyor ve sensör, değer değiştikçe cevabı kendisi gönderiyor. Varsayılan port 5683.

İkinci yaygın dil MQTT, başka bir soruya cevap veriyor. 1999’da IBM’de, uydu bağlantısı üzerinden petrol boru hattı sensörlerini izlemek için tasarlandı; 2014’te OASIS standardı oldu. İstek-yanıt değil yayın-abone modeli kullanıyor. Aradaki bir broker’a sensörler tarla/3/nem gibi başlıklarla veri yayımlıyor, ilgilenenler başlığa abone oluyor. Gönderen, verisini kimin okuduğunu bilmiyor. TCP üstünde çalışıyor ve teslim için üç seviye sunuyor: en fazla bir kez, en az bir kez, tam olarak bir kez. Bağlantısı beklenmedik biçimde kopan bir cihaz için önceden bırakılmış bir “vasiyet” mesajı da yayımlanabiliyor.

CoAPMQTT
modelistek-yanıt, isteğe bağlı gözlemyayın-abone, aracı broker
taşımaUDP (5683)TCP (1883, TLS ile 8883)
kim uyanık olmalısorulan sensörbroker; sensör yalnızca yayımlarken
güçlü olduğu yercihaza doğrudan erişim, web ile köprüçok sayıda üreticiden toplayıp dağıtmak

Özet

  • Kablosuz bağlantı bir olasılıktır: ETX, bir paketin geçmesi için beklenen gönderim sayısıdır. Yolun maliyeti sekme sayısı değil, ETX’lerin toplamıdır.
  • Veri merkezli yönlendirme adres değil ilgi taşır: SPIN önce tanımı, yönlendirilmiş yayılım ilgiyi yayar ve en iyi yolu pekiştirir.
  • LEACH küme başını döndürür: tur ilerledikçe büyüyen eşik, her düğümün dönem içinde bir kez küme başı olmasını sağlar.
  • 6LoWPAN IPv6’yı 127 baytlık frame’e sığdırır: parçalar ve sıkıştırır. En iyi durumda 40 baytlık başlık 2 bayta iner.
  • RPL köke yönelik bir DODAG kurar: rank kuralı döngüyü yasaklar, Trickle sessizliği ucuz ve onarımı hızlı yapar, DAO aşağı yönde yolu açar.
  • CoAP küçük cihazın HTTP’si, MQTT yayın-abone postanesi: ilki 4 baytlık başlıkla UDP üstünde, ikincisi bir broker üzerinden TCP’de.

Ölçüm köke vardı. Ama “22.3 C” tek başına neyi söylüyor? Bu sıcaklığın ne zaman ölçüldüğünü bilmiyorsan bir olayın hangi sırayla geliştiğini göremezsin. Nerede ölçüldüğünü bilmiyorsan yangının hangi köşede başladığını söyleyemezsin. Saatleri birbirinden kayan ve GPS’i olmayan düğümler, zamanı ve konumu nereden biliyor?

Bölüm 78: Zaman Eşitleme ve Konum Bulma

Birbirlerine sorarak ve birbirlerini ölçerek. İki problem aynı yerden besleniyor: ortada her düğümün danışabileceği mutlak bir kaynak yok. İnternetteki bir bilgisayar saatini bir zaman sunucusuna sorabilir, telefonun konumunu uydular verir. Tarladaki düğümün ise elinde yalnızca kendi kristali ve komşularından duyduğu mesajlar var.

Önce zaman. İki düğümün saati neden aynı kalmıyor?

Saatler neden kayar?

Bir düğümün saati, bir kristalin titreşimini sayan bir sayaç. Kristaller tam etiketlerindeki frekansta titreşmiyor. 52. bölümde Ethernet’in kristaller için milyonda 100’e kadar sapmaya izin verdiğini görmüştün. Ucuz sensör düğümlerinde de milyonda birkaç düzinelik sapmalar olağan.

Milyonda 50’lik sapma küçük görünüyor. Hesabı yapınca öyle değil:

Geçen süreBirikmiş hata
1 saniye50 mikrosaniye
1 dakika3 milisaniye
1 saat180 milisaniye
1 gün4,3 saniye

İki düğümden biri milyonda 50 hızlı, öteki 50 yavaşsa aralarındaki fark bunun iki katı hızla açılıyor. Kristalin frekansı sıcaklıkla da oynuyor; gündüz güneş alan bir düğüm ile gölgedeki komşusu farklı hızlarda yaşlanıyor.

Zamanın neden bu kadar önemli olduğu da birkaç yerden geliyor. Bir aracın geçişini üç düğüm algıladıysa, aracın hızı ve yönü bu algılamaların sırasından ve aralarındaki sürelerden çıkıyor. 76. bölümdeki TSCH, düğümlerin aynı 10 milisaniyelik dilimde uyanmasına dayanıyor; saatler dilim içindeki pay kadar kayarsa iki düğüm birbirini hiç duymuyor. Aşağıda göreceğin bazı konum yöntemleri ise mikrosaniyelik hassasiyet istiyor.

Bir mesaj ne kadar sürede gider?

Zamanı eşitlemenin tek yolu mesaj göndermek. “Saat şu an 12:00:00,000” diyen bir mesaj alıcıya ulaştığında artık 12:00:00,000 değil. Aradaki gecikmenin parçaları sensör ağlarında ayrıntıyla incelendi:

ParçaNe oluyorBüyüklük ve belirsizlik
hazırlamaişletim sistemi mesajı kuruyor, radyoya veriyormilisaniyeler, çok değişken
erişim76. bölümdeki rastgele bekleme ve kanal dinlememilisaniyeler, rastgele
iletimbitlerin havaya çıkması127 bayt 250 kbit/s’de 4 ms’yi aşar, sabit
yayılımsinyalin yolculuğu100 metrede üçte bir mikrosaniye, ihmal edilebilir
alım ve işlemealıcı frame’i alıp yükseltiyormilisaniyeler, değişken

2. bölümdeki tabloda yayılım, iletimden dört yüz kat büyüktü. Burada tablo tersine dönüyor: iletim, yayılımdan on iki bin kat uzun. Asıl ders ise son sütunda. Belirsizliğin neredeyse tamamı iki uçta, yazılımın ve erişim kuralının içinde. Bu yüzden hassas eşitleme protokollerinin ortak hilesi, zaman damgasını yazılımda değil, radyonun frame’in başlangıç işaretini gönderdiği ya da aldığı anda basmak. Böylece hazırlama ve erişim süreleri hesaptan tamamen çıkıyor.

İki yönlü zaman alışverişi

İnternetteki zaman protokolü NTP ile aynı fikir. A düğümü B’ye bir mesaj gönderiyor ve iki uç dört an kaydediyor: A’nın gönderdiği an T1 ve B’nin aldığı an T2, B’nin cevabı gönderdiği an T3 ve A’nın aldığı an T4. T1 ile T4 A’nın saatine, T2 ile T3 B’nin saatine göre. Gidiş ile dönüşün aynı sürdüğünü varsayınca:

saat farkı  = ( (T2 − T1) − (T4 − T3) ) / 2
tek yön     = ( (T4 − T1) − (T3 − T2) ) / 2

Bir örnek. B’nin saati A’nınkinden 0,5 milisaniye ileride, mesaj 40 mikrosaniyede gidiyor, B cevabını 10 mikrosaniye sonra gönderiyor. Milisaniye cinsinden:

T1 = 1000,000   (A)       T2 = 1000,540   (B)
T3 = 1000,550   (B)       T4 = 1000,090   (A)

saat farkı = ( 0,540 − (−0,460) ) / 2 = 0,500 ms
tek yön    = ( 0,090 − 0,010 ) / 2    = 0,040 ms

Formül her iki sayıyı da doğru buluyor. Varsayımın bozulduğu yer, gidiş ile dönüşün farklı sürdüğü durum; o farkın yarısı doğrudan hataya ekleniyor.

2003’te yayımlanan TPSN bu alışverişi bütün ağa yaydı. Önce kökten başlayarak her düğüme bir seviye veriliyor. Sonra her düğüm, bir üst seviyedeki komşusuyla iki yönlü alışveriş yapıp ona eşitleniyor. Zaman damgaları radyo katmanında basıldığı için komşu iki düğüm arasındaki ortalama hata 16,9 mikrosaniyede kaldı. Aynı donanımda denenen ve birazdan göreceğin RBS’nin hatası 29,13 mikrosaniyeydi; iki yönlü alışveriş onu yaklaşık iki kat geçti.

Göndereni denklemden çıkarmak: RBS

2002’de yayımlanan RBS (Reference Broadcast Synchronization) soruyu bambaşka bir yerden yakaladı. Bir düğüm bir başvuru mesajı yayınlıyor. Mesajın içinde hiçbir zaman bilgisi yok. Onu duyan alıcılar, mesajın geldiği anı kendi saatleriyle not ediyor. Sonra alıcılar bu notları kendi aralarında değiş tokuş ediyor.

Hilenin inceliği şurada. Başvuru mesajının hazırlanması, erişim için beklemesi ve iletimi bütün alıcılar için ortak; hepsi aynı mesajı aynı anda duyuyor. Alıcıların notları arasındaki fark bu yüzden gönderenin belirsizliğini hiç içermiyor, yalnızca alıcıların saat farkını gösteriyor. Belirsizliğin iki ucundan biri böylece tamamen ortadan kalkıyor.

Berkeley düğümlerinde hata dağılımının standart sapması 11,1 mikrosaniye çıktı. Linux çalıştıran el bilgisayarlarında 6,3 mikrosaniyeye indi; aynı donanımda NTP’den sekiz kat iyiydi. Başvuru mesajı birkaç kez tekrarlanırsa alıcılar yalnızca saat farkını değil, farkın değişim hızını da hesaplayabiliyor.

Taşkın ve eğim: FTSP

2004’te yayımlanan FTSP iki fikri birleştirerek bu alanın en çok kullanılan protokollerinden biri oldu.

Bir kök düğüm düzenli aralıklarla eşitleme mesajı yayıyor ve bu mesaj ağ boyunca taşkınla yayılıyor. Her mesaj, göndereninin “küresel zaman” tahminini taşıyor ve bu damga radyo katmanında, frame’in başlangıç işaretinin havaya çıktığı anda yazılıyor. Alıcı da damgayı aynı işaretin geldiği anda alıyor. Belirsizliğin iki ucunun ikisi de hesaptan çıkıyor.

İkinci fikir, eğimi öğrenmek. Alıcı son birkaç eşitleme noktasını tutup bunlara bir doğru uyduruyor. Doğrunun kesişimi saat farkını, eğimi ise saatin ne kadar hızlı ya da yavaş çalıştığını veriyor. Aradaki önemi bir hesap gösteriyor. Eşitleme mesajları 30 saniyede bir geliyorsa, milyonda 50 sapan bir saat iki mesaj arasında 1,5 milisaniye kayar. Eğim bilinirse bu kayma hesaplanıp düzeltiliyor ve hata mikrosaniyeler düzeyinde kalıyor.

Sonuçlar Mica2 düğümlerinde ölçüldü. On sekiz saat süren bir deneyde tek sekmedeki ortalama mutlak hata 1,48 mikrosaniye, en büyüğü 6,48 mikrosaniyeydi. Çok sekmeli ağda hata her sekmede yaklaşık 0,5 mikrosaniye büyüdü.

DerinleşmeGPS aslında bir saat mi?

Bir GPS alıcısı konumunu bulmak için dört bilinmeyenli bir denklem çözüyor: üç koordinat ve kendi saatinin hatası. Uyduların saatleri atom saatleri ve alıcı her uydunun sinyalinin ne zaman yola çıktığını biliyor. Varış zamanlarından mesafeler, mesafelerden konum çıkıyor. Ama alıcının kendi ucuz saati de bir bilinmeyen olduğu için en az dört uyduya ihtiyaç var.

Denklemin yan ürünü olağanüstü bir saat. Konumunu bulan her GPS alıcısı, saatinin gerçek zamandan ne kadar saptığını da bulmuş oluyor. Bu yüzden 33. bölümdeki birçok baz istasyonu zamanını GPS’ten alıyor. Bu zamanı bir binanın içinde makineden makineye taşımak için IEEE 1588, yani PTP kullanılıyor. PTP de iki yönlü alışveriş yapıyor ve zaman damgalarını ağ kartının donanımında bastığı için mikrosaniyenin altına inebiliyor.

O hâlde sensör düğümlerine neden GPS takılmıyor? Pahalı, kapalı alanda ve ağaç örtüsü altında çalışmıyor ve en önemlisi enerji yiyor. 80. bölümde göreceğin, zebraların boynuna takılan düğümlerde enerjiyi radyodan çok GPS tüketiyordu.

Konum: uzaklıktan yere

Bir düğüm, konumu bilinen birkaç çapa düğüme olan uzaklığını ölçebiliyorsa kendi yerini hesaplayabilir. Uzaklığı ölçmenin üç yolu var ve her biri başka bir fiziğe dayanıyor.

Sinyal gücü. Gelen sinyalin gücü mesafeyle düşüyor ve her radyo bu gücü zaten ölçüp RSSI olarak bildiriyor. 34. bölümdeki serbest uzay formülünde mesafe terimi 20·log₁₀(d) idi, yani mesafe iki katına çıkınca kayıp 6 dB artıyordu. Yere yakın ve engellerin arasında bu terimin katsayısı 30 ile 40’a çıkıyor. Formül ters çevrilince uzaklık çıkıyor. 1 metrede −45 dBm ölçülen bir verici, katsayı 30 alınırsa −75 dBm’lik bir sinyal için 10 metre uzakta hesaplanıyor. Sorun şu: çok yollu yayılım yüzünden ölçüm birkaç desibel oynamakta çok rahat. Aynı sinyal −78 dBm ölçülürse hesap 12,6 metre veriyor. Yalnızca 3 dB’lik bir oynama %26’lık bir uzaklık hatası. Sinyal gücü bedava ama kaba.

Varış zamanı. Sinyalin yolda geçirdiği süre ölçülürse mesafe hız çarpı süre. Radyo dalgası için bu nanosaniye hassasiyetli saat istiyor. 2000’de MIT’de geliştirilen Cricket zekice bir yol buldu: işaretçiler bir radyo mesajı ile bir ultrason sinyalini aynı anda gönderiyor. Radyo mesajı neredeyse anında geliyor, ses ise saniyede yaklaşık 343 metreyle yavaş yavaş. İkisi arasındaki 10 milisaniyelik fark 3,4 metre demek ve bunu ölçmek için sıradan bir saat yetiyor. Tasarımın bir de gizlilik yönü vardı: konumu merkezde bir sunucu değil, cihazın kendisi hesaplıyordu. Bugün aynı ölçümü radyo dalgasıyla doğrudan yapan ultra geniş bant radyolar var. Işık bir nanosaniyede 30 santimetre yol alıyor. Bu radyolar çok kısa darbeler gönderdiği için varış anını nanosaniye düzeyinde yakalayabiliyor ve uzaklığı on santimetreler düzeyinde buluyor; eşya bulucu etiketlerdeki ve bazı telefonlardaki hassas yön bulma bu teknolojiyle.

Geliş açısı. Birden çok antenden oluşan bir dizi, sinyalin hangi yönden geldiğini antenler arasındaki faz farkından çıkarabiliyor. İki çapadan gelen iki yön, bir konum demek. Bluetooth 5.1 bu yetenek için bir standart getirdi.

Uzaklıklar elde edildikten sonrası geometri. İki boyutta üç çapaya olan uzaklık, üç çember demek ve çemberler düğümün yerinde kesişiyor. Çapalar (0, 0), (10, 0) ve (0, 10) noktalarında, ölçülen uzaklıklar 5, √65 ve √45 olsun:

x² + y²          = 25
(x − 10)² + y²   = 65
x² + (y − 10)²   = 45

ikinciden birinciyi çıkar:   −20x + 100 = 40   →   x = 3
üçüncüden birinciyi çıkar:   −20y + 100 = 20   →   y = 4

Uzaklıklardan konuma giden bu hesabın adı trilaterasyon. Denklemleri birbirinden çıkarmak kareleri yok ediyor ve geriye doğrusal denklemler kalıyor. Ölçümler gürültülü olduğunda çemberler tek noktada kesişmiyor; o zaman daha fazla çapa kullanılıyor ve hataların karesini en küçük yapan nokta seçiliyor.

Uzaklık ölçmeden konum

Uzaklık ölçmek pahalı ya da güvenilmez olabilir. Menzilden bağımsız yöntemler yalnızca “kimi duyuyorum” bilgisini kullanıyor.

Merkez yöntemi. Düğüm, duyabildiği çapaların konumlarının ortalamasını kendi konumu sayıyor. Başka hiçbir ölçüm gerektirmiyor; doğruluğu çapaların sıklığına bağlı.

DV-Hop. 2001’de önerilen bu yöntem, 42. bölümdeki uzaklık vektörü fikrini konuma uyguluyor. Her çapa ağa kendi konumunu yayıyor ve her düğüm her çapaya kaç sekme uzakta olduğunu öğreniyor. Çapalar birbirlerinin konumunu bildiği için ortalama bir sekmenin kaç metre tuttuğunu hesaplayabiliyor. 60 metre aralıklı iki çapa arasında 4 sekme varsa bir sekme 15 metre. Bu sayı ağa duyuruluyor ve A çapasından 3 sekme uzaktaki bir düğüm kendini ona 45 metre uzakta sayıyor. Birkaç çapaya olan bu tahmini uzaklıklardan konum, yukarıdaki gibi hesaplanıyor.

Yöntemin zaafı, düğümlerin düzgün dağılmış olduğu varsayımı. Arada bir göl varsa sekmeler gölün kıyısından dolaşıyor, sekme sayısı gerçek mesafeden hızla uzaklaşıyor ve tahmin bozuluyor.

Konuma dayanan her şey bir saldırı yüzeyi de açıyor. Sahte konum yayan bir çapa bütün komşularını yanıltabiliyor. Daha incelikli olanı solucan deliği: saldırgan ağın iki uzak noktası arasına hızlı bir tünel kurup paketleri bir uçtan ötekine aktarıyor. Birbirinden kilometrelerce uzak iki düğüm kendini komşu sanıyor; hem sekme sayıları hem yönlendirme tabloları bozuluyor.

Özet

  • Saat kayması birikir: milyonda 50’lik sapma dakikada 3, günde 4,3 saniye eder. Sıcaklık da kristalin hızını değiştirir.
  • Belirsizlik uçlardadır: hazırlama ve erişim süreleri milisaniyeler oynar, yayılım ihmal edilebilir. Hassas protokoller zaman damgasını radyo katmanında basar.
  • İki yönlü alışveriş saat farkını ve gecikmeyi birlikte bulur: dört zaman damgası, gidiş ile dönüşün eşit sürdüğü varsayımıyla.
  • RBS göndereni, FTSP her iki ucu denklemden çıkarır: FTSP ayrıca saatin eğimini öğrenerek tek sekmede 1,5 mikrosaniye civarında kalır.
  • Konum uzaklıktan ya da bağlantıdan çıkar: sinyal gücü ucuz ama kaba, varış zamanı ve ultra geniş bant hassas; merkez yöntemi ve DV-Hop ölçüm gerektirmez ama düzgün dağılım ister.

Artık düğümler bir ölçümün ne zaman ve nerede alındığını biliyor. Bütün bu protokoller sahaya çıktığında ne oldu? Gerçek bir adada, bir ağacın gövdesinde, bir yanardağın eteğinde bu ağlar neyi ölçtü ve sahada ne bozuldu?

Bölüm 79: Sensör Ağı Uygulamaları

Laboratuvarda görülemeyecek şeyleri ölçtüler. Bozuldukları yerler de laboratuvarda görülemeyecek türdendi. Bu bölüm beş saha çalışmasıyla başlıyor; her biri bir bilim sorusuna cevap aradı ve ağ tasarımına bir ders bıraktı. Ardından bugünün uzun menzilli seçeneklerini tartacağız ve bu ağlara özgü saldırılarla bitireceğiz.

Bir adada kuş yuvaları

2002 yazında Berkeley’den bir ekip, Maine kıyısının yaklaşık 15 mil açığındaki Great Duck Island’a sensör düğümleri taşıdı. Soru biyologlarındı. Yuvasını toprağın altına kazan küçük bir deniz kuşu olan fırtına kırlangıcı yuvasında ne zaman kalıyor, yuvanın içinde sıcaklık ve nem nasıl değişiyor? Böyle koloniler insan ziyaretine çok duyarlı. Makalenin aktardığı bir gözleme göre bir karabatak kolonisine yapılan 15 dakikalık bir ziyaret, yuvalarda %20’ye varan kayba yol açabiliyordu. Gözlemci yaklaştıkça ölçtüğü şeyi bozuyordu.

Ağ kademeli kuruldu. Yuvaların yoğun olduğu bölgelere serpilen düğümler ölçümlerini bir ağ geçidine, ağ geçidi adadaki baz istasyonuna aktardı. Oradan veri, araştırma istasyonundaki bir dizüstü bilgisayara, oradan da uydu bağlantısıyla Kaliforniya’daki laboratuvara gitti. Tasarımın açık bir şartı vardı: baz istasyonu internetle bağlantısı koptuğunda da çalışmaya devam etmeli, veriyi saklayıp bağlantı dönünce göndermeliydi. Zincirdeki her halka ayrı ayrı kopabiliyordu ve her halka elindekini saklayarak bir sonrakini bekliyordu.

2003’te ağ büyüdü: 50 düğümlük tek sekmeli ağın yanına 100 düğümlük çok sekmeli bir ağ eklendi ve ikinci kuşak 150 düğüme ulaştı. Sensörlerin söylediğini doğrulamak için yuvalara bakan kızılötesi kameralardan oluşan ayrı bir ağ da kuruldu. Bir sensör ağının ölçtüğünün doğru olup olmadığını bilmenin tek yolu, onu başka bir yolla ölçmekti.

Bir ağacın gövdesinde

Kaliforniya’da 70 metre boyunda bir kıyı sekoyasının gövdesine, iki metrede bir olmak üzere 33 düğüm yerleştirildi. Her düğüm beş dakikada bir hava sıcaklığını, bağıl nemi ve bitkinin fotosentezde kullanabildiği ışığı ölçtü. Ağ 44 gün çalıştı ve 820.700 veri noktası topladı. Araştırmacılar buna makroskop dediler: bir ağacın çevresindeki iklimi hem zamanda hem mekânda sık aralıklarla gösteren bir alet.

Ölçümler, tek bir istasyonun asla göremeyeceği şeyler gösterdi. Aynı anda ağacın farklı yüksekliklerindeki bağıl nem arasında 40 puana varan fark vardı. Nem ölçümlerinin dağılımında %100’de ikinci bir tepe çıktı; Kaliforniya kıyısında yaz başında sık görülen sis, dağılımda kendi imzasını bırakmıştı.

Ağ tarafının haberi daha az parlaktı: toplam verim %49’du. Beklenen ölçümlerin yarısından fazlası hiç gelmedi ve arızalar pillerin tükenmesiyle ilişkiliydi. Bilim sorusunun cevabı yine de çıktı, ama 75. bölümdeki pil hesabının sahada kâğıttaki kadar temiz işlemediğini hatırlattı.

Bir yanardağın eteğinde

Ekvador’daki etkin Reventador yanardağının eteğine 16 düğüm kuruldu ve 19 gün çalıştı. Her düğüm sismik ve akustik sinyali saniyede 100 kez örnekledi. Yanardağ sismolojisinin sorusu belli: bir sarsıntının dalga biçimi eksiksiz ve farklı noktalardaki kayıtlar birbirine göre doğru zamanlanmış olmalı.

Sürekli örneklenen verinin tamamını çok sekmeli bir 802.15.4 ağından geçirmek mümkün değildi. Çözüm, 75. bölümdeki olayla tetiklenen teslimdi. Düğümler örnekleri kendi belleklerinde tutuyor, üzerlerinde basit bir olay sezme algoritması çalıştırıyordu. Yeterince düğüm aynı anda ilginç bir sarsıntı gördüğünde baz istasyonu o zaman aralığının verisini düğümlerden güvenilir bir aktarımla indiriyordu. Ağ 19 günde 229 deprem, patlama ve benzeri olay yakaladı. Zamanlama için 78. bölümdeki FTSP ve bir GPS alıcısı kullanıldı.

Çalışmanın başlığı dersini de özetliyor: sadakat ve verim. Ağ araştırmacısının alışık olduğu ölçüt, iletilen paketlerin oranı. Sismoloğun ölçütü ise başka: olayın dalga biçimi eksiksiz mi, zaman damgaları doğru mu? Baz istasyonunun elektrik kesintileri ve üç gün süren bir yazılım hatası dışarıda bırakılınca düğümler zamanın %96’sından fazlasında ayaktaydı. Ağ sağlıklı görünüyordu; asıl soru, bu sağlığın bilime ne kadarının yansıdığıydı.

Bir köprünün üstünde

2006’nın Temmuz ile Ekim ayları arasında Golden Gate Köprüsü’nün 1.280 metrelik ana açıklığına ve güney kulesine 64 düğüm yerleştirildi. Amaç, köprünün rüzgâr ve trafik gibi kaynaklardan gelen ortam titreşimlerini ölçmekti. Bu kez ölçüm çok daha hızlıydı: düğümler saniyede 1.000 örnek alıyor ve örnekleme anları birbirinden 10 mikrosaniyeden az sapıyordu.

Bu ağın asıl ilginç yanı şekliydi. Düğümler köprü boyunca tek bir çizgi üzerindeydi ve en uzaktaki düğümün verisi baz istasyonuna 46 sekmede ulaşıyordu. Zincir biçimli bir ağda bir düğüm konuşurken bir sonraki onu dinlemek zorunda, iki sonraki ise konuşursa bir sonrakinin alışını bozar; 30. bölümdeki gizli terminal sorununun zincirdeki hâli bu. Aynı anda ancak birbirinden birkaç düğüm uzaktaki düğümler konuşabilir.

Straw adlı aktarım protokolü bunu bir boru hattına çevirdi. Kaynak paketleri, girişimi önleyecek kadar aralıklı gönderiyordu; dördüncü sekmeden sonra zincirin farklı yerlerinde aynı anda birden çok paket ilerlemeye başladı. Paket aralığı sabit kaldığı için bant genişliği dördüncü sekmeden kırk dördüncüye kadar neredeyse hiç düşmedi. 46. sekmedeki düğüm için bu değer saniyede 441 bayttı. Az görünüyor, ama zincir uzadıkça sıfıra gitmek yerine sabit kalan bir sayı. Çok sekmeli bir ağda sekme sayısıyla bant genişliği arasındaki bağı tasarım belirliyor.

Tarlada: Murphy’nin patatesleri

Hollanda’da Delft Teknik Üniversitesi’nden bir ekip, bir patates tarlasına yaklaşık 100 düğüm kurdu. Amaç tarladaki nem ve sıcaklığı izleyerek hassas tarıma veri sağlamaktı. 2006’da yayımlanan makalenin başlığı, işlerin nasıl gittiğini kendisi anlatıyor: Murphy patatesleri sever. Ters gidebilecek her şey ters gitti.

Makalenin kendi değerlendirmesi dürüst: pilot, başlangıçtaki araştırma sorularını cevaplayamadı. Onun yerine, çalışmalarını yalnızca benzetimle değerlendiren araştırmacıların genellikle gözden kaçırdığı mühendislik sorunlarını ortaya çıkardı. Beş saha çalışmasının belki de en öğretici cümlesi bu.

DerinleşmeSahada verim neden hep düşük çıkıyor?

Beş çalışmayı yan yana koyunca bir örüntü görünüyor. Benzetimde bir düğüm ya çalışır ya bozulur; sahada ise çoğu zaman yarı yarıya çalışır. Bağlantıların kalitesi gün içinde değişir, pil azaldıkça düğümün davranışı değişir, bir düğüm yeniden başlar ve saatini kaybeder. Bunların hiçbiri tek başına ağı çökertmez; birlikte verimi yavaşça aşındırır.

İkinci ders, ağın en zayıf halkasının çoğu zaman ağın kendisi olmaması. Reventador’da kesintilerin büyük kısmı baz istasyonunun elektriğinden geldi. Great Duck Island’ın mimarisi her kademede veriyi saklayacak biçimde kuruldu, çünkü uydu bağlantısı da kopabiliyordu.

Üçüncüsü, doğrulama. Kızılötesi kameralar, sekoyadaki yoğun ölçüm, yanardağdaki olay karşılaştırmaları: hepsi sensörün söylediğini başka bir yoldan kontrol etme çabası. Bir ağ sessizse, bunun sebebinin “ölçülecek bir şey olmaması” mı yoksa “ölçenin bozulması” mı olduğunu ağın içinden anlamak zor.

Fabrikada: kesin zamanlama

Fabrika ortamının istekleri tarladakinden farklı. Bir süreç kontrol döngüsünde ölçüm belli bir süre içinde gelmek zorunda; geç gelen ölçüm gelmeyen ölçümden farksız. Metal borular, dönen makineler ve yansımalar ise 31. bölümdeki çok yollu yayılımı en ağır hâliyle yaşatıyor.

Bu yüzden sanayi, 76. bölümdeki zaman bölmeli ve kanal atlamalı yaklaşımı seçti. Eylül 2007’de HART 7 sürümüyle yayımlanan WirelessHART, 2010’da IEC 62591 adıyla uluslararası standart oldu. ISA100.11a 2009’da yayımlandı ve 2014’te IEC 62734 oldu. İkisinin de temel vaadi aynı: her bağlantıya önceden ayrılmış bir zaman dilimi, dilimden dilime değişen bir kanal ve dolayısıyla öngörülebilir bir gecikme.

Çok uzağa, çok az: geniş alan seçenekleri

75. bölümde bir soruyu bu bölüme bırakmıştık: çok sekmeli bir ağ kurmak yerine her düğüm doğrudan kilometrelerce uzaktaki bir toplayıcıya konuşsa? Düşük güçlü geniş alan ağlarının üç büyük temsilcisi bu soruya üç farklı cevap veriyor.

LoRaWAN. Semtech 2012’de LoRa radyosunu geliştiren Fransız Cycleo şirketini satın aldı; LoRaWAN’ın ilk sürümü Haziran 2015’te yayımlandı. Radyonun anahtarı yayılma faktörü: bir biti daha uzun bir sinyale yayarak alıcının onu gürültünün altından bile çıkarabilmesini sağlıyor. Bedeli havada kalma süresi. 12 baytlık bir ölçüm, LoRaWAN başlıklarıyla 25 bayt ediyor. Semtech’in yayımladığı formülle hesaplanınca:

Yayılma faktörüHavada kalma%1 görev döngüsünde saatte en fazla
SF761,7 ms583 mesaj
SF9205,8 ms174 mesaj
SF10411,6 ms87 mesaj
SF121.482,8 ms24 mesaj

Her adım süreyi kabaca ikiye katlıyor; SF12, SF7’nin yaklaşık 24 katı. Avrupa’da 868 MHz bandında bir cihaz alt banda göre zamanın %0,1 ile %10’u kadar gönderebiliyor ve sensörlerin kullandığı alt bantta sınır tipik olarak %1. SF12’de 1,5 saniyelik bir gönderimden sonra yaklaşık iki buçuk dakika susmak gerekiyor.

ABD’de görev döngüsü sınırı yok ama her gönderim bir kanalda en fazla 400 milisaniye sürebiliyor. Tablonun SF10 satırı bu sınırın hemen üstünde: 12 baytlık ölçüm 411,6 ms sürüyor, 11 bayt ise 370,7 ms’ye sığıyor. Bu yüzden ABD’de LoRaWAN cihazları yukarı yönde SF11 ve SF12’yi hiç kullanmıyor ve en yavaş hızda gönderilebilecek uygulama verisi 11 baytla sınırlı. Bir yönetmelik maddesi, bir protokolün en büyük paket boyunu belirlemiş oluyor.

NB-IoT. 3GPP, Haziran 2016’da dondurulan 13. sürümünde hücresel ağa dar bantlı bir kip ekledi. NB-IoT tek bir 180 kHz’lik blok kullanıyor ve bu blok bir LTE taşıyıcısının içine, koruma bandına ya da tek başına yerleştirilebiliyor. Kapsamayı belirleyen sayı, cihazla baz istasyonu arasında göze alınabilecek en büyük kayıp: 164 dB, yani GPRS’ten 20 dB, güç olarak 100 kat fazla. Hedef, bodrum katındaki bir su sayacına ulaşmak. Pili korumak için cihaz, ağa kaydını bozmadan uzun süre ulaşılamaz olmayı (PSM) ya da çağrıları çok seyrek dinlemeyi (eDRX) seçebiliyor; eDRX’te boşta iki dinleme arası 43,69 dakikaya kadar uzuyor. Tasarım hedefi, günde 200 bayt gönderen bir cihazın 5 watt-saatlik bir pille 10 yıldan fazla çalışması. Hesap yapınca bu, ortalama 57 mikrowatt’lık bir tüketim demek.

Sigfox. Ters yönden gitti: sinyali yaymak yerine son derece dar bir kanala sıkıştırdı. Her mesaj yalnızca 100 Hz genişliğinde bir kanalda, saniyede 100 bitle gönderiliyor. 53. bölümde termal gürültünün hertz başına −174 dBm olduğunu ve bant genişliğiyle büyüdüğünü görmüştün. 100 Hz’lik bir kanala giren gürültü, 125 kHz’lik bir LoRa kanalına girenden 31 dB az. LoRa gürültünün altından okumayı öğreniyor, Sigfox gürültünün kendisini küçültüyor. Bedeli katı sınırlar: günde en fazla 140 yukarı ve 4 aşağı mesaj; yukarı mesaj 12, aşağı mesaj 8 bayt. Güvenilirlik için her mesaj üç kez, farklı frekanslarda gönderiliyor.

Sigfox’un hikâyesinin bir de iş tarafı var. Ağı tek bir şirket işletiyordu ve hedef bir milyar cihazdı. Ocak 2022’de şirket mahkeme koruması altına girdiğinde ağda yaklaşık 17 milyon cihaz vardı; Nisan 2022’de Toulouse’daki mahkeme şirketi Singapurlu UnaBiz’e devretti. On yıl çalışacak diye tasarlanan bir sayaç için ağın kendisinin on yıl yaşayıp yaşamayacağı da bir tasarım sorusu.

LoRaWANNB-IoTSigfox
Spektrumlisanssızlisanslı, operatörünlisanssız
Ağı kim kurarherkes kendi ağ geçidini kurabilirmobil operatörtek işletmeci
Gönderim sınırıbölgesel kural (görev döngüsü, süre)abonelikgünde 140 × 12 bayt
Aşağı yönkısıtlıvargünde 4 × 8 bayt
Pil stratejisigönderimden sonra yalnızca kısa bir dinlemePSM ve eDRXçok kısa mesaj

Seçim çoğu zaman teknik tablodan önce sahada yapılıyor. Kapsama olmayan bir tarlada kendi ağ geçidini kurabilmek LoRaWAN’ı öne çıkarıyor. Bodrumdaki sayaç için 164 dB’lik kapsama ve operatörün hazır altyapısı NB-IoT’yi. Fabrikanın içinde öngörülebilir gecikme gerekiyorsa cevap bu üçünden biri değil, WirelessHART ya da ISA100.11a.

Sensör ağına özgü saldırılar

İnternetteki bir sunucu kilitli bir odada duruyor. Sensör düğümü ise tarlada, köprüde, ağacın gövdesinde. Saldırgan onu yerinden alıp belleğini okuyabilir. Bu ağlarda güvenliğin ilk varsayımı bu yüzden farklı: düğümlerden bazıları ele geçirilecek.

Bağlantı katmanında koruma. 802.15.4, frame’leri 128 bitlik AES ile korumak için sekiz güvenlik düzeyi tanımlıyor. Kullanılan kip CCM*, 9. bölümdeki GCM’nin akrabası: şifrelemeyi yine CTR kipiyle yapıyor, bütünlük etiketini ise CBC-MAC denen yöntemle hesaplıyor. Düzeyler yalnızca bütünlükten yalnızca şifrelemeye ve ikisine birden uzanıyor; etiket 4, 8 ya da 16 bayt seçilebiliyor. 127 baytlık bir frame’de bu küçük bir pay değil.

Her frame 4 baytlık bir sayaç taşıyor ve bu sayaç nonce’un parçası. 9. bölümde CTR kipinde aynı sayacın iki kez kullanılmasının neden felaket olduğunu görmüştün. Bir düğüm pil değişiminden sonra sayacını sıfırdan başlatırsa iki kötü sonuçtan biri çıkıyor: alıcı yeni frame’leri tekrar saldırısı sanıp reddediyor ya da aynı anahtarla aynı nonce yeniden kullanılıyor. Sayacın kalıcı belleğe yazılması bu yüzden bir ayrıntı değil.

Anahtarı nereden bulacaklar? 9. bölümde adı konan anahtar dağıtımı sorunu burada daha sert. Bütün ağa tek bir anahtar vermek, tek bir düğüm yakalandığında bütün ağı açmak demek. Her düğüm çiftine ayrı bir anahtar vermek ise 10.000 düğümlük bir ağda her düğüme 9.999 anahtar yüklemek demek. 2002’nin düğümlerinde 10. bölümdeki açık anahtarlı yöntemler de fazla pahalı görülüyordu.

Eschenauer ve Gligor 2002’de olasılığa dayanan bir yol önerdi. Büyük bir anahtar havuzundan her düğüme rastgele birkaç anahtar yükleniyor. Sahada iki komşu ortak bir anahtarları olup olmadığını karşılaştırıyor; varsa onu kullanıyor, yoksa ortak anahtarı olan komşular üzerinden bir yol anahtarı kuruyor. Sayılar şaşırtıcı:

HavuzDüğüm başına anahtarİki düğümün ortak anahtar bulma olasılığı
10.00075%43
10.000100%64
100.000250%47

Her komşu çiftinin ortak anahtarı olmaması sorun değil. Rastgele çizgeler kuramı, her düğümün yeterince komşusu varsa ağın bütün olarak bağlı kaldığını söylüyor. Bir düğüm yakalandığında saldırgan 100 anahtar ele geçiriyor; başka iki düğüm arasındaki herhangi bir bağlantının bu anahtarlardan biriyle korunuyor olma olasılığı yalnızca %1 civarında.

Yönlendirmeye saldırmak. Karlof ve Wagner 2003’te sensör ağlarının yönlendirme protokollerine yönelik saldırıları sınıflandırdı ve o güne kadar bilinen bütün büyük protokollerde ağır açıklar gösterdi. Tablodaki ilk iki saldırı sınıfını ilk kez onlar tanımladı:

SaldırıNasıl çalışır
sinkholesaldırgan kendini sink’e çok iyi bir yol gibi gösterir, komşuların trafiğini üstüne çeker, sonra seçerek düşürür
HELLO floodgüçlü bir verici, uzak düğümlerin kendisini komşu sanmasını sağlar; onlar paketlerini hiç ulaşamayacakları bir komşuya gönderir
wormhole78. bölümdeki tünel: uzak iki noktanın paketleri birbirine aktarılır
Sybiltek bir düğüm birden çok kimlikle görünür; konum temelli yönlendirmeyi özellikle bozar

77. bölümdeki RPL’de sinkhole’un karşılığı açık: kök gibi düşük bir rank ilan eden bir düğüm, komşularını ebeveyni olmaya ikna edebilir. Karlof ve Wagner’in en öğretici bulgusu ise bağlantı katmanı şifrelemesinin sınırı. Şifreleme dışarıdan birinin ağa katılmasını engelliyor. Ama wormhole ve HELLO flood meşru paketleri olduğu gibi aktarıyor ya da yüksek güçle yeniden yayıyor; şifrelemenin bunları durdurmak için söyleyecek bir şeyi yok.

DerinleşmeTek bir simetrik anahtarla nasıl imza atılır?

Sink bütün ağa “örnekleme hızını değiştir” diye bir komut yayınlamak istiyor. Komutu bütün düğümlerin paylaştığı bir anahtarla etiketlerse, o anahtarı bilen her düğüm de sahte komut üretebilir; tek bir yakalanmış düğüm yeter. Açık anahtarlı imza bu sorunu çözerdi ama 2001’in düğümleri için fazla pahalıydı.

2001’de yayımlanan SPINS çalışmasındaki μTESLA asimetriyi matematikten değil zamandan elde etti. Sink önce tek yönlü bir fonksiyonla bir anahtar zinciri üretiyor: son anahtardan başlayıp geriye doğru, her anahtar bir sonrakinin özeti. Zincirin ilk halkası güvenli bir yolla bütün düğümlere dağıtılıyor. Sonra zaman aralıklara bölünüyor. Sink her aralıkta paketleri o aralığın anahtarıyla etiketliyor ama anahtarı ancak birkaç aralık sonra açıklıyor.

Düğüm bir paket aldığında onu hemen doğrulayamıyor; saklıyor. Anahtar açıklanınca iki şeyi kontrol ediyor: anahtarın özeti zincirdeki bir önceki bilinen halkayı veriyor mu ve paket, anahtar açıklanmadan önce mi gelmişti? İkinci şart her şeyin anahtarı. Anahtar açıklandıktan sonra onu herkes biliyor ve sahte paket üretebilir; ama o paket, açıklama anından önce gelmiş olamaz.

Bu yüzden μTESLA gevşek de olsa bir zaman eşitlemesi istiyor. 78. bölümde zamanı ölçüm damgası için eşitlemiştik; burada zaman, bir imzanın yerini tutuyor.

Cihaz güvenliği ve yasa. 50. bölümde Mirai’nin varsayılan parolası değiştirilmemiş kameralar ve kayıt cihazlarıyla Dyn’e saldırdığını görmüştün. Botnet’i ayrıntıyla inceleyen çalışmaya göre en yüksek noktasında yaklaşık 600 bin cihaz enfekteydi. Mirai’nin kullandığı zayıflık bir yazılım hatası bile değildi: fabrikadan bilinen bir parolayla çıkan ve sahibinin hiç değiştirmediği cihazlar.

Bu zayıflık artık yasalarla kapatılmaya çalışılıyor. Birleşik Krallık’ın PSTI yasası 29 Nisan 2024’te yürürlüğe girdi: tahmin edilebilir ya da bütün cihazlarda ortak olan varsayılan parolalar yasak, üretici cihazın ne kadar süre güvenlik güncellemesi alacağını açıklamak ve açık bildirimi için bir iletişim noktası sunmak zorunda. Cezası 10 milyon sterline ya da dünya çapındaki cironun %4’üne kadar çıkabiliyor. Avrupa Birliği’nin Siber Dayanıklılık Yasası 10 Aralık 2024’te yürürlüğe girdi. Üreticilerin bildirim yükümlülükleri 11 Eylül 2026’da başladı; asıl yükümlülükler 11 Aralık 2027’de uygulanacak ve cezalar 15 milyon avroya ya da cironun %2,5’ine kadar çıkabiliyor.

Özet

  • Saha, benzetimin göremediğini gösterir: Great Duck Island kademeli ve bağlantı kopmasına dayanıklı bir mimariyle, sekoya ağı %49’luk verimle, Murphy’nin patatesleri hiç cevaplanamayan sorularla bunu gösterdi.
  • Bilimin ölçütü ağınkinden farklıdır: Reventador’da önemli olan paket oranı değil, olayın eksiksiz ve doğru zamanlanmış kaydıydı; olayla tetiklenen aktarım sınırlı bant genişliğini doğru yere harcadı.
  • Zincirde bant genişliğini tasarım belirler: Golden Gate’te boru hattı, 46 sekmelik bir zincirde bant genişliğini dördüncü sekmeden sonra sabit tuttu.
  • Geniş alan seçenekleri farklı fiziklere dayanır: LoRa yayarak gürültünün altından okur, Sigfox kanalı daraltarak gürültüyü azaltır, NB-IoT operatör ağında 164 dB kayba dayanır. Bölgesel kurallar paket boyuna kadar her şeyi etkiler.
  • Düğümün yakalanacağını varsay: rastgele anahtar ön dağıtımı tek düğümün kaybını sınırlar; bağlantı katmanı şifrelemesi wormhole ve HELLO flood’u durdurmaz; μTESLA asimetriyi zamandan elde eder.

Buraya kadarki bütün düğümler yerinde duruyordu: yuvanın ağzında, ağacın gövdesinde, köprünün kirişinde. Düğüm bir zebranın boynunda, bir aracın içinde ya da birinin cebinde olursa ne değişir? Yol her an kopabiliyorsa veri hedefine nasıl ulaşır?

Bölüm 80: Mobil Kablosuz Sensör Ağları

Taşınarak. Hareket, ağın en temel varsayımını, iki uç arasında bir yolun var olduğunu, bozuyor. Ama aynı hareket, veriyi hiçbir radyonun ulaşamayacağı yerlere taşıyabiliyor da. Bu bölümün bütün fikirleri bu iki cümlenin arasında duruyor.

Hareket neyi bozar, neyi onarır?

Önceki üç bölümün protokolleri durağanlık üstüne kuruluydu. 77. bölümdeki RPL, her düğümün bir ebeveyn seçip ona bağlı kalacağını varsayıyor. Bağlantı kalitesi tahminleri, aynı komşuyla zaman içinde biriken ölçümlere dayanıyor. 76. bölümdeki TSCH programı, hangi düğümün hangi komşuyla hangi dilimde konuşacağını önceden yazıyor. Bir düğüm yer değiştirdiğinde bunların hepsi yeniden hesaplanmak zorunda.

Öte yandan hareket, durağan ağın en inatçı sorununu çözebiliyor. 75. bölümde sink’in hemen yanındaki düğümlerin bütün ağın trafiğini taşıdığını ve pillerinin önce bittiğini görmüştün: enerji deliği. Sink yerinde durdukça delik hep aynı yerde açılıyor. Sink hareket ederse “sink’in yanındaki düğümler” de zamanla değişiyor ve yük ağa yayılıyor.

2003’te önerilen veri katırları (data MULEs) bu fikri sonuna kadar götürdü. Ağ üç katmana ayrılıyor. Altta sensörler, üstte internete bağlı erişim noktaları, ortada ise zaten dolaşan şeyler: insanlar, hayvanlar, araçlar. Katır bir sensörün yakınından geçerken onun verisini kısa menzilde topluyor, taşıyor ve bir erişim noktasının yanından geçerken bırakıyor.

Kazanç hesabı basit. Sink’e beş sekmede ulaşan bir ölçüm için ağda beş gönderim ve beş alım harcanıyor ve bunların en ağırı sink’in çevresindeki düğümlerin sırtına biniyor. Katır geçtiğinde ise tek bir kısa gönderim yetiyor. Bedeli gecikme ve bellek: ölçüm, katır gelene kadar düğümde bekliyor. Katırın turu bir saatse verinin yaşı bir saate kadar çıkabiliyor ve düğümün belleği o bir saatlik veriyi tutabilmeli. Çalışmanın başarıyı ölçtüğü üç sayı da bunlar: teslim oranı, gecikme ve gereken tampon.

Zebraların sırtında bir ağ

2002’de Princeton’dan bir ekip, Kenya’daki zebraları izlemek için bir ağ tasarladı. Her tasmada bir GPS alıcısı, flash bellek, radyo ve küçük bir işlemci vardı. Bölgede hücresel kapsama yoktu ve işin en ilginç yanı, verinin gideceği yerin de sabit olmamasıydı. Baz istasyonunu araştırmacılar taşıyordu; arada bir araçla ya da uçakla sürünün yakınından geçip veriyi topluyorlardı.

Tasarımın ilk dersi enerjiydi. Tasmalarda enerjiyi radyodan çok GPS tüketiyordu; 78. bölümde sensör düğümlerine neden GPS takılmadığını sorarken bu gözleme dayanmıştık. Konumun ne sıklıkla ölçüleceği bu yüzden tasmanın ömrünü doğrudan etkileyen bir ayardı.

İkinci ders, verinin nasıl taşınacağıydı. Ekip iki protokolü karşılaştırdı. Taşkın protokolünde iki zebra birbirine yaklaştığında ellerindeki bütün veriyi değiş tokuş ediyordu. Geçmişe dayalı protokolde ise her tasma bir puan tutuyordu: art arda yaptığı taramalarda baz istasyonunu buldukça puanı artıyor, bulamadıkça azalıyordu. Veri, komşular arasında puanı en yüksek olana veriliyordu; o zebranın araştırmacıyla yeniden karşılaşma olasılığı daha yüksekti. Teslim edilen verinin kopyaları da boşuna yer kaplamasın diye, teslim edilenlerin listesi karşılaşmalarda dedikodu gibi yayılıyor ve kopyalar siliniyordu.

Sonuç koşullara bağlıydı. İdeal koşullarda taşkın en yüksek teslim oranını verdi. Bant genişliği kısıtlıyken geçmişe dayalı protokol öne geçti ve enerji hesabı da seçici protokollerden yanaydı. Sistem 2004’te Kenya’daki Mpala Araştırma Merkezi’nde sahaya çıktı. Hiç araştırmacıyla karşılaşmayan bir zebranın geçmişi bile, onunla karşılaşan başka bir zebranın sırtında eve dönebiliyordu.

Yol yoksa: gecikmeye dayanıklı ağlar

67. bölümdeki ve 68. bölümdeki TCP üç şeyi sessizce varsayıyor: bağlantı boyunca iki uç arasında bir yol var, gidiş-dönüş süresi en fazla birkaç saniye ve kayıp oranı düşük. Zebra ağında üçü de yok. Kevin Fall 2003’te bu tür ağlara zorlu ağlar dedi ve onlar için ayrı bir mimari önerdi. Sıradan bir paket ağında bir paketin kuyrukta beklediği süre nadiren bir saniyeyi aşarken, bu ağlarda saatler, belki günler sürebiliyordu.

Mimarinin adı gecikmeye dayanıklı ağ (Delay-Tolerant Networking, DTN) ve temel işlemi sakla, taşı, ilet. Uygulama verisi bundle denen birimlere konuyor. Her düğüm bundle’ı bir sonraki fırsat doğana kadar kalıcı bellekte saklıyor. Nisan 2007’de yayımlanan RFC 4838, bu mimariyi yazıya döktü; yazarlarından biri TCP/IP’nin tasarımcılarından Vint Cerf’tü. Protokolün bugünkü sürümü BPv7, Ocak 2022’de RFC 9171 olarak yayımlandı.

RFC 4838’in en ilginç fikri emanet aktarımı (custody transfer). TCP’de teslimin sorumluluğu gönderende kalıyor: kaybolan bir segmenti yalnızca o yeniden gönderebiliyor. DTN’de ise bir düğüm bundle’ın emanetini kabul ettiğinde teslimin sorumluluğu ona geçiyor. Gönderen, ilk durağın gidiş-dönüş süresi kadar sonra belleğini boşaltabiliyor. Güvenilirlik uçtan uca değil, emanetçiden emanetçiye taşınıyor. Fikrin bir bedeli de çıktı: her emanetçi kaybı bir zamanlayıcıyla sezmek zorunda ve gecikmesi bu kadar belirsiz bir ağda o zamanlayıcının değerini kestirmek zor. BPv7 bu yüzden emanet aktarımını çekirdek protokolden çıkardı; mekanizma artık ayrı uzantılarla tanımlanıyor.

Bu farkın ne kadar büyük olduğunu en iyi Mars gösteriyor. Radyo sinyali Dünya ile Mars arasını gezegenlerin konumuna göre 3 ila 22 dakikada geçiyor. TCP ile Mars’taki bir araca bağlanmaya çalışsan SYN en az 3 dakikada gidiyor, SYN-ACK en az 3 dakikada dönüyor. Oysa 71. bölümde gördüğün gibi Linux varsayılan ayarıyla yaklaşık iki dakika sonra pes ediyor. Bağlantı, cevap daha yoldayken iptal ediliyor. DTN’de ise bundle yola çıkıyor ve 3 ila 22 dakika sonra varıyor; arada kimse kimseyi beklemiyor.

Kopyalayarak yönlendirmek

Yol yoksa yönlendirme tablosu da yok. Mesajın hedefe ulaşması, onu taşıyan düğümlerin hedefle bir gün karşılaşmasına bağlı. İki uç strateji var.

Epidemic yönlendirme. 2000’de Duke Üniversitesi’nden Vahdat ve Becker’in önerdiği yöntem, adını salgından alıyor. İki düğüm karşılaştığında önce ellerindeki mesajların listesini değiş tokuş ediyor, sonra karşı tarafta olmayanları aktarıyor. Mesaj ağa bir salgın gibi yayılıyor. Bellek ve zaman sınırsızsa teslim kesin. Radyo da boşsa teslim mümkün olan en kısa sürede oluyor, çünkü bütün yollar aynı anda deneniyor. Bedeli de bu: 100 düğümlük bir ağda tek bir mesajın 99 kopyası çıkabiliyor, bellekler doluyor ve düğümler birbirinin radyo zamanını tüketiyor.

Spray and wait. 2005’te Güney Kaliforniya Üniversitesi’nden Spyropoulos, Psounis ve Raghavendra kopya sayısına bir tavan koydu. Kaynak mesajın L kopyasını ağa serpiyor, sonra kopyayı taşıyanlar hedefle doğrudan karşılaşana kadar bekliyor. İkili sürümde kopyaları elinde tutan düğüm, kopyası olmayan biriyle karşılaşınca elindekilerin yarısını ona veriyor:

L = 8     kaynak: 8
1. adım   kaynak: 4      A: 4
2. adım   kaynak: 2      A: 2      B: 2      C: 2
3. adım   sekiz düğüm, her birinde 1 kopya
          artık her biri yalnızca hedefle karşılaşırsa teslim eder

Kopyalar üç adımda sekiz taşıyıcıya dağılıyor ve toplam aktarım sayısı L civarında kalıyor. Yazarlar bu yöntemin, kıyasladıkları yöntemleri hem ortalama teslim gecikmesinde hem de teslim edilen mesaj başına aktarım sayısında geçtiğini gösterdi. Salgını sınırlamak onu yavaşlatmadı; çünkü sınırsız salgında düğümler birbirinin radyo zamanını tüketiyordu.

Altyapısız ağ: MANET

Bir deprem bölgesinde, bir tatbikatta ya da bir araç konvoyunda ne baz istasyonu ne access point olabilir. Bu tür ağlarda her cihaz aynı zamanda bir router. Adı mobil ad hoc ağ (MANET).

42. bölümdeki protokoller burada iki yerden zorlanıyor. Periyodik güncellemeler hem pil hem bant genişliği yiyor. Daha kötüsü, topoloji protokolün yakınsamasından hızlı değişebiliyor: yol hesaplandığında artık yok. IETF’in MANET çalışma grubu iki felsefeyi de deneysel RFC olarak yayımladı.

AODV (Temmuz 2003, RFC 3561) yolu yalnızca gerektiğinde arıyor. Kaynak ağa bir yol isteği taşkını yapıyor ve isteği ileten her düğüm, isteğin nereden geldiğini not ediyor. Hedef ya da hedefe taze bir yolu olan bir düğüm, bu notları geri izleyerek cevap veriyor. Bir bağlantı koptuğunda, o bağlantıyı kullanan düğümlere hata mesajı gidiyor. 42. bölümdeki uzaklık vektörüne benziyor ama onun ünlü kusurunu, sayarak sonsuza gitmeyi, bir sıra numarasıyla önlüyor. Her hedefin yolu, o hedefin ürettiği bir sıra numarası taşıyor ve düğümler daha yeni numaralı yolu her zaman eskisine tercih ediyor. Eski ve yanlış bir haber, yeni bir haberin yerini alamıyor.

DSR (Şubat 2007, RFC 4728) yolu tamamen kaynağa bırakıyor: paketin başlığına geçeceği bütün düğümlerin listesi yazılıyor. Hiçbir katmanda periyodik paket göndermiyor; ne merhaba mesajı ne yol duyurusu. Yaklaşık iki yüz düğüme kadar ve çok yüksek hareketlilikte bile çalışacak biçimde tasarlandı. Bedeli, yol uzadıkça büyüyen başlık.

OLSR (Ekim 2003, RFC 3626) ters yoldan gidiyor ve bütün hedeflere giden yolları sürekli hazır tutuyor. 42. bölümdeki link state yaklaşımının kablosuz ağa uyarlanmış hâli. Link state bilgisini ağa taşkınla yaymak pahalı, çünkü kablosuzda bir düğümün gönderdiği her şeyi bütün komşuları duyuyor ve her biri yeniden yayınlıyor. OLSR’nin cevabı çok noktalı röleler (MPR): her düğüm, komşuları arasından iki sekme uzaktaki bütün düğümlere ulaşmaya yetecek olabildiğince küçük bir grup seçiyor. Taşkın mesajlarını yalnızca bu seçilmiş komşular yeniden yayınlıyor. Sekiz komşusu olan bir düğümün iki sekmelik çevresini üç komşu kapsıyorsa, sekiz yayın yerine üç yayın yetiyor.

Önceden hesaplayan (OLSR)İstendiğinde arayan (AODV, DSR)
Yol hazır mı?evet, her anilk pakette arama gecikmesi
Denetim trafiğitrafikten bağımsız, süreklitrafikle orantılı
Uygun olduğu yeryoğun, sık konuşan ağseyrek konuşan, hareketli ağ
  1. bölümdeki RPL de bu tabloda bir yere oturuyor: köke doğru yolu önceden hesaplayan, ama yalnızca köke doğru. Çoğu trafiğin tek bir toplayıcıya aktığı, düğümlerin yerinde durduğu bir ağ için tasarlandı.
DerinleşmeBenzetim neden hep yavaşlıyordu?

MANET protokolleri 2000’lerin başında çoğunlukla benzetimle değerlendirildi ve hareketi modellemek için en sık kullanılan yöntem rastgele ara nokta modeliydi. Her düğüm alan içinde rastgele bir hedef nokta ve belli bir aralıktan rastgele bir hız seçiyor, hedefe gidiyor, biraz duruyor ve yeniden seçiyor.

2003’te Michigan Üniversitesi’nden Yoon, Liu ve Noble, “Rastgele ara nokta zararlı sayılır” başlıklı bir makale yayımladı. Hız aralığının alt sınırı sıfır seçildiğinde, benzetimdeki ortalama hız zamanla sürekli düşüyordu ve hiçbir zaman bir değere oturmuyordu. 900 saniyelik benzetimlerde bazı ölçümler %40’a kadar değişiyordu; yani sonuç, benzetimin ne kadar sürdüğüne bağlıydı.

Mekanizması bir örnekleme yanlılığı. Yavaş hız seçen bir düğüm, yolunu uzun sürede tamamlıyor; hızlı seçen çabuk bitirip yeniden seçiyor. Zaman ilerledikçe, herhangi bir anda düğümlerin daha büyük kısmı yavaş bir yolun ortasında yakalanıyor. Hız 1 ile 20 m/s arasında eşit olasılıkla seçilirse, seçilen hızların ortalaması 10,5 m/s. Ama zamana göre ortalama, yani herhangi bir anda bakınca görülen ortalama hız, yaklaşık 6,3 m/s. Alt sınır sıfıra indikçe bu ikinci sayı da sıfıra doğru gidiyor, çünkü hızı sıfıra yakın bir düğüm yolunu hiç bitiremiyor.

Sonuç: aynı protokolü sabit bir hareketlilikte ölçtüğünü sanan araştırmacı, aslında benzetim boyunca giderek durgunlaşan bir ağı ölçüyordu. Çözüm, alt sınırı sıfırdan büyük seçmekti.

Yolda: araçlar arası iletişim

Araçların birbirine “fren yapıyorum” diyebilmesi fikri eski. ABD’de Federal İletişim Komisyonu (FCC) Ekim 1999’da 5,850 ile 5,925 GHz arasındaki 75 MHz’i bu iş için ayırdı. Radyo tarafı Wi-Fi’dan uyarlandı: Temmuz 2010’da yayımlanan 802.11p.

Uyarlamanın iki ayrıntısı, araç ortamının ne kadar farklı olduğunu gösteriyor. Birincisi, 30. bölümde bir cihazın access point’e bağlanmadan önce keşif, kimlik doğrulama ve ilişkilendirme adımlarından geçtiğini görmüştün. Otoyolda karşılıklı geçen iki araç birbirinin menzilinde birkaç saniye kalıyor; bu adımlara vakit yok. 802.11p bu yüzden bir BSS’nin dışında çalışan bir kip getirdi: kimlik doğrulama yok, ilişkilendirme yok, access point yok. Menzildeki her cihaz ötekiyle doğrudan konuşuyor.

İkincisi, kanal genişliği. 31. bölümdeki OFDM, yankıların bir sembolden ötekine taşmaması için her sembolün başına bir koruma aralığı koyuyordu. 802.11p, 802.11a’nın 20 MHz’lik kanalı yerine 10 MHz kullanıyor. Kanal yarıya inince her şey iki kat yavaşlıyor: sembol 4 yerine 8 mikrosaniye, koruma aralığı 0,8 yerine 1,6 mikrosaniye. 1,6 mikrosaniyede ışık 480 metre yol alıyor. Yani uzaktaki bir kamyondan ya da köprüden yansıyıp yaklaşık 480 metre fazla yol kat eden bir yankı bile bir sonraki sembolü bozmuyor.

Ama teknoloji yaygınlaşamadan dünya değişti. FCC, Kasım 2020’deki kararıyla bandın alt 45 MHz’ini lisanssız kullanıma, yani Wi-Fi’a açtı; üst 30 MHz’i hücresel standarttan gelen ve araçların baz istasyonu olmadan da doğrudan konuşabildiği C-V2X’e ayırdı. 802.11p’ye dayanan eski sistem ABD’de bu banttan çıkarıldı ve nihai kurallar Kasım 2024’te yayımlandı. Yirmi yıl boyunca ayrılmış duran bir bandın kaderini, kimin hangi teknolojide anlaştığı belirledi.

Cepteki sensör

Dünyadaki en büyük sensör ağını kimse kurmadı: telefonlar. Her birinde ivmeölçer, GPS ve mikrofon var. Daha önemlisi, zaten ağa bağlılar ve pilleri her gün şarj ediliyor. Bu bölüme kadar gördüğün zorlukların birçoğu burada ortadan kalkıyor; yerlerine başkaları geliyor.

Bunun en çarpıcı örneği deprem uyarısı. Deprem, yer kabuğunda farklı hızlarla ilerleyen dalgalar üretiyor. Önce daha hızlı ve genellikle daha zararsız P dalgası geliyor, ardından asıl yıkıcı sarsıntıyı taşıyan S dalgası. Yer kabuğunda P dalgası kabaca saniyede 6, S dalgası 3,5 kilometreyle ilerliyor. Oysa 2. bölümde gördüğün gibi fiberdeki bir sinyal saniyede iki yüz bin kilometre yol alıyor. Merkez üssünün yakınındaki telefonlar P dalgasını hissedip bunu sunucuya bildirdiğinde, uyarı 100 kilometre ötedeki bir şehre S dalgasından önce ulaşabiliyor:

Merkez üssüne uzaklıkP dalgasıS dalgası
50 km~8 s~14 s
100 km~17 s~29 s
200 km~33 s~57 s

Algılama, büyüklüğü tahmin etme ve uyarıyı dağıtma birkaç saniye sürüyor; merkez üssüne çok yakın yerlerde uyarı sarsıntıdan önce yetişemiyor.

Google’ın Android telefonlarla kurduğu sistem Nisan 2021’de Yeni Zelanda ve Yunanistan’da başladı ve 2023 sonunda 98 ülkeye yayıldı. Temmuz 2025’te Science dergisinde yayımlanan değerlendirmeye göre sistem, erken uyarıya erişimi on kat artırarak 2,5 milyar kişiye çıkardı ve ayda ortalama 312 deprem algıladı. 4,5 ve üstündeki depremler için ayda yaklaşık 60 olayda 18 milyon uyarı gönderildi. Uyarı alanların %85’i sarsıntıyı hissetti; %36’sı uyarıyı sarsıntıdan önce, %28’i sırasında, %23’ü sonra aldı.

Aynı değerlendirme, sistemin en ağır hatasını da açıkça yazdı. 6 Şubat 2023’te saat 04.17’de Kahramanmaraş’ta meydana gelen 7,8 büyüklüğündeki depremi sistem 4,5 ile 4,9 arasında tahmin etti. En güçlü uyarı olan “harekete geç” (Take Action) uyarısı yalnızca 469 kişiye gitti; yaklaşık 500 bin kişi daha hafif “dikkatli ol” (Be Aware) uyarısı aldı. Merkez üssünün 158 kilometre çevresinde yaşayan yaklaşık 10 milyon kişi 35 saniyeye varan bir uyarı alabilirdi. Aynı gün yaşanan ikinci depremde yaklaşık 8 bin “harekete geç” ve 4 milyon “dikkatli ol” uyarısı gönderildi. Düzeltilmiş algoritmanın benzetiminde ilk deprem için 10 milyon “harekete geç” ve 67 milyon “dikkatli ol” uyarısı çıkıyor. Büyük bir depremin kırılması onlarca saniye sürüyor ve ilk saniyelerde ölçülen sinyal, gerçek büyüklüğün yalnızca bir kısmını gösteriyor. Nisan 2025’te İstanbul açıklarındaki 6,2 büyüklüğündeki depremde ise ilk uyarı deprem başladıktan 8,0 saniye sonra çıktı ve 11 milyondan fazla uyarı gönderildi.

Özet

  • Hareket yolu bozar, yükü dağıtır: durağan ağın protokolleri yer değiştiren düğümle yeniden hesaplanır; hareketli sink ve veri katırları ise enerji deliğini dağıtır ve bunun bedelini gecikme ile bellek olarak öder.
  • Yol yoksa sakla, taşı, ilet: DTN veriyi bundle’lara koyar, emanet aktarımıyla güvenilirliği düğümden düğüme taşır. Mars’a kadar uzanan gecikmelerde TCP’nin bağlantısı hiç kurulamaz.
  • Kopya sayısı bir ayardır: epidemic yönlendirme her yolu dener ama belleği ve radyoyu tüketir; spray and wait kopyayı L ile sınırlar.
  • MANET’te iki felsefe var: OLSR yolu sürekli hazır tutar ve taşkını MPR ile azaltır; AODV ve DSR yolu gerektiğinde arar. AODV sayarak sonsuza gitmeyi sıra numarasıyla önler.
  • Ölçüm yöntemi de yanılabilir: rastgele ara nokta modelinde alt hız sınırı sıfırsa ortalama hız zamanla düşer ve sonuç benzetimin süresine bağlı kalır.
  • Araç ve telefon ağları başka kurallarla yaşar: 802.11p ilişkilendirmeyi atlar ve uzun yankılara dayanır; deprem uyarısı, ağdaki sinyalin sismik dalgadan hızlı gitmesinden yararlanır.

Yolculuk da, yolun kenarındaki ağlar da bitti. Geriye tek bir soru kalıyor: bunca durak, bunca zarf ve bunca tur neden böyle kurulmuş?

Bölüm 81: Son Söz

Bitirdin.

Yolculuğun başında 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ı, switch’in öğrendiği tabloyu, router’ın seçtiği 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:

  1. 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 (5. bölüm).
  5. Adres makineyi gösteriyor, süreci gösteren ikinci sayı devreye giriyor (6. bölüm).
  6. Üç mesajla bir bağlantı kuruluyor ve iki taraf başlangıç numaralarını değiş tokuş ediyor (8. bölüm).
  7. Kilit taşımanın üstüne takılıyor; tek gidiş-dönüşte anahtar kuruluyor ve karşı tarafın kimliği bir imza zinciriyle doğrulanıyor (11. ve 12. bölüm).
  8. İstek nihayet yazılıyor ve sunucu onun hangi siteye ait olduğunu başlıktan öğreniyor (13. bölüm).
  9. Aynı veri her katmanda bir zarf daha giyiyor (18., 19. ve 20. bölüm).
  10. Kart frame’i okuyor ve adres eşleşmezse gerisini hiç okumadan bırakıyor (23. bölüm).
  11. Komşunun donanım adresi bağırarak soruluyor, switch de hangi adresin hangi kabloda olduğunu kendi öğreniyor (25. ve 27. bölüm).
  12. Makine adresini kiralıyor, maskeyle hedefin uzakta olduğuna karar veriyor ve paketi geçide veriyor (36. ve 37. bölüm).
  13. Router en uzun öneki seçiyor ve paketi bir sonraki durağa itiyor (39. bölüm).
  14. Sınırdaki geçit kaynak adresi çeviriyor, otonom sistemler birbirine yol ilan ediyor ve kimse haritanın tamamını tutmuyor (45. ve 46. bölüm).
  15. Bitler bakırda gerilime, camda ışığa dönüşüyor ve okyanusu geçiyor (52., 58. ve 64. bölüm).
  16. İstek bir veri merkezinin leaf-spine dokusundan geçip sunucunun rafına varıyor (65. bölüm).
  17. Karşı tarafta zarflar ters sırayla açılıyor ve yanıt numaralanmış baytlar hâlinde geri akıyor (66. ve 67. bölüm).
  18. Gönderen hızını ağdan sızan belirtilere bakarak ayarlıyor ve ilk bayt düşüyor (68. ve 70. bölüm).

Yolculuk 70. bölümde bitti ama kitap orada bitmedi. Son üç kısım aynı fikirlerin başka ağlarda nasıl yeniden kurulduğunu gösterdi. Tarayıcının yaptığını birkaç satır kodla yaptın ve bir protokol tasarlanırken hangi kararların verildiğini gördün (71. ve 72. bölüm). Geç gelen verinin hiç gelmemiş sayıldığı bir dünyada video ve canlı görüşmenin nasıl ayakta kaldığını izledin (73. ve 74. bölüm). Son olarak pille yaşayan, zamanının çoğunu uykuda geçiren ve bazen hiç yerinde durmayan ağlara indin (75. ile 80. bölüm arası).

Üç 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ı: internet, merkezî bilgiyi yerel karara çevirerek ölçekleniyor. Ölçeklenmesinin sebebi de kırılganlıklarının sebebi de bu.

Sensör ağları bu cevapları zorlu koşullarda sınadı. Birinci sorunun cevabı değişti: sink bir adres değil bir özellik sordu ve isimlerin yerini verinin kendisi aldı. İkinci cevabın bir sınırı göründü: uçtan uca bir yol hiç kurulamıyorsa güvenilirlik uçlardan ara düğümlere, emanetçiden emanetçiye taşındı. Üçüncü cevap ise olduğu gibi dayandı. RPL’de de hiçbir düğüm haritanın tamamını tutmadı; her biri yalnızca ebeveynini seçti ve ağaç bu seçimlerin toplamından çıktı.

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, 26. bölümdeki ALOHA’nın veriminin niçin 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 güncel ölçümlerin yanına tarihini koydum.

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; 66. bölümde gördüğün gibi küçük paketlerde başlık taşınan verinin kendisinden kat kat büyü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. Sınırı taşıyanlar oldu elbette: 15. bölümdeki QUIC taşımayla şifrelemeyi tek katmanda birleştirdi, 65. bölümdeki RDMA işletim sistemini atladı. İkisi de katmanı kaldırmadı; katmanın bittiği yeri, hızın gerektirdiği yere kaydırdı.

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. Windows’ta aynı işi nslookup, Get-NetTCPConnection, route print, tracert ve Wireshark görüyor. 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 9000 (QUIC), RFC 8446 (TLS 1.3), RFC 9110 (HTTP) ve RFC 1035 (DNS) iyi bir başlangıç. Son kısımlar için RFC 3550 (RTP), RFC 6550 (RPL) ve RFC 7252 (CoAP) aynı işi görüyor. 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 ya da Cisco Packet Tracer, GNS3 gibi benzeticilerle kurulan iki alt ağ ve bir router, 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. Sensör ağları için Contiki-NG işletim sistemiyle gelen Cooja benzeticisi, RPL’i ve 6LoWPAN’ı tek bir bilgisayarda onlarca sanal düğümle çalıştırmana izin veriyor.

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. Sensör ağlarında Akyıldız ile Vuran’ın Wireless Sensor Networks (2010) ve Karl ile Willig’in Protocols and Architectures for Wireless Sensor Networks (2005) kitapları bu alanın ders kitabı sayılıyor.

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; adı 1973’te 26. bölümdeki Bob Metcalfe koydu. ping komutunu 1983’te yazan Mike Muuss, adını denizaltı sonarının sesinden aldığını söylemişti. İnternet üzerinden geçen trafiğin büyük kısmı da, 64. bölümde gördüğün gibi kıtaları birbirine bağlayan ve derin sularda 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, switch hedefi bilmiyordu, router yolun tamamını bilmiyordu, otonom sistem komşusunun içini hiç görmüyordu, sensör düğümü ebeveyninin ötesini bilmiyordu. 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.