Quando si imposta una connessione TCP, la 4-tupla (source-ip, source-port, dest-ip, dest-port) deve essere univoca - questo per garantire che i pacchetti siano consegnati nel posto giusto.
C'è un'ulteriore restrizione sul lato server che solo un programma server può legarsi a un numero di porta in entrata (assumendo un indirizzo IP; i server multi-NIC hanno altri poteri ma non abbiamo bisogno di discuterli qui).
Quindi, alla fine del server, tu:
- creare un socket.
- associare quel socket a una porta.
- ascolta su quella porta.
- accettare connessioni su quella porta. e possono esserci più connessioni in arrivo (una per client).
Sul lato client, di solito è un po 'più semplice:
- creare un socket.
- aprire la connessione. Quando un client apre la connessione, specifica l'indirizzo IP e la porta del server . Si può specificare la sua porta di origine ma solitamente utilizza zero, che risultati nel sistema assegnando una porta libera automaticamente.
Non v'è alcun requisito che la destinazione IP / porta essere unico dato che si tradurrebbe in una sola persona alla volta di essere in grado di usare Google, e che sarebbe abbastanza bene distruggere il loro modello di business.
Ciò significa che puoi persino fare cose meravigliose come l'FTP multisessione poiché hai impostato più sessioni in cui l'unica differenza è la tua porta sorgente, permettendoti di scaricare blocchi in parallelo. I torrent sono leggermente diversi in quanto la destinazione di ogni sessione è solitamente diversa.
E, dopo tutte queste chiacchiere (scusa), la risposta alla tua domanda specifica è che non è necessario specificare una porta libera. Se ti connetti a un server con una chiamata che non specifica la tua porta sorgente, quasi sicuramente utilizzerà zero sotto le coperte e il sistema te ne darà uno inutilizzato.