Apakah mungkin untuk terhubung ke port TCP 0?

59

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?

nh2
sumber
2
Secara teori, Anda dapat membangun tumpukan TCP khusus tempat mendengarkan atau menyambung dari port 0 berfungsi, yang berarti bahwa dua implementasi tersebut dapat saling berbicara di port 0.
Joshua

Jawaban:

60

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.cdi inet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local 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 ncmenyadari hal ini dan memberi tahu Anda bahwa Anda membuat permintaan yang tidak masuk akal. Jika Anda mencoba ini dalam kode asli:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

Anda mendapatkan kesalahan yang sama dengan yang Anda coba sambungkan ke port lain yang tidak tersedia:, ECONNREFUSED"Sambungan ditolak". Jadi sebagai balasan untuk:

Di mana dalam sistem ini ditangani? Dalam tumpukan TCP dari kernel OS?

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.

goldilocks
sumber
Sepertinya ide yang sama dengan alamat 0.0.0.0 di ipv4. Nilai yang dicadangkan, dan digunakan oleh OS dan program untuk tujuan khusus. Sebagai analogi, di radio ada frekuensi yang tidak digunakan oleh siapa pun untuk transmisi, tetapi digunakan secara internal dalam peralatan.
ctrl-alt-delor
1
@richard no, 0.0.0.0 memiliki arti berbeda;) digunakan untuk menunjuk target yang tidak valid, tidak diketahui atau tidak berlaku atau sebagai "siaran"
AndreaCi
2
@AndreaCi tidak disiarkan 255.255.255.255?
ratchet freak
4
@ratchetfreak 255.255.255.255 disiarkan. 0.0.0.0 memiliki dua makna tergantung pada konteksnya. Dalam pemrograman, sinonim dengan / 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.0
goldilocks
5

Menggunakan 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

nc: port range not valid

untuk

nc localhost 0 
MichaelJohn
sumber
2

nc -l 0akan 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, sehingga ncakhirnya mendengarkan pada beberapa port seperti 56514.

MC17
sumber
sebagian besar sistem operasi akan, ok, yang tidak?
barlop