En términos de TCP / IP, ¿cómo funciona un limitador de velocidad de descarga en una oficina?

8

Supongamos que una oficina de personas quiere limitar las descargas HTTP a un ancho de banda máximo del 40% de su velocidad de conexión a Internet para que no bloquee otro tráfico.

Decimos "no es compatible con su firewall", y dicen la línea inevitable "solíamos poder hacerlo con nuestro Netgear / DLink / DrayTek".

Pensando en ello, una descarga es así:

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

La velocidad está determinada por la rapidez con la que el servidor le envía los datos y la rapidez con la que los reconoce.

Entonces, para limitar la velocidad de descarga, tiene dos opciones:

1) Indique al servidor que le envíe datos más lentamente, y no creo que haya ninguna función de protocolo para solicitarlo en TCP o HTTP.

2) Reconozca los paquetes más lentamente al limitar su velocidad de carga y también arruinar su velocidad de carga.

¿Cómo hacen los dispositivos para limitar esto? ¿Hay una forma estándar?

TessellatingHeckler
fuente
La limitación de velocidad con qué rapidez se permite que los paquetes recibidos salgan del cortafuegos a la LAN provoca acuses de recibo más lentos y el manejo de la congestión en la pila TCP del servidor de envío acelera la velocidad de envío. Gracias. Puedo hacer que funcione así con las pruebas. He votado varias respuestas, pero solo puedo marcar una como respuesta.
TessellatingHeckler

Respuestas:

11

El propio TCP implementa el control de congestión.

Estos limitadores de velocidad simplemente arrojarán paquetes por encima del límite. TCP maneja esto, asegurando que todos los paquetes lleguen y todos lleguen en orden; el cliente no ACK para los paquetes descartados, y el servidor los reenvía.

La pila TCP del servidor reenviará los paquetes, y también volverá a marcar un poco en su velocidad de envío porque calcula que hay congestión entre él y el cliente. Se volverá a acelerar hasta que el limitador de velocidad deje caer paquetes nuevamente, y así sucesivamente.

Shane Madden
fuente
Entonces, ¿debo aplicar una tasa de política de QoS que limite la rapidez con la que el firewall escupe el tráfico HTTP en la interfaz / LAN /? Y luego simplemente deje que TCP lo maneje. "también volverá a marcar un poco en su velocidad de envío" es otra parte que me faltaba.
TessellatingHeckler
2
Sí, eso es correcto. El servidor podría seguir lanzando datos a su enlace, saturándolos antes de que se aplicara la QoS, pero, siempre que sea un buen ciudadano TCP, su velocidad de envío establecerá un equilibrio aproximado con la velocidad a la que sus datos realmente pasan a través del enlace. Limitación de velocidad.
Shane Madden
Sí, TCP implementa su propio control de congestión, pero no es necesariamente tan efectivo. Cualquiera con alguna experiencia con torrents lo sabe. Básicamente, la mayoría de las implementaciones del control de congestión TCP se descomponen cuando hay cientos de conexiones activas en la red.
user606723
1
@ user606723 Si los torrents son un problema, debe usar un modelador de paquetes en su salida para descartar ese tráfico. Esto cortará el torrenter del rastreador y evitará que otras personas que descarguen el mismo torrente inunden tu entrada con conexiones. Problema resuelto.
MDMarra
1
@ user606723 ¿Por qué sí? El control de congestión tendrá dificultades cuando miles de conexiones se inicien todo el tiempo con TCP de inicio rápido, ya que las nuevas conexiones no saben nada del estado de la conexión que están construyendo. ¿Cientos de conexiones activas, sin embargo? Tal vez eso empantane un enlace lento a casa ..
Shane Madden
5

La mejor descripción que he escuchado sobre el método de aceleración inherente de TCP fue un podcast reciente de Security Now . Para citar a Steve Gibson:

Entonces, por acuerdo universal, siendo TCP un protocolo muy inteligente, hace algo llamado "inicio lento". Generalmente se le da permiso para enviar una cierta cantidad de paquetes sin acuse de recibo. Entonces, la idea es, vamos a poner las cosas en movimiento aquí. Y típicamente ese número es dos. Y así, cuando se inicia TCP, puede enviar dos paquetes, uno tras otro. Sin tener el primero reconocido, enviará el segundo. Pero luego espera. Y luego la regla para la limitación es que permitimos que el número de paquetes no reconocidos aumente en uno por cada reconocimiento que recibimos.

