Ana içeriğe geç

Bölüm 36:Yönlendirici Mimarisi

11 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

Yolun tamamını bilen bir makine yok. Paketi alan yönlendirici yalnızca bir sonraki adımı biliyor ve kararını o adımda veriyor.

Bu kutuyu şimdiye kadar kapalı tuttum. Kapağını açıyorum: içeride hedefi arayan bir tablo, portları birbirine bağlayan bir doku ve nanosaniyeyle ölçülen bir bütçe var. Karar bu kadar hızlı nasıl çıkıyor?

Yönlendirici içeride kaç iş yapıyor?

Ağ katmanının iki ayrı işi var. Tek bir paketi doğru kabloya itmeye iletme, o kabloyu söyleyen tabloyu doldurmaya yönlendirme demiştim; ikisi kutunun içinde ayrı yerlerde yaşıyor. İletme her kutuda ayrı koşan veri düzleminin işi, yönlendirme ağ çapında çalışan kontrol düzleminin. Bu bölümün konusu birincisi.

Kapağı kaldırdığında dört parça görüyorsun: giriş portları, yüksek hızlı bir anahtarlama dokusu, çıkış portları ve bir yönlendirme işlemcisi. Doku, giriş portlarını çıkış portlarına bağlayan iç ağdır.

Aradaki hız farkı altı basamak. İletme donanımda yapılır ve nanosaniye ölçeğinde çalışır; yönlendirme ile yönetim yazılımdır ve milisaniye ölçeğinde çalışır.

Nanosaniye ölçeği somut bir bütçe demek. En küçük Ethernet çerçevesinin telde gibi 84 bayt yer kapladığını hatırla. 10 Gbit/s’lik bir hatta bu çerçevelerden tam yükte saniyede yaklaşık 14,9 milyon tanesi geçiyor. Paket başına işlem bütçesi 67 ns. Giriş portunun hedefi işini hat hızında bitirmektir; yetişemezse tampon dolar ve paket düşer. Yönlendiricinin içindeki bütün tasarım baskısı bu tek cümleden çıkıyor.

Bütçenin içine sabit bir iş de giriyor. IPv4 başlığındaki alanları tek tek adlandırmıştım; TTL o başlığın 8 bitlik alanıydı. Datagram her yönlendiriciden geçtiğinde bu sayaç bir azalır, sıfırlandığında da atılır. Böylece hiçbir datagram sonsuza dek dolaşamaz. TTL her atlamada değiştiği için 16 bitlik başlık sağlaması da yeniden hesaplanmak zorunda.

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

Yönlendirme tablosundaki her satır dört şey taşır: ağ hedefi, alt ağ maskesi, bir sonraki durak ve çıkış arayüzü. Ağ hedefi tek başına kullanılmaz; satırı bir öneke çeviren şey yanındaki maskedir.

Maske bir adresi ağ ve makine parçasına bölüyor, CIDR yazımı da önek uzunluğunu taşıyordu. Tablo aynı ayrımı kullanıyor: her hedef ağ için bir satır vardır, her hedef makine için değil. Datagram hedef ağa bağlı yönlendiriciye ulaştığında dağıtımı o yapar.

Tablonun ilk satırlarını ise kimse yazmamıştır. Yönlendiricinin bir ağa fiziksel olarak bağlı arayüzü varsa o ağa nasıl ulaşacağını zaten bilir; bunlara doğrudan bağlı yollar denir.

Aynı hedefe birden çok satır çıkarsa aradaki farkı metrik açar. Metrik bir yolun kullanım maliyetidir ve genelde atlama sayısıdır. Aynı kaynaktan gelen iki satırı en düşük metrik ayırır; farklı kaynaklardan gelenlerin nasıl elendiğini birazdan göreceğiz.

Bir de her adrese uyan bir satır var. Varsayılan yol, hedefi ve maskesi 0.0.0.0 olan satırla yazılır. Maskesi sıfır olduğu için hiçbir bit eşleşmesi aramaz; önek uzunluğu da sıfırdır. Makinenin varsayılan geçide neden yöneldiğini biliyorsun; ev yönlendiricisinin tablosundaki karşılığı tam olarak bu satır.

Aslında ortada iki tablo var ve adları ayrı. Yönlendirme protokollerinin öğrendiği her şeyin toplandığı, aday yolların yan yana durduğu tabloya RIB deniyor. Karar verilip donanıma indirilen, iletmenin gerçekten baktığı sadeleşmiş kopyaya ise FIB. RIB yazılımda yaşıyor ve büyük olabilir; FIB donanımda duruyor ve her paket için nanosaniyeler içinde okunmak zorunda.

