Ana içeriğe geç

Bölüm 17:Katmanlı Mimari

17 dakikalık okumaGüncelleme:

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
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. Önbellek, Tazelik ve Güven
  6. Port Numarası ve Soket
  7. Bağlantısız Taşıma: UDP
  8. Üç Adımlı El Sıkışma
  9. Simetrik Şifreleme
  10. Açık Anahtarlı Kriptografi
  11. TLS El Sıkışması
  12. Sertifika Zinciri
  13. HTTP Mesajının Anatomisi
  14. Durum, Çerez ve Oturum
  15. HTTP/2'den HTTP/3'e
  16. İçerik Dağıtım Ağları
  17. Diğer Uygulama Protokolleri
  18. Katmanlı Mimari
  19. Kapsülleme ve Başlıklar
  20. Paket Yakalama ve Çözümleme
  21. Ağ Arayüz Kartı
  22. Fiziksel Adresleme
  23. Hata Sezme ve CRC
  24. Adres Çözümleme: ARP
  25. Anahtarlama ve Ortam Erişimi
  26. Ağ Topolojileri
  27. Sanal Yerel Ağlar
  28. Kablosuz Erişim: 802.11
  29. Radyo Kanalı ve Kapasite
  30. Kablosuz Ağ Güvenliği
  31. Hücresel Ağlar
  32. Spektrum ve Kuşaklar
  33. Hareketlilik ve Aktarma
  34. Adres Kiralama: DHCP
  35. Adresin Anatomisi
  36. Adres Tükenmesi ve IPv6
  37. Yönlendirici Mimarisi
  38. Kuyruk Yönetimi
  39. Cihaz Yapılandırma
  40. Yönlendirme Protokolleri
  41. Kontrol Düzlemi ve SDN
  42. Ağ İzleme ve Yönetimi
  43. Alanlar Arası Yönlendirme
  44. Adres Çevirisi
  45. Ara Kutular
  46. Tünelleme ve IPsec
  47. Güvenlik Duvarları
  48. Operatör ve Metro Ağları
  49. Bitten Sinyale
  50. Çoklama Teknikleri
  51. İletim Ortamları
  52. Kablo Sonlandırma
  53. Fiber Optik İletim
  54. Bakır Erişim Ağı: DSL
  55. Pasif Optik Ağlar
  56. Kablo Erişim Ağları
  57. Denizaltı Kabloları
  58. Veri Merkezi Ağları
  59. Kapsülleme Çözme
  60. Güvenilir Aktarım
  61. Tıkanıklık Denetimi
  62. Trafik Çözümleme
  63. Gecikme Bütçesi
  64. 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
Uygulamaiki uçtaki programın konuştuğu dili kurarHTTP, IMAP, SMTP, DNS
Taşımaveriyi bir süreçten karşıdaki sürece teslim ederTCP, UDP
datagrama yol seçer ve varışa kadar iletirIP, yönlendirme protokolleri
Bağveriyi yalnızca komşu düğüme kadar götürürEthernet, 802.11, PPP
Fizikselbiti 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.

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.

KatmanVeri parçasının adıBu katta duran cihazlarKarar verirken neye bakar
Uygulamaileti / verivekil sunucu, ters vekil, uygulama güvenlik duvarı, 7. katman yük dengeleyiciistek satırı, başlıklar, alan adı, yol
Sunumverişifreleme sonlandıran kutulargösterim ve kodlama
Oturumveriayrı bir kutusu yokkonuşma düzeni
Taşımasegment (TCP) / datagram (UDP)durum bilgili güvenlik duvarı, NAT, 4. katman yük dengeleyiciport numaraları ve bağlantı durumu
paketyönlendirici, 3. katman anahtar, temel güvenlik duvarıhedef IP adresi
Bağçerçeveanahtar, köprü, kablosuz access point (erişim noktası), ağ kartıhedef MAC adresi
Fizikselbithub, tekrarlayıcı, 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: 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.

KatmanVeri biriminin adı
Taşımasegment
datagram
Bağçerçeve
Fizikselbit

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.

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.indicationCONNECT.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: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: 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 Range baş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)-SDU ve 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