🍰 子网划分和CIDR:网络的"切蛋糕"艺术

118 阅读5分钟

知识点编号:022
难度等级:⭐⭐⭐(必掌握)
面试频率:🔥🔥🔥🔥


🎯 一句话总结

子网划分就像切蛋糕,把大网络切成小网络;CIDR就是灵活的切法!🍰


🔪 什么是子网划分?

问题:
一个C类网络:192.168.1.0/24
可以有254个主机
但我只需要50个主机,剩下的浪费了!

解决:子网划分
把一个大网络分成多个小网络

比喻:
一个大蛋糕(254人份)
切成4个小蛋糕(每个60人份)
更灵活!

📐 子网掩码

什么是子网掩码?

作用:区分网络号和主机号

示例:192.168.1.10/24

IP地址:  192.168.1.10
二进制:   11000000.10101000.00000001.00001010

子网掩码:255.255.255.0
二进制:   11111111.11111111.11111111.00000000
          ↑________________________↑  ↑______↑
                网络号(24位)         主机号(8位)

网络号:  192.168.1.0
主机号:  10
广播地址:192.168.1.255

常见子网掩码

/8  = 255.0.0.0        (A类默认)
/16 = 255.255.0.0      (B类默认)
/24 = 255.255.255.0    (C类默认,最常见)
/25 = 255.255.255.128
/26 = 255.255.255.192
/27 = 255.255.255.224
/28 = 255.255.255.240
/29 = 255.255.255.248
/30 = 255.255.255.252  (点对点连接)

🍰 子网划分示例

示例:把192.168.1.0/24分成4个子网

原网络:
192.168.1.0/24
主机数:254个

需求:分成4个子网

计算:
4个子网需要2位(2^2 = 4)
原来主机位8位,借2位给网络
新子网掩码:/26(24 + 2)

子网1:192.168.1.0/26
  - 范围:192.168.1.0 ~ 192.168.1.63
  - 可用:192.168.1.1 ~ 192.168.1.62(62个主机)
  - 广播:192.168.1.63

子网2:192.168.1.64/26
  - 范围:192.168.1.64 ~ 192.168.1.127
  - 可用:192.168.1.65 ~ 192.168.1.126
  - 广播:192.168.1.127

子网3:192.168.1.128/26
  - 范围:192.168.1.128 ~ 192.168.1.191
  - 可用:192.168.1.129 ~ 192.168.1.190
  - 广播:192.168.1.191

子网4:192.168.1.192/26
  - 范围:192.168.1.192 ~ 192.168.1.255
  - 可用:192.168.1.193 ~ 192.168.1.254
  - 广播:192.168.1.255

🌐 CIDR(无类域间路由)

什么是CIDR?

传统分类(有类):
- A类:/8固定
- B类:/16固定
- C类:/24固定
太死板!浪费地址!

CIDR(无类):
- 可以是任意长度:/1 ~ /32
- 灵活划分
- 节省地址

示例:
需要500个主机
- 有类:必须用B类(65534个,浪费!)
- 无类:用/23(510个主机,刚好)

CIDR表示法:
192.168.1.0/24
      ↑       ↑
    网络地址  掩码长度

CIDR计算

公式:
主机数 = 2^(32-掩码长度) - 2

示例:
/24:2^(32-24) - 2 = 2^8 - 2 = 254个主机
/25:2^(32-25) - 2 = 2^7 - 2 = 126个主机
/26:2^(32-26) - 2 = 2^6 - 2 = 62个主机
/27:2^(32-27) - 2 = 2^5 - 2 = 30个主机
/28:2^(32-28) - 2 = 2^4 - 2 = 14个主机
/29:2^(32-29) - 2 = 2^3 - 2 = 6个主机
/30:2^(32-30) - 2 = 2^2 - 2 = 2个主机

💻 Java代码示例

public class SubnetCalculator {
    
    /**
     * 计算网络地址
     */
    public static String getNetworkAddress(String ip, int cidr) {
        long ipLong = ipToLong(ip);
        long mask = ~((1L << (32 - cidr)) - 1);
        long network = ipLong & mask;
        return longToIp(network);
    }
    
