Dia 15: QoS — Traffic Shaping, Priorização de Tráfego e DSCP

Quality of Service (QoS) é o conjunto de técnicas que garantem que o tráfego crítico — voz, vídeo, transações — recebe prioridade sobre tráfego menos sensível a atraso. Neste artigo vamos explorar DSCP, DiffServ, traffic shaping vs policing e configurar QoS no Linux com tc e HTB.

ℹ O QoS garante que tráfego crítico (VoIP, vídeo) tem prioridade sobre tráfego menos sensível (downloads, cópias de segurança) — essencial em ligações limitadas.

Neste artigo

1. Introdução ao QoS

Quality of Service (QoS) é a capacidade de gerir os recursos de rede de forma a dar prioridade a certos tipos de tráfego. Sem QoS, todos os pacotes são tratados igualmente — numa ligação congestionada, uma chamada VoIP compete directamente com um download de ficheiro grande, e ambos sofrem.

Os quatro parâmetros que o QoS tenta controlar são:

Parâmetro Descrição Impacto em tempo real
Largura de banda Taxa de transferência disponível Voz precisa de 64–100 kbps por chamada
Latência Atraso fim-a-fim VoIP < 150 ms para qualidade aceitável
Jitter Variação da latência entre pacotes > 30 ms causa cortes e robótica na voz
Perda de pacotes Pacotes descartados em congestionamento > 1% degrada chamadas VoIP significativamente

O QoS não cria largura de banda extra — apenas reorganiza a prioridade do tráfego existente. Se uma ligação tem 10 Mbps e há 15 Mbps de tráfego, algo tem de ser descartado ou atrasado. O QoS decide o quê.

2. DSCP e DiffServ

O modelo DiffServ (Differentiated Services), definido na RFC 2474, é a abordagem moderna para QoS em redes IP. Em vez de reservar recursos fim-a-fim (como o modelo IntServ/RSVP), o DiffServ marca cada pacote com um código de 6 bits no campo ToS (Type of Service) do cabeçalho IP — o DSCP (Differentiated Services Code Point).

Os 6 bits do DSCP permitem 64 valores possíveis (0–63). Cada router ao longo do caminho lê este valor e aplica a política de QoS correspondente — não precisa de conhecer o fluxo individual, apenas a classe.

As classes DSCP mais usadas na prática são:

Classe DSCP Valor decimal Nome Uso típico
EF 46 Expedited Forwarding VoIP — prioridade máxima
AF41 34 Assured Forwarding Vídeo em tempo real (streaming, conferências)
AF31 26 Assured Forwarding Voz de sinalização (SIP, H.323)
AF21 18 Assured Forwarding Transações (SSH, base de dados)
AF11 10 Assured Forwarding Tráfego de dados em geral
CS0 0 Best Effort (predefinido) Downloads, backups, tráfego sem marcação

Para verificar o DSCP dos pacotes numa interface, pode-se usar tcpdump com filtro no campo ToS:

# Verificar DSCP em pacotes VoIP (SIP na porta 5060)
tcpdump -n -v -i eth0 'port 5060' | grep 'tos 0xb8'

# Capturar pacotes com DSCP EF (Expedited Forwarding)
tcpdump -n -v -i eth0 'ip[1] & 0xfc' = 0xb8

# Listar todos os valores ToS distintos na interface
tcpdump -n -v -i eth0 | awk '/tos/ {print $NF}' | sort | uniq -c | sort -rn

3. Traffic Shaping vs Policing

As duas técnicas fundamentais de controlo de taxa de tráfego — shaping e policing — têm objectivos diferentes e efeitos distintos no tráfego.

Traffic Shaping armazena pacotes excessivos numa fila e envia-os gradualmente. Suaviza rajadas (bursts) e mantém o fluxo dentro de um limite, mas adiciona latência aos pacotes adiados. É ideal para tráfego que tolera algum atraso (dados, backups) mas precisa de uma taxa máxima garantida.

Traffic Policing descarta imediatamente os pacotes que excedem o limite configurado (ou os remarca para uma classe inferior). Não introduz atraso — mas causa perda de pacotes. É usado para impor limites rígidos, tipicamente na entrada de uma rede (ingress).

Característica Shaping Policing
Mecanismo Coloca em fila (buffer) Descarta ou remarca
Latência Aumenta (atraso intencional) Não afecta pacotes admitidos
Perda de pacotes Baixa (só se a fila encher) Imediata no excesso
Suavização de bursts Sim Não
Direcção típica Egress (saída) Ingress (entrada) ou egress

⚠ O QoS só funciona se for aplicado no ponto de congestionamento — configurar QoS no router errado não ajuda.

