FlowingDev

CIDR 和子网划分:把互联网切成一个个小区

了解 CIDR 表示法和子网划分如何将庞大的 IPv4 地址空间分割成易于管理的网络,并定义了设备在互联网上如何相互通信。

试用工具: 子网 / CIDR 计算器

一句话概括

CIDR 就是互联网的“画地圈线”大法,它把一大片乱糟糟的 IP 地址,划分成一个个整洁有序的小区,让你的数据能轻松找到家。

它解决了什么问题

让我们把思绪拉回到 20 世纪 80 年代的早期互联网。那会儿的生活很简单。如果你需要 IP 地址,你就申请一个“类”的地址。主要有三种选择:

  • A 类 (Class A): 16,777,214 个主机地址。给巨头们用的。
  • B 类 (Class B): 65,534 个主机地址。给大型组织用的。
  • C 类 (Class C): 254 个主机地址。给小家伙们用的。

这种“有类”系统非常死板,而且极度浪费。想象一下,你需要 300 个 IP 地址。C 类太小了,所以你必须申请一个 B 类。恭喜你,你刚拿到了 65,534 个地址,然后浪费了其中的 65,234 个。这就像你需要一辆小电驴,却被迫买了一辆十六轮大卡车。

到了 90 年代初,专家们预见到了一场数字末日的来临:我们的 IP 地址即将耗尽。互联网的路由表——核心路由器使用的全球地址簿——也在爆炸式增长,威胁着要将整个系统的速度拖垮。

1993 年,一群工程师发布了 RFC 1518 和 1519,定义了无类域间路由 (Classless Inter-Domain Routing),简称 CIDR(发音同 "cider")。CIDR 抛弃了死板的 A/B/C 类。它引入了一种全新的、灵活的方式来定义任意大小的地址块。

这是一个颠覆性的改变。它允许互联网服务提供商 (ISP) 为其客户分配“刚刚好”的地址块,极大地减缓了 IPv4 地址的枯竭速度。它还实现了“路由聚合”,即路由表中的一个条目可以代表数千个单独的路由,从而将互联网的骨干网从自身的重压下解救出来。

底层工作原理

要想搞懂 CIDR,你首先要接受一个基本事实:IP 地址是给计算机用的,不是给人类用的。我们熟悉的点分十进制格式(192.168.1.10)只是我们为了方便自己而编造的一个善意谎言。现实是二进制的。

首先,快速回顾一下 IP 地址和二进制

一个 IPv4 地址就是一个 32 位的数字。没了。就是三十二个 1 和 0。我们把它切成四个 8 位的块(称为八位字节),然后将每个块转换成一个十进制数(0-255),以便于阅读。

我们以 172.20.129.45 为例:

   172   .    20   .    129   .    45
10101100 . 00010100 . 10000001 . 00101101

所有的 IP 网络计算,包括 CIDR,都是在这个二进制层面上进行的。

子网掩码:神奇的解码环

每个 IP 地址都过着双重生活。它的一部分标识了它所属的网络(它的街道名),另一部分标识了该网络上的特定主机(它的门牌号)。

计算机怎么知道哪部分是哪部分呢?它使用子网掩码。子网掩码是另一个 32 位的数字,就像一个过滤器。它的工作原理如下:

  1. 子网掩码是一系列连续的 1,后面跟着一系列的 0。
  2. 1 的部分对应于地址的网络部分。
  3. 0 的部分对应于地址的主机部分。

为了找出网络地址,计算机会在 IP 地址和子网掩码之间执行一次按位 AND 运算。

假设我们的 IP 是 172.20.129.45,掩码是 255.255.0.0。

IP 地址:    10101100.00010100.10000001.00101101  (172.20.129.45)
子网掩码:   11111111.11111111.00000000.00000000  (255.255.0.0)
-----------------------------------------------------------------
网络 ID:    10101100.00010100.00000000.00000000  (172.20.0.0)

结果 172.20.0.0 就是这个网络中所有设备的“街道名”。

CIDR 登场:子网掩码的简写

