在Windows上使用cmd
和ping
提供了以下结果:
- ping“本地主机”:
- ping“ 192.168.0.10”(本地IP地址):
两种情况不是完全一样吗?
我的意思是,我正在ping相同的接口,相同的计算机和相同的地址。为什么会得到如此不同的结果?
编辑:这是我的ipconfig /all
屏幕:
在Windows上使用cmd
和ping
提供了以下结果:
两种情况不是完全一样吗?
我的意思是,我正在ping相同的接口,相同的计算机和相同的地址。为什么会得到如此不同的结果?
编辑:这是我的ipconfig /all
屏幕:
Answers:
您没有对同一接口执行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而不是IPv4的类型。- 键入
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上更改此设置会损坏我们的邮件服务器,因此应谨慎处理...
The ".localhost" TLD has traditionally been statically defined in host DNS implementations as having an A record pointing to the loop back IP address and is reserved for such use.
请注意的使用,TLD
并注意传统上定义的。实际上,ping localhost.
可以证实这一点至少在该问题的上下文中是正确的。您的最后一句话不是RFC所说的,请引用它是否“防止它成为TLD”,因为从传统上讲它是 TLD。否则,他们将不会提及the .localhost TLD
localhost
如果实际的DNS服务器响应,则可以是TLD,但是通常localhost通常定义为/ etc / hosts中的主机名,在尝试通过DNS解析之前先查找主机名。因此,dig localhost
通常不会为127.0.0.1返回“ A”记录,也不会为:: 1返回AAAA记录。这意味着RFC在显示时被误认为是traditionally been statically defined in host DNS implementations
,而是由系统的名称查找服务返回的,该服务并不总是使用DNS。
nslookup
确实返回记录。因此,YMMV ...
dig
退货A,AAAA和NS记录localhost
,包括:的授权记录:localhost. IN NS localhost.
该loopback接口独立的以太网接口(S)的存在。
即使没有IPv6的复杂性,您也将拥有两个不同的地址。
环回IPv4地址:127.0.0.1
您的以太网接口的IPv4地址:192.168.0.10
回送接口很可能位于不同的软件层中,与真实硬件之间的距离更远。我怀疑它在任何方面都取决于您特定的以太网接口驱动程序。
Localhost和您的IP地址不是同一个人。
本地主机是仅用于特殊软件的IP地址,它链接到您的系统。Localhost或127.0.0.1是回送地址。它始终指向您的系统,并且只能通过计算机访问。此路由发生在操作系统级别,并且绝对不会离开NIC ...因此,它没有机会进入网络。
对您自己的IP地址执行Ping操作类似,但是它可能涉及整个网络堆栈,因为它需要检测到它是您的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
则会被重写为回送:
看来“ Localhost”别名已解析为IPv6回送,而当您显式使用IPv4地址时,显然没有。
@ebwhite是正确的。
现在,为什么可能是您设置了Teredo(我不能从您的屏幕截图中看出来,将其传输到文本文件中并粘贴整个输出效果更好)-localhost为IPv6的行为与我的系统一致仅安装了Teredo的IPv4网络,但不带Teredo的系统运行时会像127.0.0.1
您ping时预期的那样运行localhost
。我已经使用Windows XP进行了测试,需要查看Windows 7系统的功能并更新问题。
一般情况下,系统默认到IPv6在IPv6可用,因此,您的系统工作,因为它应该由设计。