Klasifikace provozu sítě

Lukáš Navrátil, lukas@mail.muni.cz


Obsah


Úvod

Jde o schopnost sítí poskytovat lepší služby přenosu dat s využitím různých technologii. Hlavním cílem je zahrnování prioritních požadavků do omezeného přenosového pásma, a zvládnutí prblémů latency a jitter, což je zpoždění přenosu dat na síti (např. jako důsledek velkého provozu na takové síti) resp. proměnlivého kolísání zpoždění. Tyto problémy ovlivňují zejména některé real-time aplikace nebo interaktivní služby.
Dále je nutné dávat pozor při upřednostňování prioritních toků, aby nezpůsobily kolabs toků ostatních.

Řízení provozu

Obrázek ukazuje, jak procesy přijímají data ze sítě, a jak generují nové data, která se naopak budou posílat po síti
                           +---------------+
                     +---->| TCP, UDP, ... |
                     |     +---------------+   
                     |             |            TRAFFIC CONTROL
                     |             v                  |
   +---------------------+   +------------+   +----------------+
-->|Input de-multiplexing|-->| Forwarding |-->| Output queuing |-->
   +---------------------+   +------------+   +----------------+
Přeposílání zahrnuje výběr výstupního zařízení, včetně adresy a podobně. Jakmile je toto vyřešeno, pak jsou pakety zařazeny do příslušné fronty výstupního zařízení. A to je místo kde do hry vstupuje řízení provozu. Tím můžeme řešit více věcí. Rozhodovat, jestli pakety budou zařazeny do výstupní fronty nebo jestli budou zahozeny (např. jestli fronta přesáhne nějaký limit, popřípadě provoz na síti přesáhne nějaký průměr), může rozhodovat v jakém pořadí budou pakety odesílány (např. upřednostňováním některého z toků dat), může zpožďovat posílání paketů (např. udržovat průměrný tok odchozích dat pod nějakou mezí), apod. Jakmile je pak jednou tímto řizením uvolněn paket na poslání, je přebrán ovladačem zařízení a vyslán po síti.

Jednotlivé části

V Linuxovém jádře se vlastní kód řízení provozu skládá z těchto hlavních částí: Každé síťové rozhraní má svou disciplínu spojenou s příslušnými frontami. Takto se určuje, jak budou pakety zpracovány a zařazeny do front. Velmi jednoduchým příkladem může být pouze jediná fronta, kde jsou všechny pakety ukládány ve stejném pořadí, ve kterém byly zařazeny do této fronty a která je vyprazdňovaná, tak rychle, jak je zařízení schopné posílat pakety na síť.
Více propracovaným příkladem může být použití filtru, který rozezná více různých tříd paketů a zpracuje každou třídu paketů zvlášť, např. upřednostňováním jedné třídy před ostatními.
   +-+                 +-----+   +------------------+   +-+      +-+
   | |     +------+    |     |-->|Queuing discipline|-->| |      | |
   | |---->|Filter|--->|Class|   +------------------+   | |--+   | |
   | |  |  +------+    |     +--------------------------+ |  |   | |
   | |  |              +----------------------------------+  |   | |
   | |  |  +------+                                          |   | |
   | |  +->|Filter|-_  +-----+   +------------------+   +-+  |   | |
-->| |  |  +------+  ->|     |-->|Queuing discipline|-->| |  |   | |-->
   | |  |              |Class|   +------------------+   | |--+-->| |
   | |  |  +------+ _->|     +--------------------------+ |      | |
   | |  +->|Filter|-   +----------------------------------+      | |
   | |     +------+                                              | |
   | +-----------------------------------------------------------+ |
   |  Queuing discipline                                           |
   +---------------------------------------------------------------+
