Ana içeriğe geç

Bölüm 43: Kontrol Düzlemi ve SDN

9 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak kitabının bir bölümü: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine inip karşı taraftan geri dönen uzun bir teknik yolculuk.

Kısım 6: Router'dan Router'a (Bölüm 37-44)

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. DNS Kayıtları
  6. Önbellek, Tazelik ve Güven
  7. Port Numarası ve Soket
  8. Bağlantısız Taşıma: UDP
  9. Üç Adımlı El Sıkışma
  10. Simetrik Şifreleme
  11. Açık Anahtarlı Kriptografi
  12. TLS El Sıkışması
  13. Sertifika Zinciri
  14. HTTP Mesajının Anatomisi
  15. Durum, Çerez ve Oturum
  16. HTTP/2'den HTTP/3'e
  17. İçerik Dağıtım Ağları
  18. Diğer Uygulama Protokolleri
  19. Katmanlı Mimari
  20. Hizmet ve Protokol
  21. Encapsulation ve Başlıklar
  22. Paket Yakalama ve Çözümleme
  23. Ağ Interface Kartı
  24. Fiziksel Adresleme
  25. Hata Sezme ve CRC
  26. Adres Çözümleme: ARP
  27. Ortam Erişimi: CSMA/CD
  28. Switch'ler
  29. Ağ Topolojileri
  30. Sanal Yerel Ağlar
  31. Kablosuz Erişim: 802.11
  32. Radyo Kanalı ve Kapasite
  33. Kablosuz Ağ Güvenliği
  34. Hücresel Ağlar
  35. Spektrum ve Kuşaklar
  36. Hareketlilik ve Aktarma
  37. Adres Kiralama: DHCP
  38. Adresin Anatomisi
  39. Adres Tükenmesi ve IPv6
  40. Router Mimarisi
  41. Kuyruk Yönetimi
  42. Cihaz Yapılandırma
  43. Routing Protokolleri
  44. Kontrol Düzlemi ve SDN
  45. Ağ İzleme ve Yönetimi
  46. Alanlar Arası Routing
  47. Adres Çevirisi
  48. Ara Kutular
  49. Tünelleme ve IPsec
  50. Firewall'lar
  51. Ağ Saldırıları
  52. Operatör ve Metro Ağları
  53. Bitten Sinyale
  54. Sembol Hızı ve Kanal Kapasitesi
  55. Multiplexing Teknikleri
  56. İletim Ortamları
  57. Bakır Kablo Sonlandırma
  58. Fiber Sonlandırma
  59. Fiber Optik İletim
  60. Bakır Erişim Ağı: DSL
  61. DSL'de Hız ve Mesafe
  62. Pasif Optik Ağlar
  63. Kablo Erişim Ağları
  64. Kablo Modem ve CMTS
  65. Denizaltı Kabloları
  66. Veri Merkezi Ağları
  67. Encapsulation Çözme
  68. Güvenilir Aktarım
  69. Tıkanıklık Denetimi
  70. Trafik Çözümleme
  71. Gecikme Bütçesi
  72. Soket Programlama
  73. Eşten Eşe ve Protokol Tasarımı
  74. Uyarlanır Video Akışı
  75. Gerçek Zamanlı Ses ve Görüntü
  76. Kablosuz Sensör Ağlarının Mimarisi
  77. Sensör Ağlarında Ortam Erişimi
  78. Sensör Ağlarında Yönlendirme ve IP
  79. Zaman Eşitleme ve Konum Bulma
  80. Sensör Ağı Uygulamaları
  81. Mobil Kablosuz Sensör Ağları
  82. Son Söz

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?

44. bölüme devam et: Ağ İzleme ve Yönetimi