2010-09-03 14 views
26

Se un server socket TCP è in ascolto sulla porta 28081 per le connessioni in entrata e quindi accetta una connessione e inizia a ricevere dati. È la porta in cui i dati arrivano ancora in 28081 o la porta viene cambiata.Le connessioni TCP vengono spostate su un'altra porta dopo l'apertura?

per esempio a quale porta vengono i dati in arrivo nello pseudo codice qui sotto? È ancora 28081 o se il sistema operativo assegna un nuovo porto ?:

bind 
listen (on port 28081) 

while 1 
    fd = accept 
    fork 
    if child process incoming data 
+0

Vedere anche [questa domanda] (http://stackoverflow.com/questions/2997754/does-the-port-change-when-a-tcp-connection-is-accepted-by-a-server). –

risposta

32

Una connessione TCP viene identificata in modo univoco da due tuple (IP address, TCP port) (una per ciascun endpoint). Quindi, per definizione, non è possibile spostare una porta o l'indirizzo IP di una connessione, ma basta aprirne una diversa.

Se il server si collega alla porta 28081, tutte le connessioni accettate avranno questa porta sul lato server (anche se molto probabilmente avranno numeri di porta diversi sul lato client).

Ad esempio, se due processi dalla stessa macchina client si connettono allo stesso server, lo IP address e TCP port sul lato server sarà lo stesso per entrambe le connessioni. Sul lato client, tuttavia, avranno due numeri di porta diversi che consentiranno al sistema operativo su entrambi i lati di identificare in modo univoco a quale processo e file descrittore devono essere assegnati i pacchetti TCP ricevuti.

+1

chi gestisce la designazione della porta sul client? Il livello del sistema operativo riconosce una corrispondenza esatta su una connessione esistente e mappa dinamicamente la nuova connessione a una nuova porta? – Jess

+1

Jess, non sono sicuro di comprendere appieno la domanda. Quando il client apre una nuova connessione alla porta 28081 del server, si assicura che utilizzi un indirizzo di porta di origine che non ha ancora usato per lo stesso host e porta del server. Cioè se si ha una connessione della porta di origine del client 40'000 alla porta del server 28081, la prossima connessione potrebbe utilizzare la porta di origine 40'001 allo stesso server sulla porta 28081. Ciò garantisce che sia il client sia il server sappiano che si tratta di un nuova connessione perché almeno una delle quattro quantità '(indirizzo IP del client, porta TCP del client, indirizzo IP del server, porta TCP del server)' è diversa. –

+0

"Una connessione TCP è identificata in modo univoco da un due (indirizzo IP, porta TCP)" È definita da _two times_ that. Su entrambe le macchine Se non fosse un server, non potrebbe aprire più connessioni sulla stessa porta e IP. – usr

4

Sì, rimane su quella porta, anche se alcuni protocolli (FTP) potrebbe aprire una seconda connessione su un'altra porta. Non pensare a una porta come a un percorso fisico oa una presa, come una porta USB che può avere solo una cosa collegata. Ma piuttosto pensarlo come un identificatore per il servizio richiesto.

Spesso, tuttavia, la nuova connessione socket viene passata a un altro thread che gestisce le operazioni di lettura/scrittura per quella specifica connessione.

1

Ci può essere più di un client che si connette a una porta, poiché la connessione viene identificata sia dall'indirizzo IP sia dalla porta del server e del client. Quindi, accettare la connessione da un client non impedisce ad altri di connettersi. Potresti anche connetterti un'altra volta dallo stesso client (usando un'altra porta client).

Problemi correlati