返回介绍

localhost vs 127.0.0.1

发布于 2025-01-22 00:38:51 字数 1663 浏览 0 评论 0 收藏 0

前几天有人问我 localhost 的原理, 我发现自己理解的也不透彻, 今天参考了《TCP/IP 详解卷 1》 和 wikipedia 中的相关条目以及 stackoverflow 上的问答 , 理出一点眉目, 欢迎大家讨论,欢迎批评指正。 在开始之前, 先来了解下一个叫 loopback 的概念。

loopback , 顾名思义, 就是转一圈就回来,把一个东西, 例如电子信号、数据流不加修改和处理的返回到它的来源地。

具体到现在的计算机软件系统, 我们的网络协议栈软件会实现一个虚拟的网络接口(可以简单的理解为虚拟的网卡),专门用于 loopback 。 IPv4 的网络标准把 从 127.0.0.1 到 127.255.255.254 IP 地址块都用作 loopback 。

所有的发到这些地址的数据包都会被毫发无损的返回去(looped back ) , 这一千六百多万个个地址中,最知名的、最常用的就是 127.0.0.1

(注: 你可以试着 ping 一下 127.255.255.254, 看看有什么效果)

对于 IPv6 来说, 它只把一个地址用作 loopback , 就是 ::1 (0000:0000:0000:0000:0000:0000:0000:0001) 。

有了 loopback 地址, 同一个计算机上的进程通信都很方便了, 根本不用走实际的物理网卡。

比如说你在本机建立了一个 Web 服务器,然后通过浏览器用 http://127.0.0.1:8080 去访问, 操作系统内的网络协议栈会把这个 HTTP GET 请求封装到一个 TCP 包中,写上目的端口号 8080, 然后再封装到一个 IP 包中, 写上目的地址 127.0.0.1 。

但是这个 IP 数据包并不会发送到物理的网卡那里去,更不会通过数据链路层发送到局域网乃至互联网中, 实际上它发给了虚拟的网络接口,然后立刻被 looped back 到 IP 层的输入队列中。

IP 层收到数据包,交付给 TCP 层, TCP 层发现目的端口是 8080, 就会把 GET 请求取出来,交付给绑定 8080 端口的 Web 服务器。

在 Unix 和 Linux 系统中, 通过把 loopback 接口命名为 lo 或者 lo0 (注意第一个字母是 L 的小写字母,不是数字一)

至于 localhost , 这就是个本机的主机名, 在大多数机器上, 这个主机名都会被计算机操作系统映射到 127.0.0.1 (ipv4) 或者::1 (ipv6) , 那使用 localhost 和 ip 实际上一样了。

127.0.0.1 localhost

::1 localhost

当然你可以手工的修改 hosts 文件来改变这种默认映射 (实际上很少人这么干)。

Windows 的 hosts 文件位置: %SystemRoot%\System32\drivers\etc\hosts Unix , Liunx 的 hosts 文件位置:

/etc/hosts

但是有个有意思的例外就是 mysql , 在 Linux 上, 当你使用 localhost 来连接数据库的时候, Mysql 会使用 Unix domain socket 来传输数据, 这种方式会快一些, 因为这是一种进程内通信(IPC) 机制, 不走网络协议栈, 不需要打包拆包, 计算校验和,维护序号等操作。

当你使用 127.0.0.1 的时候, mysql 还是会使用 TCP/IP 协议栈来进行数据传输。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文