ping "localhost"とping "local IP address"に違いがあるのはなぜですか?


32

Windowsでとを使用するcmdping、次の結果が得られました。

  • 「localhost」へのping:

ここに画像の説明を入力してください

  • ping "192.168.0.10"(ローカルIPアドレス):

ここに画像の説明を入力してください

両方の状況はまったく同じではありませんか?

つまり、同じインターフェイス、同じマシン、同じアドレスに対してpingを実行しています。なぜこのような異なる結果が得られるのですか?

編集:ここに私のipconfig /all画面があります:

ここに画像の説明を入力してください


18
物理インターフェースがなくても「ローカルホスト」が存在する場合でも、同じインターフェースpingを実行していません
タマラWijsman

「同じインターフェース」でループバックインターフェースを意味する場合、あなたは正しいです。イーサネットインターフェイスを意味する場合、いくつかの理由で間違っています。(たとえば、どのように:: 1がイーサネットインターフェースに関連付けられますか?そして、なぜイーサネットインターフェース(イーサネットパケットをワイヤで送信し、ワイヤから受信するのが仕事)は、決して関与しない操作に関与するのでしょうか?イーサネットパケットまたはワイヤー?)
デイビッドシュワルツ

私は...私はそれを見つけることができる場合は、この質問は、前のStackOverflowに依頼されているかなり確信している
クリスS

その心は、このSOで答えます、私は信じている:stackoverflow.com/questions/6938039/...
ドーソン・トス

おもしろいのは、リモートホストにpingを実行するときに、転送されるバイト数とTTLを取得するのに、ローカルホストにpingを実行しないのはなぜだと思いますか?IPアドレス形式が少しずれていることを気にする人はいないでしょう。
ダースナン

回答:


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アドレス::1RFC 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設定を調べる必要があります。

