子网划分与 CIDR:如何高效管理 IP 地址

上一篇留了个悬念:IP 地址里隐含着"网络部分"和"主机部分",可这条边界到底画在哪?为什么 192.168.1.10192.168.1.20 算同一个网,192.168.1.10192.168.2.10 又不算?更要命的是,你的机器每发一个包,都要先回答一个问题——目标和我是不是同一个网段?是就直接 ARP 发给它,不是就交给网关。这个判断错了,包就发错方向。

而这个判断的全部依据,就是子网掩码和它背后的CIDR。这部分有点"算题味",但它不是为了折磨人——它是网络层每一次转发决策的起点。这一篇我们就把机制和计算彻底讲透:子网掩码怎么把地址切成两段、主机怎么用"按位与"判断同网段、CIDR 的前缀长度怎么算子网。先把计算机制走通,再讲为什么要这么划分。所有计算我们都一步步算,绝不跳步。

子网划分的本质,是回答一台主机每次发包都要问的那个问题:“目标在我家门口(同网段,直接发),还是在外面(不同网段,交给网关)?” 掩码就是用来算这个答案的工具。

一、为什么不能只看 IP 数字本身

先打破一个直觉。看到 192.168.1.10192.168.1.20,很多人凭"前三段一样"就断定它们同网段。多数情况下碰巧对,但判断依据根本不是"看起来像不像",而是网络前缀有多长

同样是 192.168.1.10,配 /24 掩码时它属于 192.168.1.0 这个网;配 /25 掩码时它属于 192.168.1.0(前 128 个),而 192.168.1.200 就属于另一个网 192.168.1.128 了——尽管前三段完全相同。

决定两个 IP 是否同网段的,唯一依据是掩码(前缀长度),不是肉眼看数字像不像。同样的 IP,配不同掩码,归属的网络完全不同。这是整篇的地基。

只有知道了网络位和主机位的边界,系统才能判断目标是否在本地子网,进而决定"直接 ARP"还是"交给网关"。所以掩码不是可有可无的配置,它是转发决策的前提。

二、子网掩码的机制:用"按位与"切出网络号

子网掩码的作用就一句话:把 IP 地址切成网络部分和主机部分。它的机制非常机械:

  • 掩码也是 32 位,前面连续的 1 表示网络位,后面连续的 0 表示主机位
  • 比如 255.255.255.0,二进制是 11111111.11111111.11111111.00000000——前 24 位是 1,所以叫 /24,表示前 24 位是网络位。
  • 求一个 IP 的网络号,就是把 IP 和掩码按位与(AND):对应位都是 1 才得 1。

来算一个完整例子。主机 192.168.1.10,掩码 255.255.255.0

1
2
3
IP:   11000000.10101000.00000001.00001010   (192.168.1.10)
掩码: 11111111.11111111.11111111.00000000 (255.255.255.0)
AND: 11000000.10101000.00000001.00000000 = 192.168.1.0 ← 网络号

按位与之后,主机位被全部清零,剩下的就是网络号 192.168.1.0。这个网络里:

  • 网络地址(主机位全 0):192.168.1.0——代表这个网络本身,不分配给主机;
  • 广播地址(主机位全 1):192.168.1.255——发给本网络所有主机,不分配给主机;
  • 可用主机地址192.168.1.1 ~ 192.168.1.254,共 254 个2^8 - 2,减去网络地址和广播地址)。

网络号 = IP AND 掩码。主机位全 0 是网络地址、全 1 是广播地址,这两个不能分给主机,所以可用主机数永远是 2^主机位 - 2。这个"减 2"是初学者最常忘的。

三、同网段判断:主机发包时到底在算什么

现在把机制用到那个核心问题上——主机怎么判断目标是不是同网段。机制是:把"自己的 IP"和"目标 IP"分别和自己的掩码按位与,比较两个网络号是否相同。

例子:你的机器是 192.168.10.8/24(掩码 255.255.255.0)。

场景 A:访问 192.168.10.99

1
2
我的网络号:   192.168.10.8  AND 255.255.255.0 = 192.168.10.0
目标的网络号: 192.168.10.99 AND 255.255.255.0 = 192.168.10.0

