Hace poco un compañero de la universidad me pidió ayuda con una consigna sobre subneteo. Cuando yo tomé la asignatura de redes de computadoras, también batallé un poco con ese tema, así que siempre quise darme el tiempo de explicarlo de la forma en la que yo lo comprendí. En ese entonces, se nos enseñaba el subnetting de una forma que, a mi modo de ver las cosas, es anticuada y se presta para que el estudiante malinterprete todo el asunto. Hay quienes preferimos entender lo que sucede “por debajo”, en lugar de seguir ciegamente un método y quedarnos con la duda.

¿Qué es una IP?

Antes que nada, es importante entender cómo está conformada nuestra IP. Una IP en IPv4 tiene una longitud de 32 bits, que a su vez están divididos en 4 octetos. Se llaman octetos porque cada uno tiene 8 bits.

<octeto1>.<octeto2>.<octeto3>.<octeto4>

Un octeto puede tener 2^8 = 256 valores; es decir, de 0 a 255.

  • Ejemplos de IP válidas son: 172.1.0.12, 10.0.1.20, 192.168.10.55.
  • La cadena 192.168.1.1000 NO es una IP válida porque el último octeto excede 255.
  • La cadena 10.256.8.1 NO es una IP válida porque el segundo octeto excede 255.

Una IP identifica a un dispositivo que pertenece a una red específica. Pero ¿cómo sabemos cuál es esa red? Bueno, otro aspecto importante a tener en mente es que una IP está dividida en 2 partes.

  • Parte red: identifica la red en la que se encuentra el host.
  • Parte host: identifica al host mismo dentro de su red.

¿Y cómo sabemos qué parte corresponde a la red y qué parte corresponde al host? Para eso existe la máscara de red.

Máscara de Red

Hay 2 maneras de representar una máscara de red.

  • Utilizando un prefijo en la IP de red: p. ej. 192.168.1.0/24
  • Utilizando la IP de red y de máscara en IP’s separadas: p. ej. 192.168.1.0 y 255.255.255.0

Ambas formas anteriores son equivalentes y se refieren a lo siguiente en un lenguaje mas “humano”.

Tengo una red con la IP 192.168.1.0 que usa los primeros 24 bits para identificar la red, y el resto de bits (8) son para identificar el host.

Si usamos un prefijo, el número del prefijo indica la cantidad de bits que usamos para la red. Para comprenderlo mejor, pasemos la IP a formato binario y pongamos debajo su máscara para poder ver esta relación.

                 ------------RED-----------|--HOST--
  192.168.1.0 -> 11000000.10101000.00000001.00000000
255.255.255.0 -> 11111111.11111111.11111111.00000000

Como podemos ver, tanto el prefijo como la máscara de red nos dicen exactamente cuáles bits corresponden a la red, y cuáles corresponden al host. Si queremos recorrer el rango de direcciones de esta red, basta con sumar bits a la parte de host hasta que hayamos utilizado todos los bits de host.

                 ------------RED-----------|--HOST--
  192.168.1.0 -> 11000000.10101000.00000001.00000000 (dirección de red)
  192.168.1.1 -> 11000000.10101000.00000001.00000001
  192.168.1.2 -> 11000000.10101000.00000001.00000010
  192.168.1.3 -> 11000000.10101000.00000001.00000011
  ...         -> ...
192.168.1.255 -> 11000000.10101000.00000001.11111111 (dirección de broadcast)
255.255.255.0 -> 11111111.11111111.11111111.00000000

La dirección que tiene todos los bits de host activados, es la última IP del rango, y se le conoce como broadcast.

Si decidimos aumentar 1 bit más a la dirección de broadcast, vermos como la parte de host vuelve a cero completamente, y ya estaremos hablando de otra red completamente distinta.

                 ------------RED-----------|--HOST--
  192.168.1.0 -> 11000000.10101000.00000001.00000000 (dirección de red)
  192.168.1.1 -> 11000000.10101000.00000001.00000001
  192.168.1.2 -> 11000000.10101000.00000001.00000010
  192.168.1.3 -> 11000000.10101000.00000001.00000011
  ...         -> ...
192.168.1.255 -> 11000000.10101000.00000001.11111111 (dirección de broadcast)

  192.168.2.0 -> 11000000.10101000.00000010.00000000 (siguiente red)

255.255.255.0 -> 11111111.11111111.11111111.00000000

En resumen, para definir una red, sólo necesitamos su IP y su máscara (o prefijo, en su defecto). Ya que la red define el inicio de la red, y la máscara define sus fronteras. Además, toda red tiene 2 direcciones “no utilizables”:

  • La dirección de la red misma, que es la primera del rango.
  • La dirección de broadcast, que es la última del rango (antes de pasar a la siguiente red).

Es por eso que siempre restamos 2 a la cantidad total de direcciones para así obtener la cantidad de direcciones IP “utilizables”, que son las que podemos asignar a hosts específicos.

Ahora que ya entendemos qué es una IP, cómo se conforma y cómo podemos definir una red de IP’s, podemos pasar a las diferentes formas de direccionamiento IP (ip addressing).

Direccionamiento basado en clases

