Dio*_*ogo 35 windows ip-address ping localhost
在 Windows 上使用cmd
和ping
给了我以下结果:
两种情况不完全一样吗?
我的意思是,我正在 ping 相同的接口、相同的机器和相同的地址。为什么我会得到如此不同的结果?
编辑:这是我的ipconfig /all
屏幕:
Tam*_*man 47
您没有 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
usingnslookup
给了我们:
nslookup localhost
...
Name: localhost
Addresses: ::1
127.0.0.1
Run Code Online (Sandbox Code Playgroud)
因此,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
...
Run Code Online (Sandbox Code Playgroud)
嗯,我们得看看 Windows 的 DNS 设置。
这篇知识库文章告诉我们一个影响 Windows 偏好的设置,以粗体强调:
在注册表编辑器中,找到并单击以下注册表子项:
Run Code Online (Sandbox Code Playgroud)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
以在所有非隧道接口上禁用 IPv6(在 LAN 和点对点协议 [PPP] 接口上)。- 键入
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
Run Code Online (Sandbox Code Playgroud)
此表决定在 DNS 解析期间哪些前缀优先于其他前缀。
啊,所以使用该知识库,我们可以在此处添加表示 IPv4 比 IPv6 具有更高优先级的条目。
注意:没有理由覆盖此行为,除非您遇到兼容性问题。在我们的 Windows Server 上更改此设置破坏了我们的邮件服务器,因此应该小心处理...
Red*_*ick 20
该loopback接口独立的以太网接口(S)的存在。
即使没有IPv6的复杂性,您也会有两个不同的地址。
环回IPv4地址:127.0.0.1
您的以太网接口的 IPv4 地址:192.168.0.10
环回接口很可能位于不同的软件层,与实际硬件更远。例如,我怀疑它以任何方式取决于您的特定以太网接口驱动程序。
Ben*_*ick 11
本地主机和您的 IP 地址不是一回事。
本地主机是一个特殊的软件专用 IP 地址,它链接到您的系统。本地主机,或 127.0.0.1,是一个环回地址。它始终指向您的系统,并且只能从您的计算机访问。这种路由发生在操作系统层面,绝对不会离开网卡......所以它没有机会进入网络......
ping 你自己的 IP 地址是类似的,但它可能涉及整个网络堆栈,因为它需要检测它是你的 IP 地址,并正确路由它......
效果应该是一样的,但可以有差异。
例如,拔下网络电缆。Ping 您的静态 IP 地址。您可能无法获得到主机的路由或其他错误。现在 ping localhost 或 127.0.0.1,它会工作。
我从截图中意识到这个问题与 Linux 无关,但它可能是一个有用的“例证”。
在该操作系统上,如果您 ping 本地适配器地址之一,它将被转换为环回设备(特殊情况黑客)。这意味着数据包实际上进入环回设备(这具有您可能认为的所有含义:例如,从防火墙的角度来看,这些数据包进入环回接口并将匹配该接口的规则)。
分配了 IP 的设备将永远不会看到数据包。(这很好,因为它不会对这些数据包做正确的事情:它想把吸盘送出去。)
但是,如果持有该 IP 的接口碰巧出现故障,那么您就失去了该连接。到环回的映射将停止工作。
因此,换句话说,将这些本地地址视为环回设备的别名是一种可行的设计。
代码参考:
http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623
看看功能ip_route_output_slow
。此调用fib_lookup
,如果此函数返回代码RTN_LOCAL
,dev_out
则重写为环回:
http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769