ping回环地址和ping本机地址有什么区别
我们在mac里执行 ifconfig
。
$ ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000 ... en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.31.6 netmask 0xffffff00 broadcast 192.168.31.255 ...
能看到 lo0 ,表示本地回环接口,对应的地址,就是我们前面提到的 127.0.0.1 ,也就是回环地址 。
和 eth0 ,表示本机第一块网卡,对应的IP地址是192.168.31.6 ,管它叫本机IP 。
之前一直认为ping本机IP的话会通过"真网卡"出去,然后遇到第一个路由器,再发回来到本机。
为了验证这个说法,可以进行抓包,但结果跟上面的说法并不相同。
ping 127.0.0.1
ping 本机地址
可以看到 ping 本机IP 跟 ping 回环地址一样,相关的网络数据,都是走的 lo0 ,本地回环接口,也就是前面提到的**"假网卡"** 。
只要走了本地回环接口,那数据都不会发送到网络中,在本机网络协议栈中兜一圈,就发回来了。因此 ping回环地址和ping本机地址没有区别 。
127.0.0.1 和 localhost 以及 0.0.0.0 有区别吗
回到文章开头动图里的提问,算是面试八股文里的老常客了。
以前第一次用 nginx
的时候,发现用这几个 IP
,都能正常访问到 nginx
的欢迎网页。一度认为这几个 IP
都是一样的。
访问127.0.0.1:80访问localhost:80访问0.0.0.0:80
访问本机的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
中表示的是无效的目标地址 。
$ 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地址 。
/* 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
和本机地址都可以 访问到服务。