為什麼「ping X」有效,其中「X」是任意整數?

為什麼「ping X」有效,其中「X」是任意整數?

因此,我發現了 Windows 10 ping 實用程式的一個奇怪之處。如果您 p​​ing 一個整數而不是 IP 位址,它會將該號碼「轉換」為 IPv4 位址。轉換後,第一個八位元組是256^3 位置,第二個八位元組是256^2,第三個八位元組是256^1,最後一個八位元組是“個”位置或256^0。

例如,「ping 200」將 ping 0.0.0.200,但「ping 400」將 ping 0.0.1.144,其中第三個八位元組中的「1」代表 256 (256 + 144 = 400)。

快速的谷歌搜尋(雖然我想不出一個很好的搜尋字詞)沒有帶來任何結果。

我唯一的兩個理論是:

  1. 情況可能是,在 IP 模式的早期迭代(即未使用的 v1、v2 或 v3)中,計劃僅使用單一整數。出於對向後相容性的痴迷,微軟在 ping 實用程式中編寫了一種轉換演算法,以便早在 ping 首次編碼時就可以處理這種情況。
  2. 可能的情況是,由於 ping 實用程式的編碼方式,它通常會採用有效的 IPv4 位址並將其轉換為單一整數,然後再對該資料進行處理。因此,作為程式碼檢查,如果它發現使用者輸入了單一整數,它就會跳過初始翻譯步驟。

有任何想法嗎?這確實引起了我的同事們的興趣,但他們和我一樣一無所知。

編輯:剛剛在我的 Arch Linux 機器上測試了它,我可以確認該行為也存在,因此這可能會質疑我的第一個理論。

答案1

答案記錄在維基百科:

在實踐有類網路時,通常會使用其他位址表示形式。例如,環回位址 127.0.0.1 通常寫為 127.1,因為它屬於 A 類網絡,網路遮罩為 8 位,主機號碼為 24 位元。當位址中以點分錶示法指定的數字少於四個時,最後一個值將被視為將位址填入四個八位元組所需位元組數的整數。因此,位址 127.65530 相當於 127.0.255.250。

答案2

這不是一個怪癖。這是一個特點。

請記住,IPv4 位址的點表示法只是表示 IPv4 位址(位於 IP 封包中的 32 位元目標欄位中)的四位元組(即 32 位元)整數的一種方式。不同的實用程式將接受該整數的不同格式。

我知道過去有些瀏覽器接受這樣的十進制整數作為網址列中的位址。 (令我驚訝的是我目前的兩個瀏覽器 Firefox 和 Chrome 不再執行此操作。)

答案3

「.0」可以有條件地省略

經常使用「ping 127.0.0.1」指令對機器進行循環測試,以驗證機器的TCP/IP協定族是否安裝正確。但你找到了嗎?使用指令「ping 127.1」也可以獲得相同的測試結果。其實「ping 127.1」和「ping 127.0.0.1」這兩個指令是一樣的,都是進行環路測試。

為什麼會這樣呢?這就是Ping指令應用中使用IP位址的技巧。大家都知道IP位址是由32位元二進位數字組成的。為了方便大家記憶,將每8位元二進位數轉換成十進位數。因此,由四部分十進制數字組成的易於記憶的 IP 位址(例如 127.0.0.1 )。由於Windows作業系統有自動填入「.0」的功能,所以我可以將「127.0.0.1」改為「127.1」。

但這個「.0」的省略是有條件限制的,不能隨意省略。在Ping指令的應用中,只能省略IP位址最後一個十進位數前出現的一個或多個“.0”,如將“ping 127.0.0.1”指令改寫為“ping 127.1”。

如果一個或多個「.0」不是在十進制數最後一部分旁邊,而是在其他位置,那麼這個「.0」就不能省略,例如「ping 202.0.96.1」不能寫成「ping 202.96.1" "。這是因為「ping 202.96.1」回傳的結果是「202.96.0.1」的回應訊息,而不是「202.0.96.1」的回應訊息。

數字字串而不是 IP 位址

在 Ping 指令中,您也可以使用數字字串取代 IP 位址。執行「ping 3658906394」指令,您將看到IP位址「218.22.123.26」的回傳訊息。

為什麼會這樣呢?事實上,「3658906394」是IP位址「218.22.123.26」的另一種表示。當然,你也可以用同樣的方法ping其他IP位址。

字串是如何轉換的?其實並不複雜。以IP位址“218.22.123.26”為例,將IP位址轉換為數字字串的方法如下:先將“218.22.123.26”轉換為十六進位“DA.16.7B.1A”,然後將其刪除。小數點後就變成了“DA167B1A”,最後將十六進制數轉換為十進制“3658906394”,那麼“218.22.123.26”就變成了“3658906394”。用同樣的方法將其他IP位址轉換為數字字串。

提示:在某些區域網路環境下,使用「Ping+號碼字串」指令可能會失敗,並出現「未知主機號碼字串」的提示訊息。這是因為數字字串被解析為主機名稱而不是 IP 位址。

答案4

IPv4 位址是無符號 32 位元整數。為了使它們更易於閱讀,它們傳統上以“點分十進制”表示法顯示在UI 中,其中每個八位元組(8 位元位元組)從最高有效位元開始,表示為十進制數,以十進制數分隔。

毫不奇怪,某些 UI 可能允許您輸入它們可以解釋為 UInt32 的任何內容,並使用生成的 UInt32 作為您想要的 IPv4 位址。

相關內容