4. Configurar QoS com tc/htb

No Linux, a ferramenta tc (Traffic Control) do pacote iproute2 gere filas e disciplinas de tráfego. O HTB (Hierarchy Token Bucket) é o qdisc mais usado para shaping por classes — permite definir uma hierarquia de classes com taxas garantidas e limites máximos (ceil).

Um cenário típico: uma ligação de 100 Mbps partilhada entre três classes — VoIP (50 Mbps garantidos, alta prioridade), vídeo/dados (30 Mbps) e tráfego best-effort (20 Mbps). Cada classe pode usar até 100 Mbps se as outras não estiverem a usar a sua quota.

# Verificar interface para QoS
tc qdisc show dev eth0

# HTB — hierarquia de classes
tc qdisc add dev eth0 root handle 1: htb predefinido 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit prio 0
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 80mbit prio 1
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 20mbit ceil 50mbit prio 2

# Filtrar VoIP (DSCP 46 = EF)
tc filter add dev eth0 protocol ip parent 1:0 prio 0 u32 \
    match ip tos 0xb8 0xfc flowid 1:10

# Marcar tráfego com DSCP (iptables)
iptables -t mangle -A POSTROUTING -p udp --dport 5060 -j DSCP --set-dscp 46
iptables -t mangle -A POSTROUTING -p udp --dport 10000:20000 -j DSCP --set-dscp 46

# Verificar classes tc
tc class show dev eth0

# Remover QoS
tc qdisc del dev eth0 root

Neste exemplo, a classe 1:10 (VoIP) tem prio 0 — a prioridade mais alta. O filtro u32 faz match no campo ToS com valor 0xb8 (DSCP 46 = EF) e encaminha para a classe 1:10. A regra do predefinido 30 envia tráfego não classificado para a classe best-effort.

O ceil define o máximo absoluto que a classe pode usar — mesmo que exista largura de banda livre. Sem ceil, uma classe pode emprestar toda a largura de banda excedente das classes irmãs.

Para além do HTB, existem outros qdiscs relevantes:

  • CBQ (Class Based Queueing): mais antigo, baseado em estimativas de largura de banda. Menos preciso que HTB, mas ainda usado em routers antigos e em algumas implementações de switches geridos.
  • PRIO: qdisc sem shaping — apenas prioriza com base em classes. Útil quando não é necessário limitar a taxa, só reordenar.
  • FQ-CoDel (Fair Queueing Controlled Delay): qdisc moderno que combina fila justa com gestão de latência. Combate o bufferbloat de forma eficaz. Recomendado em routers de operadora.

5. Priorização de VoIP e Vídeo

VoIP e vídeo em tempo real são as aplicações mais sensíveis a latência, jitter e perda de pacotes. Uma chamada VoIP precisa de latência inferior a 150 ms e jitter abaixo de 30 ms para manter qualidade aceitável. Vídeo em tempo real tolera mais largura de banda mas é igualmente sensível a variações súbitas.

A estratégia para priorizar tráfego em tempo real tem três passos: marcar, classificar e agendar.

1. Marcar — usar iptables/nftables na tabela mangle para atribuir DSCP com base na porta ou protocolo:

# Marcar SIP (sinalização VoIP) — DSCP AF31
iptables -t mangle -A POSTROUTING -p udp --dport 5060 -j DSCP --set-dscp 26
iptables -t mangle -A POSTROUTING -p tcp --dport 5060 -j DSCP --set-dscp 26

# Marcar RTP (áudio VoIP) — DSCP EF (46)
iptables -t mangle -A POSTROUTING -p udp --dport 10000:20000 -j DSCP --set-dscp 46

# Marcar vídeo (Zoom, Teams, Meet) — DSCP AF41 (34)
iptables -t mangle -A POSTROUTING -p udp --dport 3478 -j DSCP --set-dscp 34
iptables -t mangle -A POSTROUTING -p udp --dport 19302 -j DSCP --set-dscp 34

# Verificar marcação
iptables -t mangle -L POSTROUTING -v -n

2. Classificar — o tc lê o DSCP e encaminha para a classe apropriada. 3. Agendar — o qdisc HTB serve primeiro a classe com prio 0, garantindo que o VoIP é enviado antes do tráfego best-effort.

É importante configurar uma fila secundária dentro da classe VoIP com pfifo (FIFO com tamanho limitado) em vez de bfifo — o pfifo descarta pacotes excessivos em vez de os armazenar, evitando latência adicional que degradaria a chamada:

# Fila pfifo para VoIP — descarta em vez de atrasar
tc qdisc add dev eth0 parent 1:10 handle 101: pfifo limit 10

