之前用 nginx
的时候,发现用这几个 IP
,都能正常访问到 nginx
的欢迎网页。一度认为这几个 IP
都是一样的。
但本质上还是有些区别的。
首先 localhost
就不叫 IP
,它是一个域名,就跟 "baidu.com"
,是一个形式的东西,只不过默认会把它解析为 127.0.0.1
,当然这可以在 /etc/hosts
文件下进行修改。
所以默认情况下,使用 localhost
跟使用 127.0.0.1
确实是没区别的。
其次就是 0.0.0.0
,执行 ping 0.0.0.0 ,是会失败的,因为它在IPV4
中表示的是无效的目标地址。
1 2 3 4 | $ ping 0.0.0.0 PING 0.0.0.0 (0.0.0.0): 56 data bytes ping: sendto: No route to host ping: sendto: No route to host |
但它还是很有用处的,回想下,我们启动服务器的时候,一般会 listen
一个 IP 和端口,等待客户端的连接。
如果此时 listen
的是本机的 0.0.0.0
, 那么它表示本机上的所有 IPV4 地址。
1 2 | /* Address to accept any incoming messages. */ #define INADDR_ANY ((unsigned long int) 0x00000000) /* 0.0.0.0 */ |
举个例子。刚刚提到的 127.0.0.1
和 192.168.31.6
,都是本机的 IPV4 地址,如果监听 0.0.0.0
,那么用上面两个地址,都能访问到这个服务器。
当然, 客户端 connect
时,不能使用 0.0.0.0
。必须指明要连接哪个服务器 IP。
总结
-
127.0.0.1
是回环地址。localhost
是域名,但默认等于127.0.0.1
。 -
ping
回环地址和ping
本机地址,是一样的,走的是lo0 “假网卡”,都会经过网络层和数据链路层等逻辑,最后在快要出网卡前狠狠拐了个弯, 将数据插入到一个链表后就软中断通知 ksoftirqd 来进行收数据的逻辑,压根就不出网络。所以断网了也能ping
通回环地址。 -
如果服务器
listen
的是0.0.0.0
,那么此时用127.0.0.1
和本机地址都可以访问到服务。