原来IP地址还能这么玩,你见过吗?

我们日常见到的IP地址,都是 127.0.0.1这样的四个不大于255的整数表示,但是你见过 2130706433 这样的IP地址吗?对,就只有2130706433。

这是一个IP?我们来试试

ping 2130706433

我们都知道IPv4“由32位二进制数组成,为便于使用,常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数。”

但是,形如 123.126.96.00000322这样的IP,IP不是不能大于255么,那你可以尝试 ping 一下,返回地址来自于 123.126.96.210。

ping

是不是懵了?还能这么玩。

混合进制

查了下,原来 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,那我们怎么知道省略的是哪一部分呢?别急,「聪明」的标准的制定者们早就想到这一点了,规则如下:

IP地址中可省略的 0

其他

那么现在知道了 IP 127.0.0.1 按上面的方法改变下形式

http://0x7f.0.000000000001http://2130706433http://017700000001 http://0x7f000001 http://127.1

目前rfc 文档都是语焉不详,并没有十分明确的说法。 但是主流浏览器和很多其他软件都支持这种表示方法。然而某些地方可能导致问题,一般不推荐这种做法,比如我遇到过连接memcache,用127.0.0.1可以连接,但是用127.1就死活连接不上。

算是增加一个小技巧吧。