为什么网络地址不能是有效的主机地址?


18

所以...我已经为CCNA等进行了研究,并且至少在过去8年左右的时间里一直在与IP网络合作。我一直看到并被告知子网的网络地址不是有效的主机地址。现在首先我要说的是,这是事实。我的问题是更多...是有技术原因不能使用它,还是只是在设计规范时就任意同意了?我了解为什么不能使用广播地址(因为它已被实际使用)。问题是,当我看到使用的网络地址时,通常仅在专门使用网络地址的路由中使用。在这种情况下(仅当您期望使用网络地址时才使用网络地址)是否出于某种技术原因无法将网络地址作为实际的有效主机地址?

Answers:


16

据我了解,作为特殊地址的“网络地址”是过去IP网络中的一种人工产物。今天,我们在Internet上使用了无类域间路由(CIDR),它没有网络地址的概念(如果您查看上面链接的RFC 4632,您会发现它为每个旧版列出了256个可能的IP地址“ C”块,例如,没有为网络或广播地址保留的地址(尽管广播在其他RFC中被定义为必不可少的)。

话虽如此,您仍然不应该将网络地址分配给网络中的任何特定主机:网络地址对于路由至关重要。此概念在RFC(RFC 1812)中得到广泛使用。只需查看路由表(route命令),您就会看到如何使用本地网络地址将本地网络流量与必须通过路由器的流量分开。如果该本地网络地址已分配给某个主机怎么办?

更糟糕的是:最好不要分配以零结尾的IP地址,即使该地址不是网络地址也是如此。例如,如果您的网络是10.10.0.0/255.255.0.0,则IP地址10.10.5.0不是您的网络地址,但是即使这样的IP在分类IP网络上也完全有效,也最好不要分配该IP。一些旧版软件/ IP堆栈可能会出现问题。

更新:通过妖精

根据RFC 1812(第5.3.5.2节),我们所谓的网络地址最初用于“定向广播”,该广播会将广播数据包发送到所需的网络。由于SMURF攻击,此功能已过时。该功能已在RFC 2644中正式更改。随后,其他实现静默丢弃具有所描述的源地址(网络地址)的数据包。尽管这应该发生,但我对实际上有多少种实现感到好奇。

当解决/ 31子网划分时,这会进一步添加到RFC 3021中


5
@grawity:并非总是如此。仅在大于/ 31的网络中。例如,P2P可以有两个地址,没有广播地址。
haimg 2012年

3
嗯...我喜欢答案的第一部分...这是来自IP网络的人工产物。第二部分的问题是路由表专门用于路由到网络。据我了解,路由表仅用于路由到接收者所在的网络(目标IP不在您的子网/网络中)。就是这种情况……在查看路由表时,很明显其中的地址是网络地址而不是主机地址,因此将其与主机数据包目标IP分开。在实际流量中,从不使用网络地址的目的IP。
Goblinlord 2012年

1
因此...如果这两个实例已经分开(在确定是否需要查看路由表时,路由表中的网络地址和目标IP)已经存在,有什么理由要专门保留它。
Goblinlord 2012年

1
@Goblinlord:我找不到正式的理由(最近的RFC等)。但是,在假设网络地址是“特殊”的情况下构建了如此多的软件,因此实际上最好不要将其用作主机IP地址。
haimg 2012年

1
有一个cisco config条目,它允许网络地址也可以是主机,该主机已经存在了至少10年了……我从未使用过它,甚至没有对其进行测试,并且由于提到的可能的堆栈问题,特别是没有不允许主机在我负责的网络上以.0或.255结尾,尽管我没有遇到@Home小于/ 24s的其他网络或广播地址,而CoreOS希望发出中间.0和.255作为sanbrunocable的/ 23和/ 21的主机,我手动保留了它们。
内文·威廉姆斯

5

因此,实际答案是:确实取决于。这取决于:

  • 确切的地址及其在许多RFC中的含义
  • 操作系统的版本和修订版
  • ...以及您的路由器以及其他所有上游路由器的
  • ...以及这些路由器的所有网络管理员的智能和精巧...

在测试此网站时,我没有遇到任何问题。看来,最终这一切都取决于网络管理员的想法。上游设备通常无法得知地址是网络地址还是广播地址的一部分,因为它只是一个更大的地址范围,因此,没有ISP会阻止您分配和分配地址。使用您的网络地址,除非他们将其分配给您,并且其网络管理员已明确阻止它。

我敢肯定,那里有安全分析人员和黑客,他们疯狂地详细统计了确切的TCP-IP堆栈实现的变体以及可以做什么,不允许或不允许的事情以及确切的方式和位置。 。

实际上,我正在从我的网络地址浏览并发布此信息。

除非您有更好的解决办法来修复这套纸牌屋,否则不要称呼我为坏网民:事实是,如果可能的话,那将会发生。现实是,没有一个真正聪明的人坐下来思考所有可能发生的事情,以便在人们开始使用它之前就想出一个完全防呆的设计,就像生活中的大多数事物一样。结果?不会在翻译中加总和/或丢失很多东西的标准。

欢迎来到真实的世界。不要让这种情况阻止您追逐难以捉摸的最佳理想……只是不要期望来自“官方”渠道或论坛的支持,除非您愿意动手并为之付出时间和生命,必要的共识,并以此围绕政治。

因此,我认为其他发布者想说的是:如果您要制定此正式政策并在生产中使用它,那您就该靠自己了。(但是,您不是吗?)也许我们会很幸运,并有计算机智能为我们设计了一个IPv8,该IPv8向后兼容IPv4和IPv6及其所有坏的实现。


当然-当您使用网络地址时,分配给该设备的设备可能会接收各种广播流量,因为某些网络堆栈会将其视为广播。但是,它们通常不会受到太大干扰,因为它们只是默默地掉落了。我很好奇有多少网络攻击者依赖于此周围的特性...
Dagelf

2

我是网络新手,但我也会给我2美分。

如果我有一个从xxx0到xxx15的/ 28子网,根据预定义的规则,我们将有14个可用主机和2个剩余主机。其余的用于网络和广播。

让我们实际使用所有16​​个主机,而不是遵循上面的规则。那样的话一切都会好的,没有问题。但是,如果需要在网络外部进行通信,则由于缺乏发送或接收信息的资源而将不可能。

我不是很擅长解释,而是换一种说法。

如果我住在一条街上的房子里,那条街上有14座房子。进出主要道路的车道。

我的邮寄地址范围为网络路外的1-14 Personal Street。

对于邮递员来说,那将不是问题。现在,假设开发人员贪婪并添加了2栋房子,并且摆脱了巷道。

然后我的新邮寄地址范围为1-16 Personal Street

在这种情况下,邮递员将有麻烦。

这是一个猜测,让我知道我是否在说公牛。


0

网络地址允许您使用固定大小(4字节的IPv4)目标列和固定大小的二进制操作来构建路由表,以便主机路由和网络路由实际上是同一回事。

想象一下这样的路由表:(此PC与另一台PC和网卡具有并行连接)

Dest           Mask    Dev
192.168.0.123  /32     plip0   # This is a single host
192.168.0.0    /24     eth0    # This is a network

IP地址和网络掩码之间的AND可以满足您的需求,它是一个4字节的数字,可以与每一行进行比较,而无需进行进一步的计算。

因此,主机号零在某种意义上是特殊的,因为AND操作后其地址自然代表了整个网络。

如果您决定将网络号用作主机号,则将产生如下表:

Dest           Mask    Dev
192.168.0.0    /32     eth0    # This is the host (it's a redundant line)
192.168.0.0    /24     eth0    # This is the network

这似乎是合法的,因此我认为网络地址的概念是出于路由原因而使用的,因此可以任意决定将其标记为特殊地址,并禁止将其用作主机地址。

好吧...实际上并不是那么简单。我决定尝试一下(!!!):

# route add -net 192.168.0.0/32 eth0
# ping 192.168.0.0
Do you want to ping broadcast? Then -b
# telnet 192.168.0.0
Trying 192.168.0.0...
telnet: connect to address 192.168.0.0: Network is unreachable

目前,网络程序不允许我使用网络号作为常规地址。


考虑到您的第一个路由表示例,我认为这是做事的一种非常糟糕的方法...如果您在.0.0子网中有其他主机,那么它们如何与.0.123主机彼此正确通信,而又不会静态设置路由每个主机?这确实似乎不是正确的做事方式。
Goblinlord 2012年

这只是一个虚构的例子,我永远不会建立这样的表:-) .123主机通过点对点连接进行连接,而其余的则是通常的以太网网络。如果您希望其他计算机访问.123主机,则需要做其他工作,但这并非没有可能。
大卫·科斯塔

