Autor Original do texto:
Martin A. Brown
martin@linux-ip.net
http://linux-ip.net
Martin A. Brown
martin@linux-ip.net
http://linux-ip.net
4. Componentes do Controle de Tráfego Linux
Tabela 1. Correlação entre elementos de controle de tráfego e componentes Linux
Elemento tradicional | Componente Linux |
---|---|
shaping | As classes oferecem capacidades de shaping. |
scheduling | Uma qdisc é um escalonador. Escalonadores podem ser simples como o FIFO ou complexos, contendo classes e outras qdisc’s, como HTB. |
classifying | O objeto filter executa a classificação através da ação de um objeto classificador . Estritamente falando, classificadores Linux não podem existir fora de um filtro. |
policing | Um policer existe na implementação de controle de tráfego Linux somente como parte de um filtro . |
dropping | Para drop tráfego exige um filtro com um policer que usa “descartar” como uma ação. |
marking | A qdisc dsmark é usada para marcação. |
4.1. Qdisc
Simplesmente indica que uma qdisc é um escalonador (Seção 3.2, “Scheduling”). Toda interface de saída precisa de algum tipo de escalonador, e o escalonador padrão é um FIFO. Outras qdisc’s disponíveis sob o Linux reorganizam os pacotes entrantes na fila do escalonador em consonância com aquelas regras do escalonador.
A qdisc é o bloco principal de montagem sobre a qual todo o controle de tráfego Linux é montado, e é também chamado de uma disciplina de enfileiramento.
As qdiscs classful podem conter classes, e fornecem um handle ao qual associar filtros. Não existe nenhuma proibição a respeito do uso de qdisc classful sem classes filhas, ainda que isso usualmente consumisse ciclos e outros recursos de sistema sem qualquer benefício.
As qdiscs classless não podem conter nenhuma classe, e nem é possível associar filtro a uma qdisc classless. Porque uma qdisc classless não contém nenhum filho de qualquer tipo, não existe nenhum utilitário para classificação. Isso significa que nenhum filtro pode ser associado a uma qdisc classless.
Uma fonte de confusão terminológica é o uso dos termos qdisc root e qdisc ingress. Essas não são realmente disciplinas de enfileiramento, mas especialmente locais nos quais estruturas de controle de tráfego podem ser associadas para egress (tráfego sainte) e ingress (tráfego entrante).
Cada interface contém ambas. A primária e mais comum é a qdisc egress, conhecida como qdisc root. Ela pode conter qualquer das disciplinas de enfileiramento (qdiscs) com classes potenciais e estrutura de classe. A maioria esmagadora das documentações se aplica a qdisc root e suas filhas. O tráfego transmitido sobre uma interface atravessa a egress ou a qdisc root.
Para tráfego aceitado sobre uma interface, a qdisc ingress é atravessada. Com sua utilidade limitada, ela não permite que nenhuma classe filha seja criada, e somente existe como um objeto na qual um filtro pode ser afixado. Para propósitos práticos, a qdisc ingress é meramente um objeto conveniente no qual associar um guarda para limitar a quantidade de tráfego aceitado sobre uma interface de rede.
Em resumo, você pode fazer muito mais com uma qdisc egress porque ela contém uma qdisc real e o poder total do sistema de controle de tráfego. Uma qdisc ingress pode somente suportar um guarda. O restante da documentação se preocupará com as estruturas de controle de tráfego associadas com a qdisc root a não ser que especificado em contrário.
4.2 Classe
As Classes somente existem dentro de uma qdisc classful (por exemplo, HTB e CBQ). As Classes são imensamente flexíveis e podem sempre conter tanto múltiplas classes filhas como uma única qdisc filha [5]. Não existe qualquer proibição contra uma classe conter uma qdisc classful em si, o que facilita tremendamente cenários complexos de controle de tráfego.
Qualquer classe pode também ter um número arbitrário de filtros afixados a ela, que permite a seleção de uma classe filha ou o uso de um filtro para re-classificar ou descartar o tráfego entrante em uma classe particular.
Uma classe folha é uma classe terminal em uma qdisc. Ela contém uma qdisc (FIFO padrão) e nunca conterá uma classe filha. Qualquer classe que contenha uma classe filha é uma classe interna (ou classe root) e não uma classe folha.
4.3 Filter
O filtro é o componente mais complexo no sistema de controle de tráfego Linux. O filtro fornece um mecanismo conveniente para colar junto vários dos elementos do controle de tráfego chaves. A função mais simples e mais óbvia do filtro é classificar pacotes (veja Seção 3.3, “Classifying”). Os filtros Linux permitem ao usuário classificar pacotes em uma fila de entrada tanto com vários filtros diferentes como um único filtro.
• Um filtro precisa conter uma frase classifier.
• Um filtro precisa conter uma frase policer.
Os filtros podem ser associados tanto a qdiscs classful como a classes, contudo o pacote enfileirado sempre entra primeiro na qdisc root. Após o filtro associado à qdisc root ter sido atravessada, o pacote pode ser direcionado a quaisquer subclasses (que pode ter seus próprios filtros) onde o pacote pode experimentar mais classificação.
4.4 Triador/Classificador (classifier)
Objetos filtro, os quais podem ser manipulados usando tc, pode usar vários mecanismos de classificação diferentes, o mais comum desses é o classificador u32. O classificador u32 permite ao usuário selecionar os pacotes baseado nos atributos de cada pacote.
Os classificadores são ferramentas que podem ser usadas como parte de um filtro para identificar características de um pacote ou metadados de pacote. O objeto classificador Linux é uma analogia direta com a operação básica e com o mecanismo elementar de classificação de controle de tráfego.
4.5 Vigilante (policer)
Esse mecanismo elementar é somente usado no controle de tráfego Linux como parte de um filtro. Um guarda chama uma ação acima e uma outra ação abaixo da taxa especificada. O uso hábil de guardas pode simular um medidor de três cores. Veja também a Seção 10, “Diagrama”.
Muito embora tanto o policiamento quanto a shaping sejam elementos básicos do controle de tráfego para limitar o uso de largura de banda, um guarda nunca vai atrasar o tráfego. Ele somente pode executar uma ação baseada no critério especificado. Veja também o Exemplo 5, “tc filter”.
4.6 drop
Esse mecanismo básico de controle de tráfego é usado somente no controle de tráfego Linux como parte de um guarda. Qualquer guarda associado a qualquer filtro pode ter uma ação descartar.
Obs.:
O único lugar no sistema de controle de tráfego Linux onde um pacote pode ser explicitamente descartado é em um guarda. Um guarda pode limitar pacotes enfileirados a uma taxa específica, ou pode ser configurado para descartar todo tráfego que bate com um padrão particular [6].
Existem, contudo, lugares dentro do sistema de controle de tráfego onde um pacote pode ser descartado como um efeito colateral. Por exemplo, um pacote será descartado se o escalonador empregado usa esse método para controlar fluxos como faz o GRED.
Também, um shaper ou escalonador que esteja rodando fora do seu espaço de buffer alocado pode precisar descartar particularmente um pacote durante uma rajada ou em um período sobrecarregado.
4.7 Handle
Toda classe e qdisc classful (veja também Seção 7, “Classful Queuing Disciplines (qdisc’s)”) exigem um identificador único dentro da estrutura de controle de tráfego. Esse identificador único é conhecido como handle e tem dois membros eleitor, o número major e o número minor. Esses números podem ser atribuídos arbitrariamente pelo usuário em consonância com as seguintes regras [7].
A numeração dos handle’s para classes e qdisc’s
major
Esse parâmetro é completamente livre de significado ao kernel. O usuário pode usar um esquema de numeração arbitrário, contudo, todos os objetos na estrutura de controle de tráfego com o mesmo parent (genitor) precisam compartilhar um número handle major. Esquemas de numeração convencional começa com 1 para objetos associados diretamente a qdisc root.
minor
Esse parâmetro identifica de forma não ambígua o objeto como uma qdisc se minor for 0. Qualquer outro valor identifica o objeto como uma classe. Todas as classes que compartilhar um genitor precisam ter números minor únicos.
O handle especial ffff:0 é reservado para a qdisc ingress.
O handle é usado como o alvo nas frases classid e flowid das instruções ‘tc filter’. Esses handle’s são identificadores externos para os objetos, usáveis pelas aplicações do espaço de usuário. O kernel mantém identificadores internos para cada objeto.
________________________________________
[5] Uma qdisc classful pode ter somente classes descendentes do seu tipo. Por exemplo, uma qdisc HTB pode ter somente classes HTB como descendentes. Uma qdisc CBQ não pode ter classes HTB como descendentes.
[6] Nesse caso, você teria um filtro que usa um classificador para selecionar os pacotes que você deseja descartar. Então você usaria um policer com uma ação drop igual aqui: police rate 1bps burst 1 action drop/drop.
[7] Eu não sei a faixa e nem a base desses números. Eu acredito que eles sejam números u32 hexadecimais, mas preciso confirmar isso.
Nenhum comentário:
Postar um comentário