Así que pensemos en eso. Permitimos que el número de paquetes no reconocidos se incremente en uno por cada reconocimiento que recibimos. Entonces, primero enviamos dos paquetes como nuestro inicio acordado. Ellos son reconocidos. Entonces tenemos nuestro primer reconocimiento. Nos permitíamos enviar dos. Ahora, con la recepción de este primer acuse de recibo, lo incrementamos de uno a tres. Así que ahora podemos enviar tres paquetes más sin ningún otro reconocimiento. Cuando vuelve un reconocimiento por lo que hayamos enviado antes, lo aumentamos a cuatro. Esto se conoce como la "ventana de congestión". No es una ventana que se envía en la línea, es decir, no es como la ventana de recepción, que son 16 bits del encabezado TCP que nos dice cuántos datos podemos enviar por adelantado. Esta es, es una ventana. Eso'

Si seguimos aumentando el número de paquetes no reconocidos, se nos permite enviar por uno cada vez que recibimos un reconocimiento, en algún momento llegaremos a un límite. Y la belleza de este sistema es que lo hará, cuando empecemos a tratar de enviar paquetes más rápido que el enlace más débil, literalmente enlace, entre enrutadores, en algún momento encontramos el punto donde se rompe el enlace más débil. Descarta los paquetes que estamos tratando de enviar porque estamos tratando de enviarlos demasiado rápido. Por lo tanto, los reconocimientos del otro extremo se detienen porque los datos ya no se transmiten.

Y lo que hace TCP es, si no ha podido recibir, y esto varía en las estrategias. Con el tiempo, la estrategia, la estrategia real para evitar la congestión ha variado mucho. Hay nombres como Tahoe y Reno, y muchos otros que verás si buscas en Google y Wikipedia, que especifican exactamente cuál es el comportamiento. Pero la idea es que, cuando el remitente se da cuenta de que sus datos ya no se transmiten porque faltan reconocimientos, reduce rápidamente su tasa de envío. Típicamente, lo divide por la mitad. Por lo tanto, lo reduce drásticamente y luego vuelve a aumentarlo.

En esencia, lo que esto significa es que la pérdida de paquetes es la función de señalización para "No podemos enviar los datos más rápido", y que los remitentes TCP en cada extremo de una conexión, en todo Internet, siempre son algo así como: " estamos tratando de ir más rápido que la velocidad máxima disponible entre los dos puntos finales, es decir, ese enlace más débil, donde sea que esté, y siempre lo están llevando al límite. Entonces, dado que hay un punto en algún lugar que es más débil que su capacidad para enviar paquetes, lo encontrarán porque bombearán paquetes. Siempre que haya datos para enviar y tengan una conexión de ancho de banda alto, el remitente aumentará la velocidad de envío, es decir, la cantidad de paquetes pendientes, los paquetes que pueden estar disponibles al instante como agradecimientos Vuelve, sigue moviendo agresivamente ese número hacia arriba hasta que lo empuja demasiado lejos. Luego retrocede mucho, y luego nuevamente avanza.

Entonces, esto es lo que realmente está sucediendo entre las conexiones TCP que, como, probablemente, no sé qué porcentaje, pero el mayor porcentaje de tráfico en Internet se realiza a través de conexiones TCP. Todos nuestros sistemas operativos en el núcleo, en la llamada pila TCP, tienen estos contadores. Y cuando enviamos un archivo, cuando cargamos un archivo grande o recibimos una página web, el servidor en el otro extremo está haciendo lo mismo. Impulsa, en una conexión individual, tantos paquetes que aún no se han confirmado como puede, aumentando la tasa de paquetes hasta que llega al punto en que comienza a fallar o tartamudear. Luego retrocede, para permitir que las cosas se recuperen, y luego comienza a funcionar nuevamente.

Y eso termina siendo una especie de sistema de auto-estrangulamiento que, dadas las limitaciones, quiero decir, realmente parece un poco funky y crudo ".

Driftpeasant
fuente
3

Entonces, para limitar la velocidad de descarga, tiene dos opciones:

1) Indique al servidor que le envíe datos más lentamente, y no creo que haya ninguna función de protocolo para solicitarlo en TCP o HTTP.

2) Reconozca los paquetes más lentamente al limitar su velocidad de carga y también arruinar su velocidad de carga.

