Linux Traffic Control-а е базиран на три основни блока: Queueing-дисциплина Класове Филтри 1. Queueing (опашки) Всеки интерфейс има начин за обработване на опашките, асоциирани към него. Най-простата е FIFO. Има няколко типа на queueing, които се поддържат в момента: Class Based Queue Token Bucket Flow CSZ First In First Out (FIFO) Priority TEQL SFQ ATM RED Някои от тези дисциплини използват филтри, за да се квалифицират пакетите в различни класове, и да ги обработват спрямо това. Това позволява даден пакет да има приоритет над друг. Такива са например FIFO, CBQ. Queueing-дисциплините и класовете са вързани едно с друго. Присъствието на класове е фундаментална опция за queueing-дисциплината. Също така, филтрите могат да бъдат комбинирани със queueing-дисциплини и класове. 2. Класове Опашките и класовете са тясно свързани. Всеки клас има опашка. Класовете се индетифицират спрямо class ID и internal ID. Class ID-то се задава от потребителя, докато internal ID-то се задава от queueing-дисциплината. Class ID-то има структура "major:minor". Major-номера сочи инстанцията в queueing-дисциплината, от която зависи. Minor-номера идентифицира тоя клас в дадена дисциплина. За повече подробности може да се види include/net/pkt_sched.h. "tc (Traffic Controller)" Traffic Controller (tc) е потребителска програма, която е грубо казано frontend към създаването и асоциирането на опашки към дадени изходни интерфейси. Тя се използва за създаването на различни видове опашки и асоцииране на класове към всяка от тези опашки. Също така може да се използва за слагане на филтри базирани на routing-таблицата, u32-класификаторите, както и RSVP-класификаторите. Тя използва netlink socket-ите като механизъм за комуникиране с мрежовите функции на кернела. tc се използва по следния начин: tc [-s[tatistics]] [-d[etails]] [-r[aw]] < qdiscp | class | filter > { COMMAND | help } , където: -s[tatistics] статистика -d[etails] детйлна информация -r[aw] говори само за себе си qdiscp queueing-дисциплина class клас filter филтър Queuing-дисциплина: Синтаксиса за задаване на queueing-дисциплина е следния: tc qdisc [ add | del | replace | change | get ] dev STRING [ handle QHANDLE ] [ root | parent CLASSID ] [ estimator INTERVAL TIME_CONSTANT ] [ [ QDISC_KIND ] [ help | OPTIONS ] ] tc qdisc show [ dev STRING ] , където: QDISC_KIND може да има стойност pfifo, bfifo, tbf, prio, cbq, red или т.н., т.е. име на queueing-дисциплината hande уникален handle, даден на дадената дисциплина от създателя. Не може да има две дисциплини с еднакъв handle. root показва, че дадената дисциплина е root в sharing-йерархията. parent показва родителя на дадената дисциплина. За да се създаде "class based queue (CBQ)": tc qdisc [ add | del | replace | change | get ] dev STRING \ cbq bandwidth BPS [ avpkt BYTES ] [ mpu BYTES ] [ cell BYTES ] [ ewma LOG ] , където: bandwidth максимална скорост на дадения интерфейс mpu минимални байтове, които да се изпращат в даден пакет Пример: tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit allot 1514 cell 8 avpkt 1000 mpu 64 В дадения пример, Class Based Queue (CBQ) се създава и се връзва към eth0. handle-ът е 1: (което е 1:0). Общата възможна скорост е 10Mbit. Класове: Синтаксисът за създаване на класове е следния: tc class [ add | del | change | get ] dev STRING [ classid CLASSID ] [ root | parent CLASSID ] [ [ QDISC_KIND ] [ help | OPTIONS ] ] tc class show [ dev STRING ] [ root | parent CLASSID ] , където: QDISC_KIND QDISC_KIND може да бъде някоя от queueing-дисциплините, които поддържат класове (prio, cbq и т.н.). classid представлява handle-ът, който е даден на тоя клас от създателя. root показва, че тоя клас е root-клас в sharing-йерархията. parent показва handle-ът на родителя на дадената queueing-дисциплина. 3. Class Based Queue За да се създаде CBQ, синтаксисът е следния: cbq bandwidth BPS rate BPS maxburst PKTS [ avpkt BYTES ] \ [ minburst PKTS ] [ bounded ] [ isolated ] \ [ allot BYTES ] [ mpu BYTES ] [ weight RATE ] \ [ prio NUMBER ] [ cell BYTES ] [ ewma LOG ] \ [ estimator INTERVAL TIME_CONSTANT ] \ [ split CLASSID ] [ defmap MASK/CHANGE ] , където: bandwidth показва максималната скорост, която е възможна за queueing-дисциплината от тоя клас. rate представлява скоростта, която се дава на тоя клас. avpkt представлява средния брой байтове в пакет, за тоя клас. bounded показва, че тоя клас не може да "всзина назаем" неизползвана скорост от "parent"-класа си. isolated показва, че класа няма да дели скорост с някой друг клас. В дадения пример се създава CBQ клас с handle - 1:2. Неговият родител се индентифицира с handle - 1:1. Средният размер на пакета е 1000 байта. Split-точката е 1:0, което показва root-а на sharing-процедурата. tc class add dev eth1 parent 1:1 classid 1:2 cbq bandwidth 10Mbit \ rate 1Mbit allot 1514 cell 8 weight 100Kbit prio 3 maxburst 20 \ avpkt 1000 split 1:0 defmap c0 4. Филтри: Синтаксисът за създаване на филтри е: tc filter [ add | del | change | get ] dev STRING \ [ prio PRIO ] [ protocol PROTO ] [ root | classid CLASSID ] \ [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ] \ tc filter show [ dev STRING ] [ root | parent CLASSID ] , където: FILTER_TYPE е типа на филтъра (rsvp, u32, fw, route и т.н.}, а форматът на FILTERID зависи от класификатора. prio показва приоритет на дадения филтер. Останалите опции бяха разгледани по-горе. Route-класификаторите класифицират пакетите спрямо routing-таблицата. Синтаксисът е следния: tc filter [add | del | change | get] dev STRING \ [parent PARENTID] [protocol PROTO] [prio PRIORITY] route , където: PROTO е low-level протокола {ip, icmp или някой друг} Ето и един пример: tc filter add dev eth0 parent 1:0 protocol ip prio 100 route За да се зададат правила към филтъра: ip route add 129.237.125.150 via 129.237.125.146 dev eth0 flow 1:2 Тук се зададе правило за IP 129.237.125.150 с Gateway 129.237.125.146, като целия трафик принадлежи към клас, чийто handle е 1:2. |