web-dev-qa-db-ja.com

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

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

  • "localhost"をpingします。

Enter image description here

  • "192.168.0.10"(ローカルIPアドレス)にpingを送信します。

Enter image description here

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

つまり、同じインタフェース、同じマシン、同じアドレスに対してpingを実行しています。どうしてこんなに違う結果が出るの?

編集:これは私のipconfig /allスクリーンです:

Enter image description here

32
Diogo

あなたは同じインタフェースをpingしていません、あなたがまだ「ローカルホスト」を持っている物理的なインタフェースなしで。

あなたのlocalhostはあなたのコンピュータの「外部」IPからではなく、その「内部」IPからあなたのコンピュータを参照するために使われます。そのため、pingパケットは物理ネットワークインタフェースを通過しません。物理的なホップなしでポートからポートへ直接パケットを送信する仮想ループバックインターフェイスを通してのみ。

localhostがなぜ::1に解決されるのか不思議に思うかもしれませんが、伝統的にIPv4アドレス127.0.0.1に解決されることを期待していました。 .localhostは伝統的にループバックIPアドレスを指すTLD( RFC 2606 を参照)であることに注意してください(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-bit)Valueを次にクリックします。

    2. DisabledComponentsを入力してEnterを押します。

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

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

    • すべてのIPv6コンポーネントを有効にするには、0を入力します。 (Windowsのデフォルト設定)
    • IPv6ループバックインタフェースを除くすべてのIPv6コンポーネントを無効にするには、0xffffffffを入力します。この値は、プレフィックスポリシーテーブルのエントリを変更することによって、IPv6よりもインターネットプロトコルバージョン4(IPv4)の使用を優先するようにWindowsを構成します。詳細については、「送信元アドレスと宛先アドレスの選択」を参照してください。
    • プレフィックスポリシーテーブルのエントリを変更して、IPv6よりもIPv4を優先する場合は、0x20を入力します。
    • すべての非トンネルインタフェース(LANインタフェースとPPP(Point-to-Point Protocol)インタフェースの両方)でIPv6を無効にするには、0x10を入力します。
    • すべてのトンネルインタフェースでIPv6を無効にするには、0x01を入力します。これらには、サイト内自動トンネルアドレス指定プロトコル(ISATAP)、6to4、およびTeredoがあります。
    • IPv6ループバックインタフェースを除くすべてのIPv6インタフェースを無効にするには、0x11を入力します。
  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でこの設定を変更するとメールサーバーが破損したため、慎重に処理する必要があります。

45
Tamara Wijsman

ループバックインタフェース は、イーサネットインタフェースとは無関係に存在します。

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

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

ループバックインタフェースは、実際のハードウェアからより離れた別のソフトウェアレイヤにある場合があります。私はそれがあなたの特定のイーサネットインタフェースドライバなどに何らかの形で依存するとは思わない。

20
RedGrittyBrick

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

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

自分のIPアドレスをpingするのも似ていますが、自分のIPアドレスであることを検出し、正しくルーティングする必要があるため、ネットワークスタック全体に影響する可能性があります。

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

たとえば、ネットワークケーブルを外します。静的IPアドレスをpingします。あなたは、ホスト、または他のエラーへの経路が得られないかもしれません。今localhostまたは127.0.0.1をpingし、それは動作します。

11

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

そのOSでは、ローカルアダプタアドレスの1つに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はloopbackに書き換えられます。

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

6
Kaz

"Localhost"エイリアスがIPv6ループバックを解決しているように見え、明示的にIPv4アドレスを使用すると明らかにそうではありません。

5
EBGreen

@ebwhiteは正しいことです。

さて、なぜあなたは Teredo をセットアップしたのかもしれません(私はあなたのスクリーンショットからそれをテキストファイルにパイプし、全体の出力をペーストすることはわかりません) - localhostが IPv6 であるという動作は、Teredoがインストールされているmy IPv4 のみのネットワーク上のシステムと一致しますが、それがないシステムはあなたのように動作しますlocalhostをpingしたときに127.0.0.1が返されることを期待してください。私はこれをWindows XPでテストし、私のWindows 7システムが何をするのか見て質問を更新する必要があります。

一般に、IPv6が利用可能であればシステムはデフォルトでIPv6になります。システムは設計通り に動作します

1
Journeyman Geek