每次都写 255.255.255.0 太麻烦了。CIDR 表示法是一种简单的简写。它就是在 IP 地址后面加上一个斜杠(/),然后跟上子网掩码中开头 1 的数量。这个数字被称为前缀长度。

CIDR 后缀 子网掩码 1 的数量 二进制掩码
/8 255.0.0.0 8 11111111.0000...
/16 255.255.0.0 16 11111111.11111111.0000...
/24 255.255.255.0 24 11111111.11111111.11111111.00000000
/29 255.255.255.248 29 ...11111111.11111000
/32 255.255.255.255 32 全是 1 (单个主机)

所以,172.20.129.45 加上 255.255.0.0 的掩码,可以简单地写成 172.20.129.45/16。小菜一碟。

计算那些好东西

给定一个像 10.50.84.111/22 这样的 CIDR 地址,我们就能算出它所在网络小区的所有信息。

  • 前缀: /22。这意味着 22 位用于网络,剩下的 32 - 22 = 10 位用于主机。

  • 网络地址: 这是地址范围中的第一个地址,所有主机位都为 0。我们通过 AND 运算找到它。

    • IP: 10.50.84.111 -> 00001010.00110010.01010100.01101111
    • 掩码 /22: 255.255.252.0 -> 11111111.11111111.11111100.00000000
    • AND 结果: 00001010.00110010.01010100.00000000 -> 10.50.84.0
    • 所以,网络地址是 10.50.84.0。
  • 主机数量: 我们有 10 个主机位。可能的地址数量是 2^10 = 1024。

  • 可用主机: 我们必须减去两个地址。为什么?

    1. 第一个地址(所有主机位为 0)是网络地址本身。它是街道名,不是房子。
    2. 最后一个地址(所有主机位为 1)是广播地址。往这里发送数据包,就像是对网络上的每个设备大喊“嘿,所有人听着!”
    • 所以,可用主机 = (2^10) - 2 = 1024 - 2 = 1022。
  • 广播地址: 这是网络地址将所有主机位翻转为 1 之后的结果。

    • 网络: 00001010.00110010.01010100.00000000
    • 广播: 00001010.00110010.01010111.11111111 -> 10.50.87.255
  • 主机范围: 可用地址是网络地址和广播地址之间的所有地址。

    • 第一个可用主机: 10.50.84.1 (网络地址 + 1)
    • 最后一个可用主机: 10.50.87.254 (广播地址 - 1)

所以,10.50.84.111/22 是 10.50.84.0 网络上的一个主机,该网络支持 1022 台设备,范围从 10.50.84.1 到 10.50.87.254。

真实世界的案例

### 云成本灾难

一家热门初创公司在公有云上搭建了他们的基础设施。为了尽快开始写代码,他们接受了虚拟私有云 (VPC) 的默认网络设置,这个设置占用了一个巨大的 /16 块(65,534 个 IP)。几个月后,他们签下了一个大客户,需要在他们的云环境之间建立直接、安全的连接。问题来了:那个客户也用了完全相同的默认 /16 块。他们的地址空间,10.10.0.0/16 和 10.10.0.0/16,一模一样。你没法在两个都声称是同一个地址的地方之间进行路由。这家初创公司不得不花了一个抓狂的星期,在一个新的、不重叠的 CIDR 范围上从零开始重建他们的整个网络。

教训: 规划你的网络地址空间,就像规划一座城市一样。即使你现在只需要一个小村庄,也要为以后连接其他城市的高速公路留出空间。不要轻易接受默认设置。

### 神秘的离线设备

一位初级网络管理员的任务是设置一台新的监控服务器。他得到的 IP 范围是 192.168.100.0/24。他给服务器配置了 IP 192.168.100.255。服务器的网络接口启动了,但它就像个幽灵。它 ping 不通网关,网络上也没有任何设备能 ping 通它。在检查线缆和重装驱动程序一个小时后,一位高级工程师路过,看了眼屏幕两秒钟,然后说:“那是你的广播地址。” 他们把 IP 改成 192.168.100.254,服务器瞬间就上线了。