# Fila sfq (Stochastic Fairness Queueing) para dados
tc qdisc add dev eth0 parent 1:20 handle 201: sfq perturb 10

# Fila sfq para best-effort
tc qdisc add dev eth0 parent 1:30 handle 301: sfq perturb 10

6. QoS em Switches e Routers

O QoS em equipamentos geridos (switches L2/L3 e routers) implementa-se através de mecanismos padronizados. A maioria dos switches geridos suporta 4 ou 8 filas de hardware por porta, mapeadas a classes de prioridade. Os routers adicionam qdiscs de software equivalentes ao tc do Linux.

Os mecanismos típicos em switches geridos são:

  • Classificação por CoS (Class of Service): prioridade na camada 2 (campo PCP de 3 bits no cabeçalho 802.1Q). 8 níveis (0–7). Mapeado para filas de hardware.
  • Classificação por DSCP: prioridade na camada 3 (campo ToS do IP). 64 valores possíveis, mapeado para as filas L2.
  • Trust boundaries: definir em que portas o switch confia na marcação existente (portas de acesso de VoIP) e em que portas remarca (portas de uplink).
  • scheduling: disciplinas como Strict Priority (SP), Deficit Weighted Round Robin (DWRR) ou Shaped Deficit Weighted Round Robin (SDWRR) para servir as filas.

Exemplo de configuração num switch Cisco (modo access para telefone VoIP):

# Switch Cisco — confiar DSCP na porta do telefone
interface GigabitEthernet0/1
  description Telefone VoIP
  switchport mode access
  switchport access vlan 10
  mls qos trust dscp
  priority-queue out

# Configurar mapeamento DSCP -> CoS
mls qos map dscp-cos 46 to 5
mls qos map dscp-cos 34 to 4

# Router Cisco — política de QoS na WAN
class-map match-any VOIP
  match dscp ef
policy-map WAN-QoS
  class VOIP
    priority 512
    set dscp ef
  class VIDEO
    bandwidth 2048
  class class-predefinido
    fair-queue
interface Serial0/0
  service-policy output WAN-QoS

Em routers domésticos com OpenWrt, o SQM (Smart Queue Management) com cake ou fq_codel é a abordagem mais simples e eficaz — aplica shaping bidireccional e combate o bufferbloat sem necessidade de classificação manual por portas.

7. Erros Comuns e Lista de Verificação

A configuração de QoS tem armadilhas frequentes que produzem sintomas difíceis de diagnosticar — o tráfego parece funcionar, mas a qualidade de voz ou vídeo degrada de forma intermitente.

Os erros mais comuns:

  • QoS no lado errado: aplicar shaping na interface interna quando o congestionamento está na WAN (saída para o ISP). O QoS deve ser aplicado no ponto de congestionamento — tipicamente a interface WAN de saída.
  • Não reservar largura de banda: configurar rate 100mbit numa ligação de 100 Mbps reais — a sobrecarga de encapsulamento (PPPoE, IPsec) reduz a taxa útil para ~94 Mbps. Configurar sempre 90–95% da taxa real para evitar filas no modem.
  • Esquecer a marcação de entrada: configurar tc mas não marcar DSCP com iptables mangle — o tráfego chega sem marcação e cai na classe predefinido.
  • Filas demasiado grandes em VoIP: usar bfifo na classe VoIP introduz latência. Usar pfifo limit 10 — descarta em vez de acumular.
  • Confiança em marcações não confiáveis: aceitar DSCP de portas de acesso sem trust boundary. Qualquer cliente pode marcar os seus pacotes como EF e roubar prioridade. Remarcar para CS0 nas portas de acesso e confiar apenas nas portas onde há equipamento gerido.
  • Ignorar o sentido de retorno: configurar QoS apenas na saída (egress) e esquecer que o tráfego de entrada também pode congestionar — especialmente em ligações assimétricas (ADSL, LTE).
Verificação Comando Resultado esperado
Qdisc activo tc qdisc show dev eth0 HTB como root qdisc
Classes configuradas tc class show dev eth0 3 classes com taxas e prioridades
Filtros DSCP tc filter show dev eth0 Filtro u32 para ToS 0xb8
Marcação mangle iptables -t mangle -L -v -n Regras DSCP nas portas 5060 e 10000:20000
Estatísticas em tempo real tc -s class show dev eth0 Contadores de pacotes e bytes por classe

Estes comandos permitem confirmar que o QoS está correctamente configurado e a funcionar. Se os contadores das classes mostram tráfego distribuído pelas três classes e a classe VoIP tem prio 0 a ser servida primeiro, a configuração está correcta.

Artigos Relacionados