一、IP(ipv4)
IP是Internet Protocol(网际互连协议),是计算机网络体系结构中的网络层协议。
IP协议定义地址是一个32位的地址,(ipv6是128位),使用点分十进制表示法,每8位分开来表示
也就是我们常说的IP地址,例如:30.14.234.254
该地址分为两个部分network+host(网络位+主机位),具体各占几位,不一定。
网络位是指你这个设备是处于哪个网段的,主机位是定位你是当前网络的哪一台设备。
二、IP分类
传统的ip地址分类:
分为A\B\C\D\E五类
abc类是正常使用的地址,
d类为组播地址,e类为保留地址,一般人是不给使用的
这个主要说一下abc类
A 0xxxxxxx.
8个网络位 一般给大型网络使用 有 2的24次方-2 个主机位 主机 地址全0全1不可以用
主机位全0为网络地址 主机位全1为广播地址 发送数据给广播地址 这个网段所有的设备都要去处理数据
B 10xxxxxx.xxxxxxxx. 16个网络位
C 110xxxxx.xxxxxxxx.xxxxxxxx. 24个网络位
D 11110开头
E 111110开头
根据规定各类地址的范围我们是可以算出来的
A 0 0000001~0 11111110 (1-126即 1.0.0.0~126.255.255.255)0和 127整个网段是保留的
B 10 000000~10 111111 (128-191即 128.0.0.0~191.255.255.255)
C 110 00000~110 11111 (192-223即 192.0.0.0~223.255.255.255)
私网地址:
A 整个10网段 即(10.0.0.0~10.255.255.255)
B 127.16-172.31 即(172.16.0.0~127.31.255.255)
C 192.168 即(192.168.0.0~192.168.255.255)
三、vlsm子网划分&掩码
子网掩码也是32位长,网络位为1,主机位为0。
两中表示方法:
点分十进制表示法 255.255.255.0 位计数表示法/24
作用:
子网掩码的作用就是来告诉我们,到底网络位占几个位的
四、子网划分
1+2+4+8+16+32+64=129>128
所以要借7位
列举:
172.16.00000010.0 即172.168.2.0
172.16.00000100.0 即172.168.4.0
172.16.00000110.0 即172.168.6.0
172.16.00001000.0 即172.168.8.0
)
五、判断ip是否为指定网段代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| public class IpUtils {
public static boolean ipIsInNet(String ip, String ipArea) { if ("127.0.0.1".equals(ip) ) { return true; }
if(StringUtils.isBlank(ipArea)){ return false; }
String[] ipArray = ipArea.split(","); for (String s : ipArray) { if(s.equals("0.0.0.0/0")){ return true; } if (!s.contains("/")) { if (s.equals(ip)) { return true; } continue; }
String[] ips = ip.split("\\."); int ipAddress = (Integer.parseInt(ips[0]) << 24) | (Integer.parseInt(ips[1]) << 16) | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]); int type = Integer.parseInt(s.replaceAll(".*/", "")); int mask = 0xFFFFFFFF << (32 - type); String cidrIp = s.replaceAll("/.*", ""); String[] cidrIps = cidrIp.split("\\."); int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24) | (Integer.parseInt(cidrIps[1]) << 16) | (Integer.parseInt(cidrIps[2]) << 8) | Integer.parseInt(cidrIps[3]);
if((ipAddress & mask) == (cidrIpAddr & mask)){ return true; } } return false; }
public static void main(String[] args) { Stopwatch stopwatch = Stopwatch.createStarted(); for (int i=0;i<1;i++ ){ System.out.println(ipIsInNet("45.120.175.250","0.0.0.0/0,123.0.28.0/24,42.120.174.0/23,60.191.28.82"));
} log.info("[耗时:{}]", stopwatch.stop()); }
}
|
————————————————
转载:https://blog.csdn.net/ChengChengxn/article/details/109039175