A premissa:
Localização rural, poucas opções para conexões à Internet de alta largura de banda. De longe, a mais rápida é a Internet via satélite, mas é cara (tanto o equipamento quanto o custo mensal, e possui desvantagens de latência), portanto, várias famílias gostariam de compartilhá-la.
Isso é simples por si só - configure um roteador com uma sub-rede para cada família (VLANs ou portas físicas), bloqueie o tráfego entre elas e configure o modem para rotear para essas sub-redes ou configure o NAT duplo.
O problema:
A maneira como o TCP normalmente funciona significa que cada conexão TCP obterá mais ou menos 1 / n da largura de banda disponível, onde n é o número de conexões. Portanto, se um agregado familiar / usuário criar muitas conexões, ele terá uma parcela maior da conexão geral. Isso não é particularmente justo - com um link saturado, cada família deve receber uma parcela igual. Por outro lado, quando ninguém mais estiver usando a conexão, deve ser possível usar a largura de banda completa.
Por exemplo, digamos que há 4 famílias compartilhando uma conexão inativa de 12Mbit / s. Se um deles estiver baixando / transmitindo / seja o que for, eles deverão poder usar os 12Mbit / s completos (ou o suficiente). Se duas famílias estiverem usando a conexão, elas deverão obter 6Mbit / s cada, independentemente de uma família estar baixando 1 arquivo e a outra 11. (sem qualquer gerenciamento de largura de banda, cada arquivo baixaria aproximadamente 1Mbit / s nesse caso) 3 famílias obtenha 4Mbit / s cada e assim por diante.
O que eu descobri até agora:
O melhor local para implementar uma política como essa (para a jusante) seria na outra extremidade do canal estreito, ou seja, no ISP. Obviamente, isso não é possível neste caso, por isso seria bom poder aproximar-se de alguma forma. Mas como? Existem roteadores disponíveis no mercado que suportam algo assim? Posso configurar uma caixa Linux ou BSD para fazer isso? Ele não precisa ser à prova de balas - um servidor TCP que se comporte mal ou um serviço UDP agressivo poderia provavelmente contornar qualquer coisa que eu possa fazer no meu final - mas deve funcionar no caso comum da maior parte do tráfego que consiste em muitos padrões compatíveis com RFC Conexões TCP.
Para ser claro, eu estou não falar sobre priorizando aplicações específicas, mas o tráfego em vez de agregação de / para determinados dispositivos Ethernet ou intervalos de endereços IP. Dar a um tráfego uma prioridade mais alta do que outro tráfego parece ser bem suportado, mas a situação é menos clara ao tentar alocar igualmente a largura de banda para as classes de tráfego.
Há muitas informações mal escritas / irremediavelmente regurgitadas / desinformadas sobre modelagem de tráfego na Web. A documentação sobre o hardware do roteador é terrivelmente inespecífica, então eu pareço estar circulando em círculos.
Pelo que entendi, a maneira de fazer com que o TCP se comporte dessa maneira é simular um canal um pouco mais estreito do que o realmente disponível e soltar pacotes artificialmente para fazê-lo recuar. Então, acho que seria bastante simples fornecer a todos exatamente 3Mbit / s no exemplo acima, eliminando artificialmente quaisquer pacotes extras. Isso realmente não usa a conexão de maneira eficiente, pois na maioria das vezes há capacidade disponível.
Existe uma maneira de fazer o que estou pedindo? Estou fazendo errado? Estou (ou melhor, as famílias em questão estão) dispostas a gastar dinheiro com isso - seja um roteador / dispositivo de prateleira com preço moderado ou uma caixa genérica para executar uma distribuição Linux ou BSD.
O OpenWRT parece suportá-lo, embora eu nunca o tenha usado. Você pode dar uma olhada na página Controle de tráfego de rede no site deles, e especialmente no segundo exemplo: compartilhamento de largura de banda simples (também conhecido como modelagem de tráfego) com HTB . Isso envolve chamadas simples para o qdisc, para que qualquer caixa do Linux possa fazer isso.
fonte
tc
regras. O modelador de tráfego do Linux certamente parece promissor.A configuração descrita em /superuser//a/1210164/257859 faz exatamente isso:
fonte