3.2、IPV4 的地址分类

前言

IPV4 有5种分类,分配规定了公有地址、私有地址(局域网内分配),记忆保留地址。
本文主要介绍 IPV4 的分类特点,对于这种分类规则的实际应用请移步 现实生活中 IPV4 的分配

1、存储单位转换

2 10 = 1024
1GB=1024 MB=1024 * 1024 KB=1024 * 1024 * 1024 Byte=230 Byte

中文名称符号单位转化备注
GB1 千兆字节(GB)=1024 兆字节(MB)=210(MB)1g= 210 MB = 2 20 KB = 2 30 Byte
MB1 兆字节(MB)=1024 千字节(KB)=210(KB)1MB=210 KB=2 20 Byte
千字节KB1 千字节(KB)=1024 字节(Byte)=210(Byte)1KB=210 Byte
字节Byte1 字节(Byte)=8 比特(bit)1bit就是1位,比如IP地址32位,就是需要32bit,4Byte

在这里插入图片描述

1.1、把 232 每一种可能存储一遍

IPV4 一个ip 需要 4Byte存储空间,如果把32位空间做全排列并存储,需要的空间为 16GB,但是由于IP地址分类,实时上一台服务器实际能出现的ip数在100万左右。

Ipv4个数存储空间
1个 ip4 Byte
232个ip230 * 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修饰备注
A08位24位0.0.0.0127.255.255.255255.0.0.0/8
B101616128.0.0.0191.255.255.255255.255.0.0/16
C110248192.0.0.0223.255.255.255255.255.255.0/24
D1110无此概念无此概念224.0.0.0239.255.255.255未定义/4它并不指向特定的网络,目前这一类地址被用在多点广播中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机
E1111无此概念无此概念240.0.0.0255.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亿,A\B\C共含公网地址约 36.4亿。
  • 如果把所有可能的IPV4存储一遍,需要空间为 Math.pow(2,32)*32/1024/1024/1024 = 128GB.
  • 如果使用 bitMap 的思路,每一个IPV4只占用1bit,则需要存储空间为 Math.pow(2,32)/1024/1024/1024 = 4GB.
  • 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
类别前缀位起始地址结束地址网段(网络地址)数单段IP数无差别IP数私网地址(IP个数)公网地址(IP个数)特殊地址(用途-个数)net_id不为0,host_id全为1net_id不为0,host_id全为0
A00.0.0.0127.255.255.255128=272242147483648=27*224=23110.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 表本机一个网段一个,表示本网段所有机器一个网段一个仅表示本网段
B10128.0.0.0191.255.255.25516384=2142161073741824=214*216=230172.16.0.0/12(220)230-220-216-214-214=1 072 594 944 约 10.1亿169.254.0.0/16(Link local地址-216一个网段一个,表示本网段所有机器一个网段一个仅表示本网段
C110192.0.0.0223.255.255.2552097152=22128536870912=221*28=229192.168.0.0/16(216229-216-221-221=532 611 072 约 5.3亿一个网段一个,表示本网段所有机器一个网段一个仅表示本网段
D1110224.0.0.0239.255.255.255无网络地址概念无hostIp概念268435456=228
E1111240.0.0.0255.255.255.255无网络地址概念无hostIp概念268435456=228255.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.0127.255.255.255127.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.255169.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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值