RUTEO Y CONTROL DE FLUJO Los ruteadores son conmutadores de paquetes que operan al nivel de red del modelo de protocolo de Interconexión de sistemas abiertos (OSI, Open Sistems InterConnect ion). Los ruteadores interconectan redes tanto en las áreas locales como en las extensas, y cuando existe más de una ruta entre dos puntos finales de la red, proporcionan control de tráfico y filtrado de funciones. Los ruteadores son críticos en las redes interconectadas grandes y de área extensa que usan enlaces de telecomunicación. Dirigen los paquetes a través de las rutas más eficientes o económicas dentro de la malla de redes, que tiene caminos redundantes a un destino. Un ruteador examina la información de dirección de los paquetes y los envía hacia su destino a través de una ruta predeterminada. Los ruteadores mantienen tablas de los ruteadores adyacentes y de las redes de área local (LAN) que hay dentro de la red. Cuando un ruteador recibe un paquete, consulta dichas tablas para ver si puede enviarlo directamente a su destino. En caso contrario, determina la posición de otro encaminador que pueda hacerlo avanzar hacia su destino. El proceso de avance requiere la realización de un cierto procesamiento. Cuando el ruteador ha recibido la totalidad de un paquete, consulta lainformación de dirección y a continuación lo reenvía. Como consecuencia, el rendimiento se verá influido por las diferencias en los componentes del ruteador y en la arquitectura. Los ruteadores trabajan bien con un protocolo único como el Protocolo de Control de Transmisión / Protocolo Internet (TCP/IP), o bien con múltiples protocolos como Intercambio secuencial de paquetes / Intercambio de paquetes entre redes (SPX/IPX).Los Ruteadores, Enrutadores o Routers son equipos de interconexión de redes que actuán a nivel de los protocolos de red . Permite utilizar varios sistemas de interconexión mejorando el rendimiento de la transmisión entre redes. Su funcionamiento es más lento que los puentes pero su capacidad es mayor. Permiten, incluso, enlazar dos redes basadas en un protocolo, por medio de otra que utilice un protocolo diferente. Los enrutadores utilizan las cabeceras y una tabla de seguimiento para determinar la dirección que seguirán lo paquetes, utilizando ICMP para comunicarse entre ellos para configurar la mejor ruta entre dos anfitriones. Al pasar los datos a través del enrutador es muy poco el filtrado. Para losenrutadores no es relevante el tipo de datos que manejan. El ruteador es responsable de crear y mantener tablas de ruteo para cada capade protocolo de red, estas tablas son creadas ya sea estáticamente o dinámicamente. De esta manera el ruteador extrae de la capa de red la dirección destino y realiza una decisión de envio basado sobre el contenido de la especificación del protocolo en la tabla de ruteo.2. La inteligencia de un ruteador permite seleccionar la mejor ruta, basándose sobre diversos factores, más que por la direccion MAC destino. Estos factores pueden incluir la cuenta de saltos, velocidad de la linea, costo de transmisión, retrazo y condiciones de tráfico. La desventaja es que el proceso adicional de procesado de frames por un ruteador puede incrementar el tiempo de espera o reducir el desempeño del ruteador cuando se compara con una simple arquitectura de switch. ENCAMINAMIENTO O RUTEAMIENTO - El subsistema de Comunicación de datos, proporciona la conexión entre dos puntos terminales de la red y la distribución de datos o mensajes. La conexión es encaminada (por la red) a través de diferentes puntos o nodos de conmutación, dependiendo de la configuración de la red y del grado de ocupación de cada camino. la única excepción es el caso de las redes de difusión, aunque es interesante el análisis cuando el origen y destino están en redes diferentes. los algoritmos que seleccionan las rutas y las estructuras de datos que utilizan, representan una de las áreas principales en el diseño de la capa de red. modalidad de encaminamiento encaminamiento sub sistema de comunicaciones - Fijo o no adaptativo - Adaptativo nodos o centrales de conmutación línea telefónica microondas enlaces satélite radio enlace infrarrojos ENCADENAMIENTO FIJO O NO ADAPTATIVO: establece un camino físico fijo entre dos ECD en el subsistema de comunicación. El mismo camino será usado para el intercambio de mensajes mientras dure la conexión entre los ETD. ENCAMINAMIENTO ADAPTATIVO - El camino seguido por los mensajes se modifica dinámicamente. 6.3 Algoritmos de encaminamiento - Cada nodo está controlado por un computador, recibe un paquete el cual debe ser enviado al nodo vecino en el camino al destino. - problema fundamental: * Establecer un camino continuo (ruta), el cual incorpora nodos y enlaces, entre los ECD o nodos terminales. - Condiciones (alternativas): * encontrar el camino más corto. * minimizar número de nodos visitados. * minimizar tiempo de transito. - el procedimiento (algoritmo) seguido por el nodo para determinar por cual enlace enviará el paquete, o sea, la selección del nodo vecino dependerá de la estrategia utilizada para encaminamiento en la red. - estrategia * deterministico o fijo * estocástico o adaptativo Algoritmo de retransmisión adaptativo [Ste94, Jac88] El ajuste del temporizador de retransmisión, RTO (Retransmission Time Out), es especialmente crítico en TCP, al actuar tanto en redes locales, en enlaces punto a punto o en una red tan cambiante como Internet. Debe asegurarse un mecanismo que funcione correctamente en entornos tan diferentes como en los que opera TCP. RTO debe ser suficientemente pequeño como para responder rápidamente a las pérdidas, pero no tanto como para forzar la retransmisión de datos que han sufrido un pico de retardo en la red sin haber llegado a perderse, como sería el caso de congestión. Para adaptarse a los retardos variables característicos de un entorno como Internet, TCP usa un algoritmo de retransmisión adaptativo que monitoriza el retardo en cada conexión y ajusta el valor de RTO de acuerdo con ese valor. La especificación del protocolo sugiere tomar muestras del tiempo de ida y vuelta, RTT (Round Trip Time), calculado como la diferencia de tiempo entre la emisión de un segmento y la recepción de su reconocimiento. Con esta información, TCP puede ajustar dinámicamente una variable que identifique el tiempo medio de ida y vuelta, de la siguiente forma: RTT= α ∗ RTTanterior + (1-α) ∗ RTTnuevo 2-4 Finalmente el tiempo de retransmisión, se ajusta a: RTO= β ∗ RTT Los valores recomendados de α y β son 0.9 y 2 respectivamente, para el caso de redes fijas. Dado que estos valores han sido hallados experimentalmente, no se asegura el buen funcionamiento del algoritmo en circunstancias muy particulares. Esta estrategia, no obstante, no se adapta a fluctuaciones importantes en RTT provocando retransmisiones innecesarias. Se hace necesario introducir una estimación, también, de la varianza del tiempo de ida y vuelta, por lo tanto: RTO= a + 4 ∗ d a: RTT medio d: estimador de la desviación media de RTT Cada vez que se obtiene una nueva muestra del tiempo de ida y vuelta, m, los estimadores se actualizan así: Err=m - a a= a + g ∗ Err d=d + h ∗ -d) Los valores recomendados para g y h son 0.125 y 0.25 respectivamente, también obtenidos experimentalmente. Ruta más corta - Solución por el algoritmo de Dijkstra Para solucionar el problema de la ruta más corta entre dos nodos de un grafo se puede utilizar el Algoritmo de Dijkstra, el cual sigue el siguiente procedimiento para calcular la ruta más corta desde el nodo origen hasta cada uno de los nodos del grafo: Crea una listas de nodos para almacenar los nodos con distancia mínima ya calculada Crear una cola de prioridad para los nodos pendientes de evaluar Inserta el nodo origen a la cola de prioridad Mientras que haya nodos en la cola de prioridad o Extrae el primer nodo de la cola de prioridad (tmp) o Agrega el nodo tmp a la lista de nodos ya calculados o Genera una lista de los nodos conectados al nodo tmp que no estén en la lista de ya calculados o Para cada nodo de la lista (nod) Calcula la distancia al origen con la distancia entre tmp y nod más la distancia calculada entre el origen y tmp. Si el nodo nod no está en la cola de prioridad lo agrega Si el nodo nod ya está en la cola de prioridad y la distancia con la que está guardado en la cola es menor, lo deja como está y sino, lo actualiza con la distancia calculada o Fin Fin Al finalizar este procedimiento se tiene una lista con la menor distancia desde el origen a cada nodo. La clase Grafo descrita en un post anterior se puede modificar para incluir un nuevo método que calcula la menor ruta usando el algoritmo de Dijkstra con dos nuevos métodos: uno para calcular la distancia entre el origen y todos lo nodos, guardando estos resultados en una lista, y el segundo para mostrar la ruta entre el origen y el nodo destino tomando la información de la lista de distancias calculadas. Se implementa también un método adicional para verificar si un nodo ya está en la lista de terminados: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import java.util.*; public class Grafo { char[] nodos; // Letras de identificación de nodo int[][] grafo; // Matriz de distancias entre nodos String rutaMasCorta; // distancia más corta int longitudMasCorta = Integer.MAX_VALUE; // ruta más corta List<Nodo> listos=null; // nodos revisados Dijkstra // construye el grafo con la serie de identificadores de nodo en una cadena Grafo(String serieNodos) { nodos = serieNodos.toCharArray(); grafo = new int[nodos.length][nodos.length]; } // asigna el tamaño de la arista entre dos nodos public void agregarRuta(char origen, char destino, int distancia) { int n1 = posicionNodo(origen); int n2 = posicionNodo(destino); grafo[n1][n2]=distancia; grafo[n2][n1]=distancia; } 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 // retorna la posición en el arreglo de un nodo específico private int posicionNodo(char nodo) { for(int i=0; i<nodos.length; i++) { if(nodos[i]==nodo) return i; } return -1; } // encuentra la ruta más corta desde un nodo origen a un nodo destino public String encontrarRutaMinimaDijkstra(char inicio, char fin) { // calcula la ruta más corta del inicio a los demás encontrarRutaMinimaDijkstra(inicio); // recupera el nodo final de la lista de terminados Nodo tmp = new Nodo(fin); if(!listos.contains(tmp)) { System.out.println("Error, nodo no alcanzable"); return "Bye"; } tmp = listos.get(listos.indexOf(tmp)); int distancia = tmp.distancia; // crea una pila para almacenar la ruta desde el nodo final al origen Stack<Nodo> pila = new Stack<Nodo>(); while(tmp != null) { pila.add(tmp); tmp = tmp.procedencia; } String ruta = ""; // recorre la pila para armar la ruta en el orden correcto while(!pila.isEmpty()) ruta+=(pila.pop().id + " "); return distancia + ": " + ruta; } // encuentra la ruta más corta desde el nodo inicial a todos los demás public void encontrarRutaMinimaDijkstra(char inicio) { Queue<Nodo> cola = new PriorityQueue<Nodo>(); // cola de prioridad Nodo ni = new Nodo(inicio); // nodo inicial listos = new LinkedList<Nodo>();// lista de nodos ya revisados cola.add(ni); // Agregar nodo inicial a la cola de prioridad while(!cola.isEmpty()) { // mientras que la cola no esta vacia Nodo tmp = cola.poll(); // saca el primer elemento listos.add(tmp); // lo manda a la lista de terminados int p = posicionNodo(tmp.id); for(int j=0; j<grafo[p].length; j++) { // revisa los nodos hijos del nodo tmp if(grafo[p][j]==0) continue; // si no hay conexión no lo evalua if(estaTerminado(j)) continue; // si ya fue agregado a la lista de terminados Nodo nod = new Nodo(nodos[j],tmp.distancia+grafo[p][j],tmp); // si no está en la cola de prioridad, lo agrega if(!cola.contains(nod)) { cola.add(nod); 67 continue; 68 } 69 // si ya está en la cola de prioridad actualiza la distancia menor 70 for(Nodo x: cola) { 71 // si la distancia en la cola es mayor que la distancia calculada 72 if(x.id==nod.id && x.distancia > nod.distancia) { 73 cola.remove(x); // remueve el nodo de la cola 74 cola.add(nod); // agrega el nodo con la nueva distancia 75 break; // no sigue revisando 76 } 77 } 78 } 79 } 80 } 81 // verifica si un nodo ya está en lista de terminados 82 public boolean estaTerminado(int j) { 83 Nodo tmp = new Nodo(nodos[j]); 84 return listos.contains(tmp); 85 } 86 // encontrar la ruta mínima por fuerza bruta 87 public void encontrarRutaMinimaFuerzaBruta(char inicio, char fin) { 88 int p1 = posicionNodo(inicio); 89 int p2 = posicionNodo(fin); 90 // cola para almacenar cada ruta que está siendo evaluada 91 Stack<Integer> resultado = new Stack<Integer>(); 92 resultado.push(p1); 93 recorrerRutas(p1, p2, resultado); 94 } 95 // recorre recursivamente las rutas entre un nodo inicial y un nodo final 96 // almacenando en una cola cada nodo visitado 97 private void recorrerRutas(int nodoI, int nodoF, Stack<Integer> resultado) { 98 // si el nodo inicial es igual al final se evalúa la ruta en revisión 99 if(nodoI==nodoF) { 100int respuesta = evaluar(resultado); 101if(respuesta < longitudMasCorta) { 102longitudMasCorta = respuesta; 103rutaMasCorta = ""; 104for(int x: resultado) rutaMasCorta+=(nodos[x]+" "); 105} 106return; 107} 108// Si el nodoInicial no es igual al final se crea una lista con todos los nodos 109// adyacentes al nodo inicial que no estén en la ruta en evaluación 110List<Integer> lista = new Vector<Integer>(); 111for(int i=0; i<grafo.length;i++) { 112if(grafo[nodoI][i]!=0 && !resultado.contains(i))lista.add(i); 113} 114// se recorren todas las rutas formadas con los nodos adyacentes al inicial 115for(int nodo: lista) { 116resultado.push(nodo); 117recorrerRutas(nodo, nodoF, resultado); 118resultado.pop(); 119} 120} 121// evaluar la longitud de una ruta 122public int evaluar(Stack<Integer> resultado) { 123int resp = 0; 124int[] r = new int[resultado.size()]; 125int i = 0; 126for(int x: resultado) r[i++]=x; 127for(i=1; i<r.length; i++) resp+=grafo[r[i]][r[i-1]]; 128return resp; 129} 130public static void main(String[] args) { 131Grafo g = new Grafo("abcdef"); 132g.agregarRuta('a','b', 3); 133g.agregarRuta('a','e', 6); 134g.agregarRuta('a','f',10); 135g.agregarRuta('b','c', 5); 136g.agregarRuta('b','e', 2); 137g.agregarRuta('c','d', 8); 138g.agregarRuta('c','e', 9); 139g.agregarRuta('c','f', 7); 140g.agregarRuta('d','f', 4); 141g.agregarRuta('e','f', 4); 142char inicio = 'a'; 143char fin = 'd'; 144String respuesta = g.encontrarRutaMinimaDijkstra(inicio, fin); 145System.out.println(respuesta); 146} 147} Esta clase requiere del uso adicionalmente de la clase Nodo, que va a servir para la cola de prioridad y para llevar registro de la distancia mínima desde el origen a un nodo, así como la referencia al nodo inmediatamente anterior: ? 1 2 3 4 5 6 public class Nodo implements Comparable<Nodo> { char id; int distancia = Integer.MAX_VALUE; Nodo procedencia = null; Nodo(char x, int d, Nodo p) { id=x; distancia=d; procedencia=p; } Nodo(char x) { this(x, 0, null); } 7 public int compareTo(Nodo tmp) { return this.distancia-tmp.distancia; } 8 public boolean equals(Object o) { 9 Nodo tmp = (Nodo) o; 10if(tmp.id==this.id) return true; 11return false; 12} 13} El algoritmo de encaminamiento El método utilizado por un router o un host para averiguar la siguiente máquina a la que debe enviar un determinado datagrama se denomina genéricamente como el “algoritmo de encaminamiento”. La gran mayoría de algoritmos de encaminamiento utilizan “tablas de encaminamiento”. En las tablas de encaminamiento de cada hosto router se almacena información sobre los posibles destinos y sobre cómo alcanzarlos. La información que contienen las tablas de encaminamiento debe ser mínima, ya que si cada tabla de encaminamiento contuviera información sobre cada posible dirección destino sería imposible mantener actualizadas las tablas. Además, las máquinas no tendrían suficiente espacio ni capacidad de proceso para manejarlas. Se trata de minimizar la información que deben guardar las tablas aplicando un esquema de ocultación de información global, manteniendo sólo la información local mínima necesaria. Afortunadamente el esquema de direccionamiento IP permite realizar esto de forma fácil: como se mencionó en la sección 3.2, la dirección IP se divide en número de red y en número de host. Mediante este esquema es posible almacenar números de red en las tablas de encaminamiento en lugar de direcciones IP completas. De esta forma se ocultan los detalles de qué hosts y cómo están conectados a las diferentes redes y se minimiza el tamaño de las tablas de encaminamiento. El contenido de las tablas de encaminamiento suelen ser pares del tipo <N,R>. Donde N es un número de red y R es la dirección IP delrouter en el siguiente salto para alcanzar dicha red (por tanto el router debe estar conectado a la misma red física). Para simplificar más las tablas de encaminamiento aparece el concepto de “ruta por defecto”. La ruta por defecto contiene la dirección del router del siguiente salto al que se deben enviar los datagramas (también denominado routerpor defecto) si tras recorrer la tabla de encaminamiento no se encontró ninguna ruta específica para el número de red al que va dirigido el datagrama. Aunque se ha comentado la conveniencia de encaminar en base al número de red destino, la tabla de encaminamiento permite especificar una ruta especial para un host en particular. De esta forma el algoritmo básico de encaminamiento de un datagrama IP es el siguiente: 1. Extraer la dirección IP destino D. 2. Computar el prefijo de red N con la máscara local. 3. Si N se corresponde con alguna red física a la que estamos conectados se realiza entrega directa (realizando ARP). 4. Si no se puede realizar entrega directa, se comprueba si hay ruta específica para D y en caso afirmativo se envía el datagrama al routerdel salto siguiente especificado en la tabla. 5. Si no hay ruta específica, se comprueba si hay una ruta para la red N y en caso afirmativo se envía el datagrama al router del salto siguiente especificado en la tabla. 6. Si no hay ruta para N, se envía el datagrama al router por defecto especificado en la tabla. 7. Si no hay ruta por defecto y el software de encaminamiento IP ha llegado a este punto se produce un error (que se puede reportar mediante ICMP). Como conclusiones importantes del algoritmo de encaminamiento IP podemos destacar que: 1. En la mayor parte de implementaciones, el tráfico dirigido a una determinada red desde un host origen va a seguir el mismo camino aunque existan diversas posibilidades. 2. Sólo el último router de la ruta puede determinar si el hostdestino está disponible (estas situaciones se reportan mediante ICMP). Además también necesitamos reportes de los routers intermedios si sucede algún problema. 3. Los datagramas que viajen de A a B pueden seguir rutas diferentes a los datagramas que viajen de B a A. La figura 3.11 muestra 4 redes interconectados a través de 2 routers y la tabla de rutas del routerR1. Figura 3.11: Ejemplo de encaminamiento Es importante entender que a excepción de la disminución del campo TTL el software de encaminamiento no modifica la cabecera del datagrama original. En particular, las direcciones IP origen y destino permanecen inalteradas durante toda la ruta6. Por lo que respecta a los datagramas entrantes: Cuando un datagrama llega a un host el driver del dispositivo de red lo entrega al software IP para su procesamiento. Elsoftware IP determina si el datagrama es para el propio hosten cuyo caso lo pasa al software del protocolo de nivel alto apropiado. El datagrama se descarta si no es para el propio host. En el caso de los routers, estos deben encaminar el datagrama si no va dirigido hacia ellos. Decidir si una máquina es o no la destinataria de un datagrama no es una tarea tan trivial como a simple vista pueda parecer. En primer lugar pueden haber muchos interfaces de red cada uno de ellos con su correspondiente dirección IP, se debe comprobar la correspondiente identificación de subred (si la red está dividida) y además se deben reconocer los mensajes de broadcast y los de multicast. LA CONGESTIÓN DE REDES es el fenómeno producido cuando a la red (o parte de ella) se le ofrece más tráfico del que puede cursar. Causas de la congestión Hay varias causas de congestión. Las más importantes son: La 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, indico 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. Tirar 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 en base a 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 Traffic Shaping Traffic Shaping significa conformado de tráfico. 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 tira 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.