amazon-vpc - 传递子网的 CIDR 块后出现“必须是有效的 IPv4 CIDR”错误
问题描述
我在 AWS 上创建了一个 VPC(公共子网和私有子网),其 IPV4 CIDR 块为10.0.0.0/26
(即它可以有 2^6 = 64 个 IP 地址以及一个子网地址和一个广播地址)。我想创建以下两个子网,但Must be valid Ipv4 CIDR
出现错误:
- 具有
10.0.0.0/28
CIDR 块的公共子网,以及 - 带有
10.0.0.8/28
CIDR 块的私有子网
如果我给出子网掩码,/28
并且我想将地址分成两个子网,则地址将落在 range 中10.0.0.0 [10.0.0.00000000] - 10.0.0.15 [10.0.0.00001111]
。另一方面,如果我将 CIDR 块作为10.0.0.16/28
,我不会收到任何错误。为什么 AWS 给出Must be valid Ipv4 CIDR
CIDR 块的错误为10.0.0.8/28
?
解决方案
/28 有 2^(32-28) = 2^4 = 16 个地址,因此该块的全零地址的最后一个八位字节必须能被 16 整除(其最低有效位必须为 0 0 0 0) . 8 的 LSB 为 1 0 0 0。
10.0.0.8/28 是无效的 CIDR 块。10.0.0.0 到 .15 以 CIDR 表示法表示为 10.0.0.0/28。
应要求澄清上述被数字 16 整除的重要性:
并不是地址的数量可以被最后一个块整除,而是在 CIDR 表示法xxxx/n中,每个块的大小始终为 2^(32-n) 个地址,并且 xxxx 必须指定块中的第一个地址当您指定一个块时。
将 IPv4 地址 xxxx 转换为二进制,您将得到一个 32 位数字。地址 xxxx 的 (32-n) 最低有效位必须为 0。这是块中的第一个 (0th) 地址,也称为“全零”地址,因为未屏蔽位- 最后的 32- n 位——全为 0。为子网指定 CIDR 块时,这是必须指定的地址。
在 /28 块的情况下,请注意 - 根据定义 - 任何以二进制表示的数字,其最低有效 32-28 = 4 位为 0 0 0 0 也可被 2^(32-28) = 16 整除,而任何其他数字都不是。
对于大小为 /24 到 /32 的块,这种数学运算对人类来说更容易,因为您不需要在精神上将整个 xxxx 转换为二进制 - 您只需要四个八位字节中的最后一个。
可以从 10.0.0.0/26 的超网派生的唯一可能的 /28 子网是:
10.0.0.0/28 .0 to .15
10.0.0.16/28 .16 to .31
10.0.0.32/28 .32 to .47
10.0.0.48/28 .48 to .63
推荐阅读
- azure - 如何从 Azure 数据工厂连接到 OpenDataSet?
- json - vscode json格式化程序:不包装json对象
- android - Gradle 同步失败:连接重置
- python - 从单独的文件重新加载指定的函数
- android - 如何检测原生 Android Mapbox 地图中的 MarkerView 点击?
- python - 如何从 FFT 中找到主频率?
- javascript - 即使数组返回节点,addEventListener 也不是函数?
- php - 用 3 点剪断句子中间 (PHP)
- c++ - 为什么保留额外内存时向量中的对象没有移动?
- javascript - 将 Thymeleaf 字符串数组模型传递给 JavaScript,得到 HTML 错误