localhost、127.0.0.1、 ::1 的区别

一文讲清楚 localhost 和 127.0.0.1 的区别

RUNOOB 教程 2024-06-21 11:28 福建

在进行网络和 Web 开发时,经常会用到 “localhost” 和 “127.0.0.1” ,localhost 和 127.0.0.1 在大多数情况下可以互换使用,但它们在概念上是不同的

  • localhost 是本机域名。
  • 127.0.0.1 是本机 IP 地址。

localhost 通过系统的 host 文件会自动解析到 127.0.0.1。

localhost 和 127.0.0.1 都是用来访问本地计算机的名称和地址,它们之间有紧密的关系,但也有一些区别。

图片## 1、localhost

localhost 是一个域名,它在大多数操作系统中被配置为指向本地计算机,我们在浏览器中输入 localhost 时,浏览器会将其解析为本地计算机的地址。

通常情况下,在操作系统的主机文件(如 /etc/hosts 或 C:\Windows\System32\drivers\etc\hosts)中,localhost 被定义为指向 127.0.0.1。

使用 localhost 进行网络通信时,操作系统会将其解析为 127.0.0.1。

图片

其实 localhost 就相当于一个域名,可以使用 ping 来查看域名对应的 IP 地址,例如 ping www.runoob.com 就会返回 www.runoob.com 域名指向的 IP:

图片

所以可以在命令行使用 ping localhost 命令来查看 localhost 指向的 IP 地址:

图片

2、127.0.0.1

127.0.0.1 是一个特殊的 IP 地址,称为回环地址(loopback address),它用于标识本地计算机,并且是网络协议中保留的地址之一,用于测试和本地通信。

127.0.0.1 是一个特殊的 IPv4 地址,保留用于主机自身的通信,不会经过任何物理网络接口

相同点

  • 两者都指向本地主机,通常用来进行本地测试和开发工作。
  • 通信不会离开主机本身,不会经过外部网络。

不同点

  • 解析过程:localhost 需要通过主机文件解析,而 127.0.0.1 是直接使用的IP 地址。
  • 配置依赖:localhost 的解析依赖于系统配置(如 /etc/hosts),如果该配置被修改或破坏,localhost 可能无法正常解析为 127.0.0.1,但 127.0.0.1 则不受影响。

在大多数情况下,localhost 和 127.0.0.1 可以互换使用,因为它们都指向同一台计算机。不过,如果遇到 DNS 或主机文件解析的问题,直接使用 127.0.0.1 可能会更加可靠。

IPv6 中的 localhost

在 IPv6 中,localhost 对应的地址是 ::1,这个地址是 IPv6 的回环地址,用于本地设备自我通信,就像 IPv4 中的 127.0.0.1 一样。

IPv6 中的 localhost 可以像 IPv4 一样在网络通信和开发中使用。

当需要在 IPv6 环境中进行本地测试和开发时,可以使用 ::1 来指代本地主机。

如果在本地机器上运行一个支持 IPv6 的 Web 服务器,可以通过在浏览器中输入http://[::1]:porthttps://[::1]:port来访问,其中 “port” 是Web服务器的特定端口。

  1. Web 服务器监听默认的 HTTP 端口 80 或 HTTPS 端口 443,则可以省略端口号。例如:
    http://[::1]
    https://[::1]

  2. Web 服务器监听非默认的端口,则需要指定端口号,例如:
    http://[::1]:8080
    https://[::1]:8443

结合之前关于 IPv4 中 localhost 和 127.0.0.1 的讨论,可以总结 IPv6 中的相应情况:

  1. 表示形式:
  • IPv4: localhost 是一个主机名,通常解析为 127.0.0.1。
  • IPv6: localhost 同样是一个主机名,通常解析为 ::1。
  1. 使用方式:
  • IPv4: localhost 通常用于软件配置和开发环境,而 127.0.0.1 用于需要 IP地址的网络配置和系统文件中。
  • IPv6: localhost 和 ::1 的使用方式与 IPv4 类似,具体取决于系统和应用程序的需求。
  1. 访问方法:
  • IPv4: 通过 localhost 或 127.0.0.1 访问服务,本质上达到相同的结果。
  • IPv6: 通过 localhost 或 ::1 访问服务,同样达到相同的结果,主要区别在于使用的协议版本。

无论是 IPv4 中的 localhost 和 127.0.0.1,还是 IPv6 中的 localhost 和 ::1,它们都用于实现本地设备的自我通信。


断网了,还能 ping 通 127.0.0.1 吗?

小白 yes的练级攻略 2023-12-20 10:50 浙江

网通不通, ping 一下就知道了。

你了解背后的原因吗?

那如果把 127.0.0.1 换成 0.0.0.0 或 localhost 会怎么样呢?这几个有什么区别吗?

话不多说,直接拔掉网线,断网。

然后在控制台输入 ping 127.0.0.1

$ 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

说明,拔了网线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,是因为源码里就是这么定义的,也没什么道理。

/* Address to loopback in software to local host. */
#define  INADDR_LOOPBACK   0x7f000001 /* 127.0.0.1  */
  • 1
  • 2

图片

回环地址

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,那么可以省略为 :: 号

图片

IPv6 回环地址

