判断内网IP是否为同一个子网

文章目录

原理

判断两个IP地址是否在同一个网段,将它们的IP地址分别与子网掩码与运算,得到的结果为网络号/网络地址,如果网络号相同,就在同一子网,否则,不在同一子网。

例如

IP1地址:10.140.201.149 00001010.10001100.11001001.10010101

子网掩码:255.255.254.0 11111111.11111111.11111110.00000000

与结果为:10.140.200.0 00001010.10001100.11001000.00000000

IP2地址:10.140.200.26 00001010.10001100.11001000.00011010

子网掩码:255.255.254.0 11111111.11111111.11111110.00000000

与结果为:10.140.200.0 00001010.10001100.11001000.00000000

两个IP与同一个子网掩码与的结果(网络地址/网络号)是一样的,因此可以判断这两个IP地址在同一个子网。

子网掩码:255.255.254.0 11111111.11111111.11111110.00000000

子网掩码和其中之一的IP由网络管理员提供。

IP地址分为网络号 + 主机号

网络号是与的结果:10.140.200.0 ,主机号段是子网掩码后面0的位数,以示例来说是2的9次方 = 512.

IP地址范围:0.0.0.0~255.255.255.255,包括了mask地址。

IP地址划分
A类地址: 1.0.0.1~126.255.255.254
B类地址: 128.0.0.1~191.255.255.254
C类地址: 192.168.0.0~192.168.255.255
D类地址: 224.0.0.1~239.255.255.254
E类地址: 240.0.0.1~255.255.255.254

子网掩码有两种表示方法:

  • 点分十进制表示法

    • A类网络缺省子网掩码:255.0.0.0

    • B类网络的子网掩码为:255.255.0.0

    • C类网络的子网掩码为:255.255.255.0

    • 缺省情况子网掩码为:255.255.255.0

  • CIDR表示法

    在IP地址后加上斜杠(/)以及132的掩码范围,其中132表示子网掩码中网络标识位的长度。

    例如,192.168.0.3/24。

    /24其实就是 前24位都是1 是子网掩码 即 255.255.255.0

    • 11111111.11111111.11111111.00000000

CIDR

CIDR(Classless Inter-Domain Routing)是互联网中一种新的寻址方式,与传统的A类、B类和C类寻址模式相比,CIDR在IP地址分配方面更为高效。CIDR采用斜线记法,表示为:IP地址/网络ID的位数。

  • 示例一:CIDR格式换算为IP地址网段

    例如10.0.0.0/8,换算为32位二进制地址:00001010.00000000.00000000.00000000。

    其中/8表示8位网络ID,即32位二进制地址中前8位是固定不变的,对应网段为:00001010.00000000.00000000.0000000000001010.11111111.11111111.11111111。则换算为十进制后,10.0.0.0/8表示:子网掩码为255.0.0.0,对应网段为10.0.0.010.255.255.255。

  • 示例二:IP地址网段换算为CIDR格式

    例如192.168.0.0192.168.31.255,后两段IP换算为二进制地址:00000000.0000000000011111.11111111,可以得出前19位(8*2+3)是固定不变的,则换算为CIDR格式后,表示为:192.168.0.0/19。

CIDR计算工具很好用,如果你想很容易地确定一个特定的CIDR地址等于什么IP范围。只需在工具中输入CIDR地址并单击Calculate。这将返回诸如第一个IP、最后一个IP、主机数量等信息。

代码实现

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;
    }
}

参考

  • https://gist.github.com/gythialy/1ebbde7ba680e76fbee4

猜你喜欢

转载自blog.csdn.net/abu935009066/article/details/130081640