为什么 255.255.249.0 不是有效的子网掩码?

为什么 255.255.249.0 不是有效的子网掩码?

我只是对上述这个问题感到疑惑,如果有人能解释为什么 255.255.249.0 不是有效的子网掩码,我将不胜感激。

答案1

它不是一个有效的子网掩码,因为它没有定义字首。如果你把它转换成二进制,你会发现它的“1”位(和/或“0”位)并不都是连续的。这是明确禁止的RFC 4632(CIDR 规范的一部分)。

唯一未解决的限制是掩码必须保持连续


例如,将有效的网络掩码转换255.255.248.0为二进制:

|    255    |    255    |    248    |     0     |
  1111 1111   1111 1111   1111 1000   0000 0000

所有“1”位都在开头,这意味着掩码始终与前缀匹配 -第一的21 位定义网络。(这意味着整个 255.255.248.0 网络掩码可以简写为“/21”。)

除其他事项外,允许网络通过其网络掩码轻松排序 - /24 路由​​总是比 /21 路由更具体。

现在将其转换255.255.249.0为二进制:

|    255    |    255    |    249    |     0     |
  1111 1111   1111 1111   1111 1001   0000 0000

这个地址有一些 1 位,一些 0 位,然后又有一些 1 位。它有 22 个“网络”位,但 255.255.250.0 和 255.255.252.0 也是如此 - 如果一个地址与所有这些网络掩码的路由匹配,则不清楚其中哪一个具有更高的优先级。

正如评论中提到的那样,这以前是允许,但不能持续很长时间。

来自:大卫·埃德尔曼在 NANOG 上

当路由表中存在歧义时,您可以确定两件事:
1 - 每个制造商都知道如何处理它们。2
- 每个制造商的做法都不同。


注意:还有一件事通常被称为筛选或者访问控制列表掩码,但此限制不适用,因为过滤器掩码不具有与之关联的“子网”语义(例如最长前缀匹配)——它们只能匹配或不匹配。例如,iptables 可以很好地接受过滤器掩码 255.255.249.0。

答案2

掩码需要连续具有高位来屏蔽子网地址所在的网络地址。249 不具备此属性,因为它的二进制值为 11111001,在 1 之间有 0。

答案3

从形式上讲,它实际上有效的子网掩码。顾名思义,子网掩码只是一个位掩码模式(任何网络地址是一种地址模式,它可以告诉您地址的哪些部分定义了整个网络。

您从未见过超过八个不同八位字节值的原因是,从很早以前开始,惯例就是简单地使用最左边的位来表示网络,其余的位用于主机或子网络寻址。这允许制定一条每个人都能记住的简单规则,并告诉您在需要细分网络时可以使用哪些位。

据,直到...为止标准一开始,我们使用的是“有类”(当时没有命名)网络,其中 A、B 和 C 类分别由其前一个、两个或三个八位字节定义,并根据请求者的大小进行分配。据我所知,早期相当一部分网络套件经过了优化,但实际上只在八位字节边界上有效(D 和 E 类使用不多,仍然可以以这种方式处理)。

这最终被 CIDR(无类域间路由)取代,规定网络掩码为“左侧连续的 1”。除其他原因外,如果您知道某人网络的所有路由都通向同一端口,即使他们只为每个网络宣布单独的路由条目,它也能保证您可以将某人的路由公告“汇总”到较小的路由表条目中。

这对于中型/区域性 ISP 尤其重要,这些 ISP 与“一级”提供商有多个互连,但最终往往导致全国各地某人的所有路由都指向一条出站路由 — 虽然他们的 RIB(路由信息库,完整的路由信息​​集)仍然会知道所有单独的路由,但他们的 FIB(转发信息库,以线速驱动实际硬件的东西)可以保持较小,从而更快。如果你有中档硬件,这很常见,那么这对你的硬件效率和切换速度确实有很大的影响。

TL;DR:网络掩码实际上是面具,并且可以有任意的模式,但在实践中,你基本上永远不会看到一个不是“左边全是 1”的模式。

相关内容