教训: 任何子网中的第一个和最后一个地址都是特殊的,不能分配给主机。它们分别是网络的身份和它的大喇叭。

### 家庭 Wi-Fi 奇才

一个开发者的家庭网络一团糟。笔记本电脑、手机、智能电视、音箱、灯泡,还有一个“智能”烤面包机,设备们不停地从 Wi-Fi 上掉线。她查看了路由器的管理页面,发现 DHCP 服务器配置的范围是 192.168.1.0/28。快速计算一下,一个 /28 的网络只提供 (2^(32-28)) - 2 = 14 个可用 IP 地址。而她家里有超过 30 台设备!她将她局域网(LAN)的子网掩码从 255.255.255.240 (/28) 改为 255.255.255.0 (/24),将可用 IP 扩展到 254 个。Wi-Fi 不稳定的问题瞬间消失了。

教训: 子网划分不仅仅是数据中心的事。它决定了有多少设备可以加入你的本地网络,而一个配置不当的子网是“Wi-Fi 不给力”的常见原因。

常见错误和陷阱

  • 忘了那两个保留地址。 一个经典的“差二错误”。你计算出 2^h 个地址,然后告诉别人他们有那么多地址可用,但你忘了减去网络地址和广播地址。这会导致配置错误和网络空间略微不足。
  • 重叠的子网。 正如在云灾难故事中看到的那样,如果两个需要通信的网络有重叠的 IP 范围,你将陷入巨大的痛苦。路由会变得模糊不清,而且通常需要复杂丑陋的网络地址转换 (NAT) 技巧才能解决。提前规划!
  • 用十进制思考。 你无法通过看十进制数字来正确理解子网划分。192.168.0.255 和 192.168.1.0 看起来像是紧挨着的。如果你在一个 /24 网络里,它们属于不同的网络。如果你在一个 /23 网络里,它们则在同一个网络中。这一切都取决于二进制的边界在哪里。
  • 滥用 /31。 一个 /31 有 2^(32-31) = 2 个地址。旧规则说,在保留网络和广播地址后,这就剩下零个可用主机了。然而,RFC 3021 为特殊的点对点链接(例如,连接两个路由器)更新了这一点,这种情况下不需要广播。但对于一个有客户端的常规网络来说,它毫无用处。
  • 手滑打错前缀。 把 /24 打成 /23 是很容易发生的事。一个数字的差异,可能就是一个 254 主机网络和一个 510 主机网络的区别,这会完全改变网络的边界,并可能导致冲突。仔细检查你的前缀。

为什么你应该关注它

你可能觉得这玩意儿只有硬核网络工程师才用得到。那你就大错特错了。

  • 云和 DevOps 工程师: 这就是你的日常。在 AWS、Azure 或 GCP 中设计 VPC/VNET 就是一个 CIDR 规划练习。一开始搞错了,后面就会导致成本高昂、复杂的迁移。
  • 后端开发者: 连不上你的数据库?也许应用服务器在 10.0.1.0/24,而数据库在 10.0.2.0/24。如果它们之间没有配置路由器,那它们就跟在不同星球上没啥区别。理解子网是调试的基本步骤之一。
  • 安全专家: 防火墙规则通常基于 CIDR 块。要允许整个办公室的访问,你不会添加 200 个单独的 IP;你会为 10.5.0.0/22 添加一条规则。要阻止一个已知的坏蛋,你就封锁他们的 CIDR 范围。
  • 任何运行代码的人: 即使你只在 localhost 上工作,你也在使用网络。知道 127.0.0.1 只是巨大的 127.0.0.0/8 环回块中的一个主机,有助于揭开本地开发核心部分的神秘面纱。

在一个由互联服务、容器和云基础设施组成的世界里,网络不再是别人的问题。理解它的地址簿是现代开发者的一个超能力。

深入了解

理论搞定,动手试试吧——100% 在你的浏览器中运行。

试用工具: 子网 / CIDR 计算器