为什么ping“localhost”和ping“本地IP地址”有区别?

Dio*_*ogo 35 windows ip-address ping localhost

在 Windows 上使用cmdping给了我以下结果:

  • ping“本地主机”:

在此处输入图片说明

  • ping“192.168.0.10”(本地IP地址):

在此处输入图片说明

两种情况不完全一样吗?

我的意思是,我正在 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)。

查找localhostusingnslookup给了我们:

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 偏好的设置,以粗体强调:

  1. 在注册表编辑器中,找到并单击以下注册表子项:

     HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
    Run Code Online (Sandbox Code Playgroud)
  2. 双击 DisabledComponents 以修改 DisabledComponents 条目。

    注意:如果 DisabledComponents 条目不可用,您必须创建它。为此,请按照下列步骤操作:

    1. 在“编辑”菜单中,指向“新建”,然后单击“DWORD(32 位)值”。

    2. 键入 DisabledComponents,然后按 Enter。

    3. 双击 DisabledComponents。

  3. 在数值数据:字段中键入以下任一值以将 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 接口。
  4. 重新启动计算机以使此设置生效。

这个前缀策略表是什么?

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 上更改此设置破坏了我们的邮件服务器,因此应该小心处理...

  • **不正确,正如 RFC 2606 提到的:** `“.localhost”TLD 传统上在主机 DNS 实现中静态定义为具有指向环回 IP 地址的 A 记录,并保留用于此类用途。` 注意使用`TLD` 并注意它是*传统定义的*。事实上,`ping localhost.` 的工作证实了这至少在这个问题的上下文中是正确的。你的最后一句话不是 RFC 所说的,如果它确实“防止它成为 TLD”,请引用,因为它所说的*它是*传统上是一个 TLD。否则他们不会引用“.localhost TLD” (2认同)

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,它会工作。

  • @DiogoRocha 正确,ping localhost 永远不会触及硬件。如果网卡的驱动程序拦截给自己的请求,那么 ping 192.168.0.10 也可能无法为您提供可靠的信息。 (4认同)

Kaz*_*Kaz 6

我从截图中意识到这个问题与 Linux 无关,但它可能是一个有用的“例证”。

在该操作系统上,如果您 p​​ing 本地适配器地址之一,它将被转换为环回设备(特殊情况黑客)。这意味着数据包实际上进入环回设备(这具有您可能认为的所有含义:例如,从防火墙的角度来看,这些数据包进入环回接口并将匹配该接口的规则)。

分配了 IP 的设备将永远不会看到数据包。(这很好,因为它不会对这些数据包做正确的事情:它想把吸盘送出去。)

但是,如果持有该 IP 的接口碰巧出现故障,那么您就失去了该连接。到环回的映射将停止工作。

因此,换句话说,将这些本地地址视为环回设备的别名是一种可行的设计。

代码参考:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

看看功能ip_route_output_slow。此调用fib_lookup,如果此函数返回代码RTN_LOCALdev_out则重写为环回:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769