Bir laboratuvar föyündeki örnek çıktıda bir bilgisayar, yanındakine aynı küçük paketi iki kez gönderiyor. İlk cevap 2,76 milisaniyede geliyor. İkincisi 0,052 milisaniyede. Aynı kablo, aynı iki bilgisayar, aynı paket; ama ikinci deneme elli kattan hızlı.
Farkın sebebi, ilk paketin yolda bir soru sormak zorunda kalması: "Beni ne yapacaksın?" Bu sorunun cevabı ağın içindeki cihazlardan değil, ağın dışında çalışan bir yazılımdan geliyor. Yazılım tanımlı ağ denen yaklaşımın özü de bu.
Karar veren ile uygulayan
Klasik bir ağda her anahtar kendi başına düşünür. Hangi adresin hangi kapıda olduğunu kendisi öğrenir, paketi nereye göndereceğine kendisi karar verir. Beyin, her cihazın içine dağılmış durumdadır.
Yazılım tanımlı ağ bu iki işi birbirinden ayırıyor. Anahtar artık yalnızca bir tabloya bakıyor: "şu özellikteki paket gelirse şunu yap." Tabloyu dolduran, merkezde duran bir denetleyici; yani sıradan bir sunucuda çalışan bir program. İkisi arasındaki ortak dilin adı OpenFlow.
Tablodaki her satır üç parçadan oluşuyor: neye bakılacağı (paketin hangi kapıdan geldiği, hangi adrese gittiği), ne yapılacağı (hangi kapıdan çıkarılacağı, atılacağı ya da denetleyiciye sorulacağı) ve bir öncelik. Birden fazla satır eşleşirse önceliği yüksek olan kazanıyor.
Boş tablo, sessiz ağ
Bunu görmek için gerçek donanım gerekmiyor. Mininet adlı araç anahtarları, kabloları ve sunucuları tek bir bilgisayarın içinde sanal olarak kuruyor.
Üç bilgisayarlı, tek anahtarlı bir ağ kurulup hiçbir denetleyici başlatılmadığında, bir bilgisayardan ötekine gönderilen ping'e cevap gelmiyor. Anahtar arızalı değil. Tablosu boş ve soracak kimsesi yok.
Ardından tabloya elle iki satır yazılıyor: birinci kapıdan geleni ikinci kapıdan çıkar, ikinci kapıdan geleni birinciden çıkar. Aynı ping bu kez karşılık buluyor. Anahtar hiçbir şey öğrenmedi; yalnızca söyleneni yaptı.
Kuralların da bir ömrü var. Laboratuvarda kullanılan araçta elle yazılan satırlar, altmış saniye boyunca hiç paket görmezse varsayılan olarak siliniyor ve ping yeniden sessizleşiyor. OpenFlow burada iki süre tanımlıyor: boşta kalma süresi, yalnızca kural kullanılmadığı sürece işleyen bir saat; kesin süre ise dolduğunda kuralı ne kadar kullanılmış olursa olsun siliyor.
İlk paket neden yavaş?
Şimdi denetleyici devrede. Bir bilgisayar komşusuna ilk kez ping gönderdiğinde anahtarın tablosunda bu trafiğe uyan bir satır yok. Tabloda yalnızca en düşük öncelikli bir yedek kural duruyor: "hiçbir şey uymazsa denetleyiciye sor."
Anahtar paketin başını denetleyiciye yolluyor. Denetleyici paketin nereye gitmesi gerektiğine karar veriyor, anahtara yeni bir kural yazıyor ve bekleyen paketi de doğru kapıdan çıkarmasını söylüyor. İkinci paket geldiğinde kural zaten tabloda. Paket denetleyiciye hiç uğramadan, anahtarın içinden geçip gidiyor.
Denetleyici her paketi görmez. Bir akışın yalnızca ilk sorusunu duyar; gerisini anahtara bırakır.
İlk ping'deki 2,76 milisaniyenin büyük kısmı bu gidip gelmenin bedeli. Aslında ilk ping'den önce bir soru daha soruluyor: bilgisayar komşusunun donanım adresini bilmediği için önce herkese "bu adres kimin?" diye seslenen bir ARP isteği gönderiyor. O istek de aynı yoldan denetleyiciye gidiyor.
Anahtar ile denetleyici nasıl tanışıyor?
Anahtar açıldığında denetleyiciye bağlanıyor ve ikisi arasında kısa bir tanışma geçiyor. Wireshark ile yakalanan mesajlar bu konuşmayı adım adım gösteriyor.
| Mesaj | Yön | Ne işe yarıyor |
|---|---|---|
| HELLO | iki yönde | İkisi de desteklediği en yüksek sürümü bildiriyor; burada 0x04, yani OpenFlow 1.3. |
| FEATURES | soru ve cevap | Anahtar kimliğini ve kapasitesini bildiriyor: 256 arabellek, 254 tablo. |
| SET_CONFIG | denetleyiciden | Eşleşmeyen bir paketin kaç baytının yukarı gönderileceğini belirliyor: 128. |
| PORT_DESC | soru ve cevap | Anahtarın bütün kapılarının listesini istiyor. |
| PACKET_IN | anahtardan | "Bu paketi ne yapayım?" |
| FLOW_MOD | denetleyiciden | Tabloya kural ekliyor, değiştiriyor ya da siliyor. |
İlginç bir ayrıntı: anahtar, FLOW_MOD mesajını aldığını hiçbir zaman onaylamıyor. Sessizlik başarı demek; yalnızca bir şey ters gittiğinde hata mesajı dönüyor. Sürümler arasında da bir fark var: OpenFlow 1.0'da kapı listesi tanışmanın ilk cevabının içinde geliyordu, 1.3'te ayrı bir istekle alınıyor.
Denetleyici haritayı nasıl çıkarıyor?
Karar verebilmek için denetleyicinin ağın haritasını bilmesi gerekiyor: hangi anahtar hangisine, hangi kapıdan bağlı. Kimse bu haritayı ona elle vermiyor. Kendisi çıkarıyor, hem de basit bir yöntemle.
Denetleyici her anahtardan, her kapısından küçük bir çerçeve göndermesini istiyor. Çerçevenin üzerinde bir etiket var: "Ben şu anahtarın şu kapısından çıktım." Kablonun öbür ucundaki anahtar bu çerçeveyi tanımıyor, tablosunda bir kural bulamıyor ve çerçeveyi kendi bilgisini ekleyerek denetleyiciye yolluyor: "bu, benim şu kapıma geldi."
Denetleyici iki bilgiyi yan yana koyuyor ve bir kablo buluyor. Bunu bütün kapılar için tekrarladığında haritanın tamamı ortaya çıkıyor. Bu çerçevelerin dili LLDP. Ethernet tür alanında 0x88CC değerini taşıyorlar ve 01:80:C2:00:00:0E adresine gidiyorlar. Standart anahtarlar bu adrese gelen çerçeveleri başka yere aktarmıyor; etiket yalnızca bir kablo boyu yol alıyor ve karşıdaki anahtar onu denetleyiciye teslim ediyor.
TLV Etiketin üzerinde ne yazıyor?
LLDP çerçevesi küçük bilgi parçalarından oluşuyor; her birinde önce bilginin türü, sonra uzunluğu, sonra değeri yazıyor. Zorunlu olanlar anahtarın kimliği, kapının kimliği, bilginin ne kadar süre geçerli sayılacağı ve bir bitiş işareti. ONOS denetleyicisi buna BDDP adlı bir kardeş ekliyor: aynı fikir, ama herkese ulaşan yayın adresine gönderiliyor. Böylece arada OpenFlow konuşmayan eski bir anahtar olsa bile bağlantı fark ediliyor.
Bu keşif bir kez yapılıp bırakılmıyor, düzenli aralıklarla tekrarlanıyor; ONOS'ta varsayılan olarak üç saniyede bir. Aralığı kısaltmak, kopan bir kablonun daha çabuk fark edilmesi demek; ama ağa daha fazla denetim trafiği binmesi de demek. Uzatmak yükü hafifletiyor, karşılığında harita daha uzun süre eskimiş kalabiliyor.
Bir ağ nasıl bozulur?
Laboratuvarın en öğretici iki deneyi, ağı bilerek bozmak.
Birincisinde ucuz anahtarlar bir halka oluşturacak şekilde birbirine bağlanıyor ve hiçbiri döngüleri engelleyen protokolü çalıştırmıyor. Kurulum sırasında hiçbir hata görünmüyor. Sorun, ilk ping gönderildiğinde başlıyor.
Ping'den önceki ARP isteği herkese gönderilen bir yayın. Her anahtar onu geldiği kapı dışındaki bütün kapılardan çıkarıyor. Halkada çerçeve bir tur atıp başladığı yere dönüyor ve yeniden yayılıyor, her turda çoğalarak. Buna yayın fırtınası deniyor: bağlantılar dolup taşıyor, ping'ler cevapsız kalıyor.
Bir IP paketi her yönlendiriciden geçtikçe ömründen bir birim kaybeder ve sonunda ölür. Ethernet çerçevesinin böyle bir sayacı yoktur; bir döngüye girdiğinde sonsuza kadar dolaşır.
Gerçek ağlarda bunu yayılan ağaç protokolü önlüyor. Radia Perlman'ın 1985'te tanımladığı yöntem, fazla bağlantıların bir kısmını kapatarak halkayı bir ağaca çeviriyor; yedek kablolar yerinde duruyor ama biri kopana kadar kullanılmıyor.
İkinci deney bir veri merkezinin düzenini taklit ediyor. En üstte tek bir çekirdek anahtar, onun altında toplama anahtarları, onların altında raf anahtarları, en altta sunucular. Her katman n dala ayrılıyor; n ikiyse ağda yedi anahtar ve sekiz sunucu oluyor, dörtse yirmi bir anahtar ve altmış dört sunucu.
Her şey çalışırken bütün sunucular birbirine ulaşıyor. Sonra çekirdek anahtar durduruluyor. Ağ ikiye bölünüyor: aynı toplama anahtarının altındaki dört sunucu hâlâ birbiriyle konuşabiliyor, çünkü yolları çekirdekten geçmiyor. Ama bir yarıdan öbür yarıya hiçbir paket geçemiyor. Sekiz sunucu arasındaki elli altı olası yönün otuz ikisi kopuyor.
Ağaç düzeninin zayıf noktası tam burada: kökte tek bir cihaz var ve o giderse ağ adalara ayrılıyor. Büyük veri merkezleri bu yüzden birden fazla çekirdekle ve katmanlar arasında yedek yollarla kuruluyor.
Merkezde tek bir beyin iyi bir fikir mi?
Kararları merkezde toplamanın açık kazançları var. Denetleyici bütün ağı tek bir yerden görüyor. Yeni bir davranış istendiğinde cihazlara tek tek girmek yerine bir program değiştiriliyor. Trafik, ağın tamamı göz önünde tutularak yönlendirilebiliyor.
Aynı merkeziyet yeni bir soru da doğuruyor. Çekirdek anahtar deneyinde görülen tek hata noktası bu kez yazılım tarafında beliriyor: denetleyiciye ulaşılamazsa yeni akışlar için kimse karar veremiyor. Gerçek kurulumlarda denetleyiciler bu yüzden birbirinin yedeği olan birden çok sunucuda çalışıyor.
Ölçeğin de bir sınırı var. Tek bilgisayarda kurulan bir ağ kavramları olduğu gibi gösteriyor, ama gerçek bir veri merkezinin gecikmesini, trafiğini ve arızalarını göstermiyor. Buradaki süreler gerçek kablolarda neler olacağının değil, mekanizmanın nasıl işlediğinin ölçüsü.
Bu yazı neye dayanıyor?
Yazı, Zhipeng Wang'ın Université d'Évry Paris-Saclay'de Bilgisayar ve Ağ Sistemleri yüksek lisansında izlediği yazılım tanımlı ağlar dersinin ikinci laboratuvar çalışmasına dayanıyor. Ping süreleri ve OpenFlow mesajlarındaki değerler laboratuvar föyündeki örnek çıktılardan alınmıştır.
- McKeown ve ark., OpenFlow: Enabling Innovation in Campus Networks, ACM SIGCOMM Computer Communication Review, 2008.
- Lantz, Heller, McKeown, A Network in a Laptop: Rapid Prototyping for Software-Defined Networks, HotNets, 2010.
- Open Networking Foundation, OpenFlow Switch Specification, Version 1.3.0, 2012.
- IEEE 802.1AB, Station and Media Access Control Connectivity Discovery.
- Perlman, An Algorithm for Distributed Computation of a Spanning Tree in an Extended LAN, SIGCOMM, 1985.