我錯誤地錯過了IP地址的點並輸入了 192.168.072
。
令我驚訝的是我連接到了一台機器 192.168.0.58
如果我ping 192.168.072
我收到了回复 192.168.0.58
。
為什麼是這樣?
我在Windows域上的Windows PC上。
如果我ping 192.168.72
我收到了回复 192.168.0.72
,所以看來 0
在 072
(在我原來的錯誤中)很重要。
我錯誤地錯過了IP地址的點並輸入了 192.168.072
。
令我驚訝的是我連接到了一台機器 192.168.0.58
如果我ping 192.168.072
我收到了回复 192.168.0.58
。
為什麼是這樣?
我在Windows域上的Windows PC上。
如果我ping 192.168.72
我收到了回复 192.168.0.72
,所以看來 0
在 072
(在我原來的錯誤中)很重要。
每個人都使用RFC,IP類等過度複雜化。只需運行幾個測試就可以看到了 ping
命令解析用戶的IP輸入(刪除了多餘的箔條):
> ping 1
Pinging 0.0.0.1 with 32 bytes of data:
> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:
> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:
> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:
> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.
> ping 255
Pinging 0.0.0.255 with 32 bytes of data:
> ping 256
Pinging 0.0.1.0 with 32 bytes of data:
如你所見, ping
命令(在Windows中)允許您使用不同的IP地址格式。 IPv4地址可以分為四個部分(“點四線”),如下所示: A.B.C.D
,和 ping
命令允許你留出一些,填寫默認值 0
如下:
1 part (ping A) : 0.0.0.A
2 parts (ping A.B) : A.0.0.B
3 parts (ping A.B.C) : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D
如果你只提供單個部分,那麼如果它低於255(八位字節的最大值),它將被視為如上所述的八位字節,但如果它大於255,則將其轉換並轉入下一個字段(即 mod 256
)。
有一些邊緣情況,例如提供超過四個部分似乎不起作用(例如,ping google.com
的IP也不適合 0.74.125.226.4
要么 74.125.226.4.0
)。
您也可以使用虛線四邊形和平面形式的十六進製表示法,但必須通過預先掛起來格式化 0x
到每個八位字節。
因此,有很多方法可以表示(IPv4)IP地址。您可以使用平面或點四邊形(或點三面,點雙面,甚至點單面)格式,對於每種格式,您可以使用(甚至混合和匹配)十進制,八進制和十六進制。例如,你可以ping google.com
通過以下方式:
google.com
(域名)74.125.226.4
(點分十進制)1249763844
(小數十進制)0112.0175.0342.0004
(點八角)011237361004
(扁八進制)0x4A.0x7D.0xE2.0x04
(點綴十六進制)0x4A7DE204
(扁六角)74.0175.0xe2.4
(ಠ_ಠ)(謝天謝地,沒有添加二進製表示法支持!)
應用:
在你的情況下,ping 192.168.072
使用上表中的第三種格式(A.B.0.C
),所以你實際上在ping 192.168.0.072
。此外,因為在最後一部分上有一個前導零,所以它被視為八進制,十進制為58。
謎團已揭開。
注意,雖然是Windows ping
命令允許輸入的各種格式,並以所看到的方式解釋非標準格式,這並不一定意味著您可以在任何地方使用這些格式。某些程序可能會強制您提供虛線四邊形的所有四個部分,其他程序可能不允許混合和匹配十進制和八進制,等等。
此外,IPv6地址進一步使解析邏輯和輸入格式可接受性變得複雜。
附錄:
syss指出 如果您在其中一個數字中使用無效字符(例如, 8
要么 9
當使用八進制時,a g
在十六進制模式等)然後 ping
是否足夠智能識別並將其解釋為字符串(-al?-ic?)URL而不是數字IP地址。
(作為一個有很多動脈瘤和心髒病發作的人試圖編寫所謂的“簡單”代碼以適應數據值的指數級數量排列,我欣賞它 - 似乎 - 正確處理所有輸入變化;在此案例,至少31+32+33+34=120 變化。)
所以,在指定時 010.020.030.040
會ping 8.16.24.32
正如所料,過世 010.020.030.080
至 ping
將被視為URL而不是IP地址 foo.bar.baz.com
這可能(但遺憾的是)不存在。換句話說,它嘗試ping子域 010
在子域名上 020
在域上 030
在頂級域名 080
。但是,自從 080
不是有效的頂級域名(如 .com
, .net
和他們的伙伴們一樣,連接在第一步就失敗了。
同樣的事情發生在 090.010.010.010
無效字符在不同的八位字節中。同樣, 0xf.0xf.0xf.0xf
坪 15.15.15.15
但是 0xh1.0x1.0xg0.0f
失敗。
哦,我想這就是你不能流利地使用多個數字庫。
確保始終使用4點四方(“40q”?“quaddy-quad”?“cutie-q”?)地址可能更容易,更安全。
所以出去吧 學習一些數字基礎。你將能夠炫耀並成為派對的生命,正如他們所說,有10種類型的人:知道二元的人和不知道的人。
我們不是 認為 關於IPv6地址;我認為他們是111封印章之一!
有兩個原因:
首先,'0'前綴表示 八進制 數。由於oct(072)= dec(58),192.168.072 = 192.168.58。
其次,倒數第二個0可以從IP地址中刪除為a 速記。 127.0.1被解釋為127.0.0.1,在您的情況下,192.168.58被解釋為192.168.0.58。
除了@ neu242關於八進製表示法的重要觀點,以及可以縮短IP地址的觀察之外,另一個關鍵部分是了解如何解釋縮短的IP地址。
人們可能會天真地猜測,如果缺少四個數字中的一些,解析器會將零填充字節添加到字節序列的末尾(或開頭)。但這與OP報告的行為不匹配:192.168.072被解析為192.168。0.58,而不是192.168.58。0,也不是 0.192.168.58。
顯然Windows和Linux ping(您嘗試的版本和我嘗試過的版本)使用等同於inet_aton()的東西來解析IP地址參數。該 inet_aton()的手冊頁說:
The address supplied in cp can have one of the following forms:
a.b.c.d Each of the four numeric parts specifies a byte of the address; the
bytes are assigned in left-to-right order to produce the binary
address.
a.b.c Parts a and b specify the first two bytes of the binary address.
Part c is interpreted as a 16-bit value that defines the rightmost
two bytes of the binary address. This notation is suitable for
specifying (outmoded) Class B network addresses.
a.b Part a specifies the first byte of the binary address. Part b is
interpreted as a 24-bit value that defines the rightmost three bytes
of the binary address. This notation is suitable for specifying
(outmoded) Class C network addresses.
a The value a is interpreted as a 32-bit value that is stored directly
into the binary address without any byte rearrangement.
所以你有它... 192.168.072
適合a.b.c模式,所以 072
(在解析為八進制數後)被解釋為一個16位值,它定義了二進制地址最右邊的2個字節,相當於 0.58
。
上述規則等同於說如果缺少四個數字中的任何一個,則添加所需的零填充字節 在最後一個號碼之前...不在字符串的最後或開頭。 (如果給出的最後一個數字小於256,則以這種方式表示。)
請注意,較新版本的ping可能不允許這種速記,也不允許八進制解釋。該 2010年iputils的源代碼 我找到的(包括ping)使用inet_pton()而不是inet_aton()來解析IP地址參數。該 inet_pton()的手冊頁說:
與inet_aton(3)和inet_addr(3)不同,inet_pton()支持IPv6地址。上 另一方面,inet_pton()只接受點分十進製表示法的IPv4地址, 而inet_aton(3)和inet_addr(3)允許更通用 數字和點符號(十六進制和八進制數字格式,和 不需要顯式寫入所有四個字節的格式。
你還必須考慮ip可以用整數加在一起來表示它們的位置。
192.168.0.58 is :
192 * 256^3
+ 168 * 256^2
+ 0 * 256^1
+ 58 * 256^0
這是很酷的事情:
192.168.58將是192.168.0.58因為
0 * 256^1
+ 58 * 256^0
= 58
192.11010106也將是192.168.0.58因為
168 * 256^2
+ 0 * 256^1
+ 58 * 256^0
= 11010106
3232235578也將是192.168.0.58因為
192 * 256^3
+ 168 * 256^2
+ 0 * 256^1
+ 58 * 256^0
= 3232235578