概述
文章目录
- 前言
- 1、存储单位转换
- 1.1、把 2^32^ 每一种可能存储一遍
- 2、本文基于 IPV4
- 2.1、IPV4 地址长度
- 3、 IPV4 的5类IP
- 3.1、分类基本概况
- 3.2、IPV4 分类和个数
- 3.3、特殊IP-保留地址
- 4、IPV4 地址格式转化、类型判断工具类
- 参考
前言
IPV4 有5种分类,分配规定了公有地址、私有地址(局域网内分配),记忆保留地址。
本文主要介绍 IPV4 的分类特点,对于这种分类规则的实际应用请移步 现实生活中 IPV4 的分配
1、存储单位转换
2 10 = 1024
1GB=1024 MB=1024 * 1024 KB=1024 * 1024 * 1024 Byte=230 Byte
中文名称 | 符号 | 单位转化 | 备注 |
---|---|---|---|
吉 | GB | 1 千兆字节(GB)=1024 兆字节(MB)=210(MB) | 1g= 210 MB = 2 20 KB = 2 30 Byte |
兆 | MB | 1 兆字节(MB)=1024 千字节(KB)=210(KB) | 1MB=210 KB=2 20 Byte |
千字节 | KB | 1 千字节(KB)=1024 字节(Byte)=210(Byte) | 1KB=210 Byte |
字节 | Byte | 1 字节(Byte)=8 比特(bit) | 1bit就是1位,比如IP地址32位,就是需要32bit,4Byte |
1.1、把 232 每一种可能存储一遍
IPV4 一个ip 需要 4Byte存储空间,如果把32位空间做全排列并存储,需要的空间为 16GB,但是由于IP地址分类,实时上一台服务器实际能出现的ip数在100万左右。
Ipv4个数 | 存储空间 |
---|---|
1个 ip | 4 Byte |
232个ip | 230 * 2 2 * 4 Byte=16g |
2、本文基于 IPV4
2.1、IPV4 地址长度
IPV4 地址由 32个二进制数字组成,即4个字节;
由于二进制的可读性差,所以人们习惯把每一个字节的二进制数字转化为10进制数字,形如 127.0.0.1 。
其它基础概念比如 网络地址
、主机地址
、子网掩码
等请参考 计算机网络常见概念
3、 IPV4 的5类IP
3.1、分类基本概况
事实上,有很多资料将主机地址中全0和全1的去除,但是这不表示这类地址没有归属,当然,如果我们讨论的问题变为你可以为你本机分配的 ip 分类展示的话,我会考虑那种方式。所以我选择了将之保留的版本,并将这些特殊ip在下面单独进行说明。
此外,使用 CIDR 方式时更加自由,不会再局限于地址分类,当然,你可以探究分类结束后地址属于原先分类的哪一个里面
类别 | 前缀位 | 网络地址位数 | 主机地址位数 | 起始地址 | 结束地址 | 默认子网掩码 | 对应CIDR修饰 | 备注 |
---|---|---|---|---|---|---|---|---|
A | 0 | 8位 | 24位 | 0.0.0.0 | 127.255.255.255 | 255.0.0.0 | /8 | |
B | 10 | 16 | 16 | 128.0.0.0 | 191.255.255.255 | 255.255.0.0 | /16 | |
C | 110 | 24 | 8 | 192.0.0.0 | 223.255.255.255 | 255.255.255.0 | /24 | |
D | 1110 | 无此概念 | 无此概念 | 224.0.0.0 | 239.255.255.255 | 未定义 | /4 | 它并不指向特定的网络,目前这一类地址被用在多点广播中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机 |
E | 1111 | 无此概念 | 无此概念 | 240.0.0.0 | 255.255.255.255 | 未定义 | /4 | 保留用于将来和实验使用 |
3.2、IPV4 分类和个数
1、 28 = 258;27 = 128
2、 二进制转10进制:Integer.parseInt(“1010”,2);
3、Java 计算2 的10次幂: 1<<10 或者 2<<9 或者 (int)Math.pow(2,10)
- IPV4 总数为 4294967294=232 约等于 43亿,其中 A类含公网地址约21亿,B类含公网地址约10.1亿,C类含公网地址约5.3亿,ABC共含公网地址约 36.4亿。
- 如果把所有可能的IPV4存储一遍,需要空间为 Math.pow(2,32)*32/1024/1024/1024 = 128GB.
- 如果使用 bitMap 的思路,每一个IPV4只占用1bit,则需要存储空间为 Math.pow(2,32)/1024/1024/1024 = 4GB.
类别 | 前缀位 | 起始地址 | 结束地址 | 网段(网络地址)数 | 单段IP数 | 无差别IP数 | 私网地址(IP个数) | 公网地址(IP个数) | 特殊地址(用途-个数) | net_id不为0,host_id全为1 | net_id不为0,host_id全为0 |
---|---|---|---|---|---|---|---|---|---|---|---|
A | 0 | 0.0.0.0 | 127.255.255.255 | 128=27 | 224 | 2147483648=27*224=231 | 10.0.0.0/8(224) | 231-224-224-27-27+2=2 113 928 962 约 21亿 | 0.0.0.0(保留地址-1)127.0.0.0/8(回送测试-224) 除127.0.0.0 和 127.255.255.255 其余 127.X.X.X 表本机 | 一个网段一个,表示本网段所有机器 | 一个网段一个仅表示本网段 |
B | 10 | 128.0.0.0 | 191.255.255.255 | 16384=214 | 216 | 1073741824=214*216=230 | 172.16.0.0/12(220) | 230-220-216-214-214=1 072 594 944 约 10.1亿 | 169.254.0.0/16(Link local地址-216) | 一个网段一个,表示本网段所有机器 | 一个网段一个仅表示本网段 |
C | 110 | 192.0.0.0 | 223.255.255.255 | 2097152=221 | 28 | 536870912=221*28=229 | 192.168.0.0/16(216) | 229-216-221-221=532 611 072 约 5.3亿 | 一个网段一个,表示本网段所有机器 | 一个网段一个仅表示本网段 | |
D | 1110 | 224.0.0.0 | 239.255.255.255 | 无网络地址概念 | 无hostIp概念 | 268435456=228 | |||||
E | 1111 | 240.0.0.0 | 255.255.255.255 | 无网络地址概念 | 无hostIp概念 | 268435456=228 | 255.255.255.255(网络层广播地址-1) |
- 附 Java 计算公网地址
public static void main(String[] args) {
//A类 公网地址数
System.out.println(Math.pow(2,31)-Math.pow(2,24)-Math.pow(2,24)-Math.pow(2,7)
-Math.pow(2,7)+2);//2 113 928 962 约 21亿
//B类 公网地址数
System.out.println(Math.pow(2,30)-Math.pow(2,20)-Math.pow(2,16)-Math.pow(2,14)
-Math.pow(2,14));//1 072 594 944 约 10.1亿
//C类 公网地址数
System.out.println(Math.pow(2,29)-Math.pow(2,16)-Math.pow(2,21)-Math.pow(2,21)
);//532 611 072 约 5.3亿
}
3.3、特殊IP-保留地址
-0.0.0.0
:保留地址,表示所有不清楚的主机和目的网络,这里的不清楚是指在本机的路由表里没有特定条目指明如何到达。
-255.255.255.255
:保留地址,有限广播地址
,用于本网广播,向该地址发送信息,本同 net_id 下所有ip都会收到。一般用于不清楚所处网段的时候,部分设备有使用限制,导致广播失败,所以建议直接使用直接广播地址
。
-net_id不为0,host_id全为1
:保留地址,直接广播地址
,比如 192.255.255.255
。用于本网广播,向该地址发送信息,本同 net_id 下所有ip都会收到。
-net_id 不为0 host_id 全为0
:保留地址,仅表示网络,比如127.0.0.0
,192.0.0.0
不能作为 ip 地址看待。
-127.0.0.0 到 127.255.255.255
:保留地址,用做循环测试使用,除了 127.0.0.0
和127.255.255.255
,127.X.X.X
都表示本机自己。
>到这里可以理解 主机地址(host_id)
全0 用于作为网段标识,主机地址(host_id)
全1用于作为本网段的直接广播地址
,都不能作为具体主机的ip!
-10.0.0.0到10.255.255.255
:保留地址,属于A类地址,在互联网上不使用,而被用在局域网络中的地址,即私有地址。
-172.16.0.0到172.31.255.255
:保留地址,属于B类地址,在互联网上不使用,而被用在局域网络中的地址,即私有地址。
-192.168.0.0到192.168.255.255
:保留地址,属于C类地址,在互联网上不使用,而被用在局域网络中的地址,即私有地址。
-169.254.0.0到169.254.255.255
:保留地址,属于B类地址,如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.1到169.254.255.254中临时获得一个IP地址。
>到这里可以理解A、B、C类地址都有私有地址。A类10.0.0.0到10.255.255.255
、B类172.16.0.0到172.31.255.255
和169.254.0.0到169.254.255.255
、C类192.168.0.0到192.168.255.255
4、IPV4 地址格式转化、类型判断工具类
import lombok.experimental.UtilityClass;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @Title:IPV4 类型判断格式转化 Util
* @Description:
* @Analysis:
* @Copyright: Copyright(c)2022
* @Company: bestcxx
* @Author: jie.wu
* @Version: v1.0
*/
@UtilityClass
public class IPV4utils {
static Map<String,String> map = new HashMap();
static{
map.put("00","A-00");
map.put("01","A-01");
map.put("10","B-10");
map.put("110","C-110");
map.put("1110","D-1110");
map.put("1111","E-1111");
}
public String transferIPV4ToBinaryStr(String IPV4){
String[] parts = IPV4.split("\.");
if(parts.length!=4){
System.out.println("输出IP不是IPV4:"+IPV4);
return "";
}
//先转10进制
int v0 = Integer.valueOf(parts[0])<<24;
int v1 = Integer.valueOf(parts[1])<<16;
int v2 = Integer.valueOf(parts[2])<<8;
int v3 = Integer.valueOf(parts[3]);
return Integer.toBinaryString(v0+v1+v2+v3);
}
/**
* 二进制补足前面的0
* @param binaryString
* @param totalSize
* @return
*/
public String binaryStringWithPreZero(String binaryString,int totalSize){
int zeroNumber = totalSize-binaryString.length();
if(zeroNumber>0){
StringBuilder sbd = new StringBuilder();
while(zeroNumber>0){
zeroNumber--;
sbd.append("0");
}
sbd.append(binaryString);
return sbd.toString();
}
return binaryString;
}
public long transferIPV4ToLong(String IPV4){
String[] parts = IPV4.split("\.");
if(parts.length!=4){
System.out.println("输出IP不是IPV4:"+IPV4);
return 0;
}
//先转10进制
long v0 = Long.valueOf(parts[0])<<24;
long v1 = Long.valueOf(parts[1])<<16;
long v2 = Long.valueOf(parts[2])<<8;
long v3 = Long.valueOf(parts[3]);
return v0+v1+v2+v3;
}
public String adapterType(String ip){
String first = ip.substring(0, ip.indexOf("."));
String binaryStr = binaryStringWithPreZero(Integer.toBinaryString(Integer.valueOf(first)),8);
String key = map.keySet().stream()
.filter(Objects::nonNull)
.filter(item->binaryStr.indexOf(item)==0)
.findFirst()
.orElse(null);
return map.get(key);
}
public static void main(String[] args) {
String IPV4="255.255.255.255";
System.out.println(IPV4utils.adapterType(IPV4));
System.out.println(IPV4utils.transferIPV4ToLong(IPV4));
System.out.println(binaryStringWithPreZero(IPV4utils.transferIPV4ToBinaryStr(IPV4),32));
}
}
参考
https://zh.wikipedia.org/wiki/%E5%88%86%E7%B1%BB%E7%BD%91%E7%BB%9C
https://jingyan.baidu.com/article/86fae346b7e6603c49121ae0.html
https://baike.baidu.com/item/%E7%A7%81%E6%9C%89%E5%9C%B0%E5%9D%80/727338?fr=aladdin
https://zhidao.baidu.com/question/42946534.html
https://www.ngui.cc/el/1412832.html?action=onClick
最后
以上就是从容芒果为你收集整理的3.2、IPV4 的地址分类的全部内容,希望文章能够帮你解决3.2、IPV4 的地址分类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复