principio
Determine si las dos direcciones IP están en el mismo segmento de red y realice una operación AND entre sus direcciones IP y la máscara de subred , y el resultado es el número de red/dirección de red . Si los números de red son iguales, están en el misma subred, de lo contrario, no en la misma subred.
Por ejemplo :
Dirección IP1 : 10.140.201.14900001010.10001100.11001001.10010101
Máscara de subred : 255.255.254.011111111.11111111.11111110.00000000
y el resultado es : 10.140.200.000001010.10001100.11001000.00000000
Dirección IP2 : 10.140.200.2600001010.10001100.11001000.00011010
Máscara de subred : 255.255.254.011111111.11111111.11111110.00000000
y el resultado es : 10.140.200.000001010.10001100.11001000.00000000
Los resultados ( dirección de red/número de red ) de las dos direcciones IP y la misma máscara de subred son los mismos, por lo que se puede juzgar que las dos direcciones IP están en la misma subred.
Máscara de subred : 255.255.254.0
11111111.11111111.11111110.00000000
La máscara de subred y la IP de una de ellas las proporciona el administrador de la red.
La dirección IP se divide en número de red + número de host
El número de red es el resultado de AND: 10.140.200.0, y el segmento del número de host es el número de dígitos 0 después de la máscara de subred. Por ejemplo, es 2 elevado a la 9ª potencia = 512.
Rango de direcciones IP : 0.0.0.0~255.255.255.255, incluida la dirección de la máscara.
División de direcciones IP | |
---|---|
Dirección de clase A: | 1.0.0.1~126.255.255.254 |
Dirección de clase B: | 128.0.0.1~191.255.255.254 |
Dirección de clase C: | 192.168.0.0~192.168.255.255 |
Dirección de clase D: | 224.0.0.1~239.255.255.254 |
Dirección de clase E: | 240.0.0.1~255.255.255.254 |
Hay dos formas de expresar la máscara de subred:
-
notación decimal punteada
-
Máscara de subred predeterminada de red Clase A: 255.0.0.0
-
La máscara de subred de la red de clase B es: 255.255.0.0
-
La máscara de subred de una red de clase C es: 255.255.255.0
-
La máscara de subred predeterminada es: 255.255.255.0
-
-
notación CIDR
Agregue una barra inclinada (/) y un rango de máscara de 1 32 después de la dirección IP , donde 1 32 representa la longitud de los bits de identificación de red en la máscara de subred.
Por ejemplo, 192.168.0.3/24.
/24
De hecho, los primeros 24 bits son todos 1, que es la máscara de subred 255.255.255.0- 11111111.11111111.11111111.00000000
CIDR
CIDR (enrutamiento entre dominios sin clases) es un nuevo método de direccionamiento en Internet. En comparación con los modos de direccionamiento tradicionales de clase A, clase B y clase C, CIDR es más eficiente en la asignación de direcciones IP. CIDR adopta la notación de barra inclinada, que se expresa como: el número de dígitos de la dirección IP/ID de red.
-
Ejemplo 1: convertir formato CIDR a segmento de red de dirección IP
Por ejemplo, 10.0.0.0/8 se convierte en una dirección binaria de 32 bits: 00001010.00000000.00000000.00000000.
Entre ellos, /8 representa una ID de red de 8 bits, es decir, los primeros 8 bits de la dirección binaria de 32 bits son fijos y el segmento de red correspondiente es: 00001010.00000000.00000000.00000000 00001010.11111111.11111111.11111111 . Después de la conversión a decimal, 10.0.0.0/8 significa: la máscara de subred es 255.0.0.0 y el segmento de red correspondiente es 10.0.0.0 10.255.255.255.
-
Ejemplo 2: convertir segmento de dirección IP a formato CIDR
Por ejemplo, 192.168.0.0 192.168.31.255, los dos últimos segmentos de IP se convierten en direcciones binarias: 00000000.00000000 00011111.11111111, se puede concluir que los primeros 19 dígitos (8*2+3) son fijos, luego se convierten en formato CIDR, expresado como: 192.168.0.0/19.
Las herramientas de cálculo de CIDR son excelentes si desea determinar fácilmente a qué rango de IP es igual una dirección CIDR en particular. Simplemente ingrese la dirección CIDR en la herramienta y haga clic en Calculate
. Esto devolverá información como la primera IP, la última IP, la cantidad de hosts, etc.
Código
public class IpSubnet {
public static void main(String[] args) throws UnknownHostException {
System.out.println(matches("10.140.200.26", "10.140.201.149", "255.255.254.0"));
}
public static boolean matches(String ip1, String ip2, String mask) throws UnknownHostException {
InetAddress ipAddress1 = InetAddress.getByName(ip1);
InetAddress ipAddress2 = InetAddress.getByName(ip2);
InetAddress subnetMask = InetAddress.getByName(mask);
int subnetMastInt = ipToInt(subnetMask);
int networkAddress = ipToInt(ipAddress1) & subnetMastInt;
int ipAddress = ipToInt(ipAddress2);
return (ipAddress & subnetMastInt) == networkAddress;
}
private static int ipToInt(InetAddress ipAddress) {
byte[] octets = ipAddress.getAddress();
assert octets.length == 4;
return (octets[0] & 0xff) << 24 |
(octets[1] & 0xff) << 16 |
(octets[2] & 0xff) << 8 |
octets[3] & 0xff;
}
}
referencia
- https://gist.github.com/gythialy/1ebbde7ba680e76fbee4