El direccionamiento basado en clases (classful routing) consiste básicamente en que si tienes una red pequeña, uses, por ejemplo: una red clase C. Por otro lado, si tu red es muy grande, deberías usar una clase B o A. Así de simple.

  • Clase A: máscara de 8 bits, que significa 2^24 - 2 = 16777214 hosts
  • Clase B: máscara de 16 bits, que significa 2^16 - 2 = 65534 hosts
  • Clase C: máscara de 24 bits, que significa 2^8 - 2 = 254 hosts
  • Etcétera

classful-addressing Figura 1: Direccionamiento IP basado en clases. Fuente

El problema con esta forma de asignar direcciones es el desperdicio de direcciones simple y sencillamente porque cada clase tiene una máscara de red de longitud fija o FLSM (fixed length subnet mask). Esto significa que si tenemos una red y sabemos que nunca excederá los 15 hosts, la mínima clase que podremos usar será la tipo C, que usa una máscara de 24 bits con 8 bits restantes para hosts. Esto, a su vez, significa que nuestra red tendrá capacidad permanente para 254 direcciones de host; de las cuales sólo usaremos de 10 a 15.

Es por esta razón que el direccionamiento basado en clases fué reemplazado en 1993 por el CIDR.

Enrutamiento entre dominios sin clases (CIDR)

El CIDR (classless inter-domain routing) soporta VLSM (variable length subnet mask); es decir, que no necesitamos definir nuestras redes basandonos en las clases previas, y tampoco es obligatorio que la longitud de nuestras subredes sea fija. Podemos ajustar la máscara de red de modo que se desperdicie la menor cantidad de direcciones IP, y así aprovechamos mejor este recurso.

Para entender el CIDR, es necesario entender que este mecanismo agrupa nuestras IP en bloques. Un bloque CIDR es un conjunto de direcciones IP que comparten el mismo prefijo de red.

Normalmente, los proveedores de internet (ISP, internet service provider) reciben bloques CIDR relativamente largos; y luego, los ISP venden segmentos de este bloque a clientes privados o empresas. Estos bloques que manejan los ISP son asignados por entidades locales (LIR, local internet registry), regionales (RIR, regional internet registry) y mundiales (la IANA, internet assigned numbers authority) de manera jerárquica. Esta es una de las razones por las que es importante hacer un buen análisis de los requerimientos de nuestra red, ya que al final es un servicio por el cual estaremos pagando.

Ahora bien, supongamos que cierto ISP tiene asignado el bloque 10.15.0.0/16. Esto significa que tiene 16 bits de direcciones utilizables; obviamente, menos la dirección de su red y su broadcast. Estamos hablando de 2^16 - 2 = 65534 direcciones que el ISP puede usar como le plazca.

Supongamos que el ISP tiene solo 3 empresas grandes como clientes, y el resto son usuarios “de casa”.

  • Empresa A: 1k direcciones
  • Empresa B: 8k direcciones
  • Empresa C: 500 direcciones
  • Clientes individuales: 15k clientes actuales

Como podemos ver, el ISP tiene muchos clientes individuales y, de acuerdo con sus analistas, parece que este número va en aumento. Por lo tanto, los analistas recomiendan asignar asignar el doble de direcciones del consumo actual a este segmento. Además, recomiendan dejar un pequeño bloque para infraestructura y operaciones internas del ISP.

Tomando lo anterior en consideración, entonces dividiremos el bloque CIDR del ISP en 5 subredes:

  • 1k direcciones (operaciones)
  • 30k direcciones (clientes individuales)
  • 1k direcciones (empresa A)
  • 8k direcciones (empresa B)
  • 500 direcciones (empresa C)

Tal vez nuestra primera intuición sería comenzar a definir a primera subred con la IP 10.15.0.0/X. Sin embargo, primero debemos definir nuestra “red superior” (supernet), que es la red misma del bloque CIDR que contendrá a todas las subredes que acabamos de mencionar. Este paso es importante ya que nuestras subredes necesitan una manera de “salir a internet”, y esa manera es a través del gateway de la supernet.

  • Nombre de red: supernet
  • Dirección de red: 10.15.0.0/16
  • Dirección de broadcast: 10.15.255.255
  • Gateway: 10.15.0.1
  • Direcciones IP utilizables: 10.15.0.2 a 10.15.255.254

Ahora si, comencemos por la primera subred (operaciones) que necesita 1000 direcciones. El número mas cercano a 1000 en potencia de 2 es 2^10, que nos da 1024 direcciones. Por lo tanto, necesitamos 10 bits para identificar el host, y los 22 bits restantes serán para la red. Entonces, la subred de operaciones será 10.15.0.2/22.

¿Cómo obtenemos la máscara de red para este prefijo /22?

Muy simple, vamos a encender los primeros 22 bits en formato binario, y luego convertimos cada octeto a decimal.

11111111.11111111.11111100.00000000
     255.     255.     252.       0

Esa sería la máscara que corresponde al prefijo /22.

¿Y ahora, cómo sabemos “hasta donde llega” nuestra subred? Pues, como vimos anteriormente, para eso nos sirve la máscara.

