为什么不能将IP地址的主机部分中的全零用作主机?


21

我知道如果我有网络,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

我了解广播地址的用途,但不了解子网地址的用途。我看不到将IP数据包的目标地址设置为子网地址的任何原因,那么如果子网本身永远不会成为IP流的终结点,为什么子网本身需要一个地址呢?对我来说,不允许将此地址用作主机地址似乎很浪费。

总而言之,我的问题是:

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

2
ifconfig将24网络的主机地址设置为0或255时不会抱怨。只需尝试使用它。
ott-- 2012年

2
是的 它似乎适用于.0。但这可能会破坏较旧的软件。如果您不使用任何需要广播的协议,.255也将起作用。我想如果您在所有计算机上手动配置具有永久地址的ARP表,就可以进行设置,但是yuk!
汉尼斯,2012年


1
我不同意那个约翰。我重新检查了一下,它没有解决询问的特定问题。这是一个极端的情况。
Hennes 2012年

1
现在也可以在新的网络工程站点上询问此问题。这些答案(位于http://networkengineering.stackexchange.com/questions/11200/what-is-the-purpose-of-network-address-aka-subnet-address)中包含的信息尚未出现在Server Fault的帖子中。
Hennes 2014年

Answers:


12

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

是。这是有效的IP,因此可以使用。

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

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

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

如果您使用的是较旧的硬件,则需要检查其是否使用第一个或最后一个地址作为网络地址。(对于带掩码FF.FF.FF.00的网络,为.0或.255)

这是跳过该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]

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

/superuser/379451/why-can-a-network-address-not-be-a-valid-host-address

一想到:

Destination_IP可能是被比较的所述路由表中的条目之前与网络桅杆(在硬件中快速操作)编 但:

(半随机IP)192.168.0.42和255.255.255.0会产生192.168.0.0
但192.168.0.0和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.

我们的网络工程站点上引用@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.

因此,澄清一下,您是说xxx0 / 24 主机的有效IP地址吗?如果是这样,那么为什么Windows XP会(当我尝试将IP地址设置为192.168.1.0且网络掩码为255.255.255.0时)说“ IP地址和子网掩码的组合无效。 IP地址的主机地址部分设置为0。请输入IP地址和子网掩码的有效组合。
Grezzo 2012年

3
Windows错误。(或者说用更少的力气:Windows在使用任何系统组合时都非常小心)。我只是在Windows 7系统上尝试过此操作,但是却遇到了与您相同的错误。我安装了一个干净的FreeBSD系统,并在它可以正常工作的地方对其进行了测试。(我将其添加到帖子中)
Hennes 2012年

谢谢,您真的很有帮助。只是想补充一点,OS X中的GUI也不允许您这样做,但是我敢打赌ifconfig可以。我不明白为什么m0ntassar的答案获得了更多的赞成票-它甚至没有尝试回答我的问题。还有一件事; 当您说“ 如果您使用的是较旧的硬件,则需要检查它是否使用第一个或最后一个地址作为网络地址。 ”是指广播地址
Grezzo 2012年

是的,我的意思是广播地址。该死的,“编辑早于5分钟的评论”按钮在哪里。
Hennes 2012年

亲爱的,我只是尝试ping .0和.255,两次我的PS3都从.65回复了(其他一切都是无线的,所以我想这就是为什么它首先出现在这里),从而确认我的网络中都使用了广播。为什么(通常)我们不应该将这两个地址用作真实的主机地址。
Grezzo 2012年

15

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

从历史上看,该零主机地址已用作备用广播地址,并且设备仍然以这种方式进行响应。

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

您看,我的Linksys路由器,其地址.1响应的ping .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

如果我将.0地址分配给某个主机,那么如果没有路由器也响应其响应,就无法ping通它。正如你所看到的,有些工具喜欢路由器的版本ping对待0作为广播。

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

举个例子。

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

出于我们自己的目的,我们基本上将环回地址划分为子网。为了使其正常工作,我们不得不在各处修补Linux内核,并在IIRC上修补一些用户空间。

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


7

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


3
+1-83.23.158.255也是有效的主机地址。人们在不考虑子网掩码的情况下挂在0和255的规则上。
joeqwerty 2012年

1
我知道xxx0地址的网络掩码小于/ 24是有效的,但是请注意,在我的问题中,我指定了/ 24网络掩码,因此您没有回答我的问题。我不是说最后一个四进制/字节中的全0或255,而是说IP地址的“主机部分”中的全0或255。这考虑了网络掩码。
Grezzo 2012年

2
@Grezzo简短答案:非CIDR和旧版内容以.0开头,MS完全禁止使用。但是IPv6迫在眉睫,为什么还要担心呢?;)
Sammitch 2012年

2
这并不是一个真正的答案,因为问题实际上与点表示法无关,而与任何宽度子网中0主机地址的状态/含义有关。
卡兹(Kaz)2012年

2
我不明白为什么这个答案有那么多赞成票。83.23.159.0/23在技术上不是有效的网络。带有23个掩码的83.23.159.0实际上是83.23.158.0/23网络中间的ip。问题不是“为什么我在IP末尾不能有.0”,而是“为什么我不能在主机部分使用全零的地址”。在您的示例中,“所有主机零”地址为83.23.158.0。如其他答案中所述,这在历史上是一个不可用的地址(“网络地址”),尽管它可以在某些OS上运行,但建议不要尝试使用它。
美元马特

3

听起来基本的网络有点混乱。

响应之一中提到的“古老硬件”将不会使用IP子网零-使用IP地址xxx0并为/ 24 CIDR或255.255.255.0子网掩码设置网络是完全不同的问题。

