Sieci w Linuksie/iproute2/tc/qdisc

Polecenie tc qdisc służy do dodawania i zarządzania dyscyplin kolejkowania w interfejsach sieciowych. Składnia polecenia wyświetlana przez polecenie `tc qdisc help` jest następująca:

Składnia i opcje polecenia edytuj

Usage: tc qdisc [ add | del | replace | change | show ] dev STRING
       [ handle QHANDLE ] [ root | ingress | parent CLASSID ]
       [ estimator INTERVAL TIME_CONSTANT ]
       [ stab [ help | STAB_OPTIONS] ]
       [ [ 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
STAB_OPTIONS := ... try tc qdisc add stab help

Typy dyscyplin edytuj

htb edytuj

Nazwa tej dyscypliny jest skrótem ang. Hierarchy Token Bucket (hierarchia wiaderek żetonów). Mechanizm HTB pozwala zarówno na kształtowanie jak i szeregowanie transmisji. Jego budowa opiera się na drzewiastej strukturze, w której każdy węzeł ma przypisaną na sztywno minimalną gwarantowaną przepustowość oraz maksymalną przepustowość. Dzieci mogą pożyczać od siebie przepustowość w ramach maksymalnej przepustowości rodzica, aż do osiągnięcia własnej maksymalnej przepustowości.

Składnia
tc qdisc ... dev DEV ( parent CLASSID | root) [ handle MAJOR: ] htb [ default MINOR-ID ]
tc class ... dev DEV parent MAJOR:[MINOR] [ classid MAJOR:MINOR ] htb rate RATE [ ceil RATE ] burst BYTES [ cburst CBYTES ] [ prio PRIORITY ]
rate RATE - minimalna gwarantowana przepustowość
ceil RATE - maksymalna gwarantowana przepustowość (wartością domyślną jest wartosć rate, co oznacza brak pożyczania)
burst BYTES - maksymalna szczytowa przepustowość ponad rate
cburst CBYTES -
prio PRIORITY - priorytet kolejki (im niższa liczba, tym wyższy priorytet)
Przykład
tc qdisc add dev ifb5 handle 1:0 root htb default 100						# 1
tc class add dev ifb5 classid 1:1     parent 1:   htb rate 20Mbit ceil 20Mbit			# 2
tc class add dev ifb5 classid 1:100   parent 1:1  htb prio 3 rate  15Mbit ceil    18Mbit	# 3
tc class add dev ifb5 classid 1:101   parent 1:1  htb prio 1 rate  512kbit ceil    1Mbit	# 4
tc class add dev ifb5 classid 1:102   parent 1:1  htb prio 2 rate  15Mbit ceil    18Mbit	# 5
tc class add dev ifb5 classid 1:103   parent 1:1  htb prio 2 rate  15Mbit ceil    18Mbit	# 6

Powyższe polecenia tworzą 4 kolejki o zadanych przepustowościach i priorytetach. Aby jednak całość działała potrzebne są jeszcze filtry, które będą klasyfikowały pakiety do poszczególnych kolejek.

tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip src 192.168.0.0/24   classid 1:101
tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip dst 172.17.1.0/24    classid 1:102
tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip dst 172.17.2.0/24    classid 1:103
tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip dst 172.17.3.0/24    classid 1:103

pfifo_fast edytuj

Jest to domyślna dyscyplina dla wszystkich interfejsów sieciowych. Realizuje ona proste szeregowanie za pomocą 3 kanałów o malejącym priorytecie (kanały te są bezklasowe, co oznacza, że dyscyplina ta nie może posiadać potomków). Każdy kanał może wysyłać pakiety gdy kanał o wyższym priorytecie jest pusty. Jeżeli z interfejsu skasuje się drzewo dyscyplin ustawiana jest automatycznie dyscyplina pfifo_fast.

tc-pfifo_fast(8) – strona podręcznika systemu Linux

sfq edytuj

Nazwa dyscypliny jest skrótem od ang. Stochastic Fairness Queueing, która oznacza stochastyczne kolejkowanie sprawiedliwe. Dyscyplina ta jest bezklasowa, nie może posiadać potomków. Działanie jej opiera się na dynamicznym tworzeniu kanałów i przyporządkowywaniu im pakietów na podstawie hashy obliczanych na podstawie adresu źródłowego, adresu docelowego i numeru portu (dla protokołów TCP, UDP), lub innych parametrów (dla protokołów bezportowych). Następnie kanały te są opróżniane według algorytmu round-robin. Ponieważ kilka połączeń może wylądować w tym samym kanale rodzi to niesprawiedliwość, dlatego sfq posiada parametr perturb, który oznacza liczbę sekund, po upływie których nastąpi ponowne obliczenie hashy (z inną wartością ziarna), jednak powoduje to zmianę kolejności pakietów, dlatego wartość ta nie powinna być zbyt niska (domyślna wartość to 0, która oznacza brak perturbacji). Dodatkowym parametrem jest quantum, który oznacza ile bajtów należy zdjąć z każdej kolejki w czasie przetwarzania pojedynczej iteracji algorytmu RR.

Składnia
... sfq [perturb seconds] [quantum bytes]

tc-sfq(8) – strona podręcznika systemu Linux