地址与协议

地址与协议

localhost 与 127.0.0.1

Pv4 的网络标准把 从 127.0.0.1 到 127.255.255.254 IP 地址块都用作 loopback。所有的发到这些地址的数据包都会被毫发无损的返回去(looped back ),这一千六百多万个个地址中,最知名的、最常用的就是 127.0.0.1。对于 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

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

下一页