【问题标题】:How can I determine network and broadcast address from the IP address and subnet mask?如何根据 IP 地址和子网掩码确定网络和广播地址?
【发布时间】:2015-05-16 02:11:26
【问题描述】:

例如:

  • IP地址:130.45.34.36
  • 面具:255.255.240.0

什么是网络 ID/子网地址,以及 广播地址?

【问题讨论】:

  • This two-part answer 解释了一切。
  • 如果您或任何不想手动操作的人可以在this 网站上查看 IPv4 和 IPv6 子网工具。当提供的带有子网掩码的 IP 不是该子网的网络地址时,本网站上的几乎所有工具都会自动计算(更正)网络地址。例如查看 this tool 。 HTH 某人。

标签: networking network-programming ip broadcast subnet


【解决方案1】:

让我们都写成二进制:

130.45.34.36 = 10000010.00101101.00100010.00100100

255.255.240.0 = 11111111.11111111.11110000.00000000

两者之间的按位 AND 将为我们提供网络地址:

10000010.00101101.00100010.00100100   (ip address)
AND
11111111.11111111.11110000.00000000   (subnet mask)
=
10000010.00101101.00100000.00000000 = 130.45.32.0 (the resulting network address)

网络地址和反转子网掩码之间的按位OR将为我们提供广播地址:

10000010.00101101.00100000.00000000   (netadress)
OR
00000000.00000000.00001111.11111111   (inverted subnet mask)
=
10000010.00101101.00101111.11111111 = 130.45.47.255 (broadcast address)

【讨论】:

  • 删除了我的答案,你的答案很完美!
  • 我已经看到允许将“全零”地址(网络地址)用作广播地址的配置选项。但是,我从未见过任何实际配置过的东西。
【解决方案2】:
var network = calculateNetworkIP("192.168.0.101", "255.255.255.0");

var broadcast = calculateBroadcastIP("192.168.0.101", "255.255.255.0");

function calculateNetworkIP(ipAddress, maskIP){

    var binaryIP = convertIPToBinaryIP(ipAddress);
    var maskBinaryIP = convertIPToBinaryIP(maskIP);

    var binaryNetwork = [];
    for (var j = 0; j < maskBinaryIP.length; j++) {
        binaryNetwork.push(bitwiseAND(binaryIP[j], maskBinaryIP[j]));
    }

    var NetworkIPArr = convertBinaryIPToDecIP(binaryNetwork);

    var NetworkIPStr = "";
    for (var k = 0; k < NetworkIPArr.length; k++) {
        NetworkIPStr += NetworkIPArr[k]+".";
    }
    return NetworkIPStr.slice(0, -1);
}

function calculateBroadcastIP(ipAddress, maskIP){

    var binaryIP = convertIPToBinaryIP(ipAddress);
    var maskBinaryIP = convertIPToBinaryIP(maskIP);
    var invertedMark = [];
    for (var i = 0; i < maskBinaryIP.length; i++) {
        invertedMark.push(invertedBinary(maskBinaryIP[i]));
    }

    var binaryBroadcast = [];
    for (var j = 0; j < maskBinaryIP.length; j++) {
        binaryBroadcast.push(bitwiseOR(binaryIP[j], invertedMark[j]));
    }

    var broadcastIPArr = convertBinaryIPToDecIP(binaryBroadcast);

    var broadcastIPStr = "";
    for (var k = 0; k < broadcastIPArr.length; k++) {
        broadcastIPStr += broadcastIPArr[k]+".";
    }
    return broadcastIPStr.slice(0, -1);
}

function invertedBinary(number){

    var no = number+"";
    var noArr = no.split("");
    var newNo = "";
    for(var i = 0; i < noArr.length; i++){
        if(noArr[i] == "0"){
            newNo += "1";
        }else{
            newNo += "0";
        }
    }
    return newNo;
}

