Berhasil menghubungkan ke IP 0.0.0.0. Bagaimana? Mengapa?

41

Kami melayani port di localhost dan ingin memeriksa proses lain jika port tersedia. Karena ada bug dalam kode kami, sebenarnya ia mencoba untuk terhubung ke IP 0.0.0.0:<port>, dan untuk beberapa alasan ia berhasil - seperti yang dibuktikan oleh strace:

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

Apa artinya? Mengapa ini berhasil?

erikbwork
sumber

Jawaban:

68

0.0.0.0 sebagai alamat target merujuk berbagai host yang tidak dapat dialihkan atau ke "host ini" . Dalam praktiknya menghubungkan ke 0.0.0.0 sama dengan menghubungkan ke localhost. (Sebenarnya, ini tidak valid sebagai alamat tujuan, hanya sebagai alamat sumber, tetapi praktik tidak cocok dengan teori.)

Ketika mengikat, "host ini" diperluas ke "alamat apa pun di host ini" - jadi aplikasi biasanya menerima koneksi dengan mengikat ke 0.0.0.0, yang berarti mereka akan menerima paket yang ditujukan ke alamat IPv4 pada sistem.

Stephen Kitt
sumber
7
Untuk sedikit memperluas jawaban ini - ini berarti "alamat IP apa pun pada sistem ini, termasuk IP yang telah ditambahkan setelah proses mendengarkan dimulai"
Criggie
5
localhost adalah alamat tunggal, sebagian besar 127.0.0.1, sedangkan 0.0.0.0 berarti semua alamat di host ini.
rexkogitans
@rexkogitans localhost bukan alamat tunggal, tetapi alamat apa pun dalam kisaran 127.0.0.0/8 - yaitu alamat apa pun dari 127.0.0.0 hingga 127.255.255.255
Dezza
6
@Dezza Tidak, localhost adalah 127.0.0.1. 127.0.0.0/8 (seperti yang Anda katakan, alias 127.0.0.0 hingga 127.255.255.255) adalah loopback dengan sebagian besar peralatan, misalnya didokumentasikan oleh RFC 5735 halaman 4 . (Yang menarik, beberapa peralatan Cisco dapat menetapkan loopback ke alamat apa pun, tetapi secara default tidak mendukung loopback sama sekali. Bukan berarti ini kemungkinan akan mempengaruhi peralatan lain di jaringan.) Namun, localhost adalah sebuah nama, biasanya menunjuk ke satu saja. alamat yang 127.0.0.1, dan biasanya diimplementasikan dengan menggunakan file "host". Jadi saya tidak setuju dengan upaya koreksi Anda.
TOOGAM
Bisakah Anda mengklarifikasi apa yang Anda maksud dengan "itu tidak valid sebagai alamat tujuan, hanya sebagai alamat sumber"? Ketika server mysql mendengarkan pada 0.0.0.0, apakah alamat tujuan atau sumbernya? Bukankah itu tujuan permintaan yang dikirim dari klien mysql?
Tim