Em termos de TCP / IP, como funciona um limitador de velocidade de download em um escritório?

8

Assumindo um escritório de pessoas, elas querem limitar os downloads HTTP a um máximo de 40% da largura de banda da velocidade de conexão com a Internet, para que ele não bloqueie outro tráfego.

Dizemos que "não é suportado no seu firewall", e eles dizem a linha inevitável "nós costumávamos fazer isso com o nosso Netgear / DLink / DrayTek".

Pensando nisso, um download é assim:

HTTP GET request
Server sends file data as TCP packets
Client acknowledges receipt of TCP packets
Repeat until download finished.

A velocidade é determinada pela rapidez com que o servidor envia dados para você e com que rapidez você reconhece isso.

Então, para limitar a velocidade de download, você tem duas opções:

1) Instrua o servidor a enviar dados para você mais lentamente - e não acho que exista qualquer recurso de protocolo para solicitar isso em TCP ou HTTP.

2) Reconheça os pacotes mais lentamente, limitando a velocidade de envio e também a velocidade de upload.

Como os dispositivos limitam isso? Existe uma maneira padrão?

    
por TessellatingHeckler 30.11.2011 / 17:23

5 respostas

11

O próprio TCP implementa o controle de congestionamento.

Esses limitadores de taxa simplesmente descartam os pacotes acima do limite. O TCP lida com isso, garantindo que todos os pacotes cheguem e todos cheguem em ordem; o cliente não ACK para os pacotes descartados, e eles são reenviados pelo servidor.

A pilha TCP do servidor reenviará os pacotes e também voltará um pouco em sua taxa de envio, pois calcula que há um congestionamento entre ele e o cliente. Ele acelerará até que o limitador de taxa derrube novamente os pacotes e assim por diante.

    
por 30.11.2011 / 17:32
5

A melhor descrição que eu já ouvi e que fazia sentido do método de aceleração inerente do TCP estava fora de um recente podcast de Segurança Agora . Para citar Steve Gibson:

So by universal agreement, TCP being this very clever protocol, it does something called a "slow start." It's generally given permission to send some number of packets without acknowledgment. So the idea being, let's just get things moving here. And typically that number is two. And so when TCP starts, it can send two packets off, one after the other. Without having the first one acknowledged, it'll send the second. But then it waits. And then the rule for throttling is we allow the number of unacknowledged packets to increase by one for every acknowledgment we receive.

So let's think about that. We allow the number of unacknowledged packets to be increased by one for every acknowledgment we receive. So we first send off two packets as our agreed-upon start. They get acknowledged. So we have our first acknowledgment. We were allowing ourselves to send two. Now, with the receipt of this first acknowledgment, we increase that by one to three. So we can now send three more packets off without any further acknowledgment. When an acknowledgment comes back for whatever we've sent before, we increase that to four. This is known as the "congestion window." It's not a window that's ever sent on the line, that is, it's not like the receive window, which is 16 bits of the TCP header that tells us how much data we're able to send ahead. This one is - it's a window. It's basically a counter maintained by the TCP stack for the purpose of avoiding connection, the idea being that at some point this is going to break.

If we keep increasing the number of unacknowledged packets we're allowed to send by one every time we receive an acknowledgment, at some point we're going to reach a limit. And the beauty of this system is that it will, as we start trying to send packets faster than the weakest link, literally link, between routers, at some point we find the point where the weakest link breaks. It drops the packets we're trying to send because we're trying to send them too fast. So acknowledgments from the other end stop because the data is no longer getting through.

And what TCP does is, if it has failed to receive - and this varies in strategies. Over time, the strategy, the actual congestion avoidance strategy has varied a lot. There's names like Tahoe and Reno, and a whole bunch of other ones that you'll see if you do some Googling and Wikipediaing, which specific exactly what the behavior is. But the idea is that, when the sender realizes that its data is no longer getting through because it's missing acknowledgments, it cuts back its sending rate quickly. Typically, it divides it in half. So it dramatically scales it back, and then goes back to increasing it.