IP子网零

  • 较旧的硬件不会使用IP子网零-这意味着它们将不会在多子网网络系统上使用第一个子网。因此,在/ 23或255.255.254.0网络上,将不会使用子网XXX0及其所有地址。现代路由器没有此限制,但是可以根据需要配置为使用此旧模型IE,而不使用子网零。

子网上可用的主机IP地址

  • 基本联网:
    • 使用/ 24,即255.255.255.0的子网掩码
    • xxx0保留为网络地址。路由器和路由协议(EIGRP,RIP2等)使用网络地址来定义网段,以在网络边界内和网络边界之间移动数据包。
    • xxx255为广播地址保留
    • 通常的做法是在路由器上使用地址.1或.254,以便保留253个可用IP地址。

网络地址和广播地址都是保留的,并且不能(通过当前和以前的网络标准)分配给设备。在/ 24系统上使用xxx0作为主机地址是错误的。即使Linux允许您使用它并不意味着它是正确的,仅意味着Linux认为您知道自己在做什么。

如果您的系统允许您将xxx0作为IP4地址分配给主机,并且该主机似乎正在运行,则可能是该主机接收了针对该网络上任何设备的所有流量,因此其网络可能无法正常工作。


1
您已经说过:“ xxx0被保留为网络地址(可以将其视为全局地址或指向整个子网的指针) ”,但没有说明它的实际用途,因此也没有说明为什么它不能用于主机
Grezzo 2012年

2
更新了我的帖子。最重要的是,将网络地址分配给设备是违反规范的,尽管您可能会在小型存根网络中使用它,但是仍然存在风险,即如果您的路由器是软件更新(或更改路由器) ),则设备或整个网络可能会停止正常运行。
TheSteven 2012年

3

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

对于<主机号>,<网络号>或<子网号>字段,IP地址不允许为0或-1。


1
就目前而言是正确的。但是,如果按照建议实际去第3.3.6节,您将获得完整的解释。
迈克尔·汉普顿

@MichaelHampton因为BSD 4.2使用0作为广播?
Grezzo 2014年

3
@Grezzo差不多。坚持这样做是因为80不会死。
迈克尔·汉普顿

0

实际上,答案是子网划分的基础。子网的“全零” IP与网络ID一起用于计算数据包必须发送到的位置。

在您的示例中,您的子网为255.255.255.0。任何知道TCP / IP协议的设备都将使用网络掩码和IP地址来计算该数据包是发往本地网络(通过执行逻辑AND操作)还是必须通过网关/路由器发送。

因此,我猜想不能使用IP的原因是因为它已经被用来通过设计来“定义”网络边界以及网络掩码。


您说:“ 任何知道TCP / IP协议的设备都将使用网络掩码和IP地址来计算数据包是否发往本地网络(通过执行逻辑AND操作) ”,但是将AND。83.23.159.0与255.255 .255.0和ANDing 83.23.159.1与255.255.255.0会产生相同的结果(83.23.159.0),因此即使主机具有.0地址,使用此计算来确定它是否是发往网络或路由器的仍然有效
Grezzo

0

有人要求我从NetworkEngineering重新发布我的答案,所以我将对此网站进行一些修改。

RFC919中,它引用了网络地址的普遍接受性:

However, as a notational convention, we refer to
networks (as opposed to hosts) by using addresses with zero fields.
For example, 36.0.0.0 means "network number 36"

这提供了一个约定,可以澄清我们是否有人将“ 10.1.2.0”作为网络而不是网络上的主机来提及。

从那里开始,在RFC923中定义了IP地址中“ 0”的使用,并在后续的RFC中继续使用:

Special Addresses:

  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.

本示例通过在地址的网络部分使用0来提供当前网络(0.0.0.37)上的特定主机,但实际上并没有阐明相反的情况(地址的主机部分为0)。但是,确实将“ 0”定义为“ this”。

RFC1060中,地址“ 0.0.0.0”清楚地记录为“此网络上的主机”:

     (a)   {0, 0}

        This host on this network.  Can only be used as a source
        address (see note later).

由于地址的主机部分的全零表示“此主机”,因此从逻辑上讲它不能用作主机地址。

回到直接回答您的问题:

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

根据我在RFC中找到的内容,不应使用此功能。我承认并没有像我想要的那样明确指定,但这在许多标准中都是很常见的。当某一点上的标准不太牢固时,该行业便似乎“解决”了一个普遍接受的解释。

此外,基于RFC的内容,可以编写软件以假定该地址用于寻址网络而不是特定主机。甚至更确切地说是某种“回送”(即指定网络上的此主机)。

那么,为什么某些操作系统明确允许使用它?我会想像很多事情都取决于开发人员的时间/资源,或者没有人真正想到添加有效性检查。逻辑必须比“如果它以0结尾”更复杂,因为更大的子网(/ 23或更大)将包含有效的IP地址.255和.0(即10.1.2.0/23都包含有效的IP)地址为10.1.2.255和10.1.3.0)。尽管某些组织也确实避免在较大的子网中使用这些有效地址,以避免由于不正确支持现代子网划分的软件出现任何奇怪的问题。

至于为什么不释放一个IP地址,则仅归结为成本/收益。进行此更改需要花费很多时间和精力才能为每个子网找回一个IP地址,并且在许多情况下需要其他IP地址,仅一个地址就足够了吗?添加第二个子网或扩大当前的子网要容易得多,这可能会给您提供许多可用地址,而不只是一个地址,而无需对现有的任何软件/硬件进行重大更改。

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.