0

在寻找该问题的答案时,我从Cisco 看到了这篇文章。我认为该文章的以下引言很好地总结了这一点。

[...]考虑IP地址172.16.1.10。如果计算与该IP地址相对应的子网地址,则得出的答案是子网172.16.0.0(子网零)。请注意,该子网地址与首先被子网划分的网络地址172.16.0.0相同,因此,无论何时执行子网划分,都会得到一个网络和一个地址(无法区分)的子网(子网零)。以前这是造成极大混乱的根源

对我来说,避免混淆是一个足够好的理由。


我知道这个问题是很久以前提出的,但是我只是在审查这些东西。您引用的文章谈论的是“子网零”或网络地址中的第一个子网。这是完全不同的,我在任何交换机上使用的任何现代网络都启用了“ ip subnet-zero”功能。它还提到,如今,默认情况下,所有交换机上均默认启用了该功能(自2003年左右发布的版本12开始)。
Goblinlord

0

RFC 1122(“ Internet主机的要求-通信层”)禁止这样做:

对于<主机号>,<网络号>或<子网号>字段中的任何一个,IP地址都不允许具有值0或-1。


0

网络地址不被视为主机地址,而只是一个数字。在地址受限的区域(如点对点网络)中,经常使用/ 30掩码,但仍使用主机地址。较少的实践,但达到相同的原理是使用/ 31掩码,并将一端作为网络地址,另一端作为广播。

例如

Router(config)#int gi0/0
Router(config-if)#ip add 10.0.0.0 255.255.255.254
Router(config-if)#no shut


Router2(config)#int gi0/0
Router2(config-if)#ip add 10.0.0.1 255.255.255.254
Router2(config-if)#no shut


        .0        .1
[Router]-----------[Router2]
   network      broadcast
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.