Gerçek bir tablo çıktısında her satırın başında kaynağını söyleyen bir harf durur. C doğrudan bağlı, S elle yazılmış statik demektir. R ve O ise yönlendirme protokollerinden öğrenilmiş satırlardır. Bu satırların oraya nasıl geldiğini burada bırakıyorum; yönlendiricilerin aynı haritada nasıl yakınsadığını birazdan göreceğiz.

Gerçek bir tablo neye benziyor?

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

Gateway of last resort is 203.0.113.2 to network 0.0.0.0

      192.0.2.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.0.2.0/24 is directly connected, GigabitEthernet0/0
L        192.0.2.1/32 is directly connected, GigabitEthernet0/0
      203.0.113.0/30 is subnetted, 1 subnets
C        203.0.113.0/30 is directly connected, Serial0/0/0
S     198.51.100.0/24 [1/0] via 203.0.113.2
O     10.20.0.0/16 [110/65] via 203.0.113.2, 00:14:22, Serial0/0/0
S*    0.0.0.0/0 [1/0] via 203.0.113.2

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

harfkaynakyönetimsel uzaklık
Cdoğrudan bağlı ağ0
Larayüzün 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 yönetimsel uzaklık, sağdaki metrik. İkisini karıştırmak yaygın bir hata. Yönetimsel uzaklık kaynaklar arasında seçim yapar — aynı ağa hem statik hem OSPF yol geldiyse statik kazanır, çünkü 1 < 110. Metrik ise aynı kaynağın iki yolu arasında seçim yapar. Uzaklık eşit değilse metriğe hiç bakılmaz.

S* satırındaki yıldız o yolun son çare geçidi olduğunu, yani hiçbir satır tutmazsa paketin oraya gideceğini işaretliyor.

L satırı ilk bakışta gereksiz görünüyor: 192.0.2.1/32 zaten 192.0.2.0/24 içinde. Ama ikisi farklı iş yapıyor. /24 satırı “bu ağa çerçeve yazabilirim” derken, /32 satırı “bu adres benim, paketi yukarı ver” diyor. En uzun önek eşleşmesi ikisini kendiliğinden ayırıyor.

Aynı tablonun Linux’taki hâli daha az süslü ama aynı bilgiyi taşıyor:

$ ip route
default via 203.0.113.2 dev eth1 proto static metric 100
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1
198.51.100.0/24 via 203.0.113.2 dev eth1 proto static
203.0.113.0/30 dev eth1 proto kernel scope link src 203.0.113.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 arayüz değil. Yönlendirici o paketi kabloya koyabilmek için hangi arayüzden çıkacağını bilmeli, ve bunu ancak 203.0.113.2 adresini tabloda ikinci kez arayarak bulabilir. İşlemin adı özyinelemeli arama.

İkinci arama 203.0.113.0/30 satırına düşüyor, o satır Serial0/0/0 diyor, iş bitiyor. Zincirin doğrudan bağlı bir satırda bitmesi şart; bitmezse yol etkin değil sayılır ve tabloya hiç yazılmaz.

Bunun çok somut bir arıza karşılığı var. Statik bir yol yazdın, komutu kabul edildi, ama show ip route çıktısında satır görünmüyor. Sebebi neredeyse her zaman budur: yazdığın bir sonraki durak adresi, tabloda çözülemiyor. Satır yanlış değil, ulaşılamaz.

Zincirin son halkasında bir arama daha var ve o artık üçüncü katmanda değil. Çıkış arayüzü ile bir sonraki durağın IP adresi belli; kabloya yazılacak çerçevenin hedef MAC adresi ise belli değil. Komşunun donanım adresini soran mekanizma tanıdık. Tek bir paketin iletilmesi bu yüzden üç ayrı aramadan geçiyor: hedef için önek eşleşmesi, bir sonraki durak için özyinelemeli arama, ve komşu için adres çözümlemesi.

Tablo yalnızca yönlendiricilere ait bir şey de değil. Az önce andığım default gateway, ev makinesinde de böyle bir tablonun ilk satırında duruyor.

Aynı adrese üç satır uyuyorsa hangisi kazanır?

Arama merkezde yapılmaz. İletme tablosunun bir kopyası her giriş portunda durur ve port, başlık alanlarına bakıp çıkış portunu kendi başına bulur. Buna merkezsiz anahtarlama denir. Merkezî tek bir arama birimi olsaydı bütün portlara aynı 67 ns’lik bütçeyle yetişmek zorunda kalırdı. Darboğaz hesap değil, tabloya bakma hızıdır. Tabloyu her porta kopyalamak, tek bir birimi N kat hızlandırmaktan ucuza geliyor.