Debajo de la máscara ponemos la dirección de red, y sumamos bits a la dirección de red hasta que llegamos al límite impuesto por la máscara, ese límite sería nuestro broadcast. En el siguiente ejemplo, separamos la parte del host para que sea visible la influencia de la máscara en los bits que podemos manipular dentro de la subred. Notemos que si sumamos 1 bit más, estaríamos modificando el primer bit de la parte de red, y el resto de bits de host vololverían a 0; por lo que estaríamos hablando de la siguiente red.

               ---------- RED ---------|-- HOST --- 
      Mascara: 11111111.11111111.111111|00.00000000 (255.255.252.0)
       IP Red: 00001010.00001111.000000|00.00000010 (10.15.0.2)
 IP Broadcast: 00001010.00001111.000000|11.11111111 (10.15.3.255)
               -----------------------------------
Siguiente Red: 00001010.00001111.000001|00.00000010 (10.15.4.0)

Habiendo ya establecido las “fronteras” de nuestra primera red, podemos ver claramente el rango de direcciones IP utilizables; dicho rango se encuentra entre la dirección de red, y la dirección de broadcast. Dicho eso, la información de nuestra subred quedaría como sigue.

       Nombre: operaciones
      Mascara: 11111111.11111111.11111100.00000000 (255.255.252.0)
       IP Red: 00001010.00001111.00000000.00000010 (10.15.0.2)
    Primer IP: 00001010.00001111.00000000.00000011 (10.15.0.3)
               ...
    Última IP: 00001010.00001111.00000011.11111110 (10.15.0.254)
 IP Broadcast: 00001010.00001111.00000011.11111111 (10.15.3.255)
               -----------------------------------
Siguiente Red: 00001010.00001111.00000100.00000010 (10.15.4.0)

Ahora vamos con la siguiente red que comenzará donde terminó la red anterior (10.15.4.0). Pero ¿qué máscara necesitamos? Bueno, necesitamos 30k direcciones. Eso significa que debemos consumir 15 bits para hosts, ya que con 14 bits nos alcanza para un máximo de 2^14-2=16382 direcciones de host utilizables. Con 15 bits tenemos 2^15=32766 hosts. Por lo tanto, si usamos 15 bits para hosts, eso nos deja con una máscara de 17 bits.

       Nombre: individuales
      Mascara: 11111111.11111111.10000000.00000000 (255.255.128.0)
       IP Red: 00001010.00001111.00000000.00000010 (10.15.4.0)
    Primer IP: 00001010.00001111.00000000.00000011 (10.15.4.1)
               ...
    Última IP: 00001010.00001111.01111111.11111110 (10.15.127.254)
 IP Broadcast: 00001010.00001111.01111111.11111111 (10.15.127.255)
               -----------------------------------
Siguiente Red: 00001010.00001111.10000000.00000000 (10.15.128.0)

La siguiente red necesita nuevamente 1k direcciones. Por lo que usaremos una máscara del mismo tamaño que la de la subred de operaciones (22 bits).

       Nombre: empresa A
      Mascara: 11111111.11111111.11111100.00000000 (255.255.252.0)
       IP Red: 00001010.00001111.10000000.00000000 (10.15.128.0)
    Primer IP: 00001010.00001111.10000000.00000001 (10.15.128.1)
               ...
    Última IP: 00001010.00001111.10000011.11111110 (10.15.131.254)
 IP Broadcast: 00001010.00001111.10000011.11111111 (10.15.131.255)
               -----------------------------------
Siguiente Red: 00001010.00001111.10000100.00000000 (10.15.132.0)

La siguiente red necesita 8k direcciones. Eso son 13 bits para hosts; o sea una máscara de 19 bits.

       Nombre: empresa B
      Mascara: 11111111.11111111.11100000.00000000 (255.255.224.0)
       IP Red: 00001010.00001111.10000100.00000000 (10.15.132.0)
    Primer IP: 00001010.00001111.10000100.00000001 (10.15.132.1)
               ...
    Última IP: 00001010.00001111.10011111.11111110 (10.15.159.254)
 IP Broadcast: 00001010.00001111.10011111.11111111 (10.15.159.255)
               -----------------------------------
Siguiente Red: 00001010.00001111.10100000.00000000 (10.15.160.0)

La siguiente red necesita 500 direcciones. Eso son 9 bits para hosts; o sea una máscara de 23 bits.

       Nombre: empresa C
      Mascara: 11111111.11111111.11111110.00000000 (255.255.254.0)
       IP Red: 00001010.00001111.10100000.00000000 (10.15.160.0)
    Primer IP: 00001010.00001111.10100000.00000001 (10.15.160.1)
               ...
    Última IP: 00001010.00001111.10100001.11111110 (10.15.161.254)
 IP Broadcast: 00001010.00001111.10100001.11111111 (10.15.161.255)
               -----------------------------------
Siguiente Red: 00001010.00001111.10100010.00000000 (10.15.162.0)

Y esas serían todas las subredes. Si quisiéramos agregar otra subred, solo tendríamos que partir de la IP 10.15.162.0, asignar una máscara de acuerdo al tamaño de red que deseemos.