CIDR网络地址、广播地址、网段区间计算说明与计算工具

news2025/1/14 1:07:02

文章目录

  • 开始
  • 问题
    • 参考答案
  • 答案解析
  • 计算工具
  • 测试

开始

好久没有看计算网络,感觉已经完全返给老师了。

最近,有同事遇到个问题,网络一直不对,又开始重新看一下。

相信很多朋友长时间不看也忘了,所以,这里记录一下,并提供了一个工具类用来计算相关值。

希望帮助新学习的朋友学习、已经忘了的朋友重新回忆。

觉得自己理解到位的朋友,可以尝试一下下面的问题。

问题

我的IPv4地址是:172.17.1.6,子网掩码是:255.255.252.0

请问:

  1. 我和172.17.0.6在同一网段吗?172.17.2.6呢?172.17.3.6呢?172.17.4.6呢?
  2. 我所在网络的网络地址是多少?网络位数是多少?
  3. 我所在网络的广播地址是多少?
  4. 我所在网络的最小主机IP地址是多少?
  5. 我所在的网络最大主机IP地址是多少?

上面的问题你能回答几个?答对了几个?

参考答案

  1. 172.17.1.6和172.17.0.6、172.17.2.6、172.17.3.6是同一网段,和172.17.4.6不是同一网段
  2. 我所在网络的网络地址:10101100000100010000000000000000(172.17.0.0/22)
  3. 我所在网络的广播地址:10101100000100010000001111111111(172.17.3.255)
  4. 我所在网络的最小主机IP地址:10101100000100010000000000000001(172.17.0.1)
  5. 我所在的网络最大主机IP地址:10101100000100010000001111111110(172.17.3.254)

答案解析

首先算网络地址:
我的IP & 子网掩码就是我所在的网络地址:
我的地址:10101100000100010000000100000110(172.17.1.6)
子网掩码:11111111111111111111110000000000(255.255.252.0)
与有0为0:10101100000100010000000000000000(172.17.0.0)

网络位数,数子网掩码前面1的个数:22,因此网络号可以写成:172.17.0.0/22,很多网策支持这样配置。

广播地址是主机位全为1的地址,因此把网络地址中的主机位全换为1即可:
网络位数是22,所以主机位是10位:10101100000100010000001111111111(172.17.3.255)

最小的主机地址是网络地址+1:10101100000100010000000000000001(172.17.0.1)
最大的主机地址是广播地址-1:10101100000100010000001111111110(172.17.3.254)

有了最小的主机地址和最大的主机地址,现在再看第一个问题,是不是清晰了。

这其中最大的误区就是,一晃眼就认为172.17.1.6的网段是172.17.1.0
这是没有CIDR,在子网掩码为:255.255.255.0时才成立

计算工具

package vip.meet.network.ip;

import lombok.extern.slf4j.Slf4j;

import java.math.BigInteger;

/**
 * CIDR
 * 网络中:
 * 全为0的是:网络地址(最小地址)
 * 全为1的是:广播地址(最大地址)
 * 最小可用地址=网络地址+1
 * 最大可用地址=广播地址-1
 * <p>
 * 私有地址:
 * A类地址范围:10.0.0-10.255.255.255
 * B类地址范围:172.16.0.0-172.31.255.555
 * C类地址范围:192.168.0.0-192.168.255.255
 */
@Slf4j
public class IpCalculateHelper {

    /**
     * 根据主机IP和子网掩码计算网络地址 ip & mask
     * <p>
     * 198.1.33.205 :11000110000000010010000111001101
     * 255.255.252.0:11111111111111111111110000000000
     * &
     * 198.1.32.0/22:11000110000000010010000000000000
     *
     * @param netIp 要计算的ip 198.1.33.205
     * @param mask  子网掩码 255.255.252.0
     * @return 网络地址 198.1.32.0
     */
    public static String getIPV4CIDRNet(String netIp, String mask) {
        String ipv4CIDRBinary = getIPV4CIDRBinary(netIp, mask);
        return binaryIp2NetIp(ipv4CIDRBinary);
    }

    /**
     * 获取网络二进制地址
     *
     * @param netIp 198.1.33.205
     * @param mask  55.255.252.0
     * @return 11000110000000010010000000000000
     */
    public static String getIPV4CIDRBinary(String netIp, String mask) {
        BigInteger ipBin = new BigInteger(getIPBinary(netIp), 2);
        BigInteger maskBin = new BigInteger(getIPBinary(mask), 2);
        BigInteger result = ipBin.and(maskBin);
        String string = result.toString(2);
        return "0".repeat(32 - string.length()) + string;
    }

    /**
     * 二进制转ip转网络ip
     *
     * @param binaryIp 二进制ip 11000110000000010010000000000000
     * @return ip 198.1.32.0
     */
    public static String binaryIp2NetIp(String binaryIp) {
        int length = binaryIp.length();
        if (length > 32) {
            throw new RuntimeException("非法ip长度:" + binaryIp);
        }
        String pad = "0".repeat(32 - length) + binaryIp;
        return Integer.valueOf(pad.substring(0, 8), 2) + "." +
                Integer.valueOf(pad.substring(8, 16), 2) + "." +
                Integer.valueOf(pad.substring(16, 24), 2) + "." +
                Integer.valueOf(pad.substring(24), 2);
    }