So essentially what this means is that losing packets is the signaling function for "We can't send the data any faster," and that the TCP senders at each end of a connection, all over the Internet, are always sort of - they're trying to go faster than the maximum speed that is available between the two endpoints, that is, that weakest link, wherever that is, and they're always pushing it to the limit. So given that there is a point somewhere that is weaker than their ability to send packets, they're going to find it because they will pump packets out. As long as there's data to be sent and they've got a high bandwidth connection, the sender will increase the rate of sending, that is, the number of outstanding packets, the packets that are allowed to be out there on the fly as acknowledgments come back, aggressively keeps moving that number upwards until it pushes it too far. Then it backs off a lot, and then again moves forward.

So this is what's actually going on between TCP connections which are, like, probably, I don't know what percentage, but the vastly greatest percentage of traffic on the Internet are over TCP connections. All of our operating systems down in the kernel, in the so-called TCP stack, have these counters. And when we're sending a file, when we're uploading a big file or we're receiving a web page, the server at the other end is doing the same thing. It's pushing, on an individual connection basis, as many packets that have not yet been acknowledged out as it can, increasing the packet rate until it hits the point where it starts to fail or stutter. Then it backs off, to sort of allow things to recover, and then starts working back up again.

And so that ends up being a sort of a self-throttling system which, given the constraints, I mean, it really seems kind of funky and crude."

    
por 30.11.2011 / 18:01
3

So, to limit download speed, you have two choices:

1) Instruct the server to send data to you more slowly - and I don't think there's any protocol feature to request that in TCP or HTTP.

2) Acknowledge packets more slowly by limiting your upload speed, and also ruin your upload speed.

3) Seu dispositivo de roteador / firewall coloca os dados de entrada em um intervalo de QoS e esvazia somente esse intervalo na taxa solicitada. Os dados recebidos se adaptarão a essa velocidade, pois os computadores internos só verão confirmação de recebimento a essa velocidade. Além disso, o pacote descartado (propositadamente) ocasional funciona muito bem para desacelerar uma conexão.

Ao tentar encontrar um dispositivo que lide com isso, procure QoS (Quality of Service) na configuração / documentação. Caixas Linux (ou BSD) também são úteis para isso.

    
por 30.11.2011 / 17:34
2

Você usa um firewall ou dispositivo que ofereça suporte à limitação de qualidade de serviço (QoS).

Você pode criar um sistema Linux para atuar como o gateway do escritório e usar a modelagem de tráfego para isso. Só precisa de várias placas de rede instaladas e, em seguida, todas as máquinas apontam como um gateway.

Como bônus, você pode configurar um servidor proxy para ajudar a facilitar o tráfego também. Algo como o Squid. Pode haver distribuições de appliance de roteamento prontas que também podem fazer isso.

    
por 30.11.2011 / 17:28
2

O protocolo HTTP não fornece recursos para limitar a largura de banda usada e, mesmo se o fizesse, seria uma configuração do lado do cliente, na qual os administradores de rede não poderiam ter nenhum controle.

A limitação de largura de banda (também conhecida como "Quality Of Service") geralmente é gerenciada em roteadores / firewalls, que controlam todo o tráfego de entrada e saída de / para uma rede; os que suportam isso geralmente permitem que você configure políticas como "deixe qualquer computador cliente usar no máximo 10% de toda a largura de banda disponível", ou "dê prioridade SMTP sobre FTP para que os e-mails possam fluir mesmo quando alguém estiver fazendo um download pesado ".

Como isso é feito exatamente depende do roteador / firewall usado, mas a maneira mais básica é simplesmente descartar pacotes que excedam os limites configurados; O TCP garantirá que eles sejam retransmitidos e, eventualmente, poderão passar pelo gargalo.

    
por 30.11.2011 / 17:33