Mendengarkan port TCP 0 memberi saya nomor port gratis pada sistem.
Tetapi apa yang terjadi ketika saya mencoba menghubungkan ke port TCP 0? Jawaban yang jelas adalah: "Tidak berhasil":
$ nc localhost 0
nc: port number too small: 0
Di mana dalam sistem ini ditangani? Dalam tumpukan TCP dari kernel OS? Apakah ada Unix di mana menghubungkan ke port TCP 0 akan berfungsi?
networking
tcp
nh2
sumber
sumber
Jawaban:
Hanya untuk memastikan kita berada di halaman yang sama (pertanyaan Anda ambigu dengan cara ini), meminta untuk mengikat TCP pada port 0 menunjukkan permintaan untuk secara dinamis menghasilkan nomor port yang tidak digunakan. Dengan kata lain, nomor port yang Anda dengarkan setelah permintaan itu bukan nol. Ada komentar tentang dalam hal ini
[linux kernel source]/net/ipv4/inet_connection_sock.c
diinet_csk_get_port()
:Yang merupakan konvensi unix standar. Mungkin ada sistem yang benar-benar akan memungkinkan penggunaan port 0, tetapi itu akan dianggap praktik yang buruk. Perilaku ini tidak ditentukan secara resmi oleh POSIX, IANA, atau protokol TCP. 1 Anda mungkin menemukan ini menarik .
Itu sebabnya Anda tidak dapat secara wajar membuat koneksi TCP ke port nol. Agaknya
nc
menyadari hal ini dan memberi tahu Anda bahwa Anda membuat permintaan yang tidak masuk akal. Jika Anda mencoba ini dalam kode asli:Anda mendapatkan kesalahan yang sama dengan yang Anda coba sambungkan ke port lain yang tidak tersedia:,
ECONNREFUSED
"Sambungan ditolak". Jadi sebagai balasan untuk:Mungkin tidak; itu tidak memerlukan penanganan khusus. Yaitu, jika Anda dapat menemukan sistem yang memungkinkan pengikatan dan pendengaran pada port 0, Anda mungkin dapat terhubung dengannya.
1. Tapi IANA tidak menyebutnya sebagai "Reserved" ( lihat di sini ). Artinya, port ini tidak boleh digunakan online. Itu membuatnya oke sehubungan dengan konvensi penugasan dinamis (karena itu tidak akan benar-benar digunakan). Menetapkan bahwa secara khusus sebagai tujuan mungkin akan berada di luar ruang lingkup IANA; pada dasarnya sistem operasi bebas untuk melakukan apa yang mereka inginkan dengan itu, termasuk tidak ada.
sumber
INADDR_ANY
, yang mengacu pada richard (sistem akan menggantinya dengan default). Tetapi sebenarnya menggunakan alamat pada jaringan tampaknya memiliki implikasi yang disebutkan Andrea (kecuali tidak begitu jelas sehingga dianggap sebagai "siaran"): en.wikipedia.org/wiki/0.0.0.0Menggunakan Port 0 memicu sistem operasi untuk mencari dan mengalokasikan port berikutnya yang tersedia. Ini untuk menghindari Anda harus membuat kode port tertentu atau harus mencari port yang tersedia. Sistem Mint Linux saya kembali
untuk
sumber
nc -l 0
akan meminta OS untuk mendengarkan pada port 0. Tetapi seperti yang telah disebutkan di atas, sebagian besar sistem operasi akan melihat 0 dan memanggil kebiasaan khusus mereka untuk memilih port bernomor positif untuk aplikasi Anda, sehingganc
akhirnya mendengarkan pada beberapa port seperti 56514.sumber