題 IP地址奇怪的無點十進製表示法......它是如何工作的?


今天早些時候我以為我的剪貼板中有一個URL,但實際上我從電子表格中復制了四個9位整數,這些是來自專有系統的標識號。完全與手頭的任務無關。我把它粘貼到Firefox中,並驚訝地發現它實際上加載了一個頁面。我見過無數十進制符號 IPv4的 之前的地址,但這個長數字是更大,更大。

714687644714805209715128610715964400(在前面粘貼HTTP://)

這是如何運作的?我在互聯網上找到的所有十進制 - > IPv4轉換器都認為它是無效輸入。如果我採用它實際加載的IPv4地址,並執行相同的計算將其轉換為無點小數,我得到的數字要小得多。

我讀過這個  可以接受dwords並進行一些轉換,但它無法將此數字轉換為IP地址。 IPv6的 由於該主機沒有IPv6連接,因此是不可能的。

這有什麼樣的瘋狂?這讓我和我的同事感到難過。

編輯:它現在重新上線了。


88
2018-04-02 01:38


起源


看到 pc-help.org/obscure.htm - Shamtam
你是 真 確定它不是IPv6地址?因為這個數字在基數65536中分解為8位數; IPv6地址在基數65536中有8位數字。以十六進製表示,與IPv6一樣,它是89:a4d2:471b:45ef:77ed:c70f:da35:93f0。 - Christian
@Christian他對數字來源的解釋與顯示的實際數字有36位數字(每個ID是9位數字714xxxxxx或715xxxxxx)。計算機甚至沒有IPv6,並且作為IPv4地址的數字確實返回了網頁。從~5E33到~3E38的數字在基數65536中有8個數字,我認為這只是一個巧合,他的數據落在該範圍內(加上,任何較小的數字也將是一個有效的IPv6地址) - Tim S.
@beeks好吧,昨天我嘗試它時它已經不起作用了,但鑑於它是一個不安全的路由器,也許這並不令人驚訝。那麼你是說你基本上把一個隨機數放入你的地址欄?或者你有什麼樣的電子表格包含不安全路由器的奇怪編碼的IP地址? ;) - Christian
@Christian,大聲笑。它們是合規系統中的一些唯一消息標識符。我把它們粘貼到地址欄中的機會非常怪異,而且很有效。我敢打賭,在我的生活中永遠不會再發生在我身上:) - beeks


答案:


這是一個非常有趣的問題,我花了一點時間才弄明白。簡短的回答是這個數字的最後32位 3660944368 (十進制,可以找到 714687644714805209715128610715964400 mod 2^32

這是IPv4地址的十進制值 218.53.147.240,可以通過將其轉換為base-256找到 3660944368 = 218*(256^3)+53*(256^2)+147*(256)+240 類似於寫出十進制數字(基數為10)。例如 234 = 2*10^2+ 3*10 + 4

正如@chritohnide指出的那樣,虛線IPv4地址的每個部分稱為八位字節,因為它代表8位二進制數字。值得注意的是,各種格式的IPv4地址(例如點分十進製或純十進制)只是表示32位二進制數的不同方式,以獲得好處。

由於IPv4地址是32位數字,因此只有最後32位的數字用於解析地址。為什麼這是真的並不那麼明顯。正如其他人所指出的那樣,完整的數字看起來與十進制的IPv6地址非常相似,但不是有效的地址。

看著 Teredo規範 (看到 4. Teredo地址),客戶端IPv4佔用IPv6地址的最後32位,但該數字的前綴與Teredo規範不匹配(另見 維基百科)。


93
2018-04-02 05:37



很好的答案。提及虛線IPv4地址的每個部分稱為a也可能是有用的 八位字節 因為它是8位二進制數的十進製表示(4個八位字節= 4 x 8位= 32位IPv4地址),十進製版本實際上只是為了我們的利益。 - chritohnide
你確定它不是IPv6十進製表示法嗎?它成功轉換為 0089:a4d2:471b:45ef:77ed:c70f:da35:93f0 - Izkata
@Izkata:不太可能,因為該地址將位於IPv6地址空間的未分配和保留部分。 - Henning Makholm
數字(ASCII)可能只是通過C stdlib字符串之一運行到int函數,以轉換為32位ipv4地址。在C stdlib的大多數實現中,這些轉換將自動執行模2 ^ <所需的整數大小>。在這種情況下的結果正是觀察到的行為。 - Tonny
值得注意的是,這可能是Firefox的URL解析器的一個怪癖。它似乎認識到它是一個數字而不是一個URL,並嘗試將其解析為一個32位未註冊的IP地址(得到的解析整數最終以32位為模,它實際上並沒有對輸入進行任何錯誤檢查)。例如,Chrome不會顯示此行為。它實際上可能值得將其報告為Firefox中的一個微不足道的錯誤。 - Jason C