Netmask

為什麼 IP 地址的主機部分中的全零不能用於主機?

  • January 15, 2021

我知道,如果我有一個網路,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 數據包的目標地址設置為子網地址,那麼如果子網永遠不會成為 AN IP 流的端點,為什麼它本身需要一個地址呢?對我來說,不允許將此地址用作主機地址似乎是一種浪費。

總結一下,我的問題是:

  1. 是否曾經將 IP 數據包的目標設置為子網 IP 地址?
  2. 如果是,在什麼情況下,為什麼?
  3. 如果不是,那麼為什麼不釋放該地址供任何主機使用呢?

是否曾經將 IP 數據包的目標設置為子網 IP 地址?

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

如果是,在什麼情況下,為什麼?

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

如果不是,那麼為什麼不釋放該地址供任何主機使用呢?

如果您有古老的硬體,那麼您需要檢查它是使用第一個地址還是最後一個地址作為網路地址。(.0 或 .255 用於遮罩為 FF.FF.FF.00 的網路)

這使得跳過該 IP 成為一個好習慣。很久以前養成的習慣很難忽視。

而不知道背景的人不會使用它,“因為其他人也不會使用它,所以使用它肯定是錯誤的”或者因為他們沒有意識到“0”可以是第一個數字。

$$ Edit $$Grezzo 剛剛在 Windows XP 上對其進行了測試,其中 Windows 網路 GUI“有效地”阻止了此設置。Windows 7 具有相同的行為。然後我在一個可以正常工作的非 Windows 主機上嘗試了它。如果您使用 Windows,那麼您可能必須通過 IPconfig 手動配置網路以將其設置為全零。 192.168.1.0_on_win7 192.168.1.0_on_FreeBSD

$$ Edit 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 將是該範圍中間的有效且安全的值)

$$ Edit 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.

我們的網路工程網站上引用@ylearn

我相信第一個文件來自引用RFC943的RFC950(它已經過時了上面的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.

引用自:https://serverfault.com/questions/451238