このKB記事では、Windowsが好むものに影響する設定について、太字で強調して説明しています。

  1. レジストリエディターで、次のレジストリサブキーを見つけてクリックします。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. DisabledComponentsエントリを変更するには、DisabledComponentsをダブルクリックします。

    注:DisabledComponentsエントリが利用できない場合は、作成する必要があります。これを行うには、次の手順を実行します。

    1. [編集]メニューの[新規]をポイントし、[DWORD(32ビット)値]をクリックします。

    2. DisabledComponentsと入力し、Enterキーを押します。

    3. DisabledComponentsをダブルクリックします。

  3. [値のデータ:]フィールドに次のいずれかの値を入力して、IPv6プロトコルを目的の状態に構成し、[OK]をクリックします。

    • 入力0して、すべてのIPv6コンポーネントを有効にします。(Windowsのデフォルト設定)
    • 入力0xffffffffして、IPv6ループバックインターフェイスを除くすべてのIPv6コンポーネントを無効にします。また、この値は、プレフィックスポリシーテーブルのエントリを変更することにより、IPv6よりもインターネットプロトコルバージョン4(IPv4)を使用することを優先するようにWindowsを構成します。詳細については、送信元および宛先アドレスの選択を参照してください。
    • 入力0x20プレフィックスポリシーテーブルのエントリを変更することで、IPv6の上でIPv4のを好みます。
    • 0x10すべての非トンネルインターフェース(LANおよびPoint-to-Pointプロトコル[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サーバーでこの設定を変更すると、メールサーバーが破損したため、注意して処理する必要があります...


実際には、「localhost」はトップレベルドメインではなく、ホスト名です。区別は非常に微妙ですが、基本的にすべてのドメイン名はホスト名ですが、すべてのホスト名がドメイン名ではありません。慣例により、フルストップで終了するホスト名はFQDNである必要があり、フルストップで終了しないほとんどのホスト名は、親ドメインを追加し、必要に応じてルートを追加することでFQDNに変換できます。ただし、これらは単なる規則です。「localhost」は、RFC 2606によって予約されており、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と注意に注意してください。実際、この質問の文脈において少なくともこれが真実であることを確認する作品。あなたの非常に最後の文は、RFCがあるため、それが言うことで、それは「TLDになることを防ぐ」ん引用してください場合は、言ったことではありませんそれは伝統的にTLD。そうでなければ、彼らは言及しないだろうping localhost.the .localhost TLD
タマラWijsman

私は少し強すぎました。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 ...
タマラWijsman

1
私@KevinCathcart digためのリターンA、AAAA、およびNSレコードlocalhostの権限レコードを含む、:localhost. IN NS localhost.
KutuluMike

20

ループバックインターフェイスは、独立して、あなたのイーサネットインタフェース(S)の存在します。

IPv6の複雑さがなくても、2つの異なるアドレスがあります。

ループバックIPv4アドレス:127.0.0.1
イーサネットインターフェイスのIPv4アドレス:192.168.0.10

ループバックインターフェイスは、実際のハードウェアからより離れた別のソフトウェア層にある可能性があります。たとえば、特定のイーサネットインターフェイスドライバーに依存しているとは思えません。


11

LocalhostとIPアドレスは同じものではありません。

localhostは、システムにリンクされている特別なソフトウェア専用のIPアドレスです。Localhost、つまり127.0.0.1は、ループバックアドレスです。常にシステムを指し、コンピューターからのみアクセス可能です。このルーティングはOSレベルで発生し、間違いなくNICを離れることはありません...したがって、ネットワークにヒットする可能性はありません。

独自のIPアドレスへのpingは似ていますが、IPアドレスであることを検出し、正しくルーティングする必要があるため、潜在的にネットワークスタック全体が関与します...

効果は同じであるはずですが、違いがある場合があります。

たとえば、ネットワークケーブルを取り外します。静的IPアドレスをpingします。ホストへのルート、またはその他のエラーが発生しない場合があります。localhostまたは127.0.0.1にpingを実行すると、動作します。


だから、ping localhostはまったく役に立たない?つまり、自分のインターフェイスをテストしたい場合は
...-ディオゴ

4
@DiogoRocha正しい、ping localhostはハードウェアに触れません。Heck ping 192.168.0.10は、ネットワークカードのドライバーが自身に与えられた要求をインターセプトした場合にも、信頼できる情報を提供しない場合があります。
スコットチェンバレン

@DiogoRocha専門用語は無効です。127.0.0.1はインターフェイスですが、仮想インターフェイスです。
barlop

@Diogo、そうでもない。Localhostを使用すると、アプリケーションのネットワーク動作をテストしたり、ネットワークスタックが機能していることを確認したりできます。しかし、ドライバーはテストしません。そのため、たとえば、不良なNICドライバーがある場合、localhostはnicドライバーであることを証明するのに役立つ可能性があります。あなたの走行距離は間違いなく異なります!!
ベンジャミンショルニック

6

スクリーンショットから、この質問はLinuxに関するものではないが、おそらく「適切な事例」になると思います。

そのOSでは、ローカルアダプタアドレスの1つをpingすると、ループバックデバイスに変換されます(特殊なケースハック)。これは、パケットが実際にループバックデバイスに送られることを意味します(これには、考えられるすべての影響があります。たとえば、ファイアウォールの観点から、それらのパケットはループバックインターフェイスに着信し、そのインターフェイスのルールに一致します)。

IPが割り当てられているデバイスは、パケットを参照しません。(これは、それらのパケットで正しいことをしないので良いです:それは吸盤を送り出したいでしょう。)

ただし、そのIPを保持するインターフェイスがダウンした場合、その接続は失われます。ループバックへのマッピングは機能しなくなります。

つまり、これらのローカルアドレスをループバックデバイスのエイリアスと見なすことは実行可能な設計です。

コード参照:

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

functionを見てください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
OSはあなたに同意しないようです。
EBGreen

6
それは問題ではなく、明らかにコンピュータ用にセットアップされており、localhostはipv6ループバックにヒットしています。
ロブ

1
@DiogoRocha IPV4の世界にはそのようなアドレス:: 1はありません。127.0.0.1は、そこでのループバック用に予約されているIPです。:: 1ただし、IPV6には存在し、127.0.0.1のように、IPV6ループバック用に予約されています。
アンディ

4
これは質問にどのように答えますか?あなたは明白なことを述べているだけです。
タマラWijsman

4
これは本当に何かを説明していない、あなたの答えに手の込んだしてください
イヴォFlipse

1

@ebwhiteは何についても正しい。

今、なぜTeredoをセットアップしたのでしょうか(スクリーンショットからはわかりませんが、テキストファイルにパイプして出力全体を貼り付ける方が良いです)-IPv6であるlocalhostの動作は私のシステムと一貫していますteredoがインストールされたIPv4のみのネットワーク127.0.0.1ですが、ping を実行すると、期待どおりに動作しませんlocalhost。これをWindows XPでテストしましたが、Windows 7システムが何をするのかを確認し、質問を更新する必要があります。

一般に、IPv6が使用可能な場合、システムはデフォルトでIPv6になります。したがって、システムはどおりに動作しています。


彼はBytesまたはTTLをスクリーンショットの1つで取得しませんが、それはIPv6ですか?どうして?
-barlop

また、Windows 7で見られるものと一致しています-往復時間はごくわずかです
ジャーニーマンオタク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.