S è un programma server: diciamo che è un server HTTP, quindi userà il noto numero di porta per HTTP , che è 80. Lo eseguo su un host con indirizzo IP 10.0.0.4
, quindi ascolterà le connessioni su 10.0.0.4:80
(perché è lì che tutti si aspetteranno trovalo).
All'interno di S , creerò un socket e associare a quell'indirizzo: ora il sistema operativo sa che le connessioni arrivano in 10.0.0.4:80
dovrebbe essere indirizzato al mio S processo tramite quel particolare socket.
-
output netstat una volta che il socket è vincolato:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
NB. l'indirizzo locale è tutti zero perché S non interessa come i suoi clienti lo raggiungono
Una volta che S ha associato questo socket, accetta connessioni - ogni volta che un nuovo client si connette, accept
restituisce un socket nuovo , specifico per quel client
-
output netstat una volta accettata una connessione:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.4:80 10.0.0.5:55715 ESTABLISHED
-
10.0.0.4:80
rappresenta la fine della connessione S ed è associata al socket restituito da accept
-
10.0.0.5:55715
è la fine della connessione del client ed è associata al socket passato al connect . La porta del client non viene utilizzata per nulla tranne l'instradamento dei pacchetti su questa connessione TCP con il processo corretto: è assegnato casualmente dal kernel del client dall'intervallo di porte temporaneo.
Ora S può tranquillamente continuare ad accettare più connessioni client ... ognuna avrà il proprio socket, ogni socket sarà associato a una connessione TCP univoca e ogni connessione avrà un unico indirizzo remoto S traccerà lo stato del client (se ce n'è uno) associandolo al socket.
Quindi, approssimativamente:
- l'indirizzo IP è per il routing tra host sulla rete
- la porta è per il routing al socket corretto sull'host
- Ho quasi detto processo corretto , ma in realtà è possibile avere più processi (di solito figlio) che accettano tutti sullo stesso socket ...
- tuttavia, ogni volta che una delle chiamate
accept
simultanee restituisce, lo fa solo in un processo one , il socket di ogni connessione in entrata è univoco per un'istanza del server
- il socket è l'oggetto utilizzato da un processo per parlare al sistema operativo di una particolare connessione, proprio come un descrittore di file
- come menzionato nei commenti, ci sono molti altri usi per i socket che non usano affatto le porte: ad esempio socketpair crea una coppia di socket connessi insieme che hanno uno schema di indirizzamento no - l'unico modo per usare quella pipe è il processo che ha chiamato
socketpair
, essendo un figlio di quel processo e ereditarne uno, o essere passato esplicitamente uno dei socket da quel processo