HTB е йерархична споделяща трафик верижна дисциплина.
Концептуално, тя представлява условен набор от признаци, които са подредени в сетове с йерархична структура. Основната верижна дисциплина на всяко мрежово устройство (интерфейс) се нарича главна верижна дисциплина, или root qdisc. Тази главна дисциплина съдържа един клас (комплексните сценарии могат да имат множество класове, закачени към root qdisc). Този НТВ клас съдържа два основни параметъра:
- rate – гарантирания мрежов трафик, възможен за класа;
- ceil – максималния трафик, който класа може да консумира.
Тези параметри се задават от клас с по-висока йерархия и действат като граници на подкласовете. Стойностите rate и ceil може да не са еднакви за подкласовете в една верига, те може да не консумират целия определен за веригата трафик, но техния сбор не трябва да превишава общите за веригата граници. Това позволява запазване на част от общия за класа трафик за определен подклас, или с други думи, по-добър контрол на подкласовете.
Характеристиките на НТВ са следните:
1. Споделяне на връзката
HTB осигурява набор от услуги за всеки един клас, който включва минималния брой заявени и определени за класа услуги. Когато даден клас иска по-малко от определеният му трафик, излишъка се предоставя на друг клас, който иска услугата.
Командата за задаване на root класа към съответния интерфейс е следната:
- Код за потвърждение: Избери целия код
tc qdisc add dev eth0 root handle 1: htb default 12
Тази команда закача верижния ред (qdisc) на HTB за интерфейс eth0 и му задава „handle 1”. Това е име, или индентификатор, към който ще се обръщат командите по-долу. „default 12” означава, че всеки трафик, който не е класифициран, ще бъде възложен на този клас 1:12.
Обичайно handle се записват във формат x:y, където x е целочислен индентификатор за qdisс-а, а “у” е целочислен индентификатор на клас принадлежащ към този qdisc. Стойността на “y” трябва да бъде 0, когато е за handle на qdisc, а когато е за клас, трябва да бъде различно от 0. Напр., ако на потребител А се зададе 30kbps за www трансфер и 10kbps за всичко останало, а на потребител Б се зададат общо 60kbps, то командите са както следва:
- Код за потвърждение: Избери целия код
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps
Първият ред създава кореният (root) клас, 1:1 под реда (qdisc) 1:. Дефиницията на кореният клас е едно с htb qdisc като parent. Parent класa, както и останалите класове под НТВ qdisc, позволява на подкласовете си да взимат един от друг, но само parent класa не може да взима от друг. Могат да бъдат създадени други три класа директно под НТВ qdsic, но в този случай допълнителния (излишъка) трафик няма да бъде достъпен за останалите. За да се осъществи споделянето, трябва да се създаде допълнителен клас, който да служи като руут за останалите класове, които носят реалната информация под него.
Също така, трябва да се опишат пакетите, принадлежащи към всеки един клас.
- Код за потвърждение: Избери целия код
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 1.2.3.4 match ip dport 80 0xffff flowid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 1.2.3.4 flowid 1:11
Така клас А се идентифицира с неговото IP, което е представено с 1.2.3.4. Когато не е зададен филтър за клас 1:12, всеки трафик, който не е обхванат от описаните вече правила, ще се насочи към него.
Единственото, което следва да се допълни, е да се закачи верижния ред (qdisc) за съответния интерфейс и да се зададе идентификатор, към който командите ще се обръщат, както следва:
- Код за потвърждение: Избери целия код
tc qdisc add dev eth0 parent 1:10 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 1:11 handle 30: sfq perturb 10
tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10
Важно е да се отбележи, че когато повече класове искат да заемат трафик, на всеки от тях се дава определен брой байтове, преди да бъде обслужен друг конкурентен клас. Този брой се нарича quantum (сума). Ако няколко класа се съревновават за общия трафик, те го получават според съотношението на техните суми. Също така, за прецизна обработка на сумите, те трябва да бъдат възможно най-малки и по-големи от MTU.
Обикновено не се налага сумите да се задават ръчно, тъй като НТВ избира предварително изчислени стойности. Изчисляват се класовите суми (когато ги добавяме или променяме), като тяхната норма се разделя на общия параметър r2q. По подразбиране стойността му е 10 и, тъй като обикновено MTU е 1500, тази стойност е подходяща за норми от 15 kBps (120 kbit). За по-малки от минималните норми при създаването на qdisc се определя r2q 1 (добре е да е от 12 kbit). Ако се наложи, при промяна или вмъкване на клас, може ръчно да се зададе сума. Когато се определя сума от командния ред, r2q за този клас се игнорира.
2. Йерархично споделяне
Както по-горе бе казано, услугите, предназначени за всеки клас са поне минимума от предвидените и заявените от тях услуги. Това се отнася за htb класове, които не са основи за други htb класове. За htb класовете, които са основни за други, наричащи се вътрешни класове, правилото е, че услугите, предназначени за всеки клас са поне минимума от предвидените за тях и заявените от техните подкласове услуги.
Според примера, даден по-горе, ако за клиент А е предвиден общ трафик от 40 kbps и www трафик от 30 kbps, излишъкът ще бъде пренасочен към останалия му трафик (ако има заявка), поне докато сумата достигне 40kbps.
В този случай, клиент А се представя със собствен основен клас, т.е.:
- Код за потвърждение: Избери целия код
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 40kbps ceil 100kbps
tc class add dev eth0 parent 1:2 classid 1:10 htb rate 30kbps ceil 100kbps
tc class add dev eth0 parent 1:2 classid 1:11 htb rate 10kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps
3. Burst (отклонение)
Има два вида burst - burst, и cburst. Burst е сумата на байтовете, с която qdisc може да увеличи скоростта си (rate), докато cburst е сумата на байтовете за увеличаване на тавана (ceil).
Мрежовият хардуер може да изпраща само по един пакет (в даден момент) едновременно със скорост, зависеща от хардуера. Софтуерът за споделяне на връзката може да използва тази особеност единствено, за да (приравни) симулира ефектите на няколко връзки, протичащи с различна (по-ниска) скорост. Ето защо скоростта и таванът в действителност не са измерени за даден момент, а са средноаритметични стойности, получени при измерване на множество изпратени пакети за определено време. Това, което в действителност се случва е, че трафикът от един клас се изпраща по няколко пакета едновременно с максималната скорост и след това за малко се обслужват останалите класове. Параметрите burst и cburst контролират количеството данни, което може да бъде изпратено с максимална (хардуерна) скорост, без да се опит да се обслужи друг клас.
Ако cburst е по-малък (в идеалния случай с големина един пакет), той формира bursts, които не превишават тавана на скоростта.
При задаване на стойност на burst за основен клас, по-малка от стойността за някой подклас, трябва да се очаква burst-а на основния клас да спира в някои моменти (защото подкласът ще източва повече отколкото основния клас може да обработи). НТВ ще запомня тези негативни burst-ове до 1 минута.
Ако се борави с високи скорости на компютър с ниска резолюция на таймера, ще трябва да се настроят минимални burst и cburst за всички класове. Резолюцията на таймера на системи i386 е 10ms и 1ms на Алфа. Минималният burst може да бъде изчислен като максималната скорост умножена по резолюцията на таймера. Така за 10Mbit на стандартен i386, се нуждаете от burst 12kb.
Aкo се зададе твърде малък burst, получаваната скорост ще бъде по-малка от тази, която е зададена. Най-новият tc tool ще изчисли и настрои възможно най-малкия burst, ако той не е зададен.
4. Приоритизиране на споделянето на трафика
При приоритизирането на трафика могат да възникнат два проблема. Първият засяга начинът, по който излишния трафик се разпределя между родствени класове. Правилото гласи, че излишният трафик се предлага първо на класове с по-висок приоритет. Но все още важат правилата за гарантираната скорост и за тавана.
Вторият е общото забавяне на пакета. То е сравнително трудно за измерване при етернет, който е прекалено бърз (забавянето е пренебрежимо). Но има лесен начин за преодоляването му. Може да се добави обикновен HTB с един клас, ограничаващ скоростта до 100 kbps и втори НТВ (този, който се измерва) като подклас.
Подходът, който решава описаните проблеми, се изразява в приоритизране на типа на трафика. Например, видео или аудио-трафик (при които е необходима точна скорост, за да не се спре трафика на другите класове) или интерактивен (telnet, SSH) трафик, който няма да засегне негативно други потоци.
Универсален метод е да се приоритизира ICMP, за да се получат ниски забавяния при ping, дори при пълна употреба на връзките.
Източник: Основен