
HOJA DE TRUCOS DE SUBREDES Y CIDR PARA REDES
Introducción a las Subredes y CIDR
Las subredes y la notación CIDR son conceptos fundamentales para quienes trabajan en redes o desarrollo de software relacionado con infraestructura. Entender cómo funcionan las máscaras de subred, cómo se dividen las direcciones IP y cómo se utiliza la notación CIDR puede simplificar tareas como la configuración de redes, la optimización de recursos y la resolución de problemas de conectividad. Esta guía ofrece una explicación detallada y práctica de estos temas, incluyendo una hoja de trucos con valores clave para máscaras de subred, direcciones IP disponibles y conversiones binarias. También se abordan conceptos como el direccionamiento con clase, el subnetting y ejemplos prácticos para reforzar el aprendizaje.
Tabla de Máscaras de Subred y CIDR
La siguiente tabla resume las máscaras de subred, máscaras comodín, el número total de direcciones IP y las direcciones utilizables para cada notación CIDR. Esta información es esencial para calcular cuántas direcciones IP están disponibles en una subred y cuántas pueden asignarse a dispositivos.
CIDR | Máscara de Subred | Máscara Comodín | # de Direcciones IP | # de Direcciones Utilizables |
---|---|---|---|---|
/32 | 255.255.255.255 | 0.0.0.0 | 1 | 1 |
/31 | 255.255.255.254 | 0.0.0.1 | 2 | 2* |
/30 | 255.255.255.252 | 0.0.0.3 | 4 | 2 |
/29 | 255.255.255.248 | 0.0.0.7 | 8 | 6 |
/28 | 255.255.255.240 | 0.0.0.15 | 16 | 14 |
/27 | 255.255.255.224 | 0.0.0.31 | 32 | 30 |
/26 | 255.255.255.192 | 0.0.0.63 | 64 | 62 |
/25 | 255.255.255.128 | 0.0.0.127 | 128 | 126 |
/24 | 255.255.255.0 | 0.0.0.255 | 256 | 254 |
/23 | 255.255.254.0 | 0.0.1.255 | 512 | 510 |
/22 | 255.255.252.0 | 0.0.3.255 | 1,024 | 1,022 |
/21 | 255.255.248.0 | 0.0.7.255 | 2,048 | 2,046 |
/20 | 255.255.240.0 | 0.0.15.255 | 4,096 | 4,094 |
/19 | 255.255.224.0 | 0.0.31.255 | 8,192 | 8,190 |
/18 | 255.255.192.0 | 0.0.63.255 | 16,384 | 16,382 |
/17 | 255.255.128.0 | 0.0.127.255 | 32,768 | 32,766 |
/16 | 255.255.0.0 | 0.0.255.255 | 65,536 | 65,534 |
/15 | 255.254.0.0 | 0.1.255.255 | 131,072 | 131,070 |
/14 | 255.252.0.0 | 0.3.255.255 | 262,144 | 262,142 |
/13 | 255.248.0.0 | 0.7.255.255 | 524,288 | 524,286 |
/12 | 255.240.0.0 | 0.15.255.255 | 1,048,576 | 1,048,574 |
/11 | 255.224.0.0 | 0.31.255.255 | 2,097,152 | 2,097,150 |
/10 | 255.192.0.0 | 0.63.255.255 | 4,194,304 | 4,194,302 |
/9 | 255.128.0.0 | 0.127.255.255 | 8,388,608 | 8,388,606 |
/8 | 255.0.0.0 | 0.255.255.255 | 16,777,216 | 16,777,214 |
/7 | 254.0.0.0 | 1.255.255.255 | 33,554,432 | 33,554,430 |
/6 | 252.0.0.0 | 3.255.255.255 | 67,108,864 | 67,108,862 |
/5 | 248.0.0.0 | 7.255.255.255 | 134,217,728 | 134,217,726 |
/4 | 240.0.0.0 | 15.255.255.255 | 268,435,456 | 268,435,454 |
/3 | 224.0.0.0 | 31.255.255.255 | 536,870,912 | 536,870,910 |
/2 | 192.0.0.0 | 63.255.255.255 | 1,073,741,824 | 1,073,741,822 |
/1 | 128.0.0.0 | 127.255.255.255 | 2,147,483,648 | 2,147,483,646 |
/0 | 0.0.0.0 | 255.255.255.255 | 4,294,967,296 | 4,294,967,294 |
Nota: La notación /31 es un caso especial descrito en la RFC 3021, que permite asignar dos direcciones IP para enlaces punto a punto.
La tabla de conversiones decimal a binario para máscaras de subred y máscaras comodín es:
Decimal | Binario | Comodín | Binario |
---|---|---|---|
0 | 00000000 | 255 | 11111111 |
128 | 10000000 | 127 | 01111111 |
192 | 11000000 | 63 | 00111111 |
224 | 11100000 | 31 | 00011111 |
240 | 11110000 | 15 | 00001111 |
248 | 11111000 | 7 | 00000111 |
252 | 11111100 | 3 | 00000011 |
254 | 11111110 | 1 | 00000001 |
255 | 11111111 | 0 | 00000000 |
La máscara comodín es el inverso de la máscara de subred. Por ejemplo, para una máscara de subred 255.255.255.0, la máscara comodín es 0.0.0.255.
# Ejemplo en Python para calcular la máscara comodín
def calcular_mascara_comodin(mascara_subred):
octetos = mascara_subred.split('.')
comodin = [str(255 - int(octeto)) for octeto in octetos]
return '.'.join(comodin)
mascara = "255.255.255.0"
print(f"Máscara de subred: {mascara}")
print(f"Máscara comodín: {calcular_mascara_comodin(mascara)}")
Estructura de una Dirección IPv4
Una dirección IPv4, como 192.168.0.1, es una representación decimal de cuatro bloques binarios de 8 bits, conocidos como octetos. Cada octeto puede representar valores de 0 a 255, lo que da un total de 32 bits por dirección. Por ejemplo, la dirección 172.16.254.1 en binario es:
10101100.00010000.11111110.00000001
Para convertir un octeto a binario, se utiliza una tabla de potencias de 2:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|
Tomemos el octeto 168:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
Esto da como resultado 10101000, ya que 128 + 32 + 8 = 168. Repitiendo este proceso para cada octeto de 168.210.225.206, se obtiene:
10101000.11010010.11100001.11001110
# Ejemplo en Python para convertir un octeto a binario
def octeto_a_binario(octeto):
binario = bin(int(octeto))[2:].zfill(8)
return binario
direccion_ip = "168.210.225.206"
octetos = direccion_ip.split('.')
binarios = [octeto_a_binario(octeto) for octeto in octetos]
print(f"Dirección IP: {direccion_ip}")
print(f"Binario: {'.'.join(binarios)}")
¿Qué es la División en Subredes?
La división en subredes permite dividir una red grande en subredes más pequeñas, optimizando el uso de direcciones IP. Cada dirección IP consta de una parte de red y una parte de host. La división en subredes utiliza la porción de host para crear estas subredes, permitiendo que los dispositivos determinen si otro dispositivo está en la misma red local.
Por ejemplo, en una red doméstica, un enrutador recibe una dirección IP pública de un proveedor de servicios de internet (ISP), mientras que los dispositivos conectados al enrutador tienen direcciones IP privadas, como 192.168.0.101. La combinación de la dirección IP y la máscara de subred permite al dispositivo determinar si otro dispositivo, como 192.168.0.103, está en la misma red.
# Ejemplo en Python para verificar si dos direcciones están en la misma red
def misma_red(ip1, ip2, mascara):
octetos_ip1 = [int(o) for o in ip1.split('.')]
octetos_ip2 = [int(o) for o in ip2.split('.')]
octetos_mascara = [int(o) for o in mascara.split('.')]
red1 = [octetos_ip1[i] & octetos_mascara[i] for i in range(4)]
red2 = [octetos_ip2[i] & octetos_mascara[i] for i in range(4)]
return red1 == red2
ip1 = "192.168.0.101"
ip2 = "192.168.0.103"
mascara = "255.255.255.0"
print(f"¿{ip1} y {ip2} están en la misma red con máscara {mascara}?")
print(misma_red(ip1, ip2, mascara)) # True
Cómo Funcionan las Máscaras de Subred
Una máscara de subred actúa como un filtro que separa los bits de red de los bits de host en una dirección IP. Por ejemplo, la máscara 255.255.255.0 (binario: 11111111.11111111.11111111.00000000) indica que los primeros tres octetos son para la red y el último para el host. Si una dirección IP es 192.168.0.101, los bits de red son 192.168.0, y el bit de host es 101.
Esto permite identificar el ID de red, que en este caso sería 192.168.0.0. Cualquier dispositivo con una dirección que comparta este ID de red estará en la misma subred.
# Ejemplo en Python para calcular el ID de red
def calcular_id_red(ip, mascara):
octetos_ip = [int(o) for o in ip.split('.')]
octetos_mascara = [int(o) for o in mascara.split('.')]
id_red = [octetos_ip[i] & octetos_mascara[i] for i in range(4)]
return '.'.join(str(o) for o in id_red)
ip = "192.168.0.101"
mascara = "255.255.255.0"
print(f"Dirección IP: {ip}")
print(f"Máscara de subred: {mascara}")
print(f"ID de red: {calcular_id_red(ip, mascara)}")
Notación CIDR y Subenmascaramiento
La notación CIDR (Classless Inter-Domain Routing) es una forma abreviada de representar una máscara de subred. Por ejemplo, 192.168.0.101/24 indica una dirección IP con una máscara de subred de 255.255.255.0, donde /24 representa los 24 bits de red (tres octetos completos). Para calcular la notación CIDR, se convierte la máscara de subred a binario y se cuentan los bits en 1.
Por ejemplo, para 255.255.255.0:
11111111.11111111.11111111.00000000
Esto tiene 24 bits en 1, por lo que la notación CIDR es /24.
# Ejemplo en Python para calcular notación CIDR
def calcular_cidr(mascara):
octetos = [int(o) for o in mascara.split('.')]
binario = ''.join([bin(octeto)[2:].zfill(8) for octeto in octetos])
return binario.count('1')
mascara = "255.255.255.0"
print(f"Máscara de subred: {mascara}")
print(f"Notación CIDR: /{calcular_cidr(mascara)}")
Direccionamiento IP con Clase
Antes de la introducción de CIDR en 1993, las direcciones IP se organizaban en clases (A, B, C, D y E), cada una con una máscara de subred predeterminada. Este sistema era ineficiente, ya que asignaba bloques grandes de direcciones que a menudo no se utilizaban por completo.
Clase A
- Rango: 1.0.0.0 a 127.255.255.255
- Máscara predeterminada: 255.0.0.0 (/8)
- Bits de red: 8
- Bits de host: 24
- Redes: 128
- Direcciones por red: 16,777,214
El rango 127.0.0.0 a 127.255.255.255 está reservado para direcciones de bucle invertido (localhost).
Clase B
- Rango: 128.0.0.0 a 191.255.255.255
- Máscara predeterminada: 255.255.0.0 (/16)
- Bits de red: 16
- Bits de host: 16
- Redes: 16,384
- Direcciones por red: 65,534
Clase C
- Rango: 192.0.0.0 a 223.255.255.255
- Máscara predeterminada: 255.255.255.0 (/24)
- Bits de red: 24
- Bits de host: 8
- Redes: 2,097,152
- Direcciones por red: 254
Clases D y E
- Clase D (224.0.0.0 a 239.255.255.255): Reservada para multidifusión.
- Clase E (240.0.0.0 en adelante): Reservada para uso experimental.
El direccionamiento con clase generaba un desperdicio significativo de direcciones IP, ya que las organizaciones recibían bloques más grandes de lo necesario. Por ejemplo, una empresa con 1,000 dispositivos requería una red de Clase B (65,534 direcciones), dejando muchas direcciones sin usar.
# Ejemplo en Python para identificar la clase de una dirección IP
def identificar_clase_ip(ip):
primer_octeto = int(ip.split('.')[0])
if 1 <= primer_octeto <= 126:
return "Clase A"
elif 128 <= primer_octeto <= 191:
return "Clase B"
elif 192 <= primer_octeto <= 223:
return "Clase C"
elif 224 <= primer_octeto <= 239:
return "Clase D"
else:
return "Clase E"
ip = "192.168.0.101"
print(f"Dirección IP: {ip}")
print(f"Clase: {identificar_clase_ip(ip)}")
Subenmascaramiento de Longitud Variable (VLSM)
El subenmascaramiento de longitud variable (VLSM) permite crear subredes de diferentes tamaños dentro de una red, optimizando aún más el uso de direcciones IP. Por ejemplo, una red /24 puede dividirse en una subred /26 (64 direcciones) y otra /25 (128 direcciones), según las necesidades de la organización.
Ejemplo práctico: Supongamos que tenemos la red 192.168.1.0/24 y queremos dividirla en dos subredes: una para 50 dispositivos y otra para 100 dispositivos.
- Para 50 dispositivos, necesitamos al menos 64 direcciones (/26, ya que 2^6 = 64).
- Para 100 dispositivos, necesitamos al menos 128 direcciones (/25, ya que 2^7 = 128).
La red /24 (256 direcciones) se divide en:
- 192.168.1.0/26 (192.168.1.0 a 192.168.1.63)
- 192.168.1.128/25 (192.168.1.128 a 192.168.1.255)
# Ejemplo en Python para calcular rangos de subredes
def calcular_rango_subred(ip_base, cidr):
octetos = [int(o) for o in ip_base.split('.')]
num_hosts = 2 ** (32 - cidr)
inicio = octetos
fin = [octetos[i] + (num_hosts // (256 ** (3 - i))) % 256 for i in range(4)]
return f"{'.'.join(str(o) for o in inicio)} - {'.'.join(str(o) for o in fin)}"
ip_base = "192.168.1.0"
cidr = 26
print(f"Red: {ip_base}/{cidr}")
print(f"Rango: {calcular_rango_subred(ip_base, cidr)}")
Conclusiones
La comprensión de las máscaras de subred, la notación CIDR y la división en subredes es esencial para gestionar redes de manera eficiente. La tabla de máscaras de subred y los ejemplos de código proporcionados permiten a los desarrolladores y administradores de redes calcular rápidamente las direcciones disponibles, identificar IDs de red y optimizar el uso de direcciones IP. Aunque el direccionamiento con clase es obsoleto, conocerlo ayuda a entender la evolución de las redes modernas. La notación CIDR y el VLSM han permitido un uso más eficiente de las direcciones IPv4, retrasando la necesidad de una transición completa a IPv6. Esta guía práctica es una referencia útil para profesionales de tecnología que buscan dominar los fundamentos de las redes.