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


32

在Windows上使用cmdping提供了以下结果:

  • ping“本地主机”:

在此处输入图片说明

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

在此处输入图片说明

两种情况不是完全一样吗?

我的意思是,我正在ping相同的接口,相同的计算机和相同的地址。为什么会得到如此不同的结果?

编辑:这是我的ipconfig /all屏幕:

在此处输入图片说明


18
您不会对同一接口执行ping操作,即使没有任何物理接口,您仍然具有“本地主机”。
Tamara Wijsman 2012年

如果用“相同接口”表示环回接口,那么您是正确的。如果您指的是以太网接口,则可能由于多种原因而出错。(例如,:: 1与以太网接口如何关联?为什么以太网接口(其工作是在网络上发送以太网数据包并从网络上接收以太网数据包)会参与到一个从未涉及到以太网数据包还是电线?)
David Schwartz

我可以肯定的是,如果我能找到之前,我已经在Stackoverflow上问过这个问题……
Chris S

这样做的心脏得到本SO回答,我相信:stackoverflow.com/questions/6938039/...
道森托特

我认为有趣的事情是:为什么在对远程主机执行ping操作时会得到传输的字节数和TTL,而在ping本地主机时却没有?没有人会在乎IP地址格式是否有点问题。
dhasenan

Answers:


46

您没有对同一接口执行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偏好设置的设置,以粗体强调:

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

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  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而不是IPv4的类型。
    • 键入0x10以在所有非隧道接口(在LAN和点对点协议[PPP]接口上)上禁用IPv6。
    • 键入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

该表确定在DNS解析期间哪些前缀优先于其他前缀。

嗯,因此使用该KB我们可以在此处添加条目,以表示IPv4的优先级高于IPv6。

注意:除非遇到兼容问题,否则没有任何理由要覆盖此行为。在Windows Server上更改此设置会损坏我们的邮件服务器,因此应谨慎处理...


实际上,“ localhost”不是顶级域,而是主机名。区别非常微妙,但基本上每个域名都是一个主机名,但并非所有主机名都是域名。按照约定,以句号结尾的主机名必须为FQDN,并且可以通过附加父域将大多数未以句号结尾的主机名转换为FQDN,并在需要时退回附加到根。但是,这些只是约定。RFC 2606保留了“ localhost”,以防止它成为TLD,因为它可能无法正常工作,甚至可能导致问题。
凯文·卡斯卡特

2
如RFC 2606所述,不正确: 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
Tamara Wijsman 2012年

我太坚强了。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。
凯文·卡斯卡特

@KevinCathcart:我们在这里遇到Windows问题,Windows版本提到这是由DNS本身完成的。nslookup确实返回记录。因此,YMMV ...
Tamara Wijsman 2012年

1
@KevinCathcart我的dig退货A,AAAA和NS记录localhost,包括:的授权记录:localhost. IN NS localhost.
KutuluMike 2012年

20

loopback接口独立的以太网接口(S)的存在。

即使没有IPv6的复杂性,您也将拥有两个不同的地址。

环回IPv4地址:127.0.0.1
您的以太网接口的IPv4地址:192.168.0.10

回送接口很可能位于不同的软件层中,与真实硬件之间的距离更远。我怀疑它在任何方面都取决于您特定的以太网接口驱动程序。


11

Localhost和您的IP地址不是同一个人。

本地主机是仅用于特殊软件的IP地址,它链接到您的系统。Localhost或127.0.0.1是回送地址。它始终指向您的系统,并且只能通过计算机访问。此路由发生在操作系统级别,并且绝对不会离开NIC ...因此,它没有机会进入网络。

对您自己的IP地址执行Ping操作类似,但是它可能涉及整个网络堆栈,因为它需要检测到它是您的IP地址并正确路由

效果应该相同,但可能会有差异。

例如,拔下网络电缆。ping您的静态IP地址。您可能没有通往主机的路线,或其他错误。现在ping localhost或127.0.0.1,它将正常工作。


那么,ping localhost是完全没用的吗?我的意思是,如果我想测试我的界面……
Diogo 2012年

4
@DiogoRocha是正确的,ping localhost永远不会接触硬件。如果网卡的驱动程序拦截了对自身的请求,则ping 192.168.0.10可能也不会为您提供可靠的信息。
Scott Chamberlain 2012年

@DiogoRocha您的术语已关闭。127.0.0.1是一个接口,但是是虚拟的。
barlop 2012年

@Diogo,不完全是。Localhost允许您测试应用程序的网络行为,或验证网络堆栈是否在工作。...但是它不测试驱动程序。因此,例如,如果您的NIC驱动程序错误,则localhost可能可以帮助证明它是nic驱动程序。你的里程肯定会有所不同!
本杰明·肖尔尼克

6

我从屏幕截图中意识到,这个问题不是关于Linux的,而是一个有用的“案例”。

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

分配了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


4

看来“ Localhost”别名已解析为IPv6回送,而当您显式使用IPv4地址时,显然没有。


6
操作系统似乎与您不同意。
EBGreen

6
没关系,它显然是为计算机设置的,localhost正在遇到ipv6环回。
罗布

1
@DiogoRocha在IPV4世界中没有这样的地址:: 1。127.0.0.1是为回送保留的IP。:: 1,但是对于IPV6确实存在,并且像127.0.0.1一样,保留用于IPV6回送。
安迪

4
这如何回答这个问题?您只是在说显而易见的话。
Tamara Wijsman'4

4
请详细说明您的答案,这并不能真正解释任何内容
Ivo Flipse'4

1

@ebwhite是正确的。

现在,为什么可能是您设置了Teredo(我不能从您的屏幕截图中看出来,将其传输到文本文件中并粘贴整个输出效果更好)-localhost为IPv6的行为与我的系统一致仅安装了Teredo的IPv4网络,但不带Teredo的系统运行时会像127.0.0.1您ping时预期的那样运行localhost。我已经使用Windows XP进行了测试,需要查看Windows 7系统的功能并更新问题。

一般情况下,系统默认到IPv6在IPv6可用,因此,您的系统工作,因为它应该


他没有屏幕截图之一的字节传输或TTL,是IPv6吗?为什么?
barlop 2012年

也与我在Windows 7上看到的内容一致-我的猜测是往返时间可以忽略不计
Journeyman Geek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.