Mecanismos de QoS em Linux tc Traffic Control
Controle de Tráfego (TC) Elementos do TC Camadas Superiores (TCP, UDP) S Interface de Entrada Destino é Interno? N Rotamento Policiamento Classificação Enfileiramento na Saída Escalonamento Formatação de Tráfego Interface de Saída
Política de QoS e Elementos do TC Qdisc da classe Qdisc principal
Comandos tc: Criar a qdisc principal > tc qdisc add dev eth0 root handle 1:0 htb > tc class add dev eth0 parent 1:0 classid 1:1 htb rate 500Kbit > tc class add dev eth0 parent 1:0 classid 1:2 htb rate 300Kbit
Comandos: Criar as qdisc das classes > tc qdisc add dev eth0 parent 1:1 handle 10:0 pfifo limit 10 > tc qdisc add dev eth0 parent 1:2 handle 20:0 pfifo limit 10 > tc filter add dev eth0 parent 1:0 protocol ip u32 match ip protocol 0x06 0xff flowid 1:1 > tc filter add dev eth0 parent 1:0 protocol ip u32 match ip protocol 0x11 0xff flowid 1:2
Seqüência de filtros u32 Pacotes HTTP recebidos por 192.168.0.1/24 vão para classe 1:1. Os demais pacotes TCP recebidos por esse host vão para classe 1:2 tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip protocol 0x06 0xff match ip sport 80 0xfff match ip dst 192.168.0.1/24 flowid 1:1 tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip protocol 0x06 0xff match ip dst 192.168.0.1/24 flowid 1:2
Verificando as regras com o tc tc [-s] qdisc/class/filter show dev eth0 mosta as qdisc/class/filter associadas a interface s mostra as estatísticas do uso da qdisc/class/filter tc qdisc del root dev eth0 limpa as regras de QoS iplink show mostra a classe default associada a interface
Queueing Disciplines FIFO: First In First Out SFQ: Stochastic Fair Queuing TBF: Token Bucket Flow DS_MARK: Diff-Serv Marker RED: Random Early Detection PRIO: Priority Queue [CBQ: Class-Based Queueing] = OBSOLETA HTB: Hierarquical Token Bucket
FIFO: First In First Out > tc qdisc add dev eth0 root handle 1:0 pfifo limit 10 > tc qdisc add dev eth0 parent 1:1 handle 10:0 pfifo limit 10
PRIO: Priorização Injusta > tc qdisc add dev eth0 root handle 1:0 prio
TBF: Token Bucket Function > tc qdisc add dev eth0 root handle 1:0 prio > tc qdisc add dev eth0 parent 1:1 tbf rate 0.5mbit burst 5k latency 70ms peakrate 1mbit minburst 1500
SFQ: Stochastic Fair Queuing > tc qdisc add dev eth0 root handle 1:0 sfq perturb 10 > tc qdisc add dev eth0 parent 1:1 handle 10:0 sfq perturb 10
HTB: Hierarquical Token Bucket Link (3 Mbps) 200.1.2.0/24 200.1.3.0/24 Subrede A (rate 2 Mbps) Subrede B (rate 1 Mbps) (ceil 1 Mbps) telnet (rate 200 kbps) http (rate 800 kbps) outros (rate 1 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) > tc qdisc add dev eth0 root handle 1: htb > tc class add dev eth0 parent 1:0 classid 1:1 htb rate rate ceil rate burst bytes [ cburst bytes ] [ prio priority ]
HTB: Criação da Classes 1:0 qdisc root HTB 1:1 Link (3 Mbps) 200.1.2.0/24 200.1.3.0/24 Subrede A 1:2 1:3 (rate 2 Mbps) Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:21 1:22 1:23 1:31 1:32 telnet (rate 200 kbps) http (rate 800 kbps) outros (rate 1 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps)
HTB: Qdisc das Classes 1:0 qdisc root HTB 1:1 Link (3 Mbps) 200.1.2.0/24 200.1.3.0/24 Subrede A 1:2 1:3 (rate 2 Mbps) Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:21 1:22 1:23 1:31 1:32 telnet (rate 200 kbps) http (rate 800 kbps) outros (rate 1 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) qdis c FIF O 210:0 220:0 230:0 310:0 320:0 qdisc FIFO qdisc FIFO qdisc FIFO qdisc FIFO
HTB: Filtros 1:0 qdisc root HTB 1:1 Link (3 Mbps) 200.1.2.0/24 200.1.3.0/24 Subrede A 1:2 1:3 (rate 2 Mbps) Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:21 1:22 1:23 1:31 1:32 telnet (rate 200 kbps) http (rate 800 kbps) outros (rate 1 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) qdis c FIF O 210:0 220:0 230:0 310:0 320:0 qdisc FIFO qdisc FIFO qdisc FIFO qdisc FIFO filtro prio 1 filtro prio 2 filtro prio 3 filtro prio 4 filtro prio 5
DSMARK: Marcação do Byte DS new_ds = (old_ds & mask) value > tc qdisc add dev eth0 root handle 1:0 dsmark indices n default_index id > tc class change dev eth0 classid 1:id dsmark mask mask value value
Byte DS X DSCP para PHBs padronizados Drop Precedence DSCP em Hexa DS em Hexa
Policiamento: Policing Controle do excesso de tráfego e marcação para classe de core Tráfego garantido: AF11 Tráfego excedente: AF12 Tráfego violado: DROP Roteador de borda Roteador de core > tc filter... police rate kbit burst BYTES [reclassify drop continue]
Policiamento: Policing ENVIADO PARA CLASSE NORMAL e.g. AF11 ENVIADO PARA CLASSE DE TRATAMENTO DE EXCESSO e.g. AF12 rate: e.g. 500 kbps rate: e.g. 500 kbps tráfego total continue (excesso) balde 1 balde 2 burst: e.g. 62,5 kbytes burst: e.g. 62,5 kbytes drop (excesso) X drop
RED: Random Early Detection > tc qdisc add dev eth0 root handle 1:0 \ red limit <bytes> min <bytes> max <bytes> avpkt <bytes> \ burst <packets> probability <number> bandwidth <kbps> [ecn] > tc qdisc add dev eth0 parent 1:1 handle 10:0 red...
RED: Random Early Detection descarte total para fila instantânea descarte probabilístico máximo descarte probabilístico variável sem descarte 256 kbytes 32 kbytes 12 kbytes 0 > tc qdisc add dev eth0 root handle 1:0 \ red limit 256000 min 12000 max 32000 avpkt 1000 \ burst 20 probability 0.02 bandwidth 512 ecn
Conclusão O tc do linux apresenta um conjunto de algoritmos para controlar a forma como o tráfego é transmitido. As políticas de QoS são feitas de forma independente para cada interface do computador/roteador Os algoritmos de enfileiramento afetam apenas os pacotes que saem pela interface, e não os que entram. Em um roteador, cada interface controla o QoS do tráfego em um único sentido.