0.0.0.0是一个有效的IP地址吗?

71

0.0.0.0是一个有效的IP地址吗?我希望我的程序能够将其存储为没有使用地址的指示,但如果它实际上是有效的,这将行不通。

答案:是的,0.0.0.0是一个有效的IP地址。在网络编程中,它用于表示所有可用的IP地址或表示服务器端监听所有网络接口的请求。因此,您可以将其用作未使用地址的指示。

为什么?这可能有什么应用? - griegs
你尝试过ping它吗? - hlynur
保留IP地址列表在这里 - hlynur
33
我认为这是一个合理的问题,与编程有关。例如,如果你正在存储IP地址,你可能希望将“无可用IP地址”表示为零,如果0.0.0.0是有效的IP地址,则无法实现。 - James McNellis
10
这是“谁能更快地打开维基百科”比赛,所有答案都与此相关。 - Andrey
这个问题有答案解释了IPv4的0.0.0.0地址。 - Ron Maupin
10个回答

62

该IP地址在有效性方面是合法的,因为它包含了四个八位字节,每个字节的值均在0到255之间(包括0和255)。但是,作为真实的IP地址,它是不可用的。

RFC1700(a)中指出,0.0.0.0/8 (0.<anything>.<anything>.<anything>) 保留为仅用作源地址。当你似乎使用了这个地址时,通常是因为尚未给你分配任何地址(例如由DHCP),而造成的情况。

请参见Wikipedia IPv4词条。


(a)虽然此RFC现已被认为已过时,但其所述行为在技术层面上仍然是正确的。它的替代品https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml仍然具有相同的描述,详细说明了0.0.0.0地址的用途。


4
我可能错了,但实际上这是一个 IP 地址 -- 只是被保留了。仅仅因为被保留了并不意味着它不是一个 IP 地址。 - Cristian Sanchez
1
我认为“valid”指的是可用的。由于每个八位组都在0到255的范围内,因此它肯定是合法的IP地址。调整答案以澄清。 - paxdiablo
我想确保我的先前评论是正确的,所以我进行了一些阅读。RFC 1700规定:“IP地址分为五个类别:A类到E类。”在RFC 790中,它指出0.rrr.rrr.rrr属于“A类网络”。因此,由于0.0.0.0是一个A类地址,它是一个IP地址。如果这些陈述中有任何错误,请随时纠正我。 - Cristian Sanchez
@Daniel,我不认为你的任何陈述都是错误的,我们只是对“有效”具有不同的理解,这就是为什么我进行了澄清。 - paxdiablo
RFC1700已被RFC3232所取代,后者指出:“RFC 1700已经过时,其值不完整,并且在某些情况下可能是错误的。” - philippe lhardy
实际上,真正的源参考是 IANA:https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml,其中明确在表格中说明它不能用作目的地。 - philippe lhardy

10

让我们来看一下提问者所问的问题。

0.0.0.0是一个有效的IP地址吗?

是的。从技术上讲,这是一个有效的IP地址,其他答案描述了它的许多不同用途(我不打算在这里重新发布wikipedia的链接...或许我会)。因此,我认为paxdiablo的答案是最正确的,但我们也要考虑你问题的背景。

我想让我的程序能够将其存储为没有使用地址的指示,但如果它实际上是有效的,这将无法实现。

这完全取决于您的用例。鉴于这是一个程序员论坛,让我们考虑这个角度。

如果您的软件正在存储实际的互联网地址 - 服务器位置、访问者到您的网站、复制/镜像或备份站点、Web服务或数据库服务器等 - 那么这将是完全有效的。互联网上没有任何机器分配这个地址,也不会解析为有效的连接。

如果你正在编写防火墙或路由器固件,那么这个地址确实具有特殊意义;默认路由、接受任何IP源/目的、阻止所有IP源/目的、全捕获等等,正如其他人所概述的那样。但是,让我指出,如果你在这个层次上编程,你应该有足够的网络协议理解能力,以至于不需要首先问这个问题。
因此,我假设大多数查看此问题的人属于第一类,并建议(如果有某些原因不能使用实际的null值)这是一种存储空、空IP地址或丢失的IP地址的完全有效的方法。即使忽略验证检查,你的软件也无法连接到这个IP地址。

1
如果没有其他问题,允许将有效值重载为标志项的麻烦在于它会鼓励不良习惯。这也可能是一个真正的问题:代码在其他地方被重用,其中重载值具有意义,现在存在着微妙的错误。 - studog

8

0.0.0.0用于绑定所有IPv4接口。因此,它就像127.0.0.1一样是一个特殊值。


7

是的,它是一个IP地址,但它是保留地址。

0.0.0.0/8 - 此块中的地址是指“此”网络上的源主机。地址0.0.0.0/32可以用作该网络上此主机的源地址;0.0.0.0/8内的其他地址可用于引用此网络上指定的主机。


3

这个地址被保留为默认路由地址。

当你没有分配到任何地址时,通过ipconfig命令可以常见地看到它。


5
你正在考虑的是0.0.0.0/0,这与0.0.0.0/32非常不同。 - Nick Whaley

1

进行网络Whois查询还可以产生非常有用的输出。
例如:
http://whois.arin.net/rest/nets;q=0.0.0.0?showDetails=true

注释:当计算机正在学习应使用哪个IP地址时,地址0.0.0.0只能用作出站数据包的地址。它从不用作目标地址。以“0.”开头的地址有时用于直接连接的设备广播。


1

就所有目的而言,是的。由句点分隔的四个数字中的每一个都有一个值,范围从0到255,因此0.0.0.0在技术上是有效的。

我不认为世界上会有任何人实际拥有那个IP地址。

编辑:好吧,它被保留用于默认路由,但仍然有效。


它被保留用于默认路由。 - jer

1

您可以在应用程序中使用它来表示它没有IP地址,当机器没有IP地址时,Microsoft也使用0.0.0.0。

上述“有效”场景取决于特定的情况,与您的应用程序无关。


你可以这样做,但最好不要。因为它是一个可以被寻址和具有功能的IP地址。 - The Surrican
@TheSurrican 这是一个无法寻址且具有功能的IP地址。 - user207421

1

正如其他答案所述,0.0.0.0是一个合法且对某些目的有效的IP地址。

如果范围内的所有值都是合法值,则您想要定义的任何标志项必须来自其他地方。否则,您将会用标志的含义超载一个合法值,并且在使用超载值时,无法100%确定是想要合法值还是标志含义。这将导致错误,必须通过重新设计来解决,这可能是一项昂贵的工作。

合法值的超载经常发生,IP地址和MAC地址(是的,00:00:00:00:00:00是合法的并已分配)是最常见的受害者之一。

巧合的是,我现在正在开发一个不基于以太网/IP的系统,其中帧的长度被限制在约40个字节左右。由于一个字节可以表示0-255个字节的长度,而最大长度为40个字节,因此我可以使用一些未使用的非法值(252到255)来表示标志项。这些带内标志是可以的,因为没有超载。


我现在正在处理一个系统,其中帧的长度被限制在大约40个字节。哪种数据链路协议会将帧限制在40个字节?通常情况下,都有最小帧长要求。例如,以太网需要64个字节的最小帧长,并且它会填充有效载荷以达到该要求。 - Ron Maupin
@RonMaupin 这不是以太网/IP系统,只是我手头恰好有一个实际的带内标记示例。 - studog

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接