3) Su enrutador / dispositivo de firewall coloca los datos entrantes en un depósito de QoS y solo vacía ese depósito a la velocidad que solicitó. Los datos entrantes se adaptarán a esa velocidad ya que las computadoras dentro solo verán el acuse de recibo a esa velocidad. Además, el paquete descartado ocasional (a propósito) funciona realmente bien para ralentizar una conexión.

Cuando intente encontrar un dispositivo que maneje esto, busque QoS (Calidad de servicio) en la configuración / documentación. Los cuadros de Linux (o BSD) también son útiles para esto.

Jeff Ferland
fuente
Eso casi tiene sentido, ¿entonces la técnica es limitar la velocidad de los reconocimientos y hacerlo pretendiendo al dispositivo LAN que el servidor está enviando más lentamente de lo que realmente es? ¿Entonces habrá una explosión llenando la conexión al principio, luego no después?
TessellatingHeckler
1
@TessellatingHeckler Sí, eso es todo. Además, el "estallido" no debería ser un estallido muy grande por cortesía de en.wikipedia.org/wiki/Slow-start .
Jeff Ferland el
2

Utiliza un firewall o dispositivo que admite la limitación de QoS (calidad de servicio).

Podría construir un sistema Linux para que actúe como puerta de enlace de la oficina y hacer que use el modelado de tráfico para lograr esto. Solo necesita múltiples NIC instaladas y luego cada máquina apunta a una puerta de enlace.

Como beneficio adicional, puede configurar un servidor proxy en él para ayudar a facilitar el tráfico también. Algo parecido al calamar. Puede haber distribuciones de dispositivos de enrutamiento llave en mano que también pueden hacer esto.

Bart Silverstrim
fuente
¿Cómo ayuda QoS? Para cuando su dispositivo pueda aplicar QoS a una descarga, el tráfico entrante ya ha llegado a través de la conexión a Internet y potencialmente lo bloqueó mientras lo hacía. La QoS puede aplicarse al tráfico saliente, pero no puede hacer nada con respecto al tráfico entrante porque para cuando ve el tráfico, es demasiado tarde.
TessellatingHeckler
3
Puede dar forma al tráfico donde puede controlarlo. No hay forma de decirle a un servidor remoto que limite la velocidad a la que obtiene los datos, pero puede reducirlo en su punto de ingreso. De lo contrario, tendría que hablar con su proveedor sobre la configuración del tráfico en su red a su feed.
Bart Silverstrim
Además, el servidor proxy también puede ayudar a aliviar un poco la congestión. Pero de lo contrario, tendrá que darle forma en el punto de entrada.
Bart Silverstrim
Mi pregunta original era: parece que no puedes dar forma en el punto de ingreso, porque cualquier control que puedas aplicar ocurre después de que el tráfico ha pasado por el cuello de botella, ¿cómo se ocupa eso de cualquier cantidad de tecnología? "Aplicar QoS, por ejemplo, con Linux" y "usar modelado de tráfico" puede ser prácticamente lo que hay que hacer, pero estaba buscando una explicación de cómo eso podría ayudar. (y ahora tengo algunas en otras respuestas).
TessellatingHeckler
@TessellatingHeckler: el método que me gusta también permite el uso de ECN, que en realidad sí le dice al servidor que envía que disminuya la velocidad sin descartar paquetes. Este método consiste en aplicar el limitador de velocidad, como RED, a los paquetes que salen de la interfaz LAN, en lugar de intentar usar un filtro de entrada en la interfaz WAN.
Zan Lynx
2

El protocolo HTTP no proporciona facilidades para limitar el ancho de banda utilizado, e incluso si lo hiciera, sería una configuración del lado del cliente, sobre la cual los administradores de red no podrían tener ningún control.

La limitación de ancho de banda (también conocida como "Calidad de servicio") generalmente se administra en enrutadores / firewalls, que manejan todo el tráfico entrante y saliente hacia / desde una red; los que admiten esto generalmente le permiten configurar políticas como "permitir que cualquier computadora cliente use como máximo el 10% de todo el ancho de banda disponible", o "otorgar prioridad SMTP sobre FTP para que los correos electrónicos puedan fluir incluso cuando alguien está haciendo una descarga pesada ".

Cómo se logra exactamente esto depende del enrutador / firewall utilizado, pero la forma más básica es simplemente desechar los paquetes que exceden los límites configurados; TCP se asegurará de que se retransmitan y eventualmente podrá pasar por el cuello de botella.

Massimo
fuente