Actualizado el 10 de Marzo del 2020 (Publicado el 8 de Mayo del 2017)
844 visualizaciones desde el 8 de Mayo del 2017
60,1 KB
7 paginas
Creado hace 22a (09/04/2003)
BULMA: Método para la ecualización del ancho de banda
Bisoños Usuarios de Linux de Mallorca y Alrededores | Bergantells Usuaris de Linux de Mallorca i Afegitons
Método para la ecualización del ancho de banda
Por Jose Luis Nogueira, scero (http://scero.homelinux.org:8080)
Creado el 07/04/2003 21:02 y modificado por última vez el 07/04/2003 21:02
En este artículo expongo un método con el cual podréis "ecualizar" el ancho de banda de vuestra conexión, gracias a
las herramientas QoS.
1. Introducción
Desde hace algún tiempo he estado intentado ecualizar el ancho de banda de mi conexión, con el fin de poder garantizar
que siempre se dispone de un ancho de banda mínimo para un determinado servicio o máquina de una red.
Para entender la utilidad de esto supongamos que tenemos una red como la siguiente
es muy habitual encontrarse con el hecho de que el cliente 1 comienza a utilizar ancho de banda de forma masiva y
continua (ftp, p2p, etc...); de manera que si en un momento posterior el cliente 2 intenta utilizar la conexión para cosas
más livianas (navegar), este descubre que la conexión esta copada por el primero y todo el acceso le va muy lento.
En este artículo pretendo explicar un método para poder evitar esta u otras situaciones en las cuales el ancho de banda
es utilizado de una manera poco justa entre los usuarios (servicios) o como mínimo de una manera no adecuada. Entre
otras cosas pretendo explicar la forma de conseguir lo siguiente:
•
•
•
Asegurar que no haya en la red usuarios (o servicios) que utilizan el ancho de banda ocasionando un acceso
precario para los otros
Establece prioridades entre las máquinas cliente de nuestra red (si esto fuese necesario)
Garantizar un ancho de banda mínimo para cada servicio o grupo de servicios (ftp, telnet, ssh, www, etc ...)
No quiero que ninguno piense que este es el único método para poder ecualizar un ancho de banda, esto sería un error.
Lo único que pretendo en este artículo es dar a conocer algunos de los servicios QoS (quality of service) que están
disponibles en el núcleo de Linux; estos servicios se pueden utilizar de muchas formas y combinar entre ellos para
solucionar problemas muy complejos. En general el método que os voy a explicar es muy potente y simple a la vez, de
todos modos si alguno cree que puede mejorarse de alguna manera, estoy abierto a todo tipo de sugerencias.
En este artículo parto de la base de que todos los lectores:
•
Sabéis compilar el kernel de Linux
1/7
BULMA: Método para la ecualización del ancho de banda
•
•
Sabéis usar netfilter (iptables) de los kernels 2.4.x
Tenéis conocimientos mínimos de administración de redes en Linux
2. Método utilizado para la ecualización
Este método se puede representar de manera gráfica de la siguiente manera:
Aviso: este gráfico es una simplificación de la realidad, únicamente pretende servir con fines didácticos; el proceso que
realmente sigue Linux es un poco más complejo e intervienen más factores. Como se puede observar la idea es utilizar
Netfilter para marcar los paquetes según el tratamiento que se desee darles, cuando estos paquetes lleguen al dispositivo
de red por el que deben salir a internet (o cualquier otra red) son tratados según un árbol de preferencias que especifica
el ancho de banda que le corresponde, la prioridad, etc...
En los siguiente puntos se encuentra una explicación detallada de como implementar este método.
2.1. Compilación de Kernel
Lo primero que se debe hacer es habilitar todos los soportes a utilizar en el Kernel.
Para poder emplear Netfilter, como mínimo:
Networking options −−>
[*] Network packet filtering (replaces ipchains)
IP: Netfilter Configuration −−>
<*> netfilter MARK match support
<*> Connection state match support
<*> Packet filtering
<*> Packet mangling
<*> MARK target support
Si adicionalmente se desea hacer Masquerading y demás historias también se deberían activar sus correspondiente
soportes.
Para poder usar los servicios QoS necesarios para este método es necesario:
2/7
BULMA: Método para la ecualización del ancho de banda
Networking options −−>
QoS and/or fair queueing −−>
[*] QoS and/or fair queueing
<*> HTB packet scheduler
<*> SFQ queue
<*> Ingress Qdisc
[*] QoS support
[*] Rate estimator
[*] Packet classifier API
<*> TC index classifier
<*> Routing table based classifier
<*> Firewall based classifier
[*] Traffic policing (needed for in/egress)
2.2. Creación de un árbol de preferencias para un dispositivo
Con árbol de preferencias de preferencias pretendo hacer referencia (de forma informal) a una estructura de ``clases'' o
``bandas'' (según la traducción) en la que hay dependencias padre−hijo entre sus miembros.
Para poder implementar esta estructura es necesario conocer los algoritmos que voy a emplear en cada una de sus
clases. Hay que tener en cuenta que no son lo únicos que se pueden aplicar, existen otros con diferentes características:
Algoritmo sfq (Stochastic Fairness Queueing)
Es una implementación sencilla de la familia de algoritmos de colas justas (fair queueing).
En este algoritmo el tráfico se divide en un número bastante grande de colas FIFO, una por cada conversación.
Entonces se envía el tráfico de una manera parecida a round robin, dando a cada sesión por turnos la oportunidad de
enviar datos.
Es decir es un algoritmo que busca una equidad entre todas las peticiones para repartir de la manera más justa posible el
ancho de banda.
Algoritmo htb (Hierarchical Token Bucket)
Es una algoritmo utilizado para dividir el ancho de banda según nos interese de manera que se puede especificar un
ancho de banda mínimo y un ancho de banda máximo. De manera que el algoritmo asegura la disponibilidad del
mínimo, y en caso de que haya ancho de banda libre se puede llegar hasta el máximo.
Existe otros algoritmos que hacen cosas similares, pero este es el único (por lo que he probado) que permite pedir
prestado ancho de banda que no se use.
Reparto de los anchos de banda en el árbol de preferencias
Para crear el árbol cada uno puede aplicar los criterios que más le convengan, en este apartado explicaré como hacerlo
y daré un par de ideas que pueden resultar interesantes.
Para los ejemplos que hay a continuación se supone:
•
•
•
•
La conexión a internet (podría ser cualquier otra red) es de 300Kbps
La conexión a internet se realiza por el interface eth1
Interesa crear dos bandas de similar ancho de banda, una se usará para navegar por la web y la otra para todos
los demás servicios
La banda empleada para navegar por la web será prioritaria frente a la otra
Para este caso tan sencillo, se puede representar el árbol de preferencias como
3/7
BULMA: Método para la ecualización del ancho de banda
para conseguir esto se puede proceder de la siguiente manera:
tc qdisc add dev eth1 root handle 1: htb default 20
Con esto se crea una banda principal (root) con el nombre 1:, que por defecto
manda todos los paquetes a la banda 20.
tc class add dev eth1 parent 1: classid 1:10 htb rate 100kbps ceil 200kbps
Con esto se crea una banda que depende de la principal (parent 1:), tiene un ancho
de banda mínimo de 100kbps (rate 100kbps) y puede llegar a tener hasta 200kbps
(ceil 200kbps). Como no se ha indicado nada sobre la prioridad se supone que tiene
prioridad máxima (es decir 0). A esta banda se le llama 10 y depende de la 1 (1:10).
tc class add dev eth1 parent 1: classid 1:20 htb rate 100kbps ceil 200kbps prio 1
Con esto se crea una banda de similares características a la anterior con la salvedad
de que tiene menor prioridad (prio 1) . Su nombre es 20, al depender de la 1 se
denomina (1:20). Esta será la banda por defecto para los paquetes (default 20),
como se indico en el primer comando.
En este árbol cada una de las bandas tiene un ancho de 100kbps y puede crecer hasta 200kbps. Es importante tener el
cuenta que los comandos:
tc qdisc add dev eth1 root handle 1: htb default 20
tc class add dev eth1 parent 1: classid 1:10 htb rate 100kbps ceil 300kbps
tc class add dev eth1 parent 1: classid 1:20 htb rate 100kbps ceil 300kbps prio 1
En la práctica con estos comandos se genera un árbol de idénticas características al anterior, pues si la conexión solo
dispone de 300kbps y 100kbps son asignados de forma fija para cada banda, solo quedan 100kbps sin ocupar que son
los que pueden repartirse la banda 10 y 20.
En muchos casos este modelo es indeseable pues si solo se utiliza una de las bandas, por ejemplo la 10 (para navegar)
se está desaprovechando mucha velocidad, pues como máximo se puede llegar a 200kbps en lugar de los 300kbps, por
lo que se está infrautilizando la conexión.
La solución a este problema es conseguir que las bandas se presten velocidad si no lo usan, conseguir esto es muy
sencillo ya que en las colas htb siempre se comportan de este modo, con la salvedad de que la banda root (1) no puede
prestar ancho de banda a sus hijas. Por tanto la solución se podría dar como:
tc qdisc add dev eth1 root handle 1: htb default 20
tc class add dev eth1 parent 1: classid 1:1 htb rate 300kbps ceil 300kbps
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 100kbps ceil 300kbps
4/7
BULMA: Método para la ecualización del ancho de banda
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 100kbps ceil 300kbps prio 1
En este caso la banda root (1). Tiene una única hija la banda (1:1) (que acapara todo el ancho de la conexión) la cual a
su vez tiene dos hijas (1:10) y (1:20), que tienen características similares a las ya descritas en el caso anterior. En este
caso la banda 1:1 puede prestar su conexión a sus hijas, de modo que cada hija tiene su ancho de banda mínimo
100kbps y puede llegar a tener hasta 300kbps, si este no se usa por otra.
Gráficamente este segundo ejemplo se puede representar como
Como es evidente este es el ejemplo más sencillo que puede darse con únicamente dos bandas, si fuese nece
Comentarios de: BULMA: Método para la ecualización del ancho de banda (0)
No hay comentarios