Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

segunda-feira, 4 de agosto de 2014

OpenWRT: Configurando o QoS - tráfego de dados em redes de computadores

Este é mais um artigo da série sobre o OpenWRT.


Já tive mais de um pedido para escrever como configurar o QoS (Quality of Service) no OpenWRT. Mas por que configurar o QoS? Para que serve isto? O QoS são regras de priorização dos pacotes. Quando sua conexão com a internet está com folga, o QoS pouco ou nada vai te ajudar. Ele vai fazer diferença quando você estiver usando toda a velocidade disponível (com sorte, a que você contratou ;-) ).

Antes de começar, algumas perguntas e respostas (curtas) frequentes:

P: Usando QoS vou fazer downloads mais rápidos (terminar antes)?
P: Posso melhorar minha velocidade de recebimento (download)?
P: Posso melhorar minha velocidade de envio (upload)?
P: Posso aumentar meu upload reduzindo o download?
R: Não

P: Estou falando no Skype e está picotando a voz. Com QoS vai melhorar a qualidade?
R: Depende se você está usando a internet também para outras coisas.

P: Se estiver somente usando a internet para o Skype?
R: Não

P: Se estiver baixando um filme ao mesmo tempo que falo no Skype?
R: Sim!

O "falando no skype" pode ser substituído por outros serviços em tempo real como "jogos online (FPS, MMORPG)" ou mesmo a resposta do navegador quando você clica em um link.

Ao final deste post, estas perguntas são revisitadas com mais detalhes.

Para entender o QoS, precisa entender um básico de redes. Este artigo será uma breve explicação do tráfego de dados em redes de computadores.



Uma analogia usada frequentemente na comparação com tráfego em uma conexão é o transporte rodoviário. A ligação de rede de internet é uma estrada onde não são permitidas ultrapassagens e todos os veículos trafegam com velocidade constante. Os dados transportados são como a carga levada nos veículos. Os veículos, por sua vez, são os pacotes de rede.

A "velocidade contratada da internet" é a quantidade de carga que você pode transportar por tempo, não a "velocidade dos veículos". Para os mais puristas, usa-se o termo taxa de transferência ou rendimento da rede. Largura de banda tem relação com os sinais e não diretamente com a taxa de transferência. Entretanto, todos estes termos são frequentemente usados como sinônimos. Se um Kbit fosse um quilo, a velocidade de 10Mbits/s seria, nesta analogia, transportar 10 toneladas por segundo, não importando a quantidade de veículos ou a sua velocidade. Em geral, nossas conexões residenciais são assimétricas (o "A" do ADSL), onde a taxa de transferência de ida (upload) é menor que a de volta (download).

O tempo de viagem do veículo é a latência da rede. É fundamental para usos multimídia (VOIP, Skype, videoconferência, jogos online). Para estes usos, é muito melhor ter uma taxa de transferência e uma latência menor do que uma taxa de transferência enorme mas com alta latência. Na analogia, não adianta ter a capacidade de transportar 10 toneladas mas por um caminho mais longo se sua encomenda é um pacote pequeno que precisa chegar o quanto antes (latência baixa).

As conexões podem ser divididas quanto a sua abrangência. Redes locais (Local Area Network - LAN)  tem alcance curto, mas normalmente taxa de transferência alta e latência baixa. Já redes "longas" , (Wide Area Network - WAN), no caso a sua conexão com a internet, tem normalmente características inversas: taxa de transferência baixa e latência alta. Seguindo na analogia, as LAN são as ruas da cidade, onde a viagem é curta e o tempo é (ao menos deveria ser) menor. Elas também são capazes de um grande volume de tráfego. Já uma rodovia, pela distância, tem um tempo de viagem maior ("latência alta") e pode transportar menos carga (taxa de transferência baixa).

Para possibilitar a transição das ruas da cidade (rede local) com a rodovia (conexão com a internet), é necessário um ponto de ligação. Em geral, é onde eles colocam a praça de pedágio. Na sua rede local, é onde se localiza o seu roteador.

Como ocorre no transporte rodoviário, quando as ruas enviam mais carros do que a rodovia pode absorver, ocorrem filas. O mesmo ocorre quando um servidor na internet envia dados para você a uma taxa maior do que sua conexão está preparada para receber (ou vice-versa). No roteador, estas filas tem tamanho fixo. Caso fique cheia, os "carros a mais" são catapultados para fora da pista (os pacotes são descartados) sem aviso ao emissor ou receptor.

Vamos imaginar que estamos enfrentando um congestionamento. Nesta caso, existe uma longa fila antes de chegar na rodovia (conexão com a internet). O veículo pode ser simplesmente descartado (se a fila estiver cheia) ou ter que aguardar a sua vez chegar para poder entrar na rodovia. Isto aumenta o tempo da viagem (a latência da sua conexão). Dependendo das configurações, o atraso nesta fila pode ser na ordem de  alguns segundos.

