Linux ile Trafik Kontrolü
Linux ile Trafik Kontrolü temel yapı taşları şunlardır;
Shaping (Şekillendirme)
Shaper’lar paketleri belirli bir rate’i (hızı, genellikle saniyede gönderilen Byte/KByte vs. cinsinden ifade edilir) sağlamak için bekletirler. Gönderilen paketler gidiş sırasına alınır, ve burada gerekirse, saniyede gönderilmek istenen veri büyüklüğünün korunması için bekletilir. Shaper’ların amacı, istenilen hız sınırına ulaşmak ama bu sınırı geçmemektir.
Scheduling (Sıralama)
Scheduler’lar queu’da bekleyen paketleri sıralarlar. Aslında queu’da bekleyen paketler zaten queu’ya girdikleri şekilde sıralıdırlar, bu açıdan scheduler’lar queu’daki paketleri yeniden sıralarlar da denebilir. Kısacası scheduling, queu’daki paketler içinden, bir sonraki boş bandwith kaynağından ilk hangisinin gönderileceğinin belirlenmesidir.
En basit scheduling yöntemi FIFO, yani paketlerin queu’ya girdikleri sıra ile gönderilmesidir. Fakat bu çoğu zaman en uygun yöntem değildir. Bir başka scheduling yöntemi SFQ, ağdaki bir client yada flow’un bandwith’in çoğunu kullanmasını engellemeye yöneliktir. WRR sırayla, bir client yada flow’a kendi queu’sunu boşaltması (dequeu) için hak tanır. Çeşitli diğer scheduling yöntemleri mevcuttur.
Classifying (Sınıflandırma)
Classifier’lar trafiği çeşitli queu ya da queulara ayırırlar. Classifying ile gönderilen paketleri farklı muamele için ayırmak, farklı queu’lara eklemek mümkündür. Classification paketlerin işaretlenmesi (marking) yoluylada yapılabilir.
Policing (Sınırlandırma)
Policer’lar bir queu’daki trafiği ölçer ve sınırlarlar. Bir policer belli bir rate’e (hıza) kadar trafiği kabul eder veya bir işlem uygular, ve bunun üzerindekilere ise başka bir işlem uygular. Bu ikinci işlem paketin drop edilmesi olabileceği gibi, paketin reclassify (tekrar sınıflandırılması) edilmesi ya da başka bir işlem de olabilir.
Policing, gelen trafiğe göre iki seçenekten birinin seçilmesidir. Trafik istenen rate’in altında ise bir işlem yapar ( ör. uygun queu’ya ekler), istenen rate’ten fazla ise başka bir işlem yapar ( ör. drop eder). Yani policer’lar, shaper’lar gibi paketi bekletmezler (delay).
Dropping (Bırakma)
Dropper’lar bir paketi, bir classification’ı (sınıfı), yada flow’u hiçbir zaman gönderilmemek üzere bırakırlar yani bir bakıma silerler. Paketin hazin sonudur 🙂
Marking (İşaretleme)
Marking bir paket tag’ine veri eklenmesidir. Pakete DSCP eklenir ve bu veri domain’deki diğer routerlarca pakete uygulanacak işlemlerde kullanılır.
qdisc
qdisc bir scheduler’dır. Her output interface (gönderim birimi, ör. ethernet kartı) bir çeşit scheduler kullanır. Önceden de belirtildiği gibi en basit scheduler FIFO’dur. Linux’te başka scheduler’lar da vardır ve bunlarda queu’daki paketleri hedefledikleri önceliklere göre tekrar sıralarlar.
qdisc Linux Trafik Kontrolünün üzerine kurulduğu temel yapıdır ve aynı zamanda queuing discipline olarakta bilinir.
classless qdisc
classless qdisc‘lerin (sınıf yapısına dayanmayan qdisc) hiçbir şekilde class‘ları olamaz dolayısıyla bunlara filter eklenemez.Bu tür qdisc‘lere
örnekler;
pfifo_fast,
TBF (Token Bucket Filter),
SFQ (Stochastic Fairness Queueing)
classful qdisc
classful qdisc (sınıf yapısına dayalı qdisc), class‘lar barındırabilir ve böylece filter‘ların eklenebileceği handle‘lar sağlar. Her ne kadar genellikle bir anlamı olmasada classful qdisc‘lerin alt class‘ları olmaksızın kullanılmasıda mümkündür. Bu tür qdisc‘lere örnekler;
PRIO
PRIO qdisc‘i aslında tam olarak bir shaper değildir, sadece trafiği kullanıcının belirlediği filter‘lara göre alt parçalara böler. Bir paket PRIO qdisc‘in queu’suna girdiğinde, qdisc‘e atanmış filter‘lara göre, qdisc‘e atanmış class‘lara gönderilir.
CBQ
CBQ, qdisc‘ler içinde belkide, en karmaşık, en gelişmiş, en zor uygulanan ve en ünlü olanıdır.
CBQ rate’i istenen sınırı geçmesini önlemek için bağlantıyı uygun süre idle (boş, ya da bekler konumda) tutma yöntemini kullanır. Örneğin 10Mbit’lik bir ethernet kartı 1Mbit’e sınırlanmak isteniyorsa, birim zamanın sadece 1/10’u kadar zamanda paket gönderir, yanı zamanın %90’ınında hattı idle tutar (elbette bu milisaniyeler bazında yapılır, saniyeler değil)
CBQ’nun parametreleri:
avpkt ,bandwith,cell,maxburst,minburst,minidle,mpu,rate,allot,prio,weight
KOMUTLAR;
tc
tc, TCP/IP Networking araçları olan iproute2’nin bir parçasıdır. tc komutu yukarıdaki kernel yapılarını oluşturmamızı sağlar. iproute2 de bugün birçok Linux dağıtımında paket olarak bulunmaktadır, yoksa [ftp://ftp.inr.ac.ru/ip-routing] sunucusundan edinilebilir.
tc komutunun kullanımı
[root@localhost global13]# tc |
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
where OBJECT := { qdisc | class | filter }
OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -b[atch] file }
tc qdisc
[root@localhost global13]# tc qdisc help |
Usage: tc qdisc [ add | del | replace | change | get ] dev STRING
[ handle QHANDLE ] [ root | ingress | parent CLASSID ]
[ estimator INTERVAL TIME_CONSTANT ]
[ [ QDISC_KIND ] [ help | OPTIONS ] ]
tc qdisc show [ dev STRING ] [ingress]
Where:
QDISC_KIND := { [p|b]fifo | tbf | prio | cbq | red | etc. }
OPTIONS := … try tc qdisc add <desired QDISC_KIND> help
tc class
[root@localhost global13]# tc class help
Usage: tc class [ add | del | change | get ] dev STRING
[ classid CLASSID ] [ root | parent CLASSID ]
[ [ QDISC_KIND ] [ help | OPTIONS ] ]
tc class show [ dev STRING ] [ root | parent CLASSID ]
Where:
QDISC_KIND := { prio | cbq | etc. }
OPTIONS := … try tc class add <desired QDISC_KIND> help
Örneğin;
[root@localhost global13]# tc class add \ (1) |
> dev eth0 \ (2)
> parent 1:1 \ (3)
> classid 1:6 \ (4)
> htb \ (5)
> rate 256kbit \ (6)
> ceil 512kbit (7)
tc filter
Örneğin;
[root@localhost global13]# tc filter add \ (1) |
> dev eth0 \ (2)
> parent 1:0 \ (3)
> protocol ip \ (4)
> prio 5 \ (5)
> u32 \ (6)
> match ip port 22 0xffff \ (7)
> match ip tos 0x10 0xff \ (8)
> flowid 1:6 \ (9)
> police \ (10)
> rate 32000 bps \ (11)
> burst 10240 \ (12)
> mpu 0 \ (13)
> action drop/continue (14)
Scriptler
Belli amaçlar için yukarıdaki objeleri oluşturan shell scriptleri yazılmıştır. Scriptlerin kodları başlı başına birer örnek olduğu gibi, scriptin amacı tam olarak istenen değilse, script kodunda ya da scriptin sonuçta oluşturduğu tc komutları listesinde düzenlemeler yapılabilir. Elbette bu scriptlerin de bir takım parametreleri ve çalışma ortamı ayarları vardır. Bunlara scriptlerle birlikte gelen dökümanlardan ya da script dosyalarından ulaşılabilir. Bu ayarların neler olduğu, nasıl yapılabileceği ve çeşitli örnekler, en azından şuan ki versiyonu itibariyle, bu dökümanın konusu değildir.
wondershaper
wondershaper;
– Her zaman için etkileşimli trafiği (telnet, online oyunlar vs. gibi) en az latency’de tutmayı
– Upload veya download yaparken dahi web’de gezmeyi makul derecede mümkün kılmayı
– Upload’ların download’ları, ve download’ların upload’ları engellemesini önlemeyi
– Belli host veya portlardan gelen paketlerin daha az öncelikli olarak işaretlenebilmesini
amaçlayan bir scripttir.
wondershaper [http://lartc.org/wondershaper] adresinden alınabilir.
cbq.init
cbq.init, tc komutlarının kullanımına yabancı kullanıcılar için cbq disiplinine dayanan bir trafik kontrolü sağlar. Bu scriptin dizin ve dosya yapısı ihtiyaçlarını öğrenmek, script hakkında daha fazla bilgi edinmek veya scriptte ceşitli değişiklikler yapmak için cbq.init dosyası düz metin editörü ile açılabilir.
cbq.init [http://freshmeat.net/projects/cbq.init] adresinden alınabilir.
htb.init
htb.init, cbq.init benzeri bir scripttir, fakat trafik kontrolünü CBQ yerine HTB disiplinine dayanarak yapar. Benzer şekilde daha fazla bilgi için dosya düz metin editörüyle açılap, incelenebilir.
htb.init [http://freshmeat.net/projects/htb.init] adresinden alınabilir.
myshaper
myshaper, ADSL ve Kablo bağlantılarını düzenlemek için wondershaper’dan türetilmiş bir scripttir.
myshaper ve dökümanlarında [http://www.tldp.org] adresinden ulaşılabilir.
tcng
Fark edileceği gibi tc komutlarıyla oluşturulan objeler, genel programlama yaklaşımından uzaktır. Örneğin alt class’lar, üst class’ınkinden farklı bir disiplin türü kullanamayacağı, ve class’ın üst class’ının handle’ı açık bir şekilde belirtildiği halde, yine de oluşturulan alt class’ın disiplin türü belirtilmelidir. tcng, Traffic Control Next Generation, tc ve trafik kontrolünde kullanılabilecek diğer yapıları, programlama diline benzer bir şekilde şekillendirmeyi amaçlar. Ayrıca tcsim ile ağın çeşitli yük durumları simüle edilebilir. tcng bir shell scripti değildir.
tcng ve dökümanlarına [http://tcng.sourceforge.net/] adresinden ulaşılabilir.