Вот мой скрипт для tc:
#!/bin/sh
TC=/sbin/tc
IP=/sbin/ip
IF=ppp0
IFB_IF=ifb0
RATE=900kbit
/sbin/modprobe ifb
$IP link set $IFB_IF up
# set interface qlen
$IP link set dev $IF qlen 32
$IP link set dev $IFB_IF qlen 32
# reset all qdisc
$TC qdisc del dev $IF root
$TC qdisc del dev $IF ingress
$TC qdisc del dev $IFB_IF root
# reset all qdisc
$TC qdisc add dev $IF ingress
$TC qdisc add dev $IF root sfq perturb 10
$TC qdisc add dev $IFB_IF root handle 1: htb default 30
$TC class add dev $IFB_IF parent 1: classid 1:1 htb rate $RATE burst 10k
$TC class add dev $IFB_IF parent 1:1 classid 1:10 htb rate 64kbit ceil $RATE burst 10k prio 2
$TC class add dev $IFB_IF parent 1:1 classid 1:20 htb rate 64kbit ceil $RATE burst 10k prio 2
$TC class add dev $IFB_IF parent 1:1 classid 1:30 htb rate 100kbit ceil $RATE burst 10k prio 2
#game
$TC class add dev $IFB_IF parent 1:1 classid 1:40 htb rate 200kbit ceil $RATE burst 10k prio 1
$TC qdisc add dev $IFB_IF parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $IFB_IF parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $IFB_IF parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $IFB_IF parent 1:40 handle 40: sfq perturb 10
#game
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 1 u32 match ip sport 29000 0xffff flowid 1:40
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 1 u32 match ip dport 5190 0xffff flowid 1:40
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 1 u32 match ip sport 53 0xffff flowid 1:40
#http
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 2 u32 match ip sport 80 0xffff flowid 1:20
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 2 u32 match ip sport 5222 0xffff flowid 1:20
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 2 u32 match ip sport 7012 0xffff flowid 1:10
$TC filter add dev $IFB_IF protocol ip parent 1:0 prio 2 u32 match ip dport 6886 0xffff flowid 1:20
$TC filter add dev $IFB_IF parent 1:0 prio 2 u32 match ip protocol 6 0xff\
match u8 0x05 0x0f at 0\
match u16 0x0000 0xffc0 at 2\
match u8 0x10 0x10 at 33 flowid 1:10
$TC filter add dev $IF parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $IFB_IF
Для каждого типа трафика выделана мин гарантированная полоса и макс достуная.
Некоторым типам трафитка назначен повышенный приоритет.
Всё прекрасно работает во время закачки через torrent. И http и MMORPG на соседнем компе, и online радио.
RATE - скорость канала -10%
IF - тот интерфейс, через которыый работает интернет. У меня ppp0 поскольку мой провайдер предоставляет интернет через pppoe. IFB_IF трогать не нужно. Вместо RATE=900kbit нужно написать вашу скорость интернета, уменьшенную на ~ 10%
Вроде ваша ошибка убирается загрузкой модуля "modprobe act_mirred".
Приоритет установления соединений --- это как? В скрипте для каждого типа трафика (определяемого по порту) выделяется полоса. Если пакеты приходят с большей скорости, то они копятся в буфере, а при его заполнение отбрасываются. И если я правильно понял, то процесс установки соединения (SYN-пакеты) будет по тем же очередям, что и остальные пакеты соединения.
Отдельно приоретизируются ACK-пакеты (пакеты подтверждения), они появляются, когда передаете данные по TCP-соединению.
Отличный скрипт, но у вас видимо, симметричный канал. (download/upload) У меня не работает эффективно,
так как торрент-клиент полностью занимает всю полосу на раздачу (1 мбит)
и хотя закачек нет и канал свободен (4 Мбит) всё тормозит.