    /**
     * 二进制ip转ip
     *
     * @param netIp 198.1.32.0
     * @return binary ip 二进制ip 11000110000000010010000000000000
     */
    public static String getIPBinary(String netIp) {
        String[] parts = netIp.split("\\.");
        if (parts.length != 4) {
            throw new RuntimeException("非法ipv4:" + netIp);
        }
        StringBuilder sb = new StringBuilder();
        for (String part : parts) {
            BigInteger integer = new BigInteger(part, 10);
            String partIp = integer.toString(2);
            sb.append("0".repeat(8 - partIp.length())).append(partIp);
        }
        return sb.toString();
    }

    /**
     * 根据子网掩码算网络位数
     *
     * @param mask 子网掩码 255.255.252.0
     * @return 网络位数 22
     */
    public static int getNetBitFromMask(String mask) {
        String binString = getIPBinary(mask);
        int count = 0;
        for (int i = 0; i < binString.length(); i++) {
            if (binString.charAt(i) != '1') {
                break;
            }
            count++;
        }
        return count;
    }

    /**
     * 获取二进制子网掩码
     *
     * @param netBit 网络位数
     * @return 二进制子网掩码
     */
    public static String getMaskBinaryFromNetBit(int netBit) {
        if (netBit < 1 || netBit >= 32) {
            throw new RuntimeException("非法网络位数:" + netBit);
        }
        return "1".repeat(netBit) + "0".repeat(32 - netBit);
    }

    /**
     * 获取子网掩码
     *
     * @param netBit 网络位数
     * @return 子网掩码
     */
    public static String getMaskFromNetBit(int netBit) {
        if (netBit < 1 || netBit >= 32) {
            throw new RuntimeException("非法网络位数:" + netBit);
        }
        String maskBinary = "1".repeat(netBit) + "0".repeat(32 - netBit);
        return binaryIp2NetIp(maskBinary);
    }

    /**
     * 获取广播地址
     *
     * @param binaryCIDR cidr网络 11000110000000010010000000000000
     * @param netBit     网络位数 22
     * @return 广播地址 11000110000000010010001111111111
     */
    public static String getBroadcast(String binaryCIDR, int netBit) {
        if (netBit < 1 || netBit >= 32) {
            throw new RuntimeException("非法网络位数:" + netBit);
        }
        return binaryCIDR.substring(0, netBit) + "1".repeat(32 - netBit);
    }

    /**
     * 计算最小主机地址
     *
     * @param binaryCIDR CIDR网络地址 11000110000000010010000000000000
     * @return 最小主机地址 1100011000000001001000000000000
     */
    public static String minHostIp(String binaryCIDR) {
        return binaryCIDR.substring(0, 31) + "1";
    }

    /**
     * 最大主机地址
     *
     * @param binaryCIDR CIDR网络地址 11000110000000010010000000000000
     * @param netBit     网络位数 22
     * @return 最大主机地址 11000110000000010010001111111110
     */
    public static String maxHostIp(String binaryCIDR, int netBit) {
        if (netBit < 1 || netBit >= 32) {
            throw new RuntimeException("非法网络位数:" + netBit);
        }
        return binaryCIDR.substring(0, netBit) + "1".repeat(31 - netBit) + "0";
    }

    public static void printNetInfo(String netIp, int netBit) {
        if (netBit < 1 || netBit >= 32) {
            throw new RuntimeException("非法网络位数:" + netBit);
        }
        String mask = getMaskFromNetBit(netBit);
        printNetInfo(netIp, netBit, mask);
    }

    public static void printNetInfo(String netIp, String mask) {
        int netBit = getNetBitFromMask(mask);
        printNetInfo(netIp, netBit, mask);
    }

    public static void printNetInfo(String netIp, Integer netBit, String mask) {
        if (netBit == null) {
            netBit = getNetBitFromMask(mask);
        }
        if (netBit < 1 || netBit >= 32) {
            throw new RuntimeException("非法网络位数:" + netBit);
        }
        String ipBinary = getIPBinary(netIp);
        System.out.printf("二进制IP:%s(%s)\n", ipBinary, netIp);
        String maskBinary = getIPBinary(mask);
        System.out.printf("  掩码IP:%s(%s)\n", maskBinary, mask);
        String ipv4CIDRBinary = getIPV4CIDRBinary(netIp, mask);
        System.out.printf("  网络IP:%s(%s/%d)\n", ipv4CIDRBinary,
                binaryIp2NetIp(ipv4CIDRBinary), netBit);
        String broadcast = getBroadcast(ipv4CIDRBinary, netBit);
        System.out.printf("  广播IP:%s(%s)\n", broadcast, binaryIp2NetIp(broadcast));

        String min = minHostIp(ipv4CIDRBinary);
        System.out.printf(" 最小HIP:%s(%s)\n", min, binaryIp2NetIp(min));

        String max = maxHostIp(ipv4CIDRBinary, netBit);
        System.out.printf(" 最大HIP:%s(%s)\n", max, binaryIp2NetIp(max));
    }
}

