2003 április
Verziótörténet | ||
---|---|---|
Verzió: 1.0 | 2003.04.16 | Átdolgozta: tab |
Az LDP által jóváhagyott Első kiadás. | ||
Verzió: 0.5 | 2002.04.01 | Átdolgozta: MAB |
A doksit átneveztem HOGYANra, a TLDP-hez előterjesztve. | ||
Verzió: 0.4 | 2002.03.31 | Átdolgozta: MAB |
Új példa, bucket gyorstalpaló. | ||
Verzió: 0.3 | 2002.03.16 | Átdolgozta: MAB |
Javításokat és jegyzeteket írt: Jacob Teplitsky, raptor és Joshua Heling. | ||
Verzió: 0.2 | 2002.03.15 | Átdolgozta: MAB |
Hivatkozások hozzáadása, fazonigazítás, publikálás. | ||
Verzió: 0.1 | 2002.03.14 | Átdolgozta: MAB |
Első kiadás. |
© 2003, Martin A. Brown
A dokumentum szabadon másolható, terjeszthető és módosítható, az FSF által közzétett GNU Szabad Dokumentációs Licenc v1.1, vagy annak későbbi változatában szereplő feltételek szerint. A licenc egy másolata megtalálható a www.gnu.org/copyleft/fdl.html honlapon.
A magyar fordítást Völgyi Péter készítette (2004.02.29). A lektorálást Daczi László végezte el (2004.03.11). A dokumentum legfrissebb változata megtalálható a Magyar Linux Dokumentációs Projekt honlapján.
Ez a dokumentum rövid áttekintést ad a tcng (Traffic Control - Next Generation; következő generációs forgalomirányítás ) HTB-vel (Hierarchical Token Bucket) való használatáról, mely eszközök segítségével a Linux rendszeren forgalomszabályozást végezhetünk.
Ez a gyakorlatsor elsősorban olyan rendszergazdáknak készült, akik:
LEGALÁBB alapszintű forgalomirányítási ismeretekkel rendelkeznek,
forrásból tudják FORDÍTANI az iproute2 és a tcng csomagokat, vagy
Ugyanezen csomagokat SRPM-ből telepíteni,
Az általuk használt rendszer moduláris szerkezetű rendszermagja támogatja a HTB és DSMARK modulokat,
VAGY képesek rendszermagot fordítani ezeknek a támogatására.
Ez a doksi nem átfogó és nem mértékadó. A szerző várja mind a pozitív, mind a negatív véleményeket a <mabrown@securepipe.com> e-mail címen. A helyreigazításokat, kiegészítéseket is szívesen veszi. |
A forgalomirányítás egy hálózaton, vagy hálózati eszközön történő teljes csomag-várakozósor (packet queuing) alrendszer összefoglaló neve. A forgalomirányítás több műveletből tevődik össze. Az osztályozás (classifying) során történik a csomagok azonosítása, majd egyedi várakozósorokba, osztályokba rendezése. Az engedélyezés (policing) az osztályozásnak megfelelő adatfolyamban a csomagok vagy bájtok számának szabályozását jelenti. A besorolás (scheduling) a döntéshozatali elem, ahol is a csomagokat az adattovábbításhoz sorrendbe, majd újra sorrendbe rakjuk. Az alakítás (shaping) az a folyamat, amikor a csomagokat késleltetjük majd továbbküldjük, ezáltal az átviteli sebesség nagyjából egyenlő ütemű, és előre kiszámítható lesz.
A forgalomirányítás sokoldalúságát kihasználva komplex rendszereket lehet kialakítani, annak érdekében, hogy egy bizonyos folyamat (vagy alkalmazás) részére sávszélességet biztosítsunk, vagy a rendelkezésre álló sávszélességet korlátozzuk bizonyos folyamatok, vagy alkalmazás előtt.
A forgalomirányítás egyik kulcs-koncepciója a tokenek (jelek) fogalma. Az engedélyezés vagy alakítás folyamata során ki kell számítani az elküldött bájtok vagy csomagok számát, vagyis melyik, milyen sebességgel kerül majd továbbításra. Minden csomag vagy bájt (az alkalmazástól függ, hogy melyik) egy jelnek felel meg, és az engedélyező- vagy alakító-alkalmazás csak akkor továbbítja a csomagot vagy bájtot, ha az rendelkezik a megfelelő jellel. Egy alkalmazás metaforikus jeltárolója a tároló (bucket). Röviden a tároló jelzi, mind az egyszerre használható jelek számát (ez a tároló mérete), mind pedig a jelek újratöltődésének ütemét (milyen gyorsan töltődik újra a tároló).
Bővebbet a 2.2 példában találsz a tároló használatára a Linux forgalomirányítási rendszerben.
Linux rendszereken a forgalomirányítás mindig is komoly kihívást jelentett. A tc parancssori eszköz kapcsolatot jelent a rendszermag azon részeivel, amelyek az alakítás, besorolás, engedélyezés, és osztályozás folyamatait végzik. A parancs szintaxisa viszont rendkívül bonyolult. A tcng projekt azzal, hogy a tc parancssori eszköz fölé nyelvi réteget fektet, sokkal barátságosabb környezetet biztosít a felhasználónak. A tcng-ben írt forgalomirányítási beállítások ezáltal könnyebben kezelhető, kevésbé bonyolult, és - ami talán a legfontosabb - hordozhatóbb lesz.
A Hierarchichal Token Bucket a CBQ-nál egyszerűbb konfigurációs paraméterekkel rendelkező csoportnyi qdisc, melyet Martin Devera alkotott meg. A HTB-ről és használatáról elég sok dokumentum található a szerző honlapján, valamint Stef Coene weboldalán is. Következzen egy rövid kis ismertető a HTB rendszerről.
Alapvetően a HTB egy tetszőleges számú, hierarchikusan felépített jeltároló (token bucket) (...igen, erre könnyen rájöhettél magadtól is). Tételezzük fel a legegyszerűbb esetet: Bármilyen eszközön az elsődleges kilépési sor a root qdisc.
A root qdisc egyetlen osztályt fog tartalmazni (komplex esetekben több osztály is csatolódik a root qdisc-hez). Az egyszerű HTB osztályt két paraméter jellemzi: a rate (mérték) és a ceil (plafon). A top-level (legfelsőbb szintű) osztálynál ezek az értékek meg kell, hogy egyezzenek és a kapcsolat teljes sávszélességét mutatják.
A HTB-nél, a rate jelenti egy osztály számára a garantált sávszélességet, a ceil pedig a maximális sávszélességet. A rate és a ceil közötti sávszélességet mindig a szülő osztálytól veszi az alkalmazás, vagyis a legfelső szinten lévő osztálynál a rate és a ceil ugyanannyi lesz.
Számos gyerek-osztály létesíthető ez alatt az osztály alatt, kezdetben mindegyikhez némi sávszélességet rendelve a szülő-osztály meglévő készletéből. Ezekben a gyerek-osztályokban már nem kell a rate és a ceil paramétereknek megegyezniük, mint a szülő osztálynál. Ez lehetővé teszi, előre meghatározott sávszélesség tartalékolását bizonyos osztályoknak. Lehetővé válik továbbá a HTB számára, hogy összehasonlítsa a meglévő sávszélesség eloszlását az osztályok sávszélességeivel. A következő példa talán rávilágít a lényegre:
A Hierarchical Token Bucket magában foglal egy osztálynyi besoroló mechanizmust a Linuxon való forgalomirányításhoz, és ott van még a felhasználónak a rate és a ceil paraméter az egyes osztályok abszolút sávszélességének szabályozásához, valamint, hogy jelezze a sávszélesség eloszlását, amikor extra sávszélesség adódik (egészen a ceil-ig).
Jegyezzük meg, hogy a top-level osztály sávszélességének a beállításakor a forgalom alakításnak (shaping) csak akkor lesz értelme, ha a szűk keresztmetszet a hálózat és az Internet között az a gép, amin dolgozunk. Tipikusan ilyen eset az otthoni vagy irodai hálózati környezet, ahol az egész helyi hálózatot DSL vagy T1 kapcsolatok kötik össze.
Gyakorlatilag ez annyit jelent, hogy a top-level osztály sávszélességét úgy kell beállítani, hogy vesszük az egész, rendelkezésre álló sávszélességet és kivonunk belőle egy keveset.
A tcng (Traffic Control - Next Generation, következő generációs forgalomirányítás) Werner Almesberger projektje, erőteljes, egységes és egyértelmű nyelvezet megteremtésére, amellyel a forgalomirányítási szerkezetek pontosan megfogalmazhatók. A tcng csomagban található tcc fordító alakítja át a tcng nyelvet többféle kimeneti formára. Alapesetben a tcc beolvas egy fájlt (amely argumentumként, vagy STDIN-ként adható meg) és a STDOUT kimenetre küld egy sorozat tc parancsot, amelyek az elképzelt forgalomirányítási szerkezetet a rendszermagban létrehozzák. (lásd az iproute2 fejezetet lentebb)
A támogatott rendezési elveket megtalálod a tcng Queuing discipline parameters(Útmutató a tcng paramétereihez) dokumentumban. A tcng projekthez a HTB támogatást Jacob Teplitsky írta, aki aktív tag a LARTC levelezési listán.
A tcc eszköz sokféle kimenetet tud produkálni, ez a dokumentum azonban csak a legáltalánosabb és alapértelmezett kimeneti eredménnyel foglalkozik. A TCNG képzikönyv foglalkozik bővebben a tcng parancs használatával.
A tcsim eszköz képes szimulálni az adott forgalomirányítási szabályokkal beállított rendszermag viselkedését, mégpedig úgy, hogy tcng beállítófájlokat olvas és értelmez. Habár a tcsim elég jelentős részét képezi a tcng projectnek, itt többet nem foglalkozunk vele.
Van néhány dolog, ami szükséges ahhoz, hogy a rendszermag támogassa a HTB-t és DSMARK-ot, a tc támogassa a HTB-t és a DSMARK-ot, és, hogy a tcng működjön.
Ahhoz, hogy ez a dokumentum használható legyen, feltétlenül kell egyrészt egy olyan rendszermag, amely támogatja a HTB-t, másrészt a tc alkalmazás (elég csak a doksi címére utalni). A DSMARK támogatás, a szó szoros értelmében nem feltétel, bár néhány példa (különösen az osztály kiválasztási útvonal, de lehet, hogy más példák is) nem biztos, hogy működik e nélkül.
A rendszermag követelményeknek egyszerű megfelelni. A 2.4.20 és újabb rendszermagok beépített HTB és DSMARK támogatást tartalmaznak. Szóval egyszerűen csak be kell kapcsolni ezeket az opciókat (QoS/FAIR Queing szekció). A rendszermag beállításáról bővebben olvashatsz a DiffServ project honlapján.
2.4.20-nál régebbi rendszermagok esetében ez a link egy folt (patch) a 2.4.17 vagy újabb kernelekhez.
A tc parancs az iproute2 eszközcsomag része. Az iproute2 általános leírása a iproute2 kézikönyv oldalakon található. A csomagot közvetlenül az Alexey Kuznyecov FTP archívuma webhelyről lehet letölteni, de a legtöbb disztribúcióban megtalálható csomagként is. Ha RPM csomagkezelőt használsz, erről a SRPM webhelyről letöltheted a forrást, majd lefordíthatod a rendszernek megfelelően.
Ha az iproute2 programot forrásból telepíted, használható Martin Devera HTB webhelyen található tc programhoz szükséges folt. Erre azért van szükség, hogy a tc programban legyen HTB támogatás.
A tc-nek támogatnia kell továbbá a dsmark-ot, a diffserv jelölő mechanizmust. Szerencsére ez egyszerűen megoldható, az iproute2 forrásában található Config fájlban az alábbiakat kell megváltoztatni: a TC_CONFIG_DIFFSERV=n sort TC_CONFIG_DIFFSERV=y -ra kell cserélni, majd a csomagot újra kell fordítani.
Az SRPM dsmark és HTB támogató tc binárist készít, így az alábbi példáknál már nem lesz gond.
Talán a telepítés legkönnyebb része a tcng támogatás megoldása. Csak ki kell csomagolni a forrást, és futtatni kell a ./configure --no-tcsim parancsot fordítás előtt.
Ha RPM-alapú Linux fut a gépen, használhatod a SPEC fájlt tcng/build/tcng.spec a fordításhoz, vagy letöltheted és fordíthatod ezt az SRPM-t. Az SRPM két csomagot készít: tcc és tcc-devel. Csak a tcc-re lesz szükség a beállításokhoz.
A tcc fordító használatához szükség van még a cpp csomagra is. Ezt a tcc használja.
Az itt bemutatásra kerülő példák az ebben a könyvtárban található, letölthető konfigurációs példák módosított változatai.
Ezek a példák használhatók önálló beállító fájlként a tcc fordító segítségével, vagy a példaként szereplő SysV indító szkript használatával. Az indítószkript a raptor által a LARTC levelezőlistán közzétett szkript egy változata.
Amennyiben a fenti indítószkriptet használod, vess egy pillantást a következő példára: /etc/sysconfig/tcng:
Példa 1. /etc/sysconfig/tcng
# - tcng köztes-konfigurációs fájl # (Soha nem használok köztes konfigurációs fájlt, nem szeretem) # # -- 2003-03-15 created; -MAB # -- 2003-03-31 modified to allow ENVAR override; -MAB # # -- ez a könyvtár fogja tartalmazni az összes erre a host-ra # vonatkozó tcng beállítást TCCONFBASEDIR=${TCCONFBASEDIR:-/etc/sysconfig/tcng-configs} # # -- ez az aktív tcng beállítófájl, FIGYELEM! mivel a tcng támogatja a # az #include szerkezet használatát, a $TCCONFBASEDIR # változóban tárolt beállítófájlba beépíthetőek a konfigurációs # modulok. # TCCONF=${TCCONF:-$TCCONFBASEDIR/global.tcc} tcstats=${tcstats:-no} # -- statisztikai jelentések kikapcsolása tcstats=${tcstats:-yes} # -- a tc-t "-s" kapcsolóval indítja tcdebug=${tcdebug:-0} # -- tipikus indítószkript-használat tcdebug=${tcdebug:-1} # -- egy csipetnyi információ az eseményekről tcdebug=${tcdebug:-2} # -- hibakövetési információk # # # még egy lehetőség: felülbírálhatók az alapbeállításként használt tc és tcc eszközök # az elérési út megadásával, például: # # tc=/usr/local/bin/tc # tcc=/usr/local/tcng/bin/tcc # # |
Ezzel a példával sok általános koncepciót próbálok meg bemutatni. A példát a tc kimenetre a tcc class-selection-path.tcc parancs használatával lehet fordítani.
Példa 2. /etc/sysconfig/tcng/class-selection-path.tcc
/* * Egyszerű, magyarázattal ellátott tcng forgalomirányítási beállítófájl. * * Martin A. Brown <mabrown@securepipe.com> * * Példa: A class selection path használata. * * (Amennyiben HTML formában olvasod a szerkesztett kimenetet, a hívások * linkként jelennek meg a szövegben.) * */ #include "fields.tc" #include "ports.tc" #define INTERFACE eth0 dev INTERFACE { egress { /* A class selection path-ban a szűrők jönnek először! Dsmark */ class ( <$ssh> ) if tcp_sport == 22 && ip_tos_delay == 1 ; class ( <$audio> ) if tcp_sport == 554 || tcp_dport == 7070 ; class ( <$bulk> ) \ if tcp_sport == PORT_SSH || tcp_dport == PORT_HTTP ; class ( <$other> ) if 1 ; /* Ebben a részben állítjuk be a qdiskeket és az osztályokat */ htb () { class ( rate 600kbps, ceil 600kbps ) { $ssh = class ( rate 64kbps, ceil 128kbps ) { sfq; } ; $audio = class ( rate 128kbps, ceil 128kbps ) { sfq; } ; $bulk = class ( rate 256kbps, ceil 512kbps ) { sfq; } ; $other = class ( rate 128kbps, ceil 384kbps ) { sfq; } ; } } } } |
Az #include használata rugalmas változó definiálást, és a forgalomirányítás általános elemeinek gyors beszerkeszthetőségét teszi lehetővé.
További részletek találhatók a tcng kézikönyv Include files(Beszerkesztett fájlok) című fejezetében.
További részletek találhatók a tcng kézikönyvben az on class selection path (A class selection path-ról) fejezetben.
Mind a nevek, mind a számok használata elfogadott és érvényes.
Akik használtak már HTB-t, azoknak a rate és a ceil paraméterek ismerősek lesznek. Ezek HTB specifikus paraméterek, és a tcc eszköz segítségével fordíthatók le pontosan. Nézzük meg a tcng ütem és sebesség specifikáció részben található táblázatot!.
Ha nem határozunk meg sorba rendezési szabályokat a végső osztályoknál, akkor az alapbeállítás érvényesül, vagyis a pfifo_fast qdisc. Egy sztochasztikus tiszta sorba rendező qdisc beszerkesztése a vég-osztályokban meggátolja azt, hogy egyetlen kapcsolat uralja a sávszélességet az adott osztályban.
Példa 3. /etc/sysconfig/tcng/two-rate-three-color-meter.tcc
/* * Egyszerű, magyarázattal ellátott tcng forgalomirányítási beállítófájl. * * Martin A. Brown <mabrown@securepipe.com> * * Példa: Mérőóra használata * * (Amennyiben HTML formában olvasod a szerkesztett kimenetet, a hívások * hivatkozásként jelennek meg a szövegben.) * */ #define EXCEPTION 192.168.137.50 #define INTERFACE eth0 $meter = trTCM( cir 128kbps, cbs 10kB, pir 256kbps, pbs 10kB ); dev eth0 { egress { class ( <$full> ) if ip_src == EXCEPTION ; class ( <$fast> ) if trTCM_green( $meter ) ; class ( <$slow> ) if trTCM_yellow( $meter ) ; drop if trTCM_red( $meter ) ; htb { class ( rate 600kbps, ceil 600kbps ) { $fast = class ( rate 256kbps, ceil 256kbps ) { sfq; } ; $slow = class ( rate 128kbps, ceil 128kbps ) { sfq; } ; $full = class ( rate 600kbps, ceil 600kbps ) { sfq; } ; } } } } |
Ez a kétsebességes-háromszínű mérő a legösszetettebb mérőóratípus a tcng nyelvben. Ez a mérőóra a zöld, sárga és piros színeket ad vissza, a tárolók foglaltságától és csúcsértékeitől (peak) függően. Ha a mért sebesség nagyobb, mint a foglaltságot jelző érték, akkor sárga színű lesz a jelzés, ha a mért sebesség túllépi a csúcsértéket (a csúcsérték itt nem a maximális, hanem kiemelkedő értéket jelent - a lektor), akkor piros színű lesz a jelzés.
A $meter változó a mérőóra típusának megfelelő függvényekkel működtethető. Ebben az esetben három függvény jöhet szóba a $meter állapotának tesztelése céljából, ezek: trTCM_green, trTCM_yellow, és trTCM_red. A hatékonyság növelése érdekében lapozz bele a Accelerating three color meters (gyorsított háromszínű mérők) fejezetbe.
A mérőóra zöld.
A mérőóra sárga.
A mérőóra piros.
Hál Istennek a tcng elkerüli a tc kisebb kényelmetlenségeit. A következő táblázat ábrázolja ezen eszközök szintaxisát és mértékegységeit, angol megfelelőikkel együtt.
Táblázat 1. Sebesség/Ütem szintaxis: tcng vs. tc
tcng | Angol megfelelő | tc |
---|---|---|
bps | bit(s) per second | bit |
Bps | byte(s) per second | bps (argh!) |
kbps | kilobit(s) per second | kbit |
kBps | kilobyte(s) per second | kbps |
Mbps | megabit(s) per second | mbit or Mbit |
MBps | megabyte(s) per second | mbps or Mbps |
pps | packet per second | ?? |
Ez csak minimális igazítást igényel az ősrégi tc felhasználóktól, de sokkal jobb választás az angolul beszélőknek ha a megérzéseikre szeretnének hagyatkozni.
Például a tcng konfigurációjában használhatjuk a sebesség jelölésére a konvencionális kifejezéseket: 100Mbps, 128kbps, sőt 2Gpps. Bővebben a tcng kézikönyv Units (a mértékegységekről) fejezetében olvashatunk.
A forgalomirányítás hatékonysága érdekében meg kell keresni a hálózat szűk keresztmetszeti pontjait. Legtöbb esetben ezeken a helyeken kell elvégezni a műveleteket.
HTB site (Martin "devik" Devera) (HTB honlap)
Traffic Control Next Generation (tcng) (következő generációs forgalomirányítás)
TCNG manual (Werner Almesberger) (TCNG kézikönyv)
iproute2 manual (Alexey Kuznetsov) (iproute2 kézikönyv)
Research and documentation on traffic control under linux (Stef Coene) (Forrásanyagok és dokumentációk a forgalomirányításról Linux alatt)
guide to IP networking with linux (Martin A. Brown) (Az IP hálózati protokoll használata Linuxszal)