Na obrázku je také vidět, že více filtrů může mapovat stejné třídy paketů.
Disciplína front a třídy jsou provázány dohromady: přítomnost tříd a jejich sémantik jsou zásadními vlastnostmi pro takové disciplíny. Naproti tomu mohou být filtry kombinovány při rozhodování s disciplínami a třídami. Třídy se obvykle nestarají o ukládání svých paketů, ale používají na tohle jinou frontu s disciplínu. Taková pak může být vybrána z množiny možných frontových disciplín, a může mít třídy, které používají zase frontovou disciplínu, atd.
   +-+                 +------+   +---------------+   +-+      +-+
   | |     +------+    |      |-->|TBF, rate=1Mbps|-->| |      | |
   | |--+->|Filter|--->|"high"|   +---------------+   | |--+   | |
   | |  |  +------+    |      +-----------------------+ |  |   | |
   | |  |              +--------------------------------+  |   | |
   | |  |                                                  |   | |
   | |  |              +------+   +---------------+   +-+  |   | |
-->| |  |  Default     |      |-->| FIFO          |-->| |  |   | |-->
   | |  +------------->|"low" |   +---------------+   | |--+-->| |
   | |                 |      +-----------------------+ |      | |
   | |                 +--------------------------------+      | |
   | |                                                         | |
   | +---------------------------------------------------------+ |
   |  Queuing discipline with two delay priorities               |
   +-------------------------------------------------------------+
Další obrázek ukazuje příklad se zásobníky: Nejdříve jsou zde dvě frontové disciplýny s různými prioritami. Pakety, které jsou vybrány filtrem jdou do třídy s velkou prioritou, zatímco ostatní pakety jdou do třídy s nízkou prioritou. Kdykoliv jsou pakety ve frontě s vyšší prioritou, jsou odeslány před pakety z druhé fronty. (Takto například funguje disciplína "prio"). Na vyřešení problému strádání paketů ve frontě s větší prioritou použijeme Token Bucket Filter (TBF), který zajistí rychlost 1Mbps. A konečně pakety v málo-prioritní frontě budou zpracovávány přes FIFO (First In First Out).

Poznamenejme, že v IP hlavičce jsou bity na označení třídy Type Of Service (TOS) jednotlivých paketů.(Některé jsou vyhrazené pouze pro interní použití v síti...)


Fronty paketů

Protože fronty paketů nejsou nekonečné, mohou být naplněny a mohou přetéct. Jakmile je fronta plná, nemůže do ní být zařazen žádný další paket, takže bude zahozen. Problém je, že router nemůže takovému zahazování paketů zabránit (pokud to není paket s velkou prioritou). Takže je potřeba mechanismus, který bude zvládat dvě věci: Oba tyto mechanizmy podporuje Weighted Early Random Detect (WRED).

Priority Queuing (PQ) zaručuje, že důležitější data se vyřizují vždy rychleji. Tento typ fronty je navržen tak, aby dával prioritu důležitým datům. Priorita se může určovat podle typu síťového protokolu (IP, IPX, nebo AppleTalk), podle příchozího zařízení, velikosti paketu, zdrojové/cílové adresy, apod. Každý paket je pak zahrnut do jedné ze čtyř front. S vysokou, střední, normální a nízkou prioritou. Pakety, které po vyhodnocení nepatří do žádné fronty se implicitně zahrnou do fronty s normální prioritou. Při vlastním přenosu pak mají pakety s větší prioritou absolutní přednost před pakety s nižší prioritou

Weighted Fair Queuing (WFQ) je pro situace, ve kterých je vhodné provádět konzistentní odezvu. Je to tokově založený algoritmus, který vytvoří rozumné fronty, aby obsluhovaly podle velikosti. Například bude-li mít jedna fronat 100 bytové pakety a druhá 50 bytové, algoritmus vezme vždy dva pakety ze druhé fronty za každý jeden paket z první fronty. Spravedlivost je tedy v tom, že se z každé fronty se zpracovává 100 bytů...

