По документу
http://remizov.pp.ru/ru/trn/doc/manuals/htb-manual (это оригинал статьи
http://www.opennet.ru/base/net/htb_manual.txt.html)
Я буду рассуждать, а вы меня поправьте.
1. Сначала у нас появляется команда
Код: Выделить всё
tc qdisc add dev eth0 root handle 1: htb default 12
Это мы так обозначили, что весь трафик, УХОДЯЩИЙ через интерфейс eth0 (который смотрит в локальную сеть) будет попадать в очередь (название, id которой - "1:" или "1:0", что одно и тоже), и что весь трафик, который не попадает под описанные ниже фильтры будет относиться к классу 12 (это который 1:12). Пока вроде понятно, за исключением слова root.
Это типа определяем автовокзал, с которого уезжаем в Нижний Новгород (т.е. в локалку). Если человек попал в него без билета, то он едет на автобусе (потом поймете)
2. Дальше нам нужно определить классы, которые будут относиться к очереди 1:0. С помощью классов мы можем один тип трафика пускать с одной скоростью, а другой - с другой.
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
Тут есть несколько классов - мотоцикл, джип и автобус. Если у человека красный билет, то он едет на мотоцикле, синий - джип, билета нет - автобус. Но есть нюанс - они все потомки корневого класса (по одной дороге едут, на ней можно гнать 100 км/ч - МКАД наверное

), соответственно, если кроме автобуса больше никто по дороге не едет, то автобус может ехать чуть быстрее (заимствовать пропускную способность), а если движение плотное - то он едет 60км/ч (пробки не допускаются, это идеальная дорога

)
Стоит обратить внимание, что в данном примере автобус имеет скорость в два раза большую, чем мотоцикл - 60 против 30. А джип вообще еле едет - 10.
И еще, можно было не прикреплять все автомобили к корневому классу (дороге), а сделать их самих корневыми классами. Тогда правильная аналогия была бы с одинаковыми автомобилями, но разными дорогами с разным качеством, но тогда они не могли бы разгоняться при пустой дороге (заимствовать)
3. Теперь нам надо поставить КПП, где будут выдавать билетики
По ссылке приведен пример фильтрации только клиента А:
Код: Выделить всё
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
Тут мы говорим, что все люди из квартиры №80 дома №4 по улице имени профессора 1.2.3 собирающиеся посетить Нижний Новгород (пакеты в локалку, eth0) идут на автовокзал №1: и едут на мотоцикле.
Остальные люди этого дома едут на джипе с того же автовокзала.
Я попробую дописать еще и В. Итак, осталось описать людей из дома №5 той же улицы. Допустим, хотим, чтобы они все ехали с того же автовокзала на автобусе, а квартира №22 - на мотоцикле (хотя логичнее наоборот, но все же)
Код: Выделить всё
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.5 match ip dport 22 0xffff flowid 1:10
Казалось бы, а где про автобус? А нигде, он у нас по умолчанию на этом автовокзале. Все кто без билетиков - едут на автобусе.
Поправьте, если я не прав.
Осталось только понять, зачем ЭТО:
Теперь можно назначить дисциплины очередей для краевых классов. По умолчанию устанавливается дисциплина pfifo.
tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5
tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10