O ALTQ (acrônimo para ALTernate Queuing, em inglês: "Enfileiramento Alternativo") é um arcabouço de software e agendador de rede (*network scheduler*) desenvolvido para a família de sistemas operacionais Berkeley Software Distribution (BSD). O ALTQ fornece disciplinas avançadas de enfileiramento de pacotes, controle de taxa de transmissão (*traffic shaping*), prevenção de congestionamento e componentes de qualidade de serviço (QoS), permitindo o gerenciamento e a partilha controlada de largura de banda em roteadores, firewalls e servidores baseados em sistemas operacionais do tipo Unix.
Originalmente concebido para superar as limitações do tradicional mecanismo FIFO (First-In, First-Out) padrão dos sistemas Unix, o ALTQ foi integrado a diversos sistemas BSD, incluindo FreeBSD, NetBSD e DragonFly BSD, além de ter feito parte central do projeto KAME. O arcabouço alcançou ampla notoriedade global ao ser integrado ao filtro de pacotes PF (Packet Filter) do OpenBSD, tornando-se a tecnologia de modelagem de tráfego basilar de distribuições populares de segurança de rede, como o pfSense e o OPNsense. No OpenBSD, o ALTQ foi descontinuado na versão 5.5 e definitivamente removido em 2014 com o lançamento da versão 5.6, sendo substituído por um novo subsistema de enfileiramento nativo otimizado para multiprocessamento simétrico (SMP).
História e desenvolvimento O desenvolvimento do ALTQ foi iniciado em 1997 pelo pesquisador japonês **Kenjiro Cho** nos laboratórios da Sony Computer Science Laboratories (Sony CSL) em Tóquio. Naquela época, os roteadores baseados em computadores pessoais padrão (PC-UNIX) ganhavam espaço pela flexibilidade e baixo custo, mas a pilha de rede dos kernels BSD clássicos utilizava uma fila de transmissão de pacotes única e rígida por interface de rede (`if_snd`), que operava no modelo *drop-tail* FIFO: os pacotes eram enviados na ordem estrita de chegada e, quando a fila enchia, novos pacotes eram sumariamente descartados. Esse modelo era inadequado para lidar com aplicações sensíveis a atrasos (latência), como VoIP, áudio/vídeo em tempo real e tráfego interativo de terminal.
Cho apresentou formalmente a arquitetura do ALTQ na conferência anual da USENIX em Nova Orleans, em junho de 1998, sob o título "A Framework for Alternate Queueing: Towards Traffic Management by PC-UNIX Based Routers". O projeto propunha uma abstração limpa no kernel capaz de acoplar múltiplos algoritmos de enfileiramento sem exigir a reescrita dos drivers de dispositivos de rede.
Pouco depois, o ALTQ foi incorporado ao consórcio de pesquisa japonês KAME, responsável pelo desenvolvimento da pilha de referência IPv6 e IPsec para o mundo BSD. Quando o desenvolvedor Daniel Hartmeier integrou o suporte ao ALTQ no recém-criado filtro de pacotes PF do OpenBSD em 2001 (OpenBSD 3.0), a configuração de QoS — que antes dependia de daemons em espaço de usuário (`altqd`) e do arquivo `/etc/altq.conf` — passou a ser declarada de maneira centralizada diretamente no arquivo de configuração do firewall (`pf.conf`).
Arquitetura e funcionamento O ALTQ atua no nível da camada de enlace e de rede do sistema operacional, interceptando os pacotes no momento em que são entregues pelo subsistema TCP/IP para transmissão por uma interface de rede física ou virtual. O funcionamento baseia-se em três etapas operacionais integradas:
Classificação de pacotes (Classifier): Quando um pacote IP atinge a interface de saída, o classificador examina os campos do cabeçalho (endereços IP de origem/destino, portas TCP/UDP, protocolo e campos ToS ou DiffServ/DSCP). Essa classificação determina a qual fila lógica o pacote pertence. Enfileiramento e estratégia de descarte (Enqueue / Drop Strategy): O pacote é inserido na fila correspondente. Se a fila estiver cheia ou se algoritmos de prevenção de congestionamento estiverem ativos (como o RED), o mecanismo decide se o pacote deve ser colocado na fila ou descartado imediatamente. Agendamento e desenfileiramento (Scheduling / Dequeue): Quando o controlador de rede (*hardware*) conclui o envio anterior e solicita novos dados para transmissão, o agendador seleciona qual pacote de qual fila será retirado e enviado ao driver, com base nas prioridades, pesos e curvas de serviço configuradas.
Além dos agendadores, o ALTQ inclui o componente **TBR** (Token Bucket Regulator), um regulador que atua limitando a velocidade de saída da interface de rede a uma taxa constante, simulando a largura de banda nominal de um link contratado para evitar que o buffer do modem externo encha e cause latência excessiva.
Algoritmos e disciplinas suportadas O ALTQ implementa e oferece suporte a várias disciplinas clássicas e modernas de gerenciamento de tráfego de redes de computadores:
CBQ (Class-Based Queueing) O **CBQ** organiza as filas de tráfego em uma estrutura hierárquica de árvore. Uma interface de rede possui uma fila-raiz (*root queue*), da qual derivam filas-filhas (*child queues*), que podem se subdividir sucessivamente. Cada classe recebe uma alocação garantida de porcentagem de largura de banda e um nível de prioridade estática. O diferencial do CBQ é o mecanismo de empréstimo (*borrowing*): se uma classe de tráfego não estiver utilizando toda a sua cota contratada, classes irmãs ou parentes podem "tomar emprestada" a banda ociosa temporariamente.
HFSC (Hierarchical Fair Service Curve) O **HFSC** é considerado um dos agendadores mais avançados disponíveis no ALTQ. Ao contrário da maioria dos agendadores que atrelam a prioridade de tempo diretamente à largura de banda alocada, o HFSC opera desacoplando a garantia de **atraso (latência)** da garantia de **largura de banda (vazão)** por meio do conceito de "curvas de serviço" de duas inclinações lineares (compostas por parâmetros de atraso inicial e taxa contínua). O HFSC é amplamente empregado em ambientes onde pacotes pequenos de tempo real (como pacotes de voz VoIP e jogos online) exigem entrega quase instantânea, mesmo enquanto transferências volumosas de dados (BitTorrent, downloads HTTP) utilizam a totalidade do link.
PRIQ (Priority Queueing) O **PRIQ** é um agendador estrito por prioridades. Diferente do CBQ e do HFSC, as filas no PRIQ são planas (não possuem relação de hierarquia ou parentesco) e cada uma recebe um índice de prioridade que varia de 0 a 15. O algoritmo processa e esvazia completamente a fila de prioridade mais alta antes de enviar um único pacote da fila de prioridade imediatamente inferior. Trata-se de uma disciplina de configuração simples e eficaz para tráfego crítico, mas que exige cautela, pois fluxos excessivos na fila de alta prioridade podem causar a inanição total (*starvation*) do tráfego das filas menos prioritárias.
FairQ / WFQ (Fair Queueing) O **FairQ** (e sua variante ponderada WFQ) busca distribuir a capacidade de transmissão de maneira estritamente justa e proporcional entre as diferentes conexões ou fluxos de rede ativos, impedindo que um único fluxo agressivo e malcomportado monopolize toda a capacidade do canal de comunicação.
Gerenciamento ativo de filas (AQM: RED, RIO e CoDel) Para combater o fenômeno do bufferbloat e a sincronização global de rajadas TCP, o ALTQ suporta mecanismos de descarte antecipado: RED (Random Early Detection): monitora o tamanho médio da fila física e descarta pacotes de forma estatística e aleatória antes que o buffer atinja a saturação máxima, forçando os emissores TCP a reduzirem suas janelas de congestionamento suavemente. RIO (RED with In/Out): variante do RED desenvolvida para arquiteturas DiffServ, que estabelece dois limiares de probabilidade de descarte: um rigoroso para pacotes fora do contrato de serviço (*Out-of-Profile*) e outro brando para pacotes em conformidade (*In-Profile*). CoDel (Controlled Delay): algoritmo moderno de gerenciamento ativo implementado em versões recentes do ALTQ (notadamente no FreeBSD e pfSense), que mede o tempo real de permanência (*sojourn time*) dos pacotes na fila, descartando tráfego apenas quando a latência de trânsito ultrapassa uma janela de tempo determinada.
Exemplo de sintaxe no Packet Filter (PF) Durante os anos em que esteve integrado ao PF, a configuração de disciplinas ALTQ era feita de forma declarativa no arquivo `/etc/pf.conf`. O exemplo abaixo ilustra a criação de um agendador de prioridades (PRIQ) em uma interface de saída de 10 Mbit/s com o gerenciamento de fila RED ativado na fila de tráfego padrão:
# Ativa o agendador PRIQ na interface externa 'em0' limitando a 10 Mbps altq on em0 priq bandwidth 10Mb queue { q_prioritaria, q_padrao }
# Define as filas de tráfego queue q_prioritaria priority 7 queue q_padrao priority 1 priq(default) red
# Atribui pacotes SSH e DNS à fila de alta prioridade pass out on em0 proto tcp to any port ssh queue q_prioritaria pass out on em0 proto udp to any port domain queue q_prioritaria pass out on em0 proto tcp to any queue q_padrao
Evolução e remoção no OpenBSD Apesar de seu sucesso histórico, o código original do ALTQ foi projetado no final dos anos 1990 para arquiteturas monoprocessadas de núcleo único (governadas por travas globais no kernel). Com a evolução do hardware para processadores multinúcleo e o esforço da equipe do OpenBSD em eliminar o bloqueio global do kernel (*Fine-Grained SMP*), a arquitetura do ALTQ tornou-se um obstáculo de desempenho e manutenção técnica.
Além do custo de sincronização em ambientes SMP, a sintaxe acoplada do ALTQ no `pf.conf` misturava a semântica de estados com a alocação de filas, gerando complexidade de código desnecessária. O desenvolvedor do OpenBSD Henning Brauer concebeu e implementou um novo subsistema de enfileiramento nativo integrado ao PF, focado em simplicidade, alta escalabilidade e paralelismo.
Como consequência dessa transição: No **OpenBSD 5.5** (abril de 2014), o ALTQ foi formalmente marcado como obsoleto (*deprecated*); No **OpenBSD 5.6** (novembro de 2014), o código-fonte do ALTQ foi completamente expurgado da árvore do sistema.
No entanto, o ALTQ permaneceu como a infraestrutura de QoS e controle de tráfego padrão em outros sistemas da família BSD, continuando plenamente suportado no kernel do **FreeBSD**, no **NetBSD** e nas plataformas de appliances de rede baseadas em FreeBSD, como o **pfSense** e o **OPNsense**.
Ver também Agendador de rede Qualidade de serviço (telecomunicações) Traffic shaping PF (firewall) Bufferbloat KAME project pfSense
Referências
Ligações externas
Categoria:Desempenho de rede Categoria:Algoritmos de escalonamento Categoria:Qualidade de serviço Categoria:Software BSD Categoria:FreeBSD Categoria:NetBSD Categoria:DragonFly BSD Categoria:Software livre programado em C