Bölüm 17:Katmanlı Mimari
Ağlar'a “Sen”i Katmak yazısının parçası: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine kadar inen uzun bir teknik yolculuk.
Tüm bölümler
- Giriş
- Adres Çubuğundan İsteğe
- Paket Anahtarlamalı Yol
- İsimden Adrese
- Önbellek, Tazelik ve Güven
- Port Numarası ve Soket
- Bağlantısız Taşıma: UDP
- Üç Adımlı El Sıkışma
- Simetrik Şifreleme
- Açık Anahtarlı Kriptografi
- TLS El Sıkışması
- Sertifika Zinciri
- HTTP Mesajının Anatomisi
- Durum, Çerez ve Oturum
- HTTP/2'den HTTP/3'e
- İçerik Dağıtım Ağları
- Diğer Uygulama Protokolleri
- Katmanlı Mimari
- Kapsülleme ve Başlıklar
- Paket Yakalama ve Çözümleme
- Ağ Arayüz Kartı
- Fiziksel Adresleme
- Hata Sezme ve CRC
- Adres Çözümleme: ARP
- Anahtarlama ve Ortam Erişimi
- Ağ Topolojileri
- Sanal Yerel Ağlar
- Kablosuz Erişim: 802.11
- Radyo Kanalı ve Kapasite
- Kablosuz Ağ Güvenliği
- Hücresel Ağlar
- Spektrum ve Kuşaklar
- Hareketlilik ve Aktarma
- Adres Kiralama: DHCP
- Adresin Anatomisi
- Adres Tükenmesi ve IPv6
- Yönlendirici Mimarisi
- Kuyruk Yönetimi
- Cihaz Yapılandırma
- Yönlendirme Protokolleri
- Kontrol Düzlemi ve SDN
- Ağ İzleme ve Yönetimi
- Alanlar Arası Yönlendirme
- Adres Çevirisi
- Ara Kutular
- Tünelleme ve IPsec
- Güvenlik Duvarları
- Operatör ve Metro Ağları
- Bitten Sinyale
- Çoklama Teknikleri
- İletim Ortamları
- Kablo Sonlandırma
- Fiber Optik İletim
- Bakır Erişim Ağı: DSL
- Pasif Optik Ağlar
- Kablo Erişim Ağları
- Denizaltı Kabloları
- Veri Merkezi Ağları
- Kapsülleme Çözme
- Güvenilir Aktarım
- Tıkanıklık Denetimi
- Trafik Çözümleme
- Gecikme Bütçesi
- Son Söz
İstek makineden çıkarken düz metin olmaktan çıkıyor ve iç içe geçmiş zarflara dönüşüyor. O zarfların bir sırası var, ve o sırayı şimdiye kadar kasten adlandırmadım.
Adı katman. Zarfları bir sonraki durakta açacağız; burada onları saran düzeni kuruyoruz. Peki bu düzen neden kuruldu, ve içinde kaç kat var?
Bir katman neyin üstüne basıyor?
Katmanlı düzenin tanımını tek cümleye sığdırabilirsin. Bir katın elinde iki şey var: kendi yaptığı iş ve hemen altındakinden aldığı hizmet; dışarıya verdiği söz bu ikisinden çıkıyor. Daha aşağısını bilmiyor, ve bilmemesini bir eksik olarak görme — tasarımın kendisi bunu istiyor.
Kazancına modülerlik deniyor. Bir katmanın hizmetini nasıl ürettiği baştan aşağı değişebiliyor ve üstteki kat bunu hiç fark etmiyor. Kablo bakırdan cama dönüyor, tarayıcı tek satırını bile değiştirmiyor. Aynı bağımsızlığı öteki yönde de göreceksin: yeni bir uygulama protokolü yazmak için yol üstündeki yönlendiricilere dokunman gerekmiyor.
Bunu bir kargo şirketinin tezgâhında kolayca görebilirsin. Tezgâhtaki görevli kutunun içine bakmıyor; üstüne bir barkod yapıştırıyor ve işi bitiyor. Ayırma merkezindeki bant barkodu okumuyor, onun tek derdi şehir etiketi. Şoför şehir etiketini de umursamıyor; elinde yalnızca bir sefer listesi duruyor. Haritalama şöyle: kutu uygulamanın mesajı, barkod taşıma başlığı, şehir etiketi ağ başlığı, sefer listesi ise bağ katmanının çerçevesi. Benzetme şurada biter: kargoda tıkanan bir gönderi için görevli kutuyu açıp içine bakabilir, hatta bakmak zorundadır. Katmanlarda o yetki yok.
Modülerliğin yanında ikinci bir kazanç daha var ve adı adlandırma. Yığın açıkça bölündüğü için her parçanın ayrı bir adı, her sınırın ayrı bir yeri oluyor. Katmanlamayı önce bir konuşma dili, sonra bir mühendislik aracı olarak düşün. Arıza da o dille bulunuyor: bağlantı var ama isim çözülmüyor cümlesi, sorunun nerede olmadığını daha kimse bakmadan söylüyor.
Kaç katman var? Üç cevap, üçü de doğru
Katman sayısını sorduğunda üç ayrı rakam duyacaksın ve üçü de aynı ağı tarif ediyor.
OSI referans modeli yedi katman sayıyor; ilan edilmiş amacı karmaşıklığı azaltmak ve ortak standart geliştirmek. TCP/IP ise dörtle yetiniyor: Application, Transport, Internet, Network Interface. En alttaki Ağ Giriş katmanı, OSI’nin veri bağı ve fiziksel katmanlarının işini tek başına görüyor; ona host-to-network da deniyor. Ders kitaplarının çoğu ise ikisinin arasında duran beş katmanlı bir yığın öğretiyor. OSI’nin veri bağı dediği kata bu kitap boyunca bağ katmanı diyeceğim.
| Katman | İşi | Örnek |
|---|---|---|
| Uygulama | iki uçtaki programın konuştuğu dili kurar | HTTP, IMAP, SMTP, DNS |
| Taşıma | veriyi bir süreçten karşıdaki sürece teslim eder | TCP, UDP |
| Ağ | datagrama yol seçer ve varışa kadar iletir | IP, yönlendirme protokolleri |
| Bağ | veriyi yalnızca komşu düğüme kadar götürür | Ethernet, 802.11, PPP |
| Fiziksel | biti elektriğe, ışığa ya da dalgaya çevirir | bakır, radyo, fiber |
En alttaki satırın işi kulağa fazla sade geliyor olabilir. Oysa bir tel çekilmeden önce kararlaştırılması gereken her şeyi orada bulacaksın. Standart bunları dört başlıkta topluyor ve dördünü de bir bit yola çıkmadan cevaplamış olman gerekiyor:
- Mekanik: konnektörün şekli, kaç pin taşıdığı, boyutları. RJ-45’in sekiz pini bu başlıktadır.
- Elektriksel: bir bitin kaç volt olduğu, kaç mikrosaniye sürdüğü, hattın empedansı. 100 ohm’luk twisted pair (bükümlü çift) bu başlıktadır.
- İşlevsel: hangi pinin ne anlama geldiği. 1 ve 2 numaralı pinin “gönder” çifti olması bu başlıktadır.
- Yordamsal: olayların hangi sırayla olacağı. Bağlantı algılama darbeleri ve hız pazarlığı bu başlıktadır.
İki taraf bu dört başlıkta anlaşmamışsa iletim hiç başlamıyor. Bir uç sayısal 1’i +5 volt ve 2 mikrosaniye olarak gönderirken öteki uç +7 volt ve 5 mikrosaniye bekliyorsa, kablo sapasağlam olsa bile karşıya tek bir bit geçmiyor.
Internet yığınında karşılığı olmayan iki kat
OSI’nin yedilisinde TCP/IP’de karşılığı olmayan iki kat var. İkisi de “gerçeklenmedi” diye geçiştiriliyor; oysa ikisinin de tarif ettiği iş bugün fazlasıyla yapılıyor, sadece başka bir yerde.
Sunum katmanı tek bir soruyla uğraşır: aynı bit dizisini iki makine aynı şey olarak mı okuyor? Cevap kendiliğinden evet değil. OSI bu işi ikiye böler. Soyut sözdizim verinin ne olduğunu söyler — “bu alan bir tamsayı, şu alan bir tarih”. Aktarım sözdizimi ise o soyut tanımın telde hangi baytlara döneceğini söyler. İkisini ayırmak, aynı veriyi farklı kodlamalarla göndermeyi mümkün kılıyor.
Bu ayrımın bir gösterimi var ve adı ASN.1; kodlama kuralları da BER ve DER. Kulağa müzelik geliyor, değil: tarayıcının doğruladığı X.509 sertifikası ASN.1 ile tanımlı ve DER ile kodlanmış bir yapıdır. SNMP de aynı gösterimi kullanır. Sunum katmanı ölmedi; adı unutuldu.
İkinci iş bayt sırası. Bir sayıyı belleğe yazarken kimi işlemci en anlamlı baytı başa koyar, kimi sona. İki makine bu konuda anlaşmazsa 1.000 yazan biri karşıda 59.395 okur. Ağda bu yüzden tek bir kural var ve adı ağ bayt sırası: en anlamlı bayt önce. Ağ programı yazan herkes, sayıyı sokete koymadan önce bu sıraya çevirmek zorunda — ve o çevirme tam olarak sunum katmanının işi. Üçüncü iş karakter kodlaması, dördüncüsü sıkıştırma, beşincisi şifreleme. Tarayıcının kurduğu şifreli kanal, kitap boyunca göreceğin en canlı sunum katmanı örneği.
Oturum katmanı ise iki tarafın konuşma düzenini yönetir. Üç işi var. Birincisi diyalog denetimi: sıranın kimde olduğunu belirler, çünkü yarım çift yönlü bir hatta iki tarafın aynı anda konuşması karışıklık demektir. İkincisi eşitleme noktaları: uzun bir alışverişin içine işaretler koyar, bağlantı koptuğunda taraflar en son işaretten devam eder. Üçüncüsü etkinlik yönetimi: birden çok işi tek bir oturumun içinde sıraya dizer.
İkinci iş bugün her yerde. İki saatlik bir dosya transferi %90’da koptuğunda baştan başlamıyorsan, birileri oturum katmanının işini yapıyor demektir — ve o birileri uygulamanın kendisi. HTTP’nin Range başlığı, kesilen indirmeyi kaldığı bayttan sürdüren istemci, QUIC’in bağlantı kimliği: üçü de ayrı bir kat açmadan aynı hizmeti kuruyor.
Internet yığınının kararı “bu işler gereksiz” değildi. Karar şuydu: bu işler her uygulama için aynı değil, o hâlde zorunlu bir kat yapma. Bir dosya transferi eşitleme noktası ister, bir DNS sorgusu istemez. Zorunlu kat, istemeyene de fatura keser.
DerinleşmeOSI hiç gerçeklenmediyse neden hâlâ öğretiliyor?
ISO çalışmayı 1977’de başlattı, modeli 1984’te yayımladı ve 1994’te bir kez gözden geçirdi. Belgenin numarası ISO-7498. Ortaya çıkan şey bir ürün değildi ve hiç olmadı: OSI programı diye bir yazılım, OSI donanımı diye bir kutu yok. Üreticiler yalnızca modelin tarif ettiği kurallara uyuyor.
Ethernet literatürü daha da ileri gidiyor. Model, hangi işin hangi kata düştüğünü sıralar; o işi kimin, hangi kutuda, hangi koddan gerçekleyeceğine karışmaz. Betimleme ile reçete arasındaki fark küçük görünüyor, sonuçları büyük. TCP/IP daha önce geliştirildi, çalışan koduyla geldi ve sahayı aldı. OSI geç kaldı, ve kendi katmanlarının ikisi hiçbir yığında gerçeklenmedi.
Buna rağmen model ölmedi, çünkü asıl ürünü yazılım değil sözlüktü. Bugün bir ağ mühendisi üçüncü katman anahtarı dediğinde herkes yönlendirme yapan bir kutuyu anlıyor. Yedinci katmanda çalışan güvenlik duvarı dediğinde, o kutunun istek başlıklarına baktığını anlıyor. Bu numaralar OSI’den kalma ve TCP/IP’nin dörtlüsü onları hiç üretmedi.
Bir arıza toplantısında da aynı sözlük iş görüyor. Sorun ikinci katmanda mı yoksa üçüncüde mi sorusu, kabloyla yönlendirme tablosunu tek hamlede ayırıyor. Kimse ölçü aletine sarılmadan önce arama alanı yarıya iniyor.
Hangi cihaz hangi katmanda durur?
Sözlüğün asıl işi burada başlıyor. Bir kutunun kaçıncı katmanda çalıştığını belirleyen şey markası ya da fiyatı değil, okuduğu en derin başlıktır. Bir cihaz hangi başlığa kadar iniyorsa o katmanın cihazıdır; daha yukarısını görmez, daha aşağısını zaten taşımak zorundadır.
Aynı katmanın taşıdığı veri parçasının da her katta ayrı bir adı var. Adlar keyfî değil, konuşurken hangi zarftan bahsettiğini belirsizlikten kurtarıyor.
| Katman | Veri parçasının adı | Bu katta duran cihazlar | Karar verirken neye bakar |
|---|---|---|---|
| Uygulama | ileti / veri | vekil sunucu, ters vekil, uygulama güvenlik duvarı, 7. katman yük dengeleyici | istek satırı, başlıklar, alan adı, yol |
| Sunum | veri | şifreleme sonlandıran kutular | gösterim ve kodlama |
| Oturum | veri | ayrı bir kutusu yok | konuşma düzeni |
| Taşıma | segment (TCP) / datagram (UDP) | durum bilgili güvenlik duvarı, NAT, 4. katman yük dengeleyici | port numaraları ve bağlantı durumu |
| Ağ | paket | yönlendirici, 3. katman anahtar, temel güvenlik duvarı | hedef IP adresi |
| Bağ | çerçeve | anahtar, köprü, kablosuz access point (erişim noktası), ağ kartı | hedef MAC adresi |
| Fiziksel | bit | hub, tekrarlayıcı, medya dönüştürücü, kablo, konnektör, prizin kendisi | hiçbir şeye; yalnızca sinyali geçirir |
En üst satırdaki adlar şimdilik yabancı gelebilir; hepsi ileride tek tek açılıyor. Kabaca karşılıkları şöyle: vekil sunucu istemcinin isteğini onun adına ileten kutu, ters vekil aynı işi sunucunun önünde yapan ve istemcinin gerçekte konuştuğu kutu, yük dengeleyici ise gelen istekleri arkadaki birden çok sunucuya dağıtan kutu.
Tabloyu tersten okursan daha çok şey öğreniyorsun. En alttaki cihazın verecek hiçbir kararı yok. Hub gelen elektriği bütün portlara tekrar eder; içeride ne olduğunu bilmez, bilmesi de beklenmez. Bir üste çıktığında cihaz ilk kez bir alana bakıp bir karar veriyor: anahtar hedef MAC adresini okur ve çerçeveyi yalnızca o adresin öğrenildiği porta yollar. Bir üste daha çıktığında karar yerelden çıkar; yönlendirici hedef IP adresine bakar ve paketi başka bir ağa iletir.
Bu tırmanışın somut bir bedeli var: cihaz ne kadar yukarı çıkarsa paket başına o kadar çok iş yapar. Hub’ın gecikmesi mikrosaniyeler, anahtarınki onlarca mikrosaniye, yönlendiricininki daha fazla, istek başlıklarını ayrıştıran bir vekil sunucununki milisaniye mertebesindedir. Kutuyu yukarı taşımak her zaman gecikme satın almak anlamına geliyor.
İki uyarı da tabloyu doğru okumak için gerekiyor. Birincisi, bir cihazın kendi katmanının altındaki her katmanı da gerçeklemesi zorunludur. Yönlendirici üçüncü katman cihazıdır ama çerçeveyi çözmeden pakete ulaşamaz; her portu aynı zamanda ikinci ve birinci katmanda da çalışır. Katman numarası, cihazın tavanını söyler, tamamını değil.
İkincisi, saha adları modelin sınırlarını umursamıyor. 3. katman anahtar, anahtar donanımının hızıyla yönlendirme yapan bir kutudur; ismi ikinci katmanı, işi üçüncüyü anlatır. Ev kutun ise tek kasada modem, yönlendirici, anahtar ve access point’i birleştirir; birinci katmandan üçüncüye kadar hepsinde birden iş görür. Böyle bir kutuya tek bir numara vermek mümkün değildir — ve gerekmez de. Sorulması gereken soru “bu kutu kaçıncı katmanda?” değil, “bu kutu şu anda hangi başlığa bakıyor?” sorusudur.
Aynı harita bir arıza toplantısında da yön veriyor. Bir bağlantı hiç kurulmuyorsa sıra alttan başlar: kablo takılı mı, ışık yanıyor mu, karşı MAC öğrenilmiş mi, hedefe giden bir yol var mı, port açık mı, sunucu cevap veriyor mu. Her basamak bir katmandır ve her basamak arama alanını bir kat daraltır.
Komşuya verilen söz nedir?
Bir katmanın üç muhatabı var: altındaki, üstündeki ve karşı makinedeki eşi. İlk ikisiyle dikey, üçüncüsüyle yatay konuşuyor. Dikey ilişkinin adı hizmet, yatay ilişkinin adı protokol.
Sözleşme çift yönlü. Bir kat aynı anda hem üstüne hizmet veriyor hem altından hizmet alıyor. Hizmetin sınırını bir liste çiziyor; katmanın dışarıya açtığı temel işlemler neyse hizmet o kadar. Protokol ise iki eşin, kimin ne zaman ne göndereceğine dair önceden verdiği söz. Bu ikisini ayrı tutmak, kitabın geri kalanında çok işine yarayacak.
Bu ayrımın kolayca kaçırılan bir sonucu var: hizmet ile protokol bağımsız değişkenlerdir. Aynı hizmeti farklı protokollerle verebilirsin: taşıma katmanının “güvenilir bayt akışı” hizmetini TCP de verir, QUIC de. İkisinin içi tamamen başka, dışarıya verdikleri söz aynı. Bu yüzden bir uygulamayı TCP’den QUIC’e taşımak, üstündeki kodu baştan yazmayı gerektirmiyor.
Hizmetler ikiye ayrılır ve bu ayrım kitabın üçte birini açıklıyor. Bağlantı yönelimli hizmette önce bir kurulum yapılır, sonra veri akar, sonunda bağlantı kapatılır — telefon gibi. Bağlantısız hizmette kurulum yoktur; her birim kendi başına, kendi adresiyle yollanır — mektup gibi. 7. bölümde üç mesajlık el sıkışmayı kuran TCP birincisi, 6. bölümde hiçbir söz vermeyen UDP ikincisidir. IP de bağlantısızdır; güvenilir bir taşıma katmanının bağlantısız bir ağ katmanı üstünde durabilmesi, katmanlamanın en güçlü gösterisidir.
Bu kadar soyut bir sözleşmenin çok somut adları var. Uygulama ile taşıma arasındaki arayüz port numarasıdır; iyi bilinen iki örnek HTTP’nin 80 ve FTP’nin 21 numarasıdır. Çoklama çözme, tam olarak bu arayüzün sözleşmesi üstünde duruyor. Bağ ile ağ arasındaki arayüz ise Ethernet çerçevesinin 2 baytlık tür alanı. O alan, çerçevenin içindekinin üstteki hangi protokole teslim edileceğini söylüyor; bağ katmanının çoklama çözmesi tek bir alana sığmış durumda. Aynı işi LLC katmanında Service Access Point yapıyor.
Taşınan şeyin adı da katman katman değişiyor.
| Katman | Veri biriminin adı |
|---|---|
| Taşıma | segment |
| Ağ | datagram |
| Bağ | çerçeve |
| Fiziksel | bit |
Dördünün ortak adına Protocol Data Unit deniyor; ağ katmanının birimine gündelik konuşmada paket de diyoruz. Adların değişmesini bir süs olarak görme: her kat bir öncekini yalnızca yük sayıyor. Başlık, o katın kendi hizmetini gerçeklemek için var. Bağ katmanı sararken başlığın yanına bir de kuyruk ekliyor; üstündeki katlarda böyle bir şey görmeyeceksin, onlar yalnızca başlık koyuyor.
Bu cümleyi tek bir denklemde toplayabilirsin. Üstten inen veriye o katın gözünden hizmet veri birimi (SDU) denir; kat kendi denetim bilgisini, yani protokol denetim bilgisini (PCI) ekler ve ortaya kendi protokol veri birimi (PDU) çıkar:
(N)-PDU = (N)-PCI + (N)-SDU ve (N)-PDU = (N−1)-SDUİkinci eşitlik kapsüllemenin tanımını veriyor: bir katın ürettiği paket, bir alttaki katın gözünde ham veriden başka bir şey değil. Taşımanın ürettiği segment ağ katmanının SDU’su, ağ katmanının ürettiği datagram bağ katmanının SDU’sudur. Zarfın içinde zarf tam olarak budur ve bir sonraki bölümde aynı işi bayt bayt sayacağız.
Bir yer daha var ve orada tek bir kat kendi içinde ikiye bölünmüş durumda. Bağ katmanı IEEE 802 ailesinde iki alt katmandan oluşuyor. Alttaki MAC alt katmanı hattı kimin ne zaman kullanacağına karar veriyor ve fiziksel adresi taşıyor; Ethernet’in ve Wi-Fi’ın farklı olduğu yer burasıdır. Üstteki LLC alt katmanı (IEEE 802.2) ise üst katmana tek tip bir yüz gösteriyor. Bölünmenin sebebini ekonomide bulacaksın: ağ katmanı, altında bakır mı radyo mu olduğunu umursamak zorunda kalmıyor. ağ kartı denetleyicisinin çipte gerçeklediği şey tam olarak MAC alt katmanıdır.
DerinleşmeBir hizmet çağrısı resmî olarak nasıl yazılır?
OSI hizmeti ne bir fonksiyon imzası ne bir API olarak tanımlar. Onun yerine dört soyut hizmet ilkeli kullanır ve bir hizmet çağrısını bu dördün dizilişiyle yazar.
| ilkel | kim çağırır | ne demek |
|---|---|---|
request | üstteki kat, gönderen uçta | “şu hizmeti başlat” |
indication | katman, alan uçtaki üstüne | “karşıdan böyle bir istek geldi” |
response | üstteki kat, alan uçta | “kabul ediyorum / şu cevabı ver” |
confirm | katman, gönderen uçtaki üstüne | “işlem sonuçlandı, sonucu bu” |
Bir bağlantı kurulumu bu dizilişle yazılır: CONNECT.request → (ağ) → CONNECT.indication → CONNECT.response → (ağ) → CONNECT.confirm. Dört ilkelin tamamı kullanılıyorsa hizmet onaylı, yalnızca ilk ikisi kullanılıyorsa onaysızdır. Veri gönderimi çoğu zaman onaysızdır: DATA.request gider, karşıda DATA.indication doğar, geriye bir şey dönmez.
Bu gösterimin bugünkü değeri iki tane. Birincisi, bir protokol belgesini okurken hizmetin tarifi ile mesajların tarifini birbirinden ayırmayı öğretiyor — ilki katmanın ne söz verdiği, ikincisi telde ne geçtiği. İkincisi, sözlüğün kendisi hâlâ dolaşımda: hücresel ağların 3GPP belgeleri bu dört ilkeli aynen kullanır, ve çekirdek ağın arayüz tanımları böyle yazılmıştır.
Somut bir karşılığını kendi makinende de görebilirsin. Bir sunucu soketinde listen() çağrısı katmanı hazır duruma sokar, karşıdan gelen SYN accept()’in dönmesiyle bir indication gibi yüzeye çıkar, accept()’in kendisi bir response gibi davranır ve istemci tarafındaki connect() çağrısının dönmesi bir confirmdir. Soket arayüzü OSI’nin sözlüğünü kullanmıyor ama aynı dört anı üretiyor.
Ayrımın en güzel sonucunu taşımada göreceksin. Taşımanın uygulamaya verdiği şeye mantıksal iletişim deniyor: iki makine doğrudan birbirine bağlıymış gibi görünüyor. Oysa arada yönlendiriciler var, ve paket anahtarlama her atlamada yeniden işliyor. Aynı datagram yol boyunca farklı bağ protokolleriyle taşınıyor. İlk atlamada onu Wi-Fi taşıyabiliyor, sonrakinde Ethernet; ikisi farklı hizmet veriyor ama datagram aradaki farkı hiç fark etmiyor.
Sınır bazen elle tutulur. Bağ katmanı çipte ya da ağ arayüz kartında gerçekleniyor, üstündeki katlar ise yazılım. Bakırdan radyoya geçtiğinde altındaki her şey değişiyor, MAC alt katmanı ise yerinde kalıyor.
Ortada neden tek bir protokol var?
Yığına yandan bakınca ortada bir daralma görüyorsun. Ağ katmanında tek bir protokol var: IP. Üstünde TCP, UDP, HTTP, SMTP ve QUIC yan yana yaşıyor. Altında Ethernet, Wi-Fi, Bluetooth ve PPP var, en altta da bakır, radyo ve fiber. Darlık yalnızca ortada, ve şekle bu yüzden kum saati deniyor.
Belin dar olmasının bedeli ağır. IP, İnternet’e bağlı milyarlarca cihazın her birinde gerçeklenmek zorunda. Karşılığında alınan şey de o kadar büyük: yeni bir bağ teknolojisi çıktığında yalnızca IP’yi taşıması yetiyor, üstündeki hiçbir protokolün haberi olmuyor.
Bunu yazıya döken belge RFC 1958 ve mimarinin üç köşe taşını sayıyor. Basit bağlanabilirlik, dar bel olarak IP, ve zekânın ağın kenarında durması. Aynı belge bir itirafı da taşıyor: mimari ilk 25 yıl boyunca hiç yazıya dökülmemişti.
Bel o günden beri kalınlaştı. Ağın içinde çalışan ara kutular araya girdi: adres çeviriciler, güvenlik duvarları, önbellekler. istek satırını okuyan bir ara kutu, tanımı gereği katman sınırını çiğniyor.
Katmanlamanın faturası
Buraya kadar hep kazancı saydım. Bedelini de saymak gerekiyor, çünkü üç kalemi var ve üçü de ölçülebilir.
Birinci kalem başlık. Her kat kendi başlığını ekliyor ve bu başlıklar veriye değil, katmanın kendi hizmetine ait. Tek bir HTTP yanıtının tam dolu bir çerçevesini say: 14 bayt Ethernet başlığı, 20 bayt IP, 20 bayt TCP, 4 bayt çerçeve sağlaması, telde ayrıca 8 bayt önsöz ve 12 bayt çerçeve arası boşluk. Toplam 78 bayt gider, 1.460 bayt veri taşınır. Telde harcanan 1.538 baytın %94,9’u işe yarıyor.
Şimdi aynı yığından tek bir tuş vuruşu geçir — uzak bir sunucuya bağlıyken bastığın bir harf. Veri 1 bayt. IP datagramı 41 bayta çıkıyor, çerçeve 59 bayt ediyor ve Ethernet’in 64 baytlık asgari çerçeve şartı yüzünden dolgu ile 64’e tamamlanıyor; telde 84 bayt. Bu kez işe yarayan oran %1,2.
Aynı yığın, aynı katmanlar, arada seksen kat fark. Katmanlamanın faturası sabit değil; paket küçüldükçe büyüyor. Protokollerin başlık sıkıştırmaya niçin bu kadar emek verdiğini bu iki sayı açıklıyor.
İkinci kalem tekrar. Aynı işin birden çok katta yapılması. Hata denetimini say: bağ katmanı çerçevenin tamamı için 4 baytlık bir CRC hesaplıyor, IPv4 kendi başlığı için ayrı bir sağlama tutuyor, TCP başlık ve veri için üçüncü bir sağlama üretiyor. Üç ayrı hesap, büyük ölçüde aynı baytların üstünde.
Gereksiz mi? Hayır, ve sebebi güzel. Uçtan uca bakınca yalnızca TCP’ninki zorunlu: veri ancak alıcı süreçte doğrulanırsa doğrulanmış sayılır, çünkü arada bozulma yalnızca telde değil bir yönlendiricinin belleğinde de olabilir. Alttaki ikisi zorunlu değil, erken. Bozuk bir çerçeveyi ilk atlamada atmak, onu kıtanın öbür ucuna taşıyıp orada attırmaktan ucuz. Buna rağmen IPv6 başlık sağlamasını tamamen kaldırdı — çünkü alttaki CRC yaygınlaştı ve o kalem artık kârını çıkarmıyordu. Bir katmanın işini gerçekten gereksiz kılan şey, ölçünün değişmesi oluyor.
Üçüncü kalem bilgi saklama ve en pahalısı bu. Bir katman altındakini bilmemeye söz verdiği için bazen yanlış karar veriyor. Klasik örneği TCP ile kablosuz: TCP paket kaybını tıkanıklık işareti sayar ve hızını keser. Oysa Wi-Fi’da bir çerçeve girişimden bozulmuş olabilir, yani ortada tıkanıklık yoktur. Bağ katmanı iki durumu ayırt edebilir ama TCP’ye söyleyecek bir kanalı yoktur; sözleşmede öyle bir alan yok. TCP hattı boş sanmayıp yavaşlar, ve boş hat boş kalır.
Bu üçüncü kalem, gerçek sistemlerin katman sınırını neden sürekli deldiğini de açıklıyor. Ağ kartının çerçeveleri işletim sistemi yerine kendisinin bölmesi, yönlendiricinin trafiği taşıma katmanı portlarına bakarak yollara dağıtması, tıkanıklığın kayıp yerine bir bit ile bildirilmesi — üçü de kasten yapılmış birer katman ihlali. Katmanlamayı bir yasa olarak değil, bir varsayılan olarak düşün; mühendislik de çoğu zaman o varsayılanın nerede bırakılacağına karar vermek anlamına geliyor.
Sınır kendi makinende nerede duruyor?
Katman sınırını kavramsal bir şey sanma; kendi makinende üç satırda görebilirsin.
$ ip -o link show wlp3s0
2: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... link/ether 00:00:5e:00:53:af
$ ip -o -4 addr show wlp3s0
2: wlp3s0 inet 192.0.2.37/24 brd 192.0.2.255 scope global wlp3s0
$ ss -tn state established
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 192.0.2.37:41320 203.0.113.9:443Aynı kartın üç ayrı adını görüyorsun. MAC adresi 48 bit tutuyor ve bu ağın dışında hiçbir yerde anlam taşımıyor. IP adresi 32 bit ve İnternet’in tamamında anlamlı. Port numarası 16 bit ve yalnızca senin makinende geçerli. İlk satırdaki mtu alanı da bir sözleşme: bağ katmanı üstündekine 1.500 bayttan fazlasını bir seferde taşımayacağını söylüyor. Üstteki katman buna uymak zorunda. IP’yi tanımlayan RFC 791’de başlık 20 bayt tutuyor, ve o yirmi bayt bu 1.500 baytın içinden çıkıyor.
Özet
Peki, ne öğrendik?
- Katman, altındakine dayanıp üstündekine söz veren bir kattır. Daha aşağısını bilmemesi bir eksik değil, tasarımın kendisidir.
- Katman sayısı modele göre değişir: OSI yedi, TCP/IP dört, ders kitaplarının çoğu beş sayar; sunum ile oturumun işini Internet yığınında uygulama üstlenir — sertifikanın ASN.1 kodlaması ve HTTP’nin
Rangebaşlığı bunun iki canlı örneğidir.- Dikey ilişkinin adı hizmet, yatay ilişkinin adı protokoldür. İkisi bağımsız değişkendir: aynı hizmeti TCP de QUIC de verir. Sözleşmenin somut karşılıkları port numarası ve Ethernet’in tür alanıdır.
- Kapsülleme tek satırlık bir denklemdir:
(N)-PDU = (N)-PCI + (N)-SDUve bir katın ürettiği paket, bir alttakinin gözünde ham veridir.- Katmanlamanın üç kalemlik bir faturası var: başlık yükü paket küçüldükçe %5’ten %99’a tırmanır, aynı iş birden çok katta tekrar edilir, ve bilgi saklama bazen yanlış karara yol açar.
- Kum saatinin beli tek bir protokolden ibarettir. IP’nin her cihazda bulunma zorunluluğu, üstündeki ve altındaki çeşitliliğin bedelidir.
Katmanları saydık, sınırlarını çizdik ve aralarındaki sözleşmenin adını koyduk. Geriye o sözleşmenin içeriği kalıyor: bir katman diğerine tam olarak ne veriyor?
18. bölüme devam et: Kapsülleme ve Başlıklar