Vue学习笔记-校验IP是否在同一网段
一.IP地址分类
D和E不对民用组织开放,所以我们能使用IP地址的只有ABC三类。
A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是0,B类地址的前两位总是10,C类地址的前三位总是110。
主机号:用于识别该网络中的主机。
A类地址
(1)A类地址第1字节为网络地址,其它3个字节为主机地址。它的第1个字节的第一位固定为0.
(2)A类地址网络号范围:1.0.0.0—126.0.0.0
(3)A类地址中的私有地址和保留地址:
① 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。
范围(10.0.0.0—10.255.255.255)
② 127.X.X.X是保留地址,用做循环测试用的。
B类地址
(1) B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。它的第1个字节的前两位固定为10.
(2) B类地址网络号范围:128.0.0.0—191.255.0.0。
(3) B类地址的私有地址和保留地址
① 172.16.0.0—172.31.255.255是私有地址
② 169.254.X.X是保留地址。
如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。
就会得到其中一个IP。
191.255.255.255是广播地址,不能分配。
C类地址
(1)C类地址第1字节、第2字节和第3个字节为网络地址,第4个字节为主机地址。另外第1个字节的前三位固定为110。
(2)C类地址网络号范围:192.0.0.0—223.255.255.0。
(3)C类地址中的私有地址: 192.168.X.X是私有地址。(192.168.0.0—192.168.255.255)
判断四组IP的第一个数组来确定是哪类。
【注意:127.0.0.1不再里面,是因为它代表当前计算机自己】
二.判断每一类IP是否属于一个网段
1.A类
A类IP用第一个数字来表示不同网段。
例如:1.0.0.0和2.0.0.0是不同的网络。
不同的网络之间要使用路由器,路由器是用来跨网络通信。
但是在同一个网络通信,只用使用交换机就可以。
A类IP的第一个数字相同,而后三个不同,表示在一个网络中的不同的主机。
A类的网段数量只有126个,但是主机数有2^24-2
主机数为什么要减去2? : 因为1.0.0.0代表网络本身,不能分配。而1.255.255.255代表当前网络的广播地址。
2^24是从哪里来的? : 第一个数是8位,后面的是24位。
2.B类
B类IP是前两个数字来表示不同网段。
例如:191.224.0.0和191.154.0.0是不同的网络。
但是191.224.0.0和191.224.255.255是同一个网段中的不同主机。
所以能用的主机数是2^16-2
3.C类
C类IP是前三个数代表不同网段,最后一个数组代表同一个网段中的不同主机。
例如:192.224.0.0和192.224.1.0是不同的网络。
但是192.224.0.0和192.224.0.1是同一个网段中的不同主机。
所以能用的主机数是2^8-2。
三.校验两个IP是否在同一网段
1)基本思路:
要判断两个IP地址是否在同一个网段,将它们的IP地址分别与子网掩码做与运算,得到的结果为网络号,如果网络号相同,就在同一子网,否则,不在同一子网。
2)具体实现:
/**
* [isEqualIPAddress 判断两个IP地址是否在同一个网段]
* @param {[String]} addr1 [地址一]
* @param {[String]} addr2 [地址二]
* @param {[String]} mask [子网掩码]
* @return {Boolean} [true or false]
*/
function isEqualIPAddress (addr1,addr2,mask){
if(!addr1 || !addr2 || !mask){
console.log("各参数不能为空");
return false;
}
var
res1 = [],
res2 = [];
addr1 = addr1.split(".");
addr2 = addr2.split(".");
mask = mask.split(".");
for(var i = 0,ilen = addr1.length; i < ilen ; i += 1){
res1.push(parseInt(addr1[i]) & parseInt(mask[i]));
res2.push(parseInt(addr2[i]) & parseInt(mask[i]));
}
if(res1.join(".") == res2.join(".")){
console.log("在同一个网段");
return true;
}else{
console.log("不在同一个网段");
return false;
}
}