1. IP地址的分类
IP地址共分为五类,分别是A、B、C三类及特殊地址 D、E,全0和全1的都保留不用
分类 | 地址范围 | 私有IP地址范围 |
A | 1.0.0.1-127.255.255.254 | 10.0.0.0-10.255.255.255 |
B | 128.0.0.1-191.255.255.254 | 172.16.0.0-172.31.255.255 |
C | 192.0.0.1-223.255.255.254 | 192.168.0.0-192.168.255.255 |
D | 多播地址 | |
E | 保留地址 |
2. 127环回地址
通常我们认为 127.0.0.1
为本地回环地址,但是 127.0.0.1---127.255.255.254
也是回环地址,这点很容易被忽略,环回地址是一个虚拟地址,它不属于任何网络,而是指向自己的计算机。
3. ipv4和ipv6区别
ipv4 是目前主流的IP地址,在2019年11月26日,全球所有43亿个IPv4地址已分配完毕。IPV4 通常写作点分十进制的形式,即四个字节被分开用十进制写出,中间用点分隔。例如 xxx.xxx.xxx.xxx。
值得注意的是:在点分格式中,每个字节都可用任意的进制表达,如,192.0x00.0002.235是一种合法(但不常用)的表示。也可以整体的使用某个进制表示。
即我可以在浏览器中直接输入IP地址的十进制数字就可以访问这个IP
IPv6的128位地址通常写成8组,每组为四个十六进制数的形式。比如:
AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一个合法的IPv6地址。如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,上述地址就可写成AD80::ABAA:0000:00C2:0002。
只能简化一次,目前很多网站都已支持了ipv6,很多数据库、中间件也都支持配置ipv6 地址
4. IP和数字的转换,模拟生成连续的IP
将IPV4 的地址转换成十进制,然后for循环遍历,生成连续的IP,此方法也可用于IP地址排序
/** * IP地址转数字 * @param ipStr * @return */ public static long ip2Long( String ipStr) { String[] ip = ipStr.split("\."); return (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16) + (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]); } /** * 数字转IP地址 * @param ipLong * @return */ public static String long2Ip(long ipLong) { StringBuilder ip = new StringBuilder(); ip.append(ipLong >>> 24).append("."); ip.append((ipLong >>> 16) & 0xFF).append("."); ip.append((ipLong >>> 8) & 0xFF).append("."); ip.append(ipLong & 0xFF); return ip.toString(); } public static List<String> generateIp(String startIp, String endIp){ List<String> iplist = new ArrayList<>(); long start = IpUtil.ip2Long(startIp); long end = IpUtil.ip2Long(endIp); for (long i = start; i <= end; i++) { iplist.add(IpUtil.long2Ip(i)); } return iplist; }
测试方法:
public static void main(String[] args) { List<String> ipList = IpUtil.generateIp("172.168.0.251", "172.168.1.2"); System.out.println(ipList); }
输出结果:
[172.168.0.251, 172.168.0.252, 172.168.0.253, 172.168.0.254, 172.168.0.255, 172.168.1.0, 172.168.1.1, 1