Decisiones de un Router

Como ya he mencionado en otras oportunidades un Router es un dispositivo intermediario de capa 3 que tiene 2 funciones principales.

  1. Dividir dominios de Broadcast, en castellano eso significa que divide las redes, por lo tanto DEBE tener una dirección de red distinta en cada interface y evita que los mensajes de Broadcast pasen de una red a otra.
  2. Toma la decisión sobre a donde enviar cada paquete que le llega. Es decir, a donde debe enviarlo para garantizar que el mensaje llegue a su destino.

Hoy en día los Routers cumplen con muchas otras funciones que son valor agregado, pero es sobre esto último que les hablaré ahora. ¿Cómo se toma esa decisión? Esto no es exactamente un dardo que tira a ver a quien le pasamos la pelota.

¿Qué se necesita?

En la imagen, cuando el Router A recibe un paquete, sabemos que este tiene una cabecera con cierta información de control, muchos campos que no vienen al caso en este momento, pero lo que sí es importante es que esta cabecera tiene la dirección lógica del destinatario, en otras palabras, la dirección IP de destino, por ejemplo 172.16.55.30 y es en función de ella que se tomarán las decisiones.

Adicionalmente, el Router A (y cualquier Router) posee una tabla que le permite conocer hacia donde enviar cada paquete, y que tiene de manera generalizada una estructura como esta:

# Red de Destino Máscara Siguiente Salto
1 192.168.10.0 255.255.255.0 1
2 10.0.0.0 255.0.0.0 2
3 172.17.0.0 255.255.0.0 10.0.0.2
4 172.16.0.0 255.255.0.0 10.0.0.2

La dirección IP de destino y esta tabla es todo lo que necesita el Router para tomar la decisión.

¿A qué IP le paso el paquete?

El Router toma la dirección IP de destino y trata de compararla con los valores de Red destino en la tabla de Enrutamiento. Sin embargo, esto no lo hace de buenas a primeras, como pueden ver en ninguna parte de la tabla dice algo exactamente igual a 172.16.55.30, porque la tabla solo tiene direcciones de red generalizadas, en ninguna parte se coloca host por host o las tablas serían infinitas.

Lo que en realidad hace es comparar línea por línea de manera estructurada y aplicando una operación de AND entre la IP de destino y la máscara hasta encontrar la entrada en la tabla que coincide. Es importante destacar que todas las operaciones se hacen en binario.

Por ejemplo, comparamos con la primera línea:

IP Destino 172.16.55.30 10101100.00010000.00110111.00011110
Máscara 1 255.255.255.0 11111111.11111111.11111111.00000000
AND 1 172.16.55.0 10101100.00010000.00110111.00000000

Luego comparamos este resultado con la dirección de Red Destino 1 (172.16.55.0 ≠ 192.168.10.0), evidente no son iguales por lo que el Router continua buscando en la siguiente entrada de la tabla.

En este ejemplo ya conozco que las líneas 2 y 3 tampoco corresponden con el resultado que se busca, por lo que saltaré a la 4ta y última línea:

IP Destino 172.16.55.30 10101100.00010000.00110111.00011110
Máscara 4 255.255.0.0 11111111.11111111.00000000.00000000
AND 4 172.16.0.0 10101100.00010000.00000000.00000000

Como pueden ver el Router ha encontrado una coincidencia en la 4ta entrada de la tabla (172.16.0.0 = 172.16.0.0) y es aquí donde se encuentra la decisión a tomar con el paquete. Si se fijan, la derecha de la tabla se indica quién es el siguiente salto para llegar a la red deseada (10.0.0.2), lo que quiere decir que es a esa dirección IP que debemos enviar el paquete.

¿Qué Interfaz utilizar?

Una vez que se conoce la IP a la que se debe mandar el paquete, el Router debe encontrar en que Interface de él mismo se encuentra esa dirección IP por lo que realiza otra búsqueda en la tabla de enrutamiento, esta vez haciendo AND entre la IP del siguiente salto y las máscaras. La primera entrada de este ejemplo no dará el resultado, pero en la segunda encontraremos lo siguiente:

IP Destino 10.0.0.2 00001010.00000000.00000000.00000010
Máscara 2 255.0.0.0 11111111.00000000.00000000.00000000
AND 2 10.0.0.0 00001010.00000000.00000000.00000000

Lo que significa que hemos encontrado una coincidencia con la 2da entrada indicando que la Interface a utilizar debe ser la número 2. Seguidamente simplemente pasamos la pelota al siguiente dispositivo que se encargará de realizar un proceso similar hasta que finalmente el paquete llegue a su destino.

Como pueden notar solo se envía el paquete cuando se conoce qué interfaz utilizar, de lo contrario hay que hacer búsquedas recurrentes en la tabla, buscando primero la IP de siguiente salto y luego la interfaz local que se debe usar. Por lo que es más eficiente colocar las interfaces en la tabla de enrutamiento siempre que se pueda, en lugar de las direcciones IP.

Si algo puede salir mal, saldrá mal…

¿Qué pasa si llegamos al final de la tabla sin encontrar ninguna coincidencia? En este caso el Router descarta el paquete porque simplemente no sabe qué hacer con él y no va a perder más tiempo en eso, estos señores son hasta más inteligentes que uno para distribuir su tiempo.

Pero si realmente sabemos lo que hacemos, podemos agregar una regla más a la tabla que se le llama “Ruta por Defecto”, y permite indicar que todo lo que se desconozca debe ser enviado a algún lado, por ejemplo:

# Red de Destino Máscara Siguiente Salto
5 0.0.0.0 0.0.0.0 2

Aquí estamos indicando al final de la tabla, que todo lo que no coincida con ninguna de las entradas, debe ser enviado a través de la interfaz 2. Sin embargo, esto es muy peligroso porque puede ocasionar bucles y sólo debe ser usado si se está seguro que a través de esa interfaz se encuentra algún dispositivo que si sabe qué hacer con el paquete.

Espero esta información les sea útil para entender cómo funciona un Router e incluso para encontrar fallas de enrutamiento.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s