Bir ağda yapılacak bir değişikliği denemenin en kötü yeri, o ağın kendisi. Yanlış bir kural bütün bir binayı internetsiz bırakabilir. Gerçek anahtarlar, kablolar ve sunucularla ayrı bir deneme ağı kurmak ise pahalı ve yavaş.
Mininet bu soruna şaşırtıcı derecede basit bir cevap veriyor: ağı tek bir bilgisayarın içine kurmak. Üstelik oyuncak bir benzetim olarak değil; gerçek ağlarda da kullanılan anahtar yazılımıyla, gerçek bir denetleyiciyle ve bilgisayarda çalışabilen her programla.
Sanal sunucu aslında bir işlem
Mininet'teki her "sunucu", işletim sisteminin sıradan bir işlemi. Onu ayrı bir bilgisayar gibi davranmaya iten şey, Linux'un ağ ad alanı denen özelliği.
Ağ ad alanı Kendi ağını gören bir işlem
Bir ağ ad alanının içindeki işlem yalnızca kendisine verilen ağ arabirimlerini, kendi adres tablosunu ve kendi yönlendirme kurallarını görür. Dışarıdaki ağ ayarlarından habersizdir. İki işlem aynı bilgisayarda çalışsa bile, ağ açısından iki ayrı makine gibi görünür.
Bunu görmek kolay. Sanal sunuculardan birinde arabirimleri listelediğinizde yalnızca iki tane çıkıyor: sanal ağ kartı ve kendi geri döngü arabirimi. Ana sistem o sanal kartı görmüyor. Anahtar ise varsayılan olarak ana ad alanında çalışıyor; onun penceresinde bilgisayarın bütün arabirimleri, dış dünyaya açılan bağlantı dahil, görünüyor.
Ama ayrılan yalnızca ağ. Sanal sunucuda çalışan işlemleri listelediğinizde, anahtarın penceresindekiyle birebir aynı liste çıkıyor. Dosyalar da ortak. Bu bir kusur değil, işin güzel yanı: bilgisayarda çalışan her program sanal sunucuda da çalışıyor. Birinde basit bir web sunucusu başlatıp ötekinden sayfayı indirmek, gerçek iki makine arasında yapılacak olanla aynı.
Tek komutla bir ağ
En küçük ağ hiçbir ayar verilmeden açılıyor: bir anahtar, iki sunucu ve bir denetleyici. Yani bilgisayarda çalışan dört ayrı işlem.
Daha büyüğü için hazır kalıplar var. single tek bir anahtara istediğiniz sayıda sunucu bağlıyor, yıldız gibi. linear anahtarları zincir gibi uç uca diziyor ve her birine bir sunucu takıyor. tree kök, dal ve yapraklardan oluşan bir ağaç kuruyor. Bunların hiçbiri yetmezse, bir Python dosyasında anahtarları, sunucuları ve bağlantıları tek tek tanımlayıp kendi düzeninizi çiziyorsunuz.
Kurulan ağın gerçekten çalışıp çalışmadığına bakmanın en hızlı yolu pingall: her sunucu her sunucuya bir ping gönderiyor ve sonuç tek satırda özetleniyor.
Kablodaki konuşmayı dinlemek
Sanal ağın içindeki trafik gerçek trafik olduğu için Wireshark ile yakalanabiliyor. OpenFlow süzgeci açıkken bir sunucudan ötekine ilk ping gönderildiğinde, anahtar ile denetleyici arasındaki konuşma ekrana dökülüyor.
Önce gönderen sunucu, karşıdakinin donanım adresini öğrenmek için herkese bir ARP isteği yolluyor. Anahtar bu paketi ne yapacağını bilmediği için denetleyiciye soruyor. Denetleyici paketin bütün kapılardan yayılmasını söylüyor. Cevap geldiğinde o da denetleyiciye uğruyor ve denetleyici bu kez anahtara bir kural yazıyor. Ardından asıl ping aynı yolu izliyor.
Aynı ping tekrarlandığında süre yüz mikrosaniyenin altına iniyor. Kurallar artık anahtarın tablosunda; denetim trafiği hiç oluşmuyor, paketler doğrudan geçiyor.
İlk ping bir soru, ikincisi bir alışkanlık. Aradaki fark, anahtarın tablosuna yazılmış tek bir satır.
Gecikmeyi elle ayarlamak
Sanal kabloların hızı sınırsız değil; istenen değere ayarlanabiliyor. Her bağlantıya bant genişliği ve gecikme verilebiliyor. Bunu Linux'un trafik denetimi aracı yapıyor: paketleri belirtilen süre bekletiyor, belirtilen hızın üstüne çıkmalarına izin vermiyor.
Bütün bağlantılara 10 milisaniye gecikme verildiğinde, iki sunucu arasındaki ping'in yaklaşık 40 milisaniye sürmesi bekleniyor. Hesap basit: istek önce sunucudan anahtara, sonra anahtardan öbür sunucuya giderken iki bağlantı geçiyor; cevap da geri dönerken aynı iki bağlantıyı geçiyor. Dört geçiş, her biri 10 milisaniye.
Aynı mantık karışık düzenlere de uygulanıyor. Laboratuvarın bir düzeninde yalnızca bir bağlantı 10 megabit ve 50 milisaniye olarak ayarlanıyor, sunuculardan birinin işlemci payı da yüzde yirmiyle sınırlanıyor. O bağlantı üzerinden giden bir ping'in 100 milisaniye civarında sürmesi bekleniyor: istek gidişte, cevap dönüşte yavaş bağlantıyı birer kez geçiyor. İşlemci sınırı ise ping gibi hafif bir işi değil, işlemciyi yoran programları yavaşlatıyor.
Kablo çekmeden arıza çıkarmak
Gerçek bir ağda bir kablonun kopmasını denemek için kabloyu çekmek gerekir. Mininet'te tek bir komut yetiyor: bir anahtar ile bir sunucu arasındaki bağlantı kapatılıyor, sanal kablonun iki ucu birden düşüyor.
O anda anahtar, denetleyiciye kapılarından birinin durumunun değiştiğini bildiren bir mesaj gönderiyor. Bağlantı yeniden açıldığında aynı bildirim tekrar geliyor. Bir ağın arızaya nasıl tepki verdiği, hiçbir donanıma dokunmadan ve istenildiği kadar tekrarlanarak inceleniyor.
Okunur adresler Küçük bir ayrıntının büyük faydası
Mininet her açılışta sanal ağ kartlarına f6:9d:5a:7f:41:42 gibi rastgele donanım adresleri veriyor. Ağ her yeniden kurulduğunda adresler değiştiği için, yakalanan trafikte hangi paketin hangi sunucudan geldiğini izlemek zorlaşıyor. Tek bir seçenekle adresler 00:00:00:00:00:01 gibi sıralı ve IP adresiyle eşleşen değerlere dönüşüyor: 10.0.0.1 adresli sunucunun donanım adresi 01 ile bitiyor.
Bir dizüstü bilgisayar neyi gösteremez?
Mininet'in gücü, bir ağın mantığını gerçeğe bu kadar yakın göstermesinde. Aynı anahtar yazılımı, aynı OpenFlow mesajları, aynı programlar. Mininet'te geliştirilen bir denetleyici, değiştirilmeden gerçek OpenFlow anahtarlarına bağlanabiliyor.
Gösteremediği şey ise donanımın kendisi. Bütün sanal sunucular ve anahtarlar aynı işlemciyi paylaşıyor; ağ büyüdükçe ya da trafik ağırlaştıkça bilgisayar darboğaz haline geliyor. Gecikmeler kablonun fiziğinden değil, verilen ayardan geliyor. Buradaki sayılar bir ağın ne kadar hızlı olacağının değil, nasıl davranacağının ö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 ilk laboratuvar çalışmasına dayanıyor. Ping süresi ve adres örnekleri laboratuvar föyünden alınmıştır; 40 ve 100 milisaniyelik değerler föydeki bağlantı ayarlarından hesaplanmıştır.
- Lantz, Heller, McKeown, A Network in a Laptop: Rapid Prototyping for Software-Defined Networks, HotNets, 2010.
- McKeown ve ark., OpenFlow: Enabling Innovation in Campus Networks, ACM SIGCOMM Computer Communication Review, 2008.
- Pfaff ve ark., The Design and Implementation of Open vSwitch, NSDI, 2015.
- Hemminger, Network Emulation with NetEm, linux.conf.au, 2005.
- Linux man-pages, network_namespaces(7).