function bitwiseAND(firstBinary, secondBinary){

    var firstArr = [];
    var secondArr = [];
    firstArr = firstBinary.split("");
    secondArr = secondBinary.split("");
    var newAdded = "";
    for(var i = 0; i < firstArr.length; i++){
        if(firstArr[i]+"+"+secondArr[i] == "1+0"){
            newAdded += "0";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+1"){
            newAdded += "0";
        }else if(firstArr[i]+"+"+secondArr[i] == "1+1"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+0"){
            newAdded += "0";
        }
    }
    return newAdded;
}

function bitwiseOR(firstBinary, secondBinary){

    var firstArr = [];
    var secondArr = [];
    firstArr = firstBinary.split("");
    secondArr = secondBinary.split("");
    var newAdded = "";
    for(var i = 0; i < firstArr.length; i++){
        if(firstArr[i]+"+"+secondArr[i] == "1+0"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+1"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "1+1"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+0"){
            newAdded += "0";
        }
    }
    return newAdded;
}

function convertBinaryIPToDecIP(binaryIPArr){

    var broadcastIP = [];
    for (var i = 0; i < binaryIPArr.length; i++) {
        broadcastIP.push(parseInt(parseInt(binaryIPArr[i]), 2));
    }
    return broadcastIP;
}

function convertIPToBinaryIP(ipAddress) {

    var ipArr = ipAddress.split(".");
    var binaryIP = [];
    for (var i = 0; i < ipArr.length; i++) {
        var binaryNo = parseInt(ipArr[i]).toString(2);
        if(binaryNo.length == 8){
            binaryIP.push(binaryNo);
        }else{
            var diffNo = 8 - binaryNo.length;
            var createBinary = '';
            for (var j = 0; j < diffNo; j++) {
               createBinary += '0';
            }
            createBinary += binaryNo;
            binaryIP.push(createBinary);
        }
    }
   return binaryIP; 
}

【讨论】:

    【解决方案3】:

    基于 Malt 回答的代码示例:

    const
        ipadr = '130.45.34.36',
        subnet = '255.255.240.0',
        ipadrs = ipadr.split('.'),
        subnets = subnet.split('.');
    
    let networks = [],
        broadcasts = [];
    
    for (let i in ipadrs) {
        networks[i] = ipadrs[i] & subnets[i];
    }
    
    console.log('netaddress: ', networks.join('.')) // netaddress:  130.45.32.0
    
    for (let i in networks) {
        broadcasts[i] = networks[i] | ~subnets[i] + 256;
    }
    
    console.log('broadcast address: ', broadcasts.join('.')) // broadcast address:  130.45.47.255
    

    【讨论】:

      【解决方案4】:

      获取netwotk地址后计算广播地址的另一个捷径是:

      1. 计算主机总数(在本例中为 2^12 = 4096)

      2. 将其除以 256(在本例中为 16)并将结果 - 1(在本例中为 15)添加到 *对应的八位字节(在本例中为第二个八位字节,即 32+15=47) 并将其他八位字节设为 255

      *我们可以通过查看主机数量来获得相应的八位字节。例如,如果主机数量大于 256,那么我们必须将其添加到网络地址的第二个八位字节等等

      【讨论】:

        【解决方案5】:

        打字稿版本

        function getBroadcastAddress({ address, netmask }: NetworkInterfaceInfo) {
          const addressBytes = address.split(".").map(Number);
          const netmaskBytes = netmask.split(".").map(Number);
          const subnetBytes = netmaskBytes.map(
            (_, index) => addressBytes[index] & netmaskBytes[index]
          );
          const broadcastBytes = netmaskBytes.map(
            (_, index) => subnetBytes[index] | (~netmaskBytes[index] + 256)  
          );
          return broadcastBytes.map(String).join(".")
        }
        
        /*
          // test
          getBroadcastAddress({ address: "192.168.1.93", netmask: "255.255.255.0" }) == '192.168.1.255'
        */
        

        【讨论】:

          猜你喜欢
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 2012-06-28
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 2012-01-22
          • 1970-01-01
          相关资源
          最近更新 更多