面试官问:断网了,还能ping通 127.0.0.1 吗?为什么?
可能看到标题,你就知道答案了,但是你了解背后的原因吗?那如果把 127.0.0.1
换成 0.0.0.0
或 localhost
会怎么样呢?你知道这几个IP
有什么区别吗?
以前面试的时候就遇到过这个问题,大家看个动图了解下面试官和我当时的场景,求当时小白的心里阴影面积。
话不多说,我们直接开车。
拔掉网线,断网。
然后在控制台输入ping 127.0.0.1
。
1 2 3 4 5 6 7 8 9 10 11 | $ ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.080 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.093 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.074 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.079 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.079 ms ^C --- 127.0.0.1 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.074/0.081/0.093/0.006 ms |
说明,拔了网线,ping 127.0.0.1
是能ping通的。
其实这篇文章看到这里,标题前半个问题已经被回答了。但是我们可以再想深一点。
为什么断网了还能 ping
通 127.0.0.1
呢?
这能说明你不用交网费就能上网吗?
不能。
首先我们需要进入基础科普环节。
不懂的同学看了就懂了,懂的看了就当查漏补缺吧。
什么是127.0.0.1
首先,这是个 IPV4
地址。
IPV4
地址有 32
位,一个字节有 8
位,共 4
个字节。
其中127 开头的都属于回环地址,也是 IPV4
的特殊地址,没什么道理,就是人为规定的。
而127.0.0.1
是众多回环地址中的一个。之所以不是 127.0.0.2
,而是 127.0.0.1
,是因为源码里就是这么定义的,也没什么道理。
1 2 | /* Address to loopback in software to local host. */ #define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ |
IPv4
的地址是 32
位的,2的32次方,大概是40+亿
。地球光人口就76亿了,40亿IP这点量,塞牙缝都不够,实际上IP也确实用完了。
所以就有了IPV6
, IPv6
的地址是 128
位的,大概是2的128次方≈10的38次方。据说地球的沙子数量大概是 10的23次方,所以IPV6的IP可以认为用不完。
IPV4以8位一组,每组之间用 . 号隔开。
IPV6就以16位为一组,每组之间用 : 号隔开。如果全是0,那么可以省略不写。
在IPV4下的回环地址是 127.0.0.1
,在IPV6
下,表达为 ::1
。中间把连续的0给省略了,之所以不是7个 冒号,而是2个冒号: , 是因为一个 IPV6 地址中只允许出现⼀次两个连续的冒号。