为什么不能将 IP 地址的主机部分中的所有零都用于主机?

Gre*_*zzo 24 netmask

我知道如果我有一个网络,83.23.159.0/24那么我有 254 个可用的主机 IP 地址,因为:

83.23.159.0      (in binary: host portion all zeros) is the subnet address
83.23.159.1-254  are host addresses
83.23.159.255    (in binary: host portion all ones) is the broadcast address
Run Code Online (Sandbox Code Playgroud)

我了解广播地址的用途,但我不明白子网地址的用途。我看不出有任何理由将 IP 数据包的目标地址设置为子网地址,那么如果子网本身永远不会成为 AN IP 流的端点,为什么它需要一个地址呢?对我来说,不允许将此地址用作主机地址似乎是一种浪费。

总结一下,我的问题是:

  1. IP 数据包的目的地是否曾经设置为子网 IP 地址?
  2. 如果是,在什么情况下以及为什么?
  3. 如果不是,那么为什么不释放该地址供任何主机使用?

Kaz*_*Kaz 15

具有全零主机部分的地址指的是网络本身,而不是任何特定的主机。

从历史上看,这个零主机地址一直作为替代广播地址,设备仍然以这种方式响应。

所以,我不得不不同意其他一些答案:不,零不是一个完全可用的主机地址。如果您需要超过 254 个地址,则必须创建更大的子网。

看,我的 Linksys 路由器,其地址.1响应.0. (网络掩码是255.255.255.0,所以最后一个八位字节对应于主机号。)

webserver:~# ping  192.168.1.0
Do you want to ping broadcast? Then -b
webserver:~# ping -b 192.168.1.0
WARNING: pinging broadcast address
PING 192.168.1.0 (192.168.1.0) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.46 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.812 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.819 ms
Run Code Online (Sandbox Code Playgroud)

如果我将.0地址分配给某个主机,我将无法在没有路由器响应的情况下 ping 它。正如您所看到的,某些工具(例如该路由器的版本)ping将其0视为广播。

如果您愿意修补所有受此类弯曲影响的协议堆栈和其他软件,则可以弯曲规则。否则,遵守规则。

举个例子。

我曾在一家公司工作,该公司设计了一个内置 14 槽机箱的网络节点,在多种类型的卡上运行大量独立的操作系统映像,所有这些都通过背板进行通信。背板上有一个网络设置,约定127.X.0.Y是插槽 X 中节点 Y 的内部 IP 地址,所有编号从 1 开始。

我们基本上出于自己的目的对环回地址进行了子网划分。为了使它工作,我们不得不到处修补 Linux 内核和 IIRC,一点点用户空间。

由于该网络仅在框内使用,并且大多数需要环回的程序使用继续正常工作的127.0.*网络(实际上是特定地址127.0.0.1),所以一切都很酷。


Hen*_*nes 13

IP 数据包的目的地是否曾经设置为子网 IP 地址?

是的。它是一个有效的 IP,因此可以使用。

如果是,在什么情况下以及为什么?

它只是 /24 中的 255 个可用 IP 之一

如果不是,那么为什么不释放该地址供任何主机使用?

如果您有古老的硬件,那么您需要检查它是使用第一个地址还是最后一个地址作为网络地址。(.0 或 .255 对于掩码为 FF.FF.FF.00 的网络)

这使得跳过该 IP 成为一个好习惯。很久以前习得的习惯很难被忽视。

不了解背景的人不使用它,“因为其他人也不使用它,所以使用它一定是错误的”,或者因为他们没有意识到“0”可以是第一个数字。

[编辑] Grezzo 刚刚在 Windows XP 上对其进行了测试,其中 Windows 网络 GUI“帮助”阻止了此设置。Windows 7 具有相同的行为。然后我在它可以正常工作的非 Windows 主机上进行了尝试。如果您使用 Windows,那么您可能必须通过 IPconfig 手动配置您的网络以将其设置为全零。

192.168.1.0_on_win7 192.168.1.0_on_FreeBSD

[编辑 2]

我处理这个的时间越长,我就越困惑。

Rfc4632 - 无类别域间路由 似乎没有禁止它,但也没有明确允许它。

