# Congestión de red

La congestión de red es el fenómeno producido cuando a la red, o parte de ella, se le ofrece más tráfico del que puede cursar. Efectos típicos de esto es demora en la entrega, pérdida de paquetes o el bloqueo de nuevas conexiones. Una consecuencia de la congestión es que un aumento incremental lleva a un aumento menor del tráfico cursado o incluso a una disminución del throughput de la red.

## Causas de la congestión

Hay varias causas de congestión. Las más importantes son:
* Memoria insuficiente de los conmutadores: Los paquetes se reciben demasiado deprisa para ser procesados (lo que produce que se llene la memoria de entrada). Además puede ser que en la memoria de salida haya demasiados paquetes esperando ser atendidos, entonces se llena memoria de salida.
* Insuficiente CPU en los nodos: Puede que el nodo sea incapaz de procesar toda la información que le llega, con lo que hará que se saturen las colas.
* Velocidad insuficiente de las líneas.

## Control de una congestión

Comprende todo un conjunto de técnicas para detectar y corregir los problemas que surgen cuando no todo el tráfico de una red puede ser cursado.

### Mecanismos de control de una congestión

El problema del control de congestión puede enfocarse matemáticamente desde el punto de vista de la teoría de control de procesos, y según esto pueden proponerse soluciones en bucle abierto y en bucle cerrado.

### Soluciones
#### Soluciones en bucle abierto

También llamadas soluciones pasivas. Combaten la congestión de las redes mediante un adecuado diseño de las mismas. Existen múltiples variables con las que el diseñador puede jugar a la hora de diseñar la red. Estas variables influirán en el comportamiento de la red frente a la congestión. Las resumiremos en función del nivel del modelo OSI al que hacen referencia:
* Nivel de enlace
    Variables de diseño:
   * Diseño de temporizadores y política de retransmisiones: Cuando los temporizadores agotan su cuenta, los paquetes afectados serán retransmitidos por la fuente. Si este tiempo es muy pequeño, habrá gran cantidad de retransmisiones. Por el contrario, si es grande, habrá menos congestión, pero el retardo medio aumentará. Además, podemos controlar lo que se retransmite cuando el temporizador se agota.
   * Política de descartes y almacenamiento de paquetes que llegan fuera de orden: El rechazo puede ser simple, que origina más retransmisiones, o bien selectivo, obligando a un almacenamiento temporal de los paquetes que llegan fuera de orden y mejorando la congestión.
   * Política de asentimientos: El piggybacking, o utilización de parte de un paquete de datos para enviar asentimientos de paquetes anteriormente recibidos, reduce, en principio, el tráfico, pero puede dar lugar a retransmisiones que contribuyan a la congestión.
   * Política de control de flujo: Parando a una fuente que vierte mucho tráfico podemos reducir el riesgo de congestión.
* Nivel de red
    Variables de diseño:
   * Circuitos virtuales frente a datagramas: Muchos algoritmos de control de congestión funcionan sólo en modo circuito virtual.
   * Política de colas (Teoría de colas) y de servicio: Los routers pueden diseñarse con una cola por línea de entrada, una cola por línea de salida, o ambos. Además, puede jugarse con el orden en que los paquetes son procesados, dando más prioridad a los paquetes de control, que contienen información útil desde el punto de vista de la congestión.
   * Política de descarte de paquetes: De nuevo, la correcta elección de los paquetes que se descartan puede disminuir el riesgo de congestión.
   * Algoritmo de enrutamiento: Es bueno desde el punto de vista de la congestión el balanceo del tráfico entre todas las líneas de la red.
   * Tiempo de vida de los paquetes: La correcta elección de esta variable permite reducir el número de retransmisiones, mejorando así el comportamiento de la red desde el punto de vista de la congestión.
* Nivel de transporte: Análogo al nivel de enlace, pero entre sistemas finales.

#### Soluciones en bucle cerrado

También llamadas soluciones activas. Actúan cuando se detectan problemas.
Tienen tres fases:
    a) Monitorización de parámetros. Se vigilan los siguientes parámetros:
       1. Ocupación de los enlaces y de los buffers (colas de espera en los nodos).
       2. Porcentaje de descartes.
       3. Número de retransmisiones.
       4. Retardos y jitters.
       Los jitters son oscilaciones de la separación temporal entre paquetes. En aplicaciones que requieren sincronización (videoconferencia, sincronizar audio con vídeo), es muy importante que esas oscilaciones sean pequeñas.
    b) Reacción: envío de información a los puntos necesarios. La comunicación se realiza gracias a:
       1. Paquetes especiales.
          No están sometidos a control de congestión y se saltan las colas de espera en los nodos. Los envía el nodo que, gracias a la monitorización, ha detectado la congestión.
       2. Bits de cabecera.
          En los paquetes enviados, se indica en la cabecera que empieza a haber congestión. (Ejemplo: Frame Relay).
       3. Información específica.
          Si se recibe una alerta de congestión (mediante bits de cabecera de paquetes que circulan por la red), se solicita más información.
    c) Ajuste del sistema. Hay varias medidas:
       1. Reducir la velocidad de envío
       2. Control de acceso. No se permiten más conexiones.
       3. Descartar paquetes. Controlar ráfagas de paquetes que llegan.

