LLwanran / front_end_studying

前端知识要点
https://llwanran.github.io/front_end_studying/
2 stars 1 forks source link

判断两个网络地址是否属于同一个子网掩码(主要针对IPv4地址)?(北京搜狗1面) #39

Open LLwanran opened 5 years ago

LLwanran commented 5 years ago

【IP地址范围】 0.0.0.0 ~ 255.255.255.255 包括了mask地址

【IP地址划分】

如果没有进行子网划分, A类网络的子网掩码为255.0.0.0, B类网络的子网掩码为255.255.0.0, C类网络的子网掩码为255.255.255.0, 缺省情况子网掩码为255.255.255.0

【基本思路】 要想在同一网段,必须做到网络标识相同,那网络标识怎么算呢? 各类IP的网络标识取法都是不一样的。 A类的,只取第一段。B类,只取第一、二段。C类,只取第一、二、三段。

那么要判断两个IP地址是否在同一个网段,将它们的IP地址分别与子网掩码做与运算,得到的结果为网络号,如果网络号相同,就在同一子网,否则,不在同一子网。

/**
 * 判断两个IP地址是否在同一个网段
 * @param  {[String]}  addr1 [地址一]
 * @param  {[String]}  addr2 [地址二]
 * @param  {[String]}  mask  [子网掩码]
 * @return {Boolean}         [true or false]
 */
function isEqualIPAddress(addr1, addr2, mask) {
    if (!addr1 || !addr2 || !mask) {
        return false;
    }
    let res1 = [];
    let res2 = [];
    addr1 = addr1.split(".");
    addr2 = addr2.split(".");
    mask = mask.split(".");
    for (let 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(".")) {
        return true;
    } else {
        return false;
    }
}

addr1 = "172.28.4.42";
addr2 = "172.21.42.42";
mask = "255.255.255.0";
isEqualIPAddress(addr1, addr2, mask);