Solo per essere sicuri che siamo sulla stessa pagina (la tua domanda è ambigua in questo modo), chiedere di associare TCP sulla porta 0 indica una richiesta per generare dinamicamente un numero di porta inutilizzato. In altre parole, il numero di porta che stai effettivamente ascoltando dopo quella richiesta non è zero. C'è un commento su questo in [linux kernel source]/net/ipv4/inet_connection_sock.c
su 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.
*/
Che è una convenzione unix standard. Potrebbero esserci dei sistemi che consentano effettivamente l'uso della porta 0, ma sarebbe considerato una cattiva pratica. Tuttavia, questo comportamento non è ufficialmente specificato da POSIX, IANA o dal protocollo TCP. 1 Potresti trovare questo interessante .
Ecco perché non è possibile effettuare in modo ragionevole una connessione TCP alla porta zero. Presumibilmente ne nc
è consapevole e ti informa che stai facendo una richiesta non sensata. Se provi questo nel codice nativo:
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));
}
Si ottiene lo stesso errore che si tenterebbe di connettersi a qualsiasi altra porta non disponibile:, ECONNREFUSED
"Connessione rifiutata". Quindi in risposta a:
Dove viene gestito questo sistema? Nello stack TCP del kernel del sistema operativo?
Probabilmente no; non richiede una gestione speciale. Ad esempio, se riesci a trovare un sistema che consente l'associazione e l'ascolto sulla porta 0, è possibile presumibilmente connettersi ad esso.
1. Ma IANA si riferisce ad esso come "Riservato" ( vedi qui ). Ciò significa che questa porta non deve essere utilizzata online. Ciò lo rende corretto per quanto riguarda la convenzione di assegnazione dinamica (poiché non verrà effettivamente utilizzata). Stipulare questo specificamente come scopo sarebbe probabilmente al di là dell'ambito di IANA; in sostanza i sistemi operativi sono liberi di fare ciò che vogliono, incluso nulla.