Windowsでとを使用するcmd
とping
、次の結果が得られました。
- 「localhost」へのping:
- ping "192.168.0.10"(ローカルIPアドレス):
両方の状況はまったく同じではありませんか?
つまり、同じインターフェイス、同じマシン、同じアドレスに対してpingを実行しています。なぜこのような異なる結果が得られるのですか?
編集:ここに私のipconfig /all
画面があります:
Windowsでとを使用するcmd
とping
、次の結果が得られました。
両方の状況はまったく同じではありませんか?
つまり、同じインターフェイス、同じマシン、同じアドレスに対してpingを実行しています。なぜこのような異なる結果が得られるのですか?
編集:ここに私のipconfig /all
画面があります:
回答:
「ローカルホスト」を保持している物理インターフェイスがない場合、同じインターフェイスに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設定を調べる必要があります。
このKB記事では、Windowsが好むものに影響する設定について、太字で強調して説明しています。
レジストリエディターで、次のレジストリサブキーを見つけてクリックします。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
DisabledComponentsエントリを変更するには、DisabledComponentsをダブルクリックします。
注:DisabledComponentsエントリが利用できない場合は、作成する必要があります。これを行うには、次の手順を実行します。
[編集]メニューの[新規]をポイントし、[DWORD(32ビット)値]をクリックします。
DisabledComponentsと入力し、Enterキーを押します。
DisabledComponentsをダブルクリックします。
[値のデータ:]フィールドに次のいずれかの値を入力して、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インターフェイスを無効にします。この設定を有効にするには、コンピューターを再起動します。
このプレフィックスポリシーテーブルとは何ですか?
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サーバーでこの設定を変更すると、メールサーバーが破損したため、注意して処理する必要があります...
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
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.
ループバックインターフェイスは、独立して、あなたのイーサネットインタフェース(S)の存在します。
IPv6の複雑さがなくても、2つの異なるアドレスがあります。
ループバックIPv4アドレス:127.0.0.1
イーサネットインターフェイスのIPv4アドレス:192.168.0.10
ループバックインターフェイスは、実際のハードウェアからより離れた別のソフトウェア層にある可能性があります。たとえば、特定のイーサネットインターフェイスドライバーに依存しているとは思えません。
LocalhostとIPアドレスは同じものではありません。
localhostは、システムにリンクされている特別なソフトウェア専用のIPアドレスです。Localhost、つまり127.0.0.1は、ループバックアドレスです。常にシステムを指し、コンピューターからのみアクセス可能です。このルーティングはOSレベルで発生し、間違いなくNICを離れることはありません...したがって、ネットワークにヒットする可能性はありません。
独自のIPアドレスへのpingは似ていますが、IPアドレスであることを検出し、正しくルーティングする必要があるため、潜在的にネットワークスタック全体が関与します...
効果は同じであるはずですが、違いがある場合があります。
たとえば、ネットワークケーブルを取り外します。静的IPアドレスをpingします。ホストへのルート、またはその他のエラーが発生しない場合があります。localhostまたは127.0.0.1にpingを実行すると、動作します。
スクリーンショットから、この質問は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_LOCAL
、dev_out
ループバックに書き換えられます。
「Localhost」エイリアスはIPv6ループバックを解決しているように見えますが、IPv4アドレスを明示的に使用する場合は明らかにそうではありません。
@ebwhiteは何についても正しい。
今、なぜTeredoをセットアップしたのでしょうか(スクリーンショットからはわかりませんが、テキストファイルにパイプして出力全体を貼り付ける方が良いです)-IPv6であるlocalhostの動作は私のシステムと一貫していますteredoがインストールされたIPv4のみのネットワーク127.0.0.1
ですが、ping を実行すると、期待どおりに動作しませんlocalhost
。これをWindows XPでテストしましたが、Windows 7システムが何をするのかを確認し、質問を更新する必要があります。
一般に、IPv6が使用可能な場合、システムはデフォルトでIPv6になります。したがって、システムは設計どおりに動作しています。