Introducción.
Objetivos
del Enrutamiento
Propiedades
de un algoritmo de Enrutamiento.
Métodos
de Enrutamiento.
Introducción.
Estructura
de un nodo.
Clasificación
de los métodos de Enrutamiento.
En
función del procedimiento.
Estático
Cuasiestático
Centralizado
Aislado
Distribuído
Vector
de distancia
Estado
de enlaces
Comparación
VD - EE.
Consumo
de capacidad.
Consumo
de memoria
Adaptabilidad
a los cambios
En
función de las tablas de Enrutamiento empleadas.
Enrutamiento
salto a salto
Enrutamiento
fijado en origen.
Comparación
entre ambos tipos de Enrutamiento.
Algoritmos
de Enrutamiento.
Introducción.
Notación.
Teoría de grafos.
Algoritmos
de camino más corto.
Algoritmo
de Dijkstra.
Algoritmo
de Floyd - Warshall.
Algoritmo
de Bellman - Ford.
Algoritmo
de Bellman - Ford distribuído.
Algoritmos
aislados.
Algoritmos
de inundación.
Algoritmos
de aprendizaje. (Backward Learning)
Algoritmos
de difusión.
Aplicaciones.
Introducción.
Bridges.
Bridges
transparentes.
Bridge
básico.
Learning
Bridge.
Árbol
de expansión de bridges.
Source Routing Bridges.
Comparación Source Routing - Transparent Bridges.
Protocolos
de Enrutamiento.
Introducción.
Protocolos
intradomino.
Establecimiento
de vecindades. Presentación del probelma.
Solución
TCP/IP.
Protocolos
de Enrutamiento existentes.
Control
de congestión.
Introducción.
Características
del retardo y caudal.
Causas
de la congestión.
Soluciones.
Mecanismos de control de congestión.
Algoritmos
de control de congestión.
Mecanismo
de Traffic Shaping.
Algoritmo
de paquetes reguladores.
Algoritmo
de descarte de paquetes.
Bibliografía
Enrutamiento y Control de Congestión
Trataremos de dar unas nociones básicas de lo que se
entiende por Enrutamiento, estableciendo los objetivos que persigue un
algoritmo de este tipo en una red de conmutación de paquetes, y acabaremos
enumerando las propiedades que debe tener un algoritmo de Enrutamiento.
Objetivos
del Enrutamiento
Podemos definir Enrutamiento como un proceso
mediante el cual tratamos de encontrar un camino entre dos puntos de la red:
el nodo origen y el nodo destino. En esta definición tenemos que matizar el
hecho de que cuando hablamos de un camino nos estamos refiriendo a
varios, el mejor o el mejor para llegar de 1 a N puntos.
Habría que tener en cuenta también la capilaridad de las redes
(conexión de los nodos con los terminales de usuario, por lo que no se trataría
de buscar un camino entre dos nodos, sino entre dos terminales. En realidad,
resolviendo lo primero tenemos resuelto lo segundo, por lo que nosotros
enunciaremos nuestro problema como la búsqueda de un camino de conexión
entre dos nodos de la red.
El objetivo que se persigue es encontrar las mejores rutas entre pares de
nodos j-k . Para ello tendremos que establecer lo que se entiende por mejor
ruta y la métrica que se emplea para determinarla.:
a) Mejor Ruta.
|
Por mejor ruta se entiende aquella que cumple
alguna de estas condiciones:
presenta el menor retardo medio de transito,
consigue mantener acotado el retardo entre pares de
nodos de la red (Tjk<To),
consigue ofrecer altas cadencias efectivas
independientemente del retardo medio de transito
ofrezca el menor coste.
|
b) Métrica de la Red.
|
Citaremos dos de ellas:
Numero de saltos (canales) necesarios para ir de un
nodo a otro. No se comporta de forma óptima, pero si ofrece buenos
resultados, y es empleada con bastante frecuencia.. La distancia (valor
que se asocia a cada canal) es igual a 1 para todos los canales.
Retardo de Transito entre nodos vecinos. En este
caso la distancia se expresa en unidades de tiempo (p.e ms), y no
es constante a lo largo del tiempo sino que depende del trafico que
soporta el canal.
|
Nos centraremos en redes de conmutación de paquetes, tanto en modo
datagrama como en modo circuito virtual.
a) Red en modo circuito virtual.
|
Si la red funciona en modo circuito virtual
generalmente se establece una ruta que no cambia durante el tiempo de
vida de ese circuito virtual, ya que esto es lo más sencillo para
preservar el orden de los paquetes. El Enrutamiento se decide por
sesión y no se cambia a menos que sea imprescindible, es decir existen
restricciones de cara a no cambiar el Enrutamiento en la sesión (ej. caída
de un enlace).
Cuando eso ocurre se busca inmediatamente otra ruta, pero este cambio al
tardar en propagarse por la red, al tardar los nodos en enterarse, se
puede manifestar en los sistemas finales de tres formas:
no se manifiesta
se pierde información
se pierde la sesión.
|
b) Red en modo datagrama
|
Como en este caso no debe garantizarse el
ordenamiento final de los paquetes, en una red funcionando en modo
datagrama se puede cambiar el criterio de Enrutamiento por cada paquete
que se ha de cursar (Esto da origen a menor numero de problemas).
|
El problema no es trivial, como puede parecer a simple vista, para redes
reales, puesto que hay que tener en cuenta los cambios de carga de los enlaces
y los cambios de configuración (debidos a altas y bajas, a averías en los
nodos, etc.). Llegados a este punto conviene matizar que el Enrutamiento busca
el camino óptimo, pero como el tráfico varía con el tiempo, el camino óptimo
también dependerá del instante en que se observa la red. Los protocolos serán
los encargados de ocultar la red y comprobar que las condiciones impuestas se
verifican siempre.
Por esta razón, el Enrutamiento debe proveer a la red de mecanismos para
que ésta sepa reaccionar ante situaciones como:
Variabilidad del tráfico: se han de evitar las
congestiones de la red.
Variaciones topológicas, como las mencionadas
arriba: caídas de enlaces, caídas de nodos, altas y bajas ...
Cambios en la QoS (Quality of Service): a
veces se pide un servicio donde no importa el retardo y sí un alto throughput,
y viceversa.
Se tiene un sistema distribuído, donde cada nodo
debe tener un cierta inteligencia y se produce un procesamiento
independiente de cada nodo (no hay proceso central). También es un sistema
asíncrono, en el sentido de que no hay un momento determinado para que
ocurran las cosas (un nodo transmite cuando le llega información, y esto
sucede a su vez cuando el usuario decide mandarla).
Propiedades
de un algoritmo de Enrutamiento.
Para que un algoritmo de Enrutamiento real funcione de forma razonable debe
cumplir las siguientes propiedades:
Corrección. Es algo obvio: queremos que el
paquete llegue precisamente al nodo al que lo mandamos.
Simplicidad. Debe aportar soluciones sencillas.
Esto es útil para redes reales (grandes) y los protocolos mas simples son los
que en la actualidad tienden a imponerse (p.e. RIP: Routing Interconexion
Protocol).
Robustez. Debe comportarse correctamente frente a
posibles problemas (caída de enlaces...), que deben haber sido previstos de
antemano.
Estabilidad. Es muy importante que se cumpla. El
procedimiento debe converger antes de que la red cambie de estado (caída de
nodo, alta de usuario, etc.). Cuando esto ocurre, se recalculan de nuevo las
rutas, debiendo los nodos llevar a cabo acciones coherentes que conduzcan a
situaciones estables.
Equidad o Justicia. Debe tratar a todos los
usuarios de la misma manera.
Gestionabilidad (trazabilidad). Supone tener
información (trazas) de lo que ha hecho la red para que en el caso de que
ocurran "cosas raras" sea posible corregirlas.
Escalabilidad. Tengo que tener un comportamiento
optimo sea cual sea el numero de nodos ( incluso si este aumenta mucho)
En este apartado veremos primero la estructura de un nodo
de conmutación de paquetes, lo cual nos valdrá para hacer una posterior
clasificacíon de los métodos de Enrutamiento atendiendo a la forma en la que
los nodos recogen y distribuyen la información que les llega de la red y a
otros factores.
Podemos tomar como representación de un nodo la
siguiente figura:
Figura 5 Esquema de un nodo
Pasamos a describir cada uno de sus elementos:
FIB
(Forward Information Base)
Es la tabla de Enrutamiento que se consulta para
hacer el reenvío de los paquetes generados por los usuarios (los PDU
representan estos paquetes).
Entorno local
Contiene la información de lo que el nodo ve (memoria
disponible, enlaces locales, etc.), más la que hay que proporcionarle.
PDU
(Protocol Data Unit)
Unidad fundamental de intercambio de información para un
nivel determinado (a veces se indica explícitamente el nivel poniendo N-PDU,
o PDU de nivel N), como nivel de enlace, red, etc. Son llamados también tramas.
R-PDU
(Routing-PDU)
Paquete de control. Estos paquetes los mandan otros nodos
con información sobre la red (no son datos). Por ejemplo, se manda información
de que el nodo sigue activo, y también las distancias a otros nodos (vector
de distancias).
Decisión
Contiene la lógica necesaria para decidir si la tabla de
Enrutamiento debe ser cambiada.
RIB
(Routing Information Base)
Es la base de información de Enrutamiento que se
consulta para decidir y formar la FIB. La información de la RIB
se consigue mediante interacción con el entorno local de cada nodo
(cada nodo observa sus enlaces) y mediante la recepción de R-PDUs d e
información de control procedentes de otros nodos vecinos que informan del
conocimiento que estos nodos tienen sobre el estado de la red. A su vez, con
la información obtenida por la RIB, ésta manda PDUs de control
para informar del conocimiento del estado de la red que el nodo tiene a los
demás nodos.
Los métodos de Enrutamiento los podemos clasificar en
función de:
El procedimiento de Enrutamiento.
Las tablas de Enrutamiento empleadas.
Los procedimientos de Enrutamiento pueden ser:
Las tablas de Enrutamiento de los nodos se configuran de
forma manual y permanecen inalterables hasta que no se vuelve a actuar sobre
ellas. La adaptación a cambios es nula. Tanto la recogida como la distribución
de información se realiza por gestión (se realiza de manera externa a la
red), sin ocupar capacidad de red. El calculo de ruta se realiza off-line (en
una maquina especifica),y las rutas pueden ser las optimas al no estar
sometido al requisito de tiempo real.
Este tipo de Enrutamiento es el optimo para topologias en
los que solo hay una posibilidad de Enrutamiento (topologia en estrella).
Este Enrutamiento, es igual que el estatico pero en vez
de dar una sola ruta fija, se dan además varias alternativas en caso de que
la principal no funcione, de ahí que tenga una adaptabilidad reducida.
Este tipo de Enrutamiento puede dar lugar a situaciones incoherentes, ya
que no se enteran todos los nodos de los problemas de la red, sino sólo los
adyacentes a los problemas.
En este tipo de Enrutamiento, todos los nodos son iguales
salvo el nodo central, que recoge la información de control de todos los
nodos y calcula la FIB (tabla de Enrutamiento) para cada nodo, es decir, el
nodo central decide la tabla de Enrutamiento de cada nodo en función de la
información de control que éstos le mandan. El inconveniente de este metodo
es que consumimos recursos de la red, y se harian necesaria rutas alternativas
para comunicarse con el nodo central. La adaptación a cambios es perfecta
siempre y cuando las notificaciones de los cambios lleguen antes de iniciar
los cálculos de las rutas.
Se basa en que cada vez que un nodo recibe un paquete que
tiene que reenviar (porque no es para él) lo reenvía por todos los enlaces
salvo por el que le llegó.
En este tipo de Enrutamiento todos los nodos son iguales,
todos envían y reciben información de control y todos calculan, a partir de
su RIB (base de información de Enrutamiento) sus tablas de Enrutamiento. La
adaptación a cambios es optima siempre y cuando estos sean notificados.
Hay dos familias de procedimientos distribuídos:
Cada nodo informa a sus nodos vecinos de todas las
distancias conocidas por él, mediante vectores de distancias (de
longitud variable según los nodos conocidos). El vector de distancias es un
vector de longitud variable que contiene un par (nodo:distancia al nodo) por
cada nodo conocido por el nodo que lo envia, por ejemplo (A:0;B:1;D:1) que
dice que el nodo que lo manda dista "0" de A,"1"
de B y "1" de D, y de los demás no sabe nada (ésta es la
forma en la que un nodo dice lo que sabe en cada momento). El nodo solo conoce
la distancia a los distintos nodos de la red pero no conoce la topologia.
Con todos los vectores recibidos, cada nodo monta su
tabla de Enrutamiento ya que al final conoce qué nodo vecino tiene la menor
distancia al destino del paquete, pues se lo han dicho con el vector de
distancias.
Cada nodo difunde a todos los demás nodos de la red sus
distancias con sus enlaces vecinos, es decir, cada nodo comunica su entorno
local a todos los nodos. Así cada nodo es capaz de conocer la topología de
la red. La clave y dificultad de este metodo es la difusión.
A continuación se muestra una tabla comparativa de todos
los tipos de Enrutamiento vistos
Clasificación de los métodos de
Enrutamiento
Tipos de Enrutamiento
|
Recepción de información de control
|
Envío de información de control
|
Decisión de Enrutamiento (cálculo de la FIB)
|
Adaptación a los cambios
|
Estático
|
NO
|
NO
|
OFF-LINE
|
NO
|
Cuasi - estático
|
NO
|
NO
|
OFF-LINE
|
Reducida
|
Centralizado
|
Nodos-Nodo central
|
Nodo central-Nodos
|
Nodo central
|
SI
|
Aislado
|
NO
|
NO
|
Inundación, por ejemplo
|
SI
|
Distribuído
|
Todos los nodos
|
Todos los nodos
|
Todos los nodos
|
SI
|
En los Enrutamientos estático y cuasi-estático
la información necesaria se recoge y envía mediante gestión (al
crear la red y en operaciones de mantenimiento), y los cálculos de la FIB se
realizan off - line (mediante gestión, es decir en una máquina a
parte).
Haremos una comparación entre los algortitmos de vector
de distancias y de estado de enlaces, ambos del tipo distribuído:
Lo ideal es que el tráfico de control sea lo más pequeño
posible. Con vectores de distancia se transmiten vectores cuyo tamaño
es del orden del número de nodos de la red pues cada nodo comunica a su
vecino todas las distancias que conoce; con procedimientos de estado de
enlace, el tamaño del tráfico enviado es siempre el mismo
independientemente del tamaño de la red. En consecuencia, consume más
capacidad un vector de distancias.
El Enrutamiento basado en estado de enlace hace
que cada nodo almacene toda la topología de la red, sin embargo con vectores
de distancias sólo ha de almacenar distancias con el resto de los nodos.
Luego consume más memoria en los nodos un procedimiento basado en estado
de enlace.
El método de vector de distancia es más
sencillo, pero se adapta peor a los cambios que el de estado de enlace.
Esto es porque mientras que este último tiene información de toda la red, el
primero sólo sabe a quién tiene que reenviar un paquete, pero no tiene
información de la topología. Luego se adapta mejor un Enrutamiento de
estado de enlaces.
No obstante, el Enrutamiento basado en vector de distancias es
mucho menos complejo que el de estado de enlaces, cosa que en algunos
casos prácticos puede llegar a ser muy importante.
Los nodos manejan tablas de Enrutamiento, en las
que aparece la ruta que deben seguir los paquetes con destino a un nodo
determinado de la red.
Podemos distinguir entre Enrutamiento salto a salto y Enrutamiento fijado
en origen. Nosotros veremos con detalle sólo el primer tipo (salto a salto).
En la literatura inglesa, este tipo de encaminamineto se
denomina como hop by hop. Se basa en que cada nodo no tiene que conocer
la ruta completa hasta el destino, sino que sólo debe saber cuál es el
siguiente nodo al que tiene que mandar el paquete: las tablas dan el nodo
siguiente en función del destino. Como ejemplo, tomemos la siguiente red:
Figura 5 Red ejemplo para el
apartado de tabla de Enrutamiento
Las tablas de Enrutamiento de los nodos A y B serán:
Tabla 1 Tablas de Enrutamiento para la
red de la Figura 5
Tabla de Enrutamiento del nodo A
|
Tabla de Enrutamiento del nodo B
|
Destino
|
Siguiente nodo
|
Destino
|
Siguiente nodo
|
B
|
B
|
A
|
A
|
C
|
B
|
C
|
C
|
D
|
B
|
D
|
C
|
E
|
H
|
E
|
C
|
F
|
H
|
F
|
C
|
G
|
H
|
G
|
G
|
H
|
H
|
H
|
A
|
|
|
En la tabla de Enrutamiento de cada nodo debera aparecer
una entrada en el campo destino por cada nodo que se pueda alcanzar desde el
citado nodo, y en el campo siguiente nodo aparecerá el nodo vecino al
que se debera enviar los datos para alcanzar el citado nodo destino. Las
soluciones propuestas no son únicas, pudiendo elegir otros caminos que
minimicen el tiempo de retardo, el número de saltos, etc. La única condición
que se impone es que debe haber consistencia: si, por ejemplo, para ir de A
aB pasamos por C, entonces para ir de B a C no
podremos pasar por A, porque entonces se formaría un bucle y el
paquete mandado estaría continuamente viajando entre los nodos B y A,
como puede comprobarse fácilmente.
En inglés este Enrutamiento se llama source routing.
En él, son los sistemas finales los que fijan la ruta que ha de seguir cada
paquete. Para ello, cada paquete lleva un campo que especifica su ruta(campo
RI:Routing Information), y los nodos sólo se dedican a reenviar los paquetes
por esas rutas ya especificadas. Así pues, son los sistemas finales los que
tienen las tablas de Enrutamiento y no se hace necesaria la consulta o
existencia de tablas de Enrutamiento en los nodos intermedios. Este tipo de
Enrutamiento suele ser típico de las redes de IBM.
Tabla 2 Tablas de Enrutamiento para la
red de la Figura 5
Tabla de Enrutamiento del nodo A
|
Tabla de Enrutamiento del nodo B
|
Destino
|
Ruta a seguir
|
Destino
|
Ruta a seguir
|
B
|
B
|
A
|
A
|
C
|
B-C
|
C
|
C
|
D
|
B-C-D
|
D
|
C-D
|
E
|
H-G-E
|
E
|
C-F-E
|
F
|
H-G-F
|
F
|
C-F
|
G
|
H-G
|
G
|
G
|
H
|
H
|
H
|
A-H
|
|
|
Lo veremos por medio de la siguiente tabla:
Tabla 3 Comparación entre Enrutamiento
salto a salto y fijado en origen
|
Fijado en Origen
|
Salto a Salto
|
Conocimiento
|
Los sistemas finales han de tener un conocimiento
completo de la red
|
SIMPLICIDAD: Los nodos han de tener un conocimiento
parcial de la red (saber qué rutas son las mejores)
|
Complejidad
|
Recae toda en los sistemas finales
|
En los sistemas intermedios ya que son los que
tienen que encaminar
|
Problemas de Bucles
|
No hay bucles: el sistema final fija la ruta
(ROBUSTEZ).
|
Sí pueden ocurrir: no se tiene una visión
completa de la red (INCONSISTENCIA)
|
Los bucles (situación que se da cuando los paquetes pasan más de
una vez por un nodo) ocurren porque los criterios de los nodos no son
coherentes, generalmente debido a que los criterios de Enrutamiento o no han
convergido después de un cambio en la ruta de un paquete; cuando por
cualquier causa un paquete sufre un cambio de Enrutamiento, la red tarda en
adaptarse a ese cambio pues la noticia del cambio tiene que llegar a todos los
nodos. Es en ese transitorio cuando se pueden dar los bucles, ya que unos
nodos se han adaptado y otros no. El objetivo de los algoritmos de
Enrutamiento es detener el curso de los paquetes antes de que se produzcan
bucles. Esto es importante sobre todo cuando se envían los paquete s por
varias rutas simultáneamente (técnicas de inundación, etc..., que veremos más
adelante).
En este apartado tras tratar brevemente la teoria de
grafos, veremos distintos algoritmos de Enrutamiento. En concreto, veremos
algoritmos de camino más corto, en los que cada nodo decide cuál es el
camino más corto hacia un destino, en función de la información de control
que recibe de otros nodos de la red, algoritmos aislados, en los que los nodos
no intercambian información de control explícitamente, y algoritmos de
difusión, que permiten hacer llegar un paquete a todos los nodos de una red.
Necesitamos revisar el concepto de distancia o coste
de un canal. Es una medida de la calidad de un enlace en base a la métrica
que se haya definido (por ej., para el método de Gerla es la sensibilidad al
aumento de tráfico; otras veces es coste económico, probabilidad de error,
etc.). En la práctica se usan varias métricas simultáneamente.
Para el desarrollo de los siguientes conceptos vamos a tomar como
ejemplo la siguiente red (donde los números situados sobre cada enlace
indican el coste del mismo):
Figura 1 Red ejemplo para el apartado de teoría de grafos
y sobre ella vamos a definir:
Árbol de expansión (Spanning tree) de una red.
Es un subconjunto del grafo que representa toda la red y
tiene las siguientes caracteristicas:
Mantener la conectividad: es posible alcanzar cualquier
nodo desde cualquier otro. Eliminar los lazos: no hay bucles topológicos.
Contiene a todos los nodos de la red.
Este tipo de grafo no es único; un ejemplo sobre la red anterior es:
Figura 2 Ejemplo de árbol de
expansión para la red de la Figura
1
Se suele usar cuando se desea hacer una inundación, ya que si todos los
nodos tienen en su tabla de Enrutamiento el mismo árbol de expansión, no se
producirán bucles y todos los paquetes llegan a todos los nodos. Se usa sobre
todo en difusiones.
Arbol de expansión de coste o distancia mínima
(Minimun Spaning Tree)
Es un árbol de expansión que cumple que el
sumatorio de distancias que emplea es mínimo.
Por ejemplo el anterior tiene coste 10.
El siguiente es mínimo (su suma de distancias es 5;
esto se puede comprobar sumando el peso de las distancias de cada canal, tal y
como aparecen en la Figura 1); no existe otro con suma de distancias menor,
aunque en general podría haberlo, es decir, el árbol de expansión de coste
mínimo no es único, aunque en la práctica se escoge uno y se trabaja con él
en lo sucesivo.
Figura 3 Árbol de expansión de
distancia mínima para la red de la Figura
1
Arbol divergente (Sink tree) de un nodo.
Es un árbol con origen en un nodo y ramas a todos los
restantes nodos. No produce bucles. Hay un árbol divergente por cada nodo;
sin embargo, normalmente se trabaja con un sólo árbol de expansión para
toda la red (lo cual no quiere decir que no haya muchos árboles de expansión
diferentes, aunque se trabaje con uno sólo acordado por toda la red).
Determina las distancias más cortas de ese nodo al resto
de los nodos: el sumatorio del peso de los enlaces es mínimo entre el nodo raíz
y cualquier otro. Es, expresada de forma gráfica, la tabla de Enrutamiento de
cada nodo.
En la red usada como ejemplo, el árbol divergente del nodo A, es el
siguiente:
Figura 4 Árbol divergente para el
nodo A de la red de la Figura 1
No se debe confundir el arbol divergente (Sink Tree) con el arbol de
expansión de peso mínimo (MST), aunque pueden coincidir. En el primero
minimizamos las distancias del nodo raíz a cada uno de los demás nodos,
mientras que en el segundo lo que minimizamos la suma de las distancias de los
enlaces.
Estos algoritmos minimizan el coste o distancia
de la ruta que une dos nodos cualesquiera. Por ejemplo, si la métrica
utilizada es el número medio de saltos, el algoritmo de camino más corto será
el que minimice este número de saltos entre los nodos que pretendemos
conectar.
En concreto, veremos los algortimos de Dijkstra, de Floyd - Warshall, de
Bellman - Ford y de Bellman - Ford distribuído
Halla el camino de mínima distancia entre un nodo origen
(o raiz) y cualquier otro nodo de la red. Puede verse que esto equivale a
decir que construye el árbol divergente de la red.
La idea es construir el camino de distancia más corta en orden de longitud
de camino creciente, es decir, se va iterando con la distancia, seleccionando
en cada caso el nodo más cercano.
A cada nodo se le asigna una etiqueta, que es un indicador de la
distancia del nodo origen al nodo en cuestión. Así, se hace una partición
de la red: se crea un conjunto de nodos con etiqueta permanente
(conjunto P) y un conjunto de nodos con etiqueta tentativa
(conjunto T), es decir, un conjunto de nodos cuya etiqueta puede
cambiar en las siguientes iteraciones. El algoritmo en detalle es el
siguiente:
Paso 0: Iniciación.
Seleccionamos un nodo de la red, al que llamamos nodo 1, que será
nuestro nodo origen. Entonces:

