IP 0.0.0.0への接続は成功します。どうやって?どうして?


41

localhostのポートにサービスを提供しており、ポートが使用可能かどうかを別のプロセスにチェックインしたいと考えています。コードのバグにより、実際にはIPに接続しようとしていますが0.0.0.0:<port>、何らかの理由で成功します-straceが証明しているように:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

どういう意味ですか?なぜ機能するのですか?


回答:


68

ターゲットアドレスとしての0.0.0.0は、ルーティング不可能なホストまたは「このホスト」をさまざまに指します。実際には、0.0.0.0への接続はlocalhostへの接続と同等です。(厳密に言えば、宛先アドレスとしては有効ではなく、送信元アドレスとしてのみ有効ですが、実際には理論と一致しません。)

バインドする場合、「このホスト」は「このホスト上の任意のアドレス」に展開されます。そのため、アプリケーションは通常、0.0.0.0にバインドすることで接続を受け入れます。


7
この回答を少し拡張するには、「リスニングプロセスの開始後に追加されたIPを含む、このシステム上の任意のIPアドレス」を意味します
-Criggie

5
localhostは単一のアドレスで、ほとんどが127.0.0.1ですが、0.0.0.0はこのホスト上のすべてのアドレスを意味します。
-rexkogitans

@rexkogitans localhostが単一のアドレスが、範囲127.0.0.0/8の任意のアドレスではありません-つまりは、127.0.0.0から127.255.255.255までの任意のアドレス
Dezza

6
@Dezzaいいえ、localhostは127.0.0.1です。127.0.0.0/8(別名、127.0.0.0から127.255.255.255)は、ほとんどの機器でループバックされます。たとえば、RFC 5735ページ4で文書化されています。(興味深いことに、一部のCisco機器は任意のアドレスにループバックを割り当てることができますが、デフォルトではループバックをまったくサポートしません。これは、ネットワーク上の他の機器に影響を与える可能性はありません。)ただし、localhostは通常、単一のアドレスは127.0.0.1で、「hosts」ファイルを使用して一般的に実装されます。だから私はあなたの修正の試みに同意しません。
-TOOGAM

「宛先アドレスとしては無効であり、送信元アドレスとしてのみ有効」という意味を明確にできますか?mysqlサーバーが0.0.0.0でリッスンする場合、アドレスは宛先またはソースですか?mysqlクライアントから送信されたリクエストの宛先ではありませんか?
ティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.