    /**
     * 计算广播地址
     */
    public static String getBroadcastAddress(String ip, int cidr) {
        long ipLong = ipToLong(ip);
        long mask = ~((1L << (32 - cidr)) - 1);
        long network = ipLong & mask;
        long broadcast = network | ~mask;
        return longToIp(broadcast);
    }
    
    /**
     * 计算可用主机数
     */
    public static int getHostCount(int cidr) {
        return (int) Math.pow(2, 32 - cidr) - 2;
    }
    
    /**
     * IP转Long
     */
    private static long ipToLong(String ip) {
        String[] parts = ip.split("\\.");
        long result = 0;
        for (int i = 0; i < 4; i++) {
            result = (result << 8) | Integer.parseInt(parts[i]);
        }
        return result;
    }
    
    /**
     * Long转IP
     */
    private static String longToIp(long ip) {
        return String.format("%d.%d.%d.%d",
            (ip >> 24) & 0xFF,
            (ip >> 16) & 0xFF,
            (ip >> 8) & 0xFF,
            ip & 0xFF
        );
    }
    
    public static void main(String[] args) {
        String ip = "192.168.1.10";
        int cidr = 24;
        
        System.out.println("IP地址:" + ip + "/" + cidr);
        System.out.println("网络地址:" + getNetworkAddress(ip, cidr));
        System.out.println("广播地址:" + getBroadcastAddress(ip, cidr));
        System.out.println("可用主机数:" + getHostCount(cidr));
    }
}

// 输出:
// IP地址:192.168.1.10/24
// 网络地址:192.168.1.0
// 广播地址:192.168.1.255
// 可用主机数:254

🐛 常见面试题

Q1:什么是子网划分?如何划分?

答案:

子网划分是将一个大网络分成多个小网络。

目的:
1. 节省IP地址
2. 提高网络性能(减少广播域)
3. 便于管理

划分方法:
1. 确定需要的子网数量
2. 计算需要借用的位数:n位可以分2^n个子网
3. 新掩码 = 原掩码 + 借用位数
4. 计算每个子网的范围

示例:192.168.1.0/24分成4个子网
- 需要2位(2^2=4)
- 新掩码:/26
- 子网大小:64个地址

子网1:192.168.1.0/26   (0-63)
子网2:192.168.1.64/26  (64-127)
子网3:192.168.1.128/26 (128-191)
子网4:192.168.1.192/26 (192-255)

Q2:CIDR是什么?有什么优势?

答案:

CIDR(Classless Inter-Domain Routing)
无类域间路由

传统分类的问题:
- A类:1677万主机(太大,浪费)
- B类:65534主机(中等)
- C类:254主机(太小)
- 只能选这三种,不灵活

CIDR的优势:
1. 灵活划分
   - 可以是任意长度:/1 ~ /32
   - 按需分配,不浪费

2. 减少路由表大小
   - 路由聚合
   - 多个网络合并成一条路由

3. 延缓IPv4地址耗尽
   - 更高效利用地址空间

表示法:
IP地址/掩码长度
例如:192.168.1.0/24

计算主机数:
2^(32-掩码长度) - 2

例如:
/24: 2^8 - 2 = 254
/25: 2^7 - 2 = 126
/26: 2^6 - 2 = 62

📊 快速参考表

CIDR子网掩码主机数用途
/8255.0.0.016,777,214超大型网络
/16255.255.0.065,534大型网络
/24255.255.255.0254最常见
/25255.255.255.128126中型办公室
/26255.255.255.19262小型办公室
/27255.255.255.22430小团队
/28255.255.255.24014很小的网络
/30255.255.255.2522点对点连接
/32255.255.255.2551单个主机

🎓 总结

子网划分和CIDR的关键点:

  1. 子网划分:把大网络分成小网络
  2. 子网掩码:区分网络号和主机号
  3. CIDR:灵活的、无类的划分方式
  4. 计算:主机数 = 2^(32-掩码) - 2

记忆口诀

借位划分子网络 🔪
CIDR灵活又高效 ⚡
掩码决定主机数 📏
二的幂次减去二 ➖

文档创建时间:2025-10-31