前言
最近在学习《网络协议分析》时,遇到了一道比较典型的 IP 子网规划问题:
某公司有 400 台主机,希望平均分布在两层楼进行管理,每层楼约 200 台,并且要求这 400 台主机全部属于同一个子网。已知给出的 IP 地址为
192.128.0.3,应该如何规划 IP 地址?子网掩码应该是多少?两层楼分别使用什么 IP 地址范围?网关又应该如何设置?
刚看到这道题时,我们的第一反应是:既然题目说的是 C 类 IP 地址,那么是不是直接使用默认子网掩码255.255.255.0就可以了?
真正计算后才发现,事情没有这么简单。
一个/24网络最多只有 254 个可用主机地址,而现在有 400 台主机,还需要给网关预留地址,因此/24根本不够。
这篇博客记录一下完整的分析和计算过程,同时总结几个在做这道题时比较容易弄混的地方。
一、先明确问题:到底需要多少个 IP 地址?
公司的基本需求是:
主机数量:400 台
楼层数量:2 层
每层:约 200 台
所有主机:必须属于同一个子网
还需要设置默认网关
因此,不能简单地把两层楼分别划成两个独立子网。
我们的目标应该是:
先创建一个足够大的子网,使它能够容纳全部 400 台主机,然后再在这个子网内部按照楼层划分地址范围。
另外,除了 400 台主机之外,还至少需要给网关预留一个 IP 地址。
所以至少需要:
400 + 1 = 401 个可用 IP 地址二、为什么默认的 /24 不够?
C 类地址常见的默认子网掩码为:
255.255.255.0也就是:
/24IPv4 地址总共有 32 位。
如果网络位占 24 位,那么剩下:
32 - 24 = 8 位作为主机位。
具有 n 位主机位时,可用主机地址数量通常计算为:
2^n - 2之所以减 2,是因为有两个特殊地址不能分配给普通主机:
主机位全 0 → 网络地址 主机位全 1 → 广播地址因此/24网络可以提供:
2^8 - 2 = 256 - 2 = 254也就是说:
/24 → 254 个可用主机地址而我们至少需要 401 个。
显然:
254 < 401所以/24无法满足要求。
三、到底需要多少位主机位?
接下来不再根据“A 类、B 类、C 类”直接套默认掩码,而是从实际主机数量反推。
设主机位数量为n,需要满足:
2^n - 2 ≥ 401先尝试n = 8:
2^8 - 2 = 254不够。
继续尝试n = 9:
2^9 - 2 = 510此时:
510 ≥ 401满足要求。
所以至少需要:
9 位主机位IPv4 地址总共 32 位,因此网络位数量为:
32 - 9 = 23所以最终应该使用:
/23四、/23 对应什么子网掩码?
/23的含义是:
IPv4 地址前 23 位属于网络位,剩余 9 位属于主机位。
因此将子网掩码写成二进制:
11111111.11111111.11111110.00000000每 8 位转换成十进制:
11111111 → 255 11111111 → 255 11111110 → 254 00000000 → 0因此/23对应的子网掩码为:
255.255.254.0最终得到:
CIDR:/23 子网掩码: 255.255.254.0五、为什么 /23 可以同时包含 192.128.0.x 和 192.128.1.x?
这是我在做这道题时比较容易产生疑问的地方。
一开始看到:
192.128.0.x和:
192.128.1.x很容易下意识认为:
第三个数字都不一样了,这不是两个不同的网段吗?
但实际上,不能只通过十进制 IP 地址的外观判断两台主机是否属于同一个子网。
关键要看子网掩码。
我们的掩码是:
255.255.254.0转换成二进制:
11111111.11111111.11111110.00000000注意第三个八位组:
11111110这里并不是 8 位全部属于网络位。
第三个八位组的最后 1 位已经属于主机位。
所以在这个/23网络中:
192.128.0.x和:
192.128.1.x可以属于同一个子网。
对于本题:
192.128.0.0/23覆盖的完整地址空间为:
192.128.0.0 ~ 192.128.1.255也就是说,它实际上把这一整段地址作为一个逻辑网络进行管理。
六、计算网络地址、广播地址和可用地址
对于:
192.128.0.0/23主机位全部为 0 时得到网络地址:
192.128.0.0主机位全部为 1 时得到广播地址:
192.128.1.255因此:
网络地址: 192.128.0.0 广播地址: 192.128.1.255这两个地址不能分配给普通设备。
所以真正可以使用的主机地址范围为:
192.128.0.1 ~ 192.128.1.254总共有:
2^9 - 2 = 510个可用地址。
七、给两层楼分配 IP 地址
接下来需要给两层楼分别分配 200 个地址。
这里要注意:
楼层之间只是为了方便管理而划分不同的地址范围,并不是把它们划成两个独立子网。
所有主机仍然统一使用:
255.255.254.0也就是/23。
1. 一层楼
给一层楼分配前 200 个地址:
192.128.0.1 ~ 192.128.0.200刚好 200 个。
2. 二层楼
二层楼继续从:
192.128.0.201开始。
分配到:
192.128.1.144因此二层楼地址范围为:
192.128.0.201 ~ 192.128.1.144这里有一个非常容易出错的地方:
在/23网络中:
192.128.0.255并不是广播地址。
同样:
192.128.1.0也不是这个/23网络的网络地址。
它们都处于:
192.128.0.0/23的可用主机地址空间之中。
所以地址可以连续经过:
192.128.0.254 192.128.0.255 192.128.1.0 192.128.1.1 ...真正的广播地址是:
192.128.1.255这也是这道题特别值得注意的一点。
八、网关应该设置成什么?
最开始很容易想到:
192.128.0.1因为实际网络中经常能看到.1被设置成默认网关。
但是这里存在一个问题。
我们已经给一层楼分配:
192.128.0.1 ~ 192.128.0.200如果又把:
192.128.0.1设置成网关,那么这个 IP 地址就同时分配给了:
网关 + 一层楼某台主机会发生 IP 地址冲突。
所以需要重新选择。
这里将最后一个可用主机地址:
192.128.1.254设置为默认网关。
因此:
默认网关:192.128.1.254这样就不会和前面的 400 台主机发生冲突。
九、最终 IP 地址规划方案
最终得到如下方案:
| 项目 | 地址 |
|---|---|
| 网络地址 | 192.128.0.0 |
| CIDR 前缀 | /23 |
| 子网掩码 | 255.255.254.0 |
| 广播地址 | 192.128.1.255 |
| 可用地址范围 | 192.128.0.1 ~ 192.128.1.254 |
| 一层楼 | 192.128.0.1 ~ 192.128.0.200 |
| 二层楼 | 192.128.0.201 ~ 192.128.1.144 |
| 默认网关 | 192.128.1.254 |
| 扩展备用 | 192.128.1.145 ~ 192.128.1.253 |
| 最大可用主机数 | 510 |
十、怎么证明两层楼确实属于同一个子网?
不能只说:
“因为我使用的是 /23,所以它们属于同一个子网。”
最好真正验证一次。
判断两个 IP 是否属于同一子网,可以分别计算:
IP 地址 AND 子网掩码也就是进行按位与运算。
例如从一层楼选择:
192.128.0.199从二层楼选择:
192.128.1.100统一使用子网掩码:
255.255.254.0分别进行按位与运算。
最终:
192.128.0.199 AND 255.255.254.0 → 192.128.0.0另外一个:
192.128.1.100 AND 255.255.254.0 → 192.128.0.0两个 IP 最终计算出的网络地址都是:
192.128.0.0所以可以确定:
192.128.0.199 和 192.128.1.100 属于同一个 /23 子网。
十一、容量是否足够?
最后还要检查地址容量。
/23有 9 位主机位:
2^9 = 512减去网络地址和广播地址:
512 - 2 = 510所以共有:
510 个可用地址当前需要:
400 台主机 + 1 个网关 = 401 个地址因此剩余:
510 - 401 = 109个可用地址。
容量足够。
十二、这次实验中踩过的几个坑
1. 一看到 C 类地址就直接使用 /24
这是我一开始最容易犯的错误。
以前学习时会记:
C 类地址 → 255.255.255.0所以看到题目以后很容易直接套/24。
但是实际网络规划更重要的是:
先看需要多少台主机,再决定需要多少主机位。
本题需要 400 台主机,/24只有 254 个可用地址,所以必须扩大地址空间。
2. 误以为 192.128.0.x 和 192.128.1.x 一定属于不同子网
以前看到第三个八位组不同,很容易直接判断它们属于不同网络。
但这其实取决于子网掩码。
在/24下,它们确实通常是不同网络。
但在/23下:
192.128.0.x和:
192.128.1.x可以属于同一个网络。
所以判断是否同网段不能只看 IP 地址本身。
3. 把 192.128.0.255 当成广播地址
这是一个很典型的惯性思维。
在:
192.128.0.0/24中,192.128.0.255的确是广播地址。
但是本题使用:
192.128.0.0/23此时真正的广播地址已经变成:
192.128.1.255因此:
192.128.0.255在这个/23网络中可以作为普通主机地址使用。
这也让我更加理解了:
网络地址和广播地址并不是只看 IP 最后一位是不是 0 或 255,而必须结合子网掩码判断。
4. 网关地址不能和普通主机冲突
开始时想把:
192.128.0.1设置为网关。
但一层楼的主机也从这个地址开始分配。
因此最终改成:
192.128.1.254这个过程让我意识到:
一个网络规划方案不能只保证“地址数量够”,还需要检查:
网络地址 广播地址 普通主机地址 网关地址 预留地址之间有没有冲突。
最终结论
对于 400 台主机全部处于同一个子网的需求,可以采用:
网络:192.128.0.0/23 子网掩码: 255.255.254.0 网络地址: 192.128.0.0 广播地址: 192.128.1.255 可用地址: 192.128.0.1 ~ 192.128.1.254 一层楼: 192.128.0.1 ~ 192.128.0.200 二层楼: 192.128.0.201 ~ 192.128.1.144 默认网关: 192.128.1.254 扩展备用: 192.128.1.145 ~ 192.128.1.253通过/23,可以提供510 个可用主机地址,因此能够满足 400 台主机以及网关的地址需求,并且两层楼的所有设备仍然属于同一个逻辑子网。