Conexão TCP automática mais lenta (modelagem)

2

Gostaria de configurar automaticamente conexões TCP com muita largura de banda correspondentes aos dados já transmitidos.

Um resumo seria: "O primeiro Mbit é transferido em largura de banda total, então gradualmente cai para 1% da largura de banda quando alcança 10Mbit e permanece lá".

Um exemplo é melhor que 1k palavras:

 b-w  ^
      |        .         .
100%  | ********         .
      |        . *       .
      |        .    *    .
      |        .       * .
  1%  |        .         .********
      +----------------------------> Data transfered.
         1Mbit .         . 10Mbit

Eu sei que um traffic shaping completo seria melhor, já que permitiria o bursting e o uso de sobra de largura de banda, mas a ideia é especificamente limitar automaticamente grandes transferências de dados sem qualquer configuração adicional.

Como eu implementaria isso em um host linux ?

Atualização: Não é imediatamente óbvio, mas o medidor de dados conta ambas maneiras (upload & download) porque eu propositadamente não fiz o download ou upload.

    
por Steve Schnepp 19.12.2011 / 14:02

2 respostas

3

O qdisc HTB implementa o conceito de rajadas que é um pouco do que você quer - envia uma taxa total de hardware até a quantidade de dados especificada no parâmetro "burst". Para obter uma diminuição gradual, seria necessário aninhar classes HTB e, provavelmente, você não desejaria fazê-lo excessivamente, já que isso aumenta muito a complexidade da configuração. Mas o próprio mecanismo de modelagem de tráfego do Linux é sem estado, ele age apenas nos pacotes, e não nas conexões. Usando apenas filtros tc, você só pode diferenciar pacotes com base em cabeçalhos IP / TCP.

Portanto, se você precisar classificar diferentemente com base nas conexões, a abordagem mais direta provavelmente seria usar a correspondência iptables "--connbytes" e uma marca de pacote (-j MARK target) para empurrar os pacotes de uma conexão para a fila correta ( rápido / desaceleração)

Veja a seção de palavras sobre o gerenciamento de largura de banda do guia do LARTC e / ou o abrangente "Soluções de largura de banda de origem aberta" whitepaper para mais informações.

Além disso, se você precisar dar forma ao fluxo ascendente e ao fluxo descendente, dê uma olhada na implementação da interface do IMQ virtual - foi concebido especificamente para este fim.

    
por 19.12.2011 / 14:51
1

Eu fui inspirado pela solução @ the-wabbit, e consegui resolver isso. Eu escrevi sobre essa solução em meu wiki pessoal: link

Aqui está minha solução para essa pergunta com um script de shell real:

#!/bin/sh

dev=eth0
ip_port=3002
rate_limit=512kbit
rate_ceil=1024kbit
htb_class=10
max_byte=10485760

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

if [ "$1" = "enable" ]; then
    echo "enabling rate limits"
    tc qdisc del dev $dev root > /dev/null 2>&1
    tc qdisc add dev $dev root handle 1: htb

    tc class add dev $dev parent 1: classid 1:$htb_class htb rate $rate_limit ceil $rate_ceil
    tc filter add dev $dev parent 1: prio 0 protocol ip handle $htb_class fw flowid 1:$htb_class

    #iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -j MARK --set-mark $htb_class

    # small packet is probably interactive or flow control
    iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m length --length 0:500 -j RETURN

    # small packet connections: multi purpose (don't harm since not maxed out)
    iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m connbytes --connbytes 0:250 --connbytes-dir both --connbytes-mode avgpkt -j RETURN

    #after 10 megabyte a connection is considered a download
    iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m connbytes --connbytes $max_byte: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark $htb_class
    iptables -t mangle -A OUTPUT -j RETURN

elif [ "$1" = "disable" ]; then
    echo "disabling rate limits"
    tc qdisc del dev $dev root > /dev/null 2>&1

    iptables -t mangle -F
    iptables -t mangle -X

elif [ "$1" = "show" ]; then
    tc qdisc show dev $dev
    tc class show dev $dev
    tc filter show dev $dev
    iptables -t mangle -vnL INPUT
    iptables -t mangle -vnL OUTPUT
else
    echo "invalid arg $1"
fi
    
por 13.01.2016 / 04:20