[返回电脑前线首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[版主管理]
我对于localhost与127.0.0.1的一些理解
送交者: lyabc[♂★★★声望勋衔13★★★♂] 于 2024-03-06 7:01 已读 9806 次 5 赞  

lyabc的个人频道

最近看了版上转载的文章,
Localhost 和 127.0.0.1 有什么区别?你看懂了吗?
https://club.6parkbbs.com/know1/index.php?app=forum&act=threadview&tid=13790639 6park.com

这篇文章的说法似乎是有些错误的。而我的理解如下,不尽正确,错误之处也请指正。 6park.com

第一,localhost 是本地主机的特殊域名或者别名,许多情况下,localhost都要首先被解析为127.0.0.1的,


所以“localhost 不经过网卡传输,不受网络防火墙和网卡限制。127.0.0.1 依赖于网卡,会受到防火墙和网卡的限制。” 的说法是错误的。
有一种特殊情况,就是MySQL, 根据https://www.php.net/mysql_connect“, 只要将 server 指定为 "localhost" 或 "localhost:port",MySQL 客户端库会越过此值并尝试连接到本地套接字(Windows 中的名字管道)。如果想用 TCP/IP,应该用 "127.0.0.1" 代替 "localhost"。” 当使用localhost的时候,用的是Unix domain socket,简称为UDS也叫IPC socket,是进程间通信,是不经过网卡传输的,比127.0.0.1要快,但这只是一个特例。大多数情况下,127.0.0.1受到的限制,localhost也会受到。还有没有其它程序对localhost的应用做了类似的处理,我不知道,但可能是极少的,至少维基上也只是只出了这一种。
参考:https://stackoverflow.com/questions/3715925/localhost-vs-127-0-0-1-in-mysql-connect 6park.com

第二,localhost的解析机制,在不同的操作系统上是不一样的。


在windows xp上,localhost是在hosts文件里被解析为127.0.0.1的。但如果你的电脑跟我的一样,是windows 10,那么打开hosts文件之后,就会发现 对于locahost的解析,是被注释掉的。
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
简单的搜索了下,至少从windows 7开始,localhost就是通过本地DNS解析器来解析的,不再依赖于hosts文件。linux 的本地DNS解析器似乎是可选择性安装的组件,所以对于localhost的解析也是依赖于hosts文件的。其它系统我没有研究,就不多言了,希望高手补充。 6park.com

第三,localhost不止会指向127.0.0.1


比较早的系统,localhost是指向127.0.0.1的,但现在的操作系统里,localhost指向IPv4的127.0.0.1跟IPv6的0:0:0:0:0:0:0:1 或 ::1。我在windows 10下,ping localhost,返回的是::1,而不是127.0.0.1,就是因为从Windows Vista开始,localhost会优先使用IPv6。
C:WindowsSystem32driversetc>ping localhost
Pinging MyPC[::1] with 32 bytes of data:
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms 6park.com

Ping statistics for ::1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms 6park.com

当然如果IPv6不适用的时候,它还是会指向127.0.0.1的,如果从控制面板里将IPv6禁用, 再来ping localhost,返回的就是127.0.0.1了。
另外一个例子就是我安装了alist,一个可以将百度网盘和许多网盘映射的程序,它的配置使用界面是127.0.0.1:5244, 我使用localhost:5244也是可以访问的。(这里有一点小小的不同之处,可能127.0.0.1跟localhost被认为是不同的域,cookie是不一样的,所以在127.0.0.1上的登录信息跟在localhost上的也是不一样的) 6park.com

第四,本地回环地址


127.0.0.1是所谓的本地回环地址,Loop back address, 也就是用于指向本机的地址,但它并不是唯一的回环地址,除了IPv6中的::1, 127.0.0.0到127.255.255.255都是本地回环地址,也就是说有256*256*256=16,777,216个。这一点,自己试一下ping 127.0.0.2 或者127.255.255.254,或者其中的任何一个地址都可以。
不过我的电脑上,127.0.0.0跟127.255.255.255是无法ping通的,这其中的原因还要请高手指教了。 6park.com

Pinging 127.0.0.0 with 32 bytes of data:
General failure.
General failure.
General failure.
General failure. 6park.com

Ping statistics for 127.0.0.0:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), 6park.com

