先说结论,拔了网线,是可以 ping
通
127.0.0.1
的。
但是,这并不能说明你不用交网费就能上网了!
什么是 127.0.0.1
这是一个 IPV4
地址,IPV4
地址有
32
位,一个字节有 8
位,共 4
个字节。
其中127 开头的都属于回环地址,也是 IPV4
的特殊地址。(人为规定)
127.0.0.1
是众多回环地址中的一个。(源码定义)
在 IPV4 下的回环地址是
127.0.0.1
,在IPV6
下,表达为 ::1
。
注意:一个 IPV6 地址中只允许出现⼀次两个连续的冒号。
ping 简介
ping 工作在应用层,ping 作为一个小软件,它的功能比较简单,就是尝试发送一个消息到目标机器上,判断目的机器是否可达,即判断目标机器网络是否能连通。
ping 底层使用到的是 ICMP
协议。
ICMP 协议和 IP 协议都属于网络层协议,但是ICMP 利用了 IP 协议进行消息的传输。
TCP 和 ping 发送数据的区别
本质上,TCP 和 ping
都是经历了陷入内核、send
、网络层、数据链路层,顺着网卡发出,因此本质上,ping
和 普通应用发消息没有什么太大差别。
这也就是为什么当你发现怀疑网络有问题的时候,别人第一时间是问你能 ping 通吗的原因了。
为什么断网了,还能 ping 通 127.0.0.1?
在有网的时候,ping
的数据包最后是通过网卡发送出去的。
那么断网的情况下,网卡已经不工作了,
ping
回环地址却一切正常?
ping 127.0.0.1
的过程也是从应用层到传输层再到网络层,这段路径跟 ping
外网的时候是几乎是一样的。到了网络层,系统会根据目标
IP,在路由表中获取对应的路由信息,而这其中就包含选择网卡把消息发出。
- 当发现目标 IP 是外网 IP时,会从「真网卡」发出;
- 当发现目标 IP 是回环地址时,会从「本地网卡」发出。
本地网卡只是一个逻辑上的概念,没有ring buffer
等部件,本地网卡会把数据推送到一个 input_pkt_queue
链表中,这个链表是所有网卡共享的,存储发给本地的各种消息。消息发送到这个链表之后,会触发一个软中断。专门处理软中断的是一个内核线程
ksoftirqd
,它在收到软中断后就会立马去链表里把消息取出,然后顺着数据链路层、网络层等层层往上传递最后给到应用程序。
ping 回环地址和通过 TCP
等各种协议发送数据到回环地址都是经历这条路径。整条路径没有经过「真网卡」。127.0.0.1
之所以叫本地回环地址,可以理解成消息发出到这个地址上的话,不会出网络,在本机打个转就又回来了。
这也就是断网,依然能 ping
通 127.0.0.1
的原因了。
ping 回环地址和 ping 本机地址没有区别!
127.0.0.1 VS localhost VS 0.0.0.0
首先 localhost
就不叫
IP
,它是一个域名,默认会把它解析为 127.0.0.1
,当然这可以在 /etc/hosts
文件下进行修改。
所以默认情况下,使用 localhost
跟使用
127.0.0.1
确实是没区别的。
其次就是 0.0.0.0
,执行 ping 0.0.0.0
,是会失败的,因为它在IPV4
中表示的是无效的目标地址。该地址在服务器监听
IP+Port 时会很有用处,如果服务器 listen
的是
0.0.0.0
,那么此时用127.0.0.1
和本机地址都可以访问到服务,也就是说,如果此时
listen
的是本机的 0.0.0.0
,
那么它表示本机上的所有 IPV4 地址。
📢 注意:客户端
connect
时,不能使用0.0.0.0
,必须指明要连接哪个服务器 IP。