这篇 ServerFault 帖子提到:“由于历史原因,许多操作系统将第一个地址视为广播。例如,在我的本地 (/24) 网络上从 OS X、Linux 和 Solaris ping xxx0 得到响应。Windows 不允许您 ping默认情况下是第一个地址,但您可以使用 SetIPUseZeroBroadcast WMI 方法启用它。我想知道您是否可以在全 Windows 网络上使用 .0 作为主机地址。” .

这是同一个问题,但不是答案。

网络地址也用于路由表。但我不明白为什么它会因此而不起作用。路由表中的相同符号将路由到正确的网络。一旦进入正确的网络,它就会到达一台 IP 为 0 的 PC。

(所有这些都是针对 192.168.1/24。
如果您使用 192.168.0/23,那么 192.168.1.0 将是范围中间的有效且安全的值)

[编辑 3]

另一个指向同一问题的链接。在堆栈交换中似乎有些流行:

https://superuser.com/questions/379451/why-can-a-network-address-not-be-a-valid-host-address

还有一个想法:

在与路由表中的条目进行比较之前,Destination_IP 可能网络桅杆(硬件中的快速操作)进行了“与”运算。但:

(半随机 IP) 192.168.0.42 AND 255.255.255.0 会产生 192.168.0.0
但 192.168.0.0 AND 255.255.255.0 也会产生 192.168.0.0


[编辑 4 - 在写完这个答案很久之后 - 由于这个新信息,我可能需要重写整个帖子]

RFC923在第 3 页指出:

  In certain contexts, it is useful to have fixed addresses with
  functional significance rather than as identifiers of specific
  hosts.  When such usage is called for, the address zero is to be
  interpreted as meaning "this", as in "this network".  The address
  of all ones are to be interpreted as meaning "all", as in "all
  hosts".  For example, the address 128.9.255.255 could be
  interpreted as meaning all hosts on the network 128.9.  Or, the
  address 0.0.0.37 could be interpreted as meaning host 37 on this
  network.
Run Code Online (Sandbox Code Playgroud)

我们的网络工程网站上引用@ylearn

我相信它的第一个文档来自RFC950,它引用了RFC943(上面已经废弃了RFC923,但对特殊地址使用了相同的语言):

     It is useful to preserve and extend the interpretation of these
     special addresses in subnetted networks.  This means the values
     of all zeros and all ones in the subnet field should not be
     assigned to actual (physical) subnets.
Run Code Online (Sandbox Code Playgroud)

  • 窗户错了。(或者用较少的力量说:windows 对任何系统组合都过于小心)。我刚刚在我的 Windows 7 系统上尝试过这个,我得到了和你一样的错误。我安装了一个干净的 FreeBSD 系统并对其进行了测试。(我会把它添加到帖子中) (3认同)

m0n*_*sar 7

实际上它取决于网络掩码,例如,对于网络 83.23.159.0/23,83.23.159.0 是一个完全可用的 IP 地址

  • +1 - 83.23.158.255 也是一个有效的主机地址。人们在不考虑子网掩码的情况下,就陷入了无 0 和无 255 的规则中。 (3认同)
  • 我不明白为什么这个答案有这么多赞成票。83.23.159.0/23 在“技术上”不是一个有效的网络。掩码为 23 的 83.23.159.0 实际上是 83.23.158.0/23 网络中间的一个 ip。问题不是“为什么我不能在 ip 末尾有 .0”,而是“为什么我不能使用主机部分全为零的地址”。在您的示例中,“所有主机零”地址将为 83.23.158.0。正如其他答案中提到的,这在历史上是一个不可用的地址(“网络地址”),虽然它可能适用于某些操作系统,但不建议尝试使用它。 (3认同)
  • @Grezzo 简短回答:非 CIDR 和遗留的东西用 .0 破坏,MS 只是完全禁止它。但 IPv6 迫在眉睫,何必担心呢?;) (2认同)
  • 这不是真正的答案,因为问题实际上不是关于点符号数字命理学,而是关于任何宽度子网中 0 主机地址的状态/含义。 (2认同)