Linux Altında QOS - 4- TC ile FIFO, Priority queue

1 April, 2009 (12:53) | Linux QOS | By: alper

Daha önceki QOS yazımda Priority queue ne demek anlatmıştım.  Şimdi linux üzerinde bunlara biraz daha yakından bakalım. öncelikle belirtmek istediğim nokta, FIFO hemen hemen hiç kullanılmamakta priority ise bant genişliği yönetemediği için CBQ, TBF gibi algoritmalarla beraber kullanılmaktadır. Ne yaptığınızı bilmiyorsanız mümkün olduğunca tek başına kullanmaktan kaçının. Burada verecek olduğum teorik bilgiler diğer qos algoritmalarıyla beraber kullanıldığında priority queuing’i doğru kullanmak için son derece önemlidir.

FIFO :

Kısaca ilk giren ilk çıkar. interface’imiz üzerinde gelen network paketlerinden ilk ulaşan multiplexer dan geçerek fifo queue’ye girer.  sonra gelen arkasından girer ve precess olur. dolayısyla ilk giren paket ilk işlendiği için ilk çıkan olur. fifo ile ilgili çok ayrıntıya girmeyeceğim. günlük hayatta fifo ile yapılan qos ayarlarının gerçekten pek faydası olmadığı için hemen hemen hiç kullanılmamaktadır. yinede kısaca komutlarını vereyim.

bash-3.2# tc qdisc add dev wlan0 root pfifo limit 10

Default olarak bulunur.

Prio ( Priority ) queue :

Hemen resimle açıklamaya başlayalım.

prio qos

Sanırım resim yeterince açıklayıcı. 8 adet paket akışımız var, 3 adet önceliklendirme ile bölünmüş yapıya giriyor. Classifier aracılığıyla tanımlandırılıp sınıflandırılan paketler önceliklerine göre class’lara yönlendiriliyorlar. flow3 en yüksek öncelikli paket olduğu için Highest priority 7 ve 2 orta derece önceliklendirilerek Middle’a diğer paketler ise lowest a gönderiliyor. Gerçektende yapmış oldğumuz priority planımız bu şekilde olmalı. priority queuing yaparken. yüksek öncelikli olarak belirlediğimiz class’a tüm paketleri gönderdiğimizde orada meydana gelecek yoğunluk ve gecikmeyi sanırım vurgulamama gerek yok.

Komut açıklamasına girmeden önce TOS nedir ? sorusuna yüzeysel olarak açıklık getirsek iyi olacak.

TOS RFC1349 da belirtilmiş olan Type of Service in the Internet Protocol Suite’dir hemen tcpdump -v -v diyerek gelen paketlerin içerisinde tos field’imizi görelim ( tcpdump sisteminizde yoksa kurunuz )  :

