CIDR 是什麼?快速了解標記格式以及如何計算 IP 地址和遮罩

CIDR 是什麼?

CIDR 代表 Classless Inter-Domain Routing(無類別間路由),它是一種網路編址和路由的方法,通過使用可變長度子網路遮罩,提供了更靈活和有效的 IP 地址配置方式,並改善了路由表的管理。在傳統的網際網路編址方案中,使用了分類編址(Classful Addressing)的方法,將 IP 地址劃分為不同的類別(Class A、Class B、Class C 等)。然而,這種方法浪費了大量的 IP 地址,且不靈活,無法適應不同規模的網路需求。

CIDR 的出現解決了這個問題,它使用了可變長度子網路遮罩(Variable Length Subnet Mask,簡稱 VLSM)的概念,將 IP 地址劃分為更小的網路區塊。CIDR 使用 CIDR 地址表示法,例如,192.168.0.0/16,其中斜線後面的數字表示子網路遮罩的位數,即該網段中用於網路部分的位數。

CIDR 提供了更靈活和有效的 IP 地址配置方法。它允許網路管理者更精細地劃分 IP 地址,根據實際需求分配 IP 地址給不同的網路。同時,CIDR 還提供了更有效的路由表達方法,減少了路由表的大小,提高了路由效率。

CIDR地址中子網路遮罩位數

觀察 CIDR 地址的格式。CIDR 地址由 IP 地址和斜線後面的數字組成,例如,192.168.0.0/16。

確定 IP 地址的類型。根據 IP 地址的類型,可以確定預設的子網路遮罩位數。以下是各個類別的預設子網路遮罩位數:

  • Class A:預設子網路遮罩位數為 8。
  • Class B:預設子網路遮罩位數為 16。
  • Class C:預設子網路遮罩位數為 24。

確定 CIDR 地址中斜線後面的數字。這個數字表示子網路遮罩的位數,即用於網路部分的位數。

計算子網路遮罩位數。子網路遮罩位數可以通過預設的子網路遮罩位數加上斜線後面的數字來計算。例如,如果 CIDR 地址是 192.168.0.0/16,那麼子網路遮罩位數為 16。

如何計算 CIDR 的 IP 範圍?

當 CIDR 地址是 10.0.0.0/24 時,子網路遮罩位數為 24。這表示 IP 地址的前 24 位用於網路部分,後面的 8 位用於主機部分。

以二進位表示,子網路遮罩為 11111111.11111111.11111111.00000000。將這個二進位值轉換回十進位,即可得到子網路遮罩的位數。

計算過程如下:

11111111.11111111.11111111.00000000 轉換為十進位為 255.255.255.0

因此,CIDR 地址 10.0.0.0/24 的子網路遮罩位數為 24,對應的子網路遮罩是 255.255.255.0。這表示前 24 位為網路部分,後面的 8 位為主機部分。

IP 範圍計算:

網路地址:10.0.0.0
廣播地址:10.0.0.255
第一個可用地址:10.0.0.1
最後一個可用地址:10.0.0.254

可用位置數計算:

可用位置數等於總共的主機數量減去網路地址和廣播地址兩個保留的位置。在這個例子中,可用位置數為 254。

JavaScript CIDR 計算範例程式碼

function calculateCIDR(cidr) {
  const cidrParts = cidr.split('/');
  const baseIP = cidrParts[0];
  const subnetMaskBits = parseInt(cidrParts[1]);

  // 計算子網路遮罩
  const subnetMask = (0xFFFFFFFF << (32 - subnetMaskBits)) >>> 0;

  // 計算網路地址
  const networkAddress = (ipToNumber(baseIP) & subnetMask) >>> 0;

  // 計算廣播地址
  const broadcastAddress = (networkAddress | ~subnetMask) >>> 0;

  // 計算可用位置數
  const availableHosts = (broadcastAddress - networkAddress - 1) >>> 0;

  // 將數字 IP 轉換為點分十進位表示
  function numberToIP(number) {
    return [(number >>> 24) & 0xFF, (number >>> 16) & 0xFF, (number >>> 8) & 0xFF, number & 0xFF].join('.');
  }

  // 將點分十進位 IP 轉換為數字表示
  function ipToNumber(ip) {
    return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;
  }

  const ipRange = `${numberToIP(networkAddress)} - ${numberToIP(broadcastAddress)}`;

  return {
    networkAddress: numberToIP(networkAddress),
    broadcastAddress: numberToIP(broadcastAddress),
    ipRange: ipRange,
    availableHosts: availableHosts
  };
}

// 使用範例
const cidr = '10.0.0.0/24';
const result = calculateCIDR(cidr);
console.log('CIDR:', cidr);
console.log('Network Address:', result.networkAddress);
console.log('Broadcast Address:', result.broadcastAddress);
console.log('IP Range:', result.ipRange);
console.log('Available Hosts:', result.availableHosts);