我在這看到問題,路由表有:
192.168.1.1/32 link#4 UCS 2 0 en0
openwrt.lan 46:94:fc:63:fc:7 UHLWIir 11 3610 en0 1200
192.168.1.125/32 link#4 UCS 2 0 en0
/32
子網路遮罩是什麼意思?如果我們將上述視為單一主機,那麼主機是否可以在沒有網路 ID 的情況下存在?
據我所知,分配給該網路中主機的網路 ID 和 IP 位址是兩個不同的東西。 192.168.0.0 是一個網路 ID,如果其子網路是 255.255.255.0,則該網路中的主機可以是 192.168.0.1 - 192.168.0.254。在這種情況下,主機如何能夠在沒有網路 ID 的情況下存在?
答案1
這裡有一點混亂; /32 並不是指任何(子)網路的大小,而是指特定路由表條目適用的位址範圍。通常這兩者是相同的(因為您將網路或子網路作為一個單元進行路由,對吧?),但 macOS 對於同一本地網路上的其他主機的處理方式略有不同。讓我在您引用的內容之前添加幾行:
Destination Gateway Flags Refs Use Netif Expire
default openwrt.lan UGSc 10 0 en0
...
192.168.1 link#4 UCS 2 0 en0
192.168.1.1/32 link#4 UCS 2 0 en0
openwrt.lan 46:94:fc:63:fc:7 UHLWIir 11 3610 en0 1200
192.168.1.125/32 link#4 UCS 2 0 en0
請注意,192.168.1(192.168.1.0/24 的縮寫)透過 en0(又稱 link#4)進行路由;不通過任何網關,僅透過介面本身。這是 Mac 本身所在的網路。 192.168.1.1和192.168.1.125都是特定位址在該網路範圍內。如果將這些 /32 條目與 192.168.1 條目進行比較,它們基本上是冗餘的重複項;他們說的是同樣的事情,只是針對特定位址而不是整個網路範圍。
我不知道為什麼 macOS 會建立這些冗餘的特定於位址的條目,但這可能與您在上面的清單中看到的另一件事有關:macOS 在路由表中列出了其 ARP 表條目。上面的「openwrt.lan」條目(我很確定實際上是 192.168.1.1,只是按名稱而不是數字列出)表示它通過 en0 路由到 MAC 位址 46:94:fc:63:fc:7 。
因此,您在路由清單中看到的是實際網路路由(如「預設」和 192.168.1 條目)和每個主機條目(/32 和 MAC 目標條目)的組合。
答案2
/32
尋址
一般來說,/32
這意味著網路只有一個 IPv4 位址,所有流量將直接在具有該 IPv4 位址的裝置和預設閘道之間傳輸。該設備將無法與本地子網路上的其他設備進行通訊。
我發現有幾個可能的原因。它可能是:
- 為多個站點提供服務的網路伺服器,每個站點都綁定到特定的 IPv4 位址
- A環回地址用於測試。
- 網路安全技巧:將具有 /32 網路遮罩的電腦與子網路上的其他系統隔離。這僅允許流量到達由系統上的靜態路由明確定義的目的地。例如,這可以用於停用系統。
網路ID
這網路IDIP 位址的一部分由子網路遮罩決定。例如:
- IPv4
/24
網路的子網路遮罩為1111.1111.1111.0000
,這表示前 3 個八位元組是網路 ID,最後一個八位元組用於分配主機 ID(256 個可用 ID,但通常有一些是保留的)。 - IPv4
/16
網路的子網路遮罩為1111.1111.0000.0000
,這表示前 2 個八位元位元組是網路 ID,最後一個八位元組用於分配主機 ID(65536 個可用 ID,但通常會保留一些 ID)。
對於 的情況/32
,這不適用,因為位址既是網路 ID 又是主機 ID。/31
位址也是沒有保留第 0 個位址的所有主機 ID。
答案3
答案4
你看到的不是子網路遮罩。它們指示路由表1前綴的長度。
路由表的簡單實作會列出每個可能的 IP 位址,這樣,對於給定的任何 IP 位址,您都可以找到確切的 IP 位址並取得與其關聯的路由資訊²。
顯然需要某種壓縮。路由資訊的本質是相鄰的位址很可能使用相同的訊息,因此我們可以使用一種形式基數樹將它們壓縮在一起。下面簡單介紹一下它的工作原理。
給定數字 0-7,我們可以用二進位表示它們,如下所示:
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
現在,如果我們有兩個路由表條目,一個用於位址 0 和 1,另一個用於位址 2 和 3,我們可以將它們儲存在它們共享的二進位前綴下。如果我們使用 a.
來指示前綴末尾後的「未使用」位,則我們有00.
範圍 0-1 和
01.
範圍 2-3。
表示這一點的標準方法是使用範圍中的最小數字,後面跟著前綴的長度;在這種情況下,這些將0/2
用於範圍 0-1 和2/2
範圍 2-3。
但是如果我們想查找位址 6 的路由資訊,會發生什麼事呢?通常我們會添加一組帶有前綴的「預設」路由訊息0/0
,即匹配任何位,然後當我們搜尋時,我們會尋找最具體的信息,即我們可以找到的最長匹配前綴。所以我們剛剛描述的完整路由表是:
0/2 00. Matches addresses 1 and 2.
2/2 01. Matches addresses 3 and 4.
0/0 ... Matches any address.
子網路遮罩可以用相同的方式用前綴來描述,因此這種方案經常用於此目的。但請記住,僅僅因為這個計劃能用於描述子網並不意味著它被使用僅有的用於描述子網路。
作為路由表前綴不是子網的範例,您可以有兩個網路介面連接到同一網絡,例如 192.168.2.0/24。 (這可以透過將兩個單獨的網路卡連接到同一台交換器來實現,每個網路卡都有自己的電纜。)然後,您可以使用兩個路由表條目設定路由表以「平衡」兩個介面之間的傳出流量:
192.168.2.0/25 eth0 # range ...2.0 to ...2.127
192.168.2.128/25 eth1 # range ...2.128 to ...2.255
這會將發送到該網路上位址 0-127 的封包發送出去eth0
,但將發送到該網路上位址 128-255 的封包發送出去eth1
。這是一種不好的方法(由於我不會在這裡討論的原因),但演示了路由前綴和網路位址如何可能不匹配。
1維基百科上的文章路由表不幸的是,前綴字段保存“網路 ID”。雖然這在路由表的某些特定實作中可能是正確的,但在一般情況下它並不總是網路 ID,如您提供的範例和本答案後面我的範例所示。
²此路由資訊通常包括使用哪個介面、在該介面上聯絡哪個路由器(如果有)、可透過該介面直接存取的主機的MAC 位址、如果主機是可直接存取的主機,我們應該在封包上放置什麼來源位址具有多個來源位址、安全資訊等。那裡可能有各種各樣的數據,但對於本次討論的目的來說,這些數據都不重要,因為我們只是討論如何查找給定地址的正確數據集,而不是數據集中本身的內容。