今天发现 Google 的时候发现收录了一个奇怪的地址,形如 23.244.200.000000000354
,而且这个地址居然还是可以访问的。很显然这不是域名,尝试 ping 一下,返回地址来自于 23.244.200.236
,可以看出 000000000354
是 236
的八进制表示形式。
###混合进制
查了下,原来 IP 地址居然可以混合进制来显示……前导的 0 的数字会被当作八进制来处理。而且可以同时使用不同进制:包括十六进制、八进制和十进制。
比如 http://0x17.244.0xc8.00000354
这样奇葩的地址也是可以访问的……
###DWORD 形式的 IP
还有更奇葩的,整数型的 IP —— 比如这个:http://401918188
,同样可以访问。
转换过程是将 23.244.200.236
转换为二进制形式,不足 8 为的数字用 0 补足: 00010111111101001100100011101100
,然后将这一串二进制数字转换为整数,即可得到整数型的 IP 地址。
当然,如果将这个整数换成其他进制也是可以的,比如:http://02775144354
和 http://0x17f4c8ec
###可省略的 0
当然,奇葩还没有结束。比如这样的 IP 地址 192.168.1
也是可以访问的……因为某部分为 0 则可以省略。OK,那我们怎么知道省略的是哪一部分呢?别急,「聪明」的标准的制定者们早就想到这一点了,规则如下:
abbr | IP |
---|---|
A | 0.0.0.A |
A.B | A.0.0.B |
A.B.C | A.B.0.C |
A.B.C.D | A.B.C.D |
###其他
原 IP 127.0.0.1
按上面的方法改变下形式
http://0x7f.0.000000000001
http://2130706433
http://017700000001
http://0x7f000001
http://127.1
……
这个特性在不同的平台上是由 socket 库实现的。在 Linux 上是 inet_aton ,在 Windows 上是 inet_addr 。
但是相关的标准文档我还没有找到。rfc 2396
和 rfc 1738
也都是语焉不详。
btw,虽然主流浏览器和很多其他软件支持这种表示方法。但在某些地方可能导致问题,一般都不推荐这种做法,比如 Mac OS X: Do Not Use Leading Zeros in IP Address