两个网络号相同 → 同网段 → 直接 ARP 解析 192.168.10.99 的 MAC,帧直接发给它。

场景 B:访问 192.168.20.99

1
2
我的网络号:   192.168.10.8  AND 255.255.255.0 = 192.168.10.0
目标的网络号: 192.168.20.99 AND 255.255.255.0 = 192.168.20.0

两个网络号不同 → 不同网段 → 把包交给默认网关(ARP 解析网关的 MAC,目的 IP 仍填 192.168.20.99)。

这就是上一篇 ARP 里"同网段直接发、跨网段找网关"那个判断的完整算法。每发一个包,主机内核都在做这个"两次按位与再比较"的运算。理解了它,你就彻底打通了"IP 地址 → 转发决策 → ARP → 链路层发送"这条完整链路。

四、CIDR:为什么前缀长度可以是任意值

早期互联网用 A/B/C 类地址:A 类前 8 位是网络位(/8),B 类前 16 位(/16),C 类前 24 位(/24)。问题是粒度太粗、浪费巨大:一个机构要 300 个地址,C 类(254 个)不够,只能给一个 B 类(65534 个),白白浪费 6 万多个。

CIDR(无类别域间路由) 的革命在于:前缀长度不再被限制为 8/16/24,而可以是任意值,写成 /n,比如 /20/26/30。这意味着可以按实际需要精确切分地址块。

CIDR 还带来一个同样重要的好处——路由聚合

CIDR 不只是省地址,更重要的是让路由聚合成为可能。比如 192.168.0.0/24192.168.1.0/24192.168.255.0/24 这 256 个网络,可以在路由表里用一条 192.168.0.0/16 概括。这极大压缩了核心路由器的路由表规模——否则全球路由表会膨胀到无法承受。前缀越短,覆盖的网络越多,聚合能力越强。

五、动手算一次子网划分

光看不练记不牢。我们把一个 /24 网络切成更小的子网,完整算一遍。

任务:把 192.168.1.0/24 划分成 4 个等大的子网。

切成 4 份,需要从主机位借 2 位当网络位(因为 2^2 = 4)。于是前缀从 /24 变成 /26,掩码变成:

1
/26 = 11111111.11111111.11111111.11000000 = 255.255.255.192

每个子网的块大小 = 256 - 192 = 64(即主机位剩 6 位,2^6 = 64 个地址)。所以 4 个子网的网络号按 64 递增:

子网 网络地址 可用主机范围 广播地址 可用数
1 192.168.1.0/26 .1 ~ .62 192.168.1.63 62
2 192.168.1.64/26 .65 ~ .126 192.168.1.127 62
3 192.168.1.128/26 .129 ~ .190 192.168.1.191 62
4 192.168.1.192/26 .193 ~ .254 192.168.1.255 62

每个子网可用主机 = 2^6 - 2 = 62 个。验证一下 192.168.1.100 属于哪个子网:它落在 64~127 之间,所以属于子网 2(192.168.1.64/26),广播地址是 .127

划子网的口诀:借 k 位 → 多出 2^k 个子网 → 块大小 = 256 - 掩码末段值 → 网络号按块大小递增 → 每子网可用主机 = 2^(剩余主机位) - 2。 把这套算熟,任何子网题都是机械套用。

实际工程里更常用 VLSM(可变长子网掩码)——不要求每个子网等大。比如一个网段里,给需要 100 台主机的部门切 /25(126 可用),给只需 10 台的部门切 /28(14 可用),按需分配,不浪费。

六、几个必须记住的特殊前缀

实战中有几个前缀长度高频出现,记住它们能省很多计算:

  • /32:掩码 255.255.255.255,只代表单个主机地址(没有可用主机范围的概念)。常见于路由表里的精确主机路由、防火墙规则里指定单个 IP。
  • /31:只有 2 个地址,专用于点对点链路(两个路由器之间),RFC 3021 允许这两个地址都用作主机,省地址。
  • /30:4 个地址、2 个可用,是传统点对点链路的经典选择。
  • /00.0.0.0/0 代表默认路由——“所有目标”,匹配不到更具体路由时就走它(即发给默认网关)。

