子网是否总是连续的1s?[重复]


25

我了解子网掩码(例如)背后的基本前提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不可能存在子网?如果是这样,为什么?
  • 否则,如果可以这样做,为什么要这么做(一些具体示例)?

@MSalters就像您知道的那样,自动注释现在已更改为“ ...的可能重复项”,因此您不再需要手动输入注释。;-)
克里斯·杰斯特·杨

简短的回答:是的,您是对的。
章鱼

Answers:


18

RFC中的3.1节显示了无类域间路由中允许的掩码。这些位必须是连续的,路由才能正常工作。

同样,当进行逻辑思考时,拥有奇怪的随机网络掩码也没有任何意义。


28

是的,考虑这一点的简单方法是,子网掩码一开始始终为1。如果在二进制表示的开始处,子网大小指示符没有1,那么我会说,使用现代标准,子网大小指示符不是正确的“子网掩码”。

RFC 1219指出,较早的RFC 950允许不连续的位。实际上,RFC 950第15页(第3节)中显然有一个“说明非连续子网位”的示例。但是,无法将此类子网转换为CIDR表示法。CIDR样式表示法是IPv6使用的(至少自RFC 1884第7页(第2.4节的第一句话)以来,所以IPv6网络从未广泛支持非连续位。RFC 1219的方法指定“从最高有效位开始分配子网位(掩码= 1)走向最小”。(Sami的答案提到的RFC 4632第3.1节指向讨论CIDR表示法的正式标准。)

RFC 1878第2页显示了除以外的所有IPv4子网的标准“子网掩码”符号/0

但是,我将详细解释萨米人的答案,并探讨“为什么”(举一个具体的例子,正如问题所要求的那样)...

某些专业级的思科设备支持一种称为“通配符掩码”的功能,该功能会将位反转。因此,普通子网可以用表示00000000.00000000.00000000.11111111

使用思科的通配符掩码,没有规则规定所有零都必须先走。这样就可以使用了00000000.00000000.00000000.11111110

最终将创建一个包含所有偶数IP地址的组。

知道这一点实际上很重要,因为思科的培训涵盖了这一点,因此思科专业认证的考试过程可能会问到这一点。

但是,我认为这几乎没有用。不用通过使用偶数地址或奇数地址将网络划分为一半,而是可以通过将普通子网的大小减半来使用低数地址和高数地址将网络划分为两半。

具有非连续位的通配符掩码并不是非常有用,并且使用起来可能更具挑战性。子网掩码位设置为1的意思是,该位有助于识别设备所在的子网。没有令人信服的理由将这些位散布到整个地址中,而不仅仅是在地址的开头将它们很好地分组。结果是,支持这些类型的面罩会增加复杂性,而没有太多实质性的好处。

我猜想思科最终同意这种非传统的子网掩码是没有意义的,因为它们最终放弃了对“通配符掩码”的支持,较旧的Pix防火墙支持“通配符掩码”,但是较新的ASA单元使用标准的“子网掩码”代替。 。

我什至不会尝试在掩码中使用不连续的“子网位”构建网络,因为许多软件会遵循更新的趋势/标准,并拒绝这种网络设计。即使使用的是较旧的软件,我也可能希望能够轻松修改我的网络,以能够使用较新的软件,而无需重新设计网络。因此,连续的“子网位”是唯一的方法。

如果您在测试中被问到问题,我会很自信地说所有1都必须在地址的开头。这就是任何理智的测试人员都希望大多数学生在这个时代学习的东西。


+1-我最后一次看到通配符掩码使用的末尾没有全1的情况是掩码输入错误。
马克·亨德森

2

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章中,它变得更加明确:

而在网络上,正在使用3位子网字段(01011000),即地址掩码为255.255.255.88。

但是,这些RFC似乎已过时。例如,在Windows 7 SP1上,无法设置这样的子网掩码:

Windows 7上需要连续的子网掩码

即使在Windows XP SP2上,也不再可能:

子网掩码Windows XP SP2

Windows 98克隆ReactOS允许设置“奇怪的”网络掩码:

ReactOS子网掩码


1

我同意@Sami Kuhmonen的回答:

RFC中的3.1节显示了无类域间路由中允许的掩码。这些位必须是连续的,路由才能正常工作。同样,当进行逻辑思考时,拥有奇怪的随机网络掩码也没有任何意义。

但是,即使不希望或不允许,也可以定义非连续1的子网掩码。其背后的原因:
网络ID和主机ID是使用二进制运算AND和XOR从IP地址和子网掩码计算得出的。其他一切都无关紧要。

几年前,我在Win 2000上进行了测试,它可以工作。两台计算机的掩码均为255.160.0.0。它们位于没有路由器的LAN中,因此我无法告知路由器的行为(通常您只能在Web界面中设置路由器的掩码,否则它将被拒绝)。
您也不能在网络设置的相应字段中输入这样的“无效”子网掩码。GUI拒绝使用它。但是您可以通过直接在注册表中进行更改来作弊。之后,重新引导或禁用+启用NIC,以使更改生效。
这一切的目的:嗯,可能没有。


感谢您的分享,但这不能作为独立答案。应该是对萨米·库莫宁(Sami Kuhmonen)答案的评论。
agtoever

2
评论的时间太长了...我也不希望它被标记为答案。
Tobias Knauss 2015年

@agtoever:编辑并添加了更多详细信息之后,我认为它现在确实可以作为一个独立的答案,因为它包含的许多信息不属于其他答案。
Tobias Knauss 2015年

但是,“在一个实现上工作”不是一个答案。这不仅是“在一个OS上运行”,不是,您显然在(重要的)一个网络上测试了一台特定的PC。这意味着您尚未验证Windows 2000中的子网路由代码是否真正起作用,而这正是需要网络ID的地方。您可以在两个不相邻的255.160.0.0网络之间路由吗?
MSalters 2015年

@MSalters只能在一个实现上工作。我并没有声称要为所有可能的配置操作系统发言。另外,您认为数据包如何从一台PC传输到另一台PC?计算机必须知道路线。因此,它必须计算目标计算机是在同一子网中(直接发送数据包)还是在同一子网中(查询配置的网关以获取路由)。//不,我不认为我可以进行这样的路由,因为这些子网掩码并不是要使用的。我演示了一个可行的案例,但是没有其他子网。也许这也行得通,谁知道...
Tobias Knauss 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.