### Algoritmos de control de congestión

Se describen dos algoritmos en bucle cerrado: el algoritmo de descarte de paquetes, y un algoritmo de paquetes reguladores, así como un algoritmo en bucle abierto llamado mecanismo de Traffic Shaping.

#### Algoritmo de descarte de paquetes

Es un algoritmo de control de congestión en bucle cerrado. Se basa en que los nodos descartan paquetes cuando su ocupación es alta. Para esto los nodos han de conocer sus recursos (CPU y memoria). Hace una asignación dinámica de los buffers sobre la base de las necesidades de cada línea.
Sin embargo, cada línea necesita al menos una (o más) posiciones de memoria para gestionar información relevante, tal como asentimientos, que permite la liberación de posiciones de memoria ocupadas por paquetes que estaban esperando por si necesitaban retransmitirse.
Si a la línea llegan datos (no asentiminentos u otra información relevante) y el buffers de salida de la línea correspondiente está lleno, se descarta el paquete. Hay varias formas de hacer la asignación de buffers:
    a) En base al uso.
       No es muy eficiente, porque cuando una línea se empieza a cargar acapara todos los recursos.
    b) Asignación fija.
       Tampoco es muy buena, ya que desaprovecha recursos.
    c) Asignación subóptima (de Irland).

#### Algoritmo de paquetes reguladores

En terminología inglesa, al paquete regulador se le llama choke packet. Se hace en bucle cerrado. Asocia un peso a cada línea que cambia con el tiempo.
Si el peso supera un cierto umbral, se pone la línea en estado de alerta y se considera que puede haber congestión.
Si pasa un determinado tiempo sin recibir notificaciones de congestión, se vuelve a subir el flujo que puede cursar el origen. Si por el contrario se supera un umbral mayor, se pasa directamente a hacer descarte de paquetes.
Se fundamenta en la siguiente función: Un=a·Un-1 + (1-a)·f donde:
* Un es una función del peso que depende del instante actual a través de f y del instante anterior a través de Un-1
* f tiene el valor 0 si no se transmite en el instante actual y 1 si se trata del instante actual.
* a es una constante, cuyo valor debe estar entre 0 y 1 y que debe de asignarse según la importancia dada a cada enlace.
En el momento en que Un alcanza el primer valor umbral asignado, la línea se colca en alerta, por lo que se envía un paquete regulador hacia atrás. En los sucesivos paquetes que el nodo anterior envía hacia adelante se coloca un flag a 1 que indica que el enrutador anterior está avisado. Este enrutador reduce su flujo de trasmisión y si, en un tiempo estipulado, no vuelve a recibir un paquete regulador aumenta de nuevo su flujo de transmisión. Si se alcanza el segundo valor umbral asignado, se pasa a descartar paquetes.
Variaciones de este algoritmo:
* Pueden mandarse paquetes reguladores con información de estado (grave, muy grave, etc.) .
* En vez de monitorizar las líneas de salida pueden medirse otros parámetros, tales como el tamaño de las colas en los nodos.

#### Mecanismo de conformado de tráfico

El conformado de tráfico (en inglés: traffic shaping) es un mecanismo en bucle abierto. Conforma el tráfico que una fuente puede inyectar a la red. Se usa en redes ATM (Asynchronous Transfer Mode) con una tecnología de red orientada a conexión.
Si se tiene una ráfaga lista para transmitir, el sistema obliga a no transmitir todo seguido (porque conforma el tráfico). Requiere un acuerdo entre proveedor y cliente.
El proveedor garantiza que se cursa el tráfico si se transmite a una tasa determinada y descarta el tráfico si se supera. Esto puede realizarse mediante un algoritmo de Leaky Bucket (cubo agujereado), cuyo nombre se debe a que el sistema se comporta como un bidón que se va llenando con un caudal determinado y por el que sale el líquido con otro caudal (menor) distinto. Si llenamos muy deprisa el bidón acabará llenándose y vertiéndose por arriba, lo que asemeja una pérdida de paquetes en una red.