有人可以准确解释 CIDR 块是如何工作的,以及它是如何转换为 0.0.0.0/32 的吗?请使用外行的术语,或者甚至是与网络无关的事物的类比。似乎找不到适合我的解释。谢谢!!
3 回答
无类域间路由 (CIDR) 块用于指定 IPv4 或 IPv6 格式的 IP 地址范围。为简单起见,我将以 IPv4 格式解释其余部分,但它适用于 IPv6。
CIDR 块的一般格式:xyzt/p
x、y、z 和 t 是从 0 到 255 的数字。基本上,每个代表一个 8 位二进制数。这就是为什么它的范围最多为 255。这些数字的组合成为 IPv4 IP 地址,该地址必须是唯一的才能识别特定实例。
在 AWS 的情况下,p 是一个从 16 到 28 的数字。它表示从给定 IP 地址继承的位数。例如:10.0.0.0/16 代表一个 IP 地址,格式如下: 10.0.xy 其中 x 和 y 是 0 到 255 之间的任意数字。所以,实际上它代表一个 IP 地址范围,从 10.0.0.0 到 10.0。 255.255。
但是,对于每个 CIDR 块,AWS 禁止 5 个可能的 IP 地址。这些是前 4 个可用地址和最后一个可用地址。在这种情况下:
- 10.0.0.0:网络地址
- 10.0.0.1:为 VPC 路由器保留
- 10.0.0.2:DNS 服务器
- 10.0.0.3:保留供将来使用
- 10.0.255.255:网络广播
官方文档见这里。
实际上,这是 AWS 允许 p 的数值高达 /28 的主要原因之一。因为对于 p=30,将有 4 个可用值,但是 AWS 需要 5 个 IP 地址才能使用。在我看来,对于 p=29,他们可能会发现占用 5 个地址来提供 3 个可能的 IP 地址是低效的。
可以使用以下公式计算可能的 IP 地址数:
NumberOfPossibleIPs = 2^(32-p) - 5
无类域间路由 (CIDR) 块基本上是一种分配 IP 地址和 IP 路由的方法。创建网络或路由表时,需要指定工作范围。“0.0.0.0”表示它将匹配任何 IP 地址。某些 IP 地址是特定的,例如 10.0.0.0,它将匹配以 10 开头的任何 IP 地址。对于任何 IP 地址范围,您可以通过使用后缀(例如 /32 中的示例)来更具体。这些允许符号指定从前缀(实际 IP 范围,如 10.0.0.0)中使用的位数。它表示子网掩码的位长,如上所示。子网掩码就像绘画时的掩码。你在你不想画的地方放一个面具。
例如,10.10.0.0/16 在其范围内将有 256 * 256 个 IP 地址。
注意:某个范围内的某些 IP 地址为各种目的而保留。根据 AWS VPC 文档,以下是保留的 IP 地址。
- 10.0.0.0:网络地址。
- 10.0.0.1:AWS 为 VPC 路由器保留。
- 10.0.0.2:由 AWS 保留。DNS 服务器的 IP 地址始终是 VPC 网络范围的基数加 2;但是,我们还保留每个子网范围的基数加 2。对于具有多个 CIDR 块的 VPC,DNS 服务器的 IP 地址位于主 CIDR 中。有关更多信息,请参阅 Amazon DNS 服务器。
- 10.0.0.3:由 AWS 保留以供将来使用。
- 10.0.0.255:网络广播地址。我们不支持 VPC 中的广播,因此我们保留此地址。
希望这可以帮助!
以上所有答案都很棒,但是对于不了解寻址的人来说,缺少一些非常重要的东西。
IP 地址实际上只是一串二进制文件,分为 4 个“八位字节”。每个八位字节是一个2^8
块;00000000
. 所以对于一台机器来说,一个 IP 地址看起来像这样((.)
为了人性而添加):
00000000(.)00000000(.)00000000(.)00000000
当我们谈论 IP 地址上的“掩码”时,它的意思是“不变的位”。块末尾的/8
或表示该网络不允许/255.0.0.0
使用的位数。
所以,假设我们有一个 CIDR 块10.0.0.0/8
- 这也可以写成 format 10.0.0.0/255.0.0.0
,实际上你可能会在旧版本的 linux 中看到这个 for 表示法。您还将注意到这255
是二进制字符串的十进制表示11111111
-8
二进制“ones”。所以机器看到的是以下内容:
Net: 00001010(.)00000000(.)00000000(.)00000000
Mask: 11111111(.)00000000(.)00000000(.)00000000
掩码中带有 0 的部分是网络内可用的地址空间。
因此,以下示例地址在此网络中有效,因为0
屏蔽范围的某些部分正在发生变化:
00001010(.)00000001(.)00110000(.)00111000
00001010(.)00110001(.)00110100(.)00111001
当我们说“cidr 块”时,我们只是指“表达机器理解的二进制字符串的人类可读的简写方式”。在上面的例子中,第一个八位字节可以表示为10
,后面的八位字节可以表示为0
。并且掩码可以表示为,或255
的后八位组0
;因为掩码总是1的序列,然后是0的序列,1的长度,即8
因此,我们得到一个 cidr10.0.0.0/255.0.0.0
或10.0.0.0/8
再举几个例子:
-- 172.1.1.0/24
net: 10101100.00000001.00000001.00000000
mask: 11111111.11111111.11111111.00000000
^ 24 bits for the mask ^ 8 bits of usable space
-- 10.10.10.8/29
net: 00001010.00001010.00001010.00001000
mask: 11111111.11111111.11111111.11111000
^ 29 bits for the mask. ^ 3 bits of usable space
重要的是,这只是网络的一个方面。通常其中一些是为事物保留的。有关 AWS 特定内容,请参阅其他答案。在他们的示例中,为 AWS 保留的“前 4 个”IP 地址将是前 4 个可用地址,即
...00 - Network address
...01 - Router
...10 - DNS
...11 - Futureproofing