Pinging 127.255.255.255 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out. 6park.com

Ping statistics for 127.255.255.255:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), 6park.com

第五,127.0.0.1的作用。


其实应该是本地回环地址的作用,但目前一般都会用127.0.0.1,以后IPv6完全取代v4的时候,就是::1了。
"一是测试本机的网络配置,能PING通127.0.0.1说明本机的网卡和IP协议安装都没有问题;另一个作用是某些SERVER/CLIENT的应用程序在运行时需调用服务器上的资源,一般要指定SERVER的IP地址,但当该程序要在同一台机器上运行而没有别的SERVER时就可以把SERVER的资源装在本机,SERVER的IP地址设为127.0.0.1同样也可以运行。"
摘自:https://blog.csdn.net/xc_tsao/article/details/41326133 6park.com

127.0.0.1有一个特殊作用,就是用来屏蔽一些网站。
由于它是本地回环地址,所以可以手动修改hosts将一些恶意的或者你想屏蔽的网站域名解析为127.0.0.1,就可以阻止程序对网站的访问了。这种手段可以用来对付一些顽固的恶意网站,像以前臭名昭著的3721。一些软件破解也利用这种手段来进行辅助。 6park.com

第六,127.0.0.1是否受防火墙跟网卡限制


防火墙是可以设置block 127.0.0.1跟localhost的。
不过把网卡禁用之后,还是能正常ping 127.0.0.1的,这似乎证明它不受网卡的限制。
根据维基页面https://en.wikipedia.org/wiki/Localhost
“The processing of any packet sent to a loopback address, is implemented in the link layer of the TCP/IP stack. Such packets are never passed to any network interface controller (NIC) or hardware device driver and must not appear outside of a computing system, or be routed by any router. This permits software testing and local services, even in the absence of any hardware network interfaces.”
也就是说接受地址为127.0.0.1的数据包,是不会发送到网卡的。 6park.com

综上所述,localhost虽然很多时候可以看作是127.0.0.1的别名,是可以通用的,但它从最初跟127.0.0.1就不是一对一的,后来随着IPv6的应用跟发展,就更加不是一对一关系了,由于localhost需要解析,所以用127.0.0.1比起用localhost是会稍微快那么一丁点的,不会快很多,是因为解析是本地的,而一种特殊情况,是在用MySQL的时候,localhost比127.0.0.1要快。
以上就是我的一些浅见,当然我对TCP/IP的理解还是一知半解的程度,希望有高手能给出更加满意的解释。 6park.com

更多参考链接:
1. https://www.cnblogs.com/xxhxs-21/p/17236071.html
2. https://en.wikipedia.org/wiki/Unix_domain_socket
3. https://superuser.com/questions/668004/why-is-my-localhost-not-127-0-0-1-but-1-and-what-notation-is-that
4. https://en.wikipedia.org/wiki/Link_layer

评分完成:已经给 lyabc 加上 200 银元!

喜欢lyabc朋友的这个贴子的话, 请点这里投票,“赞”助支持!
[举报反馈]·[ lyabc的个人频道 ]·[-->>参与评论回复]·[用户前期主贴]·[手机扫描浏览分享]·[返回电脑前线首页]
lyabc 已标注本帖为原创内容,若需转载授权请联系网友本人。如果内容违规或侵权,请告知我们。

所有跟帖:        ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )


用户名:密码:[--注册ID--]

标 题:

粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


     图片上传  Youtube代码器  预览辅助

手机扫描进入,浏览分享更畅快!

楼主本栏目热帖推荐:

>>>>查看更多楼主社区动态...






[ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 版主申请 ] [ Contact us ]