java判断ip是否为指定网段

举报
神的孩子在歌唱 发表于 2024/09/29 23:18:54 2024/09/29
【摘要】 前言这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。作者:神的孩子都在歌唱一、IP地址介绍1.1 IP(IPv4)IP是Internet Protocol的缩写,即网际协议,它是计算机网络体系结构中的网络层协议。IPv4使用32位地址(IPv6为128位),通常采用点分十进制表示,例如:192.168.1.47。这个地址由两部分组成:网络位和主机位。网络位:用于标...

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱


一、IP地址介绍

1.1 IP(IPv4)

IP是Internet Protocol的缩写,即网际协议,它是计算机网络体系结构中的网络层协议。IPv4使用32位地址(IPv6为128位),通常采用点分十进制表示,例如:192.168.1.47。这个地址由两部分组成:网络位主机位

  • 网络位:用于标识设备所属的网络。

  • 主机位:用于标识该网络中的具体设备。

1.2 IP地址分类

传统的IPv4地址被分为A、B、C、D、E五类:

  • A类地址:用于大型网络,网络位为8位,主机位为24位。

    • 地址范围:1.0.0.0126.255.255.255

  • B类地址:用于中型网络,网络位为16位,主机位为16位。

    • 地址范围:128.0.0.0191.255.255.255

  • C类地址:用于小型网络,网络位为24位,主机位为8位。

    • 地址范围:192.0.0.0223.255.255.255

  • D类地址:用于组播。

  • E类地址:保留地址,未分配使用。

1.3 私有地址

某些地址被保留作为私有网络使用,无法在公网访问:

  • A类私有地址10.0.0.010.255.255.255

  • B类私有地址172.16.0.0172.31.255.255

  • C类私有地址192.168.0.0192.168.255.255

1.4 子网划分 & 子网掩码

子网掩码也是32位长,用于区分网络位和主机位。掩码网络位用1表示,主机位用0表示。

子网掩码的表示方式:

  • 点分十进制表示法:例如255.255.255.0

  • 位计数表示法:例如/24,表示网络位占24位。

作用 子网掩码的作用是确定一个IP地址的网络位长度,从而识别出IP所属的子网。

二. 判断IP是否在网段中(Java)

以下是一个用于判断给定IP是否属于指定网段的Java代码示例:

public static boolean ipIsInNet(String ip, String ipArea) {
    if ("127.0.0.1".equals(ip)) {
        return true;
    }
​
    if(StringUtils.isBlank(ipArea)){
        return false;
    }
​
    String[] ipArray = ipArea.split(",");
    for (String s : ipArray) {
        if (!s.contains("/")) {
            if (s.equals(ip)) {
                return true;
            }
            continue;
        }
​
        String[] ips = ip.split("\\.");
        int ipAddress = (Integer.parseInt(ips[0]) << 24)
                | (Integer.parseInt(ips[1]) << 16)
                | (Integer.parseInt(ips[2]) << 8) 
                | Integer.parseInt(ips[3]);
        
        int type = Integer.parseInt(s.replaceAll(".*/", ""));
        int mask = 0xFFFFFFFF << (32 - type);
        String cidrIp = s.replaceAll("/.*", "");
        String[] cidrIps = cidrIp.split("\\.");
        int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
                | (Integer.parseInt(cidrIps[1]) << 16)
                | (Integer.parseInt(cidrIps[2]) << 8)
                | Integer.parseInt(cidrIps[3]);
​
        if ((ipAddress & mask) == (cidrIpAddr & mask)) {
            return true;
        }
    }
    return false;
}

这个代码可以用来判断某个IP地址是否属于指定的IP网段。


参考文章:java判断ip是否为指定网段


作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。