Bir taşıyıcı yönlendiricinin 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ı tek cümleye sığıyor. Verilen bir hedef adres için tabloda bakarken, adrese uyan öneklerin en uzunu seçilir. Buna en uzun önek eşleşmesi deniyor ve birden çok satırın uyması normaldir. Kazanan, daha çok bit sabitleyen satırdır.

Dört satırlık bir tabloyla bakalım:

önekkapsadığı adresçıkış arayüzü
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 sekizli 170, ikili yazımla 10101010; /25 maskesiyle VE işleminin sonucu 128, /27 maskesiyle 160 çıkar ve ikisi de kendi satırının değeriyle tutar. En uzun önek /27 olduğu için paket üçüncü arayüze gider.

Hedef 203.0.113.140 için sonuç değişir: son sekizli /27 maskesinden geçince 128 çıkar ve satırın 160’ıyla tutmaz, o yüzden kazanan /25 olur. 203.0.113.5 için geriye yalnızca /24 kalır. 198.51.100.7 için hiçbir özgül satır tutmaz ve varsayılan satır devreye girer.

Her ek önek biti kapsanan adres sayısını yarıya indiriyor. Tablo adres aralıklarıyla kurulsaydı, bir aralığın ortasındaki küçük bir kümeyi başka porta göndermek için aralığı parçalara bölmen gerekirdi. En uzun önek eşleşmesi bu bölmeyi gereksiz kılıyor. Özel durumu daha uzun bir önekle yazarsın; genel kural olduğu yerde kalır.

Bir adresin tablodaki hangi satırlara uyduğunu, hangisinin kazandığını izleyelim:

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ü arayüzeş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 üç sekizlisi satırınkiyle aynı, yani /24 öneki eşleşiyor. Bu satır tek başına kalsaydı paket birinci arayüzden çıkacaktı.
  3. İkinci satır da tutuyor. Son sekizli 170, ikili yazımla 10101010. /25 maskesiyle VE işleminin sonucu 128 ve satırın kendi değeriyle aynı; aday sayısı ikiye çıkıyor.
  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ü arayüze veriliyor. Alttaki varsayılan satır bu adrese de uyuyordu, ama uzunluğu sıfır olduğu için her yarışı kaybediyor.

Kural belli, ama bütçe hâlâ 67 ns. Tabloda binlerce satır var ve her biri için bir maskeleme, bir karşılaştırma gerekiyor. Bunları tek tek yapmak o bütçeye sığmıyor; sığdıran şey belleğin türü oluyor. En uzun önek eşleşmesi genellikle üçlü içerik adresli bellek ile yapılır. Sıradan bellekte adres verip içerik alırsın; burada içerik verip adres alırsın. Üçlü olmasının sebebi her bitin üç durum taşıyabilmesi: 0, 1 ve umursama. Maskenin donanımdaki karşılığı tam olarak o üçüncü durum. Adresi verdiğinde bütün satırlar aynı anda karşılaştırılır ve cevap tek saat çevriminde çıkar.

Bunun bir bedeli var. Bütün satırları aynı anda karşılaştırabilmek için her satır kendi karşılaştırıcısını taşımak zorunda. Bu yüzden üçlü bellek sıradan bellekten pahalıdır ve her aramada daha çok güç harcar. Fatura satır başına yazılıyor: tablo büyüdükçe kutu da pahalılaşıyor.

Kuralın bir de sınırı var: geleneksel iletme yalnızca hedef adrese bakar, oysa karar başlıktaki başka alanlara da bağlanabilir. Bu genişlemeyi, kontrol düzlemi kutudan söküldüğünde akış kurallarıyla birlikte açacağız.

Paketi çıkışa kim taşıyor?

Anahtarlama hızı, paketlerin girişlerden çıkışlara aktarılabildiği hızdır ve genellikle hat hızının katı olarak ölçülür. N girişli bir yönlendiricide istenen değer hat hızının N katıdır. Dokunun üç ana türü var.

Birincisi bellek üzerinden anahtarlama. İlk kuşak yönlendiriciler sıradan bilgisayarlardı; anahtarlama doğrudan işlemcinin denetimindeydi ve paket sistem belleğine kopyalanıyordu. Her datagram veri yolunu iki kez geçtiği için hızı bellek bant genişliği sınırlıyordu.

