(Traffic Control)
Numa empresa, uma hora ou outra surgirá alguém reclamando que o acesso a Internet está lento, mesmo aumentando o link de 1Mbit para 2, de 2 para 5, de 5 para 10 megabits de largura de banda e assim sucessivamente, haverão momentos de lentidão. Isto se deve, na maioria das vezes, aos downloads e/ou uploads de arquivos muito grandes. É muito comum um usuário baixar, CDs, DVDs, vídeos, músicas pela Internet da empresa. Algumas vezes legítimos e outros não. Também, não se pode esquecer de programas de gerenciamento de downloads que abrem diversas conexões simultâneamente, fazendo uma concorrência desleal com os outros usuários que abrem somente uma conexão.
Para impedir que tais downloads e uploads consumam toda a banda de rede disponível é necessário CONTROLAR O TRÁFEGO que entra e que sai. No GNU/Linux, o comando utilizado para isto é o TC (Traffic Control). Ao falar em controlar o tráfego de rede tem-se a impressão de impedir ou permitir um determinado tráfego que pode ser feito facilmente com o comando IPTABLES, mas o que o IPTABLES faz é FILTRAR O TRÁFEGO e não CONTROLAR.
Então, como controlar um download e/ou upload para não consumir(em) toda a largura de banda disponível na rede? Se formos ao pé da letra de questões técnicas, para conseguirmos diminuir ou aumentar a largura de banda de uma rede, pois precisaríamos realizar mudanças físicas no material usado na contrução do cabo de comunicação com a Internet ou com a LAN.
O que se pode fazer é controlar o tráfego colocando regras da seguinte maneira, por exemplo, se o trafégo for HTTP, ter como origem a Internet e destino a LAN (ou seja, um download), diminua o trafego para 300kbit. Assim, se tivermos uma largura de banda de 1Mbit (1000Kbit), 700kbit ficará livre. Aparentemente, houve uma diminuição da largura de banda, mas isto é só aparência, pois na verdade a largura de banda ainda continua a mesma, ou seja, 1Mbit.
Agora, será provado por que não houve diminuição da largura de banda e sim um simples controle de tráfego. Ao realizar a regra do parágrafo anterior para diminuir um download de 1Mbit/s para 300Kbit/s, tal regra trabalha na saída da interface de rede, onde existe uma memória buffer que enfileira todo o tráfego antes de colocá-lo no cabo de rede. O que a regra faz é não colocar os pacotes no cabo de rede na velocidade máxima. A regra vai colocando os pacotes de maneira mais lenta. Observe que esta regra trabalha na interface de rede/placa de rede (mais especificamente na memória buffer dela onde todo o tráfego está enfileirado) e não no cabo de rede. Por isto, dizemos que o tráfego é controlado e a largura de banda não é mudada.
Também, pode-se observar que quando um pacote está na fila de um buffer da placa de rede, ele pode ser manuseado. Assim, um recurso bastante utilizado no controle de tráfego é a priorização de pacotes. Desta maneira, pode-se informar através de regras que um determinado pacotes deve ser desenfileirado antes dos outros.
O comando utilizado no GNU/Linux para realizar o controle de tráfego é o ''tc''. Para que esse comando esteja díponível no shell é necessário instalar o pacote chamado ''iproute2''. Para fazer isto no Debian GNU/Linux digite:
apt-get update ; apt-get install iproute2
Tal pacote também deixa disponível um comando muito importante chamado ''ip''
Abaixo é apresentado um texto que não é necessário para aprender controle de tráfego no GNU/Linux, mas quem quiser aumentar o conhecimento na área de redes, então mãos a obra:
Uma pergunta que não quer calar é: Então, como as operadoras de telecomunicação como a OIBrT, GVT, NetVitual, Telefônica, Amais etc conseguem aumentar e diminuir a banda de rede de um link numa empresa ou residência sem mudar o cabo de comunicação. Por exemplo, quando uma empresa muda o seu link de 1Mbit e para 2Mbit, não há mudança no cabeamento. Simplesmente, é solicitada a mudança, geralmente por telefone, e quase que instaneamente é aumentada a largura de banda. Na verdade, o que as operadoras fazem é controlar o tráfego, da mesma forma que no GNU/Linux. As operadoras controlam as saídas dos seus roteadores, enfileirando o tráfego. Exemplo, se uma empresa tem um largura de banda de 1Mbit, os roteadores da operadora desenfileirarão os pacotes provinientes desta empresa numa velocidade. Já uma outra empresa que tem um link de 10Mbit, os roteadores desenfileirarão o tráfego numa velocidade 10 vezes maior que na primeira empresa.
Com isto, pode-se perceber que os links entre os roteadores de uma operadora têm uma largura de banda muito grande (ex: 10Gbit), só que toda esta largura é divida entre os vários clientes através do controle de tráfego. Vale evidenciar que estes roteadores, controlados pelas operadoras, têm uma memória buffer gigantesca para acomodar todos os pacotes provinientes de diversos lugares. Quando tal buffer lota, os pacotes são descartados e haverá congestionamento.
Vale evidenciar que o exposto neste artigo, está relacionado ao controle de tráfego utilizado na maioria da vezes nos roteadores. No entanto. nada impede utilizar o comando TC em servidores ou estações de trabalho. Além disso, não podemos esquecer que se têm dois tipos de buffer. O primeiro já foi exposto nos parágrafos anteriores e nada mais é do que uma memória utilizada pela interface de rede, a qual armazena os pacotes antes de colocá-los no cabo de rede, sendo muito utilizada nos roteadores. O segundo tipo é um buffer utilizado nas aplicações das estações de trabalho. Um exemplo clássico é o YOUTUBE, ao assistir um vídeo pela Internet é possível ver a bufferização do vídeo antes dele ser exibido. Esta solicitação de bufferização do vídeo é proviniente dos servidores que oferecem o serviço, utilizando o protocolo TCP para isto. Só para evidênciar, apesar da origem da solicitação de bufferização ser dos servidores, os roteadores podem mudar alguns campos do cabeçalho TCP quando os pacotes passarem por ele (comando iptables) para que o cliente faça o buffer antes de exibir, por exemplo, o vídeo.
Devido ao explicado no parágrafo anterior, quando uma aplicação utiliza o buffer nos clientes, ela não será em tempo real (não está acontecendo no momento) e geralmente usa o TCP para prover tais funcionalidades de bufferização nos clientes. Isto é conhecido como stremming de dados. Tais dados podem ser de vídeo, áudio etc. Veja que este tipo de buffer é da aplicação e não da placa de rede, sendo que não são enfileirados os pacotes, mas sim os dados contidos nos pacotes. Desda maneira, os dados são enfileirados (bufferizados) antes de serem entregues a aplicação. Quando os dados são entregues a aplicação, eles são processados. No caso do YOUTUBE, o vídeo será exibido quando os dados forem processados.
Nunca confundam o buffer das aplicações com o buffer da placa de rede.
Quando uma aplicação é em tempo real, ou seja, está acontecendo no momento, não é permitido buffer na aplicação e geralmente usa o protocolo UDP (o cabeçalho do UDP é bem pequeno comparado com o do TCP). Contudo, deve-se utilizar o buffer das interfaces de rede nos roteadores para reservar um fatia da largura de banda e para priorizar os seus pacotes (comando "TC" no GNU/Linux). Com isso, os pacotes de um aplicação em tempo real terão velocidade e priorização. Dois exemplos clássicos de aplicações que precisa ser em tempo real são o VoIP e a videoconferência. Neste caso de aplicações que necessitam ser em tempo real, nada impede de usar o comando "TC" no servidor. Vale lembrar que o servidor deve setar o cabeçalho IP e , se usado, o TCP (raramente usado) para que os roteadores (no caso do IP) e os clientes (no caso do TCP) possam permitir um processamento mais rápido de tais pacotes. Também, é importante lembrar que se pode usar o comando iptables nos roteadores para mudar o o cabeçalho IP e/ou TCP dos pacotes que passarem por eles, assim, colocando nos seus cabeçalhos que os pacotes devem ser priorizados etc.
ON-LINE = ON-DEMMAND
In the field of computer networking and other packet-switched telecommunication networks, the traffic engineering term quality of service (QoS) refers to resource reservation control mechanisms rather than the achieved service quality. Quality of service is the ability to provide different priority to different applications, users, or data flows, or to guarantee a certain level of performance to a data flow. For example, a required bit rate, delay, jitter, packet dropping probability and/or bit error rate may be guaranteed. Quality of service guarantees are important if the network capacity is insufficient, especially for real-time streaming multimedia applications such as voice over IP, online games and IP-TV….
Siglas, abreviações e significados
- TC (Traffic Control): comando utilizado para realizar o controle de tráfego no GNU/Linux. Com este comando, os pacotes podem ser classificados e colocados em filas de diversos tipos, de acordo com a sua classificação. Tais filas, no comando TC, são chamadas de classes, sendo que elas podem usar diversos algoritmos de enfileiramento (qdisc);
- qdisc (queueing discipline): entendido como disciplina (algoritmo) de controle (enfileiramento) de tráfego. Numa definição mais técnica, uma qdisc é um algoritmo que gerência a(s) fila(s) dentro do buffer numa interface de rede. Alguns tipos de qdisc são PFIFO (Packet First In First Out), PFIFO Fast (Packet First In First Out Fast), BFIFO (Byte First In First Out), RED (Random Early Detection), SFQ (Stochastic Fair Queuing), TBF (Token Bucket Filter), CBQ (Class Based Queueing), HTB (Hierarchy Token Bucket) e PRIO (Priority class). Toda vez que o kernel precisa enviar um pacote para uma interface de rede, ele é enfileirado no buffer numa qdisc configurada para aquela interface. Imediatamente depois, o kernel tenta conseguir tantos pacotes quanto possível da qdisc, para dá-los ao driver do adaptador/placa de rede;
- Classes: algumas qdiscs podem conter divisões chamadas de classes (que, por sua vez, podem conter outras subdivisões chamadas também de qdiscs). Desta maneira, o tráfego pode então ser enfileirado em qualquer uma das classes. Quando o kernel tenta desenfileirar um pacote da qdisc, tal pacote fica armazenada em uma classes, com isso, o pacote é classificado. O controle de tráfego pode, por exemplo, priorizar certos tipos de tráfego pela tentativa de desenfileirar de certas classes antes de outras. Pode-se criar classes separadas para os mais diversos tipos de tráfego como para E-Mail, HTTP, DNS, VoIP, IP específico etc;
- root qdisc: é a qdisc anexada em uma interface de rede, definindo que tipo de disciplina será usada numa determinada interface de rede. Para facilitar, sempre traduza root qdisc como qdisc raiz ou qdisc principal;
- handle: para facilitar o entendimento do controle de tráfego no GNU/Linux é usado o esquema de árvore para enfileirar os pacotes. O handle informa qual será a parte da árvore (ex: 1:0, 1:1 etc) usada na qdisc. Em outras palavras, é um número que define a root qdisc. Os handles das qdiscs consistem em duas partes, um número principal (major) e outro número secundário (minor) separados por dois pontos (:). Veja,
: . O root qdisc é normalmente nomeado como '1:' que também é igual a '1:0'. O menor número major e o menor número minor é sempre 1 e 0, respectivamente. Classes precisam ter o mesmo número major dos seus pais (parent). Este número major deve ser único dentro das configurações egress ou ingress; - Filter: a classificação pode ser efetuada usando filtros. Um filtro contém um número das condições que se combinar, faz um filter match;
- Largura de Banda (Bandwidth): na área de redes de computadores pode ser entendida como a quantidade máxima de bits que pode passar por um meio (exemplo, cabo de comunicação e/ou placa de rede) a cada segundo.
- A unidade de medida da lagura de banda em sinais analógicos é o hertz que significa frame/quadro/ciclo por segundo. Já em sinais digitais (computadores) a largura de banda é medida em bit por segundo. Com isto, é possível analisar que a constante usada para avaliar o tamanho da largura de banda em sinais digitais é a quantidade de bit que por passar por um meio a cada segundo. Então, se possuirmos um link de 128kbit podermos passar 128.000bit a cada segundo. Agora se possuírmos um link de 2Mbit, significa que se por passar 2.000.000 de bit por segundo. Por isto que muitas vezes aumentar a largura de banda não necessariamente aumentará a velocidade de navegação na Internet. Isto pode ser percebido ao acessar páginas na Internet, se possuir um link de 1Mbit e depois adiquirir um de 2Mbit, a velocidade de acesso as páginas será praticamente a mesma. Isto se deve a pequena quantidade de bytes recebida ao acessar páginas na Internet. Como a base da largura de banda é bit por segundo, se a página tiver 100kbytes, praticamente tanto faz se o link é de 1Mbit ou 2Mbit, pois o acesso a ela será muito rápido em qualquer das duas velocidades. Analise: se temos um link de 1Mbits e a página que queremos acessar tem 100Kbytes, demorará 0,8 segundos para acessar a página. Já um link de 2Mbits demorará 0,4 segundos. Práticamente impercebitível ao ser humano. O aumento na velocidade realmente será percebida ao realizar a troca de grandes quantidades de dados como downloads, assistir vídeos, jogar via Internet etc e. Também, o aumento da velocidade será notada quando se tem muitos computadores pendurados no mesmo link. Fora isto, é besteira adquirir links gigantesco somente para acessar páginas ou ver e-mails na Internet. Para adquirir links maiores é necessário monitorar o tráfego (MRTG e Sarg), saber quantos clientes existem na LAN e Internet e o que eles fazem. Muitas vezes um bom sistema de firewall (iptables, squid, tc) pode resolver;
Divisões da qdisc
Como já foi exposto a qdisc é entendido como disciplina (algoritmo) de controle (enfileiramento) de tráfego. Assim, é a qdisc que define os vários tipos de disciplina (algoritmo) que enfileirarão os pacotes. Dentre os vários tipos de qdiscs, eles se dividem em classless e classful:
O comando para verificar que tipo de qdisc as interfaces de rede estão usando é: "tc qdisc show" ou "tc qdisc show dev eth0"!
O comando para verificar que tipo de qdisc todas interfaces de rede estão usando, não importando se existe algum tipo de configurada, é: "ip link list | grep -i mtu"!
Classless
É um conjunto de qdiscs (disciplinas/tipos de enfileiramento) que aceita longos dados, tento somente a possibilidade de reagendá-los, atrasá-los ou descartá-los. Isto pode ser usado para formar o tráfego para uma interface de rede inteira (qdisc), sem subdivisões internas (classes). É fundamental o entendimento das diciplinas classless antes de estudar as do classful. A disciplina mais mundialmente usada e que geralmente é configurada por padrão nas interfaces de rede é a qdisc chamada pfifo_fast. Contudo, todas têm suas vantagens e fraquezas. As disciplinas classless se dividem em PFIFO, BFIFO, PFIFO Fast e TBF:
- PFIFO (Packet First In First Out): é a mais simples qdisc, sendo que o processamento dos pacotes segue a ordem do primeiro que entra é o primeiro que sai. De qualquer forma, armazena o tráfego quando a interface de rede não pode lidar com eles no momento. Limitado em pacotes ou em bytes;
- BFIFO (Byte First In First Out):
- PFIFO Fast (Packet First In First Out Fast): esta é a qdisc padrão das interface de rede no GNU/Linux, sendo habilitada no kernel. Quando uma interface de rede é criada, a qdisc pfifo_fast é automaticamente usada com a enfileiradora. Se outr tipo de qdisc é configurada, esta será usada, mas logo depois a pfifo_fast retorna para a função quando a qdisc existente é desconfigurada. Abaixo são mostradas algumas características importantes do pfifo_fast: Esta fila possui três bandas por onde os pacotes podem passar baseados nas flags do campo ToS (Type of Service) do protocolo IP ou nas prioridades assinadas. Dentro de cada banda, as regras FIFO (First In First Out) são aplicadas. Nem todas as três bandas são desenfileiradas simultaneamente, tão logo o tráfego esteja numa banda menor, as bandas mais alta não serão desenfileiradas. Em outras palavras, enquanto existirem pacotes esperando na banda 0, a banda 1 e 2 não poderão ser processadas. Isto pode ser usado para priorizar tráfegos (ex: menor atraso/minimize delay) ou penalizar outros (ex: maior confiabilidade/maximize reliability). Grosseiramente, o pfifo_fast é um tipo de pfifo que sempre verifica o campo ToS do protocolo IP para processar os pacotes. Veja mais adiante o tópido "ToS + GNU/linux" para um detalhamento completo de como os bits ToS são conduzidos em cada banda; Cada banda possui uma fila de transmissão de um determinado tamanho/comprimento chamado de txqueuelen (transmission queue length) ou de qlen (queue length). O tamanho de uma fila de transmissão nada mais é que o comprimento total dos pacotes suportados em uma fila de transmissão, sendo que no GNU/Linux é visualizado e configurado nas interfaces de rede pelos comandos ifconfig ou ip. Depois que a fila lota, pacotes adicionais não são mais enfileirados, mas sim descartados. Os comandos para verificar o tamanho o txqueuelen são:
# ifconfig | grep -iE '(link encap|txq)' --color
# ip link list | grep -i qdisc --color
- O comando para configurar o tamanho o txqueuelen na eth0 é (não use este comando pelo menos por enquanto):
# ifconfig eth0 txqueuelen 100
- TBF (Token Bucket Filter)
- TBF (Token Bucket Filter)
# ifconfig eth0 txqueuelen 100
Não é possível ver ou configurar o txqueuelen com o comando "tc"!
-
Instalação Server
xxxxx()
xxxxx()
xxxxx()
Habilitando rede
xxxxx()
xxxxx()
xxxxx()
Arquivo de configuração
xxxxx()
xxxxx()
xxxxx()
AGUANDE PÁGINA EM CONSTRUÇÃO