06:59:30.158310 0us CF +QoS IP (tos 0×0, ttl 64, id 53669, offset 0, flags [DF], proto TCP (6), length 60)
10.70.20.48.53812 > 10.80.20.1.telnet: Flags [S], cksum 0×0a6e (correct), seq 818486010, win 5840, options [mss 1460,sackO

tos 0x0 < tüm tcp ip paketlerinde tos field bulunuyor. En kaba tabiriyle tos field QOS ve routing yapılarında paketlerin tos field ina bakarak işlem yapılabilmesi için çıkartılmıştır. Böylece router üzerine gelen paketin tos field'i referans alınarak paket önceliklendirmesi veya routing planları yapılabilir. örneğin OSPF le TOS a bağlı routing planlaması yapılabilir. günümüzde TOS routerlar da olması şart bir özellik değildir. TOS field in içeriğine bakacak olursak nasıl çalıştığının daha iyi anlaşılacağına inanıyorum.

Binary Decimal  Manası
-----------------------------------------
1000   8         Minimze delay En az gecikme (md)
0100   4         Maximize throughput  Cikis en yuksek "bant genisligi"(mt)
0010   2         Maximize reliability Maksimum kararlılık(mr)
0001   1         Minimize monetary cost en dusuk maliyet(mmc)
0000   0         Normal Service

Sanırım gayet açıklayıcı, TOS field değer hesaplaması linux dosya izin yapısına benzer. örneğin : bir paketin en az gecikme ile "8" en yüksek bant genişliği ile "4" ve en yüksek kararlılıkla "2" gitmesini istiyorsak : 8+4+2=14  = 1110 = e hex yapması lazım ama ! burda sağ da görünmeyen bir değeri "0" olan en sağda bitimiz var onu eklememiz gerekiyor. ( TOS a eklenmiştir ) sonuçta değer binary olarak iki ye katlanıyor 11100 = 16+8+4 = 28 = 1c

Daha fazla için man tc-prio ve RFC 1249 a bakınız. Daha sonraki yazılarımda çok daha iyi anlaşılacağı için daha fazla kafa karışıklığı yaratmak istemiyorum.

TOS gibi kavramlar, QOS içeriisinde yer alsa ve linux hepsini desteklesede TOS kullanarak QOS yapan bir firma şimdiye kadar görmedim. Değişik firmalara ait router ve firewall ların ortak kullanımlarında gerekli olabilir yinede kullanım yerleri çok azdır. Her zaman sistem ve network dizaynında "Design As Simple As Possible" prensipinden uzaklaşmamak gerekir. Linux default olarak TOS içermez tüm paketler tos 0x0 olarak gönderilir. örneklere geçelim.

iptables henüz görmememize rağmen önce iptables ile paketlerimizin TOS'field larını işaretleyelim.

bash-3.2# iptables -A PREROUTING -t mangle -p tcp --dport 22 -j TOS --set-tos Minimize-Delay
bash-3.2#

iptables ile dışarıya giden ssh isteklerimizin TOS'unu Minimize Delay  olarak işaretledik. şimdi hemen tcpdump ile bakalım.

10.70.20.1 e ssh bağlantısı yapıyoruz ve tcpdump -v -v ile bakıyoruz.

13:03:47.362157 0us CF +QoS IP (tos 0x10, ttl 64, id 36525, offset 0, flags [DF], proto TCP (6), length 52)
10.70.20.3.34663 > 10.70.20.1.ssh: Flags [.], cksum 0×3d94 (correct), seq 2213, ack 7657, win 629, options [nop,nop,TS val 712464 ecr 734233734], length 0

tos 0×10 = hex 16 = 10000 en sondaki 0 kalıdırıyoruz = 1000 = 8 decimal yukarıdaki tablomuzda göreceğiniz üzere 8 = Minimze delay En az gecikme (md) gerçektende paketlerimiz en az gecikme olarak işaretlenmiş. şimdi tc ile bunu prioritize edelim.

bash-3.2# tc qdisc add dev wlan0 root handle 1:0 prio
bash-3.2# tc filter add dev wlan0 parent 1:0 prio 1 protocol ip u32 match ip tos 0×10 0xff flowid 1:1
bash-3.2#

Ne yaptık kısaca anlatalım :

priority için 1: handle’i ile bir qdisc oluşturduk.

tc; interface ( device ) wlan0 için filter oluştur. parent olarak 1:0 kullan ( bir önceki satırda oluşturduğumuz qdisc ) , bu filter i priority 1 olarak atadık ( 2.3.4 oluşturulacağını düşünelim ), protocol ip, ip protokokü olduğunu gösterdik. filter imizin u32 filter olduğunu söyledik, match ip tos : tos filed 0×10 olan paketler için 0×10*0xff= 0×10 , flowid 1:1 bu filter’a uyan paketler ilgili class a 1:1 flow id ( tanımlaması ) ile gidecekler.

Burada filter’ımız FWMARK, route gibi değerler olabilirdi. bunlarla ilgili bol bol örnek yapacağımız için şimdilik değinmiyorum. TOS konusuna özelilkle değinme sebebim güncel router ve switchlerin bir çoğunun bunu destekliyor olması.

QOS konusuna ve network’e yabancı olan arkadaşlar için karışık olabilir. demoralize olmamanızı öneririm. diğer QOS algoritmaları linux altında çok daha basit ve anlaşılır.

eklediğimiz kuralları silelim :

bash-3.2# tc qdisc del dev wlan0 root handle 1:0 prio
bash-3.2#

Write a comment