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

文章目录

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

开始

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

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

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

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

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

问题

我的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.mzph.cn/news/748877.shtml

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

相关文章

web学习笔记(三十三)

目录 1.严格模式 1.1严格模式的概念&#xff1a; 1.2严格模式在语义上更改的地方&#xff1a; 1.3如何开启严格模式 1.4严格模式应用上的变化 2.原型链 1.严格模式 1.1严格模式的概念&#xff1a; 严格模式有点像es5向es6过渡而产生的一种模式&#xff0c;因为es6的语法…

Spring项目问题—前后端交互:Method Not Allowed

问题 前后端交互时出现Method Not Allowed问题 Ajax中使用的是get&#xff0c;方法仍然出现post方法报错 Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method POST not supported] 浏览器中没有报错&#xff0c;只是接收不到后端返…

C++:类与对象(中)

一、构造函数 1.1特性 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数的虽然名称叫构造&#xff0c;但是需要注意的是构造函数的主要任务并不是开空间创建对象&#xff0c;而是初始化对象。 1. 函数名与类名相同。 2. 无返回值。 3. 对象实例化时编…

RPC通信原理(一)

RPC通信原理 RPC的概念 如果现在我有一个电商项目&#xff0c;用户要查询订单&#xff0c;自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起&#xff0c;打包成一个war包&#xff0c;然后再tomcat上运行&#xff0c;tomcat占有一个进程&am…

Learn OpenGL 13 模板测试

模板测试 当片段着色器处理完一个片段之后&#xff0c;模板测试(Stencil Test)会开始执行&#xff0c;和深度测试一样&#xff0c;它也可能会丢弃片段。接下来&#xff0c;被保留的片段会进入深度测试&#xff0c;它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的&a…

python爬虫-AES.CBS加密案例(mmz批量爬取)

下载mmz本页数据 批量下载请看主页&#xff01;&#xff01;&#xff01; 代码&#xff1a; import requests from Crypto.Cipher import AES import base64cookies {PHPSESSID: 48nu182kdlsmgfo2g7hl6eufsa,Hm_lvt_6cd598ca665714ffcd8aca3aafc5e0dc: 1710568549,SECKEY_A…

MySql入门教程--MySQL数据库基础操作

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Typora设置文本颜色

目录 总共分为三种方法 1.使用markdown语法的内联公式 2.使用HTML语法 3.借助第三方软件&#xff08;不建议&#xff0c;操作没那么顺滑&#xff09; 总共分为三种方法 1.使用markdown语法的内联公式 <1>首先需要在设置中勾选Markdown扩展语法下的内联公式&#xff…

【计算机系统结构】重叠方式

&#x1f4dd;本文介绍 本文主要内容位计算机系统结构的重叠方式 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地址…

深入浅出落地应用分析:AI数字人「微软小冰」

hi,各位,今天要聊的是AI小冰,机缘巧合,投递了这家公司的产品,正好最近在看数字人相关的,就详细剖析下这款产品! 前言 小冰,全称为北京红棉小冰科技有限公司,前身为微软(亚洲)互联网工程院人工智能小冰团队,是微软全球最大的人工智能独立产品研发团队。作为微软全…

Redis中的缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常处于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存保护后端存储的意义。…

mysql5.7离线安装 windows

windows上离线安装mysql5.7 下载安装包 去官网下载对应版本的mysql官网 点击archives,接着选择自己要下载的版本&#xff0c;选择windows系统&#xff0c;并根据自己电脑的位数选择相应的版本【找到“此电脑”&#xff0c;鼠标右击&#xff0c;出来下拉框&#xff0c;选择“属性…

【django framework】ModelSerializer+GenericAPIView接口数据流

GenericAPIView数据从序列化到最终返回响应的数据流 // 以ModelSerializergenerics.CreateAPIView为例 程序终归是为了处理数据&#xff0c;怎么处理&#xff0c;以怎样的顺序和方法去处理&#xff0c;就涉及到了具体的业务流程。当我们是用了一个牛掰的框架&#xff0c;发现原…

考察c语言关键字

C语言——关键字 1.问题&#xff1a;简述goto语句的作用 答&#xff1a;无条件跳转 具体来说&#xff0c;其作用在于允许程序在执行时无条件地跳转到指定的标签位置&#xff0c;并从该标签位置继续执行。通过goto语句&#xff0c;可以实现程序流程的无条件转移&#xff0c;使得…

使用PWM实现呼吸灯功能

CC表示的意思位捕获比较&#xff0c;CCR表示的是捕获比较寄存器 占空比等效于PWM模拟出来的电压的多少&#xff0c;占空比越大等效出的模拟电压越趋近于高电平&#xff0c;占空比越小等效出来的模拟电压越趋近于低电平&#xff0c;分辨率表示的是占空比变化的精细程度&#xf…

离线安装docker、docker-compose、Mysql镜像

离线安装docker docker-compose mysql镜像 一、下载docker docker-compose mysql 镜像文件 1、首先下载docker镜像 博主所用文件版本号&#xff1a; docker-23.0.6.tgz 下载docker 地址 &#xff1a;https://blog.csdn.net/xiaohanshasha/article/details/135489623?spm1001…

【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)

&#x1f4d6; 前言&#xff1a;MapReduce是一种分布式并行编程模型&#xff0c;是Hadoop核心子项目之一。实验前需确保搭建好Hadoop 3.3.5环境、安装好Eclipse IDE &#x1f50e; 【Hadoop大数据技术】——Hadoop概述与搭建环境&#xff08;学习笔记&#xff09; 目录 &#…

网络安全,硬防迪云

要减少被攻击的频率&#xff0c;游戏开发者可以采取以下措施&#xff1a; 1. 强化安全措施&#xff1a;确保游戏服务器和用户数据的安全性&#xff0c;加密网络传输&#xff0c;防止黑客攻击和数据泄露。 2. 更新和修复漏洞&#xff1a;定期检查游戏代码和服务器&#xff0c;…

Java学习笔记(14)

常用API Java已经写好的各种功能的java类 Math Final修饰&#xff0c;不能被继承 因为是静态static的&#xff0c;所以使用方法不用创建对象&#xff0c;使用里面的方法直接 math.方法名 就行 常用方法 Abs,ceil,floor,round,max,minm,pow,sqrt,cbrt,random Abs要注意参数的…

【汇编】#5 80x86指令系统其一(数据传送与算术)

文章目录 一、数据传送指令1. 通用数据传送指令1.1 MOV传送指令tips:MOV指令几条特殊规定 1.2 XCHG交换指令1.3 进栈指令PUSH1.4 出栈指令POP1.5 所有寄存器进出栈指令PUSHA/POPAtips:SP特别处理 2. 累加器专用传送指令2.1 输入指令IN2.2 OUT输出指令2.3 IO端口与8086CPU通讯关…