在 Windows 上使用cmd
和ping
得到了以下结果:
- 正在 Ping “本地主机”:
- 正在 Ping “192.168.0.10”(本地 IP 地址):
这两种情况不是完全一样吗?
我的意思是,我 ping 的是同一个接口、同一个机器和同一个地址。为什么我得到的结果如此不同?
编辑:这是我的ipconfig /all
屏幕:
答案1
您没有 ping 同一个接口,没有任何物理接口,您仍然有一个“本地主机”。
您localhost
的计算机用于通过其“内部”IP 而不是任何“外部”IP 来引用您的计算机。因此,ping 数据包不会通过任何物理网络接口;仅通过虚拟环回接口,该接口直接将数据包从一个端口发送到另一个端口,而无需任何物理跳跃。
您可能仍然想知道为什么localhost
会解析为::1
,而传统上我们希望它解析为 IPv4 地址127.0.0.1
。请注意,.localhost
传统上是 TLD(请参阅RFC 2606)指向环回 IP 地址(对于 IPv4,请参阅RFC 3330,尤其是127.0.0.0/8)。
localhost
使用查找nslookup
可以得到:
nslookup localhost
...
Name: localhost
Addresses: ::1
127.0.0.1
因此,Windows 倾向于使用 IPv6 环回 IP 地址::1
(请参阅RFC 2373),因为它列在第一位。
好的,那么它是从哪里来的呢,我们先看看hosts文件。
type %WINDIR%\System32\Drivers\Etc\Hosts
...
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
...
嗯,我们必须查看 Windows 的 DNS 设置。
此知识库文章告诉我们影响 Windows 偏好的设置,以粗体强调:
在注册表编辑器中,找到并单击以下注册表子项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
双击“DisabledComponents”以修改“DisabledComponents”条目。
注意:如果 DisabledComponents 条目不可用,则必须创建它。为此,请按照下列步骤操作:
在编辑菜单中,指向新建,然后单击 DWORD(32 位)值。
键入 DisabledComponents,然后按 ENTER。
双击 DisabledComponents。
在数值数据:字段中键入以下任一值以将 IPv6 协议配置为所需状态,然后单击确定:
- 键入
0
以启用所有 IPv6 组件。(Windows 默认设置)- 键入
0xffffffff
以禁用除 IPv6 环回接口之外的所有 IPv6 组件。此值还通过修改前缀策略表中的条目将 Windows 配置为优先使用 Internet 协议版本 4 (IPv4) 而不是 IPv6。有关更多信息,请参阅源和目标地址选择。0x20
通过修改前缀策略表中的条目,键入优先使用 IPv4 而不是 IPv6。- 键入
0x10
以在所有非隧道接口(在 LAN 和点对点协议 [PPP] 接口上)禁用 IPv6。- 键入
0x01
以在所有隧道接口上禁用 IPv6。这些包括站内自动隧道寻址协议 (ISATAP)、6to4 和 Teredo。- 键入
0x11
以禁用除 IPv6 环回接口之外的所有 IPv6 接口。重新启动计算机以使此设置生效。
这个前缀策略表是什么?
netsh interface ipv6 show prefixpolicies
(或prefixpolicy
早期版本)
Precedence Label Prefix
---------- ----- --------------------------------
50 0 ::1/128
45 13 fc00::/7
40 1 ::/0
10 4 ::ffff:0:0/96
7 14 2002::/16
5 5 2001::/32
1 11 fec0::/10
1 12 3ffe::/16
1 10 ::/96
该表决定 DNS 解析期间哪些前缀优先于其他前缀。
啊,因此使用该 KB,我们可以在这里添加条目,表示 IPv4 的优先级高于 IPv6。
笔记:除非您遇到兼容性问题,否则没有必要覆盖此行为。更改 Windows Server 上的此设置会破坏我们的邮件服务器,因此应谨慎处理...
答案2
答案3
Localhost 和您的 IP 地址不是一回事。
localhost 是一个特殊的软件专用 IP 地址,它链接到您的系统。Localhost 或 127.0.0.1 是一个环回地址。它始终指向您的系统,并且只能从您的计算机访问。此路由发生在操作系统级别,并且绝对不会离开 NIC... 因此它没有机会访问网络....
ping 你自己 IP 地址的方法类似,但它可能涉及整个网络堆栈,因为它需要检测它是你的 IP 地址,并且正确路由...
效果应该是一样的,但是也可以有区别。
例如,拔掉网线。ping 您的静态 IP 地址。您可能无法路由到主机,或者出现其他错误。现在 ping localhost 或 127.0.0.1,就可以正常工作了。
答案4
看起来“Localhost”别名正在解析为 IPv6 环回,而当您明确使用 IPv4 地址时显然不会。