在 IPv4 下的回环地址是 127.0.0.1,在 IPv6 下,表达为 ::1 。中间把连续的 0给省略了,之所以不是7 个 冒号,而是2 个冒号:, 是因为一个 IPv6 地址中只允许出现⼀次两个连续的冒号

多说一句:在 IPv4 下用的是ping 127.0.0.1命令。在 IPv6 下用的是ping6 ::1命令。

什么是 ping

ping 是应用层命令,可以理解为它跟游戏或者聊天软件属于同一层。只不过聊天软件可以收发消息,还能点个赞什么的,有很多复杂的功能。而 ping 作为一个小软件,它的功能比较简单,就是尝试发送一个小小的消息到目标机器上,判断目的机器是否可达,其实也就是判断目标机器网络是否能连通。

ping 应用的底层,用的是网络层的 ICMP 协议

图片

IP 和 ICMP 和 Ping 所在分层

虽然 ICMP 协议和 IP 协议都属于网络层协议,但其实`ICMP 也是利用了 IP 协议进行消息的传输

图片

ip 和 icmp 的关系

所以,在这里完全可以简单地理解为 ping 某个 IP 就是往某个 IP 地址发个消息。

TCP 发数据和 ping 的区别

一般情况下,我们会使用 TCP 进行网络数据传输,那么可以看下它和 ping 的区别。

图片

ping 和普通发消息的关系

ping 和其他应用层软件都属于应用层

那么我们横向对比一下,比方说聊天软件,如果用的是 TCP 的方式去发送消息。

为了发送消息,那就得先知道往哪发。linux 里万物皆文件,那你要发消息的目的地,也是个文件,这里就引出了 socket 的概念。

要使用 socket , 那么首先需要创建它。

在 TCP 传输中创建的方式是 socket (AF_INET, SOCK_STREAM, 0);,其中 AF_INET 表示将使用 IPv4 里host:port的方式去解析待会你输入的网络地址。SOCK_STREAM 是指使用面向字节流的 TCP 协议,工作在传输层

创建好了 socket 之后,就可以愉快的把要传输的数据写到这个文件里。调用 socket 的 sendto 接口的过程中进程会从用户态进入到内核态,最后会调用到 sock_sendmsg 方法。

然后进入传输层,带上 TCP 头。网络层带上 IP 头,数据链路层带上 MAC 头等一系列操作后。进入网卡的发送队列 ring buffer,顺着网卡就发出去了。

回到 ping , 整个过程也基本跟 TCP 发数据类似,差异的地方主要在于,创建 socket 的时候用的是 socket (AF_INET,SOCK_RAW,IPPROTO_ICMP)SOCK_RAW 是原始套接字 ,工作在网络层, 所以构建 ICMP(网络层协议)的数据,是再合适不过了。

ping 在进入内核态后最后也是调用的 sock_sendmsg 方法,进入到网络层后加上ICMP 和 IP 头后,数据链路层加上MAC 头,也是顺着网卡发出。因此,本质上 ping 跟普通应用发消息在程序流程上没太大差别。

这也解释了**为什么当你发现怀疑网络有问题的时候,别人第一时间是问你能 ping 通吗?**因为可以简单理解为 ping 就是自己组了个数据包,让系统按着其他软件发送数据的路径往外发一遍,能通说明其他软件发的数据也能通。

为什么断网了还能 ping 通 127.0.0.1

前面提到,有网的情况下,ping 最后是通过网卡将数据发送出去的。

那么断网的情况下,网卡已经不工作了,ping 回环地址却一切正常,我们可以看下这种情况下的工作原理。

图片

ping 回环地址

从应用层到传输层再到网络层。这段路径跟 ping 外网的时候是几乎是一样的。到了网络层,系统会根据目的 IP,在路由表中获取对应的路由信息,而这其中就包含选择哪个网卡把消息发出。

当发现目标 IP 是外网 IP时,会从 “真网卡” 发出。

当发现目标 IP 是回环地址时,就会选择本地网卡

本地网卡,其实就是个"假网卡",它不像 “真网卡” 那样有个 ring buffer 什么的,“假网卡” 会把数据推到一个叫 input_pkt_queue 的链表中。这个链表,其实是所有网卡共享的,上面挂着发给本机的各种消息。消息被发送到这个链表后,会再触发一个软中断

专门处理软中断的工具人**“ksoftirqd”(这是个内核线程**),它在收到软中断后就会立马去链表里把消息取出,然后顺着数据链路层、网络层等层层往上传递最后给到应用程序。

ping 回环地址和通过 TCP 等各种协议发送数据到回环地址都是走这条路径。整条路径从发到收,都没有经过 “真网卡”。之所以 127.0.0.1 叫本地回环地址,可以理解为,消息发出到这个地址上,就不会出网络,在本机打个转就又回来了。所以断网,依然能 ping 通 127.0.0.1。

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
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

能看到 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
  • 1
  • 2
  • 3
  • 4

但它还是很有用处的,回想下,我们启动服务器的时候,一般会 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  */
  • 1
  • 2

举个例子。刚刚提到的 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 和本机地址都可以访问到服务。


via:

localhost、127.0.0.1、 ::1 的区别_127.0.0.1 ::1-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值