Outra característica importante é como ocorre a negociação da transferência. O TCP, usado na grande maioria das vezes que você faz algo na internet, opera simplificadamente desta forma:
  1. E: Manda um pacote para o endereço R, dizendo que eu quero enviar uma carga;
  2. R: OK, recebi, responda a E que ele pode enviar;
  3. E: OK, avise o R que eu recebi o seu OK e vou mandar a carga;
  4. E: Mande 1 pacote com carga;
  5. R: OK, recebi, 1 pacote;
  6. E: Receberam todos. Vamos mandar mais! Mande 2 pacote com carga;
  7. R: OK, recebi, 2 pacote;
  8. E: Receberam todos. Vamos mandar mais! Mande 4 pacote com carga;
  9. R: OK, recebi, 4 pacote;
  10. E: Receberam pacote. Vamos mandar mais! Mande 8 pacote com carga;
  11. R: OK, recebi, 7 pacote;
  12. E: Ops, perdemos um pacote! Acho que a fila está cheia. Vou mandar menos. Mande 6 desta vez.
Vamos por partes, a começar pelo início. Note que são necessários 3 pacotes para apenas pedir ou enviar dados. Imagine que a fila entre a sua rede local e a conexão com a internet esteja com tal tamanho que um novo pacote leve 3 segundos para passar por ela. Só para chegar o primeiro pacote com dados daquela página que você queria acessar, demoraria mais de 9 segundos (3s no passo 1; 3s no passo 3; 3s para pedir a página no passo 4).

Outro detalhe é que o protocolo busca sempre encher a fila! Só recua quando algum pacote é recusado pois a fila já está cheia. Então, se você estiver anexando uma foto no e-mail, sua fila de envio estará cheia. O resultado será o atraso no skype, na navegação, etc. Este atraso pode, inclusive, iludir o emissor que o destino não recebeu os pacotes pois a confirmação ainda está na fila e o tempo de espera se esgotou. Isto faria com que ele reenviasse os pacotes já recebidos.

E os pacotes perdidos, não são um problema? Não! Em situações normais, são perdas mínimas (menos de 1%). Esta perda de pacotes é usada como sinal de congestionamento. O problema mesmo é a formação de filas. Elas podem ser muito grandes (grande problema hoje da internet conhecido como BufferBloat). Esta fila única também não é adequada para diferentes serviços. Alguns aproveitariam bem uma fila maior (transferência de grande volume de dados) enquanto outros se comportariam melhor com filas menores (Skype). Contudo, perda de pacote acima de 1%, normalmente provocada por falha física ou extremo congestionamento, torna a navegação uma tarefa impossível.


Solução? Faça filas de tamanhos diferentes para cada tipo de aplicação. Voltando a analogia do trânsito, seria uma praça de pedágio com diversos guichês. Como a rodovia é uma pista simples, somente um carro sai por vez. Nas filas com maior prioridade, as filas teriam tamanho máximo menor. Entretanto, seriam mais "selecionadas" para liberar carros mais rapidamente. As filas usadas para maior volume teriam seus veículos mais retidos. Isto é QoS.

Voltando as perguntas frequentes, agora com respostas longas:

P: Usando QoS vou fazer downloads mais rápidos (terminar antes)?


P: Posso melhorar minha velocidade de recebimento (download)?

P: Posso melhorar minha velocidade de envio (upload)?
R: Não. A taxa de transferência é característica da conexão e é pouco afetada por variações na latência. Os valores de download e upload são definidos pelo plano contratado.

P: Estou falando no Skype e está picotando a voz. Com QoS vai melhorar a qualidade?
RDepende se você está usando a internet também para outras coisas.

P: Se estiver somente usando a internet para o Skype?
R: Não. Como você somente está usando o Skype, a fila é ocupada apenas pelos dados do Skype.
Ele normalmente tem um bom algoritmo para reduzir a necessidade taxa de transferência e evitar filas no roteador. Se estiver picotando, é o outro lado ou a sua conexão não aguenta nem mesmo o mínimo necessário. Sugestão? Desligue o vídeo ou aumente seu plano da internet (ou da pessoa do outro lado).

P: Se estiver baixando um filme ao mesmo tempo que falo no Skype?
RSim! Podem ser criada filas para cada característica de uso dos protocolos. Para os casos com maior volume de transferência (torrent), uma fila maior e com menor prioridade. Para Voip, uma fila menor com alta prioridade. Acesso HTTP é mais complicado pois pode ser tanto uma atividade que exige resposta rápida (navegação) como alto volume de dados (download). Porém, pode ser indiretamente beneficiado ao colocar protocolos conhecidos que usam alto volume de dados com menor prioridade.

Para avaliar sua conexão de internet, fica a sugestão de dois testadores:


    Estes testes informam, além da taxa de transferência e da latência, uma medição do jitter, que é a variação na latência entre diversos testes. Quanto menor, mais estável é a sua latência (mesmo ela sendo alta ou baixa).

    O próximo post será sobre a configuração do QoS no OpenWRT. Até a próxima.

    2 comentários:

    1. Boa Tarde,

      como configurar o QOS por MAC address ou IP??

      ResponderExcluir
      Respostas
      1. Kamikaze, essa pergunta vem e volta. Não existe uma forma pronta de restringir taxa de transferência no OpenWRT. Simplesmente ninguém empacotou isso. O caminho para isso é criar um script que usa o tc para programar o escalonador de pacotes.

        Existem exemplos prontos como https://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler.example2
        Se quiser mais info: https://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler

        Excluir