youyichannel

志于道,据于德,依于仁,游于艺!

0%

网线拔了,还能 ping 通 127.0.0.1?

先说结论,拔了网线,是可以 ping127.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 之所以叫本地回环地址,可以理解成消息发出到这个地址上的话,不会出网络,在本机打个转就又回来了。

这也就是断网,依然能 ping127.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。