且听疯吟 如此生活三十年
原来 IP 地址还可以用混合进制表示

今天发现 Google 的时候发现收录了一个奇怪的地址,形如 23.244.200.000000000354,而且这个地址居然还是可以访问的。很显然这不是域名,尝试 ping 一下,返回地址来自于 23.244.200.236,可以看出 000000000354236 的八进制表示形式。

###混合进制
查了下,原来 IP 地址居然可以混合进制来显示……前导的 0 的数字会被当作八进制来处理。而且可以同时使用不同进制:包括十六进制、八进制和十进制。
比如 http://0x17.244.0xc8.00000354 这样奇葩的地址也是可以访问的……

###DWORD 形式的 IP
还有更奇葩的,整数型的 IP —— 比如这个:http://401918188 ,同样可以访问。
转换过程是将 23.244.200.236 转换为二进制形式,不足 8 为的数字用 0 补足: 00010111111101001100100011101100,然后将这一串二进制数字转换为整数,即可得到整数型的 IP 地址。
当然,如果将这个整数换成其他进制也是可以的,比如:
http://02775144354http://0x17f4c8ec

###可省略的 0
当然,奇葩还没有结束。比如这样的 IP 地址 192.168.1 也是可以访问的……因为某部分为 0 则可以省略。OK,那我们怎么知道省略的是哪一部分呢?别急,「聪明」的标准的制定者们早就想到这一点了,规则如下:

abbrIP
A0.0.0.A
A.BA.0.0.B
A.B.CA.B.0.C
A.B.C.DA.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 2396rfc 1738 也都是语焉不详。

btw,虽然主流浏览器和很多其他软件支持这种表示方法。但在某些地方可能导致问题,一般都不推荐这种做法,比如 Mac OS X: Do Not Use Leading Zeros in IP Address