İkincisi ortak veri yolu üzerinden anahtarlama. Darboğaz yolun kendisidir: aynı anda tek paket geçebildiği için hız veri yolunun bant genişliğine takılır; buna yol çekişmesi denir. Örnek bir erişim yönlendiricisinde bu tavan 32 Gbit/s’lik bir veri yoludur.

Üçüncüsü ara bağlantı ağı. Büyük bir anahtar, daha küçük anahtarların birkaç aşamasından kurulur; çapraz çubuk ve Clos ağları bu aileye girer. Fikir de yeni değildir, önce çok işlemcili bilgisayarlarda işlemcileri birbirine bağlamak için geliştirilmişti.

Paralelliği kullanmanın bir bedeli var. Datagram girişte sabit uzunlukta hücrelere bölünür, hücreler dokudan geçirilir ve çıkışta yeniden birleştirilir. Doku değişken boyutlu paketi değil, eşit boyda parçaları taşıyor.

Ölçeklenmenin yolu ise dokuyu çoğaltmak. Örnek bir taşıyıcı yönlendiricinin temel birimi 8 anahtarlama düzlemi. Her düzlem üç aşamalı bir ara bağlantı ağı; toplam kapasite yüzlerce Tbit/s’ye çıkıyor.

Kuyruk kutunun neresinde oluşuyor?

Kuyruk kutunun içinde iki ayrı noktada birikebilir ve ikisinin sebebi ayrıdır.

Doku, giriş portlarının toplamından yavaşsa kuyruk giriş tarafında oluşur ve tampon taşarsa gecikme ile kayıp doğar. Bir de çıkış portu çekişmesi var: aynı çıkışa giden iki datagramdan yalnızca biri aktarılabilir, öbürü bekler.

Bekleyen paket kuyruğun önündeyse arkasındakileri de durdurur. Baş engellemesini uygulama katmanında görmüştün; burası aynı kusurun donanımdaki karşılığı. Öndeki paket başka bir çıkış için beklerken, arkasındakinin gideceği çıkış çoktan boşalmış olabilir. Yine de kımıldayamaz.

Çıkış tarafındaki kuyruğun sebebi bunun tersi. Doku hattan hızlı çalışıyorsa datagramlar çıkış portuna, hattın iletim hızından daha hızlı gelir. Orada biriken şey bu hız farkının kendisi.

Tampon dolduğunda iş politikaya dönüşüyor. Hangi datagramın atılacağı bir düşürme politikasıdır. Hangi paketin sıradaki olarak gönderileceği ise ayrı bir zamanlama disiplinidir. İkisini de bir sonraki durakta açacağız.

Gecikmenin dört bileşenini ayırmış, kuyruk gecikmesini tek başına bırakmıştık. Artık o kuyruğun fiziksel yerini biliyorsun. Paketin başına gelen şey yolun uzunluğu değil, bu kutunun içindeki doluluk.

Özet

Peki, ne öğrendik?

  • İletme yerel bir iştir: karar tek bir kutunun içinde, giriş portuna gelen datagramın hangi çıkışa verileceği sorusuyla sınırlıdır.
  • Arama girişte yapılır: tablonun kopyası her giriş portunda durduğu için port, eşleştir ve uygula adımlarını merkeze sormadan yürütür.
  • En uzun önek kazanır: aynı adrese birden çok satır uyabilir ve seçilen, daha çok bit sabitleyen satırdır; varsayılan satır sıfır bitle her yarışı kaybeder.
  • Yönetimsel uzaklık ile metrik ayrı işler yapar: ilki hangi kaynağa güvenileceğini, ikincisi aynı kaynağın hangi yolunun kısa olduğunu seçer.
  • Tek bir paket üç arama gerektirir: hedef için önek eşleşmesi, bir sonraki durak için özyinelemeli arama, komşunun donanım adresi için de adres çözümlemesi.
  • Doku hattan hızlı olmak zorundadır: N girişli bir kutuda istenen anahtarlama hızı hat hızının N katıdır ve bu hız ancak paralel bir iç ağla kurulur.
  • Kuyruk kutunun içinde doğar: doku yavaşsa girişte, hat yavaşsa çıkışta birikir ve baş engellemesi boş bir çıkışı bile bekletebilir.

Yönlendirici hedefi buldu, paketi doğru çıkışa verdi ve orada bir kuyruk buldu. Ama o kuyrukta bekleyen tek paket değil: aynı anda gelen bin paketten hangisinin önce çıkacağına hâlâ birileri karar veriyor. O kararı kim veriyor ve hangi ölçüye göre?

37. bölüme devam et: Kuyruk Yönetimi