我理解子网掩码背后的基本前提,例如255.255.255.0
。但我见过的所有子网示例都是(从左到右)连续的 1(HI 位)。例如,255.255.0.0
(/16
)转换为以下八位字节:
11111111 . 11111111 . 00000000 . 00000000
我相信这些位必须是连续的,因为子网划分的整个目的是派生主机 ID 和可用设备 ID 的范围。但它确实让我感到疑惑,您是否曾经有过子网掩码,例如,255.17.255.0
或:
11111111 . 00010001 . 11111111 . 00000000
- 这会发生吗?或者说,如果没有连续的 1,子网就不可能存在吗?如果是这样,为什么?
- 否则,如果可以做到这一点,你为什么要这么做(一些具体的例子)?
答案1
第 3.1 节请求函数显示无类别域间路由中允许的掩码。这些位必须是连续的,路由才能正常工作。
另外,从逻辑上思考,出现奇怪的随机网络掩码实际上是没有意义的。
答案2
是的,最简单的理解方式是子网掩码的开头总是 1。如果子网大小指示器在二进制表示的开头没有 1,那么按照现代标准,我会说子网大小指示器不是合适的“子网掩码”。
RFC 1219早期的 RFC 950 允许非连续位。事实上,RFC 950 第 15 页(第 3 节)清楚地有一个示例“说明不连续的子网位”。但是,没有办法将此类子网转换为 CIDR 表示法。CIDR 样式的表示法是 IPv6 使用的(至少自RFC 1884 第 7 页,2.4 节的第一句),因此非连续位从未得到 IPv6 网络的广泛支持。RFC 1219的方法规定“子网位(掩码 = 1)从最高有效位开始向最低有效位分配”。(RFC 4632 第 3.1 节Sami 的回答中提到,指向一个讨论 CIDR 表示法的官方标准。)
RFC 1878 第 2 页显示除 之外的所有 IPv4 子网的标准“子网掩码”表示法/0
。
不过,我将详细阐述萨米的回答,探究“为什么”(提供一个具体的例子,正如问题所要求的那样)...
一些专业级 Cisco 设备支持一种称为“通配符掩码”的东西,它可以反转位。因此,普通子网可以用一种称为的东西来表示00000000.00000000.00000000.11111111
。
使用 Cisco 的通配符掩码,没有规定必须先输入所有零。因此,您可以使用00000000.00000000.00000000.11111110
。
这最终会创建一个包含所有偶数 IP 地址的组。
了解这一点实际上很重要,因为思科的培训涵盖了这一点,因此思科专业认证的考试过程可能会询问这样的事情。
但是,我认为它基本没用。你不必使用偶数地址或奇数地址将网络分成两半,而是使用低位地址和高位地址将网络分成两半,这样就可以创建大小减半的普通子网。
具有不连续位的通配符掩码不是很有用,并且使用起来可能更具挑战性。将子网掩码位设置为 1 的目的是为了表明该位有助于识别设备位于哪个子网。没有令人信服的理由将这些位分散到整个地址中,而不是将它们很好地分组在地址的开头。结果是,支持这些类型的掩码增加了复杂性,而没有太多实质性的好处。
我猜思科最终同意这种非传统子网掩码是没有意义的,因为他们最终放弃了对“通配符掩码”的支持。较旧的 Pix 防火墙支持“通配符掩码”,但较新的 ASA 单元使用标准“子网掩码”。
我甚至不会尝试在掩码中使用不连续的“子网位”来构建网络,因为许多软件会遵循较新的趋势/标准,并拒绝这样的网络设计。即使我使用的是较旧的软件,我也可能会希望我的网络能够轻松修改,以便能够使用较新的软件,而无需重新设计网络。因此,连续的“子网位”是唯一的选择。
如果考试时问到这个问题,我可以自信地说,所有的 1 都应该位于地址的开头。这是任何理智的考试人员都希望当今大多数学生学习的内容。
答案3
RFC 950第 2.2 章中说:
To support subnets, it is necessary to store one more 32-bit
quantity, called my_ip_mask. This is a bit-mask with bits set in
the fields corresponding to the IP network number, and additional
bits set corresponding to the subnet number field.
The code then becomes:
IF bitwise_and(dg.ip_dest, my_ip_mask)
= bitwise_and(my_ip_addr, my_ip_mask)
THEN
send_dg_locally(dg, dg.ip_dest)
ELSE
send_dg_locally(dg,
gateway_to(bitwise_and(dg.ip_dest, my_ip_mask)))
因此该提案涉及一个简单的位操作,不关心连续的位。
1985 年,CPU 和内存非常有限,因此任何更复杂的操作都无法在当时完成。
在第三章中这一点变得更加明确:
网络上使用了 3 位子网字段 (01011000),即地址掩码为 255.255.255.88。
但是,这些 RFC 似乎已经过时了。例如,在 Windows 7 SP1 上,无法设置这样的子网掩码:
即使在 Windows XP SP2 上,这也不再可能了:
然而,Windows 98 克隆版 ReactOS 允许设置“奇怪的”网络掩码:
答案4
我同意@Sami Kuhmonen 的回答:
RFC 中的第 3.1 节显示了无类域间路由中允许的掩码。这些位必须是连续的,路由才能正常工作。此外,从逻辑上考虑,使用奇怪的随机网络掩码确实没有意义。
但是,即使不希望或不允许,仍然可以定义非连续 1 的子网掩码。其背后的原因是:
网络 ID 和主机 ID 是使用二进制运算 AND 和 XOR 从 IP 地址和子网掩码计算得出的。其他一切都无关紧要。
几年前我在 Win 2000 上测试过,它有效。两台计算机的掩码都是 255.160.0.0。它们处于没有路由器的 LAN 中,所以我无法判断路由器的行为(通常您只能在其 Web 界面中设置路由器的掩码,但路由器会拒绝它)。
您也无法在网络设置的相应字段中输入这种“无效”子网掩码;GUI 拒绝接受它。但您可以通过直接在注册表中更改它来作弊。之后重新启动或禁用+启用 NIC 以使更改生效。
所有这些的目的:嗯,可能没有。