es decir, el único nodo con etiqueta permanente
es el origen (con etiqueta "cero"). Para los demás, la etiqueta es
la distancia al nodo origen (dij).
Paso 1: Encontrar el nodo más cercano.
Encontrar
tal que 
Sea
Si P contiene todos los nodos, PARAR (algoritmo
completo).
Paso 2: Actualización de etiquetas.
|
(1)
|
Ir al paso 1.
Si hay que elegir entre dos etiquetas iguales, se elige
cualquiera de ellas (no se soporta balanceo de carga).
Para comprender mejor este algoritmo, veamos un ejemplo sobre la red de la
Figura 1 tomando como nodo origen el A. En las siguientes figuras,
el número que va sobre cada enlace representa la distancia física entre
nodos y el número que hay en cada nodo representa su etiqueta (un guión
representa una etiqueta de valor infinito: no hay conexión directa entre
cualquier nodo con etiqueta permanente y el nodo con dicha etiqueta):
Figura 6 Ejemplo de algoritmo de Dijkstra sobre la red de
la Figura 1
Iteración 1
|
Iteración 2
|
|
|
|
|
|
|
Iteración 3
|
Iteración 4
|
|
|
|
|
|
|
Por último, meteríamos el nodo C en la partición
de nodos con etiqueta permanente, siendo su etiqueta "4" (se accedería
a través del nodo D).
Como puede comprobarse, este algoritmo tiene una complejidad de N2
operaciones.
Para calcular las mejores distancias entre todo par de nodos, la
complejidad es del orden de N3 operaciones.
No obtiene directamente las tablas de Enrutamiento, sino las distancias
entre nodos. Para obtener las tablas de Enrutamiento hay que fijarse en los
caminos que va escogiendo en cada iteración, que le sirven para actualizar
las etiquetas.
A diferencia del algoritmo anterior (algoritmo de
Dijkstra), que consideraba un nodo origen cada vez, este algoritmo obtiene la
ruta más corta entre todo par de nodos (todos con todos). Itera sobre
el conjunto de nodos que se permiten como nodos intermedios en los caminos.
Empieza con caminos de un solo salto y en cada paso ve si es mejor la ruta de
la iteración anterior o si por el contrario conviene ir por otro nodo
intermedio más(aquél sobre el cual se itera).
Para ello se construye la matriz D, cuyos elementos, Dij,
son las etiquetas (indicadores de distancia) de la ruta entre el nodo i
y el j. El algoritmo es el siguiente:
Paso 0: Iniciación.
Se construye la matriz D como:
|
(2)
|
donde dij es la distancia entre el nodo i
y el nodo j.
Paso 1: Iteración.
Para
se actualiza la matriz:
|
(3)
|
En cada paso se ve si es mejor la ruta de la iteración
anterior o si es mejor ir a través del nodo n. Para la red de la
Figura 1 se tiene la siguiente secuencia de matrices:

