[转载]奇葩的IP地址

  |   3 |   Document |   WWW 转载

原文:http://blog.caoyue.me/post/ip-address-as-octal
一个奇怪的地址,形如 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,那我们怎么知道省略的是哪一部分呢?别急,「聪明」的标准的制定者们早就想到这一点了,规则如下:

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 2396rfc 1738 也都是语焉不详。

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

Comments
Write a Comment