测试

 @Test
public void printNetInfo() {
    IpCalculateHelper.printNetInfo("10.2.2.7", 20);
    System.out.println("--------------");
    IpCalculateHelper.printNetInfo("172.17.1.6", "255.255.252.0");
    System.out.println("--------------");
    IpCalculateHelper.printNetInfo("192.168.3.3", 21);
}

计算结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP机械臂控制

通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 注意&#xff1a;关闭计算机的杀毒软件&#xff0c;电脑管家&#xff0c;防火墙 1&#xff09;基于TCP服务器…

数据泄露态势(2024年2月)

监控说明&#xff1a;以下数据由零零信安0.zone安全开源情报系统提供&#xff0c;该系统监控范围包括约10万个明网、深网、暗网、匿名社交社群威胁源。在进行抽样事件分析时&#xff0c;涉及到我国的数据不会选取任何政府、安全与公共事务的事件进行分析。如遇到影响较大的伪造…

专业款希亦、小米、必胜、云鲸洗地机怎么样?深度测评利弊

洗地机可以说是一种非常实用的清洁工具&#xff0c;尤其是对于那些需要经常给家里地板清洁的人来说。它能够高效、彻底清洁地板&#xff0c;去除顽固污渍、灰尘和细菌&#xff0c;让家居环境更加洁净卫生。可是面对型号繁多的洗地机&#xff0c;我们应该怎么挑选呢&#xff1f;…

架构设计-复杂度来源:高性能

对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集成电路计算机&#xff0c;运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高&#xff0c;相应的方法和系统复杂度也是越来越高。现代的计算机 CPU 集…

实现elasticsearch和数据库的数据同步

1. 数据同步 elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是elasticsearch与mysql之间的数据同步。 1.1. 思路分析 常见的数据同步方案有三种&#xff1a; 同步调用 异步通知…

element-plus表格,多样本比较,动态渲染表头

问题&#xff1a; 公司给了个excel表格&#xff0c;让比较两个样本之间的数据&#xff0c;并且动态渲染&#xff0c;搞了半天没搞出来&#xff0c;最后让大佬解决了&#xff0c;特此写篇博客记录一下。 我之前的思路是合并行&#xff0c;大概效果是这样&#xff1a; 但是最终…

微服务学习day02 -- nacos配置管理 -- Feign远程调用 -- Gateway服务网关

0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理…

雷卯有多种封装的超低电容ESD供您选择

1.应用 HDMI 1.3、1.4、2.0、2.1 接口 LCD、HDTV MIPI 接口 手机、 天线&#xff08;手机、GPS...&#xff09; 高速以太网 100/1000 以太网 USB 2.0 和 USB3.0、DVI、LVDS、IEEE 1394 接口 车载信息箱、VN&#xff08;车载导航&#xff09; 卫星导航、便携式导航 …

3.2网安学习第三阶段第二周回顾(个人学习记录使用)

本周重点 ①SQL语句的基本用法 ②SQL注入的基本概念和原理 ③SQL注入类型(**重点) ④SQL注入的防御和绕过手段 本周主要内容–SQL 一、SQL语句的基本用法 limit用法&#xff1a;显示查询结果中从第n条开始显示m条记录 select * from tb_user limit 1,2union用法&#x…

构建部署_Docker常用命令

构建部署_Docker常见命令 启动命令镜像命令容器命令 启动命令 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机启动&…

【Shiro反序列化漏洞】Shiro-550反序列化漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

腾讯云4核8G服务器性能怎么样?搭建网站够用吗?

腾讯云轻量4核8G12M服务器配置446元一年&#xff0c;646元12个月&#xff0c;腾讯云轻量应用服务器具有100%CPU性能&#xff0c;系统盘为180GB SSD盘&#xff0c;12M带宽下载速度1536KB/秒&#xff0c;月流量2000GB&#xff0c;折合每天66.6GB流量&#xff0c;超出月流量包的流…

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…

快手发布革命性视频运动控制技术 DragAnything,拖动锚点精准控制视频物体和镜头运动

快手联合浙江大学、新加坡国立大学发布了DragAnything &#xff0c;利用实体表示实现对任何物体的运动控制。该技术可以精确控制物体的运动&#xff0c;包括前景、背景和相机等不同元素。 该项目提供了对实体级别运动控制的新见解&#xff0c;通过实体表示揭示了像素级运动和实…

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

724.寻找数组的中心下标

题目&#xff1a;给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不…

力扣爆刷第96天之hot100五连刷66-70

力扣爆刷第96天之hot100五连刷66-70 文章目录 力扣爆刷第96天之hot100五连刷66-70一、33. 搜索旋转排序数组二、153. 寻找旋转排序数组中的最小值三、4. 寻找两个正序数组的中位数四、20. 有效的括号五、155. 最小栈 一、33. 搜索旋转排序数组 题目链接&#xff1a;https://le…

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测&#xff08;完整源码和数据) …

MyBatis学习笔记|2024最新版Mybatis

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“internet”和“aba…