Nota: El nodo 1 es el nodo A de la
red, el 2 es el B y así sucesivamente.
La segunda matriz tiene el nodo 1 como nodo intermedio, la tercera
matriz tiene el nodo 2 como nodo intermedio, ... y así hasta la última
matriz que tiene el nodo 5 como nodo intermedio y da como resultado la
matriz de distancias mínimas buscada.
Podemos comprobar que la primera fila de la matriz (distancias del nodo A
a todos los demás) coincide con las etiquetas halladas con Dijkstra en el
apartado anterior.
La última matriz es la matriz de distancias buscada, ya que se han
probado todos los nodos intermedios. Hay que tener en cuenta que el algoritmo
da sólo la menor distancia; se debe manejar información adicional para
encontrar tablas de Enrutamiento.
La complejidad de este algoritmo es del orden de N3,
igual que para Dijkstra. Para un Enrutamiento distribuído con estado de
enlaces es mejor Dijkstra, que tiene una menor complejidad para un nodo dado.
Encuentra la mínima distancia de un nodo dado al resto
de los nodos, y si se lleva información adicional, proporciona las tablas de
Enrutamiento, al igual que los anteriores.
Itera sobre el número de saltos, h, es decir, se busca el
mejor camino, el de distancia más corta, con la restricción de llegar al
destino en un número de saltos h (número de la iteración). No
encuentra las mejores rutas hasta que el algoritmo no se ha ejecutado por
completo.
Sea el nodo 1 aquél para el que queremos encontrar las
mejores rutas al resto de nodos. El algoritmo es el siguiente:
Iniciación
Probamos con caminos de n=0 saltos (no llegamos a nada):
|
(4)
|
lo que equivale a decir que con cero saltos todos los
nodos distan del nodo 1 una distancia infinita, salvo él mismo que
dista cero.
Iteración
Probamos qué pasa si se da un salto más:
|
(5)
|
Se prueba dando un salto más. Notar que está permitido
el caso i=j, resultando entonces que no se da un nuevo salto (era mejor la
ruta hallada antes).
Tiene una complejidad del orden de N3
por cada nodo que realiza el algoritmo, es decir, un orden mayor que Dijkstra.
El interés del algoritmo radica en que se asemeja al de una red en la que se
parte de la ignorancia total de un nodo, en la siguiente iteración conoce a
sus nodos vecinos y así va progresivamente conociendo nodos más lejanos.
Puede verse que esta es la forma de trabajar de un Enrutamiento mediante vector
de distancias. Para ello, necesita ser enunciado de forma distribuída, de
la forma que vemos a continuación.
Es la base de un algoritmo de vector de distancias:
permite obtener en cada nodo la minamiento n(i,j). Se ejecuta en cada
nodo i.
El algoritmo es el siguiente:
Iniciación.
donde M es el conjunto de nodos vecinos al nodo i.
Al principio sólo se sabe llegar al conjunto de nodos vecinos.
Por eso para ir de desde i a j se va por j (n(i,j)=j ) si
j es un nodo vecino de i; si no es un nodo vecino, su distancia
no se conoce.
Actualización.
Todo nodo i recibe mensajes de nodos vecinos j, es decir, el
nodo i recibe mensajes sobre todas las distancias que sabe j al
resto de los nodos.
Cuando al nodo i le llega el vector de distancias que le envía j
en el que le comunica la distancia de este último a un tercer nodo k,
el nodo i calcula la distancia a k a través de j:
|
(6)
|
y realiza la siguiente actualización de su tabla de
Enrutamiento:
|
(7)
|
Una vez actualizada la tabla, propaga la distancia d(i,k)
a vecinos.
El proceso de actualización se sigue repitiendo: cuando
un nodo i recibe un vector de distancias de un nodo vecino j,
calcula las distancias a todos los demás nodos k a través del vecino j,
y si es mejor que por el camino anterior se actualiza la tabla de Enrutamiento
del nodo i, ( n(i,k)=j) y las nuevas distancias d(i,k). Una vez
obtenido el nuevo vector de distancias, i se lo manda a los demás
nodos j para que éstos actualicen a su vez los suyos.
Vemos un ejemplo para el nodo A de la red de la Figura 1.
Inicialmente, este nodo tiene conocimiento de las distancias a sus vecinos B
yE) por lo que su vector de distancias sería (A,0; B,1; E,2).
Cuando le llega el vector de distancias de B, que sería (A,1; B,0;
C,4; D,2; E,3), el nodo A realiza los cálculos descritos y se da
cuenta de que puede llegar a E, D y C a través de B,
siendo el vector de distancias resultante (A,0; B,1; C,5; D,3; E,2). Así,
A pone en su tabla de Enrutamiento que C y D son
accesibles a través de B y manda el vector calculado sus nodos
vecinos, que a su vez calculan un nuevo vector de distancias. Esto se repite
hasta que todos los nodos saben dónde deben mandar un paquete para que llegue
a su destino a través de un camino de distancia mínima.
Este algoritmo presenta inconvenientes:
Los vectores de distancia son proporcionales al tamaño
de la red. Entonces no se tiene un buen comportamiento para redes grandes.
Los nodos no conocen la topología de la red, por lo que
pueden aparecer bucles transitorios hasta que la situación converja hacia un
conocimiento suficiente por parte de los nodos.
En este apartado se pretende dar diferentes opciones para
encaminar en una red mediante mecanismos aislados (los nodos no se
intercambian información ). Podemos distinguir dos clases de algoritmos
para un Enrutamiento de este tipo, que son algoritmos de aprendizaje y
algoritmos de inundación. Ejemplos concretos de este tipo de algoritmos hay
muchos, como el llamado algoritmo de Hot Potato.
En este algoritmo los nodos no intercambian información
de control. Cuando un paquete llega a un nodo de la red, lo que éste hace es
conmutarlo por todos los puertos de salida sin mirar ninguna tabla de
Enrutamiento. De esta forma se asegura que el paquete llegue al destino.
Problema: si la topología presenta bucles el paquete estará dando
vueltas de manera indefinida. Como consecuencia, se consume capacidad de
red ilimitada.
Solución: La solución pasa por limitar la vida del paquete en la
red, es decir, establecer una caducidad. Cuando se genera un
paquete se incluye en un campo el número máximo de saltos que éste puede
dar. Cada vez que ese paquete es conmutado el campo "número de
saltos" se decrementa en una unidad hasta que sea cero, en cuyo caso los
nodos ya no lo conmutan, sino que lo descartan. De esta manera
aseguramos una existencia limitada de paquete dentro de la red.
Es necesario establecer el valor inicial del contador lo suficientemente alto
como para que el paquete sea capaz de llegar al destino, pero tampoco
excesivamente alto para que no consuma muchos recursos. La decisión que se
adopta es inicializar el contador al número de saltos necesario para llegar
desde cualquier nodo de la red a otro (El valor es el mismo para todos los
paquetes generados, sea cual sea el nodo de la red que lo haga).
Otra solución es determinar si un nodo ha conmutado ya ese paquete. En
este caso, un nodo origen marca el paquete generado con un número de
secuencia de tal forma que la unicidad de ese paquete viene dada por el par
(origen, secuencia). Cuando un nodo conmuta un paquete mira en tabla; si
ya lo ha conmutado lo descarta, y si no lo ha conmutado lo introduce en la
tabla. Como ventaja respecto de la solución anterior se consume menos
capacidad de red, pero posee el inconveniente de que la tecnología del nodo
es muy compleja y el tamaño de las tablas puede ser muy grande. Además esta
solución puede dar mayores retardos que la anterior.
Concluyendo, la inundación es buena si tenemos la red sobredimensionada,
ya que no tendríamos tantas limitaciones en cuanto a ocupación de recursos.
En este caso, la inundación es el algoritmo más robusto y óptimo, ya que
encuentra todas las rutas, entre ellas la mejor.
Por último, queda solucionar el problema de multiplicidad de paquetes en
el nodo destino, pero eso queda para los niveles superiores de la jerarquía
OSI.
Son los usados en redes locales. Cuando llega un paquete
a un nodo con destino a otro nodo cualquiera, se hace lo siguiente:
Si no se conoce el nodo destino se inunda y se
incrementa el campo número de saltos dados por el paquete.(al contrario que
en inundación, donde se decrementaba).
Si el destino se conoce, se envia el paquete por la ruta
que se indica en las tablas.
El aprendizaje se basa en que partimos de no tener
ninguna información de control, y segun se van produciendo inundaciones se
aprende. Cuando llega un paquete se mira el origen , el puerto a través del
que ha llegado y el número de saltos dados por ese paquete hasta que ha
llegado. Si no teníamos ninguna entrada en la tabla de Enrutamiento con el
nodo del que ha llegado o si la teniamos pero con numero de saltos mayor
(mayor distancia) se actualizan las tablas. Para evitar que un paquete esté
dando vueltas eternamente en la red y por lo tanto consuma recursos
innecesariamente, se limita el número de saltos que éste puede dar.
En principio, cuando todos los nodos hayan aprendido las
mejores rutas se acabará la inundación. Sin embargo, a las entradas se les
asocia un tiempo de vida, que se renueva cada vez que se hace uso de la
entrada. Si transcurrido el tiempo de vida la entrada no ha sido empleada se
borra, volviendo a inundar. Así se logra que la red se adapte a los cambios.
Veamos esto con un ejemplo. Sea la red de la figura
siguiente:
Figura 7: Red ejemplo para algoritmo
aislado.
Al nodo C le llega por la puerta 1 un
paquete con origen en A y destino D. Puede ser que C no
sepa dónde está situado el nodo D pero aprende que A es
accesible por la puerta 1, y escribe esta información en su tabla de
Enrutamiento. Así, si le llega luego un paquete con destino al nodo A,
lo mandará por la puerta 1.
Problema: la inundación consume recursos
indefinidamente y pueden aparecer bucles. Esto puede evitarse añadiendo un
poco de control: en los paquetes se introduce información sobre el número
de saltos que ha realizado éste (se tiene un contador que se incrementa
en cada salto); cuando este número llega a un valor máximo, se descarta el
paquete. De esta forma podemos cuantificar distancias además de conocer la
conectividad entre dos nodos.
Este tipo de algoritmos es óptimo
(consiguen la mejor ruta, ya que en realidad consiguen todas), siempre que se
controle que no se saturen los enlaces de los nodos.
Estos algoritmos se llaman de Backward
Learning, o aprendizaje hacia atrás, debido a que la forma que tienen de
aprender los nodos es a través de la información que les llega del nodo
origen.
Queremos conseguir que un paquete que sale de un nodo
llegue a todos los demás. Este procedimiento encuentra una aplicación
directa para un Enrutamiento basado en estado de enlaces, puesto que la
información sobre los estados de los enlaces se difunde a toda la red
En general, lo que se hará será mandar paquetes a todos los nodos y
marcarlos para deshabilitarlos si vuelven a pasar (para evitar bucles).
Veremos cuatro métodos de conseguir la difusión:
1er método: consiste en enviar
paquetes a todos los demás nodos (tráfico unicast). Este método es
poco eficiente porque por un mismo nodo pasan varios paquetes iguales, además
de que no elimina el problema de la formación de bucles. Por ejemplo, en la
red de la Figura 7, para encaminar de A a D hay que difundir de A
a todos los demás nodos, incluyendo D; entonces, entramos en un bucle.
2o método: hace una inundación:
se manda un paquete de un nodo origen a todos los demás. Este tampoco es un
buen método, porque consume muchos recursos y también puede hacer que
aparezcan bucles.
3er método: se usa el árbol
de expansión. Deshabilitamos algunos enlaces de forma que todos los nodos
estén conectados pero sin bucles. Así, al inundar se consigue tener muy
pocos envíos. Es una solución bastante usada, aunque la forma de acordar
entre todos los nodos de la red qué enlaces se deshabilitan es complicada.
4o método: se hace un reenvío
por ruta hacia atrás (Reverse Path Forwarding). No requiere
calcular el árbol de expansión. Los nodos tienen calculadas las rutas, y
cuando tienen que ayudar a difundir no siempre se hace inundación: se mira la
dirección origen del paquete; si llega por el enlace que utiliza el nodo para
ir al origen inunda; si llega por otra ruta el nodo considera que el paquete
esta dando vueltas y lo descarta. Por ejemplo, en la red de la Figura 7 el
nodo C tiene en su tabla de Enrutamiento que los paquetes con
origen en A le llegan por la puerta 1; entonces, si le llega un
paquete con origen en A por esa puerta inunda y en caso contrario lo
descarta.
En este apartado haremos un resumen de los métodos de
Enrutamiento vistos hasta ahora en base a proponer soluciones para el
Enrutamiento en una red como la de la figura siguiente:
Figura 8 Caso práctico de red
La figura representa una interconexión de redes locales
de ordenadores. Queremos resolver el problema del envío de un paquete de un
ordenador a otro cualquiera. Las redes locales están interconectadas mediante
bridges (marcados con una B).
Se denomina bridge a un elemento de rutado (nodo)
que almacena y envía tramas entre LANs (Local Area Network).
Pueden verse como "repetidores" de nivel 2. Es, por tanto, un
dispositivo de interconexión de redes que opera a nivel de enlace. Suele ser
una máquina dedicada, cuya arquitectura de comunicaciones está dividida en
dos partes, cada una con la estructura de la red local a la que está
conectado.
Las razones por la que se usan brigdes para interconectar redes y no se
hace de manera directa (p.e. uniendo coaxiales) son las siguientes:
Interconexión de subredes diferentes: las tramas
pueden ser distintas, en cuyo caso los sistemas finales no se entenderían.
Interconexion de LANs distantes
Separacion de tráfico: si un segmento está
saturado no carga con tráfico dirigido a ese mismo segmento a los demás
tramos de la red, disminuyendo así la probabilidad de colisiones en el resto
de los segmentos. Lo que se pretende es que la mayor parte del tráfico de un
segmento se quede en él.
Aumento de fiabilidad: debido a que los bridges
sirven para adoptar rutas alternativas.
Seguridad: se puede configurar el bridge
para que no se deje entrar a un segmento a todo aquel que quiera acceder.
En general, con un bridge se pueden resolver algunos
aspectos problemáticos de la interconexión de redes. Pero hay otros que no
son capaces de solucionarlos. Veamos a continuación la problematica a
resolver entre LANs:
Diferentes formatos de trama: el bridge debe
encontrar equivalencias entre ambas. (Por ejemplo, Ethernet-Token Ring).
Diferentes velocidades de transmisión: en este
caso el Bridge debe almacenar las tramas que recibe y retransmitirlas al otro
segmento a la velocidad de éste.
Diferentes tamaños de las tramas: el bridge no es
capaz de solucionar esto. Un ejemplo de esta situacion es la interconexión de
redes Ethernet con Token Ring: la primera requiere tramas menores de 1.5
Kbytes, mientras que la segunda puede enviar tramas de mayor tamaño.
El bridge es una solución heterodoxa al problema de
interconexión de redes. Hay situaciones que no sabe resolver (como el caso
anterior). En cambio, lo que sí resuelve es el Enrutamiento. Vamos a ver los
dos modos de funcionamiento de los bridges, el modo transparente y el modo
source routing.
Se dice que un bridge es transparente cuando no es
tenido en cuenta por los sistemas finales, esto es, ellos envían las tramas a
los otros sistemas como si pertenecieran a la misma red local. No requieren
ningún tipo de configuración (PLUG AND PLAY). Podemos distinguir tres tipos
de bridges transparentes: básico, Learning Bridge y Spanning tree Bridge.
Este tipo se basa en un algoritmo de inundación. Es muy
sencillo, pero genera muchos problemas. El bridge escucha en modo promiscuo
todas las tramas de cada LAN a la que está conectado y las difunde a las
restantes por los puertos de salida.
Supongamos que el nodo x de la Figura 8 quiere mandar un paquete al
nodo r. Todos los bridges inundarán a las otras redes
conectadas a ellos. Sin embargo, x y r pertenecen a la misma red
local, por lo que no sería necesario. Descubrimos así varios inconvenientes:
Se generan copias de paquetes de una línea de entrada a
todas las de salida: el algoritmo es muy ineficiente ya que se están mandando
tramas a sitios donde no está el destino.
Hay una explosión de tráfico, debido a lo dicho
anteriormente, por lo que se consume más capacidad de red.
Se generan bucles de tráfico.
Este tipo no aporta nada respecto a la solución de poner
un repetidor (a menos que se trate de redes distintas)
En la Figura 8 cada uno de los nodos marcados con una B
es un bridge. En concreto, estaremos interesados en los llamados Learning
Bridges, o bridges de aprendizaje, caracterizados por:
escuchar en modo "promiscuo" en todas sus
interfaces (o puertos).
por cada trama recibida, almacenan en una tabla (cache)
la dirección origen y el puerto por el que llegó.
Los nodos oyen por dónde llegan los mensajes de un
determinado equipo y mandan los paquetes a ese equipo por ahí. Cuando les
llega una trama, consultan si su dirección destino está en la tabla:
SÍ: se envía a través
del interfaz que indica la tabla (si es el mismo por el que llegó se
descarta).
NO: se envía por todos
los interfaces, salvo por el que llegó (inundación).
Aparece un problema debido a que los equipos pueden
moverse de una red local a otra, en cuyo caso, si habíamos aprendido la
dirección de un equipo todos los paquetes destinados a él irán sólo por el
camino antiguo, con lo que se perderán. Esto se soluciona añadiendo
una entrada más a la tabla llamada aging time, o tiempo de actualización,
transcurrido el cual, si no se han recibido paquetes de una dirección
determinada, se borra la entrada correspondiente, con lo que el siguiente
paquete que llegue con destino al nodo cuya entrada se ha borrado será
reenviado mediante inundación. Esta solución obedece a dos fines:
Evitar un crecimiento excesivo de las tablas (el número
de terminales puede ser muy alto).
Detectar cambios en la configuración de los segmentos.
Como se quiere que los Bridges trabajen en modo transparente, es necesario que
se den cuenta de estos cambios.
Esta solución es mejor que la del Bridge básico , pero
no soluciona el problema de los bucles. Puede comprobarse que en la red de la
Figura 7 si, por ejemplo, el equipo que no ha transmitido ningún paquete y el
equipo x quiere comunicarse con él, el paquete que le envía éste
estará dando vueltas por la red si no se pone alguna solución a ello, como
por ejemplo llevar la cuenta de las veces que pasa el paquete por un nodo, y
descartarlo cuando llegue a un número máximo prefijado. Pero esto no es
posible debido a que al trabajar en modo transparente no se pueden modificar
las tramas para incluir en ellas un campo que contenga el número máximo de
saltos.
En la terminología inglesa, esto se llama Spanning
Tree Bridges. Es una solución que solventa el problema de bucles. Todos
los bridges se ponen de acuerdo en usar una topología sin bucles (Spanning
Tree, o árbol de expansión sobre la cual funcionan como bridges
transparentes). En concreto, estaremos interesados en construir el árbol de
coste mínimo. Las características de este tipo son:
Topología arbitraria.
Plug and play.
Bridges transparentes.
Seguimos el siguiente algoritmo:
Se elige la raíz.
Se calcula la distancia mínima desde cada bridge a la raíz.
En cada LAN se selecciona un bridge
determinado (el más próximo a la raíz), que se utilizará para enviar
tramas desde la LAN a la raíz.
En cada bridge se elige un puerto para enviar
tramas a la raíz. Una vez elegido el Spanning Tree, cada bridge
utiliza sus puertos incluídos en él para enviar tramas. El resto quedan
inactivos.
En definitiva, se trata de crear una topología libre de
lazos. Tomando como origen la red de la Figura 8, podemos construir el
siguiente Spanning Tree:
Figura 9 Ejemplo de Spanning Tree sobre la red de la Figura
8
donde se ha supuesto que el nodo raíz es el nodo 1.
El spanning tree se ha marcado en color más claro, y se ha supuesto
que es mejor llegar a la red de la que cuelgan p y z a través
del nodo 2 que a través del nodo 4. Vemos que de esta forma el
nodo 4 queda totalmente inoperativo (éste es el inconveniente de este
algoritmo, ya que hay redes para las que se desaprovechan bastantes recurso).
Para construir el árbol de expansión o mantenerse en contacto para poder
solucionar posibles cambios de configuración (caída de enlaces...) los
Bridges intercambian tramas CBPDU (Configuration Bridge Protocol Data
Unit). En esta trama hay varios campos:
Destino, donde se pone una dirección multicast
(que indica que va dirigida a todos los Bridges de ese segmento. Estas tramas
multicast no se propagan, sino que son consumidas por los Bridges.
Root Id.: indica qué Bridge es la raiz del árbol
de expansión.
Transmitting Bridge Id.: identifica al Bridge que
transmite la trama. Cada Bridge posee un identificador único.
Coste: es la distancia del Bridge que envía la
trama al Bridge raiz.
Los campos principales que maneja el algoritmo visto en
este apartado son los tres últimos. Al principio cada bridge se toma a sí
mismo como raiz.. A medida que van intercambiando CBPDU van
seleccionando el Bridge raiz y configurando el árbol de expansión en base a
la mejor trama. Para elegir la mejor trama toma el siguiente algoritmo:
Es mejor CBPDU si el RootId es menor.
Si el coste es menor.
Si el TransmittingId. es menor
Si el puerto es menor.
En este modo de funcionemiento son los sistemas finales
quienes fijan la ruta que deben seguir las tramas. Para conocer las rutas se
usan unas tramas de control que recorren todas las posibles rutas al destino y
almacenan en un campo especial el camino seguido. El destino constesta cada
trama que le llega por el camino indicado en el campo. Cuando las
contestaciones llegan al origen, éste decide la mejor ruta
(generalmente la que menos retardo tenga).
Veamos los pasos que se siguen en la búsqueda de una ruta desde un
sistema final X a otro Y:
Se envía una trama del tipo "All paths
explorer" (o Discovery) con dirección destino Y. A medida que atraviesa
la red, la trama se irá replicando y cada copia guardará el camino seguido.
Además el campo "Máx. trama" se va actualizando.
Y devuelve a X todas las tramas recibidas, convirtiéndolas
previamente a tramas con una ruta específica e invirtiendo el bit de sentido.
X elige una ruta en función de las tramas recibidas de
Y.
CUALIDAD
|
TRANSPARENT
BRIDGES
|
SOURCE
ROUTING BRIDGES
|
Orientación
|
Servicio no orientado a conexión
|
Servicio orientado a conexión
|
Transparencia
|
Completa
|
Ninguna
|
Configuración
|
Automática
|
Manual
|
Enrutamiento
|
Subóptimo
|
Óptimo
|
Ubicación
|
Backward
Learning
|
Tramas "Discovery"
|
Fallos
|
Manejado porlos Bridges
|
Manejados por los sistemas finales
|
Complejidad
|
En los Bridges
|
En los sistemas finales
|
Existe un problema de incompatibilidad a la hora de que coexistan Bridges
transparentes y Source Routing en la misma subred. La solución que adoptó
IEEE fue que todos los Bridges soportaran el modo transparente. Así tenemos
dos configuraciones posibles:
Bridges
Transparentes
SRTB
(Source Routing Transparent Bridges): Bridges Transparentes con capacidad de
Source Routing.
El Bridge transparente ha calado más en el mercado,
aunque en entornos IBM se usa Source Routing .
Para más información existen unas transparencias dadas en clase.
Una gran red no se puede resolver como una sola red, ya
que esto conduciría a tablas de Enrutamiento gigantescas o intercambio de
información entre miles y miles de nodos. Por ello a la hora de tratar un
gran red se procede a dividirla en partes mas pequeñas o dominios ,dentro del
cual se usa un único protocolo de Enrutamiento (elegido por el operador de la
red),y luego se interconectan todas las partes o dominios. Se define como
dominio de Enrutamiento o sistema autónomo a la sección p parte de la red
que posee un único administrador de recursos. Podemos distinguir dos tipos de
Enrutamientos:
Intradominio: Para el Enrutamiento dentro de cada
dominio, buscando en todo momento el encontrar los caminos óptimos.
Interdominio: Es el que se encarga de alcanzar la
"conectividad total", no busca caminos óptimos si no garantizar la
alcanzabilidad.
Como ejemplo citaremos que en tecnología IP (Internet),
el intradominio es IGP (Internal Gateway Protocol), y el Interdominio es EGP
(External Gateway Protocol).dentro de los que existen recomendaciones
distintas.
Dentro de una subred nos encontramos que los terminales o
sistemas finales de una subred tienen conectividad física entre si, y además
existirá un router que garantizara la conexión con el exterior. Cada
terminal posee unas direcciones físicas (únicas y planas de 48 bits), y además
unas direcciones lógicas o de intered (dirección IP). Las direcciones IP son
32 bits en los que existen dos partes: Prefijo (de longitud variable y igual
para todos los elementos de la subred) y Numero de sistema. El problema viene
cuando nosotros queremos comunicar dos sistemas finales de los que conocemos
sus direcciones IP pero no existe ningún sistema intermedio que maneje estas
direcciones.
Para solucionar este problemas existen varias soluciones:
Asociación directa:
Construcción de forma estática de unas tabla estáticas
que a cada dirección lógica le asignen una dirección física.
Que las direcciones lógicas contengan a las direcciones
físicas.
Asociación dinámica: Se emplean protocolos de
resolución de direcciones, que de forma automática establecen las tablas .
A solución adoptada en internet ( TCP/IP), se basa en el
empleo de los protocolos ARP (Address Resolution Protocol) e ICMP. Este
protocolo consiste en lo siguiente: Cuando X desea enviar algo a Y ( X conoce
la dirección lógica de Y pero necesita la dirección física) , X procede a
preguntar a Y su dirección física. Par lograrlo se envía un paquete ARP
encapsulado en una trama 802.3 , dicho paquete ARP dispone de tres campos :
Origen, Destino y Mensaje ARP. El sistema final X rellena los el campo origen
con su dirección física y lógica y pone en el destino unicamente la dirección
lógica. Este mensaje será exclusivamente contestado por Y que rellenará el
campo dirección física del destino y enviara el paquete de vuelta a X
encapsulado en una trama 802.3 unicast. De cara a evitar tener que mandar
excesivo numero de tramas ARP cuando un sistema envía en difusión su dirección
física al preguntar por la de otro, todo los demás sistemas se la aprenden.
Además para evitar tablas grandes se emplean técnicas d caché.
Para posibilitar la existencia de estaciones sin disco se hace necesario
que estas puedan llegar a conocer su dirección lógica de alguna manera, para
ello se ha implementado el protocolo RARP (Reverse Address Resolution
Protocol). Cuando una maquina de estas características arranca lo que hace es
difundir una petición para conocer su dirección lógica , incluyendo en la
misma su dirección física. Esta petición llegara a una maquina encargada de
proporcionar las direcciones lógicas (RARP Server) que contesta.
RIP
(Routing Information Protocol):
Es un algoritmo de vector de distancias, que emplea como
métrica el numero de saltos ( se encuentra limitado entre 1 y 16= infinito).
Existen dos tipos de usuarios los activos y los pasivos ( no transmiten sol o
reciben)Los nodos activos cada 30sg. Difunden un vector de distancias que solo
procesan los routers o sistemas intermedios. Los pasivos escuchan los mensajes
enviados por los activos y actualizan (recalculan) sus tablas. Para garantizar
que los nodos aprendan de noticias perores cada 2 min (120s) se produce el
borrado de las tablas. En este tipo de protocolo existen dos tipos de
paquetes:
Request: enviados por los routers o hosts que
acaban de conectarse o su información a caducado.
Response: enviados periodicamente en respuesta a
un paquete request o cuando cambia algún coste.
Este protocolo tiene la ventaja de que es
muy sencillo y por tanto muy empleado. Sin embargo no existe interoperabilidad
entre las distintas implementaciones existentes, tiene una convergencia lenta
(inconsistencias transitorias) ,puede crear bucles y además la métrica no
tiene en cuenta la velocidad de los enlaces, las cargas, etc. El tamaño de la
red esta limitado por el numero de saltos máximo (limitado a 15) y además
este protocolo no soporta subnetting (mascaras).
HELLO:
Usa el vector de distancias como el RIP sin embargo en
este protocolo la métrica empleada es el retardo. Para calcular el retardo,
cuando un nodo transmite a un nodo vecino pone la fecha y la hora local, y
cuando el paquete llega al nodo vecino este mira su reloj y calcula la
diferencia, con este dato actualiza las rutas . Para conseguir esto es
necesario garantizar la sincronización de los relojes, aspecto bastante
complejo de conseguir.
Este proceso tiene la ventaja de que tiene en
cuenta la carga y la velocidad de los enlaces, pero es muy probable que se
produzcan oscilaciones para ello solo se cambia la ruta si la mejora es
sensible, es decir se coloca un umbral (p.e. 150% mas rápido). De esta forma
se evita que por diferencias de ms se cambie la ruta optima.
OSPF
(Open Shortest Path First):
Es el mejor aunque todavia esta en fase de desarrollo.
Las carcteristicas mas diferenciadoras son que usa el estado de enlaces,
soporta subnetting y es capaz de emplear varias métricas. Este protocolo es
capaz por si solo es capaz de suministrar mecanismos para jerarquizar la red y
descubrir dinamicamente los sistemas intermedios.
Hay routers de area y de sistema autónomo. Los
primeros solo hablan con los de esa area, es decir sus tablas de Enrutamiento
tienen como entradas los nodos de su area y una adicional para salir al
exterior. Los segundos (routers de sistema autónomo) calculan rutas entre
areas, por ello tienen como entradas tantas como areas hay en su nivel de
jerarquia mas una para subir un nivel en la jerarquia.
En este apartado trataremos el tema de la congestión de
las redes. Comenzaremos haciendo
una distinción entre control de flujo y control de congestión:
Control de flujo.
Es una técnica que permite sincronizar el envío de
información entre dos entidades que producen/procesan la misma a distintas
velocidades. Por ejemplo, supongamos el caso representado en la siguiente
figura:
Figura 10 Conexión entre nodo de alta capacidad y PC
En este caso, dada la gran velocidad a la que produce y
envía información, el nodo desborda al PC, por lo que éste debe enviar
información de control (control de flujo) para que el nodo reduzca su tasa de
envío de datos. De esta forma , parando a la fuente cada cierto tiempo, el PC
puede procesar el tráfico que le envía el nodo.
Control de congestión.
Es un concepto más amplio que el control de flujo.
Comprende todo un conjunto de técnicas para detectar y corregir los problemas
que surgen cuando no todo el tráfico ofrecido a una red puede ser cursado,
con los requerimientos de retardo, u otros, necesarios desde el punto de vista
de la calidad del servicio. Por tanto, es un concepto global, que involucra a
toda la red, y no sólo a un remitente y un destinatario de información, como
es el caso del control de flujo.
Figura 11 Congestión en un nodo
El control de flujo es una más de las técnicas para
combatir la congestión. Se consigue con ella parar a aquellas fuentes que
vierten a la red un tráfico excesivo. Sin embargo, como veremos, hay otros
mecanismos. Una vez hecha esta distinción, en los sucesivos apartados veremos
características del retardo y del caudal, veremos distintas causas de aparición
de congestión, analizaremos las soluciones que se proponen para este problema
y acabaremos viendo distintos algoritmos de control de congestión.
El caudal depende del tipo de red y tiene un valor
nominal máximo, que no podremos superar en ningún caso. Pero además, la red
no ofrece el mismo caudal real si se le ofrece poco tráfico o si se le ofrece
mucho. Veamos la siguiente figura:
Figura 12 Caudal en función del tráfico ofrecido
La curva (1) representa el comportamiento ideal
de la red: hay linealidad hasta llegar a la capacidad nominal de la red,
momento en el que el tráfico cursado se satura. La curva (2)
representa el comportamiento real típìco de una red. Como puede observarse,
al llegar a la zona de saturación, cuanto más tráfico se ofrece menos tráfico
se cursa. Esto es debido, por ejemplo, a que los paquetes tardarán mucho
tiempo en llega r a su destino, y mientras tanto serán retransmitidos por la
fuente, pensando que se han perdido por el camino. Esto, a su vez, origina una
explosión de tráfico, ya que cada paquete es retransmitido varias veces,
hasta que consigue llegar a tiempo al destino.
Para evitar esa degradación, se introduce el control de congestión que trata
de aproximar el comportamiento de la red al dado por la curva (3),
evitando así entrar en una zona de degradación.
El retardo de tránsito en la red sigue la siguiente curva:
Figura 13 Retardo de tránsito en función del tráfico
ofrecido
Vemos que el retardo no aumenta linealmente, sino que el
aumento de éste es mayor que el aumento de tráfico ofrecido.
Hay varias causas de congestión. Enumeraremos aquí las
más importantes:
Memoria insuficiente de los conmutadores. Por
ejemplo, veamos la siguiente figura:
Figura 14 Saturación del buffer de un nodo
En ella se tiene un conmutador en el que tres líneas de
entrada mandan paquetes a una de salida. Así puede llenarse el buffer
(cola) de la línea de salida.
Además, si hay congestión en otros nodos, las colas no liberan la información
de los paquetes transmitidos (que se guarda por si hay que retransmitir), con
lo que la situación empeora aún más.
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. Se tiene el
mismo problema que en el caso anterior.
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 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 l as 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
|
Variable de diseño
|
Enlace
|
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 (por
ejemplo, cuando un paquete es sólo una porción de un mensaje , puede
retransmitirse el mensaje entero o sólo el paquete afectado).
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.
|
Red
|
Circuitos Virtuales
frente a datagramas: Muchos algoritmos de control de congestión
funcionan sólo en modo circuito virtual.
Política de colas y de
servicio: Los router 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, dan do 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.
|
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:
Monitorización de parámetros.
Reacción: envío de información a los puntos
necesarios.
Ajuste del sistema.
El mecanismo que permite la reacción del sistema frente
a estos problemas puede ser:
Realimentación explícita.
Los nodos próximos a saturarse envían información
hacia atrás comunicando esta situación.
Realimentación implícita.
La permiten los mecanismos de asentimiento de la red. Por
ejemplo, IP realiza realimentación implícita midiendo el tiempo que
tarda en llegar el paquete de asentimiento a una transmisión.
Veremos un algoritmo en bucle abierto llamado mecanismo
de Traffic Shaping y dos algoritmos en bucle cerrado llamados algoritmo de
paquetes regulador es y algoritmo de descarte de paquetes.
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; tecnología de red
orientada a conexión; en estas redes, la velocidad de línea es de 155 Mbps y
el usuario puede ver una velocidad de unos 10 Mbps.
Si se tiene una ráfaga lista para transmitir, el sistema obliga a no
transmitir todo seguido (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 lo
realiza mediante una función policía, que es un nodo que tira los
paquetes que superan la tasa contratada a la entrada de la red (no se tiran
una vez que ya ha entrado). Esto puede realizarse mediante un algoritmo de Leaky
Bucket, cuyo nombre se debe a que es como si tuviéramos un bidón que
vamos llenando con un caudal determinado y por el que sale el líquido (Leaky:
hace aguas) con otro caudal 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. Veamos un ejemplo con un sistema codificador de imágenes:
Figura 15 Ejemplo de mecanismo de Leaky Bucket
Este sistema codifica la señal de video y la envía a ráfagas.
Para ser transmitida necesita ser conformada: se almacenan muestras en
un buffer y después se transmiten a velocidad constante. Si se
sobrepasa el caudal predeterminado, pueden tirarse paquetes en el regulador
(por parte del usuario) o en la función policía (por parte del
proveedor). Este sistema permite aplanar ráfagas, como puede verse en la
siguiente figura, donde la situación de la izquierda representa un sistema
con tráfico no conformado y la de la derecha la equivalente si se conforma y
se contrata transmisión a 2Mbps (la fuente transmite ráfagas de 1 Mb a 25
Mbps):
Figura 16 Ejemplo de aplanamiento de ráfagas con tráfico
conformado
En terminología inglesa, al paquete regulador se le
llama choke packet. Se hace en bucle cerrado. Asocia un peso u a
cada línea que cambia con el tiempo según la ecuación:< P
|
(8)
|
donde:
un: función de peso, que depende del
instante actual a través de f y del anterior a través de un-1.
f: tiene un valor "0" si no
transmitimos en el instante actual o "1" si transmitimos.
a: constante comprendida entre 0 y 1 y que da más
importancia al instante actual o al instante anterior según su valor.
Si n supera un cierto umbral, se pone
la línea en estado de alerta y se considera que puede haber congestión.
Si llegan paquetes a esa línea, se envía un aviso hacia atrás con un paquete
regulador que indica esta situación. Además, en los paquetes que se envían
hacia delante se pone un flag a "1" para indicar al resto de
los nodos que no manden paquetes reguladores hacia atrás, ya que el nodo
origen está avisado. Al llegar el paquete regulador al origen, se reduce el
flujo (por ejemplo, a la mitad).
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.
Variaciones:
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.
Con el mecanismo descrito se tarda mucho en reaccionar.
Entonces, puede hacerse regulación salto a salto, en la que se dice al
nodo anterior que mande la información por otro sitio si es posible.
Es un algoritmo de control de congestión en bucle
cerrado. Se basa en que los nodos descartan (tiran) 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 buffer de
salida de la línea correspondiente está lleno, se descarta el paquete. Hay
varias formas de hacer la asignación de buffers:
En base al uso. No es muy eficiente, porque cuando
una línea se empieza a cargar acapara todos los recursos.
Asignación fija. Tampoco es muy buena, ya que
desaprovecha recursos.
Asignación subóptima (de Irland).
Llamando k al número de posiciones del buffer y s al número
de líneas de salida, se tiene que el número de posiciones de memoria
asociadas a cada línea es:
|
(9)
|
http://selva.dit.upm.es/~cd/apuntes
Tanenbaum,
Andrew S., Computer
Networks, Prentice-Hall, 1996.
Bertsekas,
D. y Gallager, R.,
Data Networks, 2a edición, Prentice-Hall, 1992.
Comer,
Douglas E., Internetworking
with TCP/IP, 3a edición, Volumen 1: Principles,
Potocols and Architectures, Prentice-Hall, 1995.