Random Early Detection (RED) je algoritmus navržený tak, aby zabránil zácpě ve vnitřní síti před tím, než nastane problém. RED sleduje provoz na síti a v případě, že se síť začne zahlcovat, začne náhodně zahazovat pakety. Výsledek zahazování paketů je, že zdroje vysílání paketů zjistí, že se pakety strácí a zpomalí své vysílání. RED je primárně navržen pro používání nad protokolem TCP IP.

Weighted Random Early Detection (WRED) kombinuje schopnosti RED algoritmu s IP přednostmi. WRED preferuje přenos paketů s vysokou prioritou. Umí zahazovat jednotlivé pakety s malou prioritou, když se síťové rozhraní začne zahlcovat, a umí poskytovat různé charakteristiky na vyhodnocování provozu pro různé třídy služeb.

V Linuxovém jádře ve volbě nastavování síťových služeb je nabídka Quality Of Service. V ní pak lze zapnout podpora pro tyto služby a některé typy front paketů...


Omezení propustnosti linky

Omezování šířky pásma se používá na omezení toků dat např. do podsítí. Tím se zabrání různým problémům s přetékáním. Např.je-li centrální síť širokopásmová linka (řekněme T1), zatímco uvažovaná síť má úzké pásmo (např. 384Kbps). Tak v tomto případě je možné, že provoz z centrální sítě může přeplnit toto uzké pásmo. A omezování šířky pásma shaping je velmi vhodný způsob jak takový provoz "přiškrtit" a zabránit přetékání. Čili se budou v podstatě data ze sítě s širším pásmem posílat přes buffer do sítě s užším pásmem.

Policing je podobný jako shaping, ale rozdíl je v jedné velmi důležité věci: Provoz, který překročí nastavenou rychlost není uložen v žádném bufferu, ale je jednoduše zahozen.

Pod Linuxem docílíme omezení propustnosti na síťovém rozhraní pro data, která se posílají směrem pryč použitím modulu jádra shaper. Tj. v .config bude tato volba.

CONFIG_SHAPER=m
Aby se tento modul nahrával do jádra automaticky pomocí kerneld, přidáme do souboru /etc/conf.modules něco jako
alias shaper0 shaper
Nebo použitím insmod nejlépe při startu systému tento modul zavedeme do jádra. Příkaz insmod dáme např. do /etc/rc.d/rc.local na Red Hat distribucích.

Dalším krokem je připojení zařízení shaper na fyzické zařízení a nastavení rychlosti. To lze zařídit příkazy, které mají podobný tvar jako

/sbin/shapecfg attach shaper0 eth0
/sbin/shapecfg speed shaper0 64000
První příkaz "pověsí" pseudo-zařízení "shaper0" na skutečné rozhraní "eht0", což už je vlastní síťová karta.
Druhý příkaz pak nastaví rychlost, resp.ji omezí na 64Kbps. Rychlost lze nastavovat v rozmezí od 9600 do 256,000 bitů za sekundu.

Dalším krokem pak nastavíme, aby se data posílala přes zařízení "shaper0" místo "eth0". Tj. pomocí příkazů ifconfig a route v takovémto nějakém tvaru:

ifconfig shaper0 host netmask mask broadcast bcast up
route add -net net netmask mask dev shaper0
Samozřejmě parametry napsané kuzívou je nutno nahradit skutečnými hodnotami... Tímto jsme tedy zařídili, že se přes rozhraní "shaper0" budou posílat data. Ovšem v tuto chvíli se posílají i přes zařízení "eth0", proto posledním krokem tomu zamezíme.
Příkazy, kterými tohoto docílíme budou vypadat například takto:
route delete default eth0
route add default gw gateway shaper0
Jestli omezení skutečně funguje lze zjistit, například pomocí programu ftp, který při stahování ukazuje rychlost...
odkazy se dají nalézt přes google s použitím Quality of Sercice, resp. QOS, popř. Traffic shaper...
při nastavování routování přes shaper0 si nezapomeňte zrušit funkční IPv6;-)