È possibile connettersi alla porta TCP 0?


59

L'ascolto della porta TCP 0 mi assegna un numero di porta libero sul sistema.

Ma cosa succede quando provo a connettermi alla porta TCP 0? La risposta ovvia è: "Non funziona":

$ nc localhost 0                 
nc: port number too small: 0

Dove viene gestito questo sistema? Nello stack TCP del kernel del sistema operativo? Esistono Unix in cui funzionerebbe la connessione alla porta TCP 0?


2
In teoria potresti costruire uno stack TCP personalizzato in cui funziona l'ascolto o la connessione dalla porta 0, il che significa che due di queste implementazioni potrebbero dialogare sulla porta 0.
Joshua,

Risposte:


60

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.csu 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.


Sembra la stessa idea dell'indirizzo 0.0.0.0 in ipv4. Un valore riservato e utilizzato dal sistema operativo e dai programmi per uno scopo speciale. Come analogia, in radio ci sono frequenze riservate che nessuno usa per le trasmissioni, ma sono utilizzate internamente nelle apparecchiature.
ctrl-alt-delor,

1
@richard no, 0.0.0.0 ha un significato diverso;) è usato per designare un obiettivo non valido, sconosciuto o non applicabile o come "trasmissione"
AndreaCi

2
@AndreaCi non è stato trasmesso 255.255.255.255?
maniaco del cricchetto,

4
Viene trasmesso @ratchetfreak 255.255.255.255. 0.0.0.0 ha due significati a seconda del contesto. Nella programmazione è anche w / INADDR_ANY, che è ciò a cui si riferisce Richard (il sistema lo sostituirà con un valore predefinito). Ma in realtà l'utilizzo dell'indirizzo su una rete sembra avere le implicazioni menzionate da Andrea (tranne che non è così chiaro che conta come "broadcast"): en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

L'uso della porta 0 innesca il sistema operativo per cercare e allocare la prossima porta disponibile. Ciò evita di dover codificare una porta specifica o di cercare una porta disponibile. Il mio sistema Linux Mint ritorna

nc: port range not valid

per

nc localhost 0 

2

nc -l 0chiederà al sistema operativo di ascoltare sulla porta 0. Ma come è stato osservato sopra, la maggior parte dei sistemi operativi vedrà lo 0 e invocherà le loro abitudini particolari per scegliere una porta con numero positivo per la tua applicazione, quindi ncfinisce per ascoltare su una porta come 56514.


la maggior parte dei sistemi operativi, ok, quale no?
barlop
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.