2009-07-20 7 views
12

Supponiamo che due browser Web siano in esecuzione sullo stesso computer e accedano allo stesso sito Web (in altre parole, accedono allo stesso indirizzo IP sulla stessa porta).In che modo lo stack TCP/IP di un sistema fa distinzione tra più programmi che si connettono allo stesso indirizzo e porta?

Come riconosce il sistema operativo quali pacchetti sono/per quale programma?

Ogni programma ha un campo ID univoco nell'intestazione TCP? Se sì, come si chiama il campo?

+17

Persone, andiamo. Solo perché si tratta di un protocollo di rete non significa che appartiene a serverfault! –

+1

Sì, lo fa davvero. – Will

+0

Più probabilmente superuser.com, nella mia mente ... –

risposta

35

I due programmi non stanno effettivamente accedendo alla "stessa porta". Ai fini del TCP, una connessione è definita dalla tupla (src_ip, src_port, dst_ip, dst_port).

La porta di origine è in genere effimera, il che significa che è assegnata in modo casuale dal sistema operativo. In altre parole:

programma A avrà:

(my_ip, 10000, your_ip, 80)

Programma B avrà:

(my_ip, 10001, your_ip, 80)

Pertanto, il sistema operativo può vedere che sono diverse "connessioni" e può inviare i pacchetti agli oggetti socket corretti.

+0

la risposta corretta –

+0

Vale anche la pena notare che quando si eseguono operazioni socket durante lo sviluppo (ad esempio, l'apertura di una connessione socket in Java), la porta di origine viene assegnata automaticamente dal sistema. –

+1

Ho detto che: "La porta di origine è solitamente effimera, il che significa che è assegnata in modo casuale dal sistema operativo" :-) – Christopher

0

Entro il port number.

+0

-1? Veramente? Cosa, ho sbagliato? – Will

+0

perché è stato votato in ribasso? È un po 'carente nei dettagli ma non è sbagliato e il link a wikipedia sarebbe utile se non fosse una pagina di wikipedia piuttosto confusa –

+0

Hurf. – Will

4

il numero di porta di origine sarà diverso anche se il numero di porta di destinazione è lo stesso. il kernel associerà il numero di porta di origine con il processo.

3

Quando il client apre una connessione a destinazione porta 80, utilizza un inutilizzato porta arbitraria fonte sulla macchina locale, dire 17824. Il server web risponde poi a quella del cliente con l'invio di pacchetti alla porta di destinazione 17824.

Un secondo client utilizzerà un secondo numero di porta inutilizzato, ad esempio 17825, quindi i pacchetti di due socket non verranno confusi poiché utilizzeranno numeri di porta diversi sul computer client.

+1

Basta notare che non è necessario utilizzare una porta di origine temporanea. Può richiedere di associare una porta sorce specifica. –

2

La risposta di Christopher è parzialmente corretta.

I programmi A e B dispongono effettivamente di un handle per un descrittore di socket archiviato nell'implementazione socket del sistema operativo sottostante. I pacchetti vengono consegnati a questo socket sottostante e quindi qualsiasi processo che abbia un handle per quella risorsa socket può leggerlo o scriverlo.

Ad esempio, supponiamo di scrivere un semplice server su un sistema operativo Unix come Linux o Mac OSX.

Il server accetta una connessione, a quel punto una connessione che consiste di

(src IP, src Port, dest IP, dest Port) 

viene a esistenza nel socket layer sistema operativo sottostante. Quindi si esegue il fork di un processo per gestire la connessione: a questo punto ora si hanno due processi con handle sul socket che possono entrambi leggerlo/scriverlo.

In genere (sempre) il server originale chiuderà l'handle al socket e lascerà che il processo biforcato lo gestisca.Ci sono molte ragioni per questo, ma quello che non è sempre ovvio per le persone è che quando il processo figlio termina il lavoro e chiude il socket il socket rimarrà aperto e connesso se il processo genitore ha ancora un handle aperto.

+0

Penso che pochi moderni programmi lato server 'fork' e' exec' per ogni connessione in ingresso. Un singolo thread può gestire molte connessioni simultanee ed è molto più efficiente. Questo commento descrive un particolare metodo di implementazione. – lavinio

+2

In realtà, questo commento sta cercando di chiarire l'equivoco che il socket appartiene esclusivamente a un processo e che il sistema operativo "consegna" i pacchetti a un particolare processo. Il socket appartiene al sistema operativo e il processo ha accesso a quella risorsa del sistema operativo sottostante. –

+1

@lavinio Ecco perché Robert ha detto "fork" e non "fork ed exec" – artistoex

0

L'indirizzo IP viene utilizzato per identificare il computer e la porta viene utilizzata per identificare il processo (applicazione) all'interno del computer. Quando una porta viene utilizzata da un processo, altri processi non possono più utilizzarla. Quindi se un pacchetto viene inviato a quella porta, solo il proprietario di quella porta può gestire quel pacchetto.

+0

Anche se questo è fondamentalmente vero (ci sono alcune avvertenze secondarie sui processi biforcati che utilizzano lo stesso socket perché è stato creato prima della forcella), non sono sicuro di ciò che aggiunge rispetto alle risposte che sono state qui per un po '. In generale, è una buona idea assicurarsi che una nuova risposta a una vecchia domanda stia fornendo una nuova e preziosa intuizione - e non sono convinto che questa risposta lo faccia. –

0

Le connessioni sono identificate da una coppia di endpoint. - Endpoint significa (ip, port)

2

Prima di tutto, una "porta" è solo un numero. Tutto ciò che una "connessione a una porta" rappresenta realmente è un pacchetto che ha quel numero specificato nel suo campo di intestazione "porta di destinazione".

Ora ci sono due risposte alla domanda, una per i protocolli stateful e una per i protocolli senza stato.

Per un protocollo stateless (ad es. UDP), non vi sono problemi perché "connessioni" non esistono: più persone possono inviare pacchetti alla stessa porta e i loro pacchetti arriveranno in qualsiasi sequenza. Nessuno è mai nello stato "connesso".

Per un protocollo di stato (come TCP), una connessione è identificata da una tupla di 4 elementi costituita da porte di origine e di destinazione e indirizzi IP di origine e di destinazione. Quindi, se due macchine diverse si connettono alla stessa porta su una terza macchina, ci sono due connessioni distinte perché gli IP di origine differiscono. Se la stessa macchina (o due dietro NAT o che condividono lo stesso indirizzo IP) si collega due volte a un unico terminale remoto, le connessioni sono differenziate dalla porta sorgente (che è generalmente una porta casuale con numero elevato).

Semplicemente, se mi collego due volte allo stesso server Web dal mio client, le due connessioni avranno diverse porte di origine dalle mie porte di prospettiva e di destinazione dai server web. Quindi non c'è ambiguità, anche se entrambe le connessioni hanno gli stessi indirizzi IP di origine e destinazione.

Le porte sono un modo per multiplexare gli indirizzi IP in modo che le diverse applicazioni possano ascoltare sullo stesso indirizzo IP/coppia di protocolli. A meno che un'applicazione non definisca il proprio protocollo di livello superiore, non c'è modo di multiplexare una porta. Se due connessioni che utilizzano lo stesso protocollo hanno identici IP di origine e destinazione e identiche porte di origine e destinazione, devono avere la stessa connessione.

Problemi correlati