modified on 1 lip 2010 at 11:21 ••• 118 382 views

Kontrola Pasma

Z MikroTik Wiki

Spis treści

Informacje Ogólne

Wprowadzenie

Kontrola pasma jest zestawem mechanizmów, które pozwalają na kontrolę rozdziału szybkości transmisji danych, zmienność opóźnienia, czas dostarczenia danych i pewność dostarczenia. MikroTik RouterOS obsługuje poniższe metody kolejkowania:

* PFIFO - Packets First-In First-Out

* BFIFO - Bytes First-In First-Out

* SFQ - Stochastic Fairness Queuing

* RED - Random Early Detect

* PCQ - Per Connection Queue

* HTB - Hierarchical Token Bucket

Specyfikacja

Wymagany pakiet: system

Wymagana licencja: Level1 (ograniczone do 1 kolejki, Level3

Poziom menu: /queue

Standardy i technologie: brak

Wykorzystanie sprzętu: znaczne

Opis

Jakość Usług (Quality of Service - QoS) oznacza, że router powinien priorytetyzować i kształtować ruch w sieci. QoS nie polega wyłącznie na ograniczaniu, ale i na zapewnieniu jakości pewnych usług użytkownikom sieci. Niektóre usługi mechanizmu kontroli ruchu MikroTik RouterOS są wymienione niżej:

  • ograniczenie szybkości transmisji danych dla pewnych adresów IP, podsieci, protokołów, portów, lub innych parametrów
  • ograniczenie ruchu typu peer-to-peer
  • uprzywilejowanie niektórych strumieni pakietów
  • użycie skoków kolejki w celu przyspieszenia przeglądania stron web
  • zastosowanie kolejek na ustalonych podziałach czasowych
  • dzielenie dostępnego pasma równo pomiędzy użytkowników, lub w zależności od obciążenia kanału

Kolejkowanie stosowane jest dla pakietów opuszczających router przez rzeczywisty interfejs (np. kolejki zastosowane są na wychodzącym interfejsie, w zależności od przepływu ruchu), lub na każdym z 3 dodatkowych wirtualnych interfejsów (global-in, global-out, global-total).

QoS realizowane jest poprzez upuszczanie pakietów. W przypadku protokołu TCP, upuszczone pakiety zostaną przesłane ponownie z wolniejszym bitratem, więc nie ma potrzeby martwić się tym, że podczas kształtowania tracone jest trochę informacji TCP.

Główne terminy używane do opisu poziomu QoS dla aplikacji sieciowych to:

  • typ kolejkowania (queuing discipline (qdisc)) - algorytm, który utrzymuje kolejkę pakietów. Kumuluje pakiety i decyduje w jakim porządku wysyłane są pakiety (oznacza to, że qdisc może zmienić kolejność pakietów). Ponadto qdisc decyduje które pakiety upuścić jeżeli nie ma dla nich miejsca.
  • CIR (Committed Information Rate) - gwarantowana szybkość transmisji danych. Oznacza to, że szybkość transmisji danych jest zawsze równa tej wartości.
  • MIR (Maximal Intormation Rate) - maksymalna szybkość transmisji, która może zapewnić router.
  • Priority - hierarchia ważności przetwarzanego ruchu. Możesz dać większy priorytet pewnej części ruchu, aby była wcześniej obsłużona niż inna pozostała część ruchu.
  • Contention Ratio - stosunek w jakim określona szerokość pasma jest dzielona pomiędzy użytkowników (gdy pewna szybkość transmisji jest dzielona pomiędzy określoną ilość abonentów). Jest ilością abonentów którzy mają pojedyncze ograniczenie szybkości, zastosowane do nich wszystkich. Dla przykładu, stosunek 1:4 oznacza, że przydzielona szerokość pasma może być dzielona pomiędzy nie więcej niż4 użytkowników.

Przed wysłaniem danych przez interfejs, przetwarzane są przez typ kolejkowania Może być tylko jeden typ kolejkowania zastosowany ja jednym interfejsie, który, domyślnie, ustawiony jest w /queue interface dla każdego fizycznego interfejsu (nie ma domyślnego typu kolejkowania ustawionego dla interfejsów wirtualnych). Gdy zostanie dodana pierwsza kolejka (w /queue tree lub /queue simple) do interfejsu fizycznego, domyślna kolejka interfejsu zastąpiona jest przez hierarchię HTB tej kolejki, ale ta określona w /queue interface dla tego określonego interfejsu nie jest aktywna.

Harmonogramowe i Kształtujące qdiscs

Możemy klasyfikować typy kolejek ze względu na ich wpływ na przepływ pakietów:

  • harmonogramowe - typy kolejek wyłącznie zmieniają kolejność pakietów w zależności od algorytmu i upuszczają pakiety, które 'nie pasują do kolejki'. Typy kolejek harmonogramowych to: PFIFO, BFIFO, SFQ, PCQ (harmonogramowe jaki i kształtujące), RED
  • kształtujące - typy kolejek, które również zapewniają ograniczenia. Są to: CQ (harmonogramowe jaki i kształtujące) i HTB

Interfejsy Wirtualne

Poza rzeczywistymi interfejsami, są 3 interfejsy wirtualne w RouterOS:

  • global-in - reprezentuje wszystkie wejściowe interfejsy (kolejka INGRESS). Pamiętaj, że kolejki zastosowane na global-in działają na ruchu docierającym do routera, przed filtracją pakietów. Kolejkowanie global-in wykonywane jest tuż po markowaniu pakietów i dst-nat.
  • global-out - reprezentuje wszystkie wyjściowe interfejsy routera (kolejka EGRESS). Kolejki zastosowane do niego działają przed kolejkami zastosowanymi do poszczególnego interfejsu.
  • global-total - reprezentuje wszystkie wirtualne interfejsy z których wszystkie dane przechodzą przez router. Gdy zastosowane jest qdisc do global-total, ograniczenie stosowane jest dla obu kierunków. Na przykład, jeżeli ustawimy total-max-limit na 256000, będziemy mieć upload+download=256kbps (maksimum).

Wprowadzenie do HTB

HTB (Hierarchical Token Bucket) jest klasowym typem kolejkowania, używanym do oddzielnego obsługiwania różnego typu ruchu. Kolejki, które dodasz w /queue simple i /queue tree są dołączone do głównego HTB. Na przykład, możesz ustawić maksymalną prędkość transmisji dla grupy i rozdzielić ruch pomiędzy członków tej grupy.

HTB qdisc w szczególe:

Grafika:introduction_htb.jpg

Terminy używane w HTB:

  • filter - procedura klasyfikacji pakietów. Filtry odpowiedzialne są za klasyfikowanie pakietów, dzięki czemu mogą być umieszczane w odpowiednich qdisc. Wszystkie filtry stosowane są na HTB root i klasyfikują pakiety bezpośrednio do odpowiednich qdisc, bez przesuwania ich po drzewie HTB. Jeżeli pakiet nie pasuje do żadnego qdisc, wysyłany jest do interfejsu bezpośrednio, nie przechodząc przez HTB, więc żadne reguły HTB nie są nakładane na te pakiety (w efekcie oznacza, że takie pakiety mają wyższy priorytet, niż każdy inny pakiet zarządzany przez HTB).
  • level - pozycja klasy w hierarchii.
  • class - algorytm ograniczania przepływu ruchu do pewnej wartości. Nie przechowuje żadnych pakietów (tę funkcję mają wyłącznie kolejki). Klasa może zawierać jedną lub więcej podklas (innych klas), lub jeden i tylko jeden qdisc (leaf class).
  • inner class - klasa, która ma jedną lub więcej klas potomnych. Ponieważ inner class nie przechowuje żadnych pakietów, qdisc nie mogą być do niego dołączony (więc ich ustawienia qdisc i filtru są ignorowane, ale mogą być nadal wyświetlane w konfiguracji RouterOS), więc wykonują tylko kształtowanie ruchu. Ustawienia priorytetów również są ignorowane.
  • leaf class - klasa, której klasa-rodzic nie posiada żadnych klas potomnych. Leaf class są zawsze zlokalizowane na poziomie 0 hierarchii. Każda taka klasa ma tylko jeden powiązany z nią qdisc z odpowiednim priorytetem.
  • self feed - wyjście (z drzewa HTB do interfejsu) pakietów z wszystkich aktywnych klas na tym poziomie hierarchii. Jest tylko jedno wyjście na poziom, każde składające się z 8 slotów, które reprezentują priorytety.
  • self slot - element self feed przedstawiający konkretny priorytet. Istnieje tylko jeden self slot na priorytet na poziom. Wszystkie aktywne klasy na tym samym poziomie, mają takie same priorytety, jeżeli są podpięte do tego samego slotu, którego używają do wysyłania pakietów.
  • active class (na poszczególnym poziomie) - klasa, która jest podpięta do self slot na danym poziomie.
  • inner feed - podobne do obiektu self feed, składający się z inner self slot, każdy reprezentujący inną klasę. Jest tylko jeden taki obiekt na inner class.
  • inner feed slot - podobne do self slot. Każdy taki obiekt sklada się z inner slot, które reprezentują priorytety.

Każda klasa ma swojego rodzica i mogą mieć jedno, lub więcej potomków. Klasy, które nie posiadają potomków, znajdują się na poziome 0, gdzie obsługiwane są kolejki, i nazywane są 'leaf classes'.

Każda klasa w hierarchii mogą przydzielać rozdzielać ze względu na priorytet oraz kształtować ruch. Są dwa główne parametry, odwołujące się do kształtowania i jeden odwołujący się do priorytetów:

  • limit-at - dla klasy gwarantowana jest normalna szybkość transferu (CIR)
  • max-limit - maksymalna szybkość transferu jaka może być osiągnięta przez klasę (MIR)
  • priority - porządek, w którym klasy na tym samym poziomie są obsługiwane (8 jest najniższym priorytetem, 1 jest najwyższym)

Każda klasa HTB może znajdować się w jednym z 3 stanów, w zależności od szybkości transmisji, która używają:

  • green - klasa, której aktualna szybkość jest równa lub mniejsza niż limit-at. W tym stanie, klasa jest powiązana z self slot odpowiedniego priorytetu na tym poziomie i możliwe jest zapewnienie jej limitu CIR niezależnie od limitów jakie posiadają jej rodzice. Na przykład, jeżeli mamy klasę-liść (leaf class) z limit-at=512000 a jego klasa-rodzic ma max-limit=limit-at=128000, klasa będzie miała 512kbsp! Wszystkie CIR'y odpowiedniego poziomu są zapewnione przed wszystkimi MIR'ami tego samego poziomu i wszystkimi limitami wyższych poziomów
  • yellow - klasa, której aktualna szybkość transferu jest większa niż limit-at i równa lub mniejsza niż max-limit (lub burst-limit jeżeli jest aktywne). W tym stanie klasa powiązana z inner slot odpowiedniego priorytetu jego rodzica inner feed, który, dla odmiany, może być powiązany z tego rodzica inner slot tego samego priorytetu (w przypadku gdy rodzic tez jest yellow), lub gdy inner slot jego poziomu tego samego priorytetu (w przypadku gdy rodzic jest green). W celu zmiany tego stanu, klasa 'rozłącza się' z self feed swojego poziomu, i 'łączy się' ze swojego rodzica inner feed.
  • red - klasa, której aktualna szybkość transmisji przekracza max-limit (lub burst-limit jeżeli jest aktywne). Ta klasa nie może 'pożyczać' pasma swoich klas-rodziców.

Uwaga: ponieważ CIR'y są zawsze zapewniane przez MIR'ami lub innymi ograniczeniami wyższych poziomów, powinieneś zawsze sprawdzić, czy odpowiednio są ustawione wartości limit-at innych klas są równe lub większe niż suma parametru limit-at klas potomnych tych innych klas.

Priorytety

Gdy istnieje możliwość wysłania pakietu, HTB wysyła zapytanie do self slots wg priorytetu, zaczynając od najwyższego do najniższego, do najniższego priorytety najwyższego poziomu. Każda klasa-liść (pakiety są przechowywane i kolejkowane wyłącznie w qdisc'ach zawartych w każdej klasie-liściu) jest związana z pewnym self slot bezpośrednio lub przez łańcuch klas-rodziców:

Grafika:priorities_1.jpg

Jak widać na rysunku, klasy-liście które znajdują się w stanie green będą zawsze miały wyższy efektywny priorytet niż te w stanie yellow (również z powodu pożyczania pasma od klas-rodziców), ponieważ ich priorytet jest na niższym poziomie (poziom 0). Na tym rysunku, Leaf1 będzie obsłużony po Leaf2, pomimo, że posiada wyższy priorytet (równy 7) niż Leaf1 (równy 8).

W przypadku równych priorytetów i takich samych stanów, HTB obsługuje te klasy używając algorytmu round robin.

Przyłady HTB

Poniżej przedstawiono kilka przykładów pokazujących jak działa HTB.

Scenariusz - mamy 3 różne rodzaje ruchu, markowane w /ip firewall mangle (packet_mark1, packet_mark2 and packet_mark3). Budujemy teraz hierarchię HTB:

[admin@MikroTik] queue tree> add name=ClassA parent=Local max-limit=2048000
[admin@MikroTik] queue tree> add name=ClassB parent=ClassA max-limit=1024000
[admin@MikroTik] queue tree> add name=Leaf1 parent=ClassA max-limit=2048000 \
\... limit-at=1024000 packet-mark=packet_mark1 priority=8
[admin@MikroTik] queue tree> add name=Leaf2 parent=ClassB max-limit=1024000 \
\... limit-at=256000 packet-mark=packet_mark2 priority=7
[admin@MikroTik] queue tree> add name=Leaf3 parent=ClassB max-limit=1024000 \
\... limit-at=768000 packet-mark=packet_mark3 priority=8
[admin@MikroTik] queue tree> print
Flags: X - disabled, I - invalid
 0   name="ClassA" parent=Local packet-mark="" limit-at=0 queue=default
     priority=8 max-limit=2048000 burst-limit=0 burst-threshold=0
     burst-time=0s

 1   name="ClassB" parent=ClassA packet-mark="" limit-at=0 queue=default
     priority=8 max-limit=1024000 burst-limit=0 burst-threshold=0
     burst-time=0s

 2   name="Leaf1" parent=ClassA packet-mark=packet_mark1 limit-at=1024000
     queue=default priority=8 max-limit=2048000 burst-limit=0
     burst-threshold=0 burst-time=0s

 3   name="Leaf2" parent=ClassB packet-mark=packet_mark2 limit-at=256000
     queue=default priority=7 max-limit=1024000 burst-limit=0
     burst-threshold=0 burst-time=0s

 4   name="Leaf3" parent=ClassB packet-mark=packet_mark3 limit-at=768000
     queue=default priority=8 max-limit=1024000 burst-limit=0
     burst-threshold=0 burst-time=0s
[admin@MikroTik] queue tree>

Teraz opiszemy kilka scenariuszy używających tą hierarchię HTB.

1. Wyobraźmy sobie sytuację, gdy pakiety przybywają na Leaf1 i Leaf2. Z tego powodu, Leaf1 wiąże się z self slot swojego poziomu (Poziom 0) z priorytetem 8 a Leaf2 z priorytetem 7. Leaf3 nie ma nic do przesłania, więc nic się nie dzieje.

Grafika:htb-1.jpg

W tej prostej sytuacji: są dwie aktywne klasy (Leaf1 i Leaf2) na poziomie 0 i ponieważ obydwie znajdują się w stanie green, są przetwarzane w porządku ich priorytetów - najpierw Leaf2, potem Leaf1.

2. Teraz załóżmy, że Leaf2 ma przesłać więcej niż 256 kbps, więc musi przekroczyć swój limit stanu green. Wraz ze zmianą stanu, przypina się do inner feed swojego rodzica (ClassB), który rekursywnie przypina się do self slot Level1 z priorytetem 7. Leaf1 pozostaje w tym samym stanie - ma pakiety do przesłania, ale ich szybkość jest mniejsza niż 1 Mbps. Leaf3 nadal nie ma nic od przesłania.

Grafika:htb-2.jpg

Bardzo ważne jest zrozumienie, że Leaf1 ma teraz wyższy efektywny priorytet niż Leaf2 (który znajduje się z stanie green), pomimo, że został ustawiony na niższy priorytet (8) niż Leaf2. Ponieważ Leaf2 rozłączył się z self feed poziomu 0 i pożycza pasmo od swojego rodzica (ClassB), który przyłączyłsię do self feed na poziomie 1. Z tego powodu priorytet Leaf2 przeskoczył na Level1. Pamiętaj, że najniższy poziom jest obsługiwany jako pierwszy niż następny poziom, zaspokajając klasy w porządku ich priorytetów.

3. Rozważmy kolejny przypadek, w którym Leaf1 osiągnął swój max-limit i zmienił swój stan na red, a Leaf2 używa teraz więcej niż 1Mbps (ale mniej niż 2Mbps), więc jego rodzic ClassB musi pożyczyć z ClassA i przejść na yellow. Leaf3 nadal nie ma nic do przesłania.

Grafika:htb-3.jpg

Ten scenariusz pokazuje, że Leaf1 osiągnął swój max-limit i nawet nie może pożyczyć od swojego rodzica (ClassA), więc został odłączony od wszystkich self slots i inner slots. Leaf2 osiągnął poziom 2, ponieważ pożycza od ClassB, która z kolei pożycza od ClassA, ponieważ nie ma już więcej dostępnego pasma. Ponieważ Leaf3 nie ma pakietów do przesłania, jedyną klasą jaka wysyła jest Leaf2.

4. Przypuścmy, że ClassA osiąga swój max-limit (2Mbps), więc ani ClassB, ani Leaf2 nie mogą przesłać, ponieważ zależne są od pożyczanego pasma, ponieważ ClassA nie może nic przesłać. Ale teraz Leaf3 chce przesłać jakieś pakiety:

Grafika:htb-4.jpg

W takiej sytuacji Leaf2 znajduje się w stanie yellow, ale nie może pożyczyć pasma (tak jak ClassB nie może pożyczyć od ClassA) i Leaf3 jest jedyną klasą która może coś wysyłać. Pamiętaj, że nawet pomimo, że inne klasy, włączając rodziców, nie mogą nic wysłać, Leaf3 może wysłać w stopniu bardzo dobrym, gdy jest złączony z self feed poziomu 0.

5. W końcu, sprawdźmy co się stanie, gdy Leaf1, Leaf2, Leaf3 i ClasB znajdują się w stanie yellow, a ClassA jest green.

Grafika:htb-5.jpg

Leaf1 pożycza pasmo od ClassA, Leaf2 i Leaf3 z ClassB, a ClassB pożycza od ClassA. Teraz wszystkie priorytety zostały 'przesunięte' na poziom 0. Więc Leaf2 posiada najwyższy priorytet i jest obsłużony jako pierwszy. Ponieważ Leaf1 i Leaf3 mają taki sam priorytet (8) na tym samym poziomie (2), są obsługiwane przy użyciu algorytmu round robin.

Bursts

Bursts są używane do zezwolenia na zwiększenie szybkości transmisji na krótki odcinek czasu. W każdej 1/16 części burst-time, router oblicza średnią prędkość transmisji każdej klasy dla ostatnich sekund burst-time. Jeżeli średnia prędkość transmisji jest mniejsza niż burst-threshold, burst jest włączony i efektywny limit transmisji (przejście do stanu red) jest ustawiony na burst-limit bps, w przeciwnym wypadku efektywny maksymalny limit spada do max-limit.

Rozpatrzmy poniższy przypadek: max-limit=256000, burst-time=8, burst-threshold=192000 i burst-limit=512000. Gdy użytkownik zaczyna ściągać plik przez HTTP, możemy zaobserwować poniższą sytuację:

Grafika:burst-1.jpg

Początkowo średnia prędkość transmisji przez ostatnie 8 sekund wynosi 0bps ponieważ nie ma ruchu wykorzystującego tę regułę zanim została stworzona. Ponieważ średnia prędkość jest mniejsza niż burst-threeshold (192kbps), dozwolone jest włączenie się burst. Po pierwszej sekundzie, średnia prędkość wynosi (0+0+0+0+0+0+0+512)/8=64kbps, co jest mniejszą wartością niż burst-threshold. Po drugiej sekundzie, średnia prędkość wynosi (0+0+0+0+0+0+512+512)/8=128kbps. Po trzeciej sekundzie nadchodzi moment, w którym średnia prędkość jest większa niżburst-threshold. W tym momencie burst jest wyłączony a efektywna wartość prędkości spada do max-limit (256kbps).

Zauważ, jak burst-time został użyty. Aktualny czas trwania burst'u nie zależy tylko od burst-time! Zależy także od stosunku burst-threshold/burst-limit i aktualnej prędkości transmisji ruchu przechodzącego przez klasę z burst'em. W tym przypadku stosunek wynosił 192000/512000=3/8, czas wynosił 8 i kolejka próbowała wykorzystać całą dostępną prędkość jaką klasa zapewniała, więc burst trwał 3 sekund.

Teraz można z łatwością zobaczyć, dlaczego wartość burst-threshold powinna wynosić pomiędzy limit-at a max-limit dla normalnych zadań. Jeżeli określisz burst-threshold większy niż max-limit, to średnia prędkość będzie dążyć do burst-threshold, ale efektywny maksymalny limit będzie skakać między max-limit a burst-limit (w zależności od aktualnej prędkości, może się tak dziać w każdej 1/16 części burst-time).

HTB w RouterOS

Poza kolejkami interfejsów (jedna kolejka lub drzewo HTB na interfejs), istnieją 3 witrualne drzewa HTB utrzymywane przez RouterOS:

  • global-in
  • global-total
  • global-out

W momencie dodawania prostej kolejki, powstają 3 klasy HTB (w global-in, global-total i global-out), ale nie jest dodawana żadna klasa w kolejce interfejsu.

Gdy pakiet wędruje przez router, przechodzi przez 4 drzewa HTB - global-in, global-total, global-out i kolejka wychodząca interfejsu. Jeżeli jest on kierowany do routera, przechodzi przez kolejki HTB: global-int i global-total. Jeżeli pakiety są wysyłane z routera, przechodzą przez global-total, global-out i kolejkę wychodzącą interfejsu.

Dodatkowe Informacje

Typy Kolejek

Poziom menu: /queue type

Opis

W tym menu możesz stworzyć swoje typy kolejek. Później możesz użyć je w /queue tree, /queue simple lub /queue interface. Zauważ, że te typy kolejek nie mogą ograniczać szybkości transmisji (z wyjątkiem PCQ) - wyłącznie reogranizują pakiety i upuszczają nadmiarowe pakiety (jeżeli kolejka robi się zbyt długa i klasa zarządzająca nie może wysłać pakietów odpowiednio szybko), więc nie znajdziesz tutaj żadnych parametrów ograniczających (z wyjątkiem tych dla PCQ) - wyłącznie ograniczenia pamięci. Pamiętaj również, że planowanie zachodzi tylko, gdy pakiety są kolejkowanie przez qdisc, a to dzieje się gdy pakiety przychodzą szybciej, niż klasa zarządzająca może obsłużyć (więc jest to tylko bufor). Są 5 rodzaje qdisc, które mogą być używane do przechowywania pakietów:

PFIFO i BFIFO

Te typy kolejkowania oparte są o algorytm FIFO (First-In First-Out). Różnica pomiędzy PFIFO a BFIFO polega na tym, że pierwsza mierzy pakiety w porządku bajtowym. Jest tylko jeden parametr o nazwie pfifo-limit (lub bfifo-limit w przypadku BFIFO), który definiuje jak dużo danych może przechowywać kolejka FIFO. Każdy pakiet, który nie może być dodany do kolejki (gdy kolejka jest pełna) jest upuszczany. Duże rozmiary kolejek mogą zwiększyć opóźnienie ale lepiej wykorzystują kanał.

Grafika:fifo-1.jpg

Użyj typów kolejkowania FIFO jeżeli nie masz przeciążonego łącza

SFQ

Stochastic Fairness Queuing (SFQ) wyrównuje przepływ ruchu (sesje TCP lub strumienie UDP) gdy łącze jest pełne.

Bezstronność SFQ jest zapewniona przez algorytmy: hashing i round-robin. Algorytm hashing dzieli ruch sesyjny na ograniczoną ilość podkolejek. Przepływ ruchu może być jednoznacznie zidentyfikowany przez: src-address, dst-address, src-port and dst-port, więc te parametry używane są przez algorytmy SFQ hashing aby rozdzielić pakiety na podsieci.

Grafika: sfq-1.jpg

Cała kolejka SFQ zawiera 128 pakietów i jest 1024 podkolejek dostępnych dla tych pakietów. Każdy pakiet przechowywany w FIFO-podobnym 128 pakietowym buforze, należy do określonej podkolejki, określonej przez funkcję haszu (prosta funkcja wartości z 10-bitowym wyjściem, ponieważ ilość podkolejek wynosi 1024). Stochastyczna natura tego trybu kolejkowania widoczna jest w tym, że pakiety z nieprzewidywanej ilości strumieni może w zasadzie być umieszczona w tej samej podkolejce. Po ilości sekund określonej w sfq-perturb algorytm haszujący zmienia i dzieli ruch sesyjny na różne podkolejki, więc jeden przepływ danych będzie kojarzony z tą samą podkolejką przez długi odcinek czasu. Algorytm round-robin wyłącza z kolejki pcq-allot bajtów z każdej podkolejki w jednej tudze.

Używaj SFQ dla przeciążonych łączy, aby umożliwić równy przesył danych z każdego połączenia. SFQ jest szczególnie korzystne na łączach bezprzewodowych.

PCQ

Aby rozwiązać pewne wady SFQ, powstał Per Connection Queuing (PCQ). Jest jedyną bezklasową kolejką w RouterOS, która może ograniczać pasmo. Jest poprawioną wesją SFQ bez jej stochastycznej natury. PCQ również tworzy podkolejki, oparte na parametrze pcq-classifier. Każda podkolejka posiada ograniczenie prędkości transmisji pcq-rate i ilości pakietów pcq-limit. Całkowity rozmiar kolejki PCQ nie może być większy niż pcq-total-limit pakietów.

Poniższy przykład demonstruje użycie PCQ z pakietami, klasyfikowanymi na bazie ich adresu źródłowego.

Grafika:pcq-1.jpg

Jeżeli klasyfikujesz pakiety według src-address, to wszystkie pakiety z innym adresem IP źródła zostaną grupowane w innych podkolejkach. Teraz możesz zrobić ograniczenie lub wyrównanie każdej kolejki z parametrem pcq-rate. Być może najistotniejszą częścią jest podjęcie decyzji, który interfejs powinien być przydzielony do kolejki. Jeżeli przydzielisz kolejkę do interfejsu 'Lokalny', cały ruch z interfejsu 'Publiczny' będzie grupowany według src-address (prawdopodobnie tego nie chcemy), ale jeżeli przydzielimy kolejkę do interfejsu 'Publiczny', cały ruch od naszych klientów będzie grupowany według src-address - więc możemy z łatwością ograniczyć lub wyrównać prędkość wysyłania danych klientów. To samo możemy zrobić dla pobierania, ale w przypadku użycia klasyfikacji dst-address, kolejkę PCQ powinniśmy zastosować na interfejsie 'Lokalny'.

Aby równo rozdzielić pasmo pomiędzy podkolejki, określone w pcq-classifier, ustaw zmienną pcq-rate na 0! PCQ może być użyte do dynamicznego wyrównywania lub kształtowania ruchu dla wielu użytkowników przy niedużym administrowaniu. PCQ zawsze wyrównuje podkolejki, więc pcq-rate jest po prostu nakrywką dla wytównywania - podkolejka może dostać mniejsze pasmo, ale nigdy nie dostanie większego pasma.

RED

Random Early Detecion (znane również jako Random Early Drop, ponieważ w zasadzie tak właśnie działa) jest mechanizmem kolejkowania, który próbuje uniknąć przeciążenie sieci poprzez kontrolowanie średniego rozmiaru kolejki. Gdy średni rozmiar kolejki osiągnie red-min-threshold, RED zaczyna losowo upuszczać pakiety z liniowym zwiększeniem prawdopodobieństwa, dopóki średni rozmiar kolejki wzrośnie na tyle, że osiągnie red-max-threshold. Efektywny rozmiar kolejki w dowolnym momencie może być wyższy niż red-max-threshold ponieważ prawdopodobieństwo nie rośnie zbyt szybko, więc jest możliwe określenie sztywnego limitu dla rozmiaru kolejki. Gdy średni rozmiar kolejki osiągnie red-max-threshold lub będzie większy, wszystkie następne pakiety będą upuszczane dopóki średni rozmiar kolejki nie spadnie poniżej tej wartości (w którym obliczenia propabilistyczne zostaną aktywowane).

Średni rozmiar kolejki avg wynosi (1-W)*avg+W*q, gdzie:

  • q - wartość długości kolejki
  • W - waga kolejki określona jako burst+1-min=(1-(1-W)^burst)/W.

Wartość log(W) jest zaokrąglona do liczby całkowitej (więc W może być 1, 0.1, 0.01, etc.). Jest określona eksperymentalnie w wielu rodzajach przypadków, W jest bliska min/10*burst.

Wartość prawdopodobieństwa pb rośnie liniowo z 0% do2%, gdy średni rozmiar kolejki rośnie od red-min-threshold do red-max-threshold:

pb=0.02*(avg-min)/(max-min)

Prawdopodobieństwo upuszczania pakietów pa rośnie z pb i z licznikiem pakietów w kolejce do momentu aż ostatni pakiet zostanie upuszczony: pa=pb/(1-count*pb).

Sprawdzone jest eksperymentalnie, że dobrą wartością red-burst jest (min+2*max)/3. A wartością red-max-threshold jest podwojona wartość red-min-threshold.

Zauważ, że w równaniach powyżej, min oznacza red-min-threshold, max oznacza red-max-threshold a burst oznacza red-burst.

Grafika: red-1.jpg

RED jest używany na przeciążonych łączach z dużymi przepływnościami, ponieważ jest szybki i przyjazny dla TCP.

Opis własności

bfifo-limit (integer; default: 15000) - maksymalna ilość bajtów, które może kolejka BFIFO przechowywać

kind (bfifo | pcq | pfifo | red | sfq) - który typ kolejkowania jest używany

  • bfifo - Bytes First-In, First-Out
  • pcq - Per Connection Queue
  • pfifo - Packets First-In, First-Out
  • red - Random Early Detection
  • sfq - Stohastic Fairness Queuing

name (name) - nazwa kolejki

pcq-classifier (dst-address | dst-port | src-address | src-port; default: "") - wyświetla klasyfikatory dla grupowania pakietów w podkolejkach PCQ. Kilkanaście klasyfikatorów może być używanych naraz. Na przykład: src-address, src-port będzie grupować wszystkie pakiety z innymi adresami źródłowymi i portami źródłowymi w oddzielnych podkolejkach

pcq-limit (integer; default: 50) - ilość pakietów, którą pojedyncza podkolejka PCQ może przechowywać

pcq-rate (integer; default: 0) - maksymalna prędkość transmisji dozwolona dla każdej podkolejki PCQ. Do takiego ograniczenia prędkości podkolejki będą wyrównywane

  • 0 - nie ma ustalonego ograniczenia (wyłącznie wyrównuje pasma podkolejek)

pcq-total-limit (integer; default: 2000) - ilość pakietów, którą cała kolejka PCQ może przechowywać

pfifo-limit (integer) - maksymalna ilość pakietów, którą kolejka PFIFO może przechowywać

red-avg-packet (integer; default: 1000) - średni rozmiar pakietów, używany do przyspieszenia czasu obliczania średniej kolejki

red-burst (integer) - określa, jak szybko średni rozmiar kolejki będzie wpływał na realny rozmiar kolejki, podany w bajtach. Większa wartość będzie wygładzać zmiany, więc większy będzie dozwolony czas trwania burst'u.

red-limit (integer) - twardy limit rozmiaru kolejki w bajtach. Jeżeli rzeczywisty romziar kolejki (nie średni) przekroczy tą wartość, to wszystkie następne pakiety będą odrzucane, dopóki rozmiar kolejki się zmniejszy poniżej tej wartości. Powinna być większa niż red-max-threshold+red-burst

red-max-threshold (integer) - górny limit średniego rozmiaru kolejki, w bajtach. Gdy rozmiar osiągnie tą wartość, wszystkie następne pakiety będą upuszczane.

red-min-threshold (integer) - dolny limit średniego rozmiaru kolejki, w bajtach. Gdy rozmiar kolejki osiągnie tą wartość, RED przestaje losowo upuszczać pakiety z obliczonym prawdopodobieństwem.

sfq-allot (integer; default: 1514) - ilość bajtów, która może przesłać podkolejka zanim przyjdzie kolej na następną podkolejkę (ilość bajtów, które mogą być przesłane z podkolejki w pojedynczej turze round-robin), wartość powinna być przynajmniej 1514 dla łączy z 1500 bajtowym MTU.

sfq-perturb (integer; default: 5) - jak często zmieszać (zaburzyć) algorytm haszujący SFQ, w sekundach

Domyślne Kolejki Interfejsów

Poziom menu: /queue interface

Opis

W celu wysłania pakietów przez interfejs, muszą one być umieszczone w kolejce, nawet, jeżeli nie chcesz ograniczać ruchu. Tutaj możesz określić typ kolejki używanej do transmisji danych.

Jeśli raz skonfigurujesz drzewo kolejek dla interfejsu, domyślna kolejka dla interfejsu przestaje być aktywna, więc musisz się upewnić, że wszystkie pakiety, które wychodzą przez ten interfejs są filtrowane przez jakieś qdisc w drzewie HTB. W przeciwnym wypadku pakiety, które nie będą filtrowane, wysyłane są bezpośrednio (z efektywnym priorytetem wyższym niż pakietów w drzewie HTB), nie są buforowane, co ostatecznie prowadzi do zwiększenia wydajności dla tych pakietów.

Opis własności

interface (read-only: name) - nazwa interfejsu

queue (name; default: default) - typ kolejki, który będzie używany dla tego intefejsu

Przykład

Ustawmy, aby interfejs bezprzewodowy używał kolejkę wireless-default:

[admin@MikroTik] queue interface> set 0 queue=wireless-default
[admin@MikroTik] queue interface> print
 # INTERFACE QUEUE
 0 wlan1     wireless-default
[admin@MikroTik] queue interface>

Proste Kolejki

Opis

Najprostszym sposobem ograniczenia szerokości pasma dla określonego adresu IP i/lub podsieci, jest użycie prostych kolejek.

Możesz także użyć prostych kolejek do zbudowania zaawansowanych aplikacji QoS. Mają użyteczne zintegrowane możliwości:

  • Kolejkowanie ruchu peer-to-peer
  • Stosowanie reguł kolejek w wybranych przedziałach czasowych
  • Priorytety
  • Używanie wielu znaków pakietów z /ip firewall mangle
  • Kształtowanie ruchu dwukierunkowego (jedno ograniczenie dla całości upload+download)

Opis własności

burst-limit (integer/integer) - maksymalna prędkość transmisji, jaka może być osiągnięta, gdy burst jest aktywny. Ustawiany dla do/od (docelowy upload/download)

burst-threshold (integer/integer) - ograniczenie średniej prędkości, pod warunkiem ze burst jest możliwy. Jeżeli średnia prędkość transmisji w czasie ostatnich sekund trwania burst'u jest mniejsza niż burst-threshold, aktualna prędkość transmisji może osiągnąć burst-limit. W przeciwnym wypadku twardy limit jest ustawiony na max-limit. Ustawiany dla do/od

burst-time (integer/integer) - odcinek czasu, w sekundach, w którym obliczana jest średnia prędkość transmisji. Ustawiany dla do/od.

direction (none both upload download) - kierunek przepływu ruchu od punktu widzenia celu, na który ma wpływ ta kolejka

  • none - kolejka jest nieaktywna
  • both - kolejka ogranicza download jak i upload
  • upload - kolejka ogranicza tylko upload, nieingerując w download
  • download - kolejka ogranicza tylko download, nieingerując w upload

dst-address (IP address/netmask) - adres docelowy do skojarzenia

dst-netmask (netmask) - maska dla dst-address

interface (text) - intefejs, na którym stosowana jest kolejka

limit-at (integer/integer) - CIR, ustawiany dla do/od (upload/download)

max-limit (integer/integer) - MIR (w przypadku, gdy burst nie jest aktywny), ustawiany dla do/od

name (text) - opisowa nazwa kolejki

p2p (all-p2p | bit-torrent | blubster | direct-connect | edonkey | fasttrack | gnutella | soulseek | winmx) - jaki typ ruchu P2P ma być kojarzony

all-p2p - kojarz wszystkie rodzaje ruchu P2P

packet-marks (multiple choice: name; default: "") - lista znaków pakietów (ustawiane w /ip firewall mangle) do skojarzenia. Miele znaków pakietów oddzielone są przecinkami

parent (name) - nazwa kolejki-rodzica w hierarchi. Wyłącznie może być inna prostą kolejką

priority (integer: 1..8) - priorytet kolejki. 1 jest wartością najwyższą, 8 - najniższą

queue (name/name; default: default/default) - nazwa kolejki z /queue type, ustawiane dla od/do

target-addresses (multiple choice: IP address/netmask) - adres IP podlegającego ograniczeniu (adres źródłowy). Wiele adresów oddzielanych jest przecinkiem

time (time-time,sat | fri | thu | wed | tue | mon | sun{+}; default: "") - ogranicz działanie kolejki do określonego okresu czasu

total-burst-limit (integer) - limit burst'u dla kolejki global-total (suma upload + download)

total-burst-threshold (integer) - próg burst'u dla kolejki global-total (suma upload + download)

total-burst-time (time) - czas burst'u dla kolejki global-total

total-limit-at (integer) - limit dla kolejki global-total (suma upload + download)

total-max-limit (integer) - maksymalny limit dla kolejki global-total (suma upload + download)

total-queue (name) - typ kolejkowania używany w kolejce global-total

Drzewa Kolejek

Poziom menu: /queue tree

Opis

Drzewa kolejek powinny być używane gdy chcesz użyć skomplikowanego rozdziału szerokości pasma opartego na protokołach, portach, grupach adresów IP, itp. Najpierw musisz oznaczyć pakiety przepływające znakiem z /ip firewall mangle i użyć tych znaków jako identyfikator pakietów przepływających przez drzewa kolejek.

Opis własności

burst-limit (integer) - maksymalna wartość prędkości transmisji jaka może być osiągnięta gdy burst jest aktywny

burst-threshold (integer) - limit średniej prędkości transmisji, do której burst jest dozwolony. Jeżeli średnia prędkość transmisji w czasie ostatnich sekund burst-time jest mniejsza niż burst-threshold, aktualna prędkość transmisji może osiągnąć burst-limit. W przeciwnym wypadku limit określony jest przez max-limit

burst-time (time) - odcinek czasu, w sekundach, w którym średnia prędkość transmisji jest obliczana

limit-at (integer) - CIR

max-limit (integer) - MIR (w przypadku gdy burst nie jest aktywny)

name (text) - opisowa nazwa kolejki

packet-mark (text) - oznakowanie pakietów (ustawione w /ip firewall mangle) do skojarzenia. To tworzy filtr, który układa pakiety z określonym znakiem w jego kolejce

parent (text) - nazwa kolejki-rodzica. Rodzice szczytowego poziomu są dostępnymi rodzicami. Rodzice niższych poziomów mogą być innym drzewem kolejek

priority (integer: 1..8) - priorytet kolejki. 1 jest najwyższym, 8 najniższym

queue (text) - nazwa typu kolejki. Typy zdefiniowane są w /queue type

Przykłady Aplikacji

Emulowanie Linii 128 Kibps/64 Kibps

Przypuśćmy, że chcemy emulować linię 128Kbps download i 64Kbps upload, łączącą sieć IP 192.168.0.0/24. Sieć udostępniona jest przez interfejs 'Local' routera. Podstawowe ustawienie sieci przedstawione jest na diagramie:

Grafika:example-1.jpg

W celu spełnienia założeń użyjemy prostych kolejek.

Adres IP routera MikoTik:

[admin@MikroTik] ip address> print
Flags: X - disabled, I - invalid, D - dynamic
 #   ADDRESS            NETWORK         BROADCAST       INTERFACE
 0   192.168.0.254/24   192.168.0.0     192.168.0.255   Local
 1   10.5.8.104/24      10.5.8.0        10.5.8.255      Public
[admin@MikroTik] ip address>

Trasy:

[admin@MikroTik] ip route> print
Flags: X - disabled, A - active, D - dynamic, 
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, 
B - blackhole, U - unreachable, P - prohibit 
 #      DST-ADDRESS        PREF-SRC        G GATEWAY         DIS INTE...
 0 A S  0.0.0.0/0                          r 10.5.8.1        1   Public
 1 ADC  10.5.8.0/24        10.5.8.104                        0   Public
 2 ADC  192.168.0.0/24     192.168.0.254                     0   Local
[admin@MikroTik] ip route>

Dodajmy regułę prostej kolejki, która będzie ograniczać ruch download do 128 Kb/s, a upload do 64 Kb/s dla klientów sieci 192.168.0.0/24 obsługiwanej przez interfejs Local:

[admin@MikroTik] queue simple> add name=Limit-Local interface=Local \
\... target-address=192.168.0.0/24 max-limit=65536/131072
[admin@MikroTik] queue simple> print
Flags: X - disabled, I - invalid, D - dynamic
 0    name="Limit-Local" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0
      interface=Local parent=none priority=8 queue=default/default
      limit-at=0/0 max-limit=65536/131072 total-queue=default
[admin@MikroTik] queue simple>

Parametr max-limit ucina maksymalne możliwe pasmo. Z punktu widzenia klientów, wartość65536/131072 oznacza, że będą osiągać maksimum 131072bps dla pobierania i 65536 bps dla wysyłania. Parametr target-addresses określa docelową sieć (lub sieci, oddzielone przecinkiem) na której będzie zastosowana reguła kolejki.

Zobaczmy teraz obciążenie ruchu:

[admin@MikroTik] interface> monitor-traffic Local
  received-packets-per-second: 7
       received-bits-per-second: 68kbps
        sent-packets-per-second: 13
           sent-bits-per-second: 135kbps

[admin@MikroTik] interface>

Prawdopodobnie chcesz wykluczyć serwer z listy ograniczenia, więc dodaj kolejkę bez żadnych ograniczeń (max-limit=0/0) i przesuń ją na początek listy:

[admin@MikroTik] queue simple> add name=Server target-addresses=192.168.0.1/32 \
\... interface=Local
[admin@MikroTik] queue simple> print
Flags: X - disabled, I - invalid, D - dynamic
 0    name="Limit-Local" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0
      interface=Local parent=none priority=8 queue=default/default
      limit-at=0/0 max-limit=65536/131072 total-queue=default

 1    name="Server" target-addresses=192.168.0.1/32 dst-address=0.0.0.0/0
      interface=Local parent=none priority=8 queue=default/default
      limit-at=0/0 max-limit=0/0 total-queue=default
[admin@MikroTik] queue simple> mo 1 0
[admin@MikroTik] queue simple> print
Flags: X - disabled, I - invalid, D - dynamic
 0    name="Server" target-addresses=192.168.0.1/32 dst-address=0.0.0.0/0
      interface=Local parent=none priority=8 queue=default/default
      limit-at=0/0 max-limit=0/0 total-queue=default

 1    name="Limit-Local" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0
      interface=Local parent=none priority=8 queue=default/default
      limit-at=0/0 max-limit=65536/131072 total-queue=default
[admin@MikroTik] queue simple>

Drzewo Kolejek z Maskaradą

W poprzednim przykładzie przeznaczyliśmy 128Kb/s na pobieranie i 64Kb/s na wysyłanie, dla lokalnej sieci. W tym przykładzie zagwarantujemy 256Kb/s pobierania (128Kb/s dla serwerem 64Kb/s dla stacji roboczej i tyle samo dla laptopa) i 128Kb/s na wysyłania (odpowiednio 64/32/32Kb/s) dla urządzeń w lokalnej sieci. Dodatkowo, jeżeli będzie wolne pasmo, podziel je równo między użytkowników. Dla przykładu, jeżeli wyłączymy laptopa, podziel jego 64Kb/s pobierania i 32Kb/s wysyłania na serwer i stację roboczą.

Gdy używasz maskarady, musisz oznaczyć wychodzące połączenia nem-connection-mark i przyjąć akcję mark-connection. Gdy to zrobisz, możesz markować pakiety należące do tego połączenia przy użyciu new-packet-mark i użyć akcję mark-packet.

Grafika: example-2.jpg

1. Najpierw oznacz ruch download i upload serwera. Pierwszą regułą oznaczymy wychodzące połączenie, a drugą wszystkie pakiety należące do tego połączenia:

[admin@MikroTik] ip firewall mangle> add src-address=192.168.0.1/32 \
\... action=mark-connection new-connection-mark=server-con chain=prerouting
[admin@MikroTik] ip firewall mangle> add connection-mark=server-con \
\... action=mark-packet new-packet-mark=server chain=prerouting
[admin@MikroTik] ip firewall mangle> print
Flags: X - disabled, I - invalid, D - dynamic
 0   chain=prerouting src-address=192.168.0.1 action=mark-connection
     new-connection-mark=server-con

 1   chain=prerouting connection-mark=server-con action=mark-packet
     new-packet-mark=server
[admin@MikroTik] ip firewall mangle>

2. Tak samo postąp dla laptopa i stacji roboczej:

[admin@MikroTik] ip firewall mangle> add src-address=192.168.0.2 \
\... action=mark-connection new-connection-mark=lap_works-con chain=prerouting
[admin@MikroTik] ip firewall mangle> add src-address=192.168.0.3 \
\... action=mark-connection new-connection-mark=lap_works-con chain=prerouting
[admin@MikroTik] ip firewall mangle> add connection-mark=lap_works-con \
\... action=mark-packet new-packet-mark=lap_work chain=prerouting
[admin@MikroTik] ip firewall mangle> print
Flags: X - disabled, I - invalid, D - dynamic
 0   chain=prerouting src-address=192.168.0.1 action=mark-connection
     new-connection-mark=server-con

 1   chain=prerouting connection-mark=server-con action=mark-packet
     new-packet-mark=server

 2   chain=prerouting src-address=192.168.0.2 action=mark-connection
     new-connection-mark=lap_works-con

 3   chain=prerouting src-address=192.168.0.3 action=mark-connection
     new-connection-mark=lap_works-con

 4   chain=prerouting connection-mark=lap_works-con action=mark-packet
     new-packet-mark=lap_work
[admin@MikroTik] ip firewall mangle>

Jak widzisz, oznaczyliśmy połączenia należące do laptopa i stacji roboczej tym samym znakiem

3. W /queue tree dodaj reguły ograniczające download i upload serwera:

[admin@MikroTik] queue tree> add name=Server-Download parent=Local \
\... limit-at=131072 packet-mark=server max-limit=262144
[admin@MikroTik] queue tree> add name=Server-Upload parent=Public \
\... limit-at=65536 packet-mark=server max-limit=131072
[admin@MikroTik] queue tree> print
Flags: X - disabled, I - invalid
 0   name="Server-Download" parent=Local packet-mark=server limit-at=131072
     queue=default priority=8 max-limit=262144 burst-limit=0
     burst-threshold=0 burst-time=0s

 1   name="Server-Upload" parent=Public packet-mark=server limit-at=65536
     queue=default priority=8 max-limit=131072 burst-limit=0
     burst-threshold=0 burst-time=0s
[admin@MikroTik] queue tree>

Dodaj podobną konfigurację dla laptopa i stacji roboczej:

[admin@MikroTik] queue tree> add name=Laptop-Wkst-Down parent=Local \
\... packet-mark=lap_work limit-at=65535 max-limit=262144
[admin@MikroTik] queue tree> add name=Laptop-Wkst-Up parent=Public \
\... packet-mark=lap_work limit-at=32768 max-limit=131072
[admin@MikroTik] queue tree> print
Flags: X - disabled, I - invalid
 0   name="Server-Download" parent=Local packet-mark=server limit-at=131072
     queue=default priority=8 max-limit=262144 burst-limit=0
     burst-threshold=0 burst-time=0s

 1   name="Server-Upload" parent=Public packet-mark=server limit-at=65536
     queue=default priority=8 max-limit=131072 burst-limit=0
     burst-threshold=0 burst-time=0s

 2   name="Laptop-Wkst-Down" parent=Local packet-mark=lap_work limit-at=65535
     queue=default priority=8 max-limit=262144 burst-limit=0
     burst-threshold=0 burst-time=0s

 3   name="Laptop-Wkst-Up" parent=Public packet-mark=lap_work limit-at=32768
     queue=default priority=8 max-limit=131072 burst-limit=0
     burst-threshold=0 burst-time=0s
[admin@MikroTik] queue tree>

Równe dzielenie łącza pomiędzy użytkowników

Ten przykład pokazuje jak równo podzielić download 10Mb/s i upload 2Mb/s pomiędzy aktywnych użytkowników sieci 192.168.0.0/24. Jeżeli Host A pobiera 2Mb/s, Host B otrzymuje 8Mb/s i na odwrót. Mogą wystąpić sytuacje, gdy oba hosty chcą użyć całego pasma (10Mb/s), wtedy każdy z nich otrzyma 5Mb/s, to samo dzieje się dla wysyłania. Ta konfiguracja będzie się sprawdzać także dla więcej niż 2 użytkowników.

Grafika:example-3.jpg

Na początku oznacz cały ruch przychodzący z lokalnej sieci 192.168.0.0/24 znakiem users:

/ip firewall mangle add chain=forward src-address=192.168.0.0/24 \
   action=mark-connection new-connection-mark=users-con
/ip firewall mangle add connection-mark=users-con action=mark-packet \
   new-packet-mark=users chain=forward

Teraz dodaj dwa nowe typy PCQ. Pierwszy, nazwany pcq-download będzie grupował cały ruch według adresu docelowego. Gdy zastosujemy ten typ kolejki dl interfejsu Local, stworzy on dynamiczną kolejkę dla każdego adresu docelowego (każdego użytkownika), który pobiera dane i znajduje się z w sieci 192.168.0.0/24. Drugi typ, nazwany pcq-upload będzie grupować ruch według adresów źródłowych. Zastosujemy tą kolejkę do interfejsu Public więc, stworzy ona dynamiczną kolejkę dla każdego użytkownika, który wysyła dane do Internetu z lokalnej sieci 192.168.0.0/24.

/queue type add name=pcq-download kind=pcq pcq-classifier=dst-address
/queue type add name=pcq-upload kind=pcq pcq-classifier=src-address

Ostatecznie, stwórzmy drzewo kolejkowania dla ruchu typu download:

/queue tree add name=Download parent=Local max-limit=10240000
/queue tree add parent=Download queue=pcq-download packet-mark=users

I dla ruchu typu upload:

/queue tree add name=Upload parent=Public max-limit=2048000
/queue tree add parent=Upload queue=pcq-upload packet-mark=users

Uwaga! Jeżeli Twój ISP nie może zagwarantować Ci określonej ilości pasma, możesz po prostu użyć jednej kolejki dla upload i jednej dla download, zastosowanej bezpośrednio na interfejsie:

/queue tree add parent=Local queue=pcq-download packet-mark=users
/queue tree add parent=Public queue=pcq-upload packet-mark=users