9.4. Terminología

Para entender correctamente configuraciones más complicadas se necesita explicar primero algunos conceptos. Debido a la complejidad y la relativa novedad de este tema, la gente usa un montón de términos diferentes cuando en realidad quieren decir lo mismo.

Lo que sigue se basa remotamente en draft-ietf-diffserv-model-06.txt, Un modelo informal de gestión para routers Diffserv. Actualmente lo puede encontrar en http://www.ietf.org/internet-drafts/draft-ietf-diffserv-model-06.txt.

Léalo para ver las definiciones estrictas de los términos usados.

Disciplina de colas (qdisc)

Un algoritmo que controla la cola de un dispositivo, sea de entrada (ingress) o de salida (egress).

qdisc raíz (root qdisc)

La qdisc raíz es la que está adjunta al dispositivo.

Qdisc sin clases

Una qdisc sin subdivisiones internas configurables.

Qdisc con clases

Una qdisc con clases contiene múltiples clases. Algunas de ellas contienen otra qdisc, que a su vez puede ser con clases, pero no tiene por qué. De acuerdo con la definición estricta, pfifo_fast *es* con clases, porque contiene tres bandas que son, en realidad, clases. Sin embargo, desde la perspectiva de configuración del usuario, no tiene clases ya que las clases no se pueden tocar con la herramienta tc.

Clases

Una qdisc con clases puede tener muchas clases, cada una de las cuales es interna a ella. A una clase, a su vez, se le pueden añadir varias clases. De manera que una clase puede tener como padre una qdisc u otra clase. Una clase terminal (o clase "hoja": leaf class) es una clase que no tiene clases hijas. Esta clase tiene 1 qdisc adjunta. Esta qdisc es responsable de enviar datos a la clase. Cuando creas una clase, se le adjunta una qdisc fifo. Cuando añades una clase hija, se elimina esta qdisc. Para clases terminales, esta qdisc fifo puede ser reemplazada con otra más adecuada. Incluso se puede reemplazar esta qdisc fifo por otra con clases de manera que se puedan añadir más clases.

Clasificador

Cada qdisc con clases necesita determinar a qué clase necesita enviar un paquete. Esto se hace usando el clasificador.

Filtro

La clasificación se puede realizar usando filtros. Un filtro contiene varias condiciones que pueden ser cumplidas.

Scheduling (ordenamiento)

Una qdisc puede, con la ayuda de un clasificador, decidir que algunos paquetes necesitan salir antes que otros. Este proceso se denomina Scheduling, y lo realiza por ejemplo la qdisc qfifo_fast anteriormente mencionada. El Scheduling también se denomina «reordenamiento», pero esto es confuso.

Shaping (ajuste)

El proceso de retrasar paquetes antes de que salgan para hacer que el tráfico sea conforme a una tasa máxima configurada. El Shapping se realiza durante la salida («egress»). Coloquialmente, al descarte de paquetes para ralentizar el tráfico también se le suele denominar Shapping.

Policing

Retrasar o descartar paquetes para que el tráfico se mantenga por debajo de un ancho de banda configurado. En Linux, el «policing» sólo puede descartar paquetes, no retrasarlo (no hay una «cola de ingreso» - ingress queue).

Conservativa de trabajo

Una qdisc conservativa de trabajo (work-conserving) siempre distribuye paquetes si los hay disponibles. En otras palabras, nunca retrasa un paquete si el adaptador de red está preparado para enviarlo (en el caso de una qdisc de salida - egress).

No conservativa de trabajo

Algunas colas, como la Token Bucket Filter, por ejemplo, pueden necesitar retrasar un paquete durante un cierto tiempo para limitar el ancho de banda. Esto significa que algunas veces rechazarán enviar un paquete, incluso aunque los haya disponibles.

Ahora que conocemos la terminología, veamos dónde están todas estas cosas.

       Programas en espacio de usuario
                     ^
                     |
     +---------------+-----------------------------------------+
     |               Y                                         |
     |    -------> Pila IP                                      |
     |   |              |                                      |
     |   |              Y                                      |
     |   |              Y                                      |
     |   ^              |                                      |
     |   |  / ----------> Reenvío ->                           |
     |   ^ /                       |                           |
     |   |/                        Y                           |
     |   |                         |                           |
     |   ^                         Y              /-qdisc1-\   |
     |   |                     Clasificador de   /--qdisc2--\  |
  --->-> Qdisc de              Salida (Egress)   ---qdisc3---- | ->
     |   Entrada (Ingress)                       \__qdisc4__/  |
     |                                            \-qdiscN_/   |
     |                                                         |
     +----------------------------------------------------------+
Gracias a Jamal Hadi Salim por esta representación ASCII.

El gran bloque representa al núcleo. La flecha de la izquierda es el tráfico entrando en la máquina desde la red. Entonces se le pasa a la Qdisc de Entrada que puede aplicar filtros a los paquetes, y decidir descartarlos. A esto se le llama «Policing».

Esto ocurre en una etapa muy temprana, antes de que se haya visto mucho del núcleo. Por tanto, es un buen lugar para descartar tráfico sin consumir mucho tiempo de CPU.

Si se le permite continuar al paquete, puede estar destinado a una aplicación local, en cuyo caso entra en la pila IP para ser procesado, y se envía a un programa en espacio de usuario. El paquete también puede ser reenviado sin pasar por una aplicación, en cuyo caso se destina a la salida (egress). Los programas de espacio de usuario también pueden distribuir datos, que serán examinados y reenviados por el Clasificador de Salida.

Ahí es observado y encolado por cualquiera de varias qdisc. En el caso por defecto, sin configurar, sólo hay instalada una qdisc de salida, pfifo_fast, que siempre recibe el paquete. A esto se le llama «encolado» (enqueueing).

Ahora el paquete está en la qdisc, esperando a que el núcleo pida que sea retransmitido por la interfaz de salida. A esto se le llama «desencolado».

Esta figura también funciona en el caso de que haya un único adaptador de red (las flechas de entrada y salida al núcleo no se deben tomar demasiado literalmente). Cada adaptador de red tiene ranuras tanto para entrada como para salida.