另外记牢私有地址段(RFC 1918),它们不会出现在公网:10.0.0.0/8172.16.0.0/12192.168.0.0/16

七、为什么网络规划离不开子网

机制讲完,回答设计动机:为什么不把所有主机塞进一个大网段,非要切分?

核心原因是广播域和故障域。上一篇讲过,一个二层网络/子网内,广播帧(ARP、DHCP)会打扰所有主机。如果把上万台主机放进一个大子网:

  • 广播泛滥:ARP 等广播流量随主机数增长,最终拖慢整个网络;
  • 故障域太大:一处二层故障(环路、广播风暴)会波及所有主机;
  • 安全边界模糊:所有主机在一个网里,难以做隔离和访问控制。

合理切分子网,就是在隔离广播、缩小故障域、划清安全边界。这也是为什么在企业网、云 VPC、Kubernetes 集群里,子网规划是最基础的设计工作:

  • 云 VPC:你创建 VPC 时要指定 CIDR(如 10.0.0.0/16),再切成多个子网(如 10.0.1.0/24 给 Web、10.0.2.0/24 给 DB),分别放在不同可用区、配不同安全组。
  • Kubernetes:Pod 网段、Service 网段都是 CIDR;给每个节点分配一个 Pod 子网(如 /24),节点内 Pod 同网段直连,跨节点走路由/隧道——和这篇讲的同网段判断逻辑一脉相承。

很多看起来是"架构层面"的设计——多可用区、网络隔离、安全组、故障隔离——它们的起点其实都是一张子网规划表。地址怎么切,决定了广播怎么扩、故障怎么传、安全怎么隔。

八、学习这一部分最容易踩的坑

1. 只记"192.168 是内网",不理解网段边界

私有地址段要记,但更要理解:是不是同网段由掩码决定,不是看前几段数字。同样的 IP 配不同掩码,归属完全不同。

2. 算可用主机数忘了"减 2"

主机位全 0 是网络地址、全 1 是广播地址,都不能分给主机。可用数永远是 2^主机位 - 2/30 是 2 个可用不是 4 个。

3. 把子网掩码当纯算术题,不联系转发决策

掩码算出的网络号,最终用途是让主机判断"目标同网段吗→直接发还是给网关"。脱离这个决策去背算法,就学成了空中楼阁。

4. 看见 /26/20 就发怵

/n 只是"前 n 位是网络位"的简写。借位、块大小、按位与,全是机械的二进制操作。算熟一套口诀,再奇怪的前缀也只是套公式。

总结

这一篇我们把子网和 CIDR 的计算机制走通了:

  • 决定两个 IP 是否同网段的唯一依据是掩码(前缀长度),不是肉眼看数字;
  • 子网掩码用"前 1 网络位、后 0 主机位"切分地址,网络号 = IP AND 掩码,可用主机 = 2^主机位 - 2
  • 主机发包时做的核心运算,就是把自己 IP 和目标 IP 分别和掩码按位与,网络号相同则直接 ARP,不同则交给网关
  • CIDR 让前缀长度任意化,既精确分配地址,又通过路由聚合压缩了全球路由表;
  • 划子网的口诀:借 k 位多出 2^k 个子网、块大小 = 256 - 掩码末段、可用主机 = 2^剩余主机位 - 2;VLSM 让子网可按需大小不等;
  • 子网划分的设计动机是隔离广播、缩小故障域、划清安全边界,这正是云 VPC、K8s 网络规划的起点。

把"按位与求网络号 → 比较判断同网段 → 决定直发还是走网关"这条链算到形成肌肉记忆,整个网络层的寻址逻辑就在你脑子里闭环了。从链路层一路走到这里,"一帧怎么发、一跳交给谁、全程往哪走、谁和我同网"这些问题已经全部打通——再往上,就是 TCP/UDP 如何在 IP 这条尽力而为的通道上,搭起端到端的可靠通信了。

参考资源