Total Pageviews

Friday, 20 January 2017

localhost和127.0.0.1的异同

相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。
localhost也叫local ,正确的解释是:本地服务器
127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器)
localhost是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的限制
127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。
一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。
有时候用localhost可以,但用127.0.0.1就不可以的情况就是在于此。估计原因是用localhost访问时,系统带的本机当前用户的权限去访问,而用ip的时候,等于本机是通过网络再去访问本机,可能涉及到网络用户的权限。

Loopback

在开始之前, 先来了解下一个叫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, 看看有什么效果
image
对于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协议栈来进行数据传输。

区别

localhost 是个域名,不是地址,它可以被配置为任意的 IP 地址,不过通常情况下都指向 127.0.0.1(ipv4)和 ::1
整个127.* 网段通常被用作 loopback 网络接口的默认地址,按惯例通常设置为 127.0.0.1。这个地址在其他计算机上不能访问,就算你想访问,访问的也是自己,因为每台带有TCP/IP协议栈的设备基本上都有 localhost/127.0.0.1。
本机地址通常指的是绑定在物理或虚拟网络接口上的IP地址,可供其他设备访问到。
最后,从开发度来看
  • localhost是个域名,性质跟 “www.baidu.com” 差不多。不能直接绑定套接字,必须先gethostbyname转成IP才能绑定。
  • 127.0.0.1 是绑定在 loopback 接口上的地址,如果服务端套接字绑定在它上面,你的客户端程序就只能在本机访问。
参考资料

No comments:

Post a Comment